PDA

Просмотр полной версии : Скрипт на обмен (HB)


Shadow
29.10.2009, 18:56
Написал простой скрипт на обмен КоЛов, и обмен на гейтпассы. Но где-то ошибка, и не могу понять где. Скрипт нормально обменивает колы, но потом утыкается и не хочет переходить на вторую часть.
Да, и еще, как можно сделать проверку на конкретный пакет s19=NpcHtmlMessage:d(MessageID)s(HTML)d(d)?
Id у них одинаковые, но мессаги внутри разные. Нужно их как-то определять, и исходя из сообщения, направлять скрипт.

ЗЫ Сам запостил, сам поковырял, сам исправил =) Выкладываю рабочую версию. Запускается действием Приветствие.

Shadow
29.10.2009, 19:01
//Константы
const
Name='Nick'; //Вписать сюда имя чара
DebugMode=False;
//***
Max=100; //количество слотов в инвентаре чара
kID=1023000; //смещение C6

//------------------------------------------------------------------------------
//Список переменных
var
Item, Cnt: integer;
ReadyBuy, ReadyChange, NeedToBuy, NeedToChange, Start, TimerRun: boolean;
Timer1: TTimer;
BuyDelay, ScriptDelay: integer;
MyX, MyY, MyZ, MyOID, ObjectID: integer; //Статы
//================================================== ============================
//************************************************** ****************************
//21=RequestBypassToServer:s(Cmd)
procedure RequestByPassToServer(cmd:string);
begin
buf:=#$23;
WriteS(cmd);
SendToServerEx(Name);
end;
//************************************************** ****************************
procedure RequestMultiSellChoose(ListId, EntryID, Count:integer);
begin
SendMsg_to_Private('Покупаем ListID:'+IntToStr(ListID)+' EntryID:'+IntToStr(EntryID)+' в кол-ве:'+IntToStr(count));
buf:=#$B0;
WriteD(ListID);
WriteD(EntryId);
WriteD(Count);
SendToServerEx(Name);
end;
//================================================== ============================
//************************************************** ****************************
procedure Init; //Вызывается при включении скрипта
begin
Timer1:=TTimer.Create(nil);
Timer1.OnTimer:=@OnTimer1;
Timer1.Enabled:=false;
Timer1.Interval:=1000;
TimerRun:=False;
Cnt:=0;
Start:=True;
end;
//***---------------------------------------------------------------------------
procedure Free; //Вызывается при выключении скрипта
begin
Timer1.free;
end;
//***---------------------------------------------------------------------------
//================================================== ============================
procedure OnTimer1(Sender: TObject);
begin
if Start then begin
MenuChange;
Start:=False;
end;
if NeedToChange then begin
DebugMsg('Menu ->');
MenuChange;
DebugMsg('>- Change');
end;
if NeedToBuy then begin
DebugMsg('Menu ->');
MenuBuy;
DebugMsg('>- Buy');
end;
DebugMsg('Timer '+inttostr(Cnt)+' - '+(Name));
Cnt:=(Cnt+1);
end;
//***---------------------------------------------------------------------------
procedure MenuChange;
begin
buf := HStr('22 7A 00 7A 00 7A 00 5F 00 72 00 65 00 6C 00 61 00 78 00 5F 00 63 00 61 00 74 00 31 00 5F 00 39 00 36 00 30 00 2E 00 68 00 74 00 6D 00 00 00');
ReadyChange:=True;
SendToServerEx(Name);
delay(150);
end;
//***---------------------------------------------------------------------------
procedure MenuBuy;
begin
buf := HStr('22 7A 00 7A 00 7A 00 5F 00 72 00 65 00 6C 00 61 00 78 00 5F 00 63 00 61 00 74 00 31 00 5F 00 39 00 30 00 30 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServerEx(Name);
DebugMsg('1 ->');
delay(300);
buf := HStr('22 7A 00 7A 00 7A 00 5F 00 72 00 65 00 6C 00 61 00 78 00 5F 00 63 00 61 00 74 00 31 00 5F 00 39 00 30 00 37 00 2E 00 68 00 74 00 6D 00 00 00');
ReadyBuy:=True;
SendToServerEx(Name);
DebugMsg('2 ->');
delay(150);
end;
//***---------------------------------------------------------------------------
procedure MenuReturn;
begin
buf := HStr('22 7A 00 7A 00 7A 00 5F 00 72 00 65 00 6C 00 61 00 78 00 5F 00 63 00 61 00 74 00 31 00 5F 00 30 00 30 00 31 00 2E 00 68 00 74 00 6D 00 00 00');
SendToServerEx(Name);
delay(150);
end;
//***---------------------------------------------------------------------------
//###################### Сообщения #############################################
// послать сообщение в чат себе
procedure SendMsg_to_Chat(ChatType: integer; msg:string); // отправка системных сообщений клиенту
begin
buf:=#$4A;
WriteD(0);
WriteD(ChatType);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
// послать отладочное сообщение себе
procedure DebugMsg(msg:string);
begin
if DebugMode then
SendMsg_to_Private(msg);
end;
// послать сообщение себе в приват
procedure SendMsg_to_Private(msg:string);
begin
SendMsg_to_Chat(2,msg);
end;
//################################################## #############################

Shadow
29.10.2009, 19:02
Я чего-то не понял, как код теперь всталять, если ограничение в 5000 символов???

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//************************************************** **************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **************************
if FromClient and (pck=#$34#$02#$00#$00#$00) then begin
if Not TimerRun then begin
Timer1.Enabled:=True;
TimerRun:=True;
DebugMsg('Timer Running');
end;
end;
if ReadyChange then begin
NeedToChange:=False;
NeedToBuy:=False;
if (ConnectName=Name) and FromServer then begin
DebugMsg('S>Need to Change. Timer Stop');
Timer1.Enabled:=False;
case pck[1] of
//s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
#$19: begin
//DebugMsg(IntToStr(ReadD(4)));
//шлем запрос выбора пункта - продажа c21=RequestBypassToServer:s(Cmd)
delay(150);
RequestByPassToServer('menu_select?ask=-11&reply=19001');
DebugMsg('C>Пакет RequestBypassToServer');
end;
#$D0: begin
Timer1.Enabled:=False;
DebugMsg('S>Пакет MultiSellList #$D0');
RequestMultiSellChoose(19001, 3, 1);
delay(350);
ReadyChange:=False;
MenuReturn;
NeedToBuy:=True;
Timer1.Enabled:=True;
end;
end;
end;
end;
if ReadyBuy then begin
NeedToChange:=False;
NeedToBuy:=False;
if (ConnectName=Name) and FromServer then begin
DebugMsg('S>Need to Buy. Timer Stop');
Timer1.Enabled:=False;
case pck[1] of
//s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
#$19: begin
//DebugMsg(IntToStr(ReadD(4)));
//шлем запрос выбора пункта - продажа c21=RequestBypassToServer:s(Cmd)
delay(150);
RequestByPassToServer('menu_select?ask=-9&reply=15006');
DebugMsg('C>Пакет RequestBypassToServer');
end;
#$D0: begin
Timer1.Enabled:=False;
DebugMsg('S>Пакет MultiSellList #$D0');
RequestMultiSellChoose(15006, 11, 1333);
delay(350);
ReadyBuy:=False;
MenuReturn;
NeedToChange:=True;
Timer1.Enabled:=True;
end;
end;
end;
end;
end.

NLObP
30.10.2009, 00:09
Я чего-то не понял, как код теперь всталять, если ограничение в 5000 символов???

Прикрепляй файлом.