Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг
Войти через OpenID

Скриптинг Форум посвещенный созданию скриптов для L2PacketHack

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 16.02.2010, 15:00   #21
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

мда...
1. между begin - end. нужно просто читать. обновлять интерфейс. устанавливать флаги и переменные и т.д.
при этом между begin-end. ни ничего не нужно отправлять на сервер.
2. в таймере ориентируясь на флаги отправлять тот или иной пакет, составленый по этим флагам и переменным.

при текущей реализации тебе нужно спамить пакетом 0F в надежде что следующее срабатывание таймера будет на пакете итемлист, что далеко не всегда так.
а если обнаружение этого пакета вынести с таймера, в основное тело пакета, составлять его там, но не слать. а просто запоминать и отсылать уже в таймере, обнулив после посылки - получиццо красивее.
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 16.02.2010 в 15:06.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 16.02.2010, 15:31   #22
Новичок
 
Регистрация: 30.06.2009
Сообщений: 26
Сказал Спасибо: 19
Имеет 3 спасибок в 2 сообщенях
Hworang пока неопределено
По умолчанию

1) изменение информации на окошке выполнять в таймере?
2) завёл 4 переменные для сохранения пакета, который нужно отправить
-запрос итемлиста
-покупка
-продажа
-перевод денег

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

когда и откуда посылать 0F?

---------------------
аа всё, я понял - в основной программе нужно после каждого составления пакета его сохранить и его флаг поставить true
а потом в таймере отправлять пакеты с фланом true и сбрасывать флаги на false
уже делаю

Последний раз редактировалось Hworang, 16.02.2010 в 15:38.
Hworang вне форума   Ответить с цитированием
Старый 16.02.2010, 15:48   #23
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

0f - запрос итемлиста. если правильно организовать скрипт, то его нужно вызывать единожды при старте.

в идеале:
в основном теле программы у тебя обрабатываются только пакеты итемлист и инвенториапдейт. по ним строиться либо обновляется массив с вещами которые присутствуют в инвентаре.
в данном конкретном случае не обязательно вести базу для всех вещей в инвентаре.

в ините:
создание интерфейса, отправка 0f на сервер.

в таймере:
по имеющимся вещам в базе и их колву - конструируется тот или иной пакет от отправляеться на сервер.


регулируя интервал срабатывания таймера мы регулируем частоту "принятия решения" ускоряя или замедляя процесс, при этом не пропускаем пакеты и не спамим сервер.
по поводу самой тяжелой части - инвентаризации я уже говорил. есть на форуме.
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 16.02.2010 в 15:51.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 16.02.2010, 17:11   #24
Новичок
 
Регистрация: 30.06.2009
Сообщений: 26
Сказал Спасибо: 19
Имеет 3 спасибок в 2 сообщенях
Hworang пока неопределено
По умолчанию

сделал чтение и составление пакетов в основной программе
а посылку в таймере
0F в Init

выполняется скрипт 1 раз (ну или еще пару раз, если в игре понажимать таб)

скорее всего я не понимаю механики phx'а
а именно - какой пакет обрабатывается сйчас? - который пришел последним к моменту начала скрипта или последний пришедший вообще и т.д.
как пропустить пакет? мне вообще нужно видеть только 1B от сервера
зачем нужен инвенториапдейт - он показывает только изменение адены

