PDA

Просмотр полной версии : Скрипт для AION 2.0.0.3 помогите немного


TEHb
16.02.2011, 17:01
var
Timer01,Timer02: TTimer;
Mission1,start:Boolean;
i,j,a,k:integer;
missionArr,ProdArr:array[0..20] of string;


procedure Init; //первый таймер активирует второй
begin
Timer01:=TTimer.Create(nil); //выделяем памать и т.п.
Timer01.OnTimer:=@OnTimer01; //привязываем процедуру к событию
Timer01.enabled:=false; //начальное положение включен(true)/выключен(false)
Timer01.interval:=5000; //29000 интервал(в милисекундах) как часто таймер срабатывает
Timer02:=TTimer.Create(nil); //выделяем памать и т.п.
Timer02.OnTimer:=@OnTimer01; //привязываем процедуру к событию
Timer02.enabled:=false; //начальное положение включен(true)/выключен(false)
Timer02.interval:=3000; //29000 интервал(в милисекундах) как часто таймер срабатывает
Mission1:=False;
i:=0;
j:=1;
a:=0;
k:=0;
ProdArr[0]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 2A 00 00 00 00 00 00 00 49 87 DD 0A 2A 00 00 00 00 00 00 00 D3 D6 18 0A 3F 01 00 00 00 00 00 00 DC D6 18 0A 5E 00 00 00 00 00 00 00 D9 D6 18 0A 6A 02 00 00 00 00 00 00';
start:=false;
Timer01.enabled:=true;
end;

procedure OnTimer01(Sender: TObject);
begin
Start:=true;
Timer01.enabled:=False;
end;

procedure OnTimer02(Sender: TObject);
begin
buf:='C9 57 66 00 ';
SendToServer;
buf:='B5 57 72 52 01 00 00 00 ';
SendToServer;
buf:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 18 00 00 00 00 00 00 00 49 87 DD 0A 18 00 00 00 00 00 00 00 D3 D6 18 0A 99 01 00 00 00 00 00 00 DC D6 18 0A 78 00 00 00 00 00 00 00 D9 D6 18 0A 18 03 00 00 00 00 00 00';
SendToServer;
Timer02.Enabled:=false;
end;

Procedure TakeMission;
begin
MissionArr[0]:='9C 57 5B 60 00 00 00 34 00 01 00 0A 00 00 00 00 00 00 00';
MissionArr[1]:='9C 57 5B 60 00 00 00 19 00 01 00 1C 00 A2 13 00 00 00 00';
MissionArr[2]:='9C 57 5B 60 00 00 00 EA 03 01 00 04 00 A2 13 00 00 00 00';
For i:=0 to 2 do
begin
buf:=HStr(MissionArr[i]);
SendToServer;
end;
Mission1:=True;
end;

Procedure BuyItems;
begin
buf:=HStr('9C 57 5B 61 00 00 00 02 00 01 00 0A 00 00 00 00 00 00 00');
SendToServer;
buf:=HStr('A1 57 5E 61 00 00 00 0D 00 04 00 D9 D6 18 0A 60 00 00 00 00 00 00 00 DC D6 18 0A 10 00 00 00 00 00 00 00 D3 D6 18 0A 30 00 00 00 00 00 00 00 D6 D6 18 0A 66 00 00 00 00 00 00 00');
SendToServer;
End;

Procedure EndMission;
Begin
//пока в разработке ибо не требуется сдача
end;

procedure Free; //Вызывается при выключении скрипта
begin
Timer01.free;
Timer02.free;
start:=false;
end;


begin
//IF FromServer and (pck[1]=#$1A) then a:=1;
//if FromServer and (pck[1]=#$16) and (a=1) or start then
if FromServer and (pck[1]=#$17) then //Жду личного сообщения пакет типа 17 DD PP XX ZZ и т.д...
begin
if mission1=true then
begin
Timer02.enabled:=true;
j:=j+1;
if j=16 then
begin
mission1:=false;
j:=1;
end;
end
a:=0;
start:=false;
if (mission1=false) then
begin
//EndMission;
i:=0;
j:=1;
a:=0;
TakeMission;
BuyItems;
start:=true;
end;
end
else a:=0;
end.



Вот собственно такой скрипт.
Цель скрипта брать ЗАКАЗ покупать необходимое для изготовления и изготавливать, а затем сдавать.

В алгоритме скрипта думаю Вам копаться не стоит у меня в следующем проблема:
1. Скрипт сейчас должен запускаться от личного сообщения
"if FromServer and (pck[1]=#$17) then ..." но не запускается не пойму почему пакет 17 приходит

2. Цель чтобы скрипт работал циклически там
"//IF FromServer and (pck[1]=#$1A) then a:=1;
//if FromServer and (pck[1]=#$16) and (a=1) or start then ..." заготовка под цикл как ни странно работает суть ее в том что надо поймать два пакет разного типа идущие друг за другом (эти пакеты означают что производство завершено)

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

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

5. есть еще маленькая проблема с логами я хотел себе в дальнейшем писать сообщения в личку игрового чата (это уже для других скриптов но и тут было бы полезно), но суть в том что там кодируются буквы а ничего нормально для самостоятельной кодировки средствами скрипта я не нашел если кто в курсе как закодировать слова в сообщения буду признателен (с примером отсылки Hello с вкладки дополнительно не разобрался)

J-Fobos
16.02.2011, 21:43
Я в аион не играю, но попробую помочь.

1. Похоже что при запуске скрипта mission1=false и поэтому не запускается таймер.

2. Зачем ловить 2 пакета, нельзя обойтись одним?

3. Не понятно где это место, в пакетах аиона не разбираюсь, а коментов в скрипте нету :) Скорее всего отсылается либо пустой, либо не верный пакет.

4. Задержки рекомендуется делать только через таймер.

5. По идее вам поможет команда ReadS / WriteS

TEHb
17.02.2011, 22:13
Я в аион не играю, но попробую помочь.

1. Похоже что при запуске скрипта mission1=false и поэтому не запускается таймер.

2. Зачем ловить 2 пакета, нельзя обойтись одним?

3. Не понятно где это место, в пакетах аиона не разбираюсь, а коментов в скрипте нету :) Скорее всего отсылается либо пустой, либо не верный пакет.

4. Задержки рекомендуется делать только через таймер.

5. По идее вам поможет команда ReadS / WriteS

Спасибо за внимание я много постов прочитал видел что ты реально помогаешь, я сам не дуб знаю делфи на уровне выше среднего, но вот с сетевыми приложениями а особенно с пакетами не работал до этого.

1. С таймером я разобрался там неверно функция посмотри я евент случайно скопировал от первого таймера.
2. 2 пакета обязон или придется из первого пакета читать 4 байта которые при каждом подключении разные, но постоянны для текущего подключения (пакеты у меня всегда приходят одинаково друг за другом поэтому я заморочился с ловлей двух пакетов)

5. С командами прочитать строку и записать строку не разобрался ибо не могу вывести в лог собственно результат
не смог создать и подключить файл например функции АssignFile не работают и вообще не смог создать переменную типа file или TextFile видимо тут они не работают идея была писать лог на жесткий диск а потом его почитать

Добавлено через 11 минут
и Вот проблема пункта 3
procedure OnTimer02(Sender: TObject);
begin
buf:='C9 57 66 00 ';
SendToServer;
buf:='B5 57 72 52 01 00 00 00 ';
SendToServer;
buf:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 18 00 00 00 00 00 00 00 49 87 DD 0A 18 00 00 00 00 00 00 00 D3 D6 18 0A 99 01 00 00 00 00 00 00 DC D6 18 0A 78 00 00 00 00 00 00 00 D9 D6 18 0A 18 03 00 00 00 00 00 00';
SendToServer;
Timer02.Enabled:=false;
end;

Вот 3 пакета при которых происходит отсоединения от сервера
С9 - Выполнить действие объект
В5 - сам объект (цель)
Е3 - действие с объектом в частности пакет производства какой-то там байды содержит id всех итемов покупаемых в магазе для производства и квестовых
Если послать пакеты просто дург за другом через обычную посылку все пашет норм а в скрипте ну никак не получается сразу дисконнект

ЗЫ: Обнаружил что при разных соединениях иногда пакет Е3 меняется с течением времени а иногда нет не понятно от чего это зависит т.е. в пакете меняется только число в 4 байта остальные неизменны ну может и больше 4 байт долго не наблюдал. Предположил что это время сервера или коиента, но не смог найти статью как вычислить время в пакете а она мне точно попадалась.

J-Fobos
17.02.2011, 22:50
Что-то очень закрученный скрипт получился. Интуитивно чувствую что можно все организовать проще, одним таймером. Может отбросим его и попробуем написать новый?

TEHb
18.02.2011, 09:48
Что-то очень закрученный скрипт получился. Интуитивно чувствую что можно все организовать проще, одним таймером. Может отбросим его и попробуем написать новый?

Ты абсолютно прав там вообще все неверно я вчера с работы уставший был не обмозговал все
надеюсь ты там не пытался разобраться ща переделаю пункт 4 остальные вопросы актуальны и теперь постараюсь как можно короче писать думаю многим лень читать большие посты

Nickers
18.02.2011, 09:50
TEHb, В саму суть еще не вникал, но крайне не советую так делать:

procedure OnTimer02(Sender: TObject);
begin
buf:='C9 57 66 00 ';
SendToServer;
buf:='B5 57 72 52 01 00 00 00 ';
SendToServer;
buf:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 18 00 00 00 00 00 00 00 49 87 DD 0A 18 00 00 00 00 00 00 00 D3 D6 18 0A 99 01 00 00 00 00 00 00 DC D6 18 0A 78 00 00 00 00 00 00 00 D9 D6 18 0A 18 03 00 00 00 00 00 00';
SendToServer;
Timer02.Enabled:=false;
end;
В плане отсылки пакетов... Т.к. там могут быть элементы (В пакетах) подвижные, которые меняются в разных ситуациях... (Нада посмотреть разборку пакетов под Айон) Если есть ОИДы их требуется выводить в Const (Чтоб менять если что) Если есть координаты цели нужны запоминалки разные))

