Просмотр полной версии : Помогите со скриптом
Здравствуйте, товарищи.
Помогите, пожалуйста написать скрипт на покупку вещей в обычном магазине.
я, к сожалению, почти ничего не понимаю в программировании=\
заранее благодарен.
П.С.,
хроники ц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.
Первое что надо сказать: НЕ используйте Delay в скриптах, тормозится весь трафик. Для таких вещей есть таймер.
"ListID в пакете BuyList, приходящем от сервера каждый раз разный" вы уверенны? Я такого никогда не встречал. Но в любом случаи организуйте таймер. Если с ним заработает, то проблема отпадет сама собой, а если нет - будем дальше разбираться :)
Да, я уверен.
каждый раз, при покупке,
те самые байты в пакете различаются.
а насчет делея я учту, спасибо)
но, даже не смотря на делей, проблема не в нем, а в том самом пакете.
Все бы было просто, если бы был мультиселл.
в нем пакеты всегда одинаковые, а тут - нет.
кстати,
если убрать 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.
пробывал так.
пакеты летят с бешенной скоростью, все виснет,
каубудто задержки и нет вовсе,
по прежнему не работает.
Еще раз: используйте т а й м е р :)
Выложите 2-3 пакета с списком продаж, я заинтересовался.
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
Заточки значит купить надобно :)
Собственно для начала узнайте как сделать таймер, я думаю вы понимаете что никто за вас скрипт писать не будет, даже такой простой :)
Дальше алгоритм будет такой.
Во время запуска скрипта создайте таймер с нужными задержками.
В процедуре таймера надо отправить первые 3 пакета и выключить его (таймер). Пакеты отправлять по очереди, если разберетесь в таймере - поймете что имеется ввиду.
А в теле скрипта обрабатывайте пакет id=#$11, читайте с него ListID и записывайте его в переменную типа integer. Там же генерируйте (используя уже известный ListID) 4-й пакет, который и купит итем.
Еще надо уточнить, что в первых 3-х пакетах присутствует ObjectID нпц и он также как и ListID может меняться (правда только при рестарте сервера). Я бы также организовал процедуру, которая будет составлять базу нпц и искать в нем нужный нам ObjectID.
Но это будет не просто для новичка, поэтому для начала будет достаточно и выше написанного алгоритма.
вся проблема в том, что у меня никак не получается поймать пакет #$11 и выдрать из него ListID.
в этом то и есть вся проблема..
Подскажите как мне это сделать, а дальше я уже сам все напишу :)
supernewbie
10.07.2010, 01:39
if fromserver and (pck[1]=#$11) then
begin
listID:=ReadD(6);
end;
if fromserver and conectname='asd' and pck[1]=#$11 then
ой, удалите мой пост :) supernewbie уже ответил, я на целую минуту опоздал :D
Кажется, выше я писал практически тожесамое.
поробывал точно также, как написали Вы, не изменилось ничего=\
Кажется, выше я писал практически тожесамое.
поробывал точно также, как написали Вы, не изменилось ничего=\
Вы думаете я просто так три раза упоминал о таймере? Сразу отвечу что не просто так. Делайте через таймер, потому что то что вы написали нихрена (извините за выражение :) ) не тоже самое, даже не близко.
Делай останавливает трафик, а соответственно пакет #$11 приходит уже после того как была произошла отправить 4-й пакет, а это значит что в переменную которая используется в 4-м пакете ничего не записано, а значит что она пуста, а пустую переменную использовать нельзя и потому вылазит ошибка в которой написано о не возможности прочесть с памяти переменную (потому что ее там нету).
Таймер, таймер, таймер, понятно? :D
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.
почему-то не переходит в "тело" скрипта...
Дополним чуть ваш скрипт :)
Добавим процедуру 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.
Проверьте какой будет результат работы скрипта :)
Логи это хорошо :)
результат работы скрипта:
отправляется 3 первых пакета и персонаж начинает крутиться.
дальше скрипт не идет.
Кхм, результат должен был быть чуть другим. Должны были быть отправлены первые 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 и это приводит к нарушению чтения всех последующих данных.
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.
по логам доходит до конца, лист ИД получает правильно, реквестбай итем не отправляет.
Видите ли, здесь есть еще один нюанс :)
Когда вызывается процедура 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);
Спасибо Вам огрмное,J-Fobos, я все сделал, все отлично работает :)
единственное - вы были првавы, обджект ИД при рестарте сервера меняется..но это не большая проблема :)
А вы были не правы написав "почти ничего не понимаю в программировании" ;)
Нормально вы все понимаете, многие пользователи пакетхаком могут только позавидовать вам :)
3-4 месяца C#, пара программ приличных...вот и весь мой опыт)
Уважаемый J-Fobos, а не подскажете ли вы, как таки сделать чтобы пакет на клик по итему, и пакет экшн не прописывать каждый раз в скрипте?
Уважаемый J-Fobos, а не подскажете ли вы, как таки сделать чтобы пакет на клик по итему, и пакет экшн не прописывать каждый раз в скрипте?
Покажите сами пакеты, щас что-то придумаем ;)
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 от клиента)
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
а как правильно реализовать, чтобы при старте скрипта он запоминал нужные пакеты, после этого действия в игре, т.е. я кликнул по итему, кликнул по нпц, скрипт запоминл?
Ну я описал полностью автоматическое распознавание ObjectID, без кликов, без ничего, запустился скрипт и ObjectID становятся известны. Но можно так как и вы написали, чтобы сразу после запуска скрипта человек указывал нпц и предмет. Это проще реализовать:
если (пакет пришел от клиента) и (пакет юз итем) и (ObjectID предмета = 0) тогда запомнить ObjectID предмета;
если (пакет пришел от клиента) и (пакет акшин) и (ObjectID нпц = 0) тогда запомнить ObjectID нпц;
Ну при запуске скрипта надо задать что ObjectID было равно нулю и все :)
а такой вопрос, как его запомнить то?
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)); - по аналогии и ОИД итема, только использовать пакет на юз итема
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot