PDA

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


ampeg
09.07.2010, 18:37
Здравствуйте, товарищи.
Помогите, пожалуйста написать скрипт на покупку вещей в обычном магазине.
я, к сожалению, почти ничего не понимаю в программировании=\
заранее благодарен.
П.С.,
хроники ц4
begin

buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Delay (100);
buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Delay (100);
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServer;
Delay (100);
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServer;
Delay (100);
buf:=hstr('1F 44 78 2D D6 01 00 00 00 B1 19 00 00 01 00 00 00');
SendToServer;
Delay (100);

end.

проблема в том, что после последнего пакета не происходит покупка, а приходит пакет ActionFail, а до этого все работает как должно..
доходит до окна покупки, ну и дальше тот самый пакет экшн фэйл и все.
помогите разобраться=\
как я понял, проблема в том, что ListID в пакете BuyList, приходящем от сервера каждый раз разный, и нужно заменять это значение в последнем пакете RequestBuyItem, отправляемым мной на сервер.
Подскажите пожалуйста, как это сделать.
П.С.С.
я правильно думал, если отправляю пакеты руками, пошагово, то все покупается.
помогите написать замену этого значения,т.е. нужно поймать пакет BuyList, вытащить из него значение ListID, и вставить его в последний отправляемый пакет.
но, к сожалению, ума не приложу как написать это на дэльфи.

Добавлено через 15 часов 43 минуты
Пытался сделать вот так:
var
ListID:integer;
begin
begin
buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Delay (100);
buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Delay (100);
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServer;
Delay (100);
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServer;
Delay (100);
end;
If (ConnectName='DamageControl') and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
SendToServer;
end;
end.
Но выдает ошибку программы:
Access violation at address 132775B5 in module 'icq.exe'. Read of address 00000001.

J-Fobos
09.07.2010, 21:17
Первое что надо сказать: НЕ используйте Delay в скриптах, тормозится весь трафик. Для таких вещей есть таймер.

"ListID в пакете BuyList, приходящем от сервера каждый раз разный" вы уверенны? Я такого никогда не встречал. Но в любом случаи организуйте таймер. Если с ним заработает, то проблема отпадет сама собой, а если нет - будем дальше разбираться :)

ampeg
09.07.2010, 21:34
Да, я уверен.
каждый раз, при покупке,
те самые байты в пакете различаются.
а насчет делея я учту, спасибо)
но, даже не смотря на делей, проблема не в нем, а в том самом пакете.
Все бы было просто, если бы был мультиселл.
в нем пакеты всегда одинаковые, а тут - нет.
кстати,
если убрать If (ConnectName='DamageControl') and FromServer and (pck[1] = #$11) then begin
в комментрий, то скрипт закончит работать без ошибок, последний пакет отправится, но в нем не будет хватать заветных байтов)
помогите уже разобраться, что за фигня =\

var
tick: Integer;
ListID:integer;
procedure Init;
begin
end;
function Pause(Timewait: Integer):Boolean;
var
t : integer;
begin
result := false;
t := Round(Time*86400);
if t > (tick + Timewait) then
begin
tick := t;
result := true;
end;
end;
begin
begin
buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Pause (2);
buf:=hstr('04 BE 2C 10 48 09 43 01 00 58 44 02 00 74 F2 FF FF 00');
SendToServer;
Pause (2);
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServer;
Pause (2);
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServer;
Pause (2);
end;
If (ConnectName='DamageControl') and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
SendToServer;
end;
end.
пробывал так.
пакеты летят с бешенной скоростью, все виснет,
каубудто задержки и нет вовсе,
по прежнему не работает.

J-Fobos
09.07.2010, 23:19
Еще раз: используйте т а й м е р :)

Выложите 2-3 пакета с списком продаж, я заинтересовался.

