мда...
1. между begin - end. нужно просто читать. обновлять интерфейс. устанавливать флаги и переменные и т.д.
при этом между begin-end. ни ничего не нужно отправлять на сервер.
2. в таймере ориентируясь на флаги отправлять тот или иной пакет, составленый по этим флагам и переменным.
при текущей реализации тебе нужно спамить пакетом 0F в надежде что следующее срабатывание таймера будет на пакете итемлист, что далеко не всегда так.
а если обнаружение этого пакета вынести с таймера, в основное тело пакета, составлять его там, но не слать. а просто запоминать и отсылать уже в таймере, обнулив после посылки - получиццо красивее.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 16.02.2010 в 15:06.
1) изменение информации на окошке выполнять в таймере?
2) завёл 4 переменные для сохранения пакета, который нужно отправить
-запрос итемлиста
-покупка
-продажа
-перевод денег
чтение и составление пакетов в основной программе
а вот отправку, как я понял, нужно делать через таймер
но если у меня 4 пакета - как их отправлять
т.е. в каком порядке чтоли?
когда и откуда посылать 0F?
---------------------
аа всё, я понял - в основной программе нужно после каждого составления пакета его сохранить и его флаг поставить true
а потом в таймере отправлять пакеты с фланом true и сбрасывать флаги на false
уже делаю
Последний раз редактировалось Hworang, 16.02.2010 в 15:38.
0f - запрос итемлиста. если правильно организовать скрипт, то его нужно вызывать единожды при старте.
в идеале:
в основном теле программы у тебя обрабатываются только пакеты итемлист и инвенториапдейт. по ним строиться либо обновляется массив с вещами которые присутствуют в инвентаре.
в данном конкретном случае не обязательно вести базу для всех вещей в инвентаре.
в ините:
создание интерфейса, отправка 0f на сервер.
в таймере:
по имеющимся вещам в базе и их колву - конструируется тот или иной пакет от отправляеться на сервер.
регулируя интервал срабатывания таймера мы регулируем частоту "принятия решения" ускоряя или замедляя процесс, при этом не пропускаем пакеты и не спамим сервер.
по поводу самой тяжелой части - инвентаризации я уже говорил. есть на форуме.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 16.02.2010 в 15:51.
сделал чтение и составление пакетов в основной программе
а посылку в таймере
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 thenbegin
buf:=sendb;
SendToServerEx(nik);
seb:=false;
end;
if ses thenbegin
buf:=sends;
SendToServerEx(nik);
ses:=false;
end;
if sec thenbegin
buf:=sendc;
SendToServerEx(nik);
sec:=false;
end;
if sep thenbegin
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.
Всё вроде сделал правильно
но скрипт часто останавливается после запроса на покупку итемов
снифер показывает, что пакет отправили
но итемов не приходит и итемлист не приходит соответственно
приходится в игре вручную вызывать рюкзак и тогда скрипт выполняется еще раз или два
вот - я отметил вопросами места, где приходится вызывать рюкзак вручную
можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.
можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.
сделал еще 1 таймер
в него сперва положил повторную отправку пакета на покупку
и отключение самого себя после выполнения
случилось 2 неудачных пакета на покупку - скрипт стал
убрал самоотключение - скрипт заработал
глянул снифер - мультиселл пакетов по 5-6 штук в ряд
при задержке 2го таймера 600 еще терпимо - посытаются по 2 пакета покупки всего
ну и вариант с рюкзаком окончательный - работает с задержкой 100 и не посылает лишних пакетов
вот дизайн окошка последней версии
Кнопку Стоп/Старт пофиксил - оказывается при описании глобальных переменных, если их тут же присваивать в описании - присваивание повторяется вместе со скриптом (((
понимание этого позволило решить многие проблеммы
вообще хочу заметить что язык простой, с синтаксисом проблем нет
но вот логику понять труднее - будет очень полезен мануал в стиле
"одна секунда из жизни пакета"
"путешествие через phx"
ну или серьёзно "механика phx"
p.s. скрипт готов - думаю можно все в этой теме потереть и оставить только скрипт и вопросы пользователей ко мне по его настройке для конкретного сервера (позже сделаю универсальную версию)
конечно же спасибо Breadfan и alexteam за помощь
спс QaK за инвентаризацию и смену титула - глядя в эти скрипты (и иногда дёргая из них куски) я написал свой))
Последний раз редактировалось Hworang, 17.02.2010 в 13:18.
Если следующие условия для скрипта выполняются
1. он отмечен галочкой в списке.
2. для последних версий добавлено еще такое условие : ((useforconnectname = '') and (useforconnectid= 0)) or (useforconnectname=connectname) or (useforconnectid=connectid)