PDA

Просмотр полной версии : Скрипт


Pocuk
25.10.2011, 04:47
Всем привет. У меня несколько нубских вопросов по поводу скриптов:
1) как зациклить скрипт? вход в цикл по приходу пакета с клиента и выход по приходу дрогого пакета тоже с клиента.
например:
begin
if FromClient and (pck=HStr('<пакет запуска цикла>'))
then
<теперь надо запустить цикл и не выходить пока клиент не выдаст другой пакет. Пакеты ето просто действия для запуска и окончания его работы.>
end.
2) как поделить одно значение на другое и сравнять с третьим(уже заданым и задать его как?)?
пример:
Aa:integer;
Bb:integer;
Cc:integer;
....
begin
Cc := <число>;
Aa := ReadD(12);
Bb := ReadH(20);
if Aa / Bb <= Cc then
begin
...
поделиться оно вообще или нет? у меня именно 4х байтовое значение надо делить на 2х байтовое и сравнить с 4х байтовым.

Делаю первый скрипт, не судите строго:)

Nickers
25.10.2011, 11:29
Pocuk, как зациклить скрипт?
как поделить одно значение на другое и сравнять с третьим(уже заданым и задать его как?)?

Const
X=666; //Постоянное значение

Var
Timer01 : TTimer;
Y, Z : Integer;

Procedure Init; //Выполняется при запуске скрипта.
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01; //Назначаем выполняемое тело таймера.
Timer01.enabled:=false; //Начальное положение (Выключено)
Timer01.interval:=2000; //Интервал в мс (2000 = 2с.)
end;

Procedure Free;
begin
Timer01.Free; //Освобождаем память из под таймера
end;

Procedure OnTimer01; //Тело Timer01 (Запускается раз в Timer01.interval)
begin //Выполняется каждые 2секунды вне зависимости от пакета #$12
if ((X/Y)=Z) then Y:=X;
end;

begin
//Если приходит пакет ID:12 то запускает таймер. (От клиента)
if FromClient and (pck[1]=#$12) then
begin
Timer01.enabled:=true;
Z:=ReadD(10); //Из каждого пакета #$12 забираем нужные значения.
Y:=ReadD(14);
end;

//Если приходит пакет со 2м значением, равным 7ми вырубаем таймер
if FromServer and (ReadD(2)=7) then Timer01.enabled:=false;
//(От Сервера)
end.

Добавлено через 8 минут
у меня именно 4х байтовое значение надо делить на 2х байтовое
Если они числа, то при переводе в десятичную систему, это только говорит о том, что 4х байтное число может принимать большие значения.

Pocuk
26.10.2011, 03:13
Большое спасибо! потестирую и отпишусь.

UPD: скрипт зависает на:
begin
Timer01.enabled:=true;
вибывает ошибку сам л2пх - Access violation at address 132A61E9 in module 'l2ph.exe'. Read of address 00000000.
(игра не зависает) но л2пх не реагирует ни на что, спасает быстрое нажатие ОК и выключение скрипта.
Может проблема в том что Procedure Free; не задействовали?

Добавлено через 12 часов 15 минут
сильно упростил скрипт ради интереса и он перестал выдавать ошибку, но и функцию свою не исполняет:

...
Procedure OnTimer01; //Тело Timer01 (Запускается раз в Timer01.interval)
begin //Выполняется каждые 2секунды вне зависимости от пакета запуска таймера.
//отправляем пакет 'EE FF' (На сервер)
buf:=HStr('EE FF');
SendToServer;
pck:='';
end;
begin
//Если приходит пакет 'AA BB' то запускает таймер. (От клиента)
if FromClient and (pck=HStr('AA BB')) then Timer01.enabled:=true;
//Если приходит пакет 'CC DD' то вырубаем таймер. (От клиента)
if FromClient and (pck=HStr('CC DD')) then Timer01.enabled:=false;
end.

я думаю после прихода АА ВВ от клиента должен отправляться на сервер EE FF каждие 2 сек. но ето не работает.

dyh9l
26.10.2011, 03:50
поновее ПХ юзать

Pocuk
26.10.2011, 13:41
полазил по форуму, нашол тему http://coderx.ru/showthread.php?t=119
заменил SendToServer; на SendToServerEx(ConnectName);
заработало... только спрощенный скрипт заработал, основной еще нет:big_boss:

л2пх юзаю 170 версию

UPD: основной скрипт дальше выдает ошибку, думаю связано ето с вычислениями, а именно - мне надо в Procedure OnTimer01; (в цикле проще говоря) сделать постояную отсылку пакетов на сервер, после чего проверять что пришло с сервера, если ето нужний пакет тогда с него читаем:
Aa:integer;
Bb:integer;
Cc:integer;
Cc := <число>;
...
Procedure OnTimer01;
begin
buf := HStr(Хх);
SendToServerEx(ConnectName);
pck:='';
if FromServer and (pck[1]=#$00) then
begin
Aa := ReadD(12);
Bb := ReadH(20);
if ((Aa/Bb)=Сс) then
begin
Kill
end;
end;
end;
...
так вот опять вопрос - как записать ето <число> "Сс"?? у меня "Аа" будет иметь например такой вид - 00 48 E8 01 (DWord - 32000000), "Bb" - 10 00 (DWord - 16) и мне надо поделить "Аа" на "Bb" (мне наперед известно что всегда выйдет целое число) и сравнять с "Сс". Чтобы скрипт делал ето как if ((32000000/16)=<число>) then ...

UPD2: с числами разобрался, проблема не в них, а гдето в коде:
...
Procedure OnTimer01;
begin
buf := HStr(Хх);
SendToServerEx(ConnectName);
pck:='';
if FromServer and (pck[1]=#$00) then
begin
Aa := ReadD(12);
Bb := ReadH(20);
if ((Aa/Bb)=Сс) then
begin
Kill
end;
end;
end;
...
а именно "if FromServer and (pck[1]=#$00) then" не работает, но
buf := HStr(Хх);
SendToServerEx(ConnectName);
pck:=''; работает.

Добавлено через 9 часов 40 минут
что то мне подсказывает что надо второй цикл для "if FromServer and (pck[1]=#$00) then"

Pinko
26.10.2011, 15:56
...
Procedure OnTimer01;
begin
buf := HStr(Хх);
SendToServerEx(ConnectName);
pck:='';
end;
begin
if FromServer and (pck[1]=#$00) then
begin
Aa := ReadD(12);
Bb := ReadH(20);
if ((Aa/Bb)=Сс) then
begin
Kill
end;
end;
end;
...
как то так

Pocuk
27.10.2011, 03:41
все работает, всем спасибо:cool:

Pocuk
06.11.2011, 18:49
не хотел создавать новую тему потому задам вопрос здесь:
как задать неравенство?
вот пример:

...
if FromClient and (pck[1]=#$AA) and (ReadD(5)"не равно"ItemID1) and (ReadD(5)"не равно"ItemID2) then
...

SeregaZ
06.11.2011, 19:44
<>? в крайнем случае расписать на несколько иф



if FromClient and (pck[1]=#$AA) then
if ReadD(5) == ItemID1 then ничего
else (if ReadD(5) == ItemID2 then ничего
else (бла бла бла)
)

Pocuk
09.01.2012, 02:46
опять пишу скрипт, нужна команда или процедура или пример для выдачи случайных чисел, если кто знает помогите пожалуйста!

SeregaZ
09.01.2012, 03:18
Timer01.interval := 1000+round(random()*1000);
round(random()*1000); округленное случайное число от 0 до 1000