J-Fobos, Да тож хотелось бы сначала начать, а то на глаз тяжко разбираться...

Добавлено через 56 секунд
Прикрепите кто-нить PacketsAion.ini

TEHb
18.02.2011, 10:24
Итак насчет таймера и перезапуск его 5 раз для примера
Мой вариант, если кто подскажет проще оч. буду признателен.

CONST N:=5 //Сколько раз посылать
var i:integer;
SendBufArr:Array[0..N] of string; //Массив пакетов для отсылки

Procedure init;
Begin
i:=0; //инициализация нач значения счетчика
SendBuffArr[0]:='C9...';
//не буду вдаваться в подробности заполнения массива пакетами для посылки друг за другом
SendBuffArr[N]:='1А...';
End;
//Создание самого таймера я пропустил, ибо не требуется для примера.
Procedure OnTimer;
Begin
buf:=HStr(SendBuffArr);
SendToServer;
i:=i+1;
if i=5 then Timer01.enabled:=false;
end;

//Ну и тело скрипта
BEGIN
if FromServer and (pck[1]=#$17) then Timer01.enabled:=True;
END.

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

Добавлено через 12 минут
TEHb, В саму суть еще не вникал, но крайне не советую так делать:

В плане отсылки пакетов... Т.к. там могут быть элементы (В пакетах) подвижные, которые меняются в разных ситуациях... (Нада посмотреть разборку пакетов под Айон) Если есть ОИДы их требуется выводить в Const (Чтоб менять если что) Если есть координаты цели нужны запоминалки разные))

J-Fobos, Да тож хотелось бы сначала начать, а то на глаз тяжко разбираться...

[I]Добавлено через 56 секунд
Прикрепите кто-нить PacketsAion.ini


Вот 3 пакета при которых происходит отсоединения от сервера
С9 - Выполнить действие объект
В5 - сам объект (цель)
Е3 - действие с объектом в частности пакет производства какой-то там байды содержит id всех итемов покупаемых в магазе для производства и квестовых
Если послать пакеты просто дург за другом через обычную посылку все пашет норм а в скрипте ну никак не получается сразу дисконнект

ЗЫ: Обнаружил что при разных соединениях иногда пакет Е3 меняется с течением времени а иногда нет не понятно от чего это зависит т.е. в пакете меняется только число в 4 байта остальные неизменны ну может и больше 4 байт долго не наблюдал. Предположил что это время сервера или коиента, но не смог найти статью как вычислить время в пакете а она мне точно попадалась.

Вот вся проблема пакеты E3 какие то странные но при посылке через обычную отсылку работают (мое предположение все дело в задержке
так как после производства 1 вещи чар какое-то время машет руками типа радуется но это всего лишь анимация но кнопка изготовить недоступна в это время, так что возможно меня кикает за спам пакетами или выполнение невозможного действия.

Если решу через задержку с таймером обязательно отпишусь, но чуть позже пока нет времени реализовывать.

Nickers
18.02.2011, 11:08
TEHb, Вот так:
inc(i);
if i=5 then
begin
Timer01.enabled:=false;
i:=0;
end;
end;
А лучше весь IF вывести из процедуры в тело скрипта...
(Или никуя не лучше)

В общем суть в том чтобы через счетчик не обнуляя его послать пять пакетов. По задумке таймер не выключается и снова сработает через таймер-интервал пока не получиться 5 раз после чего таймер отключиться.
Все верно, так и нада...

Дай ка расшифровку твоего пакета E3 через ПХ...
Хочу глянуть)

так как после производства 1 вещи чар какое-то время машет руками типа радуется но это всего лишь анимация но кнопка изготовить недоступна в это время, так что возможно меня кикает за спам пакетами или выполнение невозможного действия.
Да, возможно эт такая задержка от спама... И возможно в этом проблема...

TEHb
18.02.2011, 12:00
TEHb

Дай ка расшифровку твоего пакета E3 через ПХ...
Хочу глянуть)


Да, возможно эт такая задержка от спама... И возможно в этом проблема...

ПХ не расшифровывает там в первом посте пакет Е3 выложен полностью
в ПХ пишется UncnownE3 собственно я в нем разобрался там большая часть пакета это itemsID для производства мне только несколько байт не понятны сейчас выкладывать некогда позже попробую расписать
хотя это уже другая тема скорее всего будет

NLObP
18.02.2011, 12:30
Прикрепите кто-нить PacketsAion.ini

К сожалению его надо пополнять. Вот что есть на сейчас:
//для L2PacketHack 3.4.1+
// by (c) xkor
//AION
//
[client]


[server]
43=ObjectUpdate:h(id2)d(ObjectId)h(Level)d(MaxHP)d (CurHP)
//41=KeyInit:h(id2)d(Key)
E7=Drop:h(id2)d(NpcObjectId)b(LootWnd?)
26=NPCInfo:h(id2)n(x)n(y)n(z)d(npcObjID)d(npcID)d( npcID)c(NpcType)ccc(Heading)d(NameId)d(TitleId)ddd cc(HP%)dc(lvl)
18=CharInfo:h(id2)n(x)n(y)n(z)d(charObjID)d(raceSe x)d(raceSex)-(14)c(Heading)s(Name)-(7)d(Clan Id)-(6)s(Clan name)c(HP%)ccc
2B=Gather:h(id2)n(x)n(y)n(z)d(ObjID)-(4)d(typeID)-(3)d(nameId)
6B=Select?:h(id2)d(ObjID)d(targObjID)
1A=Sbor?:h(id2)d(charObjID)d(gatherObjID)-(2)c(num)