delphi Код:
////////////////////////////////////////////////////////////////////// // Продавалка v 1.1 от Hworang /////////////////////////////////////// // на основе скриптов от Qak ///////////////////////////////////////// // CoderX.ru ///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Настроена для сервера l2mw.ru ///////////////////////////////////// // создайте чара и почистите рюкзак ////////////////////////////////// // стартовые условия - 100kk и 1 голд бар и болше ничего (2/200) ///// // впишите свой ник в соотв. поле (в скрипте) //////////////////////// // подойдите к ГМшопу и возьмите его в таргет //////////////////////// // запускайте скрипт и радуйтесь, видя как адена льётся в рюкзак))) // // все изменения - на свой страх и риск ////////////////////////////// // за последствия работы скрипта автор ответственности не несет :D /// ////////////////////////////////////////////////////////////////////// var i,c,g:integer;     gg,incomeA,incomeG:integer = 0;     s,sendS,sendB,sendC,sendP:string;     Main : TForm;     Timer : TTimer;     Button : TButton;     Edit,Edit1,Edit2,Edit3,Edit4: TEdit;     Start,seS,seB,seC,seP: Boolean = False;     e : Boolean;     Pos_i : Integer;     myDate,work : TDateTime;     myHour, myMin, mySec, myMilli : Word; const nik = 'LooksThatKill'; // Сюда вписать имя чара       it  = 195// скрипт покупает 195 итемов - можете править этот параметр [1..198]       x   = 1680; // введите разрешение вашего монитора       y   = 1050; // иначе окошко с информацией потеряется       tit = 300;// задержка // если поставить меньше - адена пойдет быстрее, но будет лагать procedure Init; begin   e:=true;   work:=Time;   g:=1;   buf:=HStr('0F ');   SendToServerEx(nik); Pos_i:=1; //формочка Main := TForm.Create(nil); Main.Caption := 'Продавалка v 1.1'; Main.BorderStyle := bsSizeable; Main.Position := poDesigned; Main.Left :=x-400; Main.Top :=y-200; Main.Width :=300; Main.Height :=110; Edit := TEdit.Create(Main); Edit.Parent := Main; Edit.Left := 90; Edit.Top := 10; Edit.Width := 114; Edit1 := TEdit.Create(Main); Edit1.Parent := Main; Edit1.Left := 214; Edit1.Top := 10; Edit1.Width := 62; Edit2 := TEdit.Create(Main); Edit2.Parent := Main; Edit2.Left := 214; Edit2.Top := 40; Edit2.Width := 62; Edit3 := TEdit.Create(Main); Edit3.Parent := Main; Edit3.Left := 90; Edit3.Top := 40; Edit3.Width := 114; Edit4 := TEdit.Create(Main); Edit4.Parent := Main; Edit4.Left := 10; Edit4.Top := 40; Edit4.Width := 74; //таймер Timer := TTimer.Create(Main); Timer.Interval := tit; Timer.Enabled := False; Timer.onTimer := @TimerTimer; Button := TButton.Create(Main); Button.Parent := Main; Button.Caption := 'Старт'; Button.Left := 10; Button.Top := 10; Button.onClick := @ButtonClick; Main.Show; end; procedure Free; begin Edit.Free; Edit1.Free; Edit2.Free; Edit3.Free; Edit4.Free; Timer.Free; Button.Free; Main.Free; end; //обработчик таймера procedure TimerTimer(Sender : TTimer); var i,a:integer; begin   //inc(g);   //if (g mod 3 = 0) then    // запрос на рюкзак - через раз, иначе спамим сервер и вылетает ошибка   //begin   //     buf:=HStr('0F ');   //     SendToServerEx(nik);   //end;   myDate := Time;   DecodeTime(myDate, myHour, myMin, mySec, myMilli);   Edit4.Text:='Time '+TimeToStr(myDate);   Edit3.Text:='Work  '+(TimeToStr(myDate-work));   Edit2.Text:='Inc '+IntToStr(gg-incomeG);   if seb then   begin     buf:=sendb;     SendToServerEx(nik);     seb:=false;   end;   if ses then   begin     buf:=sends;     SendToServerEx(nik);     ses:=false;   end;   if sec then   begin     buf:=sendc;     SendToServerEx(nik);     sec:=false;   end;   if sep then   begin     buf:=sendp;     SendToServerEx(nik);     sep:=false;   end; end; //запуск procedure ButtonClick(Sender : TButton); begin Start := Not (Start); Timer.Enabled := Start; If Start    then Button.Caption:='Стоп'    else Button.Caption:='Старт'; end;

Последний раз редактировалось Hworang, 16.02.2010 в 17:14.
Hworang вне форума   Ответить с цитированием
Старый 16.02.2010, 17:15   #25
Новичок
 
Регистрация: 30.06.2009
Сообщений: 26
Сказал Спасибо: 19
Имеет 3 спасибок в 2 сообщенях
Hworang пока неопределено
По умолчанию