ampeg
09.07.2010, 23:28
11 B6 64 DB 31 44 8C D3 D7 0F 00 04 00 00 00 00 00 B7 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 B8 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 49 02 00 04 00 00 00 00 00 AD 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 AE 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 20 A1 07 00 04 00 00 00 00 00 B3 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 B4 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 93 04 00 04 00 00 00 00 00 AB 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 AC 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 0C 00 04 00 00 00 00 00 D9 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 DA 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 A9 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 E1 E4 00 04 00 00 00 00 00 AA 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 3D 00 04 00 00 00 00 00 BF 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 80 96 98 00 04 00 00 00 00 00 C0 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 B1 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5A 62 02
11 B6 0A 79 2F 44 58 FC D7 0F 00 04 00 00 00 00 00 B7 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 B8 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 49 02 00 04 00 00 00 00 00 AD 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 AE 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 20 A1 07 00 04 00 00 00 00 00 B3 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 B4 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 93 04 00 04 00 00 00 00 00 AB 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 AC 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 0C 00 04 00 00 00 00 00 D9 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 DA 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 A9 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 E1 E4 00 04 00 00 00 00 00 AA 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 3D 00 04 00 00 00 00 00 BF 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 80 96 98 00 04 00 00 00 00 00 C0 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 B1 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5A 62 02
11 B6 BE 3D 34 44 08 10 D8 0F 00 04 00 00 00 00 00 B7 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 B8 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 49 02 00 04 00 00 00 00 00 AD 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 AE 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 20 A1 07 00 04 00 00 00 00 00 B3 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 C6 2D 00 04 00 00 00 00 00 B4 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 93 04 00 04 00 00 00 00 00 AB 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 AC 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 35 0C 00 04 00 00 00 00 00 D9 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 DA 02 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 42 0F 00 04 00 00 00 00 00 A9 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 E1 E4 00 04 00 00 00 00 00 AA 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 3D 00 04 00 00 00 00 00 BF 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 80 96 98 00 04 00 00 00 00 00 C0 03 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 40 4B 4C 00 04 00 00 00 00 00 B1 19 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5A 62 02
не силен я в этом языке, и не знаю, как тут сделать таймер)
в последнем пакете, к примеру ListID - 44 08 10 D8

J-Fobos
10.07.2010, 00:04
Заточки значит купить надобно :)
Собственно для начала узнайте как сделать таймер, я думаю вы понимаете что никто за вас скрипт писать не будет, даже такой простой :)

Дальше алгоритм будет такой.
Во время запуска скрипта создайте таймер с нужными задержками.
В процедуре таймера надо отправить первые 3 пакета и выключить его (таймер). Пакеты отправлять по очереди, если разберетесь в таймере - поймете что имеется ввиду.
А в теле скрипта обрабатывайте пакет id=#$11, читайте с него ListID и записывайте его в переменную типа integer. Там же генерируйте (используя уже известный ListID) 4-й пакет, который и купит итем.

Еще надо уточнить, что в первых 3-х пакетах присутствует ObjectID нпц и он также как и ListID может меняться (правда только при рестарте сервера). Я бы также организовал процедуру, которая будет составлять базу нпц и искать в нем нужный нам ObjectID.
Но это будет не просто для новичка, поэтому для начала будет достаточно и выше написанного алгоритма.

ampeg
10.07.2010, 01:06
вся проблема в том, что у меня никак не получается поймать пакет #$11 и выдрать из него ListID.
в этом то и есть вся проблема..
Подскажите как мне это сделать, а дальше я уже сам все напишу :)

supernewbie
10.07.2010, 01:39
if fromserver and (pck[1]=#$11) then
begin
listID:=ReadD(6);
end;

J-Fobos
10.07.2010, 01:40
if fromserver and conectname='asd' and pck[1]=#$11 then

ой, удалите мой пост :) supernewbie уже ответил, я на целую минуту опоздал :D

ampeg
10.07.2010, 01:43
Кажется, выше я писал практически тожесамое.
поробывал точно также, как написали Вы, не изменилось ничего=\

J-Fobos
10.07.2010, 02:00
Кажется, выше я писал практически тожесамое.
поробывал точно также, как написали Вы, не изменилось ничего=\
Вы думаете я просто так три раза упоминал о таймере? Сразу отвечу что не просто так. Делайте через таймер, потому что то что вы написали нихрена (извините за выражение :) ) не тоже самое, даже не близко.

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

Таймер, таймер, таймер, понятно? :D

ampeg
10.07.2010, 06:18
const
Nick='DamageControl';
var
ListID:integer;
Timer01: TTimer;
TimerCyrcle:integer;

procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=true;
Timer01.interval:=1500;
TimerCyrcle:=1;
end;
procedure OnTimer01(Sender: TObject);
begin
case TimerCyrcle of
1:begin
buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
SendToServerEx(Nick);
SendToServerEx(Nick);
Inc(TimerCyrcle);
end;
2:begin
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServerEx(Nick);
Inc(TimerCyrcle);
end;
3:begin
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServerEx(Nick);
TimerCyrcle:=1;
Timer01.enabled:=false;
end;
end;

end;
procedure Free;
begin
Timer01.free;
end;


begin
If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
SendToServerEx(Nick);
end;
end.
почему-то не переходит в "тело" скрипта...

J-Fobos
10.07.2010, 14:50
Дополним чуть ваш скрипт :)

Добавим процедуру SendMsg2 и пару раз будем ее юзать.
procedure SendMsg2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg);
SendToClientEx(Nick);
end;

В результате ваш скрипт будет такой:

const
Nick='DamageControl';
var
ListID:integer;
Timer01: TTimer;
TimerCyrcle:integer;

procedure SendMsg2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg);
SendToClientEx(Nick);
end;

procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=true;
Timer01.interval:=1500;
TimerCyrcle:=1;
end;

procedure OnTimer01(Sender: TObject);
begin
case TimerCyrcle of
1:begin
buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 1');
SendToServerEx(Nick);
SendMsg2('Еще раз отправился пакет 1, без задержки');
Inc(TimerCyrcle);
end;
2:begin
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 2');
Inc(TimerCyrcle);
end;
3:begin
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 3 и таймер остановился');
TimerCyrcle:=1;
Timer01.enabled:=false;
end;
end;

end;
procedure Free;
begin
Timer01.free;
end;


begin
If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
SendMsg2('Поймали пакет #$11');
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
SendToServerEx(Nick);

end;
end.

Проверьте какой будет результат работы скрипта :)

ampeg
10.07.2010, 17:15
Логи это хорошо :)
результат работы скрипта:
отправляется 3 первых пакета и персонаж начинает крутиться.
дальше скрипт не идет.

J-Fobos
10.07.2010, 17:55
Кхм, результат должен был быть чуть другим. Должны были быть отправлены первые 3 пакета, а потом "Поймали пакет #$11". Скрипт то правильно написан, почти. Я специально добавил логи чтобы вы это увидели.

Собственно проблема в строчке
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
Смотрите что происходит при выполнении этой строки (если ListID=1234567891):
1) выполняется команда IntToStr и в результате мы получаем 1234567891 -> '1234567891'
2) Дальше суммируются строки:
'1F' + '1234567891' + '01 00 00 00 B1 19 00 00 01 00 00 00' ->
'1F 12 34 56 78 91 01 00 00 00 B1 19 00 00 01 00 00 00'
3) Выполняется функция hstr и получаем пакет
'1F 12 34 56 78 91 01 00 00 00 B1 19 00 00 01 00 00 00' ->
#$1F#$12#$34#$56#$78#$91#$01#$00#$00#$00#$B1#$19#$ 00#$00#$01#$00#$00#$00

Синим цветом я выделил то место куда мы запихнули ListID, но сразу бросается в глаза: оно занимает 5 байтов, а должно занимать 4 байта. А если ListID будет равно 1324, то получится что оно займет 2 байта в пакете и опять же пакет будет неправильным.

В чем проблема? В том что команда ReadD вытаскивает с пакета число в 10-тиричной системе вычислений, и команда IntToStr "пихает" в пакет чистой в той же 10-тиричной системе, а надо то в 16-ти.
Для этого случая есть команда WriteD и в вашем случаи надо ее использовать.


PS:
Hебольшая догадка почему чар крутится: возможно ListID нечетное количество символов получается, например 12345. Тогда в конец отсылаемого пакета попадает не 00, а просто 0 и это приводит к нарушению чтения всех последующих данных.

ampeg
10.07.2010, 19:05
const
Nick='DamageControl';
var
ListID:integer;
Timer01: TTimer;
TimerCyrcle:integer;

procedure SendMsg2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg);
SendToClientEx(Nick);
end;


procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=true;
Timer01.interval:=1000;
TimerCyrcle:=1;
end;

procedure OnTimer01(Sender: TObject);
begin
case TimerCyrcle of
1:begin
buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 1');
SendToServerEx(Nick);
SendMsg2('Еще раз отправился пакет 1, без задержки');
Inc(TimerCyrcle);
end;
2:begin
buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 2');
Inc(TimerCyrcle);
end;
3:begin
buf:=hstr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 3 и таймер остановился');
TimerCyrcle:=1;
Timer01.enabled:=false;
end;
end;

end;
procedure Free;
begin
Timer01.free;
end;


begin
If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
SendMsg2('Поймали пакет #$11');
buf:=#$1F; WriteD(ListID); WriteD(1); WriteD(6577); WriteD(1);
SendMsg2('Модифицировали пакет RequestBuyItem, ListID= ' + IntToStr(ListID));
SendToServerEx(Nick);


end;
end.
по логам доходит до конца, лист ИД получает правильно, реквестбай итем не отправляет.

J-Fobos
10.07.2010, 20:06
Видите ли, здесь есть еще один нюанс :)

Когда вызывается процедура SendMsg2 содержимое переменной buf меняется (внутри процедуры). Вот пример:
buf:=#$11;
SendMsg2(15);
SendToServerEx(nick);
В результате на сервер отправляется не 11, а 15 (грубо говоря).

Обратите внимание что в том скрипте который я выложил ранее процедура SendMsg2 идет всегда после SendToServerEx, а не перед.