Давайте дополним его.

Добавлено через 1 минуту
в ПХ пишется UncnownE3 собственно я в нем разобрался там большая часть пакета это itemsID для производства мне только несколько байт не понятны сейчас выкладывать некогда позже попробую расписать

Напиши расшифровку и я добавлю его в packetsAion.ini

TEHb
18.02.2011, 17:05
Собственно вот и сам разбор пакета E3 от меня любимого потом надо будет продублировать наверное в разделе пакеты

итак имеем

E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 30 00 00 00 00 00 00 00 49 87 DD 0A 30 00 00 00 00 00 00 00 D3 D6 18 0A 10 00 00 00 00 00 00 00 DC D6 18 0A 10 00 00 00 00 00 00 00 D9 D6 18 0A 30 00 00 00 00 00 00 00

E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 54 01 00 00 05 00 6A 86 DD 0A 27 00 00 00 00 00 00 00 49 87 DD 0A 27 00 00 00 00 00 00 00 D3 D6 18 0A 10 00 00 00 00 00 00 00 DC D6 18 0A 10 00 00 00 00 00 00 00 D9 D6 18 0A 30 00 00 00 00 00 00 00


E3 57 80 80 8B D1 F0 08 - эта часть у всех пакетов всегда одинакова, так что ее расшифровать мне никак (не проверял с другими чарами)
7B 2C 3D 09 54 01 00 00 - это я так понимаю что производиться реально меняется только один байт (7В на 7С или 7D зависит от того что делаю какой заказ)
05 00 - количество расходуемых ресурсов для производства
6A 86 DD 0A - 1 ресурс в моем случае квест предмет "запечатан адамантитовый стержень")
30 00 00 00 00 00 00 00 количество 1 ресурса в рюкзаке на момент старта производства (думаю используется только число в 4 байта зачем остальные 4 которые 00 понятия не имею огромного количества ресурсов не покупал)
49 87 DD 0A - 2 ресурс квест-итем "Большая адамантитовая пластина"
30 00 00 00 00 00 00 00 количество 2 ресурса в рюкзаке
D3 D6 18 0A - 3 ресурс Цирконевый порошок
10 00 00 00 00 00 00 00 - количество 3 ресурса
DC D6 18 0A - 4 ресурс Ададмантитовый провод
10 00 00 00 00 00 00 00 -количество 4 ресурса
D9 D6 18 0A - 5 ресурс Смазка
30 00 00 00 00 00 00 00 - количество 5 ресурса

Собственно в окне производства 2 кнопки для старта
изготовить все
изготовить указанное католичество
так и два пакета Е3 которые я выложил они полностью одинаковы что изготовить все что изготовить только 1.
Есть мысль что клиент шлет еще какую то информацию через другие пакеты которые я не отслеживаю например пакет 44 он идет слишком часто и разного размера

Nickers
18.02.2011, 22:33
Не пойму тут ведь по 4 байта нада брать? Или в Айон по другому?
По идее если тут одни числа в Dword, то они пачками идут
E3(ид) 57 80 80 8B(аццкое число) и т.д....

Так а на какое действие это пакет? (Подробненько)
И какие там еще пакеты меняющиеся отправлять нада?

А то скрипт без этого не написать)) Я прост сам в Айон не играю))

TEHb
18.02.2011, 22:54
Не пойму тут ведь по 4 байта нада брать? Или в Айон по другому?
По идее если тут одни числа в Dword, то они пачками идут
E3(ид) 57 80 80 8B(аццкое число) и т.д....

Так а на какое действие это пакет? (Подробненько)
И какие там еще пакеты меняющиеся отправлять нада?

А то скрипт без этого не написать)) Я прост сам в Айон не играю))

Короче этот пакет производит заказ этот квест можно брать, потенциально, бесконечно.
Суть в том что пакет Е3 запускает производство квестового предмета, который в конце сдается

все, что меняется это количество оставшихся итемов в рюкзаке при посылке, но можно и не менять все равно работает, если слать самый первый пакет постоянно.
Работает, если обычной посылкой послать, а в скрипте дисконнект.

Добавлено через 2 минуты
если с задержками производство получиться перейду к написанию взятия и сдачи квеста они и так работали, по крайней мере, взятие и покупка итемов

J-Fobos
19.02.2011, 00:23
Попробую подвести итог.
Нам надо написать скрипт, которой автоматизирует следующие действия:
1) Произвести некоторое количество итемов (пакетом Е3)
2) Сдать произведенные итемы
3) При нехватке итемов покупать их

Все правильно?

