PDA

Просмотр полной версии : Вопрос о delay.


Xedinsey
15.03.2008, 18:20
Итак, дорогие друзья. Разъясните нубу плз как устроена эта команда.
Вот смотрите, мне нужно отправить 1 пакет, а через 5с отправить еще 1 пакет. Но, когда я использую команду Delay, задержка действует на все. Т.е. второй пакет высылается через 5с, но в течении этих 5с не принимаются никакие пакеты. А как сделать что бы принимались?
Я пробовал сделать через так называемые "таймеры сквозного прохода", которые указаны в доп командах, но они у меня вобще никакой задержки на отправку пакетов не дают.
Как мне можно организовать такой таймер, что бы после отправки первого пакета принимались серверные пакеты?

dip56245
16.03.2008, 00:12
в теме "да будет бот" там есть скрипты (например по потрошению рыбы - 3 пост), там пример что бы не тормозила отсылка и прием... посмотри

Добавлено спустя 11 минут 49 секунд:

//Автоматизация потрошения рыбы by NLObP
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Как только поймаете рыбку, она потрошиться.

{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}

//************************************************** *****************
const
Name='NLObP'; //имя чара
//************************************************** *****************
var
ItemObjID, time1: integer;
status: boolean;
//************************************************** *****************
procedure Init; //Вызывается при включении скрипта
begin
time1:=0;
status:=false;
end;
//************************************************** *****************
procedure Free; //Вызывается при выключении скрипта
begin
end;
//************************************************** *****************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait/1000) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
//************************************************** *****************
procedure UseItem(ObjectID:integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//************************************************** *****************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** *****************
begin
//************************************************** *****************
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** *****************
//потрошим рыбу
//необходимо уточнить ItemID рыб для своего сервера!!!
if FromServer and (pck[1]+pck[2]=#$27#$01) and (ConnectName=Name) and ((ReadD(12)>=6411) and (ReadD(12)<=6518)) then
begin
ItemObjID:=ReadD(8);
status:=true;
end;
//************************************************** *****************
if Wait(time1,2000) and status then begin
UseItem(ItemObjID);
status:=false;
end;
end.


вот пример кода, захочешь поймешь... )

Xedinsey
16.03.2008, 02:15
Что характерно, я как раз с этого примера и брал "таймер". Че-то не работал он у мну.

dip56245
16.03.2008, 12:24
должно работать - проверял. ) проверь внимательно, скорее всего где -то напарил...

Xedinsey
16.03.2008, 15:20
procedure Init; //Вызывается при включении скрипта
begin
t1:=0;
end;

function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait/1000) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;

