PDA

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


kpa9pt
31.01.2010, 05:30
В общем столкнулся с проблемой сделал скрипт, на нём поставил условие, что если от клиента идёт соц действие, то отослать на сервер пакет:
жму соц действие - на сервер шлётся пакет, всё нормально :good:

делаю скрипт сложнее и нахожу вещь такую, что, если более простым языком, то засунув пакет соц действия в посылку, условие не выполняется, в скрипте это выглядит так, например чар что-то делает и в определённый момент подходит к нпс...ставлю чтоб когда он стоял в точке с координатой x y z(около нпс) , он писал в чат что-либо(то есть пакет от клиента) и условие, когда от клиента пакет (на сообщение), чтоб делал что-то, результат - не работает, но если в условие ставить пакет от сервера который показывает, что чар мой, что-то написал, то пашет.

Вот вопрос - дело в условии ? нельзя ставить в данном случае fromclient? или что ?я не пойму...
Была догадка что, когда шлём пакет с программы, это не совсем является пакетом от клиента, мб бред, но это единственное что приходит на ум.

Коды скриптов не выкладывают потому, что это для любого случая.

NLObP
02.02.2010, 00:32
kpa9pt, код выложи, чтобы понятно стало, что делаешь.

finomen
02.02.2010, 00:41
пакет отправляет оди скрипт, а ловишь в другом? тогда, если не ошибаюсь, пакеты проходят цепочку скритов от первого в списке к последнему начиная с отправившего скрипт

kpa9pt
02.02.2010, 01:08
вот написал только-что результат на лицо.
Скрипт устроен так(чтоб вы голову особо не забивали) если от клиента приходит пакет 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.

finomen
02.02.2010, 01:15
скрипт не получит пакет, который отправил. никогда.

kpa9pt
02.02.2010, 01:37
скрипт не получит пакет, который отправил. никогда.

Но почему в записе пакетов видно что от клиента исходит этот пакет, но условие скрипта не реагирует...это можно как-обойти?

sinles
02.02.2010, 10:38
отправляемый скриптом пакет к этому же скрипту не приходит. Это вполне логично иначе возможна была ситуация зацикливания на одном пакете (обработка - отправка - обработка -отправка). У вас получится только если вы напишете 2 скрипта, один управляющий, второй исполняющий. То есть в чат сесть писать будет один скрипт, а исполнять это другой. С одной стороны, а с другой если это в пределах одного скрипта, то зачем ставить такой изощренный метод, почему не написать так:
procedure OnTimer2(Sender: TObject);
begin
OnTimer;
end;
результат будет одинаковый

kpa9pt
02.02.2010, 13:00
отправляемый скриптом пакет к этому же скрипту не приходит. Это вполне логично иначе возможна была ситуация зацикливания на одном пакете (обработка - отправка - обработка -отправка). У вас получится только если вы напишете 2 скрипта, один управляющий, второй исполняющий. То есть в чат сесть писать будет один скрипт, а исполнять это другой. С одной стороны, а с другой если это в пределах одного скрипта, то зачем ставить такой изощренный метод, почему не написать так:
procedure OnTimer2(Sender: TObject);
begin
OnTimer;
end;
результат будет одинаковый

Мне это нужно совершенно для другого скрипта) где кокрас это пригодиться, щас попробую в 2 скрипта написать.

Нет с двумя скриптами тоже не выходит...

finomen
03.02.2010, 11:11
у тебя в окне скриптов справа список. так вот пакеты обрабатываются в порядке живой очереди (сверху вниз)
а вообще-нафига тебе это? хреновый способ обмена данными...

kpa9pt
03.02.2010, 12:50
у тебя в окне скриптов справа список. так вот пакеты обрабатываются в порядке живой очереди (сверху вниз)
а вообще-нафига тебе это? хреновый способ обмена данными...

Мне нужно было зациклить несколько скриптов.
Пакеты от клиента, которые про те, что я вас спрашивал, они (соц действия, текст в чат, там ещё, что нить мб) не меняются у меня на сервере при рестарте, что очень удобно - не надо делать что-то дополнительного перед включением или выключением, а поскольку от клиента не работает приходиться брать от сервера , а они меняются при рестартах из-за смены char id. Вот зачем мне надо).

finomen
03.02.2010, 15:34
ниче не понял. чем тебе charid мешает?

kpa9pt
03.02.2010, 16:02
ниче не понял. чем тебе charid мешает?

Да ничем, просто я из принципа написал...мне хотелось знать это я тупой не правильно что-то пишу или так должно быть.
А charid меняется при перезаходе в игру и его нужно или как-то записать через процедуру какую нить (взятие своего таргета) или вручную записывать в скрипт перед каждым запуском(после рестарта), а я так не хотел и поэтому пытался через пакеты от клиента)

finomen
03.02.2010, 16:50
а пакет UserInfo от сервера поймать не судьба?

kpa9pt
03.02.2010, 22:55
а пакет UserInfo от сервера поймать не судьба?

Да всё судьба) влом просто хотел полегче чтоб)

finomen
04.02.2010, 00:50
фигасе полегче.....

sinles
04.02.2010, 12:37
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.