Получается что у вас здесь отправляется не пакет покупки, а то что выводится в чат. Вы можете в этом убедится посмотрев в логе пакетов.
buf:=hstr('1F 00 00 00 00 01 00 00 00 B1 19 00 00 01 00 00 00');
WriteD(ListID,2);
SendMsg2('Модифицировали пакет #$11');
SendToServerEx(Nick);

ampeg
10.07.2010, 20:10
Спасибо Вам огрмное,J-Fobos, я все сделал, все отлично работает :)
единственное - вы были првавы, обджект ИД при рестарте сервера меняется..но это не большая проблема :)

J-Fobos
10.07.2010, 20:17
А вы были не правы написав "почти ничего не понимаю в программировании" ;)
Нормально вы все понимаете, многие пользователи пакетхаком могут только позавидовать вам :)

ampeg
10.07.2010, 20:32
3-4 месяца C#, пара программ приличных...вот и весь мой опыт)

ampeg
02.08.2010, 15:58
Уважаемый J-Fobos, а не подскажете ли вы, как таки сделать чтобы пакет на клик по итему, и пакет экшн не прописывать каждый раз в скрипте?

J-Fobos
02.08.2010, 20:43
Уважаемый J-Fobos, а не подскажете ли вы, как таки сделать чтобы пакет на клик по итему, и пакет экшн не прописывать каждый раз в скрипте?
Покажите сами пакеты, щас что-то придумаем ;)

ampeg
04.08.2010, 17:37
04 1D 2A 10 48 7A 48 01 00 99 44 02 00 3F F8 FF FF 00
14 9A 7A 10 40 00 00 00 00
ну вот, скажем.
при рестарте меняются обджект ид, вообщем.

Breadfan
04.08.2010, 20:46
ОИД непися - при убегании\подбегании\релоге к клиенту приходит и зная ИД нпс можно узнать искомое. Можно считывать ОИД с первого клика клиента и далее (на время работы) оставлять его неизменным (наподобие встать у нпс, запустить скрипт, кликнуть по нпс - скрипт возьмет ОИД из пакета action от клиента)

J-Fobos
04.08.2010, 20:47
Breadfan, мы уже проблему с BuyList решили :)


ampeg, начнем с простого, пакет UseItem. Как вы уже поняли надо узнать ObjectID и подставить его в пакет. Чтобы узнать ObjectID нужного итема придется проверить пакет в котором хранится содержимое сумки (я не помню его ид и названия и сейчас нету возможности глянуть), этот пакет приходит после отправки клиентом пакета 0F=RequestItemList. Пример разборки этого пакета можете посмотреть в скрипте на заточку NLObP. Если там будет что непонятно - объясню.

С определением ObjectID нпц не намного сложнее. Просто проверяйте все пакеты 16=NpcInfo, число что будет в ReadD(6) являет собой id нпц и если оно будет таким как вам нужно читайте число ReadD(2) и узнаете нужный ObjectID.

Breadfan
04.08.2010, 20:54
Так у него в пакете на закупку - используется ИД заточек, а не их ОИД ( на примере "1f 44 78 2D D6 01 00 00 00 B1 19 00 00 01 00 00 00" - только ИД листа меняется, так что сумку перебирать необязательно наверно (а если и требуется получить ОИД итема - можно привязать к удалению\выбрасыванию итема), дело только в нпс...Breadfan, мы уже проблему с BuyList решили :) да я то заметил когда решил повнимательнее полистать :D

ampeg
04.08.2010, 21:42
а как правильно реализовать, чтобы при старте скрипта он запоминал нужные пакеты, после этого действия в игре, т.е. я кликнул по итему, кликнул по нпц, скрипт запоминл?

J-Fobos
04.08.2010, 22:00
Ну я описал полностью автоматическое распознавание ObjectID, без кликов, без ничего, запустился скрипт и ObjectID становятся известны. Но можно так как и вы написали, чтобы сразу после запуска скрипта человек указывал нпц и предмет. Это проще реализовать:
если (пакет пришел от клиента) и (пакет юз итем) и (ObjectID предмета = 0) тогда запомнить ObjectID предмета;
если (пакет пришел от клиента) и (пакет акшин) и (ObjectID нпц = 0) тогда запомнить ObjectID нпц;

Ну при запуске скрипта надо задать что ObjectID было равно нулю и все :)

ampeg
04.08.2010, 22:34
а такой вопрос, как его запомнить то?

Breadfan
04.08.2010, 22:47
Как-то так:
var
OIDnpc:integer;
........
procedure Init; //Вызывается при включении скрипта
begin
......
OIDnpc:=0;
.....
end;

if fromclient and (pck[1]=#$04) and (OIDnpc=0) then OIDnpc:=(ReadD(2)); - по аналогии и ОИД итема, только использовать пакет на юз итема

ampeg
06.08.2010, 18:45
кажется сделал :))

dyh9l
23.08.2010, 18:59
hellsing-world?