begin
if FromClient and (pck[1]=#$38) and (pck[2]=#$2D) then
begin
sCom:=ReadS(4);
Com:=copy(sCom,1,8);
if Com='clossell' then begin
buf:=HStr('73');
SendToServer;
if wait(t1,2000) then begin
buf:=HStr('76');
SendToServer;
end;
pck:=nil;
end;
end;
end.

Пакет 76 вобще не отправляется. Пробовал уже в различных вариациях. Та же фигня.

NLObP
16.03.2008, 15:58
Этот кусок должен стоять в главном цикле BEGIN ... END. и его нельзя вставлять в другие условия проверки, иначе до него очередь не дойдет или пропустишь его.

begin
...
if wait(t1,2000) then begin
buf:=HStr('76');
SendToServer;
end;
...
end.

Xedinsey
17.03.2008, 11:34
Этот кусок должен стоять в главном цикле BEGIN ... END. и его нельзя вставлять в другие условия проверки, иначе до него очередь не дойдет или пропустишь его.

Хорошо, как мне сделать, что бы при вводе команды с клавиатуры -clossell, у меня отправлялся пакет 73, а через 2с пакет 76, но при этом за эти 2с принимались другие пакеты?
Кусок "wait" у меня итак стоит в основном теле скрипта, но мне ведь нужно что бы пакеты отправлялись только при наборе -clossell, а как можно это сделать что бы не было условий проверки?

NLObP
17.03.2008, 13:31
Хорошо, как мне сделать, что бы при вводе команды с клавиатуры -clossell, у меня отправлялся пакет 73, а через 2с пакет 76, но при этом за эти 2с принимались другие пакеты?
Кусок "wait" у меня итак стоит в основном теле скрипта, но мне ведь нужно что бы пакеты отправлялись только при наборе -clossell, а как можно это сделать что бы не было условий проверки?
Могу предложить только использовать доп. флаг, который будет указывать, что команда -clossell пришла.


t1:=0;

begin

if FromClient and (pck[1]=#$38) and (pck[2]=#$2D) then begin
if ReadS(4)='-clossell' then begin
status:=true;
buf:=HStr('73');
SendToServer;
pck:=nil;
end;
end;

if wait(t1,2000) and (status=true) then begin
buf:=HStr('76');
SendToServer;
end;

end.

Xedinsey
17.03.2008, 19:40
begin
if FromClient and (pck[1]=#$38) and (pck[2]=#$2D) then begin
sCom:=ReadS(4);
com:=copy(sCom,1,8);
if com='clossell' then begin
status:=true;
buf:=HStr('73');
SendToServer;
pck:=nil;
end;
end;

if wait(t1,2000) and (status=true) then begin
buf:=HStr('76');
SendToServer;
end;

end.

Если так, то посылается пакет 73, получаются другие (все нормально), через 2с посылается пакет 76. НО, потом еще каждые 2с посылается пакет 76... %)

begin
if FromClient and (pck[1]=#$38) and (pck[2]=#$2D) then begin
sCom:=ReadS(4);
com:=copy(sCom,1,8);
if com='clossell' then begin
status:=true;
buf:=HStr('73');
SendToServer;
pck:=nil;
end;
end;

if wait(t1,2000) and (status=true) then begin
buf:=HStr('76');
SendToServer;
status:=false;
end;

end.
Если так, то оба пакета посылаются одновременно, т.е. таймер не срабатыват.
Вот такая вот дрочь... Что делать, ума не приложу.

Там кто-то в полезных функциях писал таймер, который выполняется не в основном потоке, но в коде ошибка когда ссылается на указатель nil^.

NLObP
18.03.2008, 12:17
begin
if FromClient and (pck[1]=#$38) and (pck[2]=#$2D) then begin
sCom:=ReadS(4);
com:=copy(sCom,1,8);
if com='clossell' then begin
status:=true;
buf:=HStr('73');
SendToServer;
pck:=nil;
end;
end;

if wait(t1,2000) and (status=true) then begin
buf:=HStr('76');
SendToServer;
end;

end.

Если так, то посылается пакет 73, получаются другие (все нормально), через 2с посылается пакет 76. НО, потом еще каждые 2с посылается пакет 76... %)

Трудно флаг статус в FALSE сбросить? :twisted:

if wait(t1,2000) and (status=true) then begin
buf:=HStr('76');
SendToServer;
status:=false;
end;

Xedinsey
18.03.2008, 12:26
Трудно флаг статус в FALSE сбросить? :twisted:
Не трудно, смотри 2-ю часть моего предыдущего поста.
Я уже нашел выход, но все же хочется докопаться до истины!

NLObP
18.03.2008, 12:51
Трудно флаг статус в FALSE сбросить? :twisted:
Не трудно, смотри 2-ю часть моего предыдущего поста.
Я уже нашел выход, но все же хочется докопаться до истины!
Извини, не заметил. Я не понял тогда, если дописываешь status:=false; перестает работать?

Xedinsey
18.03.2008, 13:12
Да. Оба пакета посылаются одновременно.

dmitry501
18.03.2008, 13:39
if com='clossell' then begin
wait(t1,2000);
pck:=HStr('73');
status:=true;
end;