TEHb
19.02.2011, 10:26
Попробую подвести итог.
Нам надо написать скрипт, которой автоматизирует следующие действия:
1) Произвести некоторое количество итемов (пакетом Е3)
2) Сдать произведенные итемы
3) При нехватке итемов покупать их

Все правильно?

Нет, что касается алгоритма, то он следующий:
1. Взять задание (у меня записаны 3 пакета)
2. купить необходимое число итемов для производства (2 пакета)
3. Произвести квест итемы (пакет Е3 можно С9 В5 Е3 первые два выбирают станок производства в цель)
4. Сдать задание
ну и дальше по кругу.

Собственно я с производством уже справился, но на моем сервере уже появился фикс - нельзя брать задания далеко от персонажа,
сразу тюрьма.
Так что теперь, мой скрипт сильно усложниться, но я думаю дальше справлюсь. Спасибо всем за помощь думаю тему можно закрыть.

К стати, а почему нельзя использовать DELAY(1000)? Где об этом можно прочесть?

ЗЫ: Я выложу получившийся скрипт чуть позже, если кому надо.

Nickers
19.02.2011, 11:34
Нуууу вооот)) Ну скритпег легкий сам по себе...
Делэй вроде фризит клиент, если не ошибаюсь... Лучше таймеры)
Удачи.

//J-Fobos: Правильно, DELAY создает задержку для всего трафика, когда задействован DELAY никакие пакеты не проходят.

J-Fobos
19.02.2011, 12:53
Создаем таймер, начальное значение TimerCyrcle задаем 1, доделываем код и вставляем его в событие таймера.
case TimerCyrcle of

1: Begin
buf:=HStr('00 00 00 00 00 00'); //первый пакет на задание
SendToServerEx(name);
end;

2: Begin
buf:=#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00; //второй пакет на задание (для примера пишу в таком виде)
SendToServerEx(name);
end

3: Begin
buf:=HStr('00 00 00 00 00 00'); //третий пакет на задание
SendToServerEx(name);
end;

4: Begin
buf:=HStr('00 00 00 00 00 00'); //покупаем итемы 1-й пакет
SendToServerEx(name);
end;

5: Begin
buf:=HStr('00 00 00 00 00 00'); //покупаем итемы 2-й пакет
SendToServerEx(name);
end;

6..9: Begin
buf:=HStr('00 00 00 00 00 00'); //пару раз отсылаем пакет на производство
SendToServerEx(name);
end;

//ну и так далее, думаю суть понятна)

else begin
TimerCyrcle:=0;
end;
end;
Inc(TimerCyrcle2);
end;

TEHb
20.02.2011, 11:10
В общем с case ... of идея ясна и спасибо я уже сказал

а delаy на маленьких задержках (соизмеримых с ПИНГом) я думаю можно использовать, именно так мой скрипт первый раз заработал.
и к стати фриз действительно есть, но меня он не напрягает ибо мне пофиг так как я в это время ни чего не делаю.

Теперь у меня мелькнула идея написать скрипт который будет записывать все пакеты(определенного типа) по очереди по команде из чата

микро обучаемый пакетный БОТ так сказать. Единственная проблема на текущий момент это как засечь время между приходами пакетов.
Алгоритм такой:

1. Ждем с чата команду (например когда я напишу 1)
2. Если пакет от сервера или клиента соответствует необходимому типу
записать его в массив действий (и тут то как раз необходимо запомнить время прихода пакета)
3. и так далее пока не появиться в чате другая команда означающая окончание записи пакетов

4. если пришла третья команда из чата запустить выполнение всех записанных команд по очереди с их же интервалами и плюс небольшой 10% запас, и все это бесконечно

ЗЫ: Думаю я тут не оригинал но так можно записать выполнение тьма квестов. Есть конечно еще одна маленькая проблемка это, то что я не нашел способа сохранять логи на жесткий диск и вообще не смог работать с файлами. Думаю эту проблему поможет решить DLL с функциями работы с файлами.

Если я решу писать такой скрипт мне отдельную ветку создавать?

Ну и еще насчет отсчета времени собственно решение, я думаю, что нашел
создаю таймер устанавливаю интервал 1 (лучше 10 ибо точность особо не важна и меньше я думаю лагать будет) в теле таймера inc(i), ну и по приходу считываю эту самую i и обнуляю

