Просмотр полной версии : Пакет от клиента или от сервера
В общем столкнулся с проблемой сделал скрипт, на нём поставил условие, что если от клиента идёт соц действие, то отослать на сервер пакет:
жму соц действие - на сервер шлётся пакет, всё нормально :good:
делаю скрипт сложнее и нахожу вещь такую, что, если более простым языком, то засунув пакет соц действия в посылку, условие не выполняется, в скрипте это выглядит так, например чар что-то делает и в определённый момент подходит к нпс...ставлю чтоб когда он стоял в точке с координатой x y z(около нпс) , он писал в чат что-либо(то есть пакет от клиента) и условие, когда от клиента пакет (на сообщение), чтоб делал что-то, результат - не работает, но если в условие ставить пакет от сервера который показывает, что чар мой, что-то написал, то пашет.
Вот вопрос - дело в условии ? нельзя ставить в данном случае fromclient? или что ?я не пойму...
Была догадка что, когда шлём пакет с программы, это не совсем является пакетом от клиента, мб бред, но это единственное что приходит на ум.
Коды скриптов не выкладывают потому, что это для любого случая.
kpa9pt, код выложи, чтобы понятно стало, что делаешь.
пакет отправляет оди скрипт, а ловишь в другом? тогда, если не ошибаюсь, пакеты проходят цепочку скритов от первого в списке к последнему начиная с отправившего скрипт
вот написал только-что результат на лицо.
Скрипт устроен так(чтоб вы голову особо не забивали) если от клиента приходит пакет say то чар шлёт на сервер пакет p1, в моём случае say - сказать в чат "сесть" , а p1 - пакет на то чтоб сесть.
Врубаем скрипт в нём каждые 6000милисекунд отправляеться на сервер пакет say, и чар пишет в чат "сесть", но пакет p1 не шлёться на сервер, но стоит мне с клиента самому набрать в чате "сесть" тоесть отправить пакет say вручную , то чар садиться, вот код:
const
p1='56 00 00 00 00 00 00 00 00 00';
nik='JealouS';
say='49 41 04 35 04 41 04 42 04 4C 04 00 00 00 00 00 00';
var
i:integer;
timer:TTimer;
timer2:TTimer;
procedure Init;
begin
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=3000;
timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=true;
timer2.interval:=6000;
end;
procedure OnTimer(Sender: TObject);
begin
buf:=hstr(p1);
SendToServerex(nik);
timer.enabled:=false;
end;
procedure OnTimer2(Sender: TObject);
begin
buf:=hstr(say);
SendToServerex(nik);
end;
procedure Free;
begin
timer.Free;
timer2.Free;
end;
begin
if fromclient and (ConnectName=nik) and (pck=hstr(say)) then
timer.enabled:=true;
end.
скрипт не получит пакет, который отправил. никогда.
скрипт не получит пакет, который отправил. никогда.
Но почему в записе пакетов видно что от клиента исходит этот пакет, но условие скрипта не реагирует...это можно как-обойти?
отправляемый скриптом пакет к этому же скрипту не приходит. Это вполне логично иначе возможна была ситуация зацикливания на одном пакете (обработка - отправка - обработка -отправка). У вас получится только если вы напишете 2 скрипта, один управляющий, второй исполняющий. То есть в чат сесть писать будет один скрипт, а исполнять это другой. С одной стороны, а с другой если это в пределах одного скрипта, то зачем ставить такой изощренный метод, почему не написать так:
procedure OnTimer2(Sender: TObject);
begin
OnTimer;
end;
результат будет одинаковый
отправляемый скриптом пакет к этому же скрипту не приходит. Это вполне логично иначе возможна была ситуация зацикливания на одном пакете (обработка - отправка - обработка -отправка). У вас получится только если вы напишете 2 скрипта, один управляющий, второй исполняющий. То есть в чат сесть писать будет один скрипт, а исполнять это другой. С одной стороны, а с другой если это в пределах одного скрипта, то зачем ставить такой изощренный метод, почему не написать так:
procedure OnTimer2(Sender: TObject);
begin
OnTimer;
end;
результат будет одинаковый
Мне это нужно совершенно для другого скрипта) где кокрас это пригодиться, щас попробую в 2 скрипта написать.
Нет с двумя скриптами тоже не выходит...
у тебя в окне скриптов справа список. так вот пакеты обрабатываются в порядке живой очереди (сверху вниз)
а вообще-нафига тебе это? хреновый способ обмена данными...
у тебя в окне скриптов справа список. так вот пакеты обрабатываются в порядке живой очереди (сверху вниз)
а вообще-нафига тебе это? хреновый способ обмена данными...
Мне нужно было зациклить несколько скриптов.
Пакеты от клиента, которые про те, что я вас спрашивал, они (соц действия, текст в чат, там ещё, что нить мб) не меняются у меня на сервере при рестарте, что очень удобно - не надо делать что-то дополнительного перед включением или выключением, а поскольку от клиента не работает приходиться брать от сервера , а они меняются при рестартах из-за смены char id. Вот зачем мне надо).
ниче не понял. чем тебе charid мешает?
ниче не понял. чем тебе charid мешает?
Да ничем, просто я из принципа написал...мне хотелось знать это я тупой не правильно что-то пишу или так должно быть.
А charid меняется при перезаходе в игру и его нужно или как-то записать через процедуру какую нить (взятие своего таргета) или вручную записывать в скрипт перед каждым запуском(после рестарта), а я так не хотел и поэтому пытался через пакеты от клиента)
а пакет UserInfo от сервера поймать не судьба?
а пакет UserInfo от сервера поймать не судьба?
Да всё судьба) влом просто хотел полегче чтоб)
procedure UserInfo; //обновление данных о себе
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;
begin
//серверные пакеты
if (ConnectName=MyName) and FromServer then
case pck[1] of
#$32: UserInfo;
end;
end.
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot