PDA

Просмотр полной версии : Что нах за магия вуду???


ПолуГость2
19.06.2009, 22:48
Вот ЧТО может быть неправильно в таком скрипте? Я ля уже в шоке.

var
NickName : String;

procedure Init;
begin
NickName := 'lalala'; // тут все как надо
end;

procedure Free;
begin

end;

//================================================== ==================================
procedure getYes;
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS('Прошло YES'); SendToClient;
pck := '';
end;

//================================================== ==================================
procedure getNo;
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS('Прошло NO'); SendToClient;
pck := '';
end;

//================================================== ==================================
//================================================== ==================================
begin
if pck = '' then exit;
if (ConnectName = NickName) and FromClient then begin
if (pck[1]=#$34) and (pck[2]=#$06) then getYes;
if (pck[1]=#$34) and (pck[2]=#$05) then getNo;
end;

end.


Если нажать Yes, проходит:
(c) CreatureSay (4A 00 00 00 00 0A 00 00 00 00 00 1F 04 40 04 3E 04 48 04 3B 04 3E 04 20 00 59 00 45 00 53 00 00 00 )
(c) CreatureSay (4A 00 00 00 00 0A 00 00 00 00 00 1F 04 40 04 3E 04 48 04 3B 04 3E 04 20 00 59 00 45 00 53 00 00 00 )
(s) RequestSocialAction (34 06 00 00 00 )
(c) SocialAction (27 2F 37 02 10 06 00 00 00 )
Если нажать No, проходит:
(c) CreatureSay (4A 00 00 00 00 0A 00 00 00 00 00 1F 04 40 04 3E 04 48 04 3B 04 3E 04 20 00 4E 00 4F 00 00 00 )
(c) CreatureSay (4A 00 00 00 00 0A 00 00 00 00 00 1F 04 40 04 3E 04 48 04 3B 04 3E 04 20 00 4E 00 4F 00 00 00 )

Притом CreatureSay идет дважды, хотя клиент рисует анонс один раз.

Я это обнаружил когда по Yes отправлял на сервер запрос - мало того, что не блокировался Yes, так и запрос проходил ДВАЖДЫ, хотя в коде, разумеется, отправка была одна-единственная. Либо я чего-то важного не понимаю, либо l2ph косячит, либо одно из трех.

З.Ы. l2phx.3.5.11.118

alexteam
19.06.2009, 23:09
эм...
обнулять буффер раньше отправки..

NLObP
19.06.2009, 23:26
Тоже обращал внимание, что от клиента пакеты дупятся. Имхо просто в лог два раза выводится.

ПолуГость2
19.06.2009, 23:58
alexteam
Не помогает.

NLObP
Как можно быть в этом уверенным? Кстати, в других скриптах такого не замечал...

alexteam
20.06.2009, 00:05
ну, на вскидку могу сказать только 2 места где пакет отправляется это пропуск пакета скриптами (pck не был обнулен) и отработка SendToxxx
так что отправляет он действительно ровно столько раз сколько от него требуется...
с отрисовкой немного посложнее.. пакет сначала добавляется в акумулятор дня отрисовки а поом уже с него забирается.. там я могу накосячить
да и Притом CreatureSay идет дважды, хотя клиент рисует анонс один раз.

ПолуГость2
20.06.2009, 00:24
ППЦ, это магия!!!
пх 3.4.1.83 на yes выдает Access violation по гениальному адресу 13232819 (что-то читает адрес 0), _до_ того, как отправляет-таки на сервер yes, creature say срабатывает один раз. Для No все ок.

Добавлено через 3 минуты
Если обойтись без анонсов, то все равно access violation при yes, проблема конкретно в нем. Перейду на другое соц. действие :) Двойную отправку считаем фантомом, тем более, что в 3.4.1.83 ее вроде нет...

Добавлено через 12 минут
ААААААААААААААААААААААААААААА, бля, я понял!!!
Проблема в том, что при yes срабатывает вызов, pck чистится, и после возврата следующий if лезет в несуществующие элементы срокового массива, а дальше уж неизвестно что происходит, но плохое. Если скрипт сделать с отложенным удалением, все ок. (ну кроме двойной отправки, которую мы считаем кажущейся)

Это, ребята, надо в доку вносить, это может быть системой...

var
NickName : String;
killPacket:Boolean;

procedure Init;
begin
NickName := 'userName';
end;

procedure Free;
begin
NickName := '';
killPacket := false;
end;

//================================================== ==================================
procedure getNo;
begin
killPacket := true;
end;

//================================================== ==================================
procedure getYes;
begin
killPacket := true;
end;

//================================================== ==================================
//================================================== ==================================
begin
if pck = '' then exit;
if (ConnectName = NickName) and FromClient then begin
if (pck[1]=#$34) and (pck[2]=#$06) then getYes;
if (pck[1]=#$34) and (pck[2]=#$05) then getNo;
end;

if (killPacket) then pck := '';
killPacket := false;
end.

NLObP
20.06.2009, 00:25
Access violation
это первый признак, что шлеш пакеты не в то соединение (Name не соответствует чару).

alexteam
20.06.2009, 00:33
Мухахха.. не поверишь.. я пошел покурил.. попутно спросил себя - а почему не кейс... и потом уже понял откуда аксесвиолейшин брался.

ПолуГость2
20.06.2009, 00:39
if потому что лениво два символа вырезать или переприсваивать, что, кстати, решило бы проблему...