только вот может таймер и сам считает время(я практически в этом уверен) нужно лишь считать некую переменную, структуру класса не помню. ((((

TEHb
20.02.2011, 12:06
Вот и сам скрипт как я и обещал только чейчас он уже не работает там где стоит фикс (нельзя брать задания стоя далеко от NPC) таким образом его придется модифицировать чтобы чар бегал брал задания рядом с NPC мне с этим лень было заморачиваться может моя новая идея все упростит.

var i,j,k,a:integer;
start,mission1,work:boolean;
MissionArr:Array [0..3] of string;
SendBufArr:Array [0..16] of string;
procedure Init; //Вызывается при включении скрипта
begin
i:=0; j:=1; a:=0; k:=0;
start:=false;
Mission1:=false;
work:=false;
//Заполнение пакетов производства для гладиатора урв мастерства для заказа 260 минимум
SendBufArr[0]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 30 00 00 00 00 00 00 00 49 87 DD 0A 30 00 00 00 00 00 00 00 D3 D6 18 0A 10 00 00 00 00 00 00 00 DC D6 18 0A 10 00 00 00 00 00 00 00 D9 D6 18 0A 30 00 00 00 00 00 00 00 ';
SendBufArr[1]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 2D 00 00 00 00 00 00 00 49 87 DD 0A 2D 00 00 00 00 00 00 00 D3 D6 18 0A 0F 00 00 00 00 00 00 00 DC D6 18 0A 0F 00 00 00 00 00 00 00 D9 D6 18 0A 2D 00 00 00 00 00 00 00 ';
SendBufArr[2]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 2A 00 00 00 00 00 00 00 49 87 DD 0A 2A 00 00 00 00 00 00 00 D3 D6 18 0A 0E 00 00 00 00 00 00 00 DC D6 18 0A 0E 00 00 00 00 00 00 00 D9 D6 18 0A 2A 00 00 00 00 00 00 00 ';
SendBufArr[3]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 27 00 00 00 00 00 00 00 49 87 DD 0A 27 00 00 00 00 00 00 00 D3 D6 18 0A 0D 00 00 00 00 00 00 00 DC D6 18 0A 0D 00 00 00 00 00 00 00 D9 D6 18 0A 27 00 00 00 00 00 00 00 ';
SendBufArr[4]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 24 00 00 00 00 00 00 00 49 87 DD 0A 24 00 00 00 00 00 00 00 D3 D6 18 0A 0C 00 00 00 00 00 00 00 DC D6 18 0A 0C 00 00 00 00 00 00 00 D9 D6 18 0A 24 00 00 00 00 00 00 00 ';
SendBufArr[5]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 21 00 00 00 00 00 00 00 49 87 DD 0A 21 00 00 00 00 00 00 00 D3 D6 18 0A 0B 00 00 00 00 00 00 00 DC D6 18 0A 0B 00 00 00 00 00 00 00 D9 D6 18 0A 21 00 00 00 00 00 00 00 ';
SendBufArr[6]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 1E 00 00 00 00 00 00 00 49 87 DD 0A 1E 00 00 00 00 00 00 00 D3 D6 18 0A 0A 00 00 00 00 00 00 00 DC D6 18 0A 0A 00 00 00 00 00 00 00 D9 D6 18 0A 1E 00 00 00 00 00 00 00 ';
SendBufArr[7]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 1B 00 00 00 00 00 00 00 49 87 DD 0A 1B 00 00 00 00 00 00 00 D3 D6 18 0A 09 00 00 00 00 00 00 00 DC D6 18 0A 09 00 00 00 00 00 00 00 D9 D6 18 0A 1B 00 00 00 00 00 00 00 ';
SendBufArr[8]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 18 00 00 00 00 00 00 00 49 87 DD 0A 18 00 00 00 00 00 00 00 D3 D6 18 0A 08 00 00 00 00 00 00 00 DC D6 18 0A 08 00 00 00 00 00 00 00 D9 D6 18 0A 18 00 00 00 00 00 00 00 ';
SendBufArr[9]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 15 00 00 00 00 00 00 00 49 87 DD 0A 15 00 00 00 00 00 00 00 D3 D6 18 0A 07 00 00 00 00 00 00 00 DC D6 18 0A 07 00 00 00 00 00 00 00 D9 D6 18 0A 15 00 00 00 00 00 00 00 ';
SendBufArr[10]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 12 00 00 00 00 00 00 00 49 87 DD 0A 12 00 00 00 00 00 00 00 D3 D6 18 0A 06 00 00 00 00 00 00 00 DC D6 18 0A 06 00 00 00 00 00 00 00 D9 D6 18 0A 12 00 00 00 00 00 00 00 ';
SendBufArr[11]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 0F 00 00 00 00 00 00 00 49 87 DD 0A 0F 00 00 00 00 00 00 00 D3 D6 18 0A 05 00 00 00 00 00 00 00 DC D6 18 0A 05 00 00 00 00 00 00 00 D9 D6 18 0A 0F 00 00 00 00 00 00 00 ';
SendBufArr[12]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 0C 00 00 00 00 00 00 00 49 87 DD 0A 0C 00 00 00 00 00 00 00 D3 D6 18 0A 04 00 00 00 00 00 00 00 DC D6 18 0A 04 00 00 00 00 00 00 00 D9 D6 18 0A 0C 00 00 00 00 00 00 00 ';
SendBufArr[13]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 09 00 00 00 00 00 00 00 49 87 DD 0A 09 00 00 00 00 00 00 00 D3 D6 18 0A 03 00 00 00 00 00 00 00 DC D6 18 0A 03 00 00 00 00 00 00 00 D9 D6 18 0A 09 00 00 00 00 00 00 00 ';
SendBufArr[14]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 06 00 00 00 00 00 00 00 49 87 DD 0A 06 00 00 00 00 00 00 00 D3 D6 18 0A 02 00 00 00 00 00 00 00 DC D6 18 0A 02 00 00 00 00 00 00 00 D9 D6 18 0A 06 00 00 00 00 00 00 00 ';
SendBufArr[15]:='E3 57 80 80 8B D1 F0 08 7B 2C 3D 09 59 01 00 00 05 00 6A 86 DD 0A 03 00 00 00 00 00 00 00 49 87 DD 0A 03 00 00 00 00 00 00 00 D3 D6 18 0A 01 00 00 00 00 00 00 00 DC D6 18 0A 01 00 00 00 00 00 00 00 D9 D6 18 0A 03 00 00 00 00 00 00 00 ';
end;

TEHb
20.02.2011, 12:07
Procedure TakeMission;
begin
MissionArr[0]:='9C 57 5B 63 00 00 00 34 00 01 00 0A 00 00 00 00 00 00 00 ';
MissionArr[1]:='9C 57 5B 63 00 00 00 19 00 01 00 1C 00 A2 13 00 00 00 00 ';
MissionArr[2]:='9C 57 5B 63 00 00 00 EA 03 01 00 04 00 A2 13 00 00 00 00 ';
For i:=0 to 2 do
begin
buf:=HStr('C9 57 66 00');
SendToServer;
buf:=HStr('B5 57 72 59 01 00 00 00');
SendToServer;
buf:=HStr(MissionArr[i]);
SendToServer;
end;
Mission1:=True;
end;
Procedure BuyItems;
begin
buf:=HStr('9C 57 5B 64 00 00 00 02 00 01 00 0A 00 00 00 00 00 00 00 ');
SendToServer;
buf:=HStr('A1 57 5E 64 00 00 00 0D 00 03 00 D3 D6 18 0A 10 00 00 00 00 00 00 00 DC D6 18 0A 10 00 00 00 00 00 00 00 D9 D6 18 0A 30 00 00 00 00 00 00 00 ');
SendToServer;
End;
Procedure EndMission;
Begin
buf:=HStr('9C 57 5B 63 00 00 00 34 00 01 00 0A 00 00 00 00 00 00 00');
SendToServer;
buf:=HStr('9C 57 5B 63 00 00 00 19 00 01 00 1C 00 A2 13 00 00 00 00');
SendToServer;
buf:=HStr('9C 57 5B 63 00 00 00 11 00 01 00 05 00 A2 13 00 00 00 00');
SendToServer;
Mission1:=false;
end;
procedure Free; //Вызывается при выключении скрипта
begin
start:=false;
end;
begin
if FromClient and (pck[1]=#$B9) then
begin
start:=true; //запуск от любого сообщения в чат
if not(work) then work:=true else work:=false; //запуск и остановка работы тела скрипта (сам скрипт не выклбчает)
end;
if FromServer and (pck[1]=#$16) then a:=a+1 else a:=0; //можно inc(a) я не пробовал привык делфи 7
//если пакет не 16, то сбросить а так как мы ждем три пакета подряд все сработает
if FromServer and (pck[1]=#$16) and (a=3) and (work) or start then //собственно старт работы после трех пакетов или по флагу start
begin
start:=false;
if mission1=false then
begin
TakeMission;
BuyItems;
end;
buf:=HStr('C9 57 66 00'); //пакет нажатия
SendToServer;
buf:=HStr('B5 57 72 56 02 00 00 00'); //цель нажатия
delay(800); //задержка так делать нельзя но у меня работает
buf:=HStr(SendBufArr[i]); //Собственно посылка производства поочередная так как пакеты постоянно меняются по количесту оставшихся вещей я просто и записал все (16 шт.)
SendToServer;
i:=i+1;
if i=16 then
EndMission;
i:=0;
a:=0;
start:=true;
end;
end.

J-Fobos
20.02.2011, 15:07
В пх есть функции работы с временем. В окне редактирования скриптов нажмите на кнопочку <i> (FastScript Classes). В окне что откроется зайдите в раздел Function -> Date/Time.
При приходе пакета запоминаете в переменной время его прихода, при приходе следующего пакета снова смотрите время и считаете разницу, вот будет и интервал. :)

TEHb
21.02.2011, 00:21
Я так и думал что должны быть средства для работы со временем и снова спс. Собственно попробую наваять скрипт чуть позже. Никто не написал выкладывать в новую тему или тут обсуждать?

и еще я так понял, что предложение фобоса представляет собой запоминать и считать системное время моего компа между приходами пакетов, а что если сделать как я предложил считать таймером? лишняя нагрузка?

J-Fobos
21.02.2011, 02:51
Можно и в этой теме продолжать, всеравно уже начали :) Насчет определения времени таймером - мне кажется это будет сложнее в реализации.

TEHb
21.02.2011, 23:52
Суть проблемы следующая когда таймер активируется счетчик i увеличивается а пакеты не отсылаются
var Timer01:TTimer;
i:integer;
procedure Init; //Вызывается при включении скрипта
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@Ontimer01;
Timer01.Interval:=5000;
Timer01.enabled:=false;
i:=0;
end;

procedure Free; //Вызывается при выключении скрипта
begin
Timer01.free;
end;

Procedure OnTimer01(Sender: TObject);
begin
buf:=HStr('17 54 D4 04 01 80 1D 26 00 1C 04 35 04 47 04 3D 04 38 04 3A 04 00 00 ');
WriteS('Таймер сработал');
SendToClient;
inc(i);
if i=10 then Timer01.Enabled:=false;
end;

begin
if FromClient and (pck[1]=#$B2) then
begin
Timer01.enabled:=true;
buf:=HStr('17 54 D4 04 01 80 1D 26 00 1C 04 35 04 47 04 3D 04 38 04 3A 04 00 00 ');
WriteS('Тест');
SendToClient;
i:=0;
end;
end.

т.е. сообщение "тест" приходит в чат а сообщение "таймер сработал" нет

хотя счетчик i увеличивается вижу через watchlist притом он увеличивается до 10 и останавливается
слкдовательно процедура Ontimer01 срабатывает почему не шлются пакеты?

J-Fobos
22.02.2011, 00:08
Я уже много раз писал, что надо использовать SendToClientEx, я понимаю что SendToClient проще, но надо SendToClientEx.

TEHb
22.02.2011, 08:56
Я уже много раз писал, что надо использовать SendToClientEx, я понимаю что SendToClient проще, но надо SendToClientEx.

Допустим, что надо, почему ж первый раз отсылается без проблем?

Да и не разобрался с этим SendToClientEx

Вот к примеру в описании написано:
SendToClientEx(CharName: string) - отправляет клиенту с именем CharName содержимое переменной buf (v. 3.1.3+)

т.е имя моего чара в игре, допустим, "Бульдозер", то писать надо
SendToClientEx('Бульдозер'); Только вот когда я начал писать скрипты эта фишка не сработала вот я и больше ее никогда не писал так как и простая посылка работала. Сейчас исправлю и отпишусь позже получилось или нет. Не забываем что обсуждаем AION.

Добавлено через 13 минут
Вот и нашлось решение просто имя моего чара нифига не работало
так как скорее всего из-за того, что я назвал его по русски
Решение такое :

setName('Buldozer');

ну и собственно

SendToClientEx('Buldozer');

Дело в том что плохо описано, что CharName = ConnectionName

Добавлено через 19 минут
Сразу спрошу еще я думаю разберусь, но вдруг кто поможет раньше

Итак имеем от сервера pck он типа string, но как я понимаю строка
выглядит так:
pck=#$17#$23#$54 и. т. д.

Могу я выполнить такую операцию:
var s:string;
procedure test;
begin
s:=pck;
buf:=s;
//или
buf:=pck;
//и если я ошибаюсь, то надо так
s:=pck;
buf:=HStr(s);
//или
buf:=HStr(pck);
end;

J-Fobos
22.02.2011, 14:41
procedure SendToClient
Отправляет buf в направлении клиента. действует для текущего обрабатываемого соединения
Это значит в главном блоке скрипта все будет нормально, так как главный блок выполняется когда приходит какой-то пакет, а вот в таймере пакеты отправленные SendToClient пойдут неизвестно куда :)

Насчет строки:
s:=pck;
buf:=s;
//или
buf:=pck;
Так правильно, а buf:=HStr(pck); не правильно :)

TEHb
22.02.2011, 23:51
Собственно с обучаемым ботом у меня пока ничего не получается
ибо на АЙОН не могу с помощью пакетов заставить бегать моего чара
точно знаю что за клик куда бежать отвечает пакет 9Е, но при записи
этого пакета а потом если отойти и послать этот пакет чар не бежит
кто разбирал пакет 9Е по АЙОН подскажите его структуру я сам не смог
его разложить. Возможно в этом пакете передаются не только координаты
куда бежать, но и откуда, да еще и азимут

NLObP
14.03.2011, 18:09
TEHb, выложи плиз лог пакетов от Aion начиная со входа и какие нибудь действия (походить, покрафтить, бросить, поднять, и .т.д). Мне нужно проверить правильность сделаной packetAion.ini Сами пакеты я взял из PacketSamurai.

Nickers
14.03.2011, 18:31
Конечно же в безлюдном месте и без мобов)))

По делу:
Мб эт не тот пакет все таки? Прост все пакеты от клиента,что приходят, когда тыкаешь идти, кинь сюда...
Хочу по разбирать)) Думаю аналогия с Ла2 существенна...
(Призываю всех кто в Айоне с ПХ бегает) (Мб уже самому скачать :D)

Чтоб упростить мине жизнь прошу кинуть серв с рабочим ПХ и название версии Айона под этот серв...
А то я нуб и гугл для меня АД... (Я ток всем советовать его могу)

NLObP
14.03.2011, 19:25
Мб уже самому скачать

У меня ноут не потянет Айон и места нет и слабый слишком, а сын на своём компе не дает попробовать.

Nickers
15.03.2011, 08:36
Значит мне нада попробывать... Эхх влом какта...

Добавлено через 2 минуты
У меня вопрос к знающим... Там пх норм робят или сразу разработали защиту и у мну геморой вырастит?

dyh9l
15.03.2011, 11:09
У меня ноут не потянет Айон и места нет и слабый слишком, а сын на своём компе не дает попробовать.
Сын радостный наверное, такого кодера в отцах иметь ^_^
Я был бы счастлив)