delphi Код:
begin   if pck='' then exit;     if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then   begin     if (ReadD(12)=57) then     begin       Edit.Text:='Adena ( '+IntToStr(ReadD(16))+' )';       Edit1.Text:='Gold ( '+IntToStr(ReadD(52))+' )';       gg:=ReadD(52);       if e then IncomeG:=ReadD(52);     end     else if (ReadD(48)=57) then     begin       Edit.Text:='Adena ( '+IntToStr(ReadD(52))+' )';       Edit1.Text:='Gold ( '+IntToStr(ReadD(16))+' )';       gg:=ReadD(16);       if e then IncomeG:=ReadD(16);     end;     e:=false;   end;     if FromServer and (ConnectName=nik) and (pck[1]=#$1B) and (ReadH(4)<10) then      begin                    buf:=#$A7;                    WriteD(90010);                    WriteD(900000);                    WriteD(it);                    WriteH(0);                    //SendToServerEx(nik);                    sendB:=buf;                    seB:=true;      end;      if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then      begin               c:=ReadH(4)-2;               buf:=#$1E;               WriteD(0);               WriteD(c);               if (ReadD(12)=2414) then                 for i:=1 to c do                 begin                   WriteD(ReadD(i*36-28));                   WriteD(2414);                   WriteD(1);                 end               else if (ReadD(48)=2414) then               for i:=1 to c do               begin                 WriteD(ReadD(i*36+8));                 WriteD(2414);                 WriteD(1);               end               else if (ReadD(84)=2414) then               for i:=1 to c do               begin                 WriteD(ReadD(i*36+44));                 WriteD(2414);                 WriteD(1);               end;               if (c>=1) then               begin                 sendS:=buf;                 seS:=true;                 //SendToServerEx(nik);               end;      end;      if ((ReadD(16)>700000000) and (ReadD(12)=57)) or ((ReadD(52)>700000000) and (ReadD(48)=57)) and (pck[1]=#$1B) then      begin          buf:=#$38;          WriteS('.deposit');          WriteD(0);          sendP:=buf;          seP:=true;          //SendToServerEx(nik);      end; end.
Hworang вне форума   Ответить с цитированием
Старый 16.02.2010, 18:11   #26
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Цитата:
а именно - какой пакет обрабатывается сйчас? - который пришел последним к моменту начала скрипта или последний пришедший вообще и т.д.
когда ты ставиш галочку напротив скрипта место между begin-end. выполняеться при каждом пришедшем пакете.

Цитата:
как пропустить пакет? мне вообще нужно видеть только 1B от сервера
зачем нужен инвенториапдейт - он показывает только изменение адены
инвентори апдейт показывает изменение а так же удаление либо добавление.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 17.02.2010, 08:39   #27
Новичок
 
Регистрация: 30.06.2009
Сообщений: 26
Сказал Спасибо: 19
Имеет 3 спасибок в 2 сообщенях
Hworang пока неопределено
По умолчанию

Всё вроде сделал правильно
но скрипт часто останавливается после запроса на покупку итемов
снифер показывает, что пакет отправили
но итемов не приходит и итемлист не приходит соответственно

приходится в игре вручную вызывать рюкзак и тогда скрипт выполняется еще раз или два

вот - я отметил вопросами места, где приходится вызывать рюкзак вручную
Вложения
Тип файла: txt Prodavalka_v_1_2.txt (6.9 Кб, 23 просмотров)
Hworang вне форума   Ответить с цитированием
Старый 17.02.2010, 11:27   #28
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 17.02.2010, 12:57   #29
Новичок
 
Регистрация: 30.06.2009
Сообщений: 26
Сказал Спасибо: 19
Имеет 3 спасибок в 2 сообщенях
Hworang пока неопределено
По умолчанию

Цитата:
Сообщение от alexteam Посмотреть сообщение
можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.
сделал еще 1 таймер
в него сперва положил повторную отправку пакета на покупку
и отключение самого себя после выполнения

случилось 2 неудачных пакета на покупку - скрипт стал

убрал самоотключение - скрипт заработал
глянул снифер - мультиселл пакетов по 5-6 штук в ряд

при задержке 2го таймера 600 еще терпимо - посытаются по 2 пакета покупки всего

ну и вариант с рюкзаком окончательный - работает с задержкой 100 и не посылает лишних пакетов

вот дизайн окошка последней версии



Кнопку Стоп/Старт пофиксил - оказывается при описании глобальных переменных, если их тут же присваивать в описании - присваивание повторяется вместе со скриптом (((
понимание этого позволило решить многие проблеммы
вообще хочу заметить что язык простой, с синтаксисом проблем нет
но вот логику понять труднее - будет очень полезен мануал в стиле
"одна секунда из жизни пакета"
"путешествие через phx"
ну или серьёзно "механика phx"

p.s. скрипт готов - думаю можно все в этой теме потереть и оставить только скрипт и вопросы пользователей ко мне по его настройке для конкретного сервера (позже сделаю универсальную версию)

конечно же спасибо Breadfan и alexteam за помощь
спс QaK за инвентаризацию и смену титула - глядя в эти скрипты (и иногда дёргая из них куски) я написал свой))
Вложения
Тип файла: txt Prodavalka_v_1_3.txt (8.8 Кб, 35 просмотров)

Последний раз редактировалось Hworang, 17.02.2010 в 13:18.
Hworang вне форума   Ответить с цитированием
За это сообщение Hworang нажился 2 спасибками от:
Старый 17.02.2010, 13:32   #30
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Приходит пакет от сервера либо клиента.

Если следующие условия для скрипта выполняются
1. он отмечен галочкой в списке.
2. для последних версий добавлено еще такое условие : ((useforconnectname = '') and (useforconnectid= 0)) or (useforconnectname=connectname) or (useforconnectid=connectid)

то:
переменной pck присваиваеться содержимое пакета.
устанавливаються переменны fromserver/fromclient/connectname/connectid
Скрипт запускается на исполнение.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 2 спасибками от:
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:45.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!