PDA

Просмотр полной версии : L2PacketHack и Abys


Camellot
09.04.2009, 23:20
Привет! Помогите пожалуйста разобраться....Дело в том что я впервые сталкиваюсь с этой прогой......Посоветуйте версию , которую можно будет юзать на Abys ......Клиент уже Грация ( или скудное подобие)
Спасибо

alexteam
10.04.2009, 00:14
любая версия которая поддерживает грацию (есть соответствующие чекбоксы/радиобатоны в настройках).

Добавлено через 7 минут
кстати. именно на абисе нужно учесть следующий факт:
CoderX.NLObP (23:06:11 7/04/2009)
прикол! на абиссе клиентские пакеты - от грации, серверные - от интерлюдии, имя чара не определяет
CoderX.NLObP (23:09:40 7/04/2009)
если оставить настройки как для интерлюдии. то имя чара определяет, вот намутили =)

Camellot
10.04.2009, 00:20
про этот прикол я уже понял......пробывал по разному настройки.....когда заходил.Вот только не могу понять как юзать её((( меня интересует манор прежде всего.Может тут уже есть какое ни будь описалово по этому поводу? Киньте ссылку если не сложно
Спасибо

alexteam
10.04.2009, 00:30
абисс отдельная тема. там отди настройки должны быть для клиент-сервер, и совсем другие для сервер-клиент.
а это не поддерживается пх.

Sashafaq
10.04.2009, 00:31
я бы посоветовал почитать настройку пнх и когда настроишь и зайдешь во время манора можно воспользоваться скриптом , но посоветую просто когда идет время манора ( обычно 20.00-20.05:52)
1.выбираешь что куда сдавать
2.жмешь сдать(тебе напишется что еще нельзя сдавать)
3.ищешь этот пакет в логе и добавляешь его в посылку
4. советую не больше 4х гдето таких пакетов
5.выбираешь количество мили секунд ну это уже по серверу смотри чтобы тебя не выкинуло сразу как только начнешь отправлять быстро пакеты(поэксперементируй до манора через сколько сек тебя выкинет)
6.ну как выбрал через сколько милисек отправлять ждешь времени около 5.50 или чуть раньше и ставишь галочку отправлять пакеты

Camellot
10.04.2009, 01:29
прикольно....спасибо...буду пробывать
Вопрос ещё такого плна.....А если много человек юзают хп при сдаче манора.....сдача происходит рандомно у кого то одного?(При условии что сдаются одни и те же семена , одному и тому же нпс)

Sashafaq
10.04.2009, 01:33
не совсем рендомно а как дойдет серверу и он это обработает те нужен хороший канал инетабез лагов и минимальный пинг к серверу

Добавлено через 53 секунды
и жмякаем спасибки если помог (от вас не убудет , а мне приятно) :D

xkor
10.04.2009, 03:04
эх, сделать чтоль к абису платный патчик для валкера пока на шоках админы думают как привести в порядок то что они создали...

Camellot
10.04.2009, 07:33
!!
xkor, Дык сделай!!!!! Он себя оправдает;)
тока чтоб рабочий 100%)

DashKAaa
10.04.2009, 09:48
эх, сделать чтоль к абису платный патчик для валкера пока на шоках админы думают как привести в порядок то что они создали...
хех... Оправдает... но этим повлекет уйму банов, т.к по сей день на абуссе ботов нет, кроме как пакет хаковских, и те сейчас отлетели....

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

Добавлено через 15 минут
Привет! Помогите пожалуйста разобраться....Дело в том что я впервые сталкиваюсь с этой прогой......Посоветуйте версию , которую можно будет юзать на Abys ......Клиент уже Грация ( или скудное подобие)
Спасибо

3.2.0 пакет хак работает так-же... со скриптом допустим локомотива от с4, но.... он не понимает команду в чат pos, он ее не видит... просто напросто (но мобов вокруг видит...)

NLObP
10.04.2009, 14:40
Сам еще не пробовал, времени нет, а что если в скриптах просто для разных направлений разные ID (хроники) пакетов применять?
Подключаемся, как к интерлюдии (имя чара получаем), в скрипте серверные пакеты пусть ловятся для интерлюдии, а клиентские пусть ловятся для грации.

DashKAaa
10.04.2009, 16:40
Сам еще не пробовал, времени нет, а что если в скриптах просто для разных направлений разные ID (хроники) пакетов применять?
Подключаемся, как к интерлюдии (имя чара получаем), в скрипте серверные пакеты пусть ловятся для интерлюдии, а клиентские пусть ловятся для грации.

статус инфо все видит.. под интерлюд, не воспринимает от локомотива только команды, а локомотив под грацию не видит вообще мобов.

CKuMuHoK
10.04.2009, 19:25
Кто может подсказать название пакета манора, который клиент отправляет, подскажите, а то походу я его фильтрую

Camellot
10.04.2009, 22:40
ХП видит имя чара только если подключаться как к интерлюду.....
По поводу ботов......на серваке есть куча ботов , администрация разрешает использование ботов только для трейдов и крафта.....При наличии платного аккаунта (5 кредитов в месяц) , разрешают - но не предоставлюят бота....ботов находят сами.....где незнаю.
Пытался найти бота работающего , поиски не увенчались успехом(
А спрашивать у когото бессмысленно - ни кто не хочет чтоб пеоявился ещё один конкурент(

Добавлено через 3 минуты
ребят....может кто то даст ссылку на како нить мануал по работе с прогой.....т.к. сидел копался в вашем форуме и нашёл , но мало....
Мне бы оттолкнуться от чего то.
Думаю с манором я пролетаю......т.к манор сдают.....и сдают с помошью всё тех же ботов(((

Добавлено через 13 минут
А вообще...хотел бы сказать большое спасибо , за такой весьма познавательный ресурс......Жаль только что я не нашёл его раньше....возможно не было бы такого колличества глупых вопросов с моей стороны)

alexteam
11.04.2009, 00:06
не пролетаеш ты с манором, просто стоит учесть что пакет на манор будет отображаться в списке совсем не как пакет на сдачу манора а чтото другое. (почему - писалось выше)
методом исключения найти думаю не составит труда.
а дальше использовать его в функции отправки по таймеру.

Camellot
11.04.2009, 02:15
в скрипте серверные пакеты пусть ловятся для интерлюдии, а клиентские пусть ловятся для грации.
Как бы это осуществить то?Можно по подробнее пожалуйста)

Sashafaq
11.04.2009, 08:06
подробнее возьми оставь только пакеты от клиента и когда жмешь на кнопочку сдать там должен вылетать пакет начинаться я думаю он будет одинаково всегда так что жмякай и ищи какой это пакет

DashKAaa
11.04.2009, 17:33
http://forum.theabyss.ru/index.php?s=&showtopic=55541&view=findpost&p=2908762
Вот бот и описание как его запускать, работает только с пакетом профессионал, без него кикает.. из игры... (использую как трейд бот...)

Camellot
11.04.2009, 17:56
DashKAaa, это я прочитал уже.....однако же говорю , что недавно сервак перевели на якобы "грацЫю" , не работает волкер теперь(((((
Теперь даже заметно онлайн упал и в гиране как то дико стало)))))
При чём в этом разделе в основном вопросы от нубов.......а конкретно ничего не сказано , где брать волкера и как его настроить

DashKAaa
11.04.2009, 18:02
я те дал ссылку прямуЮ, на валкер с которого можно сидеть на трейде и барыжить.. а волкеров для кача там и не было никогда, все ручками качаются ну и некоторые умные мб пакетхаком(качались....)

Camellot
12.04.2009, 01:00
дык.....а я и не просил волкера для кача........меня интересует манор на данный момент...т.к. выкачал уже кучу чаров и саппортов сам в ФОГе
Спасибо конечно)

dfackk
12.04.2009, 01:53
DashKAaa, ты экономику какого серва, еще не успел заставить работать на свой карман? xD

NLObP
12.04.2009, 02:58
Проверил сегодня, что там с Абиссом. Все пакеты, я так понял, форматом от грации, только айди серверных пакетов почему то остались от интерлюда.
Поэтому, у кого есть желание, в скриптах для грации просто смените айди серверных пакетов с грации на интерлюд.
Для проверки исправил скрипт рыбалки для грации, теперь он записывает маршрут, бегает по нему в обе стороны, видит инвентарь.

DashKAaa
12.04.2009, 10:24
Проверил сегодня, что там с Абиссом. Все пакеты, я так понял, форматом от грации, только айди серверных пакетов почему то остались от интерлюда.
Поэтому, у кого есть желание, в скриптах для грации просто смените айди серверных пакетов с грации на интерлюд.
Для проверки исправил скрипт рыбалки для грации, теперь он записывает маршрут, бегает по нему в обе стороны, видит инвентарь.
Хмм... пойду помучаю... скрипт локомотива для интерлюда.. он то работает... но я его запустить не могу, т.к в чат команду Pos не воспринимает! хотя мобов вокруг видит.... хчоу перенастроить что бы не с пос команды понимал, а с социального действия.. так вот не получается(

Добавлено через 4 минуты
DashKAaa, ты экономику какого серва, еще не успел заставить работать на свой карман? xD
Да... я... не ботоводер, я так любитель......

NLObP
12.04.2009, 15:42
скрипт локомотива для интерлюда

Наоборот, возьми этот же скрипт для грации и серверные ID пакетов поменяй на ID от интерлюдии.

DashKAaa
12.04.2009, 17:16
Угу.. сделал.. видит мобов, но все тажа проблема.. не понимает команды с чата((
т.е пишу команды (центра кача, а в ответ балда...) по этому и хотел переделать так что бы не писать надо было команду, а социальное действие нажимать... (мобов ид.. фиг с ними.. еще взять можно где либо, т.е 1.2.3.4.5.6 (забивать мобов не надо) вообщем.. вот такая вот задница ((
это если локомотив не работает... еще надо будет переделывать скрипт на лечение на буфф.. ппц, хотя бы с локомотивом разобраться бы (

CKuMuHoK
12.04.2009, 21:35
Кстати кто подскажет, из-за чего может пакет хак зависать ?никакие скрипты не включены

Добавлено через 10 минут
Кстати а как вариант не поможет, если скрипт для интерлюдии заменить клиентские интерлюдские пакеты на пакеты для грации ?

alexteam
12.04.2009, 21:46
Зависать, из за циклов и дезлоков. в принципе как и все прилоежения.

а вот информацию чтобы люди смогли воспроизвести эти "зависания" и поправить по возможности, дать не судьба ?

NLObP
13.04.2009, 04:12
Пробуйте бота:

Const ProgramName =
'Бот - локомотив от Alexus '+
'версия : 0.5.2 (for Abyss) '+
'дата: 13.04.09';
{################################################# ############################
Описание:
Бот для соло-кача в принципе любого война. По функциональности (в режиме кача) это еще не Волкер, но скрипт уже довольно умный :)
Охотиться только на заданных мобов.

Возможности:
- запоминает центр и радиус кача
- запоминает список мобов на которых надо охотиться!
- запоминает и затем подбирает дроп, упавший с убитых им мобов
- умеет лечиться банками (тип банки легко настраивается), ведется учет количества оставшихся банок
- управляется из окна чата в самом клиенте
- имеет окно для вывода всех параметров и статистики
- если моб по какой-то причине стал недосягаемым (стоит за деревом), то через 1 мин БОТ переключится на другого моба.
- если бот умирает, то не палимся и прекращаем рыпаться...(скоро появиться возможность логаута)
- пьет баф-банки
- работает под РУ-ОФФ Gracia, но для этого нужно обойти щит-консоль
- умеет спойлить (функция новая, нужно тестить)

Недостатки: (со временем будет исправлено)
- бот не умеет обходить препядствия

История версий:
0.1 - самое начало :)
0.2 - куча глюков, первая рабочая версия!
0.3 - первая стабильная безглючная версия, с минимальной функциональностью (самая стабильная, но очень простая)
0.4 - изменения:
- радиус кача можно задать в секции настройки
- бот теперь сразу видит всю локацию с самого запуска скрипта
- автоопределение размера инвентаря
- ID мобов можно теперь задавать в секции настройки
- ускорен процесс добавление мобов через клиент (теперь их не надо гасить)
- отключена ф-ция автоопределения своего ID и инвентаря, по этому запускать теперь бот надо до запуска клиента
- обновлено окно вывода информации (теперь его нельзя случайно закрыть!)
- на форму добавлены кнопки управления
- добавлена кнопка "Init" в окно управления, теперь бота можно запускать в любом месте, затем нажать эту кнопку
- добавлен механизм глотания баф-банок
- оптимизирован алгоритм выбора ближайшего моба
- скрипт доработан для новых версий пакетхака (данная версия разработана под пакетхак версии 3.4.1.69)
- в режиме кача, при отсутствии мобов в радиусе, бот возвращается в центр кача
- устранена ошибка, связянная с неправильным распознованием пакета 01 - MoveToLocation
0.5 - модификация под РУ-ОФФ Gracia
- добавлен споил
- убрана ошибка, вылезающая после нажатия кнопки Init
- немного подправлен алгоритм работы с инвентарем

Инструкция:
1. Внимательно НАСТРАИВАЕМ параметры в секции настройки
(90% ошибок и последующих глюков в скрипте вылезает именно отсюда!!!), жмем кнопку "Сохранить"
2. Запускаем ПакетХак, запускаем скрипт, запускаем игрового клиента.
либо запускаем скрипт после захода в игру, и жмем кнопку на форме "Init"
3. Добираемся до места кача
4. Выбираем в таргет моба на которого хотим охотится и отправляем в общий чат-> 1
5. Выбираем следующего моба отправляем в общий чат цифру 2, и т.д. можно выбрать до 10 разных тварей.
6. Либо просто в секции настройки задаем ID мобов
7. Становимся в центр кача и отправляем в общий чат-> pos , если все правильно то в чате будет выдано сообщение, что координаты заданы.
8. Бежим к краю радиуса кача и отправляем в общий чат-> dist, в чате вылезет сообщение от системы, что радиус задан.
9. Если радиус кача задан в секции настройки, то п.7 и 8 можно пропустить!!! становимся примерно в центр кача и отправляем в общий чат-> start ,
если все сделано верно, то будет выдано соответствующее сообщение.
10.Если бот поймал моба в таргет и побежал его атаковать, то можно свернуть окно игры
и смотреть на информационное окно скрипта.

В процессе кача, в общий чат можно посылать следующие управляющие команды:
pause - пауза, можно приостановить бота, повторная комманда pause запустит бота
stop - срочная остановка бота, и сброс всех настроек, повторный запуск возможен командой start

Также можно управлять ботом одноименными кнопками с формы.
################################################## ###########################}

//################### Сеция настройки бота ############################################
NickName = 'NLObP'; // Твой ник в игре
CharNumber = 0; // если больше одного перса на аккаунте, то задаем его порядковый номер, нумерация начинается с нуля.
Radius_Kacha = 2000; // Радиус кача, если 0 - то задавать вручную через клиента (изменять от 100 до 9999). Проверил на практике, что максимум не более 2000.
Spoil = false; // Споил false - откл, true - вкл. (только для гномов-спойлеров)
//-------------------------------------------------------------------------------------
HPLevel = 70; // Уровень жизни в %, при котором начинаем глотать банки
HPBottleID = 0; // ItemID 1060=Lesser Healing Potion; 1061=Healing Potion; 1539=Greater Healing Potion;
DrinkDelay = 14; // минимальное время задержки повторного питься HP-бутылки (10 - 20 сек).
//---------------------------------------------------------------------------------------
Bottle_1_ID = 0; // ID номера баф-банок, 6036=Greater Magic Haste Potion, 6035=Magic Haste Potion, 1374=Greater Haste Potion, 1062=Haste Potion, 734=Haste Potion
Bottle_2_ID = 0; // если 0 - то не использовать. 1375=Greater Swift Attack Potion, 735=Potion of Alacrity
Bottle_Interval = 19; // Время задержки повторного использования бутылей в минутах (изменять от 1 до 100)
//----------------------------------------------------------------------------------------

//############# Секция расширенной настройки для опытных ботоводеров :) ###################################
TimerCombat_Interval = 500; // частота срабатывания таймера атаки в милисекундах, чем меньше это число, тем быстрее бот будет думать.
TimerPickUp_Interval = 500; // частота срабатывания таймера сбора дропа, чем меньше это число, тем быстрее бот будет думать.
TimerForm_Interval = 2500; // частота срабатывания таймера обновления формы, чем меньше это число, тем быстрее будут обновляться данные в форме.
Attack_Time = 45; // Время на убивание моба в секундах.
PickUp_Time = 15; // Врямя на поднятие дропа в секундах.
Vertical = 1000; // Вертикальный радиус кача
//---------------------------------------------------------------------------------------
NpcTypeID1 = 0; // Если знаем, то задаем Type ID мобов, на которых будем охотиться
NpcTypeID2 = 0; // Если здесь одни нули, то задавать мобов будем через клиента
NpcTypeID3 = 0; // Для интерлюда задаем в формате 102xxxx , где xxxx - ID моба
NpcTypeID4 = 0; // Для С4 в формате 100хххх , где xxxx - ID моба
NpcTypeID5 = 0; // Для Gracia формат пока не смотрел...
NpcTypeID6 = 0;
NpcTypeID7 = 0;
NpcTypeID8 = 0;
NpcTypeID9 = 0;
NpcTypeID10 =0;
//################################################## ######################################
NpcTypeID_List_Razmer = 10; // Размер списка мобов (не трогать!)
OX = 1; OY = 2; OZ= 3; // Служебные константы
maximumItems = 500; // Размер базы мобов и дропа.
OblastVidimosti = 500000; // (не трогать!!!) Область видимости объектов (изменять от 1000 до 500000).
InvRazmer = 249; // Размер инвентаря (не трогать)

var
InitMode, RestartMode, PickUpMode : boolean;
//-------------------------------------- БД --------------------------------------------------
MobsObjID : array [1..maximumItems] of integer; // ID моба
MobsNpcTypeID : array [1..maximumItems] of integer; // Тип моба
MobsDist : array [1..maximumItems] of integer; // Расстояние от центра кача до моба
MobsXYZ : array [1..maximumItems, 1..3] of integer; // Координаты
MobsIsAttackable : array [1..maximumItems] of boolean; // Можно ли моба атаковать
MobsAgression : array [1..maximumItems] of boolean; // Моб атакует меня или стоит в сторонке...
MobsUpdated : array [1..maximumItems] of boolean; // Метка об обновлении моба
MobsLastIndex: integer; // индекс последнего элемента базы

NpcTypeID_List : array [1..NpcTypeID_List_Razmer] of integer; // Список мобов (коды мобов)
NpcTypeID_List_Count : integer; // Текущий размер списка
NpcTypeID_CurrentMob : integer;

Items_ObjectID : array [1..maximumItems] of integer; // БД дропа с мобов
Items_ItemID : array [1..maximumItems] of integer;
Items_XYZ : array [1..maximumItems, 1..3] of integer;
ItemsLastIndex: integer;

Inventory: array[0..InvRazmer, 0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
CurrentInvRazmer : integer;
HPBottleObjID, HPBottleCount : integer; // ObjID и количество HP-бутылей
Bottle_1_ObjID, Bottle_1_Count : integer;
Bottle_2_ObjID, Bottle_2_Count : integer;

TargetID, LastKilledMobObjID : integer; // Текущая цель, последний убитый моб

MobsKilled : integer; // счетчик убитых мобов

CenterX, CenterY, CenterZ : integer; // Центр кача
CenterFixed : boolean;
Radius: integer; // Радиус кача
//--------------------------------------------------------
MyX, MyY, MyZ : integer; // Мои статы
MyID, MyHP, MyMaxHP: integer;
MyMP, MyMaxMP, MyCP, MyMaxCP: integer;
HPlevelProcent : integer; // уровень жизни в процентах
//--------------------------------------------------------
frm: TForm; // переменные описания формы
log, MobsDBscreen, ItemsDBScreen: TMemo;
panel: TPanel;
btnInit, btnStart, btnStop, btnPause: TButton;
frmParamIndex: byte;
textX, textY, textZ, textMyID, textMyHP, textMyMaxHP: TEdit;
textMyMP, textMyMaxMP, textMyCP, textMyMaxCP: TEdit;
textCenterX, textCenterY, textCenterZ, textRadius : TEdit;
textTargetID, textMobX, textMobY, textMobZ : TEdit;
textAttackCycle, textMobsLastIndex, textMobsKilled: TEdit;
textHPBottleCount, textBottle_1_Count, textBottle_2_Count: TEdit;
cbFilterRadius : TCheckBox; l1: Tlabel;
//----------------------------------------------------------
TimerForm, TimerCombat, TimerPickUp, TimerBafBanka, TimerCheckDB : TTimer; // таймеры
time1: integer;
Calculated_AttackTime, Calculated_PickUpTime : integer;
AttackCycle: integer; // Цикл атаки
Spoiled: boolean;
//################################################## ############################################

procedure Init; //Вызывается при включении скрипта
var
i,n : integer;
begin
MyID:= 0; // обнуляем ВСЕ данные
MyX:= 0;
MyY:= 0;
MyZ:= 0;
MyID:= 0;
MyHP:= 0;
MyMaxHP:= 0;
MyMP:= 0;
MyMaxMP:= 0;
MyCP:= 0;
MyMaxCP:= 0;
time1:=1;
Calculated_AttackTime:= round (1000 / TimerCombat_Interval * Attack_Time);
Calculated_PickUpTime:= round (1000 / TimerPickUp_Interval * PickUp_Time);
HPlevelProcent:= 0;
HPBottleObjID:= 0;
HPBottleCount:= 0;
Bottle_1_ObjID:= 0;
Bottle_1_Count:= 0;
Bottle_2_ObjID:= 0;
Bottle_2_Count:= 0;
InitMode:= true;
RestartMode:= false;
MobsLastIndex:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:=0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
MobsUpdated[i]:=false;
end;
for i:=0 to InvRazmer do for n:=0 to 9 do Inventory[i, n]:= 0;
CurrentInvRazmer:=0;
TimerCombat:=TTimer.Create(nil); // создаем таймеры
TimerCombat.OnTimer:=@OnTimerCombat;
TimerCombat.enabled:=false;
TimerCombat.interval:= TimerCombat_Interval;
TimerForm:=TTimer.Create(nil);
TimerForm.OnTimer:=@OnTimerForm;
TimerForm.enabled:=true;
TimerForm.interval:= TimerForm_Interval;
TimerPickUp:=TTimer.Create(nil);
TimerPickUp.OnTimer:=@OnTimerPickUp;
TimerPickUp.enabled:=false;
TimerPickUp.interval:= TimerPickUp_Interval;
TimerBafBanka:=TTimer.Create(nil);
TimerBafBanka.OnTimer:=@OnTimerBafBanka;
TimerBafBanka.enabled:=false;
TimerBafBanka.interval:= 15000;
TimerCheckDB:=TTimer.Create(nil);
TimerCheckDB.OnTimer:=@OnTimerCheckDB;
TimerCheckDB.enabled:=true;
TimerCheckDB.interval:= 20*60*1000; // раз в 20 минут
frmParamIndex:=0; // создаем контролы в форме
frm:= TForm.Create(nil);
frm.Caption:= ProgramName;
frm.BorderStyle := bsDialog;
frm.Position := poScreenCenter;
frm.Width:=650;
frm.Height:=700;
frm.OnClose := @FormClose;
MobsDBscreen:=TMemo.Create(frm);
MobsDBscreen.parent:=frm;
MobsDBscreen.ReadOnly:=true;
MobsDBscreen.ScrollBars:=0;
MobsDBscreen.Top:=157;
MobsDBscreen.Width:=457;
MobsDBscreen.Height:=385;
ItemsDBscreen:=TMemo.Create(frm);
ItemsDBscreen.parent:=frm;
ItemsDBscreen.ReadOnly:=true;
ItemsDBscreen.ScrollBars:=0;
ItemsDBscreen.Top:=1;
ItemsDBscreen.Width:=300;
ItemsDBscreen.Height:=155;
panel:=TPanel.Create(frm);
panel.parent:=frm;
panel.align:=alRight;
log:=TMemo.Create(panel);
log.parent:=frm;
log.align:=alBottom;
log.ReadOnly:=true;
log.ScrollBars:=2;
log.Width:=570;
log.Height:=100;
log.Lines.Add('Лог...');
btnInit:= TButton.Create(frm);
btnInit.Name := 'btnInit';
btnInit.Parent := frm;
btnInit.SetBounds(370, 10, 75, 25);
btnInit.Caption := 'Init';
btnInit.OnClick := @BtnInit_Click;
btnStart:= TButton.Create(frm);
btnStart.Name := 'btnStart';
btnStart.Parent := frm;
btnStart.SetBounds(370, 40, 75, 25);
btnStart.Caption := 'Start';
btnStart.OnClick := @btnStart_Click;
btnStop:= TButton.Create(frm);
btnStop.Name := 'btnStop';
btnStop.Parent := frm;
btnStop.SetBounds(370, 70, 75, 25);
btnStop.Caption := 'Stop';
btnStop.OnClick := @btnStop_Click;
btnPause:= TButton.Create(frm);
btnPause.Name := 'btnPause';
btnPause.Parent := frm;
btnPause.SetBounds(370, 100, 75, 25);
btnPause.Caption := 'Pause';
btnPause.OnClick := @btnPause_Click;
l1:= TLabel.Create(frm);
l1.caption:='Фильтры:';
l1.parent:=frm;
l1.SetBounds(5, 547, 97, 17);
cbFilterRadius := TCheckBox.Create(frm);
cbFilterRadius.Name := 'cbFilterRadius';
cbFilterRadius.Parent := frm;
cbFilterRadius.SetBounds(60, 545, 97, 17);
cbFilterRadius.Caption := 'Радиус';
// cbFilterRadius.OnClick := @CheckBoxFilterClick;
textMyID:= CreateTextBox('textMyID');
CreateLabel('Мой ID :');
textX:= CreateTextBox('textX');
CreateLabel('Мой X :');
textY:= CreateTextBox('textY');
CreateLabel('Мой Y :');
textZ:= CreateTextBox('textZ');
CreateLabel('Мой Z :');
textMyHP:= CreateTextBox('textMyHP');
CreateLabel('Мой HP :');
textMyMaxHP:= CreateTextBox('textMyMaxHP');
CreateLabel('Мой MaxHP :');
textMyMP:= CreateTextBox('textMyMP');
CreateLabel('Мой MP :');
textMyMaxMP:= CreateTextBox('textMyMaxMP');
CreateLabel('Мой MaxMP :');
// textMyCP:= CreateTextBox('textMyCP');
// CreateLabel('Мой CP :');
// textMyMaxCP:= CreateTextBox('textMyMaxCP');
// CreateLabel('Мой MaxCP :');
inc(frmParamIndex);
textCenterX:= CreateTextBox('textCenterX');
CreateLabel('Ц. кач Х:');
textCenterY:= CreateTextBox('textCenterY');
CreateLabel('Ц. кач Y:');
textCenterZ:= CreateTextBox('textCenterZ');
CreateLabel('Ц. кач Z:');
textRadius:= CreateTextBox('Radius');
CreateLabel('Radius :');
inc(frmParamIndex);
textTargetID:= CreateTextBox('TargetID');
CreateLabel('Цель ID :');
textAttackCycle:= CreateTextBox('AttackCycle');
CreateLabel('Цикл атаки:');
textMobsLastIndex:= CreateTextBox('MobsLastIndex');
CreateLabel('Мобов в БД:');
textMobsKilled:= CreateTextBox('MobsKilled');
CreateLabel('Убито моб:');
inc(frmParamIndex);
textHPBottleCount:= CreateTextBox('HPBottleCount');
CreateLabel('HP бутылей:');
textBottle_1_Count:= CreateTextBox('Bottle_1_Count');
CreateLabel('Баф-Банки 1:');
textBottle_2_Count:= CreateTextBox('Bottle_2_Count');
CreateLabel('Баф-Банки 2:');
ClearDB;
frm.Show; // выводим форму на экран
buf:=#$6E;
SendToServerEx(NickName);

end;

procedure btnPause_Click(Sender: TButton);
begin
PauseGame;
end;

procedure btnStop_Click(Sender: TButton);
begin
StopGame;
end;
procedure btnStart_Click(Sender: TButton);
begin
StartGame;
end;
procedure BtnInit_Click(Sender: TButton);
begin
RestartMode:= true;
buf:= #$57; // авто релогин
// buf:= #$0F; // принудительно вызываем пакеты инвентаря и userinfo
SendToServerEx(NickName);
end;

procedure AddtoNpcTypeID_List (NpcTypeID: integer);
begin
inc(NpcTypeID_List_Count);
NpcTypeID_List[NpcTypeID_List_Count]:= NpcTypeID;
end;

procedure ClearDB; // Очистка БД
var // Надо все занулять, иначе там хрень всякая вылезает или старые данные
i : integer;
begin
ItemsLastIndex:= 0; // Очищаем переменные
TargetID:= 0;
LastKilledMobObjID:= 0;
MobsKilled:= 0;
CenterX:= 0;
CenterY:= 0;
CenterZ:= 0;
CenterFixed:= false;
Radius:= Radius_Kacha;
TimerBafBanka.interval:= 15000;
AttackCycle:= 0;
Spoiled:= false;
NpcTypeID_List_Count:= 0;
if NpcTypeID1 <> 0 then AddtoNpcTypeID_List (NpcTypeID1);
if NpcTypeID2 <> 0 then AddtoNpcTypeID_List (NpcTypeID2);
if NpcTypeID3 <> 0 then AddtoNpcTypeID_List (NpcTypeID3);
if NpcTypeID4 <> 0 then AddtoNpcTypeID_List (NpcTypeID4);
if NpcTypeID5 <> 0 then AddtoNpcTypeID_List (NpcTypeID5);
if NpcTypeID6 <> 0 then AddtoNpcTypeID_List (NpcTypeID6);
if NpcTypeID7 <> 0 then AddtoNpcTypeID_List (NpcTypeID7);
if NpcTypeID8 <> 0 then AddtoNpcTypeID_List (NpcTypeID8);
if NpcTypeID9 <> 0 then AddtoNpcTypeID_List (NpcTypeID9);
if NpcTypeID10<> 0 then AddtoNpcTypeID_List (NpcTypeID10);
if NpcTypeID_List_Count = 0 then
for i:=1 to NpcTypeID_List_Razmer do NpcTypeID_List[i]:= 0;
NpcTypeID_CurrentMob:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
end;
btnStop.enabled:=false;
btnPause.enabled:= false;
end;

function Wait(var tick: integer; Timewait: Integer): Boolean; // сквозная проверка без остановки скрипта (c)dmitry501, modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;

//############################## Модуль работы с Инвентарем ###########################
procedure InventoryCreate;
var
i,k, offset : integer;
begin
offset:= 76;
CurrentInvRazmer:=ReadH(4);
for i:=0 to InvRazmer do
if i < CurrentInvRazmer then begin
Inventory[i,0]:=ReadH(i*offset+6); // itemType1
Inventory[i,1]:=ReadD(i*offset+8); // ObjectId
Inventory[i,2]:=ReadD(i*offset+12); // ItemID
Inventory[i,3]:=ReadD(i*offset+20); // count
Inventory[i,4]:=ReadH(i*offset+24); // itemType2
Inventory[i,5]:=ReadH(i*offset+26); // CustType1
Inventory[i,6]:=ReadH(i*offset+28); // isEquipped
Inventory[i,7]:=ReadD(i*offset+30); // BodyPart
Inventory[i,8]:=ReadH(i*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(i*offset+36); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;

procedure InventoryUpdate;
var
i,j,k, offset: integer;
begin
offset:= 82;
for j:=0 to (ReadH(2)-1) do
begin
case pck[j*offset+4] of
#$01: k:=0; // add item, запишет на пустую ячейку
#$02: k:=ReadD(j*offset+8); // mod item
#$03: begin // remove item, обнулит ячейки удаленного предмета
k:=ReadD(j*offset+8);
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
for k:=0 to 9 do Inventory[i,k]:=0;
exit;
end;
end;
end;
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
Inventory[i,0]:=ReadH(j*offset+6); // itemType1
Inventory[i,1]:=ReadD(j*offset+8); // ObjectId
Inventory[i,2]:=ReadD(j*offset+12); // ItemID
Inventory[i,3]:=ReadD(j*offset+20); // count
Inventory[i,4]:=ReadH(j*offset+24); // itemType2
Inventory[i,5]:=ReadH(j*offset+26); // CustType1
Inventory[i,6]:=ReadH(j*offset+28); // isEquipped
Inventory[i,7]:=ReadD(j*offset+30); // BodyPart
Inventory[i,8]:=ReadH(j*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(j*offset+36); // CustType2
break;
end;
end;
end;

function GetInv(obj,up,down:integer): integer; // up и down не проверяются
var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
i: integer;
begin
for i:=0 to CurrentInvRazmer do if (Inventory[i,up]=obj) then
begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;

{procedure UseItemID(ItemID:integer); //Использовать предмет с заданным ItemID
var
ObjItemID : integer;
begin
ObjItemID:= GetInv(ItemID,2,1);
if ObjItemID = -1 then exit;
buf:=#$14;
WriteD(ObjItemID);
WriteD(0);
SendToServerEx(NickName);;
end;}

procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemObjID
begin
buf:=#$19;
WriteD(ItemObjID);
WriteD(0);
SendToServerEx(NickName);;
end;
//################################################## ##########################################

function rastoyanie(NpcX, NpcY, NpcZ : integer) : longint; // вычисление растояния между 2 точками
var
dx,dy,dz : integer;
summa : longint;
begin
try
dx:= NpcX-CenterX;
dy:= NpcY-CenterY;
dz:= NpcZ-CenterZ;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
if abs(dz) > vertical then result := result + OblastVidimosti; // добавляем коррекцию по вертикали
except
sendmsg('Ошибка вычисления расстояния');
sendmsg('dx= '+ inttostr(dx));
sendmsg('dy= '+ inttostr(dy));
sendmsg('dz= '+ inttostr(dz));
sendmsg('summa= '+ inttostr(summa));
result := OblastVidimosti;
end;
end;

function RastoyanieToMe(NpcX, NpcY : integer) : integer; // вычисление растояния между 2 точками
var
dx,dy, summa : integer;
begin
dx:= NpcX-MyX;
dy:= NpcY-MyY;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
end;

procedure AddDroppedItem (ObjID, ItemID, X, Y, Z: integer); // Процедура добавляет дропнутую вещь в БД
begin
if ItemsLastIndex = maximumItems then ItemsLastIndex:=0; // обход переполнения базы предметов
inc (ItemsLastIndex);
Items_ObjectID[ItemsLastIndex]:= ObjID;
Items_ItemID[ItemsLastIndex]:= ItemID;
Items_XYZ[ItemsLastIndex, OX]:= X;
Items_XYZ[ItemsLastIndex, OY]:= Y;
Items_XYZ[ItemsLastIndex, OZ]:= Z;
// log.Lines.Add('Вещь добавлена, индекс в БД: '+ inttostr(ItemsLastIndex));
end;

procedure AddtoDB (id, TypeID, x,y,z : integer; IsAttackable : boolean); // Процедура добавляет в БД нового моба
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti; // вычиляем расстояние от центра кача до моба
if dist > (OblastVidimosti) then exit; // если моб слишко далеко то ничего не делаем
inc (MobsLastIndex); // увеличиваем размер БД
// log.Lines.Add('Моб добавлен, индекс в БД:'+ inttostr(MobsLastIndex));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsObjID[MobsLastIndex]:= id; // Записываем моба
MobsNpcTypeID[MobsLastIndex]:= TypeID;
MobsDist[MobsLastIndex]:= dist;
MobsXYZ[MobsLastIndex, OX]:= x;
MobsXYZ[MobsLastIndex, OY]:= y;
MobsXYZ[MobsLastIndex, OZ]:= z;
MobsIsAttackable[MobsLastIndex]:= IsAttackable;
MobsAgression[MobsLastIndex]:= false;
MobsUpdated[MobsLastIndex]:= true;
end;

procedure UpdateDB (i, x,y,z : integer; agression : boolean); // Процедура обновляет данные в БД по мобу
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti;
if dist > (OblastVidimosti) then DelDBItem(i) else // перепроверяем расстояние до моба, если он вышел за границу кача, то удаляем его
begin
// log.Lines.Add('Моб обновлен, индекс в БД:'+ inttostr(i));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsDist[i]:= dist; // записываем данные
MobsXYZ[i, OX]:= x;
MobsXYZ[i, OY]:= y;
MobsXYZ[i, OZ]:= z;
if (not MobsAgression[i]) then MobsAgression[i]:= agression;
MobsUpdated[i]:= true;
end;
end;

procedure DelDBItem (i: integer); // процедура удалаяет моба из БД
begin
// log.Lines.Add('Моб удален, индекс в БД: '+ inttostr(i));
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:= 0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsAgression[i]:= false;
MobsIsAttackable[i]:= false;
MobsUpdated[i]:= false;
if i < MobsLastIndex then // если надо, производим сдвиг данных в массивах
begin
MobsObjID[i]:= MobsObjID[MobsLastIndex];
MobsNpcTypeID[i]:= MobsNpcTypeID[MobsLastIndex];
MobsDist[i]:= MobsDist[MobsLastIndex];
MobsXYZ[i, OX]:= MobsXYZ[MobsLastIndex, OX];
MobsXYZ[i, OY]:= MobsXYZ[MobsLastIndex, OY];
MobsXYZ[i, OZ]:= MobsXYZ[MobsLastIndex, OZ];
MobsIsAttackable[i]:= MobsIsAttackable[MobsLastIndex];
MobsAgression[i]:= MobsAgression[MobsLastIndex];
MobsUpdated[i]:= MobsUpdated[MobsLastIndex];
end;
dec (MobsLastIndex); // уменьшаем размер БД
end;

procedure DelDroppedItem (i: integer); // процедура удалаяет вещь из БД
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
// log.Lines.Add('Вещь удалена, индекс в БД: '+ inttostr(i));
if i < ItemsLastIndex then
begin
Items_ObjectID[i]:= Items_ObjectID[ItemsLastIndex];
Items_ItemID[i] := Items_ItemID[ItemsLastIndex];
Items_XYZ[i, OX]:= Items_XYZ[ItemsLastIndex, OX];
Items_XYZ[i, OY]:= Items_XYZ[ItemsLastIndex, OY];
Items_XYZ[i, OZ]:= Items_XYZ[ItemsLastIndex, OZ];
end;
dec (ItemsLastIndex);
end;

function CheckItems (id: integer) : integer; // функция проверяет наличие заданной вещи в БД
var
i: integer;
begin
result:= 0;
for i:=1 to ItemsLastIndex do if Items_ObjectID[i] = id then
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function TestPovtor (id: integer) : integer; // функция проверяет наличие заданного моба в БД
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsObjID[i] = id then // Ищем нужный ID в нашей БД
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function InMobsList (NpcTypeID: integer) : boolean; // функция проверяет наличие заданного моба в списке на атаку
var
i: integer;
begin
result:= false;
for i:=1 to NpcTypeID_List_Count do if NpcTypeID_List[i] = NpcTypeID then result:= true; // проверяем по списку
end;

procedure SendMsg_to_CL(msg:string); // отправка системных сообщений клиенту
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(NickName);
end;

procedure OnTimerCheckDB (Sender: TObject);
var
i: integer;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if MobsUpdated[i] then MobsUpdated[i]:=false
else
begin
DelDBItem(i);
dec(i);
end;
end;
end;

procedure PrepareDB;
var
i: integer;
//dist : double;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if InMobsList(MobsNpcTypeID[i]) then MobsIsAttackable[i]:= true;
MobsDist[i] := rastoyanie (MobsXYZ[i, OX], MobsXYZ[i, OY], MobsXYZ[i, OZ]);
if MobsDist[i] >= OblastVidimosti then
begin
// DelDBItem(i);
// dec(i);
end;
end;
end;

function ValidateData : boolean; // функция проверки правильности задания всех параметров для начала кача
begin
if (MyX <> 0) and (MyY <> 0) and (MyZ <> 0) and (MyID <> 0) and (MyHP > 0) and (MyMaxHP > 0) and // верификация всех данных, чтобы потом в боевом режиме
(MyMP > 0) and (MyMaxMP > 0) and {(MyCP <> 0) and (MyMaxCP <> 0) and } // не перепроверять все данные по 100 раз
(CenterX <> 0) and (CenterY <> 0) and (CenterZ <> 0) and (Radius > 0) and (NpcTypeID_List_Count > 0) then
begin
PrepareDB;
SendMsg_to_CL('Все начальные параметры заданы и проверены!');
log.Lines.Add('Все начальные параметры заданы и проверены!');
result:= true;
end
else
begin
SendMsg_to_CL('Ошибка задания начальных параметров!');
log.Lines.Add('Ошибка задания начальных параметров!');
result:= false;
end;
end;

procedure UserCommands; // комманды пользователя
var
i: integer;
begin // если комманда обработана удачно, то в чат сообщение не попадет, а будет выдано системное сообщение прямо в клиент
if InitMode then case (ReadS(2)) of
'pos' : if MyX <> 0 then // центр кача
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
CenterFixed:= true;
SendMsg_to_CL('Центр кача задан успешно!');
log.Lines.Add('Центр кача задан успешно!');
pck:='';
end;
'dist' : if (CenterX <> 0) and (MyX <> 0) then // радиус кача
begin
CenterFixed:= true;
Radius:= rastoyanie (MyX,MyY,MyZ);
SendMsg_to_CL('Радиус кача задан успешно');
SendMsg_to_CL('R= '+ inttostr(Radius));
log.Lines.Add('Радиус кача задан успешно, R = '+ inttostr(Radius));
pck:='';
end;
'reset': begin // сброс параметров
ClearDB;
SendMsg_to_CL('БД очищена, введите заново все параметры');
log.Lines.Add('БД очищена!');
pck:='';
end;
'1', '2', '3', '4', '5', '6', '7', '8', '9', '10' : // задаем мобов
begin
if (NpcTypeID_List_Count+1) <> strtoint(ReadS(2)) then
begin
SendMsg_to_CL('Добавлять мобов можно тока по очереди 1, 2, 3...');
pck:='';
exit;
end;
NpcTypeID_CurrentMob:= strtoint(ReadS(2));
SendMsg_to_CL('Добавляем моба № '+ ReadS(2));
pck:='';
i:= TestPovtor (TargetID);
if i > 0 then
begin
NpcTypeID_List[NpcTypeID_CurrentMob]:= MobsNpcTypeID[i];
SendMsg_to_CL('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
log.Lines.Add('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
inc(NpcTypeID_List_Count);
NpcTypeID_CurrentMob:= 0;
TargetID:= 0;
end;
end;
'start': begin // собственно запуск бота
pck:='';
StartGame;
end;
end;
if (not InitMode) then case (ReadS(2)) of
'pause' : begin
pck:='';
PauseGame;
end;
'stop' : begin
pck:='';
StopGame;
end;
end;
end;

procedure PauseGame;
begin
TimerCombat.enabled:= not(TimerCombat.enabled);
TimerBafBanka.enabled:= not(TimerBafBanka.enabled);
if TimerCombat.enabled then
begin
btnPause.Caption:='Pause';
TimerBafBanka.interval:= 15000;
SendMsg_to_CL('Искуственный интелект запущен!');
log.Lines.Add('Искуственный интелект запущен!');
end
else
begin
btnPause.Caption:='Repeat';
SendMsg_to_CL('Искуственный интелект приостановлен.');
log.Lines.Add('Искуственный интелект приостановлен.');
end;
end;

procedure StartGame;
begin
if ValidateData and InitMode then
begin
CenterFixed:= true;
SendMsg_to_CL('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
log.Lines.Add('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
TargetID:=0;
InitMode:= false;
TimerCombat.enabled:=true; // запускаем таймер
TimerBafBanka.interval:= 15000;
TimerBafBanka.enabled:= true;
btnStart.enabled:= false;
btnStop.enabled:= true;
btnPause.enabled:= true;
end
else
begin
SendMsg_to_CL('Еще не все параметры заданы. Проверьте параметры...');
log.Lines.Add('Еще не все параметры заданы. Проверьте параметры...');
end;
end;

procedure StopGame; // остановка кача
begin
TimerCombat.enabled:= false;
InitMode:= true;
TimerPickUp.enabled:=false;
TimerBafBanka.enabled:=false;
TargetID:= 0;
ClearDB;
SendMsg_to_CL('Искуственный интелект остановлен.');
log.Lines.Add('Искуственный интелект остановлен.');
btnStart.enabled:= true;
btnStop.enabled:= false;
btnPause.Caption:= 'Pause';
btnPause.enabled:=false;
end;

function GetMinDistID : integer; // функция поиска ближайшего моба в БД
var
i, Dist, MinDist : integer;
begin
result:= 0;
if MobsLastIndex = 0 then exit;
MinDist:=RastoyanieToMe(MobsXYZ[1,OX], MobsXYZ[1,OY]);
for i:=1 to MobsLastIndex do if (MobsDist[i] <= Radius) and (MobsIsAttackable[i]) then
begin
Dist:= RastoyanieToMe(MobsXYZ[i,OX], MobsXYZ[i,OY]);
if Dist <= MinDist then
begin
Dist:= MinDist;
result:= i;
end; // если нашли хоть одного моба или несколько, товозращаем индекс ближайшего
end;
end;

function AgroTest : integer; // функция проверяет, атакует ли меня кто-нибудь или нет
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsAgression[i] then // ищем первого попавшегося моба, который нас атакует
begin
result:= i; // возвращаем его индекс по БД
break;
end;
end;

procedure PhisicalAttack; // команда атаки
begin
buf:=#$1F; //action
WriteD(TargetID);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(0);
SendToServerEx(NickName);
end;
procedure RequestMagicSkillUse (SkillID: integer); // маг атака
begin
buf:=#$39;
WriteD(SkillID);
WriteD(0);
WriteC(0);
SendToServerEx(NickName);
end;

procedure InitPickUpMode(mode: boolean);
begin
if mode then
begin
PickUpMode:= true;
TimerCombat.enabled:= false;
TimerPickUp.enabled:= true;
end
else
begin
PickUpMode:= false;
TimerCombat.enabled:= true;
TimerPickUp.enabled:= false;
end;
end;

procedure OnTimerBafBanka (Sender: TObject); // таймер питья баф-банок
begin
if (Bottle_1_Count > 0) and (Bottle_1_ObjID > 0) then
begin
UseItemObjID(Bottle_1_ObjID);
dec (Bottle_1_Count);
end;
if (Bottle_2_Count > 0) and (Bottle_2_ObjID > 0) then
begin
UseItemObjID(Bottle_2_ObjID);
dec (Bottle_2_Count);
end;
TimerBafBanka.interval:= Bottle_Interval*60*1000;
end;

procedure OnTimerPickUp (Sender: TObject); // таймер поднятия дропа
var
povtor: integer;
begin
if (AgroTest > 0) then
begin
TargetID:= 0;
InitPickUpMode(false);
exit;
end;
if (ItemsLastIndex > 0) and (TargetID = 0) then
begin
TargetID:= Items_ObjectID[ItemsLastIndex];
AttackCycle:= 0;
PhisicalAttack;
exit;
end;
if (ItemsLastIndex > 0) and (TargetID > 0) then
begin
inc (AttackCycle);
if ((AttackCycle mod 5) = 0) then PhisicalAttack;
if AttackCycle > Calculated_PickUpTime then
begin
Povtor:= CheckItems(TargetID);
if Povtor <> 0 then DelDroppedItem(Povtor);
TargetID:= 0;
end;
exit;
end;
if ItemsLastIndex = 0 then InitPickUpMode(false);
end;

procedure OnTimerCombat (Sender: TObject); // боевой таймер, вся логика поведения бота находится именно здесь!!!
var
Agro, MinDistID, i: integer;
begin
if TargetID > 0 then // если в прицеле есть моб, то
begin // валим вражину
if ((AttackCycle mod 5) = 0) then
begin
if Spoil and (not Spoiled) then RequestMagicSkillUse(254) // заспойлим моба если опция включена
else PhisicalAttack;
end;
inc(AttackCycle);
if AttackCycle > Calculated_AttackTime then // если валим моба больше минуты, значит это баг...
begin
i:= TestPovtor(TargetID);
if i > 0 then
begin
MobsIsAttackable[i]:= false; //DelDBItem(i);
MobsAgression[i]:= false;
end;
TargetID:= 0;
end;
exit;
end;
Agro:= AgroTest;
if Agro > 0 then // если нас кто-то атакует, то его и выбираем
begin
TargetID:= MobsObjID[Agro];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if ItemsLastIndex > 0 then // если чего-то валяется на земле, то
begin
InitPickUpMode(true); // надо дроп подбирать
exit;
end;
MinDistID:= GetMinDistID; // запускаем алгоритм выбора цели
if MinDistID > 0 then // иначе ищем ближайшего
begin
TargetID:= MobsObjID[MinDistID];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if (abs(MyX-CenterX) > 20) and (abs(MyY-CenterY) > 20) then MoveTo (CenterX, CenterY, CenterZ);
end;

procedure MoveTo(TargetX,TargetY,TargetZ:integer); //Идти в точку с координатами x,y,z
begin
buf:=#$0F; //01=MoveBackwardToLocation:d(targetX)d(targetY)d(ta rgetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
WriteD(targetx); //куда
WriteD(targety);
WriteD(targetz);
WriteD(MyX); //откуда
WriteD(MyY);
WriteD(MyZ);
WriteD(1); //используем 1-мышь 0-клавиатура
SendToServerEx(NickName);
end;

procedure OnTimerForm (Sender: TObject); // таймер обновления данных в форме
var
i: integer;
begin
textMyID.text:= inttostr(MyID); // обновляем данные в окне
textX.text:= inttostr(MyX);
textY.text:= inttostr(MyY);
textZ.text:= inttostr(MyZ);
textMyHP.text:= inttostr(MyHP);
textMyMaxHP.text:= inttostr(MyMaxHP);
textMyMP.text:= inttostr(MyMP);
textMyMaxMP.text:= inttostr(MyMaxMP);
// textMyCP.text:= inttostr(MyCP);
// textMyMaxCP.text:= inttostr(MyMaxCP);
textCenterX.text:= inttostr(CenterX);
textCenterY.text:= inttostr(CenterY);
textCenterZ.text:= inttostr(CenterZ);
textRadius.text:= inttostr(Radius);
textTargetID.text:= inttostr(TargetID);
textAttackCycle.text:= inttostr(AttackCycle);
textMobsLastIndex.text:= inttostr(MobsLastIndex);
textMobsKilled.text:= inttostr(MobsKilled);
textHPBottleCount.text:= inttostr(HPBottleCount);
textBottle_1_Count.text:= inttostr(Bottle_1_Count);
textBottle_2_Count.text:= inttostr(Bottle_2_Count);

MobsDBscreen.lines.Clear;
for i:=1 to MobsLastIndex do // выводим БД мобов
begin
if (TargetID = MobsObjID[i]) and MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if TargetID = MobsObjID[i] then
begin
MobsDBscreen.lines.add ('-> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if cbFilterRadius.checked then if MobsDist[i] <= Radius then
begin
MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if (not cbFilterRadius.checked) then MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
end;
ItemsDBscreen.lines.Clear; // выводим БД дропа
for i:=1 to ItemsLastIndex do ItemsDBscreen.lines.add ('индекс в БД: '+inttostr(i)+' объект ID: '+inttostr(Items_ObjectID[i])+' ID вещи: '+inttostr(Items_ItemID[i]));
if MobsLastIndex = 0 then MobsDBscreen.lines.add ('Мобы');
if ItemsLastIndex= 0 then ItemsDBscreen.lines.add('Дроп');
end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure CreateLabel (text: string); // процедура автоматизирует создание текстовых меток в форме
var
l: TLabel;
begin
l:= TLabel.Create(panel);
l.caption:=text;
l.parent:=panel;
l.left:=10;
l.top:=15+20*frmParamIndex;
inc(frmParamIndex);
end;

function CreateTextBox (text:string) :TEdit; // функция автоматизирует создание текстовых полей для вывода данных в форме
var
e: TEdit;
begin
e:= TEdit.Create(panel);
e.text:=text;
e.parent:=panel;
e.left:=80;
e.top:=10+20*frmParamIndex;
e.width:= 95;
e.ReadOnly:=true;
result:= e;
end;

procedure Free; //Вызывается при выключении скрипта
begin
ClearDB;
TimerForm.free;
TimerCombat.free;
TimerPickUp.free;
TimerBafBanka.free;
TimerCheckDB.free;
MobsDBscreen.free;
ItemsDBscreen.free;
log.free;
frm.free;
end;

procedure UserInfo; // обновление данных о себе
var
i:word;
begin
if InitMode then MyID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
i:=22;
ReadS(i);
i:=i+48;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
// i:=i+363; //пока не используется
// MyMaxCP:=ReadD(i);
// MyCP:=ReadD(i);
end;

procedure StatusUpdate; // обновление данных о себе
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: MyHP:=ReadD(i*8+14);
#$0A: MyMaxHP:=ReadD(i*8+14);
#$0B: MyMP:=ReadD(i*8+14);
#$0C: MyMaxMP:=ReadD(i*8+14);
// #$21: MyCP:=ReadD(i*8+14); //пока не используется
// #$22: MyMaxCP:=ReadD(i*8+14);
end;
if MyMaxHP > 0 then HPlevelProcent:= Round((MyMaxHP/100)*HPLevel);
end;

procedure DrinkBottle; // пьем бутылки и следим за их количеством
begin
if (HPBottleCount > 0) and (HPBottleObjID > 0)then
begin
UseItemObjID(HPBottleObjID);
dec (HPBottleCount);
end;
end;

procedure MoveToLocation01;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then updateDB(i, ReadD(06), ReadD(10), ReadD(14), false);
end;

procedure NpcInfo16;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then AddtoDB (ReadD(2), ReadD(6), ReadD(14), ReadD(18), ReadD(22), InMobsList(ReadD(6)))
else UpdateDB(i, ReadD(14), ReadD(18), ReadD(22), false);
end;

procedure Attack05;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then log.Lines.Add('Глюк, моб не найден, или нас утакует другой игрок!!!')
else UpdateDB(i, ReadD(15), ReadD(19), ReadD(23), true);
end;

procedure Die06;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then
if MobsObjID[i] = TargetID then
begin
TimerCombat.enabled:= false;
if Spoil and Spoiled then
if ReadD(22) = 1 then RequestMagicSkillUse(42);
LastKilledMobObjID:=TargetID;
inc (MobsKilled); // подводим статистику
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
Spoiled:= false;
TargetID:= 0;
TimerCombat.enabled:= true;
end;
end;

procedure DeleteObject12;
var
i: integer;
begin
if LastKilledMobObjID = ReadD(2) then
begin
LastKilledMobObjID:= 0;
i:= TestPovtor(ReadD(2));
if i > 0 then DelDBItem(i);
exit;
end;
i:= CheckItems(ReadD(2));
if i > 0 then
begin
if Items_ObjectID[i] = TargetID then TargetID:= 0;
DelDroppedItem(i);
exit;
end;
i:= TestPovtor(ReadD(2));
if i > 0 then
begin
if TargetID = ReadD(2) then TargetID:= 0;
DelDBItem(i);
exit;
end;
end;

begin
if pck = '' then exit;
if (ConnectName = NickName) and FromServer then // разбор пакетов от сервера
case pck[1] of
#$01: MoveToLocation01; // MoveToLocation:h(ObjectID)d(CurX)d(CurY)d(CurZ)d(D estX)d(DestY)d(DestZ)
// #$03: ; // CharInfo:d(X)d(Y)d(Z)-(4)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)-(4)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs) i(Feet)i(Back)i(LRHand)i(Hair)d(PvPFlag)d(Carma)d( MSpeed)d(PSpeed)d(PvpFlag)d(Karma)d(RunSpeed)d(Wal kSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed )d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(Move mentSpeedMultiplier)f(AttackSpeedMultiplier)f(Coll isionRadius)f(CollisionHeight)d(HairStyle)d(HairCo lor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCr estId)d(AllyId)d(AllyCrestId)d(SiegeFlags)b(Sittin g)b(Running)b(InCombat)b(AlikeDead)b(Invisible)b(M ountType)b(PrivateStoreType)
#$04: if ReadS(22) = NickName then // UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Name)d (Race)d(Sex)d(ClassID)d(Level)d(Exp)d(STR)d(DEX)d( CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurrentHP)d(MaxMP) d(CurrentMP)d(SP)d(CurrentLoad)d(MaxLoad)d(Unknown )d(Under)d(REar)d(LEar)d(Neck)d(RFinger)d(LFinger) d(Head)d(RHand)d(LHand)d(Gloves)d(Chest)d(Legs)d(F eet)d(Back)d(LRHand)d(Hair)i(Under)i(REar)i(LEar)i (Neck)i(RFinger)i(LFinger)i(Head)i(RHand)i(LHand)i (Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Ha ir)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accurac y)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef) d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRun Speed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d (FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultipl ier)f(AttackSpeedMultiplier)f(CollisionRadius)f(Co llisionHeight)d(HairStyle)d(HairColor)d(Face)d(Acc essLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d (AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateS toreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cub ics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b ()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLef t)b()b(RecomHave)b()
begin
UserInfo;
btnInit.enabled:= false;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$05: if (ReadD(6) = MyID) and (not InitMode) then Attack05; // 05= Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d( X)d(Y)d(Z)h(Hits)
#$48: begin; // 48= MagicSkillUse:h(CharID)h(targetID)d(skillID)d(skil lLvl)d(hitTime)d(reuseDelay)d(X)d(Y)d(Z)w(count)d( d)d(d)d(d)
if (ReadD(2) = MyID) and (ReadD (6) = TargetID) and (ReadD(10) = 254) then Spoiled:= true;
end;
#$06: Die06; // Die:d(ChaID)
#$0C: if LastKilledMobObjID = ReadD(2) then // DropItem:h(PlayerID)h(ObjectID)i(ItemID)d(X)d(Y)d( Z)d(Stackable)d(Count)
begin
AddDroppedItem(ReadD(6), ReadD(10), ReadD(14), ReadD(18), ReadD(22));
end;
#$0D: if TargetID = ReadD(6) then // GetItem:d(PlayerID)h(ObjectID)d(X)d(Y)d(Z)
begin
TargetID:= 0;
end;
#$0E: if MyID=ReadD(2) then // StatusUpdate:h(ObjectID)d(Attributes)
begin
StatusUpdate;
if (MyHP > 0) and (MyHP < HPlevelProcent) then if Wait(time1,DrinkDelay) then DrinkBottle; // пьем бутылки
if MyHP > HPlevelProcent then time1:=1;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$12: DeleteObject12; // DeleteObject:h(ObjectID)
#$16: if (ReadD(10)=1) and (pck[121]=#$00) then NpcInfo16; // NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X) d(Y)d(Z)d(Heading)d(Unknown)d(MAtkSpd)d(PAtkSpd)d( RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRu nSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(Proper Multiplier)f(PAtkSpd)f(CollisionRadius)f(Collision Height)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRun ning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Nam e)s(Title)
#$1B: begin
InventoryCreate; // Инвентарь
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$27: begin
InventoryUpdate;
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$13: if RestartMode then // CharacterSelectionInfo
begin
buf:=#$12; // CharacterSelected
WriteD(CharNumber);
buf:= buf + hstr('00 00 00 00 00 00 00 00 00 00 00 00 00 00');
SendToServerEx(NickName);
RestartMode:= false;
end;
end;

if (ConnectName = NickName) and FromClient then // разбор пакетов от клиента
case pck[1] of
#$1F: if InitMode then TargetID:= ReadD(2); // Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b( ActionID)
#$49: UserCommands; // Say2:s(Text)d(Type)s(Target)
#$59: begin // ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
MyX:= ReadD(2);
MyY:= ReadD(6);
MyZ:= ReadD(10);
if (not CenterFixed) and InitMode then
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
end;
end;
end;

end.

DashKAaa
13.04.2009, 12:45
Пробуйте бота:

Const ProgramName =
'Бот - локомотив от Alexus '+
'версия : 0.5.2 (for Abyss) '+
'дата: 13.04.09';
{################################################# ############################
Описание:
Бот для соло-кача в принципе любого война. По функциональности (в режиме кача) это еще не Волкер, но скрипт уже довольно умный :)
Охотиться только на заданных мобов.

Возможности:
- запоминает центр и радиус кача
- запоминает список мобов на которых надо охотиться!
- запоминает и затем подбирает дроп, упавший с убитых им мобов
- умеет лечиться банками (тип банки легко настраивается), ведется учет количества оставшихся банок
- управляется из окна чата в самом клиенте
- имеет окно для вывода всех параметров и статистики
- если моб по какой-то причине стал недосягаемым (стоит за деревом), то через 1 мин БОТ переключится на другого моба.
- если бот умирает, то не палимся и прекращаем рыпаться...(скоро появиться возможность логаута)
- пьет баф-банки
- работает под РУ-ОФФ Gracia, но для этого нужно обойти щит-консоль
- умеет спойлить (функция новая, нужно тестить)

Недостатки: (со временем будет исправлено)
- бот не умеет обходить препядствия

История версий:
0.1 - самое начало :)
0.2 - куча глюков, первая рабочая версия!
0.3 - первая стабильная безглючная версия, с минимальной функциональностью (самая стабильная, но очень простая)
0.4 - изменения:
- радиус кача можно задать в секции настройки
- бот теперь сразу видит всю локацию с самого запуска скрипта
- автоопределение размера инвентаря
- ID мобов можно теперь задавать в секции настройки
- ускорен процесс добавление мобов через клиент (теперь их не надо гасить)
- отключена ф-ция автоопределения своего ID и инвентаря, по этому запускать теперь бот надо до запуска клиента
- обновлено окно вывода информации (теперь его нельзя случайно закрыть!)
- на форму добавлены кнопки управления
- добавлена кнопка "Init" в окно управления, теперь бота можно запускать в любом месте, затем нажать эту кнопку
- добавлен механизм глотания баф-банок
- оптимизирован алгоритм выбора ближайшего моба
- скрипт доработан для новых версий пакетхака (данная версия разработана под пакетхак версии 3.4.1.69)
- в режиме кача, при отсутствии мобов в радиусе, бот возвращается в центр кача
- устранена ошибка, связянная с неправильным распознованием пакета 01 - MoveToLocation
0.5 - модификация под РУ-ОФФ Gracia
- добавлен споил
- убрана ошибка, вылезающая после нажатия кнопки Init
- немного подправлен алгоритм работы с инвентарем

Инструкция:
1. Внимательно НАСТРАИВАЕМ параметры в секции настройки
(90% ошибок и последующих глюков в скрипте вылезает именно отсюда!!!), жмем кнопку "Сохранить"
2. Запускаем ПакетХак, запускаем скрипт, запускаем игрового клиента.
либо запускаем скрипт после захода в игру, и жмем кнопку на форме "Init"
3. Добираемся до места кача
4. Выбираем в таргет моба на которого хотим охотится и отправляем в общий чат-> 1
5. Выбираем следующего моба отправляем в общий чат цифру 2, и т.д. можно выбрать до 10 разных тварей.
6. Либо просто в секции настройки задаем ID мобов
7. Становимся в центр кача и отправляем в общий чат-> pos , если все правильно то в чате будет выдано сообщение, что координаты заданы.
8. Бежим к краю радиуса кача и отправляем в общий чат-> dist, в чате вылезет сообщение от системы, что радиус задан.
9. Если радиус кача задан в секции настройки, то п.7 и 8 можно пропустить!!! становимся примерно в центр кача и отправляем в общий чат-> start ,
если все сделано верно, то будет выдано соответствующее сообщение.
10.Если бот поймал моба в таргет и побежал его атаковать, то можно свернуть окно игры
и смотреть на информационное окно скрипта.

В процессе кача, в общий чат можно посылать следующие управляющие команды:
pause - пауза, можно приостановить бота, повторная комманда pause запустит бота
stop - срочная остановка бота, и сброс всех настроек, повторный запуск возможен командой start

Также можно управлять ботом одноименными кнопками с формы.
################################################## ###########################}

//################### Сеция настройки бота ############################################
NickName = 'NLObP'; // Твой ник в игре
CharNumber = 0; // если больше одного перса на аккаунте, то задаем его порядковый номер, нумерация начинается с нуля.
Radius_Kacha = 2000; // Радиус кача, если 0 - то задавать вручную через клиента (изменять от 100 до 9999). Проверил на практике, что максимум не более 2000.
Spoil = false; // Споил false - откл, true - вкл. (только для гномов-спойлеров)
//-------------------------------------------------------------------------------------
HPLevel = 70; // Уровень жизни в %, при котором начинаем глотать банки
HPBottleID = 0; // ItemID 1060=Lesser Healing Potion; 1061=Healing Potion; 1539=Greater Healing Potion;
DrinkDelay = 14; // минимальное время задержки повторного питься HP-бутылки (10 - 20 сек).
//---------------------------------------------------------------------------------------
Bottle_1_ID = 0; // ID номера баф-банок, 6036=Greater Magic Haste Potion, 6035=Magic Haste Potion, 1374=Greater Haste Potion, 1062=Haste Potion, 734=Haste Potion
Bottle_2_ID = 0; // если 0 - то не использовать. 1375=Greater Swift Attack Potion, 735=Potion of Alacrity
Bottle_Interval = 19; // Время задержки повторного использования бутылей в минутах (изменять от 1 до 100)
//----------------------------------------------------------------------------------------

//############# Секция расширенной настройки для опытных ботоводеров :) ###################################
TimerCombat_Interval = 500; // частота срабатывания таймера атаки в милисекундах, чем меньше это число, тем быстрее бот будет думать.
TimerPickUp_Interval = 500; // частота срабатывания таймера сбора дропа, чем меньше это число, тем быстрее бот будет думать.
TimerForm_Interval = 2500; // частота срабатывания таймера обновления формы, чем меньше это число, тем быстрее будут обновляться данные в форме.
Attack_Time = 45; // Время на убивание моба в секундах.
PickUp_Time = 15; // Врямя на поднятие дропа в секундах.
Vertical = 1000; // Вертикальный радиус кача
//---------------------------------------------------------------------------------------
NpcTypeID1 = 0; // Если знаем, то задаем Type ID мобов, на которых будем охотиться
NpcTypeID2 = 0; // Если здесь одни нули, то задавать мобов будем через клиента
NpcTypeID3 = 0; // Для интерлюда задаем в формате 102xxxx , где xxxx - ID моба
NpcTypeID4 = 0; // Для С4 в формате 100хххх , где xxxx - ID моба
NpcTypeID5 = 0; // Для Gracia формат пока не смотрел...
NpcTypeID6 = 0;
NpcTypeID7 = 0;
NpcTypeID8 = 0;
NpcTypeID9 = 0;
NpcTypeID10 =0;
//################################################## ######################################
NpcTypeID_List_Razmer = 10; // Размер списка мобов (не трогать!)
OX = 1; OY = 2; OZ= 3; // Служебные константы
maximumItems = 500; // Размер базы мобов и дропа.
OblastVidimosti = 500000; // (не трогать!!!) Область видимости объектов (изменять от 1000 до 500000).
InvRazmer = 249; // Размер инвентаря (не трогать)

var
InitMode, RestartMode, PickUpMode : boolean;
//-------------------------------------- БД --------------------------------------------------
MobsObjID : array [1..maximumItems] of integer; // ID моба
MobsNpcTypeID : array [1..maximumItems] of integer; // Тип моба
MobsDist : array [1..maximumItems] of integer; // Расстояние от центра кача до моба
MobsXYZ : array [1..maximumItems, 1..3] of integer; // Координаты
MobsIsAttackable : array [1..maximumItems] of boolean; // Можно ли моба атаковать
MobsAgression : array [1..maximumItems] of boolean; // Моб атакует меня или стоит в сторонке...
MobsUpdated : array [1..maximumItems] of boolean; // Метка об обновлении моба
MobsLastIndex: integer; // индекс последнего элемента базы

NpcTypeID_List : array [1..NpcTypeID_List_Razmer] of integer; // Список мобов (коды мобов)
NpcTypeID_List_Count : integer; // Текущий размер списка
NpcTypeID_CurrentMob : integer;

Items_ObjectID : array [1..maximumItems] of integer; // БД дропа с мобов
Items_ItemID : array [1..maximumItems] of integer;
Items_XYZ : array [1..maximumItems, 1..3] of integer;
ItemsLastIndex: integer;

Inventory: array[0..InvRazmer, 0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
CurrentInvRazmer : integer;
HPBottleObjID, HPBottleCount : integer; // ObjID и количество HP-бутылей
Bottle_1_ObjID, Bottle_1_Count : integer;
Bottle_2_ObjID, Bottle_2_Count : integer;

TargetID, LastKilledMobObjID : integer; // Текущая цель, последний убитый моб

MobsKilled : integer; // счетчик убитых мобов

CenterX, CenterY, CenterZ : integer; // Центр кача
CenterFixed : boolean;
Radius: integer; // Радиус кача
//--------------------------------------------------------
MyX, MyY, MyZ : integer; // Мои статы
MyID, MyHP, MyMaxHP: integer;
MyMP, MyMaxMP, MyCP, MyMaxCP: integer;
HPlevelProcent : integer; // уровень жизни в процентах
//--------------------------------------------------------
frm: TForm; // переменные описания формы
log, MobsDBscreen, ItemsDBScreen: TMemo;
panel: TPanel;
btnInit, btnStart, btnStop, btnPause: TButton;
frmParamIndex: byte;
textX, textY, textZ, textMyID, textMyHP, textMyMaxHP: TEdit;
textMyMP, textMyMaxMP, textMyCP, textMyMaxCP: TEdit;
textCenterX, textCenterY, textCenterZ, textRadius : TEdit;
textTargetID, textMobX, textMobY, textMobZ : TEdit;
textAttackCycle, textMobsLastIndex, textMobsKilled: TEdit;
textHPBottleCount, textBottle_1_Count, textBottle_2_Count: TEdit;
cbFilterRadius : TCheckBox; l1: Tlabel;
//----------------------------------------------------------
TimerForm, TimerCombat, TimerPickUp, TimerBafBanka, TimerCheckDB : TTimer; // таймеры
time1: integer;
Calculated_AttackTime, Calculated_PickUpTime : integer;
AttackCycle: integer; // Цикл атаки
Spoiled: boolean;
//################################################## ############################################

procedure Init; //Вызывается при включении скрипта
var
i,n : integer;
begin
MyID:= 0; // обнуляем ВСЕ данные
MyX:= 0;
MyY:= 0;
MyZ:= 0;
MyID:= 0;
MyHP:= 0;
MyMaxHP:= 0;
MyMP:= 0;
MyMaxMP:= 0;
MyCP:= 0;
MyMaxCP:= 0;
time1:=1;
Calculated_AttackTime:= round (1000 / TimerCombat_Interval * Attack_Time);
Calculated_PickUpTime:= round (1000 / TimerPickUp_Interval * PickUp_Time);
HPlevelProcent:= 0;
HPBottleObjID:= 0;
HPBottleCount:= 0;
Bottle_1_ObjID:= 0;
Bottle_1_Count:= 0;
Bottle_2_ObjID:= 0;
Bottle_2_Count:= 0;
InitMode:= true;
RestartMode:= false;
MobsLastIndex:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:=0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
MobsUpdated[i]:=false;
end;
for i:=0 to InvRazmer do for n:=0 to 9 do Inventory[i, n]:= 0;
CurrentInvRazmer:=0;
TimerCombat:=TTimer.Create(nil); // создаем таймеры
TimerCombat.OnTimer:=@OnTimerCombat;
TimerCombat.enabled:=false;
TimerCombat.interval:= TimerCombat_Interval;
TimerForm:=TTimer.Create(nil);
TimerForm.OnTimer:=@OnTimerForm;
TimerForm.enabled:=true;
TimerForm.interval:= TimerForm_Interval;
TimerPickUp:=TTimer.Create(nil);
TimerPickUp.OnTimer:=@OnTimerPickUp;
TimerPickUp.enabled:=false;
TimerPickUp.interval:= TimerPickUp_Interval;
TimerBafBanka:=TTimer.Create(nil);
TimerBafBanka.OnTimer:=@OnTimerBafBanka;
TimerBafBanka.enabled:=false;
TimerBafBanka.interval:= 15000;
TimerCheckDB:=TTimer.Create(nil);
TimerCheckDB.OnTimer:=@OnTimerCheckDB;
TimerCheckDB.enabled:=true;
TimerCheckDB.interval:= 20*60*1000; // раз в 20 минут
frmParamIndex:=0; // создаем контролы в форме
frm:= TForm.Create(nil);
frm.Caption:= ProgramName;
frm.BorderStyle := bsDialog;
frm.Position := poScreenCenter;
frm.Width:=650;
frm.Height:=700;
frm.OnClose := @FormClose;
MobsDBscreen:=TMemo.Create(frm);
MobsDBscreen.parent:=frm;
MobsDBscreen.ReadOnly:=true;
MobsDBscreen.ScrollBars:=0;
MobsDBscreen.Top:=157;
MobsDBscreen.Width:=457;
MobsDBscreen.Height:=385;
ItemsDBscreen:=TMemo.Create(frm);
ItemsDBscreen.parent:=frm;
ItemsDBscreen.ReadOnly:=true;
ItemsDBscreen.ScrollBars:=0;
ItemsDBscreen.Top:=1;
ItemsDBscreen.Width:=300;
ItemsDBscreen.Height:=155;
panel:=TPanel.Create(frm);
panel.parent:=frm;
panel.align:=alRight;
log:=TMemo.Create(panel);
log.parent:=frm;
log.align:=alBottom;
log.ReadOnly:=true;
log.ScrollBars:=2;
log.Width:=570;
log.Height:=100;
log.Lines.Add('Лог...');
btnInit:= TButton.Create(frm);
btnInit.Name := 'btnInit';
btnInit.Parent := frm;
btnInit.SetBounds(370, 10, 75, 25);
btnInit.Caption := 'Init';
btnInit.OnClick := @BtnInit_Click;
btnStart:= TButton.Create(frm);
btnStart.Name := 'btnStart';
btnStart.Parent := frm;
btnStart.SetBounds(370, 40, 75, 25);
btnStart.Caption := 'Start';
btnStart.OnClick := @btnStart_Click;
btnStop:= TButton.Create(frm);
btnStop.Name := 'btnStop';
btnStop.Parent := frm;
btnStop.SetBounds(370, 70, 75, 25);
btnStop.Caption := 'Stop';
btnStop.OnClick := @btnStop_Click;
btnPause:= TButton.Create(frm);
btnPause.Name := 'btnPause';
btnPause.Parent := frm;
btnPause.SetBounds(370, 100, 75, 25);
btnPause.Caption := 'Pause';
btnPause.OnClick := @btnPause_Click;
l1:= TLabel.Create(frm);
l1.caption:='Фильтры:';
l1.parent:=frm;
l1.SetBounds(5, 547, 97, 17);
cbFilterRadius := TCheckBox.Create(frm);
cbFilterRadius.Name := 'cbFilterRadius';
cbFilterRadius.Parent := frm;
cbFilterRadius.SetBounds(60, 545, 97, 17);
cbFilterRadius.Caption := 'Радиус';
// cbFilterRadius.OnClick := @CheckBoxFilterClick;
textMyID:= CreateTextBox('textMyID');
CreateLabel('Мой ID :');
textX:= CreateTextBox('textX');
CreateLabel('Мой X :');
textY:= CreateTextBox('textY');
CreateLabel('Мой Y :');
textZ:= CreateTextBox('textZ');
CreateLabel('Мой Z :');
textMyHP:= CreateTextBox('textMyHP');
CreateLabel('Мой HP :');
textMyMaxHP:= CreateTextBox('textMyMaxHP');
CreateLabel('Мой MaxHP :');
textMyMP:= CreateTextBox('textMyMP');
CreateLabel('Мой MP :');
textMyMaxMP:= CreateTextBox('textMyMaxMP');
CreateLabel('Мой MaxMP :');
// textMyCP:= CreateTextBox('textMyCP');
// CreateLabel('Мой CP :');
// textMyMaxCP:= CreateTextBox('textMyMaxCP');
// CreateLabel('Мой MaxCP :');
inc(frmParamIndex);
textCenterX:= CreateTextBox('textCenterX');
CreateLabel('Ц. кач Х:');
textCenterY:= CreateTextBox('textCenterY');
CreateLabel('Ц. кач Y:');
textCenterZ:= CreateTextBox('textCenterZ');
CreateLabel('Ц. кач Z:');
textRadius:= CreateTextBox('Radius');
CreateLabel('Radius :');
inc(frmParamIndex);
textTargetID:= CreateTextBox('TargetID');
CreateLabel('Цель ID :');
textAttackCycle:= CreateTextBox('AttackCycle');
CreateLabel('Цикл атаки:');
textMobsLastIndex:= CreateTextBox('MobsLastIndex');
CreateLabel('Мобов в БД:');
textMobsKilled:= CreateTextBox('MobsKilled');
CreateLabel('Убито моб:');
inc(frmParamIndex);
textHPBottleCount:= CreateTextBox('HPBottleCount');
CreateLabel('HP бутылей:');
textBottle_1_Count:= CreateTextBox('Bottle_1_Count');
CreateLabel('Баф-Банки 1:');
textBottle_2_Count:= CreateTextBox('Bottle_2_Count');
CreateLabel('Баф-Банки 2:');
ClearDB;
frm.Show; // выводим форму на экран
buf:=#$6E;
SendToServerEx(NickName);

end;

procedure btnPause_Click(Sender: TButton);
begin
PauseGame;
end;

procedure btnStop_Click(Sender: TButton);
begin
StopGame;
end;
procedure btnStart_Click(Sender: TButton);
begin
StartGame;
end;
procedure BtnInit_Click(Sender: TButton);
begin
RestartMode:= true;
buf:= #$57; // авто релогин
// buf:= #$0F; // принудительно вызываем пакеты инвентаря и userinfo
SendToServerEx(NickName);
end;

procedure AddtoNpcTypeID_List (NpcTypeID: integer);
begin
inc(NpcTypeID_List_Count);
NpcTypeID_List[NpcTypeID_List_Count]:= NpcTypeID;
end;

procedure ClearDB; // Очистка БД
var // Надо все занулять, иначе там хрень всякая вылезает или старые данные
i : integer;
begin
ItemsLastIndex:= 0; // Очищаем переменные
TargetID:= 0;
LastKilledMobObjID:= 0;
MobsKilled:= 0;
CenterX:= 0;
CenterY:= 0;
CenterZ:= 0;
CenterFixed:= false;
Radius:= Radius_Kacha;
TimerBafBanka.interval:= 15000;
AttackCycle:= 0;
Spoiled:= false;
NpcTypeID_List_Count:= 0;
if NpcTypeID1 <> 0 then AddtoNpcTypeID_List (NpcTypeID1);
if NpcTypeID2 <> 0 then AddtoNpcTypeID_List (NpcTypeID2);
if NpcTypeID3 <> 0 then AddtoNpcTypeID_List (NpcTypeID3);
if NpcTypeID4 <> 0 then AddtoNpcTypeID_List (NpcTypeID4);
if NpcTypeID5 <> 0 then AddtoNpcTypeID_List (NpcTypeID5);
if NpcTypeID6 <> 0 then AddtoNpcTypeID_List (NpcTypeID6);
if NpcTypeID7 <> 0 then AddtoNpcTypeID_List (NpcTypeID7);
if NpcTypeID8 <> 0 then AddtoNpcTypeID_List (NpcTypeID8);
if NpcTypeID9 <> 0 then AddtoNpcTypeID_List (NpcTypeID9);
if NpcTypeID10<> 0 then AddtoNpcTypeID_List (NpcTypeID10);
if NpcTypeID_List_Count = 0 then
for i:=1 to NpcTypeID_List_Razmer do NpcTypeID_List[i]:= 0;
NpcTypeID_CurrentMob:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
end;
btnStop.enabled:=false;
btnPause.enabled:= false;
end;

function Wait(var tick: integer; Timewait: Integer): Boolean; // сквозная проверка без остановки скрипта (c)dmitry501, modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;

//############################## Модуль работы с Инвентарем ###########################
procedure InventoryCreate;
var
i,k, offset : integer;
begin
offset:= 76;
CurrentInvRazmer:=ReadH(4);
for i:=0 to InvRazmer do
if i < CurrentInvRazmer then begin
Inventory[i,0]:=ReadH(i*offset+6); // itemType1
Inventory[i,1]:=ReadD(i*offset+8); // ObjectId
Inventory[i,2]:=ReadD(i*offset+12); // ItemID
Inventory[i,3]:=ReadD(i*offset+20); // count
Inventory[i,4]:=ReadH(i*offset+24); // itemType2
Inventory[i,5]:=ReadH(i*offset+26); // CustType1
Inventory[i,6]:=ReadH(i*offset+28); // isEquipped
Inventory[i,7]:=ReadD(i*offset+30); // BodyPart
Inventory[i,8]:=ReadH(i*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(i*offset+36); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;

procedure InventoryUpdate;
var
i,j,k, offset: integer;
begin
offset:= 82;
for j:=0 to (ReadH(2)-1) do
begin
case pck[j*offset+4] of
#$01: k:=0; // add item, запишет на пустую ячейку
#$02: k:=ReadD(j*offset+8); // mod item
#$03: begin // remove item, обнулит ячейки удаленного предмета
k:=ReadD(j*offset+8);
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
for k:=0 to 9 do Inventory[i,k]:=0;
exit;
end;
end;
end;
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
Inventory[i,0]:=ReadH(j*offset+6); // itemType1
Inventory[i,1]:=ReadD(j*offset+8); // ObjectId
Inventory[i,2]:=ReadD(j*offset+12); // ItemID
Inventory[i,3]:=ReadD(j*offset+20); // count
Inventory[i,4]:=ReadH(j*offset+24); // itemType2
Inventory[i,5]:=ReadH(j*offset+26); // CustType1
Inventory[i,6]:=ReadH(j*offset+28); // isEquipped
Inventory[i,7]:=ReadD(j*offset+30); // BodyPart
Inventory[i,8]:=ReadH(j*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(j*offset+36); // CustType2
break;
end;
end;
end;

function GetInv(obj,up,down:integer): integer; // up и down не проверяются
var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
i: integer;
begin
for i:=0 to CurrentInvRazmer do if (Inventory[i,up]=obj) then
begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;

{procedure UseItemID(ItemID:integer); //Использовать предмет с заданным ItemID
var
ObjItemID : integer;
begin
ObjItemID:= GetInv(ItemID,2,1);
if ObjItemID = -1 then exit;
buf:=#$14;
WriteD(ObjItemID);
WriteD(0);
SendToServerEx(NickName);;
end;}

procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemObjID
begin
buf:=#$19;
WriteD(ItemObjID);
WriteD(0);
SendToServerEx(NickName);;
end;
//################################################## ##########################################

function rastoyanie(NpcX, NpcY, NpcZ : integer) : longint; // вычисление растояния между 2 точками
var
dx,dy,dz : integer;
summa : longint;
begin
try
dx:= NpcX-CenterX;
dy:= NpcY-CenterY;
dz:= NpcZ-CenterZ;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
if abs(dz) > vertical then result := result + OblastVidimosti; // добавляем коррекцию по вертикали
except
sendmsg('Ошибка вычисления расстояния');
sendmsg('dx= '+ inttostr(dx));
sendmsg('dy= '+ inttostr(dy));
sendmsg('dz= '+ inttostr(dz));
sendmsg('summa= '+ inttostr(summa));
result := OblastVidimosti;
end;
end;

function RastoyanieToMe(NpcX, NpcY : integer) : integer; // вычисление растояния между 2 точками
var
dx,dy, summa : integer;
begin
dx:= NpcX-MyX;
dy:= NpcY-MyY;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
end;

procedure AddDroppedItem (ObjID, ItemID, X, Y, Z: integer); // Процедура добавляет дропнутую вещь в БД
begin
if ItemsLastIndex = maximumItems then ItemsLastIndex:=0; // обход переполнения базы предметов
inc (ItemsLastIndex);
Items_ObjectID[ItemsLastIndex]:= ObjID;
Items_ItemID[ItemsLastIndex]:= ItemID;
Items_XYZ[ItemsLastIndex, OX]:= X;
Items_XYZ[ItemsLastIndex, OY]:= Y;
Items_XYZ[ItemsLastIndex, OZ]:= Z;
// log.Lines.Add('Вещь добавлена, индекс в БД: '+ inttostr(ItemsLastIndex));
end;

procedure AddtoDB (id, TypeID, x,y,z : integer; IsAttackable : boolean); // Процедура добавляет в БД нового моба
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti; // вычиляем расстояние от центра кача до моба
if dist > (OblastVidimosti) then exit; // если моб слишко далеко то ничего не делаем
inc (MobsLastIndex); // увеличиваем размер БД
// log.Lines.Add('Моб добавлен, индекс в БД:'+ inttostr(MobsLastIndex));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsObjID[MobsLastIndex]:= id; // Записываем моба
MobsNpcTypeID[MobsLastIndex]:= TypeID;
MobsDist[MobsLastIndex]:= dist;
MobsXYZ[MobsLastIndex, OX]:= x;
MobsXYZ[MobsLastIndex, OY]:= y;
MobsXYZ[MobsLastIndex, OZ]:= z;
MobsIsAttackable[MobsLastIndex]:= IsAttackable;
MobsAgression[MobsLastIndex]:= false;
MobsUpdated[MobsLastIndex]:= true;
end;

procedure UpdateDB (i, x,y,z : integer; agression : boolean); // Процедура обновляет данные в БД по мобу
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti;
if dist > (OblastVidimosti) then DelDBItem(i) else // перепроверяем расстояние до моба, если он вышел за границу кача, то удаляем его
begin
// log.Lines.Add('Моб обновлен, индекс в БД:'+ inttostr(i));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsDist[i]:= dist; // записываем данные
MobsXYZ[i, OX]:= x;
MobsXYZ[i, OY]:= y;
MobsXYZ[i, OZ]:= z;
if (not MobsAgression[i]) then MobsAgression[i]:= agression;
MobsUpdated[i]:= true;
end;
end;

procedure DelDBItem (i: integer); // процедура удалаяет моба из БД
begin
// log.Lines.Add('Моб удален, индекс в БД: '+ inttostr(i));
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:= 0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsAgression[i]:= false;
MobsIsAttackable[i]:= false;
MobsUpdated[i]:= false;
if i < MobsLastIndex then // если надо, производим сдвиг данных в массивах
begin
MobsObjID[i]:= MobsObjID[MobsLastIndex];
MobsNpcTypeID[i]:= MobsNpcTypeID[MobsLastIndex];
MobsDist[i]:= MobsDist[MobsLastIndex];
MobsXYZ[i, OX]:= MobsXYZ[MobsLastIndex, OX];
MobsXYZ[i, OY]:= MobsXYZ[MobsLastIndex, OY];
MobsXYZ[i, OZ]:= MobsXYZ[MobsLastIndex, OZ];
MobsIsAttackable[i]:= MobsIsAttackable[MobsLastIndex];
MobsAgression[i]:= MobsAgression[MobsLastIndex];
MobsUpdated[i]:= MobsUpdated[MobsLastIndex];
end;
dec (MobsLastIndex); // уменьшаем размер БД
end;

procedure DelDroppedItem (i: integer); // процедура удалаяет вещь из БД
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
// log.Lines.Add('Вещь удалена, индекс в БД: '+ inttostr(i));
if i < ItemsLastIndex then
begin
Items_ObjectID[i]:= Items_ObjectID[ItemsLastIndex];
Items_ItemID[i] := Items_ItemID[ItemsLastIndex];
Items_XYZ[i, OX]:= Items_XYZ[ItemsLastIndex, OX];
Items_XYZ[i, OY]:= Items_XYZ[ItemsLastIndex, OY];
Items_XYZ[i, OZ]:= Items_XYZ[ItemsLastIndex, OZ];
end;
dec (ItemsLastIndex);
end;

function CheckItems (id: integer) : integer; // функция проверяет наличие заданной вещи в БД
var
i: integer;
begin
result:= 0;
for i:=1 to ItemsLastIndex do if Items_ObjectID[i] = id then
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function TestPovtor (id: integer) : integer; // функция проверяет наличие заданного моба в БД
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsObjID[i] = id then // Ищем нужный ID в нашей БД
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function InMobsList (NpcTypeID: integer) : boolean; // функция проверяет наличие заданного моба в списке на атаку
var
i: integer;
begin
result:= false;
for i:=1 to NpcTypeID_List_Count do if NpcTypeID_List[i] = NpcTypeID then result:= true; // проверяем по списку
end;

procedure SendMsg_to_CL(msg:string); // отправка системных сообщений клиенту
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(NickName);
end;

procedure OnTimerCheckDB (Sender: TObject);
var
i: integer;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if MobsUpdated[i] then MobsUpdated[i]:=false
else
begin
DelDBItem(i);
dec(i);
end;
end;
end;

procedure PrepareDB;
var
i: integer;
//dist : double;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if InMobsList(MobsNpcTypeID[i]) then MobsIsAttackable[i]:= true;
MobsDist[i] := rastoyanie (MobsXYZ[i, OX], MobsXYZ[i, OY], MobsXYZ[i, OZ]);
if MobsDist[i] >= OblastVidimosti then
begin
// DelDBItem(i);
// dec(i);
end;
end;
end;

function ValidateData : boolean; // функция проверки правильности задания всех параметров для начала кача
begin
if (MyX <> 0) and (MyY <> 0) and (MyZ <> 0) and (MyID <> 0) and (MyHP > 0) and (MyMaxHP > 0) and // верификация всех данных, чтобы потом в боевом режиме
(MyMP > 0) and (MyMaxMP > 0) and {(MyCP <> 0) and (MyMaxCP <> 0) and } // не перепроверять все данные по 100 раз
(CenterX <> 0) and (CenterY <> 0) and (CenterZ <> 0) and (Radius > 0) and (NpcTypeID_List_Count > 0) then
begin
PrepareDB;
SendMsg_to_CL('Все начальные параметры заданы и проверены!');
log.Lines.Add('Все начальные параметры заданы и проверены!');
result:= true;
end
else
begin
SendMsg_to_CL('Ошибка задания начальных параметров!');
log.Lines.Add('Ошибка задания начальных параметров!');
result:= false;
end;
end;

procedure UserCommands; // комманды пользователя
var
i: integer;
begin // если комманда обработана удачно, то в чат сообщение не попадет, а будет выдано системное сообщение прямо в клиент
if InitMode then case (ReadS(2)) of
'pos' : if MyX <> 0 then // центр кача
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
CenterFixed:= true;
SendMsg_to_CL('Центр кача задан успешно!');
log.Lines.Add('Центр кача задан успешно!');
pck:='';
end;
'dist' : if (CenterX <> 0) and (MyX <> 0) then // радиус кача
begin
CenterFixed:= true;
Radius:= rastoyanie (MyX,MyY,MyZ);
SendMsg_to_CL('Радиус кача задан успешно');
SendMsg_to_CL('R= '+ inttostr(Radius));
log.Lines.Add('Радиус кача задан успешно, R = '+ inttostr(Radius));
pck:='';
end;
'reset': begin // сброс параметров
ClearDB;
SendMsg_to_CL('БД очищена, введите заново все параметры');
log.Lines.Add('БД очищена!');
pck:='';
end;
'1', '2', '3', '4', '5', '6', '7', '8', '9', '10' : // задаем мобов
begin
if (NpcTypeID_List_Count+1) <> strtoint(ReadS(2)) then
begin
SendMsg_to_CL('Добавлять мобов можно тока по очереди 1, 2, 3...');
pck:='';
exit;
end;
NpcTypeID_CurrentMob:= strtoint(ReadS(2));
SendMsg_to_CL('Добавляем моба № '+ ReadS(2));
pck:='';
i:= TestPovtor (TargetID);
if i > 0 then
begin
NpcTypeID_List[NpcTypeID_CurrentMob]:= MobsNpcTypeID[i];
SendMsg_to_CL('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
log.Lines.Add('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
inc(NpcTypeID_List_Count);
NpcTypeID_CurrentMob:= 0;
TargetID:= 0;
end;
end;
'start': begin // собственно запуск бота
pck:='';
StartGame;
end;
end;
if (not InitMode) then case (ReadS(2)) of
'pause' : begin
pck:='';
PauseGame;
end;
'stop' : begin
pck:='';
StopGame;
end;
end;
end;

procedure PauseGame;
begin
TimerCombat.enabled:= not(TimerCombat.enabled);
TimerBafBanka.enabled:= not(TimerBafBanka.enabled);
if TimerCombat.enabled then
begin
btnPause.Caption:='Pause';
TimerBafBanka.interval:= 15000;
SendMsg_to_CL('Искуственный интелект запущен!');
log.Lines.Add('Искуственный интелект запущен!');
end
else
begin
btnPause.Caption:='Repeat';
SendMsg_to_CL('Искуственный интелект приостановлен.');
log.Lines.Add('Искуственный интелект приостановлен.');
end;
end;

procedure StartGame;
begin
if ValidateData and InitMode then
begin
CenterFixed:= true;
SendMsg_to_CL('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
log.Lines.Add('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
TargetID:=0;
InitMode:= false;
TimerCombat.enabled:=true; // запускаем таймер
TimerBafBanka.interval:= 15000;
TimerBafBanka.enabled:= true;
btnStart.enabled:= false;
btnStop.enabled:= true;
btnPause.enabled:= true;
end
else
begin
SendMsg_to_CL('Еще не все параметры заданы. Проверьте параметры...');
log.Lines.Add('Еще не все параметры заданы. Проверьте параметры...');
end;
end;

procedure StopGame; // остановка кача
begin
TimerCombat.enabled:= false;
InitMode:= true;
TimerPickUp.enabled:=false;
TimerBafBanka.enabled:=false;
TargetID:= 0;
ClearDB;
SendMsg_to_CL('Искуственный интелект остановлен.');
log.Lines.Add('Искуственный интелект остановлен.');
btnStart.enabled:= true;
btnStop.enabled:= false;
btnPause.Caption:= 'Pause';
btnPause.enabled:=false;
end;

function GetMinDistID : integer; // функция поиска ближайшего моба в БД
var
i, Dist, MinDist : integer;
begin
result:= 0;
if MobsLastIndex = 0 then exit;
MinDist:=RastoyanieToMe(MobsXYZ[1,OX], MobsXYZ[1,OY]);
for i:=1 to MobsLastIndex do if (MobsDist[i] <= Radius) and (MobsIsAttackable[i]) then
begin
Dist:= RastoyanieToMe(MobsXYZ[i,OX], MobsXYZ[i,OY]);
if Dist <= MinDist then
begin
Dist:= MinDist;
result:= i;
end; // если нашли хоть одного моба или несколько, товозращаем индекс ближайшего
end;
end;

function AgroTest : integer; // функция проверяет, атакует ли меня кто-нибудь или нет
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsAgression[i] then // ищем первого попавшегося моба, который нас атакует
begin
result:= i; // возвращаем его индекс по БД
break;
end;
end;

procedure PhisicalAttack; // команда атаки
begin
buf:=#$1F; //action
WriteD(TargetID);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(0);
SendToServerEx(NickName);
end;
procedure RequestMagicSkillUse (SkillID: integer); // маг атака
begin
buf:=#$39;
WriteD(SkillID);
WriteD(0);
WriteC(0);
SendToServerEx(NickName);
end;

procedure InitPickUpMode(mode: boolean);
begin
if mode then
begin
PickUpMode:= true;
TimerCombat.enabled:= false;
TimerPickUp.enabled:= true;
end
else
begin
PickUpMode:= false;
TimerCombat.enabled:= true;
TimerPickUp.enabled:= false;
end;
end;

procedure OnTimerBafBanka (Sender: TObject); // таймер питья баф-банок
begin
if (Bottle_1_Count > 0) and (Bottle_1_ObjID > 0) then
begin
UseItemObjID(Bottle_1_ObjID);
dec (Bottle_1_Count);
end;
if (Bottle_2_Count > 0) and (Bottle_2_ObjID > 0) then
begin
UseItemObjID(Bottle_2_ObjID);
dec (Bottle_2_Count);
end;
TimerBafBanka.interval:= Bottle_Interval*60*1000;
end;

procedure OnTimerPickUp (Sender: TObject); // таймер поднятия дропа
var
povtor: integer;
begin
if (AgroTest > 0) then
begin
TargetID:= 0;
InitPickUpMode(false);
exit;
end;
if (ItemsLastIndex > 0) and (TargetID = 0) then
begin
TargetID:= Items_ObjectID[ItemsLastIndex];
AttackCycle:= 0;
PhisicalAttack;
exit;
end;
if (ItemsLastIndex > 0) and (TargetID > 0) then
begin
inc (AttackCycle);
if ((AttackCycle mod 5) = 0) then PhisicalAttack;
if AttackCycle > Calculated_PickUpTime then
begin
Povtor:= CheckItems(TargetID);
if Povtor <> 0 then DelDroppedItem(Povtor);
TargetID:= 0;
end;
exit;
end;
if ItemsLastIndex = 0 then InitPickUpMode(false);
end;

procedure OnTimerCombat (Sender: TObject); // боевой таймер, вся логика поведения бота находится именно здесь!!!
var
Agro, MinDistID, i: integer;
begin
if TargetID > 0 then // если в прицеле есть моб, то
begin // валим вражину
if ((AttackCycle mod 5) = 0) then
begin
if Spoil and (not Spoiled) then RequestMagicSkillUse(254) // заспойлим моба если опция включена
else PhisicalAttack;
end;
inc(AttackCycle);
if AttackCycle > Calculated_AttackTime then // если валим моба больше минуты, значит это баг...
begin
i:= TestPovtor(TargetID);
if i > 0 then
begin
MobsIsAttackable[i]:= false; //DelDBItem(i);
MobsAgression[i]:= false;
end;
TargetID:= 0;
end;
exit;
end;
Agro:= AgroTest;
if Agro > 0 then // если нас кто-то атакует, то его и выбираем
begin
TargetID:= MobsObjID[Agro];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if ItemsLastIndex > 0 then // если чего-то валяется на земле, то
begin
InitPickUpMode(true); // надо дроп подбирать
exit;
end;
MinDistID:= GetMinDistID; // запускаем алгоритм выбора цели
if MinDistID > 0 then // иначе ищем ближайшего
begin
TargetID:= MobsObjID[MinDistID];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if (abs(MyX-CenterX) > 20) and (abs(MyY-CenterY) > 20) then MoveTo (CenterX, CenterY, CenterZ);
end;

procedure MoveTo(TargetX,TargetY,TargetZ:integer); //Идти в точку с координатами x,y,z
begin
buf:=#$0F; //01=MoveBackwardToLocation:d(targetX)d(targetY)d(ta rgetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
WriteD(targetx); //куда
WriteD(targety);
WriteD(targetz);
WriteD(MyX); //откуда
WriteD(MyY);
WriteD(MyZ);
WriteD(1); //используем 1-мышь 0-клавиатура
SendToServerEx(NickName);
end;

procedure OnTimerForm (Sender: TObject); // таймер обновления данных в форме
var
i: integer;
begin
textMyID.text:= inttostr(MyID); // обновляем данные в окне
textX.text:= inttostr(MyX);
textY.text:= inttostr(MyY);
textZ.text:= inttostr(MyZ);
textMyHP.text:= inttostr(MyHP);
textMyMaxHP.text:= inttostr(MyMaxHP);
textMyMP.text:= inttostr(MyMP);
textMyMaxMP.text:= inttostr(MyMaxMP);
// textMyCP.text:= inttostr(MyCP);
// textMyMaxCP.text:= inttostr(MyMaxCP);
textCenterX.text:= inttostr(CenterX);
textCenterY.text:= inttostr(CenterY);
textCenterZ.text:= inttostr(CenterZ);
textRadius.text:= inttostr(Radius);
textTargetID.text:= inttostr(TargetID);
textAttackCycle.text:= inttostr(AttackCycle);
textMobsLastIndex.text:= inttostr(MobsLastIndex);
textMobsKilled.text:= inttostr(MobsKilled);
textHPBottleCount.text:= inttostr(HPBottleCount);
textBottle_1_Count.text:= inttostr(Bottle_1_Count);
textBottle_2_Count.text:= inttostr(Bottle_2_Count);

MobsDBscreen.lines.Clear;
for i:=1 to MobsLastIndex do // выводим БД мобов
begin
if (TargetID = MobsObjID[i]) and MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if TargetID = MobsObjID[i] then
begin
MobsDBscreen.lines.add ('-> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if cbFilterRadius.checked then if MobsDist[i] <= Radius then
begin
MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if (not cbFilterRadius.checked) then MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
end;
ItemsDBscreen.lines.Clear; // выводим БД дропа
for i:=1 to ItemsLastIndex do ItemsDBscreen.lines.add ('индекс в БД: '+inttostr(i)+' объект ID: '+inttostr(Items_ObjectID[i])+' ID вещи: '+inttostr(Items_ItemID[i]));
if MobsLastIndex = 0 then MobsDBscreen.lines.add ('Мобы');
if ItemsLastIndex= 0 then ItemsDBscreen.lines.add('Дроп');
end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure CreateLabel (text: string); // процедура автоматизирует создание текстовых меток в форме
var
l: TLabel;
begin
l:= TLabel.Create(panel);
l.caption:=text;
l.parent:=panel;
l.left:=10;
l.top:=15+20*frmParamIndex;
inc(frmParamIndex);
end;

function CreateTextBox (text:string) :TEdit; // функция автоматизирует создание текстовых полей для вывода данных в форме
var
e: TEdit;
begin
e:= TEdit.Create(panel);
e.text:=text;
e.parent:=panel;
e.left:=80;
e.top:=10+20*frmParamIndex;
e.width:= 95;
e.ReadOnly:=true;
result:= e;
end;

procedure Free; //Вызывается при выключении скрипта
begin
ClearDB;
TimerForm.free;
TimerCombat.free;
TimerPickUp.free;
TimerBafBanka.free;
TimerCheckDB.free;
MobsDBscreen.free;
ItemsDBscreen.free;
log.free;
frm.free;
end;

procedure UserInfo; // обновление данных о себе
var
i:word;
begin
if InitMode then MyID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
i:=22;
ReadS(i);
i:=i+48;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
// i:=i+363; //пока не используется
// MyMaxCP:=ReadD(i);
// MyCP:=ReadD(i);
end;

procedure StatusUpdate; // обновление данных о себе
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: MyHP:=ReadD(i*8+14);
#$0A: MyMaxHP:=ReadD(i*8+14);
#$0B: MyMP:=ReadD(i*8+14);
#$0C: MyMaxMP:=ReadD(i*8+14);
// #$21: MyCP:=ReadD(i*8+14); //пока не используется
// #$22: MyMaxCP:=ReadD(i*8+14);
end;
if MyMaxHP > 0 then HPlevelProcent:= Round((MyMaxHP/100)*HPLevel);
end;

procedure DrinkBottle; // пьем бутылки и следим за их количеством
begin
if (HPBottleCount > 0) and (HPBottleObjID > 0)then
begin
UseItemObjID(HPBottleObjID);
dec (HPBottleCount);
end;
end;

procedure MoveToLocation01;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then updateDB(i, ReadD(06), ReadD(10), ReadD(14), false);
end;

procedure NpcInfo16;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then AddtoDB (ReadD(2), ReadD(6), ReadD(14), ReadD(18), ReadD(22), InMobsList(ReadD(6)))
else UpdateDB(i, ReadD(14), ReadD(18), ReadD(22), false);
end;

procedure Attack05;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then log.Lines.Add('Глюк, моб не найден, или нас утакует другой игрок!!!')
else UpdateDB(i, ReadD(15), ReadD(19), ReadD(23), true);
end;

procedure Die06;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then
if MobsObjID[i] = TargetID then
begin
TimerCombat.enabled:= false;
if Spoil and Spoiled then
if ReadD(22) = 1 then RequestMagicSkillUse(42);
LastKilledMobObjID:=TargetID;
inc (MobsKilled); // подводим статистику
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
Spoiled:= false;
TargetID:= 0;
TimerCombat.enabled:= true;
end;
end;

procedure DeleteObject12;
var
i: integer;
begin
if LastKilledMobObjID = ReadD(2) then
begin
LastKilledMobObjID:= 0;
i:= TestPovtor(ReadD(2));
if i > 0 then DelDBItem(i);
exit;
end;
i:= CheckItems(ReadD(2));
if i > 0 then
begin
if Items_ObjectID[i] = TargetID then TargetID:= 0;
DelDroppedItem(i);
exit;
end;
i:= TestPovtor(ReadD(2));
if i > 0 then
begin
if TargetID = ReadD(2) then TargetID:= 0;
DelDBItem(i);
exit;
end;
end;

begin
if pck = '' then exit;
if (ConnectName = NickName) and FromServer then // разбор пакетов от сервера
case pck[1] of
#$01: MoveToLocation01; // MoveToLocation:h(ObjectID)d(CurX)d(CurY)d(CurZ)d(D estX)d(DestY)d(DestZ)
// #$03: ; // CharInfo:d(X)d(Y)d(Z)-(4)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)-(4)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs) i(Feet)i(Back)i(LRHand)i(Hair)d(PvPFlag)d(Carma)d( MSpeed)d(PSpeed)d(PvpFlag)d(Karma)d(RunSpeed)d(Wal kSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed )d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(Move mentSpeedMultiplier)f(AttackSpeedMultiplier)f(Coll isionRadius)f(CollisionHeight)d(HairStyle)d(HairCo lor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCr estId)d(AllyId)d(AllyCrestId)d(SiegeFlags)b(Sittin g)b(Running)b(InCombat)b(AlikeDead)b(Invisible)b(M ountType)b(PrivateStoreType)
#$04: if ReadS(22) = NickName then // UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Name)d (Race)d(Sex)d(ClassID)d(Level)d(Exp)d(STR)d(DEX)d( CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurrentHP)d(MaxMP) d(CurrentMP)d(SP)d(CurrentLoad)d(MaxLoad)d(Unknown )d(Under)d(REar)d(LEar)d(Neck)d(RFinger)d(LFinger) d(Head)d(RHand)d(LHand)d(Gloves)d(Chest)d(Legs)d(F eet)d(Back)d(LRHand)d(Hair)i(Under)i(REar)i(LEar)i (Neck)i(RFinger)i(LFinger)i(Head)i(RHand)i(LHand)i (Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Ha ir)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accurac y)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef) d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRun Speed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d (FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultipl ier)f(AttackSpeedMultiplier)f(CollisionRadius)f(Co llisionHeight)d(HairStyle)d(HairColor)d(Face)d(Acc essLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d (AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateS toreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cub ics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b ()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLef t)b()b(RecomHave)b()
begin
UserInfo;
btnInit.enabled:= false;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$05: if (ReadD(6) = MyID) and (not InitMode) then Attack05; // 05= Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d( X)d(Y)d(Z)h(Hits)
#$48: begin; // 48= MagicSkillUse:h(CharID)h(targetID)d(skillID)d(skil lLvl)d(hitTime)d(reuseDelay)d(X)d(Y)d(Z)w(count)d( d)d(d)d(d)
if (ReadD(2) = MyID) and (ReadD (6) = TargetID) and (ReadD(10) = 254) then Spoiled:= true;
end;
#$06: Die06; // Die:d(ChaID)
#$0C: if LastKilledMobObjID = ReadD(2) then // DropItem:h(PlayerID)h(ObjectID)i(ItemID)d(X)d(Y)d( Z)d(Stackable)d(Count)
begin
AddDroppedItem(ReadD(6), ReadD(10), ReadD(14), ReadD(18), ReadD(22));
end;
#$0D: if TargetID = ReadD(6) then // GetItem:d(PlayerID)h(ObjectID)d(X)d(Y)d(Z)
begin
TargetID:= 0;
end;
#$0E: if MyID=ReadD(2) then // StatusUpdate:h(ObjectID)d(Attributes)
begin
StatusUpdate;
if (MyHP > 0) and (MyHP < HPlevelProcent) then if Wait(time1,DrinkDelay) then DrinkBottle; // пьем бутылки
if MyHP > HPlevelProcent then time1:=1;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$12: DeleteObject12; // DeleteObject:h(ObjectID)
#$16: if (ReadD(10)=1) and (pck[121]=#$00) then NpcInfo16; // NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X) d(Y)d(Z)d(Heading)d(Unknown)d(MAtkSpd)d(PAtkSpd)d( RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRu nSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(Proper Multiplier)f(PAtkSpd)f(CollisionRadius)f(Collision Height)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRun ning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Nam e)s(Title)
#$1B: begin
InventoryCreate; // Инвентарь
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$27: begin
InventoryUpdate;
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$13: if RestartMode then // CharacterSelectionInfo
begin
buf:=#$12; // CharacterSelected
WriteD(CharNumber);
buf:= buf + hstr('00 00 00 00 00 00 00 00 00 00 00 00 00 00');
SendToServerEx(NickName);
RestartMode:= false;
end;
end;

if (ConnectName = NickName) and FromClient then // разбор пакетов от клиента
case pck[1] of
#$1F: if InitMode then TargetID:= ReadD(2); // Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b( ActionID)
#$49: UserCommands; // Say2:s(Text)d(Type)s(Target)
#$59: begin // ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
MyX:= ReadD(2);
MyY:= ReadD(6);
MyZ:= ReadD(10);
if (not CenterFixed) and InitMode then
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
end;
end;
end;

end.



хмм, это с пакетами отредактированный ?
домой приду проверю... просто вчера пробовал все передал, но команды из чата не воспринимал (

NLObP
13.04.2009, 12:59
хмм, это с пакетами отредактированный ?
домой приду проверю... просто вчера пробовал все передал, но команды из чата не воспринимал (

Да, у меня работает, пробовал человеком-воином в талкин исланде.

DashKAaa
13.04.2009, 13:33
если работает то спасибо те, сравню со своим изменением погляжу в чем ошибка.. но я вроде подозреваю в чем.. в процедуре вывода сообщения, пакет стоит не тот... хотя ставил его как в с4...
а споил, буфф, пакеты так же придется менять? или в них достаточно поменять пакет на захват инветнаря, что бы обновить чар инфо? т.е не лечит он вроде по той самой причине т.к не видит парти игрока хп...

NLObP
13.04.2009, 13:58
если работает то спасибо те, сравню со своим изменением погляжу в чем ошибка.. но я вроде подозреваю в чем.. в процедуре вывода сообщения, пакет стоит не тот... хотя ставил его как в с4...
а споил, буфф, пакеты так же придется менять? или в них достаточно поменять пакет на захват инветнаря, что бы обновить чар инфо? т.е не лечит он вроде по той самой причине т.к не видит парти игрока хп...

Я все пакеты не проверял, но судя по тому что пакет ItemList форматом от грации а с айди от интерлюда, то наверное и другие такие же.

DashKAaa
13.04.2009, 20:06
Пробуйте бота:

Const ProgramName =
'Бот - локомотив от Alexus '+
'версия : 0.5.2 (for Abyss) '+
'дата: 13.04.09';
{################################################# ############################
Описание:
Бот для соло-кача в принципе любого война. По функциональности (в режиме кача) это еще не Волкер, но скрипт уже довольно умный :)
Охотиться только на заданных мобов.

Возможности:
- запоминает центр и радиус кача
- запоминает список мобов на которых надо охотиться!
- запоминает и затем подбирает дроп, упавший с убитых им мобов
- умеет лечиться банками (тип банки легко настраивается), ведется учет количества оставшихся банок
- управляется из окна чата в самом клиенте
- имеет окно для вывода всех параметров и статистики
- если моб по какой-то причине стал недосягаемым (стоит за деревом), то через 1 мин БОТ переключится на другого моба.
- если бот умирает, то не палимся и прекращаем рыпаться...(скоро появиться возможность логаута)
- пьет баф-банки
- работает под РУ-ОФФ Gracia, но для этого нужно обойти щит-консоль
- умеет спойлить (функция новая, нужно тестить)

Недостатки: (со временем будет исправлено)
- бот не умеет обходить препядствия

История версий:
0.1 - самое начало :)
0.2 - куча глюков, первая рабочая версия!
0.3 - первая стабильная безглючная версия, с минимальной функциональностью (самая стабильная, но очень простая)
0.4 - изменения:
- радиус кача можно задать в секции настройки
- бот теперь сразу видит всю локацию с самого запуска скрипта
- автоопределение размера инвентаря
- ID мобов можно теперь задавать в секции настройки
- ускорен процесс добавление мобов через клиент (теперь их не надо гасить)
- отключена ф-ция автоопределения своего ID и инвентаря, по этому запускать теперь бот надо до запуска клиента
- обновлено окно вывода информации (теперь его нельзя случайно закрыть!)
- на форму добавлены кнопки управления
- добавлена кнопка "Init" в окно управления, теперь бота можно запускать в любом месте, затем нажать эту кнопку
- добавлен механизм глотания баф-банок
- оптимизирован алгоритм выбора ближайшего моба
- скрипт доработан для новых версий пакетхака (данная версия разработана под пакетхак версии 3.4.1.69)
- в режиме кача, при отсутствии мобов в радиусе, бот возвращается в центр кача
- устранена ошибка, связянная с неправильным распознованием пакета 01 - MoveToLocation
0.5 - модификация под РУ-ОФФ Gracia
- добавлен споил
- убрана ошибка, вылезающая после нажатия кнопки Init
- немного подправлен алгоритм работы с инвентарем

Инструкция:
1. Внимательно НАСТРАИВАЕМ параметры в секции настройки
(90% ошибок и последующих глюков в скрипте вылезает именно отсюда!!!), жмем кнопку "Сохранить"
2. Запускаем ПакетХак, запускаем скрипт, запускаем игрового клиента.
либо запускаем скрипт после захода в игру, и жмем кнопку на форме "Init"
3. Добираемся до места кача
4. Выбираем в таргет моба на которого хотим охотится и отправляем в общий чат-> 1
5. Выбираем следующего моба отправляем в общий чат цифру 2, и т.д. можно выбрать до 10 разных тварей.
6. Либо просто в секции настройки задаем ID мобов
7. Становимся в центр кача и отправляем в общий чат-> pos , если все правильно то в чате будет выдано сообщение, что координаты заданы.
8. Бежим к краю радиуса кача и отправляем в общий чат-> dist, в чате вылезет сообщение от системы, что радиус задан.
9. Если радиус кача задан в секции настройки, то п.7 и 8 можно пропустить!!! становимся примерно в центр кача и отправляем в общий чат-> start ,
если все сделано верно, то будет выдано соответствующее сообщение.
10.Если бот поймал моба в таргет и побежал его атаковать, то можно свернуть окно игры
и смотреть на информационное окно скрипта.

В процессе кача, в общий чат можно посылать следующие управляющие команды:
pause - пауза, можно приостановить бота, повторная комманда pause запустит бота
stop - срочная остановка бота, и сброс всех настроек, повторный запуск возможен командой start

Также можно управлять ботом одноименными кнопками с формы.
################################################## ###########################}

//################### Сеция настройки бота ############################################
NickName = 'NLObP'; // Твой ник в игре
CharNumber = 0; // если больше одного перса на аккаунте, то задаем его порядковый номер, нумерация начинается с нуля.
Radius_Kacha = 2000; // Радиус кача, если 0 - то задавать вручную через клиента (изменять от 100 до 9999). Проверил на практике, что максимум не более 2000.
Spoil = false; // Споил false - откл, true - вкл. (только для гномов-спойлеров)
//-------------------------------------------------------------------------------------
HPLevel = 70; // Уровень жизни в %, при котором начинаем глотать банки
HPBottleID = 0; // ItemID 1060=Lesser Healing Potion; 1061=Healing Potion; 1539=Greater Healing Potion;
DrinkDelay = 14; // минимальное время задержки повторного питься HP-бутылки (10 - 20 сек).
//---------------------------------------------------------------------------------------
Bottle_1_ID = 0; // ID номера баф-банок, 6036=Greater Magic Haste Potion, 6035=Magic Haste Potion, 1374=Greater Haste Potion, 1062=Haste Potion, 734=Haste Potion
Bottle_2_ID = 0; // если 0 - то не использовать. 1375=Greater Swift Attack Potion, 735=Potion of Alacrity
Bottle_Interval = 19; // Время задержки повторного использования бутылей в минутах (изменять от 1 до 100)
//----------------------------------------------------------------------------------------

//############# Секция расширенной настройки для опытных ботоводеров :) ###################################
TimerCombat_Interval = 500; // частота срабатывания таймера атаки в милисекундах, чем меньше это число, тем быстрее бот будет думать.
TimerPickUp_Interval = 500; // частота срабатывания таймера сбора дропа, чем меньше это число, тем быстрее бот будет думать.
TimerForm_Interval = 2500; // частота срабатывания таймера обновления формы, чем меньше это число, тем быстрее будут обновляться данные в форме.
Attack_Time = 45; // Время на убивание моба в секундах.
PickUp_Time = 15; // Врямя на поднятие дропа в секундах.
Vertical = 1000; // Вертикальный радиус кача
//---------------------------------------------------------------------------------------
NpcTypeID1 = 0; // Если знаем, то задаем Type ID мобов, на которых будем охотиться
NpcTypeID2 = 0; // Если здесь одни нули, то задавать мобов будем через клиента
NpcTypeID3 = 0; // Для интерлюда задаем в формате 102xxxx , где xxxx - ID моба
NpcTypeID4 = 0; // Для С4 в формате 100хххх , где xxxx - ID моба
NpcTypeID5 = 0; // Для Gracia формат пока не смотрел...
NpcTypeID6 = 0;
NpcTypeID7 = 0;
NpcTypeID8 = 0;
NpcTypeID9 = 0;
NpcTypeID10 =0;
//################################################## ######################################
NpcTypeID_List_Razmer = 10; // Размер списка мобов (не трогать!)
OX = 1; OY = 2; OZ= 3; // Служебные константы
maximumItems = 500; // Размер базы мобов и дропа.
OblastVidimosti = 500000; // (не трогать!!!) Область видимости объектов (изменять от 1000 до 500000).
InvRazmer = 249; // Размер инвентаря (не трогать)

var
InitMode, RestartMode, PickUpMode : boolean;
//-------------------------------------- БД --------------------------------------------------
MobsObjID : array [1..maximumItems] of integer; // ID моба
MobsNpcTypeID : array [1..maximumItems] of integer; // Тип моба
MobsDist : array [1..maximumItems] of integer; // Расстояние от центра кача до моба
MobsXYZ : array [1..maximumItems, 1..3] of integer; // Координаты
MobsIsAttackable : array [1..maximumItems] of boolean; // Можно ли моба атаковать
MobsAgression : array [1..maximumItems] of boolean; // Моб атакует меня или стоит в сторонке...
MobsUpdated : array [1..maximumItems] of boolean; // Метка об обновлении моба
MobsLastIndex: integer; // индекс последнего элемента базы

NpcTypeID_List : array [1..NpcTypeID_List_Razmer] of integer; // Список мобов (коды мобов)
NpcTypeID_List_Count : integer; // Текущий размер списка
NpcTypeID_CurrentMob : integer;

Items_ObjectID : array [1..maximumItems] of integer; // БД дропа с мобов
Items_ItemID : array [1..maximumItems] of integer;
Items_XYZ : array [1..maximumItems, 1..3] of integer;
ItemsLastIndex: integer;

Inventory: array[0..InvRazmer, 0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
CurrentInvRazmer : integer;
HPBottleObjID, HPBottleCount : integer; // ObjID и количество HP-бутылей
Bottle_1_ObjID, Bottle_1_Count : integer;
Bottle_2_ObjID, Bottle_2_Count : integer;

TargetID, LastKilledMobObjID : integer; // Текущая цель, последний убитый моб

MobsKilled : integer; // счетчик убитых мобов

CenterX, CenterY, CenterZ : integer; // Центр кача
CenterFixed : boolean;
Radius: integer; // Радиус кача
//--------------------------------------------------------
MyX, MyY, MyZ : integer; // Мои статы
MyID, MyHP, MyMaxHP: integer;
MyMP, MyMaxMP, MyCP, MyMaxCP: integer;
HPlevelProcent : integer; // уровень жизни в процентах
//--------------------------------------------------------
frm: TForm; // переменные описания формы
log, MobsDBscreen, ItemsDBScreen: TMemo;
panel: TPanel;
btnInit, btnStart, btnStop, btnPause: TButton;
frmParamIndex: byte;
textX, textY, textZ, textMyID, textMyHP, textMyMaxHP: TEdit;
textMyMP, textMyMaxMP, textMyCP, textMyMaxCP: TEdit;
textCenterX, textCenterY, textCenterZ, textRadius : TEdit;
textTargetID, textMobX, textMobY, textMobZ : TEdit;
textAttackCycle, textMobsLastIndex, textMobsKilled: TEdit;
textHPBottleCount, textBottle_1_Count, textBottle_2_Count: TEdit;
cbFilterRadius : TCheckBox; l1: Tlabel;
//----------------------------------------------------------
TimerForm, TimerCombat, TimerPickUp, TimerBafBanka, TimerCheckDB : TTimer; // таймеры
time1: integer;
Calculated_AttackTime, Calculated_PickUpTime : integer;
AttackCycle: integer; // Цикл атаки
Spoiled: boolean;
//################################################## ############################################

procedure Init; //Вызывается при включении скрипта
var
i,n : integer;
begin
MyID:= 0; // обнуляем ВСЕ данные
MyX:= 0;
MyY:= 0;
MyZ:= 0;
MyID:= 0;
MyHP:= 0;
MyMaxHP:= 0;
MyMP:= 0;
MyMaxMP:= 0;
MyCP:= 0;
MyMaxCP:= 0;
time1:=1;
Calculated_AttackTime:= round (1000 / TimerCombat_Interval * Attack_Time);
Calculated_PickUpTime:= round (1000 / TimerPickUp_Interval * PickUp_Time);
HPlevelProcent:= 0;
HPBottleObjID:= 0;
HPBottleCount:= 0;
Bottle_1_ObjID:= 0;
Bottle_1_Count:= 0;
Bottle_2_ObjID:= 0;
Bottle_2_Count:= 0;
InitMode:= true;
RestartMode:= false;
MobsLastIndex:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:=0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
MobsUpdated[i]:=false;
end;
for i:=0 to InvRazmer do for n:=0 to 9 do Inventory[i, n]:= 0;
CurrentInvRazmer:=0;
TimerCombat:=TTimer.Create(nil); // создаем таймеры
TimerCombat.OnTimer:=@OnTimerCombat;
TimerCombat.enabled:=false;
TimerCombat.interval:= TimerCombat_Interval;
TimerForm:=TTimer.Create(nil);
TimerForm.OnTimer:=@OnTimerForm;
TimerForm.enabled:=true;
TimerForm.interval:= TimerForm_Interval;
TimerPickUp:=TTimer.Create(nil);
TimerPickUp.OnTimer:=@OnTimerPickUp;
TimerPickUp.enabled:=false;
TimerPickUp.interval:= TimerPickUp_Interval;
TimerBafBanka:=TTimer.Create(nil);
TimerBafBanka.OnTimer:=@OnTimerBafBanka;
TimerBafBanka.enabled:=false;
TimerBafBanka.interval:= 15000;
TimerCheckDB:=TTimer.Create(nil);
TimerCheckDB.OnTimer:=@OnTimerCheckDB;
TimerCheckDB.enabled:=true;
TimerCheckDB.interval:= 20*60*1000; // раз в 20 минут
frmParamIndex:=0; // создаем контролы в форме
frm:= TForm.Create(nil);
frm.Caption:= ProgramName;
frm.BorderStyle := bsDialog;
frm.Position := poScreenCenter;
frm.Width:=650;
frm.Height:=700;
frm.OnClose := @FormClose;
MobsDBscreen:=TMemo.Create(frm);
MobsDBscreen.parent:=frm;
MobsDBscreen.ReadOnly:=true;
MobsDBscreen.ScrollBars:=0;
MobsDBscreen.Top:=157;
MobsDBscreen.Width:=457;
MobsDBscreen.Height:=385;
ItemsDBscreen:=TMemo.Create(frm);
ItemsDBscreen.parent:=frm;
ItemsDBscreen.ReadOnly:=true;
ItemsDBscreen.ScrollBars:=0;
ItemsDBscreen.Top:=1;
ItemsDBscreen.Width:=300;
ItemsDBscreen.Height:=155;
panel:=TPanel.Create(frm);
panel.parent:=frm;
panel.align:=alRight;
log:=TMemo.Create(panel);
log.parent:=frm;
log.align:=alBottom;
log.ReadOnly:=true;
log.ScrollBars:=2;
log.Width:=570;
log.Height:=100;
log.Lines.Add('Лог...');
btnInit:= TButton.Create(frm);
btnInit.Name := 'btnInit';
btnInit.Parent := frm;
btnInit.SetBounds(370, 10, 75, 25);
btnInit.Caption := 'Init';
btnInit.OnClick := @BtnInit_Click;
btnStart:= TButton.Create(frm);
btnStart.Name := 'btnStart';
btnStart.Parent := frm;
btnStart.SetBounds(370, 40, 75, 25);
btnStart.Caption := 'Start';
btnStart.OnClick := @btnStart_Click;
btnStop:= TButton.Create(frm);
btnStop.Name := 'btnStop';
btnStop.Parent := frm;
btnStop.SetBounds(370, 70, 75, 25);
btnStop.Caption := 'Stop';
btnStop.OnClick := @btnStop_Click;
btnPause:= TButton.Create(frm);
btnPause.Name := 'btnPause';
btnPause.Parent := frm;
btnPause.SetBounds(370, 100, 75, 25);
btnPause.Caption := 'Pause';
btnPause.OnClick := @btnPause_Click;
l1:= TLabel.Create(frm);
l1.caption:='Фильтры:';
l1.parent:=frm;
l1.SetBounds(5, 547, 97, 17);
cbFilterRadius := TCheckBox.Create(frm);
cbFilterRadius.Name := 'cbFilterRadius';
cbFilterRadius.Parent := frm;
cbFilterRadius.SetBounds(60, 545, 97, 17);
cbFilterRadius.Caption := 'Радиус';
// cbFilterRadius.OnClick := @CheckBoxFilterClick;
textMyID:= CreateTextBox('textMyID');
CreateLabel('Мой ID :');
textX:= CreateTextBox('textX');
CreateLabel('Мой X :');
textY:= CreateTextBox('textY');
CreateLabel('Мой Y :');
textZ:= CreateTextBox('textZ');
CreateLabel('Мой Z :');
textMyHP:= CreateTextBox('textMyHP');
CreateLabel('Мой HP :');
textMyMaxHP:= CreateTextBox('textMyMaxHP');
CreateLabel('Мой MaxHP :');
textMyMP:= CreateTextBox('textMyMP');
CreateLabel('Мой MP :');
textMyMaxMP:= CreateTextBox('textMyMaxMP');
CreateLabel('Мой MaxMP :');
// textMyCP:= CreateTextBox('textMyCP');
// CreateLabel('Мой CP :');
// textMyMaxCP:= CreateTextBox('textMyMaxCP');
// CreateLabel('Мой MaxCP :');
inc(frmParamIndex);
textCenterX:= CreateTextBox('textCenterX');
CreateLabel('Ц. кач Х:');
textCenterY:= CreateTextBox('textCenterY');
CreateLabel('Ц. кач Y:');
textCenterZ:= CreateTextBox('textCenterZ');
CreateLabel('Ц. кач Z:');
textRadius:= CreateTextBox('Radius');
CreateLabel('Radius :');
inc(frmParamIndex);
textTargetID:= CreateTextBox('TargetID');
CreateLabel('Цель ID :');
textAttackCycle:= CreateTextBox('AttackCycle');
CreateLabel('Цикл атаки:');
textMobsLastIndex:= CreateTextBox('MobsLastIndex');
CreateLabel('Мобов в БД:');
textMobsKilled:= CreateTextBox('MobsKilled');
CreateLabel('Убито моб:');
inc(frmParamIndex);
textHPBottleCount:= CreateTextBox('HPBottleCount');
CreateLabel('HP бутылей:');
textBottle_1_Count:= CreateTextBox('Bottle_1_Count');
CreateLabel('Баф-Банки 1:');
textBottle_2_Count:= CreateTextBox('Bottle_2_Count');
CreateLabel('Баф-Банки 2:');
ClearDB;
frm.Show; // выводим форму на экран
buf:=#$6E;
SendToServerEx(NickName);

end;

procedure btnPause_Click(Sender: TButton);
begin
PauseGame;
end;

procedure btnStop_Click(Sender: TButton);
begin
StopGame;
end;
procedure btnStart_Click(Sender: TButton);
begin
StartGame;
end;
procedure BtnInit_Click(Sender: TButton);
begin
RestartMode:= true;
buf:= #$57; // авто релогин
// buf:= #$0F; // принудительно вызываем пакеты инвентаря и userinfo
SendToServerEx(NickName);
end;

procedure AddtoNpcTypeID_List (NpcTypeID: integer);
begin
inc(NpcTypeID_List_Count);
NpcTypeID_List[NpcTypeID_List_Count]:= NpcTypeID;
end;

procedure ClearDB; // Очистка БД
var // Надо все занулять, иначе там хрень всякая вылезает или старые данные
i : integer;
begin
ItemsLastIndex:= 0; // Очищаем переменные
TargetID:= 0;
LastKilledMobObjID:= 0;
MobsKilled:= 0;
CenterX:= 0;
CenterY:= 0;
CenterZ:= 0;
CenterFixed:= false;
Radius:= Radius_Kacha;
TimerBafBanka.interval:= 15000;
AttackCycle:= 0;
Spoiled:= false;
NpcTypeID_List_Count:= 0;
if NpcTypeID1 <> 0 then AddtoNpcTypeID_List (NpcTypeID1);
if NpcTypeID2 <> 0 then AddtoNpcTypeID_List (NpcTypeID2);
if NpcTypeID3 <> 0 then AddtoNpcTypeID_List (NpcTypeID3);
if NpcTypeID4 <> 0 then AddtoNpcTypeID_List (NpcTypeID4);
if NpcTypeID5 <> 0 then AddtoNpcTypeID_List (NpcTypeID5);
if NpcTypeID6 <> 0 then AddtoNpcTypeID_List (NpcTypeID6);
if NpcTypeID7 <> 0 then AddtoNpcTypeID_List (NpcTypeID7);
if NpcTypeID8 <> 0 then AddtoNpcTypeID_List (NpcTypeID8);
if NpcTypeID9 <> 0 then AddtoNpcTypeID_List (NpcTypeID9);
if NpcTypeID10<> 0 then AddtoNpcTypeID_List (NpcTypeID10);
if NpcTypeID_List_Count = 0 then
for i:=1 to NpcTypeID_List_Razmer do NpcTypeID_List[i]:= 0;
NpcTypeID_CurrentMob:= 0;
for i:=1 to maximumItems do // Очищаем базу
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
end;
btnStop.enabled:=false;
btnPause.enabled:= false;
end;

function Wait(var tick: integer; Timewait: Integer): Boolean; // сквозная проверка без остановки скрипта (c)dmitry501, modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;

//############################## Модуль работы с Инвентарем ###########################
procedure InventoryCreate;
var
i,k, offset : integer;
begin
offset:= 76;
CurrentInvRazmer:=ReadH(4);
for i:=0 to InvRazmer do
if i < CurrentInvRazmer then begin
Inventory[i,0]:=ReadH(i*offset+6); // itemType1
Inventory[i,1]:=ReadD(i*offset+8); // ObjectId
Inventory[i,2]:=ReadD(i*offset+12); // ItemID
Inventory[i,3]:=ReadD(i*offset+20); // count
Inventory[i,4]:=ReadH(i*offset+24); // itemType2
Inventory[i,5]:=ReadH(i*offset+26); // CustType1
Inventory[i,6]:=ReadH(i*offset+28); // isEquipped
Inventory[i,7]:=ReadD(i*offset+30); // BodyPart
Inventory[i,8]:=ReadH(i*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(i*offset+36); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;

procedure InventoryUpdate;
var
i,j,k, offset: integer;
begin
offset:= 82;
for j:=0 to (ReadH(2)-1) do
begin
case pck[j*offset+4] of
#$01: k:=0; // add item, запишет на пустую ячейку
#$02: k:=ReadD(j*offset+8); // mod item
#$03: begin // remove item, обнулит ячейки удаленного предмета
k:=ReadD(j*offset+8);
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
for k:=0 to 9 do Inventory[i,k]:=0;
exit;
end;
end;
end;
for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
begin
Inventory[i,0]:=ReadH(j*offset+6); // itemType1
Inventory[i,1]:=ReadD(j*offset+8); // ObjectId
Inventory[i,2]:=ReadD(j*offset+12); // ItemID
Inventory[i,3]:=ReadD(j*offset+20); // count
Inventory[i,4]:=ReadH(j*offset+24); // itemType2
Inventory[i,5]:=ReadH(j*offset+26); // CustType1
Inventory[i,6]:=ReadH(j*offset+28); // isEquipped
Inventory[i,7]:=ReadD(j*offset+30); // BodyPart
Inventory[i,8]:=ReadH(j*offset+34); // EnchantLevel
Inventory[i,9]:=ReadH(j*offset+36); // CustType2
break;
end;
end;
end;

function GetInv(obj,up,down:integer): integer; // up и down не проверяются
var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
i: integer;
begin
for i:=0 to CurrentInvRazmer do if (Inventory[i,up]=obj) then
begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;

{procedure UseItemID(ItemID:integer); //Использовать предмет с заданным ItemID
var
ObjItemID : integer;
begin
ObjItemID:= GetInv(ItemID,2,1);
if ObjItemID = -1 then exit;
buf:=#$14;
WriteD(ObjItemID);
WriteD(0);
SendToServerEx(NickName);;
end;}

procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemObjID
begin
buf:=#$19;
WriteD(ItemObjID);
WriteD(0);
SendToServerEx(NickName);;
end;
//################################################## ##########################################

function rastoyanie(NpcX, NpcY, NpcZ : integer) : longint; // вычисление растояния между 2 точками
var
dx,dy,dz : integer;
summa : longint;
begin
try
dx:= NpcX-CenterX;
dy:= NpcY-CenterY;
dz:= NpcZ-CenterZ;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
if abs(dz) > vertical then result := result + OblastVidimosti; // добавляем коррекцию по вертикали
except
sendmsg('Ошибка вычисления расстояния');
sendmsg('dx= '+ inttostr(dx));
sendmsg('dy= '+ inttostr(dy));
sendmsg('dz= '+ inttostr(dz));
sendmsg('summa= '+ inttostr(summa));
result := OblastVidimosti;
end;
end;

function RastoyanieToMe(NpcX, NpcY : integer) : integer; // вычисление растояния между 2 точками
var
dx,dy, summa : integer;
begin
dx:= NpcX-MyX;
dy:= NpcY-MyY;
summa:= dx*dx+dy*dy; // мне кажется, что так будет быстрее считаться
if summa = 0 then result:= 0 else result:= Round(sqrt(summa)); // обход возможной ошибки, если моб стоит прямо в центре кача
end;

procedure AddDroppedItem (ObjID, ItemID, X, Y, Z: integer); // Процедура добавляет дропнутую вещь в БД
begin
if ItemsLastIndex = maximumItems then ItemsLastIndex:=0; // обход переполнения базы предметов
inc (ItemsLastIndex);
Items_ObjectID[ItemsLastIndex]:= ObjID;
Items_ItemID[ItemsLastIndex]:= ItemID;
Items_XYZ[ItemsLastIndex, OX]:= X;
Items_XYZ[ItemsLastIndex, OY]:= Y;
Items_XYZ[ItemsLastIndex, OZ]:= Z;
// log.Lines.Add('Вещь добавлена, индекс в БД: '+ inttostr(ItemsLastIndex));
end;

procedure AddtoDB (id, TypeID, x,y,z : integer; IsAttackable : boolean); // Процедура добавляет в БД нового моба
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti; // вычиляем расстояние от центра кача до моба
if dist > (OblastVidimosti) then exit; // если моб слишко далеко то ничего не делаем
inc (MobsLastIndex); // увеличиваем размер БД
// log.Lines.Add('Моб добавлен, индекс в БД:'+ inttostr(MobsLastIndex));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsObjID[MobsLastIndex]:= id; // Записываем моба
MobsNpcTypeID[MobsLastIndex]:= TypeID;
MobsDist[MobsLastIndex]:= dist;
MobsXYZ[MobsLastIndex, OX]:= x;
MobsXYZ[MobsLastIndex, OY]:= y;
MobsXYZ[MobsLastIndex, OZ]:= z;
MobsIsAttackable[MobsLastIndex]:= IsAttackable;
MobsAgression[MobsLastIndex]:= false;
MobsUpdated[MobsLastIndex]:= true;
end;

procedure UpdateDB (i, x,y,z : integer; agression : boolean); // Процедура обновляет данные в БД по мобу
var
dist: integer;
begin
if (not initmode) then dist:= rastoyanie (x,y,z) else dist := OblastVidimosti;
if dist > (OblastVidimosti) then DelDBItem(i) else // перепроверяем расстояние до моба, если он вышел за границу кача, то удаляем его
begin
// log.Lines.Add('Моб обновлен, индекс в БД:'+ inttostr(i));
// if agression then log.Lines.Add('На нас напала какая-то вражина.');
MobsDist[i]:= dist; // записываем данные
MobsXYZ[i, OX]:= x;
MobsXYZ[i, OY]:= y;
MobsXYZ[i, OZ]:= z;
if (not MobsAgression[i]) then MobsAgression[i]:= agression;
MobsUpdated[i]:= true;
end;
end;

procedure DelDBItem (i: integer); // процедура удалаяет моба из БД
begin
// log.Lines.Add('Моб удален, индекс в БД: '+ inttostr(i));
MobsObjID[i]:= 0;
MobsNpcTypeID[i]:= 0;
MobsDist[i]:= 0;
MobsXYZ[i, OX]:= 0;
MobsXYZ[i, OY]:= 0;
MobsXYZ[i, OZ]:= 0;
MobsAgression[i]:= false;
MobsIsAttackable[i]:= false;
MobsUpdated[i]:= false;
if i < MobsLastIndex then // если надо, производим сдвиг данных в массивах
begin
MobsObjID[i]:= MobsObjID[MobsLastIndex];
MobsNpcTypeID[i]:= MobsNpcTypeID[MobsLastIndex];
MobsDist[i]:= MobsDist[MobsLastIndex];
MobsXYZ[i, OX]:= MobsXYZ[MobsLastIndex, OX];
MobsXYZ[i, OY]:= MobsXYZ[MobsLastIndex, OY];
MobsXYZ[i, OZ]:= MobsXYZ[MobsLastIndex, OZ];
MobsIsAttackable[i]:= MobsIsAttackable[MobsLastIndex];
MobsAgression[i]:= MobsAgression[MobsLastIndex];
MobsUpdated[i]:= MobsUpdated[MobsLastIndex];
end;
dec (MobsLastIndex); // уменьшаем размер БД
end;

procedure DelDroppedItem (i: integer); // процедура удалаяет вещь из БД
begin
Items_ObjectID[i]:= 0;
Items_ItemID[i]:= 0;
Items_XYZ[i, OX]:= 0;
Items_XYZ[i, OY]:= 0;
Items_XYZ[i, OZ]:= 0;
// log.Lines.Add('Вещь удалена, индекс в БД: '+ inttostr(i));
if i < ItemsLastIndex then
begin
Items_ObjectID[i]:= Items_ObjectID[ItemsLastIndex];
Items_ItemID[i] := Items_ItemID[ItemsLastIndex];
Items_XYZ[i, OX]:= Items_XYZ[ItemsLastIndex, OX];
Items_XYZ[i, OY]:= Items_XYZ[ItemsLastIndex, OY];
Items_XYZ[i, OZ]:= Items_XYZ[ItemsLastIndex, OZ];
end;
dec (ItemsLastIndex);
end;

function CheckItems (id: integer) : integer; // функция проверяет наличие заданной вещи в БД
var
i: integer;
begin
result:= 0;
for i:=1 to ItemsLastIndex do if Items_ObjectID[i] = id then
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function TestPovtor (id: integer) : integer; // функция проверяет наличие заданного моба в БД
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsObjID[i] = id then // Ищем нужный ID в нашей БД
begin
result:=i; // И возвращаем его индекс по БД
break;
end;
end;

function InMobsList (NpcTypeID: integer) : boolean; // функция проверяет наличие заданного моба в списке на атаку
var
i: integer;
begin
result:= false;
for i:=1 to NpcTypeID_List_Count do if NpcTypeID_List[i] = NpcTypeID then result:= true; // проверяем по списку
end;

procedure SendMsg_to_CL(msg:string); // отправка системных сообщений клиенту
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(NickName);
end;

procedure OnTimerCheckDB (Sender: TObject);
var
i: integer;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if MobsUpdated[i] then MobsUpdated[i]:=false
else
begin
DelDBItem(i);
dec(i);
end;
end;
end;

procedure PrepareDB;
var
i: integer;
//dist : double;
begin
i:=0;
while i <= MobsLastIndex do
begin
inc(i);
if InMobsList(MobsNpcTypeID[i]) then MobsIsAttackable[i]:= true;
MobsDist[i] := rastoyanie (MobsXYZ[i, OX], MobsXYZ[i, OY], MobsXYZ[i, OZ]);
if MobsDist[i] >= OblastVidimosti then
begin
// DelDBItem(i);
// dec(i);
end;
end;
end;

function ValidateData : boolean; // функция проверки правильности задания всех параметров для начала кача
begin
if (MyX <> 0) and (MyY <> 0) and (MyZ <> 0) and (MyID <> 0) and (MyHP > 0) and (MyMaxHP > 0) and // верификация всех данных, чтобы потом в боевом режиме
(MyMP > 0) and (MyMaxMP > 0) and {(MyCP <> 0) and (MyMaxCP <> 0) and } // не перепроверять все данные по 100 раз
(CenterX <> 0) and (CenterY <> 0) and (CenterZ <> 0) and (Radius > 0) and (NpcTypeID_List_Count > 0) then
begin
PrepareDB;
SendMsg_to_CL('Все начальные параметры заданы и проверены!');
log.Lines.Add('Все начальные параметры заданы и проверены!');
result:= true;
end
else
begin
SendMsg_to_CL('Ошибка задания начальных параметров!');
log.Lines.Add('Ошибка задания начальных параметров!');
result:= false;
end;
end;

procedure UserCommands; // комманды пользователя
var
i: integer;
begin // если комманда обработана удачно, то в чат сообщение не попадет, а будет выдано системное сообщение прямо в клиент
if InitMode then case (ReadS(2)) of
'pos' : if MyX <> 0 then // центр кача
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
CenterFixed:= true;
SendMsg_to_CL('Центр кача задан успешно!');
log.Lines.Add('Центр кача задан успешно!');
pck:='';
end;
'dist' : if (CenterX <> 0) and (MyX <> 0) then // радиус кача
begin
CenterFixed:= true;
Radius:= rastoyanie (MyX,MyY,MyZ);
SendMsg_to_CL('Радиус кача задан успешно');
SendMsg_to_CL('R= '+ inttostr(Radius));
log.Lines.Add('Радиус кача задан успешно, R = '+ inttostr(Radius));
pck:='';
end;
'reset': begin // сброс параметров
ClearDB;
SendMsg_to_CL('БД очищена, введите заново все параметры');
log.Lines.Add('БД очищена!');
pck:='';
end;
'1', '2', '3', '4', '5', '6', '7', '8', '9', '10' : // задаем мобов
begin
if (NpcTypeID_List_Count+1) <> strtoint(ReadS(2)) then
begin
SendMsg_to_CL('Добавлять мобов можно тока по очереди 1, 2, 3...');
pck:='';
exit;
end;
NpcTypeID_CurrentMob:= strtoint(ReadS(2));
SendMsg_to_CL('Добавляем моба № '+ ReadS(2));
pck:='';
i:= TestPovtor (TargetID);
if i > 0 then
begin
NpcTypeID_List[NpcTypeID_CurrentMob]:= MobsNpcTypeID[i];
SendMsg_to_CL('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
log.Lines.Add('Моб №' + inttostr(NpcTypeID_CurrentMob) + 'тип: '+inttostr(MobsNpcTypeID[i])+' добавлен в базу');
inc(NpcTypeID_List_Count);
NpcTypeID_CurrentMob:= 0;
TargetID:= 0;
end;
end;
'start': begin // собственно запуск бота
pck:='';
StartGame;
end;
end;
if (not InitMode) then case (ReadS(2)) of
'pause' : begin
pck:='';
PauseGame;
end;
'stop' : begin
pck:='';
StopGame;
end;
end;
end;

procedure PauseGame;
begin
TimerCombat.enabled:= not(TimerCombat.enabled);
TimerBafBanka.enabled:= not(TimerBafBanka.enabled);
if TimerCombat.enabled then
begin
btnPause.Caption:='Pause';
TimerBafBanka.interval:= 15000;
SendMsg_to_CL('Искуственный интелект запущен!');
log.Lines.Add('Искуственный интелект запущен!');
end
else
begin
btnPause.Caption:='Repeat';
SendMsg_to_CL('Искуственный интелект приостановлен.');
log.Lines.Add('Искуственный интелект приостановлен.');
end;
end;

procedure StartGame;
begin
if ValidateData and InitMode then
begin
CenterFixed:= true;
SendMsg_to_CL('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
log.Lines.Add('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
TargetID:=0;
InitMode:= false;
TimerCombat.enabled:=true; // запускаем таймер
TimerBafBanka.interval:= 15000;
TimerBafBanka.enabled:= true;
btnStart.enabled:= false;
btnStop.enabled:= true;
btnPause.enabled:= true;
end
else
begin
SendMsg_to_CL('Еще не все параметры заданы. Проверьте параметры...');
log.Lines.Add('Еще не все параметры заданы. Проверьте параметры...');
end;
end;

procedure StopGame; // остановка кача
begin
TimerCombat.enabled:= false;
InitMode:= true;
TimerPickUp.enabled:=false;
TimerBafBanka.enabled:=false;
TargetID:= 0;
ClearDB;
SendMsg_to_CL('Искуственный интелект остановлен.');
log.Lines.Add('Искуственный интелект остановлен.');
btnStart.enabled:= true;
btnStop.enabled:= false;
btnPause.Caption:= 'Pause';
btnPause.enabled:=false;
end;

function GetMinDistID : integer; // функция поиска ближайшего моба в БД
var
i, Dist, MinDist : integer;
begin
result:= 0;
if MobsLastIndex = 0 then exit;
MinDist:=RastoyanieToMe(MobsXYZ[1,OX], MobsXYZ[1,OY]);
for i:=1 to MobsLastIndex do if (MobsDist[i] <= Radius) and (MobsIsAttackable[i]) then
begin
Dist:= RastoyanieToMe(MobsXYZ[i,OX], MobsXYZ[i,OY]);
if Dist <= MinDist then
begin
Dist:= MinDist;
result:= i;
end; // если нашли хоть одного моба или несколько, товозращаем индекс ближайшего
end;
end;

function AgroTest : integer; // функция проверяет, атакует ли меня кто-нибудь или нет
var
i: integer;
begin
result:=0;
for i:=1 to MobsLastIndex do if MobsAgression[i] then // ищем первого попавшегося моба, который нас атакует
begin
result:= i; // возвращаем его индекс по БД
break;
end;
end;

procedure PhisicalAttack; // команда атаки
begin
buf:=#$1F; //action
WriteD(TargetID);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(0);
SendToServerEx(NickName);
end;
procedure RequestMagicSkillUse (SkillID: integer); // маг атака
begin
buf:=#$39;
WriteD(SkillID);
WriteD(0);
WriteC(0);
SendToServerEx(NickName);
end;

procedure InitPickUpMode(mode: boolean);
begin
if mode then
begin
PickUpMode:= true;
TimerCombat.enabled:= false;
TimerPickUp.enabled:= true;
end
else
begin
PickUpMode:= false;
TimerCombat.enabled:= true;
TimerPickUp.enabled:= false;
end;
end;

procedure OnTimerBafBanka (Sender: TObject); // таймер питья баф-банок
begin
if (Bottle_1_Count > 0) and (Bottle_1_ObjID > 0) then
begin
UseItemObjID(Bottle_1_ObjID);
dec (Bottle_1_Count);
end;
if (Bottle_2_Count > 0) and (Bottle_2_ObjID > 0) then
begin
UseItemObjID(Bottle_2_ObjID);
dec (Bottle_2_Count);
end;
TimerBafBanka.interval:= Bottle_Interval*60*1000;
end;

procedure OnTimerPickUp (Sender: TObject); // таймер поднятия дропа
var
povtor: integer;
begin
if (AgroTest > 0) then
begin
TargetID:= 0;
InitPickUpMode(false);
exit;
end;
if (ItemsLastIndex > 0) and (TargetID = 0) then
begin
TargetID:= Items_ObjectID[ItemsLastIndex];
AttackCycle:= 0;
PhisicalAttack;
exit;
end;
if (ItemsLastIndex > 0) and (TargetID > 0) then
begin
inc (AttackCycle);
if ((AttackCycle mod 5) = 0) then PhisicalAttack;
if AttackCycle > Calculated_PickUpTime then
begin
Povtor:= CheckItems(TargetID);
if Povtor <> 0 then DelDroppedItem(Povtor);
TargetID:= 0;
end;
exit;
end;
if ItemsLastIndex = 0 then InitPickUpMode(false);
end;

procedure OnTimerCombat (Sender: TObject); // боевой таймер, вся логика поведения бота находится именно здесь!!!
var
Agro, MinDistID, i: integer;
begin
if TargetID > 0 then // если в прицеле есть моб, то
begin // валим вражину
if ((AttackCycle mod 5) = 0) then
begin
if Spoil and (not Spoiled) then RequestMagicSkillUse(254) // заспойлим моба если опция включена
else PhisicalAttack;
end;
inc(AttackCycle);
if AttackCycle > Calculated_AttackTime then // если валим моба больше минуты, значит это баг...
begin
i:= TestPovtor(TargetID);
if i > 0 then
begin
MobsIsAttackable[i]:= false; //DelDBItem(i);
MobsAgression[i]:= false;
end;
TargetID:= 0;
end;
exit;
end;
Agro:= AgroTest;
if Agro > 0 then // если нас кто-то атакует, то его и выбираем
begin
TargetID:= MobsObjID[Agro];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if ItemsLastIndex > 0 then // если чего-то валяется на земле, то
begin
InitPickUpMode(true); // надо дроп подбирать
exit;
end;
MinDistID:= GetMinDistID; // запускаем алгоритм выбора цели
if MinDistID > 0 then // иначе ищем ближайшего
begin
TargetID:= MobsObjID[MinDistID];
PhisicalAttack; // берем вражину в таргет
AttackCycle:= 0;
exit;
end;
if (abs(MyX-CenterX) > 20) and (abs(MyY-CenterY) > 20) then MoveTo (CenterX, CenterY, CenterZ);
end;

procedure MoveTo(TargetX,TargetY,TargetZ:integer); //Идти в точку с координатами x,y,z
begin
buf:=#$0F; //01=MoveBackwardToLocation:d(targetX)d(targetY)d(ta rgetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
WriteD(targetx); //куда
WriteD(targety);
WriteD(targetz);
WriteD(MyX); //откуда
WriteD(MyY);
WriteD(MyZ);
WriteD(1); //используем 1-мышь 0-клавиатура
SendToServerEx(NickName);
end;

procedure OnTimerForm (Sender: TObject); // таймер обновления данных в форме
var
i: integer;
begin
textMyID.text:= inttostr(MyID); // обновляем данные в окне
textX.text:= inttostr(MyX);
textY.text:= inttostr(MyY);
textZ.text:= inttostr(MyZ);
textMyHP.text:= inttostr(MyHP);
textMyMaxHP.text:= inttostr(MyMaxHP);
textMyMP.text:= inttostr(MyMP);
textMyMaxMP.text:= inttostr(MyMaxMP);
// textMyCP.text:= inttostr(MyCP);
// textMyMaxCP.text:= inttostr(MyMaxCP);
textCenterX.text:= inttostr(CenterX);
textCenterY.text:= inttostr(CenterY);
textCenterZ.text:= inttostr(CenterZ);
textRadius.text:= inttostr(Radius);
textTargetID.text:= inttostr(TargetID);
textAttackCycle.text:= inttostr(AttackCycle);
textMobsLastIndex.text:= inttostr(MobsLastIndex);
textMobsKilled.text:= inttostr(MobsKilled);
textHPBottleCount.text:= inttostr(HPBottleCount);
textBottle_1_Count.text:= inttostr(Bottle_1_Count);
textBottle_2_Count.text:= inttostr(Bottle_2_Count);

MobsDBscreen.lines.Clear;
for i:=1 to MobsLastIndex do // выводим БД мобов
begin
if (TargetID = MobsObjID[i]) and MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if TargetID = MobsObjID[i] then
begin
MobsDBscreen.lines.add ('-> '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if cbFilterRadius.checked then if MobsDist[i] <= Radius then
begin
MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if MobsAgression[i] then
begin
MobsDBscreen.lines.add ('<- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
continue;
end;
if (not cbFilterRadius.checked) then MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsObjID[i])+' ТипID: '+inttostr(MobsNpcTypeID[i])+' дистанция '+inttostr(MobsDist[i]));
end;
ItemsDBscreen.lines.Clear; // выводим БД дропа
for i:=1 to ItemsLastIndex do ItemsDBscreen.lines.add ('индекс в БД: '+inttostr(i)+' объект ID: '+inttostr(Items_ObjectID[i])+' ID вещи: '+inttostr(Items_ItemID[i]));
if MobsLastIndex = 0 then MobsDBscreen.lines.add ('Мобы');
if ItemsLastIndex= 0 then ItemsDBscreen.lines.add('Дроп');
end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure CreateLabel (text: string); // процедура автоматизирует создание текстовых меток в форме
var
l: TLabel;
begin
l:= TLabel.Create(panel);
l.caption:=text;
l.parent:=panel;
l.left:=10;
l.top:=15+20*frmParamIndex;
inc(frmParamIndex);
end;

function CreateTextBox (text:string) :TEdit; // функция автоматизирует создание текстовых полей для вывода данных в форме
var
e: TEdit;
begin
e:= TEdit.Create(panel);
e.text:=text;
e.parent:=panel;
e.left:=80;
e.top:=10+20*frmParamIndex;
e.width:= 95;
e.ReadOnly:=true;
result:= e;
end;

procedure Free; //Вызывается при выключении скрипта
begin
ClearDB;
TimerForm.free;
TimerCombat.free;
TimerPickUp.free;
TimerBafBanka.free;
TimerCheckDB.free;
MobsDBscreen.free;
ItemsDBscreen.free;
log.free;
frm.free;
end;

procedure UserInfo; // обновление данных о себе
var
i:word;
begin
if InitMode then MyID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
i:=22;
ReadS(i);
i:=i+48;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
// i:=i+363; //пока не используется
// MyMaxCP:=ReadD(i);
// MyCP:=ReadD(i);
end;

procedure StatusUpdate; // обновление данных о себе
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: MyHP:=ReadD(i*8+14);
#$0A: MyMaxHP:=ReadD(i*8+14);
#$0B: MyMP:=ReadD(i*8+14);
#$0C: MyMaxMP:=ReadD(i*8+14);
// #$21: MyCP:=ReadD(i*8+14); //пока не используется
// #$22: MyMaxCP:=ReadD(i*8+14);
end;
if MyMaxHP > 0 then HPlevelProcent:= Round((MyMaxHP/100)*HPLevel);
end;

procedure DrinkBottle; // пьем бутылки и следим за их количеством
begin
if (HPBottleCount > 0) and (HPBottleObjID > 0)then
begin
UseItemObjID(HPBottleObjID);
dec (HPBottleCount);
end;
end;

procedure MoveToLocation01;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then updateDB(i, ReadD(06), ReadD(10), ReadD(14), false);
end;

procedure NpcInfo16;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then AddtoDB (ReadD(2), ReadD(6), ReadD(14), ReadD(18), ReadD(22), InMobsList(ReadD(6)))
else UpdateDB(i, ReadD(14), ReadD(18), ReadD(22), false);
end;

procedure Attack05;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i = 0 then log.Lines.Add('Глюк, моб не найден, или нас утакует другой игрок!!!')
else UpdateDB(i, ReadD(15), ReadD(19), ReadD(23), true);
end;

procedure Die06;
var
i: integer;
begin
i:= TestPovtor(ReadD(2));
if i > 0 then
if MobsObjID[i] = TargetID then
begin
TimerCombat.enabled:= false;
if Spoil and Spoiled then
if ReadD(22) = 1 then RequestMagicSkillUse(42);
LastKilledMobObjID:=TargetID;
inc (MobsKilled); // подводим статистику
MobsIsAttackable[i]:= false;
MobsAgression[i]:= false;
Spoiled:= false;
TargetID:= 0;
TimerCombat.enabled:= true;
end;
end;

procedure DeleteObject12;
var
i: integer;
begin
if LastKilledMobObjID = ReadD(2) then
begin
LastKilledMobObjID:= 0;
i:= TestPovtor(ReadD(2));
if i > 0 then DelDBItem(i);
exit;
end;
i:= CheckItems(ReadD(2));
if i > 0 then
begin
if Items_ObjectID[i] = TargetID then TargetID:= 0;
DelDroppedItem(i);
exit;
end;
i:= TestPovtor(ReadD(2));
if i > 0 then
begin
if TargetID = ReadD(2) then TargetID:= 0;
DelDBItem(i);
exit;
end;
end;

begin
if pck = '' then exit;
if (ConnectName = NickName) and FromServer then // разбор пакетов от сервера
case pck[1] of
#$01: MoveToLocation01; // MoveToLocation:h(ObjectID)d(CurX)d(CurY)d(CurZ)d(D estX)d(DestY)d(DestZ)
// #$03: ; // CharInfo:d(X)d(Y)d(Z)-(4)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)-(4)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs) i(Feet)i(Back)i(LRHand)i(Hair)d(PvPFlag)d(Carma)d( MSpeed)d(PSpeed)d(PvpFlag)d(Karma)d(RunSpeed)d(Wal kSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed )d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(Move mentSpeedMultiplier)f(AttackSpeedMultiplier)f(Coll isionRadius)f(CollisionHeight)d(HairStyle)d(HairCo lor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCr estId)d(AllyId)d(AllyCrestId)d(SiegeFlags)b(Sittin g)b(Running)b(InCombat)b(AlikeDead)b(Invisible)b(M ountType)b(PrivateStoreType)
#$04: if ReadS(22) = NickName then // UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Name)d (Race)d(Sex)d(ClassID)d(Level)d(Exp)d(STR)d(DEX)d( CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurrentHP)d(MaxMP) d(CurrentMP)d(SP)d(CurrentLoad)d(MaxLoad)d(Unknown )d(Under)d(REar)d(LEar)d(Neck)d(RFinger)d(LFinger) d(Head)d(RHand)d(LHand)d(Gloves)d(Chest)d(Legs)d(F eet)d(Back)d(LRHand)d(Hair)i(Under)i(REar)i(LEar)i (Neck)i(RFinger)i(LFinger)i(Head)i(RHand)i(LHand)i (Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Ha ir)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accurac y)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef) d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRun Speed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d (FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultipl ier)f(AttackSpeedMultiplier)f(CollisionRadius)f(Co llisionHeight)d(HairStyle)d(HairColor)d(Face)d(Acc essLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d (AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateS toreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cub ics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b ()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLef t)b()b(RecomHave)b()
begin
UserInfo;
btnInit.enabled:= false;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$05: if (ReadD(6) = MyID) and (not InitMode) then Attack05; // 05= Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d( X)d(Y)d(Z)h(Hits)
#$48: begin; // 48= MagicSkillUse:h(CharID)h(targetID)d(skillID)d(skil lLvl)d(hitTime)d(reuseDelay)d(X)d(Y)d(Z)w(count)d( d)d(d)d(d)
if (ReadD(2) = MyID) and (ReadD (6) = TargetID) and (ReadD(10) = 254) then Spoiled:= true;
end;
#$06: Die06; // Die:d(ChaID)
#$0C: if LastKilledMobObjID = ReadD(2) then // DropItem:h(PlayerID)h(ObjectID)i(ItemID)d(X)d(Y)d( Z)d(Stackable)d(Count)
begin
AddDroppedItem(ReadD(6), ReadD(10), ReadD(14), ReadD(18), ReadD(22));
end;
#$0D: if TargetID = ReadD(6) then // GetItem:d(PlayerID)h(ObjectID)d(X)d(Y)d(Z)
begin
TargetID:= 0;
end;
#$0E: if MyID=ReadD(2) then // StatusUpdate:h(ObjectID)d(Attributes)
begin
StatusUpdate;
if (MyHP > 0) and (MyHP < HPlevelProcent) then if Wait(time1,DrinkDelay) then DrinkBottle; // пьем бутылки
if MyHP > HPlevelProcent then time1:=1;
if MyHP = 0 then // Проверка не убили ли нас...
begin
SendMsg_to_CL('Нас убили...');
log.Lines.Add('Нас убили...');
StopGame;
end;
end;
#$12: DeleteObject12; // DeleteObject:h(ObjectID)
#$16: if (ReadD(10)=1) and (pck[121]=#$00) then NpcInfo16; // NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X) d(Y)d(Z)d(Heading)d(Unknown)d(MAtkSpd)d(PAtkSpd)d( RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRu nSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(Proper Multiplier)f(PAtkSpd)f(CollisionRadius)f(Collision Height)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRun ning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Nam e)s(Title)
#$1B: begin
InventoryCreate; // Инвентарь
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$27: begin
InventoryUpdate;
if HPBottleID <> 0 then
begin
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
if Bottle_1_ID <> 0 then
begin
Bottle_1_ObjID:=getinv(Bottle_1_ID, 2,1);
Bottle_1_Count:=getinv(Bottle_1_ID, 2,3);
end;
if Bottle_2_ID <> 0 then
begin
Bottle_2_ObjID:=getinv(Bottle_2_ID, 2,1);
Bottle_2_Count:=getinv(Bottle_2_ID, 2,3);
end;
end;
#$13: if RestartMode then // CharacterSelectionInfo
begin
buf:=#$12; // CharacterSelected
WriteD(CharNumber);
buf:= buf + hstr('00 00 00 00 00 00 00 00 00 00 00 00 00 00');
SendToServerEx(NickName);
RestartMode:= false;
end;
end;

if (ConnectName = NickName) and FromClient then // разбор пакетов от клиента
case pck[1] of
#$1F: if InitMode then TargetID:= ReadD(2); // Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b( ActionID)
#$49: UserCommands; // Say2:s(Text)d(Type)s(Target)
#$59: begin // ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
MyX:= ReadD(2);
MyY:= ReadD(6);
MyZ:= ReadD(10);
if (not CenterFixed) and InitMode then
begin
CenterX:= MyX;
CenterY:= MyY;
CenterZ:= MyZ;
end;
end;
end;

end.



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

ashram
17.04.2009, 02:38
хелп,дорогие отцы!
юзаю(точнее пытаюсь) для абиса ПХ 3.4.1,хочу квест итемы сделать как будто я их через магазин купил,покупаю шмотку,код соответствует расшифровке покупки,копирую в окно посылки,а в окне посылки уже этот код имеет другое ID(или вообще никакого) соответствующее ID пакета от сервера,а не от клиента,в чем может быть дело и как исправить?

PS может кто скинет готовый пакет на покупку через магаз?

alexteam
17.04.2009, 13:05
юзай l2phx.3.5.4.105.rar (http://l2phx.pp.ru/arhive/l2phx.3.5.4.105.rar)
это раз.
не забывай выбирать направление отправки, это 2.
ах. да. и внимательно читаем этот топик, особенно место по поводу несоответствия протоколов для разных направлений.

pickwick
17.04.2009, 13:39
из того что я понял то в L2ph надо везде ставить галочки на Gracia где есть) но в пакетах ID править от тех что были от Интерлюди, правильно я понял?)

ashram
17.04.2009, 15:49
скачал новую версию,он у меня теперь вообще не коннектит,клиент заходит,а ПХ молчит

alexteam
17.04.2009, 16:15
для особо одаренных при первом запуске пх выдает сообщение о том что его необходимо настроить.

Добавлено через 1 минуту
видно надо добавить функцию для особоособоособо одаренных которая будет зафлуживать этими сообщениями весь экран.

Добавлено через 19 минут
а потом взрывать системник нафих.

Добавлено через 30 секунд
чтото я сегодня.. злой какойто -(

QaK
17.04.2009, 21:37
alexteam, надо тогда так,сначала на весь экран вопрос: ВЫ ОСОБО ОДАРЕННЫЙ???? и кнопки "да" и "нет", если нет - то тогда все норм, при след запуске уже не появляется, а если да - то твой вариант =)

pickwick
17.04.2009, 21:46
что бы не создовать лишней темы решил спросить тут поскольку касается абисса:
дело в том что на абиссе при трейде с кем то во время этого нельзя удалять или перемещать вещи страйдеру к примеру, есть ли способ обойти это?

alexteam
17.04.2009, 21:54
QaK,так и сделаю...
(я серьезно) :confused:

ashram
18.04.2009, 01:35
какие все умные,а я то и читать не умею как будто...
настроил всё,не пашет

Dimka
18.04.2009, 12:23
...
Для проверки исправил скрипт рыбалки для грации, теперь он записывает маршрут, бегает по нему в обе стороны, видит инвентарь.

Будь добр, выложи этот скрипт. Именно под кривую Грацию Абисса :) буду признателен.

NLObP
18.04.2009, 15:43
Будь добр, выложи этот скрипт. Именно под кривую Грацию Абисса :) буду признателен.



//Автоматизация ловли рыбы by NLObP для L2PacketHack v.3.5.4 (C)CoderX.ru
//version 0.10.10 от 06.05.2009г. для мага или воина
//специально для TheAbyss.ru
program Fishing_Abyss_ru;
{
А.Пушкин "Сказка о рыбном четверге"
================================================== ============================
Проверялось на L2.RU в течении 2-х часов
================================================== ============================
Перед использованием скрипта изменяем:
- Name='имя своего чара';
По необходимости:
- изменить перемещение к месту ловли (Mestolovli), смена места ловли (MenayemMesto),
репозицию после боя (Reposition), перемещение после смерти (AfterDeath);

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

2) каждый раз для инициализации скрипта:
- запускаем скрипт (ставим галочку);
- ставим галочи в панели управления напротив необходимых позиций (обязательно
выбрать удочку и крючки);
- становимся перед фишермэном, выбираем первое место ловли, жмем GO;
- чар сам идет на место рыбалки;
- дождавшись прихода на место ловли жмем START;
- при необходимости, включть соулшоты в автоматический режим.

Примечание:
- ловить лучше всего гномом;
- пути движения к местам ловли начинать от фишермэна;
- путь движения после смерти начинается с места появления после смерти.

Скрипт настроен под определённое место. Для других мест нужно изменить перемещение
к месту рыбалки, смену места рыбалки, репозицию после боя, путь после смерти
(в скрипте зашито три места ловли). Теперь это сделать очень легко! Спасибо Alexsl!
************************************************** ****************************
Спасибо Xkor за пакетхак!
Спасибо участникам форума CoderX.ru за идеи для скрипта!

Скрипт распространяется как есть, и я не несу ответственности за то,
что ВЫ натворили у себя, его используя.

MyICQ 402988808
************************************************** ****************************
Возможности скрипта:
--------------------
0.10.1
- Контроль рыбалки с панели управления;
- Статистика ловли;
- Может работать одновременно несколько скриптов для разных чаров;
- При нападении моба может атаковать его и может лечиться бутылками;
- Потрошит пойманную рыбу;
- Подбирает выпавшие предметы из убитого моба;
- Возвращается на место рыбалки после смерти;
- Когда закончатся крючки, бежит к фишермэну и продает/покупает/обменивает предметы
(продажа Fish Oil и Great Fish Oil не производится, см. ниже);
- Меняет место ловли при неудачных попытках (в скрипте три места ловли);
- В процессе рыбалки преобразует Fish Oil в Great Fish Oil, Great Fish Oil в Premium
Fish Oil (требуются соответствующие рецепты).
0.10.2
+ проверка на то, что мы действительно рыбачим, с репозицией;
+ проверка на застревание с возвратом на одну позицию назад;
0.10.3
+ правильно работает остановка рыбалки (Stop);
+ возобновляет рыбалку если моб исчез сам;
+ исправлено лечение бутылками;
+ исправлена репозиция;
+ показывает количество HP напавшего моба.
0.10.4
+ by MHz: Попробовав юзать твой скрипт с ботом L2Jes столкнулся с тем, что
полностью полагаться на пакет клиента 48 - ValidatePosition нельзя, поэтому
предлагаю дополнительно подтверждать свои координаты из пакета сервера
01 MoveBackwardToLocation.
0.10.5
+ сменил код выбора ItemID предметов;
+ если не выбрали продавца, то по окончанию крючков продовать не бежим;
0.10.6
+ рефакторинг кода;
+ вроде нашел место где после боя останавливается;
0.10.7
+ добавил отключение клиента (социал YES);
0.10.7.1
+ маг теперь атакует магической атакой (воином лучше не ловить);
настройки:
Hurricane=1239; //ID MagicSkill Hurricane
OnTimerA.Interval:=3000; //время задержки
0.10.7.2
+ исправил таргет на фишермана при торговле;
0.10.8
+ для русского оффа l2.ru;
+ небольшая правка кода;
0.10.8.1
+ использование с6E=RequestRecordInfo, спс Xelat;
0.10.8.2
+ использование GoodUse при рыбалке;
+ оптимизация кода;
0.10.9
+ делаю для Абисс;
+ серверные ID пакетов поменял на ID от интерлюдии;
0.10.10
+ Спасибо StekloReZ за предоставленных чаров для тестирования;
+ поменял работу с инвентарем;
+ поменял работу продажа/покупка/обмен;
+ удочку/крючок, оружие чар должен брать нормально;
************************************************** ***************************}
const
//v---------НЕ ЗАБУДЬТЕ ИСПРАВИТЬ ПОД СВОИ НУЖДЫ----v
Name='NLObP'; //имя чара для которого включаем скрипт
//если используем мага, то ставим ID желаемого скила, иначе поставить =0 для воина
Hurricane=0; //ID MagicSkill Hurricane
//путь где хранятся наши файлы
//RecordFilesPath='.\scripts\fishing\TALKIN_ISLAND\' ; //путь где хранятся наши файлы
RecordFilesPath='.\scripts\fishing\giran_harbor\';
IniFilesPath='.\settings\';
//^---------НЕ ЗАБУДЬТЕ ИСПРАВИТЬ ПОД СВОИ НУЖДЫ----^

//v--------- изменять при необходимости ----v
//сюда вписываем ItemID предметов для автопродажи
TradeSellItem=[6904,6905,6906,6907,6920,6921,6922,6923,6924,6925, 7686,7695,7696,7697,7698,7699,7700];
//количество предметов в массиве TradeSellItem
TradeSellItemCount=17;
//-----------------------------
//сюда вписываем ItemID предметов для автообмена
TradeMultiItem=[6908,6909,6910,6911,6912,6913,6914,6915,6916]; //нельзя изменять, собъется обмен!
//-----------------------------
//количество предметов в массиве TradeMultiItem
TradeMultiItemCount=9;//нельзя изменять, собъется обмен!
//-----------------------------
//требуется если используем преобразования масла, иначе поставить =0
FO=6908; //запомним, чтобы отменять обен на пруфы
GFO=6909;
//-----------------------------
debug=false; //если не хотим видеть отладочной информации
//^--------- изменять при необходимости ----^

//*************ниже лучше не трогать****************************************
//эта переменная указывает уничтожить пакет или нет если он обработан
//может данные нужны для других скриптов
EraseCommandFromChat=true;
kID=1000000; //коэфф вычитаемый из NpcID
//покупаем только выбранные крючки для ловли
TradeBuyItemCount=1;
//************************************************** *****
fish=1312; //ID fishing
pump=1313; //ID pumping
reel=1314; //ID reeling
//************************************************** *****
// RecordFilesPath='.\scripts\fishing\TALKIN_ISLAND\' ; //путь где хранятся наши файлы
// RecordFilesPath='.\scripts\fishing\giran_harbor\'; //путь где хранятся наши файлы
RecordPathName='Mestolovli1'; //файл по умолчанию
RecordFileExt='.txt';//расширение по умолчанию

RangeToCheckPoint=150;//дистанция до чекпоинта при которой считается , что мы достигли оного
MoveTrigerDelay=800; //срабатывание таймера на движение 0,8 сек

cmdPrefix='==='; //с этих символов начинается команда
cmdDlm =' '; //разделитель параметров команды, параметры не должены содержать разделитель
//команды в общий чат
//пример
cmdRecordPath='rec'; //в общий чат "===rec giran1"
cmdSavePath='save'; //в общий чат "===save"
cmdMove='go'; //в общий чат "===go giran1"
cmdBack='back'; //в общий чат "===back giran1"
cmdStop='stop'; //останавливает следование по маршруту

maxitems=250; //max количество предметов в базе
maxnpc=50; //max количество контролируемых NPC
go=true; //бежать от продавца на место ловли
back=false; //бежать от места ловли к продавцу
//************************************************** *************
var
HtmlRcv, //сигнал, что пакета NpcHtmlMessage получен
SellListRcv,
BuyListRcv,
MultiSellListRcv : boolean;
getbuylist, getselllist, getmultisell : string;
PercentHP : integer; //при каком количестве HP в % юзать бутылку лечения
WeaponUse1 : boolean; //использовать оружие? true-да, false-нет
ShieldUse1 : boolean; //использовать щит? true-да, false-нет
HPuse1 : boolean; //использовать ли бутылки лечения? true-да, false-нет
ShotUse1 : boolean; //использовать ли фишин-шоты? true-да, false-нет

TradeBuyItem: array[0] of integer; //что надо купить [MyLureID];
NpcBase: array[1..2,1..maxnpc] of integer; //все NPC вокруг
KolvoNpc : integer; //количество Npc в базе
{
1 - OID
2 - ID
}
// ItemBase: array[1..4,1..maxitems] of integer; //все предметы в инвентаре
// ItemBase2: array[1..4,1..maxitems] of integer; //найденные по ItemID
{
1 - ObjectID
2 - ItemID
3 - ItemCount
4 - IsEquipped
}
//ITEMs
BaseItems: array[1..maxitems, 1..12] of integer; //все предметы в инвентаре

MestoLovli, PMMesto, MMesto : integer;
isFishing : boolean;
NeedBuy, FishermanOID, ListID, ColvoItm, ColvoItm2, SocialID : integer;
ReadyToBuy, ReadyToSell, ReadyToMultiSell, add, CanFishHere : boolean;
trd, TradeCount, TradeID, EndTradeID, UpdType, ItemOID, ItemID, colv, trade: integer;
lucky1, failed1, fish1, fish2, mob1, death1: integer;

GoodUse: integer; //пора reeling/pumping

StartTime, EndTime: TDateTime;
fishin, ShowInf, MoveTimer, Trade1, CreatePFO, OnTimerA: TTimer;

//ID вещей которыми пользуемся при рыбалке
MyWeaponID : integer;
MyShieldID : integer;
MyRodID : integer;
MyLureID : integer;
MyRodEq : integer;
MyLureEq : integer;
MyShotID : integer;
MyHPID : integer;
FishermanID : integer;

HPOID, ColvoHP, RodOID, LureOID, ColvoLure, ShotOID, ColvoShot : Integer;
iii, i, j: integer;

//защита от мобов
WeaponID, ShieldID, WeaponOID, ShieldOID : Integer;
but: integer ;
Lure1, Rod1, distanciya, status : boolean;
underAttack, HPuse2, Weapon2, Shield2, Lure2, Rod2, Shot2 : boolean;

//movement data
MovePath, //данные по которому мы будем двигатся в данный момент
RecordPath, //данные для записи пути
ItemsName, NpcsName, StringList, StringList2 : TStringList; //названия предметов, имена продавцов
Cmd, //команда на определенное действие 'fishing' 'trade' 'death' 'move'
RecordPathFileName: string; //название файла для записи
PointsCount: integer; //кол-во поинтов в процессе записи пути

SavePathEnabled: boolean; //флаг записи пути

MoveToPathEnabled: boolean; //флаг движения по пути
MoveToForward: boolean; //направление движения да-вперед, нет - назад
MoveStepIndex: integer; //текущ. чекпоинт (куды бежим сейчас)

old_X,old_Y,old_Z,old_time,chk_time: integer;

stop : boolean;

myX,myY,myZ: integer; //наши статы
myOID,myHP,myMP,myMaxHP,myMaxMP: integer;
AttackerID, AttackerOID,AttackerX,AttackerY,AttackerZ,Attacker MaxHP,AttackerHP : integer;

NetPing: string; // здесь запомним Нетпинг от клиента, будем сами его посылать
LogOutOk: boolean; // флаг показывающий, что мы отключили клиент

//............................................
//Список переменных формы
FormMain : TForm; //Создаваемая форма
Splitter1,Splitter2 : TSplitter;
Panel1 : TPanel;
ButtonPathBack,ButtonPathStop,ButtonPathGo,ButtonP athSave,ButtonPathRec,
ButtonFishingStart,ButtonFishingStop : TButton;
GroupBox1,GroupBox2,GroupBox3,GroupBox4 : TGroupBox;
Label1,Label2,Label4,Label5,Label6,Label7,Label12, Label13,Label8,Label9,Label17,
Label10,Label11,Label3,Label14,Label15 : TLabel;
CheckBoxRod,CheckBoxLure,CheckBoxWeapon,CheckBoxSh ield,CheckBoxFShot,CheckBoxFO,CheckBoxPU,
CheckBoxFisherman,CheckBoxHPotion : TCheckBox;
ComboBoxPath,ComboBoxRod,ComboBoxFShot,ComboBoxLur e,ComboBoxWeapon,ComboBoxShield,
ComboBoxFisherman,ComboBoxHPotion : TComboBox;
EditPath,EditRodVal,EditLureVal,EditWeaponVal,Edit ShieldVal,EditFShotVal,
EditLureOID,EditWeaponOID,EditShieldOID,EditFShotO ID,EditRodOID,EditFishermanOID,
EditLure,EditHealt,EditHpotionOID,EditHPotionVal : TEdit;
Stats, Msg : TMemo;
pbMyHP,pbMyMP,pbTargetHP:TProgressBar;
gbMyPanel,gbTargetPanel,gbMyCP,gbMyHP,gbMyMP,gbTar getHP:TGroupBox;

//............................................
procedure OnAttack(Sender: TObject);
begin
MagicSkillUse(Hurricane); //магическая атака
end;
//............................................

//************************************************** *************
//Вызывается при включении скрипта
//************************************************** *************
procedure Init;
begin
gooduse:=0;
HtmlRcv:=false;

FormMain:=Create_FormMain;
//RequestBypassToServer(command)
//off
getselllist:='menu_select?ask=-1&reply=8'; //sell
//local server
//getselllist:='npc_268469209_Sell';
//off
getbuylist:='menu_select?ask=-1&reply=0'; //buy
//local server
//getbuylist:='npc_268469209_Buy 3157300';
//off
getmultisell:='menu_select?ask=-303&reply=517'; //multisell
//local server
//getmultisell:='npc_268469209_multisell 009';

//Управление сменой места рыбалки. Скрипт считает всех сорвавшихся с крючка.
PMMesto:=50; //количество рыб, для начала смены места ловли
MMesto:=0; //здесь будем подсчитывать сорвавшуюся рыбу, для смены позиции
MestoLovli:=1; //номер места позиции ловли 1..3

lucky1:=0;
failed1:=0;
fish1:=0;
fish2:=0;
mob1:=0;
death1:=0;

FishermanOID:=0;
CanFishHere:=true; //здесь можно ловить
ReadyToBuy:=false;
ReadyToSell:=false;
ReadyToMultiSell:=false;
stop:=false; //нажали кнопку STOP?
isFishing:=false; //ловим?

StartTime:=time;
ShotOID:=0;
LureOID:=0;
Status:=false;
rod1:=true;
lure1:=true;

HPuse2:=false; //задействовано true-да, false-нет
weapon2:=false;
shield2:=false;
rod2:=false;
lure2:=false;
Shot2:=false;

underattack:=false; //атакован?

RecordPathFileName:='';

RecordPath:=TStringList.Create;
MovePath:=TStringList.Create;
ItemsName:=TStringList.Create;
NpcsName:=TStringList.Create;
StringList:=TStringList.Create;
StringList2:=TStringList.Create;
NpcsName.LoadFromFile(RecordFilesPath+'npcsid.ini' );
ItemsName.LoadFromFile(IniFilesPath+'ItemsID.ini') ;
with ComboBoxFisherman do
begin
Items.Clear;
Items.Assign(NpcsName);
ItemIndex:=0;
end;
//таймеры, можно поправить время по обстоятельствам
OnTimerA:=TTimer.Create(nil);
OnTimerA.Enabled:=False;
OnTimerA.Interval:=3000; //время задержки
OnTimerA.OnTimer:=@OnAttack;

MoveTimer:=TTimer.Create(nil);
MoveTimer.Enabled:=False;
MoveTimer.Interval:=MoveTrigerDelay; //время задержки
MoveTimer.OnTimer:=@OnMove;

trade1:=TTimer.Create(nil);
trade1.OnTimer:=@OnTrade;
trade1.enabled:=false;
trade1.interval:=1000; //время задержки

fishin:=TTimer.Create(nil);
fishin.OnTimer:=@OnFishing;
fishin.enabled:=false;
fishin.interval:=5000; //время задержки

ShowInf:=TTimer.Create(nil);
ShowInf.OnTimer:=@OnShowInfo;
ShowInf.enabled:=true;
ShowInf.interval:=1000; //время задержки

CreatePFO:=TTimer.Create(nil);
CreatePFO.OnTimer:=@OnCreatePFO;
CreatePFO.enabled:=false;
CreatePFO.interval:=300000; //время задержки 5 мин

WeaponUse1:=false;
ShieldUse1:=false;
HPuse1:=false;
ShotUse1:=false;

MyWeaponID:=0;
MyShieldID:=0;
MyRodID:=0;
MyLureID:=0;
MyShotID:=0;
MyHPID:=0;
FishermanID:=0;

//RequestItemList вызываем инвентарь
buf:=hstr('14');
SendToServerEx(Name);
//delay(350);

end;
//............................................
//************************************************** *************
//Вызывается при выключении скрипта
//************************************************** *************
procedure Free;
begin
//таймеры
ShowInf.Enabled:=false; ShowInf.Interval:=0; ShowInf.Free;
fishin.Enabled:=false; fishin.Interval:=0; fishin.Free;
trade1.Enabled:=false; trade1.Interval:=0; trade1.Free;
createpfo.Enabled:=false; createpfo.Interval:=0; createpfo.Free;
movetimer.Enabled:=false; movetimer.Interval:=0; movetimer.Free;
WeaponOID:=0; ShieldOID:=0; HPOID:=0; RodOID:=0; LureOID:=0; ShotOID:=0;
ColvoLure:=0; ColvoShot:=0;
RecordPath.Free; MovePath.Free; ItemsName.Free; NpcsName.Free; StringList.Free; StringList2.Free;
//достаточно освободить форму
FormMain.Free;
//отключение клиента
// YesFreeOnClientDisconnect;
// YesFreeOnServerDisconnect;
end;
//............................................
//************************************************** *************
function Create_FormMain : TForm;
//Создаем форму и соотв. компоненты на ней ...
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);
TRY
//............................................
//Свойства формы
Result.Caption := 'FishingBot by NLObP v.0.10.10 for TheAbyss';
Result.Left := 0;
Result.Top := 0;
Result.Width := 620;
Result.Height := 730;
// Result.FormStyle := fsNormal;
Result.FormStyle := FsStayOnTop;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
//......................................
//......................................
//Panel1
Panel1 := TPanel.Create(Result);
Panel1.Parent := Result;
Panel1.Left := 0;
Panel1.Top := 0;
Panel1.Width := 425;
Panel1.Height := 471;
Panel1.Visible := TRUE;
Panel1.Tag := 0;
Panel1.Enabled := TRUE;
Panel1.Hint := '';
Panel1.ShowHint := FALSE;
Panel1.Caption := '';
Panel1.Align := alClient;
Panel1.Color := clBtnFace;
Panel1.Font.Name := 'Tahoma';
Panel1.Font.Size := 8;
Panel1.Font.Color := clWindowText;
Panel1.Font.CharSet := 1;
Panel1.BevelWidth := 1;
Panel1.BorderWidth := 0;
Panel1.BevelInner := bvNone;
Panel1.BevelOuter := bvRaised;
Panel1.TabOrder := 0;
Panel1.TabStop := FALSE;
Panel1.AutoSize := FALSE;
//......................................
//=============== My Attr Panel ========
gbMyPanel:=TGroupBox.Create(Panel1);
gbMyPanel.parent:=Panel1;
gbMyPanel.caption:=' ['+Name+'] ';
gbMyPanel.ShowHint:=true;
gbMyPanel.Hint:=' ['+Name+'] ';
gbMyPanel.height:=115;
gbMyPanel.width:=210;
gbMyPanel.left:=1;
gbMyPanel.top:=420;
//......................................
//==================== HP ==============
gbMyHP:=TGroupBox.Create(gbMyPanel);
gbMyHP.parent:=gbMyPanel;
gbMyHP.Color:=clRed;
gbMyHP.caption:=' HP: 0/0 ';
gbMyHP.height:=33;
gbMyHP.width:=200;
gbMyHP.left:=5;
gbMyHP.top:=14;
//......................................
pbMyHP:=TProgressBar.Create(gbMyPanel);
pbMyHP.parent:=gbMyPanel;
pbMyHP.smooth:=true;
pbMyHP.max:=1200;
pbMyHP.min:=0;
pbMyHP.position:=0;
pbMyHP.step:=10;
pbMyHP.height:=16;
pbMyHP.width:=190;
pbMyHP.left:=10;
pbMyHP.top:=26;
//......................................
//==================== MP ==============
gbMyMP:=TGroupBox.Create(gbMyPanel);
gbMyMP.parent:=gbMyPanel;
gbMyMP.Color:=$FF7000;
gbMyMP.caption:=' MP: 0/0 ';
gbMyMP.height:=33;
gbMyMP.width:=200;
gbMyMP.left:=5;
gbMyMP.top:=50;
//......................................
pbMyMP:=TProgressBar.Create(gbMyPanel);
pbMyMP.parent:=gbMyPanel;
pbMyMP.smooth:=true;
pbMyMP.max:=1200;
pbMyMP.min:=0;
pbMyMP.position:=0;
pbMyMP.step:=10;
pbMyMP.height:=16;
pbMyMP.width:=190;
pbMyMP.left:=10;
pbMyMP.top:=62;
//......................................
//================== Target Info Panel =
gbTargetPanel:=TGroupBox.Create(Panel1);
gbTargetPanel.parent:=Panel1;
gbTargetPanel.caption:=' [TargetName] ';
gbTargetPanel.ShowHint:=true;
gbTargetPanel.Hint:=' [TargetName] ';
gbTargetPanel.height:=115;
gbTargetPanel.width:=210;
gbTargetPanel.left:=212;
gbTargetPanel.top:=420;
//......................................
//==================== HP ==============
gbTargetHP:=TGroupBox.Create(gbTargetPanel);
gbTargetHP.parent:=gbTargetPanel;
gbTargetHP.Color:=clRed;
gbTargetHP.caption:=' HP: 0/0 ';
gbTargetHP.height:=33;
gbTargetHP.width:=200;
gbTargetHP.left:=5;
gbTargetHP.top:=14;
//......................................
pbTargetHP:=TProgressBar.Create(gbTargetPanel);
pbTargetHP.parent:=gbTargetPanel;
pbTargetHP.smooth:=true;
pbTargetHP.max:=1200;
pbTargetHP.min:=0;
pbTargetHP.position:=0;
pbTargetHP.step:=10;
pbTargetHP.height:=16;
pbTargetHP.width:=190;
pbTargetHP.left:=10;
pbTargetHP.top:=26;
//......................................
//......................................
//GroupBox1
GroupBox1 := TGroupBox.Create(Result);
GroupBox1.Parent := Panel1;
GroupBox1.Left := 1;
GroupBox1.Top := 343;
GroupBox1.Width := 421;
GroupBox1.Height := 76;
GroupBox1.Visible := TRUE;
GroupBox1.Tag := 0;
GroupBox1.Enabled := TRUE;
GroupBox1.Hint := '';
GroupBox1.ShowHint := FALSE;
GroupBox1.Caption := 'Создание путей движения';
GroupBox1.Align := alNone;
GroupBox1.Color := clBtnFace;
GroupBox1.Font.Name := 'Tahoma';
GroupBox1.Font.Size := 8;
GroupBox1.Font.Color := clWindowText;
GroupBox1.Font.CharSet := 1;
GroupBox1.TabOrder := 0;
GroupBox1.TabStop := FALSE;
//......................................
//......................................
//Label1
Label1 := TLabel.Create(Result);
Label1.Parent := GroupBox1;
Label1.Left := 3;
Label1.Top := 18;
Label1.Width := 58;
Label1.Height := 13;
Label1.Visible := TRUE;
Label1.Tag := 0;
Label1.Enabled := TRUE;
Label1.Hint := '';
Label1.ShowHint := FALSE;
Label1.Caption := 'Имя файла:';
Label1.Transparent := TRUE;
Label1.WordWrap := FALSE;
Label1.Alignment := taLeftJustify;
Label1.Layout := tlTop;
Label1.AutoSize := TRUE;
Label1.Align := alNone;
Label1.Font.Name := 'Tahoma';
Label1.Font.Size := 8;
Label1.Font.Color := clWindowText;
Label1.Color := clBtnFace;
//......................................
//......................................
//ButtonPathBack
ButtonPathBack := TButton.Create(Result);
ButtonPathBack.Parent := GroupBox1;
ButtonPathBack.Left := 265;
ButtonPathBack.Top := 42;
ButtonPathBack.Width := 75;
ButtonPathBack.Height := 25;
ButtonPathBack.Visible := TRUE;
ButtonPathBack.Tag := 0;
ButtonPathBack.Enabled := TRUE;
ButtonPathBack.Hint := '';
ButtonPathBack.ShowHint := FALSE;
ButtonPathBack.Caption := 'Back';
ButtonPathBack.Font.Name := 'Tahoma';
ButtonPathBack.Font.Size := 8;
ButtonPathBack.Font.Color := clWindowText;
ButtonPathBack.Font.CharSet := 1;
ButtonPathBack.TabOrder := 0;
ButtonPathBack.TabStop := TRUE;
ButtonPathBack.Cancel := FALSE;
ButtonPathBack.ModalResult := 0;
ButtonPathBack.OnClick := @ButtonPathBack_Click;
//......................................
//......................................
//ButtonPathStop
ButtonPathStop := TButton.Create(Result);
ButtonPathStop.Parent := GroupBox1;
ButtonPathStop.Left := 343;
ButtonPathStop.Top := 42;
ButtonPathStop.Width := 75;
ButtonPathStop.Height := 25;
ButtonPathStop.Visible := TRUE;
ButtonPathStop.Tag := 0;
ButtonPathStop.Enabled := TRUE;
ButtonPathStop.Hint := '';
ButtonPathStop.ShowHint := FALSE;
ButtonPathStop.Caption := 'Stop';
ButtonPathStop.Font.Name := 'Tahoma';
ButtonPathStop.Font.Size := 8;
ButtonPathStop.Font.Color := clWindowText;
ButtonPathStop.Font.CharSet := 1;
ButtonPathStop.TabOrder := 1;
ButtonPathStop.TabStop := TRUE;
ButtonPathStop.Cancel := FALSE;
ButtonPathStop.ModalResult := 0;
ButtonPathStop.OnClick := @ButtonPathStop_Click;
//......................................
//......................................
//ButtonPathGo
ButtonPathGo := TButton.Create(Result);
ButtonPathGo.Parent := GroupBox1;
ButtonPathGo.Left := 187;
ButtonPathGo.Top := 42;
ButtonPathGo.Width := 75;
ButtonPathGo.Height := 25;
ButtonPathGo.Visible := TRUE;
ButtonPathGo.Tag := 0;
ButtonPathGo.Enabled := TRUE;
ButtonPathGo.Hint := '';
ButtonPathGo.ShowHint := FALSE;
ButtonPathGo.Caption := 'Go';
ButtonPathGo.Font.Name := 'Tahoma';
ButtonPathGo.Font.Size := 8;
ButtonPathGo.Font.Color := clWindowText;
ButtonPathGo.Font.CharSet := 1;
ButtonPathGo.TabOrder := 2;
ButtonPathGo.TabStop := TRUE;
ButtonPathGo.Cancel := FALSE;
ButtonPathGo.ModalResult := 0;
ButtonPathGo.OnClick := @ButtonPathGo_Click;
//......................................
//......................................
//ButtonPathSave
ButtonPathSave := TButton.Create(Result);
ButtonPathSave.Parent := GroupBox1;
ButtonPathSave.Left := 101;
ButtonPathSave.Top := 42;
ButtonPathSave.Width := 75;
ButtonPathSave.Height := 25;
ButtonPathSave.Visible := TRUE;
ButtonPathSave.Tag := 0;
ButtonPathSave.Enabled := TRUE;
ButtonPathSave.Hint := '';
ButtonPathSave.ShowHint := FALSE;
ButtonPathSave.Caption := 'Save';
ButtonPathSave.Font.Name := 'Tahoma';
ButtonPathSave.Font.Size := 8;
ButtonPathSave.Font.Color := clWindowText;
ButtonPathSave.Font.CharSet := 1;
ButtonPathSave.TabOrder := 3;
ButtonPathSave.TabStop := TRUE;
ButtonPathSave.Cancel := FALSE;
ButtonPathSave.ModalResult := 0;
ButtonPathSave.OnClick := @ButtonPathSave_Click;
//......................................
//......................................
//ButtonPathRec
ButtonPathRec := TButton.Create(Result);
ButtonPathRec.Parent := GroupBox1;
ButtonPathRec.Left := 14;
ButtonPathRec.Top := 42;
ButtonPathRec.Width := 75;
ButtonPathRec.Height := 25;
ButtonPathRec.Visible := TRUE;
ButtonPathRec.Tag := 0;
ButtonPathRec.Enabled := TRUE;
ButtonPathRec.Hint := '';
ButtonPathRec.ShowHint := FALSE;
ButtonPathRec.Caption := 'Rec';
ButtonPathRec.Font.Name := 'Tahoma';
ButtonPathRec.Font.Size := 8;
ButtonPathRec.Font.Color := clWindowText;
ButtonPathRec.Font.CharSet := 1;
ButtonPathRec.TabOrder := 4;
ButtonPathRec.TabStop := TRUE;
ButtonPathRec.Cancel := FALSE;
ButtonPathRec.ModalResult := 0;
ButtonPathRec.OnClick := @ButtonPathRec_Click;
//......................................
//......................................
//EditPath
EditPath := TEdit.Create(Result);
EditPath.Parent := GroupBox1;
EditPath.Left := 67;
EditPath.Top := 15;
EditPath.Width := 109;
EditPath.Height := 21;
EditPath.Visible := TRUE;
EditPath.Tag := 0;
EditPath.Enabled := TRUE;
EditPath.Hint := 'Введи имя файла для сохранения пути';
EditPath.ShowHint := TRUE;
EditPath.Text := 'Mestolovli1';
EditPath.Font.Name := 'Tahoma';
EditPath.Font.Size := 8;
EditPath.Font.Color := clWindowText;
EditPath.Color := clWindow;
EditPath.TabOrder := 5;
EditPath.TabStop := TRUE;
EditPath.ReadOnly := FALSE;
EditPath.MaxLength := 0;
EditPath.AutoSize := TRUE;
// EditPath.OnChange := @EditPath_Change;
//......................................
//......................................
//ComboBoxPath
ComboBoxPath := TComboBox.Create(Result);
ComboBoxPath.Parent := GroupBox1;
ComboBoxPath.Left := 187;
ComboBoxPath.Top := 15;
ComboBoxPath.Width := 231;
ComboBoxPath.Height := 21;
ComboBoxPath.Visible := TRUE;
ComboBoxPath.Tag := 0;
ComboBoxPath.Enabled := TRUE;
ComboBoxPath.Hint := 'Выбери из списка путь для движения';
ComboBoxPath.ShowHint := TRUE;
ComboBoxPath.Text := 'Mestolovli1';
ComboBoxPath.Font.Name := 'Tahoma';
ComboBoxPath.Font.Size := 8;
ComboBoxPath.Font.Color := clWindowText;
ComboBoxPath.Color := clWindow;
ComboBoxPath.TabOrder := 6;
ComboBoxPath.TabStop := TRUE;
ComboBoxPath.Sorted := FALSE;
ComboBoxPath.ItemHeight := 13;
ComboBoxPath.OnChange := @ComboBoxPath_Change;
ComboBoxPath.Items.ADD('Mestolovli1');
ComboBoxPath.Items.ADD('Mestolovli2');
ComboBoxPath.Items.ADD('Mestolovli3');
ComboBoxPath.Items.ADD('MenayemMesto1');
ComboBoxPath.Items.ADD('MenayemMesto2');
ComboBoxPath.Items.ADD('MenayemMesto3');
ComboBoxPath.Items.ADD('Reposition1');
ComboBoxPath.Items.ADD('Reposition2');
ComboBoxPath.Items.ADD('Reposition3');
ComboBoxPath.Items.ADD('AfterDeath1');
ComboBoxPath.Items.ADD('AfterDeath2');
ComboBoxPath.Items.ADD('AfterDeath3');
ComboBoxPath.ItemIndex := 0;
//......................................
//......................................
//GroupBox2
GroupBox2 := TGroupBox.Create(Result);
GroupBox2.Parent := Panel1;
GroupBox2.Left := 1;
GroupBox2.Top := -2;
GroupBox2.Width := 421;
GroupBox2.Height := 195;
GroupBox2.Visible := TRUE;
GroupBox2.Tag := 0;
GroupBox2.Enabled := TRUE;
GroupBox2.Hint := '';
GroupBox2.ShowHint := FALSE;
GroupBox2.Caption := 'Рыбалка';
GroupBox2.Align := alNone;
GroupBox2.Color := clBtnFace;
GroupBox2.Font.Name := 'Tahoma';
GroupBox2.Font.Size := 8;
GroupBox2.Font.Color := clWindowText;
GroupBox2.Font.CharSet := 1;
GroupBox2.TabOrder := 1;
GroupBox2.TabStop := FALSE;
//......................................
//......................................
//Label2
Label2 := TLabel.Create(Result);
Label2.Parent := GroupBox2;
Label2.Left := 400;
Label2.Top := 19;
Label2.Width := 18;
Label2.Height := 13;
Label2.Visible := TRUE;
Label2.Tag := 0;
Label2.Enabled := TRUE;
Label2.Hint := '';
Label2.ShowHint := FALSE;
Label2.Caption := 'шт.';
Label2.Transparent := TRUE;
Label2.WordWrap := FALSE;
Label2.Alignment := taLeftJustify;
Label2.Layout := tlTop;
Label2.AutoSize := TRUE;
Label2.Align := alNone;
Label2.Font.Name := 'Tahoma';
Label2.Font.Size := 8;
Label2.Font.Color := clWindowText;
Label2.Color := clBtnFace;
//......................................
//......................................
//Label4
Label4 := TLabel.Create(Result);
Label4.Parent := GroupBox2;
Label4.Left := 400;
Label4.Top := 43;
Label4.Width := 18;
Label4.Height := 13;
Label4.Visible := TRUE;
Label4.Tag := 0;
Label4.Enabled := TRUE;
Label4.Hint := '';
Label4.ShowHint := FALSE;
Label4.Caption := 'шт.';
Label4.Transparent := TRUE;
Label4.WordWrap := FALSE;
Label4.Alignment := taLeftJustify;
Label4.Layout := tlTop;
Label4.AutoSize := TRUE;
Label4.Align := alNone;
Label4.Font.Name := 'Tahoma';
Label4.Font.Size := 8;
Label4.Font.Color := clWindowText;
Label4.Color := clBtnFace;
//......................................
//......................................
//Label5
Label5 := TLabel.Create(Result);
Label5.Parent := GroupBox2;
Label5.Left := 400;
Label5.Top := 67;
Label5.Width := 18;
Label5.Height := 13;
Label5.Visible := TRUE;
Label5.Tag := 0;
Label5.Enabled := TRUE;
Label5.Hint := '';
Label5.ShowHint := FALSE;
Label5.Caption := 'шт.';
Label5.Transparent := TRUE;
Label5.WordWrap := FALSE;
Label5.Alignment := taLeftJustify;
Label5.Layout := tlTop;
Label5.AutoSize := TRUE;
Label5.Align := alNone;
Label5.Font.Name := 'Tahoma';
Label5.Font.Size := 8;
Label5.Font.Color := clWindowText;
Label5.Color := clBtnFace;
//......................................
//......................................
//Label6
Label6 := TLabel.Create(Result);
Label6.Parent := GroupBox2;
Label6.Left := 400;
Label6.Top := 91;
Label6.Width := 18;
Label6.Height := 13;
Label6.Visible := TRUE;
Label6.Tag := 0;
Label6.Enabled := TRUE;
Label6.Hint := '';
Label6.ShowHint := FALSE;
Label6.Caption := 'шт.';
Label6.Transparent := TRUE;
Label6.WordWrap := FALSE;
Label6.Alignment := taLeftJustify;
Label6.Layout := tlTop;
Label6.AutoSize := TRUE;
Label6.Align := alNone;
Label6.Font.Name := 'Tahoma';
Label6.Font.Size := 8;
Label6.Font.Color := clWindowText;
Label6.Color := clBtnFace;
//......................................
//......................................
//Label7
Label7 := TLabel.Create(Result);
Label7.Parent := GroupBox2;
Label7.Left := 400;
Label7.Top := 116;
Label7.Width := 18;
Label7.Height := 13;
Label7.Visible := TRUE;
Label7.Tag := 0;
Label7.Enabled := TRUE;
Label7.Hint := '';
Label7.ShowHint := FALSE;
Label7.Caption := 'шт.';
Label7.Transparent := TRUE;
Label7.WordWrap := FALSE;
Label7.Alignment := taLeftJustify;
Label7.Layout := tlTop;
Label7.AutoSize := TRUE;
Label7.Align := alNone;
Label7.Font.Name := 'Tahoma';
Label7.Font.Size := 8;
Label7.Font.Color := clWindowText;
Label7.Color := clBtnFace;
//......................................
//......................................
//Label12
Label12 := TLabel.Create(Result);
Label12.Parent := GroupBox2;
Label12.Left := 257;
Label12.Top := 3;
Label12.Width := 33;
Label12.Height := 13;
Label12.Visible := TRUE;
Label12.Tag := 0;
Label12.Enabled := TRUE;
Label12.Hint := '';
Label12.ShowHint := FALSE;
Label12.Caption := 'ItemID';
Label12.Transparent := TRUE;
Label12.WordWrap := FALSE;
Label12.Alignment := taLeftJustify;
Label12.Layout := tlTop;
Label12.AutoSize := TRUE;
Label12.Align := alNone;
Label12.Font.Name := 'Tahoma';
Label12.Font.Size := 8;
Label12.Font.Color := clWindowText;
Label12.Color := clBtnFace;
//......................................
//......................................
//Label13
Label13 := TLabel.Create(Result);
Label13.Parent := GroupBox2;
Label13.Left := 333;
Label13.Top := 3;
Label13.Width := 35;
Label13.Height := 13;
Label13.Visible := TRUE;
Label13.Tag := 0;
Label13.Enabled := TRUE;
Label13.Hint := '';
Label13.ShowHint := FALSE;
Label13.Caption := 'Кол-во';
Label13.Transparent := TRUE;
Label13.WordWrap := FALSE;
Label13.Alignment := taLeftJustify;
Label13.Layout := tlTop;
Label13.AutoSize := TRUE;
Label13.Align := alNone;
Label13.Font.Name := 'Tahoma';
Label13.Font.Size := 8;
Label13.Font.Color := clWindowText;
Label13.Color := clBtnFace;
//......................................
//......................................
//CheckBoxRod
CheckBoxRod := TCheckBox.Create(Result);
CheckBoxRod.Parent := GroupBox2;
CheckBoxRod.Left := 18;
CheckBoxRod.Top := 18;
CheckBoxRod.Width := 55;
CheckBoxRod.Height := 17;
CheckBoxRod.Visible := TRUE;
CheckBoxRod.Tag := 0;
CheckBoxRod.Enabled := TRUE;
CheckBoxRod.Hint := 'Поставить галочку если выбрали удочку';
CheckBoxRod.ShowHint := TRUE;
CheckBoxRod.Caption := 'Rod';
CheckBoxRod.Font.Name := 'Tahoma';
CheckBoxRod.Font.Size := 8;
CheckBoxRod.Font.Color := clWindowText;
CheckBoxRod.Color := clBtnFace;
CheckBoxRod.TabOrder := 0;
CheckBoxRod.TabStop := TRUE;
CheckBoxRod.Checked := FALSE;
CheckBoxRod.AllowGrayed := FALSE;
CheckBoxRod.State := cbUnchecked;
CheckBoxRod.OnClick := @CheckBoxRod_Click;
//......................................
//......................................
//ComboBoxRod
ComboBoxRod := TComboBox.Create(Result);
ComboBoxRod.Parent := GroupBox2;
ComboBoxRod.Left := 74;
ComboBoxRod.Top := 16;
ComboBoxRod.Width := 169;
ComboBoxRod.Height := 21;
ComboBoxRod.Visible := TRUE;
ComboBoxRod.Tag := 0;
ComboBoxRod.Enabled := TRUE;
ComboBoxRod.Hint := 'Выбери из списка удочку';
ComboBoxRod.ShowHint := TRUE;
ComboBoxRod.Text := 'ComboBoxRod';
ComboBoxRod.Font.Name := 'Tahoma';
ComboBoxRod.Font.Size := 8;
ComboBoxRod.Font.Color := clWindowText;
ComboBoxRod.Color := clWindow;
ComboBoxRod.TabOrder := 1;
ComboBoxRod.TabStop := TRUE;
ComboBoxRod.ItemIndex := -1;
ComboBoxRod.Sorted := FALSE;
ComboBoxRod.ItemHeight := 13;
ComboBoxRod.OnChange := @ComboBoxRod_Change;
//......................................
//......................................
//ComboBoxFShot
ComboBoxFShot := TComboBox.Create(Result);
ComboBoxFShot.Parent := GroupBox2;
ComboBoxFShot.Left := 74;
ComboBoxFShot.Top := 113;
ComboBoxFShot.Width := 169;
ComboBoxFShot.Height := 21;
ComboBoxFShot.Visible := TRUE;
ComboBoxFShot.Tag := 0;
ComboBoxFShot.Enabled := TRUE;
ComboBoxFShot.Hint := 'Выбери из списка фишиншоты';
ComboBoxFShot.ShowHint := TRUE;
ComboBoxFShot.Text := 'ComboBoxFShot';
ComboBoxFShot.Font.Name := 'Tahoma';
ComboBoxFShot.Font.Size := 8;
ComboBoxFShot.Font.Color := clWindowText;
ComboBoxFShot.Color := clWindow;
ComboBoxFShot.TabOrder := 2;
ComboBoxFShot.TabStop := TRUE;
ComboBoxFShot.ItemIndex := -1;
ComboBoxFShot.Sorted := FALSE;
ComboBoxFShot.ItemHeight := 13;
ComboBoxFShot.OnChange := @ComboBoxFShot_Change;
//......................................
//......................................
//ButtonFishingStart
ButtonFishingStart := TButton.Create(Result);
ButtonFishingStart.Parent := GroupBox2;
ButtonFishingStart.Left := 168;
ButtonFishingStart.Top := 159;
ButtonFishingStart.Width := 75;
ButtonFishingStart.Height := 25;
ButtonFishingStart.Visible := TRUE;
ButtonFishingStart.Tag := 0;
ButtonFishingStart.Enabled := TRUE;
ButtonFishingStart.Hint := 'Начать рыбалку';
ButtonFishingStart.ShowHint := TRUE;
ButtonFishingStart.Caption := 'Start';
ButtonFishingStart.Font.Name := 'Tahoma';
ButtonFishingStart.Font.Size := 8;
ButtonFishingStart.Font.Color := clWindowText;
ButtonFishingStart.Font.CharSet := 1;
ButtonFishingStart.TabOrder := 3;
ButtonFishingStart.TabStop := TRUE;
ButtonFishingStart.Cancel := FALSE;
ButtonFishingStart.ModalResult := 0;
ButtonFishingStart.OnClick := @ButtonFishingStart_Click;
//......................................
//......................................
//ButtonFishingStop
ButtonFishingStop := TButton.Create(Result);
ButtonFishingStop.Parent := GroupBox2;
ButtonFishingStop.Left := 306;
ButtonFishingStop.Top := 159;
ButtonFishingStop.Width := 75;
ButtonFishingStop.Height := 25;
ButtonFishingStop.Visible := TRUE;
ButtonFishingStop.Tag := 0;
ButtonFishingStop.Enabled := TRUE;
ButtonFishingStop.Hint := 'Остановить рыбалку';
ButtonFishingStop.ShowHint := TRUE;
ButtonFishingStop.Caption := 'Stop';
ButtonFishingStop.Font.Name := 'Tahoma';
ButtonFishingStop.Font.Size := 8;
ButtonFishingStop.Font.Color := clWindowText;
ButtonFishingStop.Font.CharSet := 1;
ButtonFishingStop.TabOrder := 4;
ButtonFishingStop.TabStop := TRUE;
ButtonFishingStop.Cancel := FALSE;
ButtonFishingStop.ModalResult := 0;
ButtonFishingStop.OnClick := @ButtonFishingStop_Click;
//......................................
//......................................
//CheckBoxLure
CheckBoxLure := TCheckBox.Create(Result);
CheckBoxLure.Parent := GroupBox2;
CheckBoxLure.Left := 18;
CheckBoxLure.Top := 41;
CheckBoxLure.Width := 55;
CheckBoxLure.Height := 23;
CheckBoxLure.Visible := TRUE;
CheckBoxLure.Tag := 0;
CheckBoxLure.Enabled := TRUE;
CheckBoxLure.Hint := 'Поставить галочку если выбрали крючёк';
CheckBoxLure.ShowHint := TRUE;
CheckBoxLure.Caption := 'Lure';
CheckBoxLure.Font.Name := 'Tahoma';
CheckBoxLure.Font.Size := 8;
CheckBoxLure.Font.Color := clWindowText;
CheckBoxLure.Color := clBtnFace;
CheckBoxLure.TabOrder := 5;
CheckBoxLure.TabStop := TRUE;
CheckBoxLure.Checked := FALSE;
CheckBoxLure.AllowGrayed := FALSE;
CheckBoxLure.State := cbUnchecked;
CheckBoxLure.OnClick := @CheckBoxLure_Click;
//......................................
//......................................
//CheckBoxWeapon
CheckBoxWeapon := TCheckBox.Create(Result);
CheckBoxWeapon.Parent := GroupBox2;
CheckBoxWeapon.Left := 18;
CheckBoxWeapon.Top := 64;
CheckBoxWeapon.Width := 55;
CheckBoxWeapon.Height := 22;
CheckBoxWeapon.Visible := TRUE;
CheckBoxWeapon.Tag := 0;
CheckBoxWeapon.Enabled := TRUE;
CheckBoxWeapon.Hint := 'Поставить галочку если выбрали оружие';
CheckBoxWeapon.ShowHint := TRUE;
CheckBoxWeapon.Caption := 'Weapon';
CheckBoxWeapon.Font.Name := 'Tahoma';
CheckBoxWeapon.Font.Size := 8;
CheckBoxWeapon.Font.Color := clWindowText;
CheckBoxWeapon.Color := clBtnFace;
CheckBoxWeapon.TabOrder := 6;
CheckBoxWeapon.TabStop := TRUE;
CheckBoxWeapon.Checked := FALSE;
CheckBoxWeapon.AllowGrayed := FALSE;
CheckBoxWeapon.State := cbUnchecked;
CheckBoxWeapon.OnClick := @CheckBoxWeapon_Click;
//......................................
//......................................
//CheckBoxShield
CheckBoxShield := TCheckBox.Create(Result);
CheckBoxShield.Parent := GroupBox2;
CheckBoxShield.Left := 18;
CheckBoxShield.Top := 92;
CheckBoxShield.Width := 52;
CheckBoxShield.Height := 17;
CheckBoxShield.Visible := TRUE;
CheckBoxShield.Tag := 0;
CheckBoxShield.Enabled := TRUE;
CheckBoxShield.Hint := 'Поставить галочку если выбрали щит';
CheckBoxShield.ShowHint := TRUE;
CheckBoxShield.Caption := 'Shield';
CheckBoxShield.Font.Name := 'Tahoma';
CheckBoxShield.Font.Size := 8;
CheckBoxShield.Font.Color := clWindowText;
CheckBoxShield.Color := clBtnFace;
CheckBoxShield.TabOrder := 7;
CheckBoxShield.TabStop := TRUE;
CheckBoxShield.Checked := FALSE;
CheckBoxShield.AllowGrayed := FALSE;
CheckBoxShield.State := cbUnchecked;
CheckBoxShield.OnClick := @CheckBoxShield_Click;
//......................................
//......................................
//CheckBoxFShot
CheckBoxFShot := TCheckBox.Create(Result);
CheckBoxFShot.Parent := GroupBox2;
CheckBoxFShot.Left := 18;
CheckBoxFShot.Top := 116;
CheckBoxFShot.Width := 52;
CheckBoxFShot.Height := 17;
CheckBoxFShot.Visible := TRUE;
CheckBoxFShot.Tag := 0;
CheckBoxFShot.Enabled := TRUE;
CheckBoxFShot.Hint := 'Поставить галочку если выбрали фишиншоты';
CheckBoxFShot.ShowHint := TRUE;
CheckBoxFShot.Caption := 'FShot';
CheckBoxFShot.Font.Name := 'Tahoma';
CheckBoxFShot.Font.Size := 8;
CheckBoxFShot.Font.Color := clWindowText;
CheckBoxFShot.Color := clBtnFace;
CheckBoxFShot.TabOrder := 8;
CheckBoxFShot.TabStop := TRUE;
CheckBoxFShot.Checked := FALSE;
CheckBoxFShot.AllowGrayed := FALSE;
CheckBoxFShot.State := cbUnchecked;
CheckBoxFShot.OnClick := @CheckBoxFShot_Click;
//......................................
//......................................
//ComboBoxLure
ComboBoxLure := TComboBox.Create(Result);
ComboBoxLure.Parent := GroupBox2;
ComboBoxLure.Left := 74;
ComboBoxLure.Top := 40;
ComboBoxLure.Width := 169;
ComboBoxLure.Height := 21;
ComboBoxLure.Visible := TRUE;
ComboBoxLure.Tag := 0;
ComboBoxLure.Enabled := TRUE;
ComboBoxLure.Hint := 'Выбери из списка крючёк';
ComboBoxLure.ShowHint := TRUE;
ComboBoxLure.Text := 'ComboBoxLure';
ComboBoxLure.Font.Name := 'Tahoma';
ComboBoxLure.Font.Size := 8;
ComboBoxLure.Font.Color := clWindowText;
ComboBoxLure.Color := clWindow;
ComboBoxLure.TabOrder := 9;
ComboBoxLure.TabStop := TRUE;
ComboBoxLure.ItemIndex := -1;
ComboBoxLure.Sorted := FALSE;
ComboBoxLure.ItemHeight := 13;
ComboBoxLure.OnChange := @ComboBoxLure_Change;
//......................................
//......................................
//ComboBoxWeapon
ComboBoxWeapon := TComboBox.Create(Result);
ComboBoxWeapon.Parent := GroupBox2;
ComboBoxWeapon.Left := 74;
ComboBoxWeapon.Top := 64;
ComboBoxWeapon.Width := 169;
ComboBoxWeapon.Height := 21;
ComboBoxWeapon.Visible := TRUE;
ComboBoxWeapon.Tag := 0;
ComboBoxWeapon.Enabled := TRUE;
ComboBoxWeapon.Hint := 'Выбери из списка оружие';
ComboBoxWeapon.ShowHint := TRUE;
ComboBoxWeapon.Text := 'ComboBoxWeapon';
ComboBoxWeapon.Font.Name := 'Tahoma';
ComboBoxWeapon.Font.Size := 8;
ComboBoxWeapon.Font.Color := clWindowText;
ComboBoxWeapon.Color := clWindow;
ComboBoxWeapon.TabOrder := 10;
ComboBoxWeapon.TabStop := TRUE;
ComboBoxWeapon.ItemIndex := -1;
ComboBoxWeapon.Sorted := FALSE;
ComboBoxWeapon.ItemHeight := 13;
ComboBoxWeapon.OnChange := @ComboBoxWeapon_Change;
//......................................
//......................................
//ComboBoxShield
ComboBoxShield := TComboBox.Create(Result);
ComboBoxShield.Parent := GroupBox2;
ComboBoxShield.Left := 74;
ComboBoxShield.Top := 88;
ComboBoxShield.Width := 169;
ComboBoxShield.Height := 21;
ComboBoxShield.Visible := TRUE;
ComboBoxShield.Tag := 0;
ComboBoxShield.Enabled := TRUE;
ComboBoxShield.Hint := 'Выбери из списка щит';
ComboBoxShield.ShowHint := TRUE;
ComboBoxShield.Text := 'ComboBoxShield';
ComboBoxShield.Font.Name := 'Tahoma';
ComboBoxShield.Font.Size := 8;
ComboBoxShield.Font.Color := clWindowText;
ComboBoxShield.Color := clWindow;
ComboBoxShield.TabOrder := 11;
ComboBoxShield.TabStop := TRUE;
ComboBoxShield.ItemIndex := -1;
ComboBoxShield.Sorted := FALSE;
ComboBoxShield.ItemHeight := 13;
ComboBoxShield.OnChange := @ComboBoxShield_Change;
//......................................
//......................................
//CheckBoxFO
CheckBoxFO := TCheckBox.Create(Result);
CheckBoxFO.Parent := GroupBox2;
CheckBoxFO.Left := 18;
CheckBoxFO.Top := 140;
CheckBoxFO.Width := 105;
CheckBoxFO.Height := 17;
CheckBoxFO.Visible := TRUE;
CheckBoxFO.Tag := 0;
CheckBoxFO.Enabled := TRUE;
CheckBoxFO.Hint := 'Поставить галочку если хотим преобразовывать масло';
CheckBoxFO.ShowHint := TRUE;
CheckBoxFO.Caption := 'FO->GFO->PFO';
CheckBoxFO.Font.Name := 'Tahoma';
CheckBoxFO.Font.Size := 8;
CheckBoxFO.Font.Color := clWindowText;
CheckBoxFO.Color := clBtnFace;
CheckBoxFO.TabOrder := 12;
CheckBoxFO.TabStop := TRUE;
CheckBoxFO.Checked := FALSE;
CheckBoxFO.AllowGrayed := FALSE;
CheckBoxFO.State := cbUnchecked;
CheckBoxFO.OnClick := @CheckBoxFO_Click;
//......................................
//......................................
//CheckBoxPU
CheckBoxPU := TCheckBox.Create(Result);
CheckBoxPU.Parent := GroupBox2;
CheckBoxPU.Left := 18;
CheckBoxPU.Top := 163;
CheckBoxPU.Width := 105;
CheckBoxPU.Height := 17;
CheckBoxPU.Visible := TRUE;
CheckBoxPU.Tag := 0;
CheckBoxPU.Enabled := TRUE;
CheckBoxPU.Hint := 'Поставить галочку если хотим потрошить улов';
CheckBoxPU.ShowHint := TRUE;
CheckBoxPU.Caption := 'Потрошить улов';
CheckBoxPU.Font.Name := 'Tahoma';
CheckBoxPU.Font.Size := 8;
CheckBoxPU.Font.Color := clWindowText;
CheckBoxPU.Color := clBtnFace;
CheckBoxPU.TabOrder := 13;
CheckBoxPU.TabStop := TRUE;
CheckBoxPU.Checked := FALSE;
CheckBoxPU.AllowGrayed := FALSE;
CheckBoxPU.State := cbUnchecked;
CheckBoxPU.OnClick := @CheckBoxPU_Click;
//......................................
//......................................
//EditRodVal
EditRodVal := TEdit.Create(Result);
EditRodVal.Parent := GroupBox2;
EditRodVal.Left := 325;
EditRodVal.Top := 16;
EditRodVal.Width := 72;
EditRodVal.Height := 21;
EditRodVal.Visible := TRUE;
EditRodVal.Tag := 0;
EditRodVal.Enabled := TRUE;
EditRodVal.Hint := '';
EditRodVal.ShowHint := FALSE;
EditRodVal.Text := '0';
EditRodVal.Font.Name := 'Tahoma';
EditRodVal.Font.Size := 8;
EditRodVal.Font.Color := clWindowText;
EditRodVal.Color := clWindow;
EditRodVal.TabOrder := 14;
EditRodVal.TabStop := TRUE;
EditRodVal.ReadOnly := TRUE;
EditRodVal.MaxLength := 0;
EditRodVal.AutoSize := TRUE;
//......................................
//......................................
//EditLureVal
EditLureVal := TEdit.Create(Result);
EditLureVal.Parent := GroupBox2;
EditLureVal.Left := 325;
EditLureVal.Top := 40;
EditLureVal.Width := 72;
EditLureVal.Height := 21;
EditLureVal.Visible := TRUE;
EditLureVal.Tag := 0;
EditLureVal.Enabled := TRUE;
EditLureVal.Hint := '';
EditLureVal.ShowHint := FALSE;
EditLureVal.Text := '0';
EditLureVal.Font.Name := 'Tahoma';
EditLureVal.Font.Size := 8;
EditLureVal.Font.Color := clWindowText;
EditLureVal.Color := clWindow;
EditLureVal.TabOrder := 15;
EditLureVal.TabStop := TRUE;
EditLureVal.ReadOnly := TRUE;
EditLureVal.MaxLength := 0;
EditLureVal.AutoSize := TRUE;
//......................................
//......................................
//EditWeaponVal
EditWeaponVal := TEdit.Create(Result);
EditWeaponVal.Parent := GroupBox2;
EditWeaponVal.Left := 325;
EditWeaponVal.Top := 64;
EditWeaponVal.Width := 72;
EditWeaponVal.Height := 21;
EditWeaponVal.Visible := TRUE;
EditWeaponVal.Tag := 0;
EditWeaponVal.Enabled := TRUE;
EditWeaponVal.Hint := '';
EditWeaponVal.ShowHint := FALSE;
EditWeaponVal.Text := '0';
EditWeaponVal.Font.Name := 'Tahoma';
EditWeaponVal.Font.Size := 8;
EditWeaponVal.Font.Color := clWindowText;
EditWeaponVal.Color := clWindow;
EditWeaponVal.TabOrder := 16;
EditWeaponVal.TabStop := TRUE;
EditWeaponVal.ReadOnly := TRUE;
EditWeaponVal.MaxLength := 0;
EditWeaponVal.AutoSize := TRUE;
//......................................
//......................................
//Edit6
EditShieldVal := TEdit.Create(Result);
EditShieldVal.Parent := GroupBox2;
EditShieldVal.Left := 325;
EditShieldVal.Top := 88;
EditShieldVal.Width := 72;
EditShieldVal.Height := 21;
EditShieldVal.Visible := TRUE;
EditShieldVal.Tag := 0;
EditShieldVal.Enabled := TRUE;
EditShieldVal.Hint := '';
EditShieldVal.ShowHint := FALSE;
EditShieldVal.Text := '0';
EditShieldVal.Font.Name := 'Tahoma';
EditShieldVal.Font.Size := 8;
EditShieldVal.Font.Color := clWindowText;
EditShieldVal.Color := clWindow;
EditShieldVal.TabOrder := 17;
EditShieldVal.TabStop := TRUE;
EditShieldVal.ReadOnly := TRUE;
EditShieldVal.MaxLength := 0;
EditShieldVal.AutoSize := TRUE;
//......................................
//......................................
//Edit7
EditFShotVal := TEdit.Create(Result);
EditFShotVal.Parent := GroupBox2;
EditFShotVal.Left := 325;
EditFShotVal.Top := 113;
EditFShotVal.Width := 72;
EditFShotVal.Height := 21;
EditFShotVal.Visible := TRUE;
EditFShotVal.Tag := 0;
EditFShotVal.Enabled := TRUE;
EditFShotVal.Hint := '';
EditFShotVal.ShowHint := FALSE;
EditFShotVal.Text := '0';
EditFShotVal.Font.Name := 'Tahoma';
EditFShotVal.Font.Size := 8;
EditFShotVal.Font.Color := clWindowText;
EditFShotVal.Color := clWindow;
EditFShotVal.TabOrder := 18;
EditFShotVal.TabStop := TRUE;
EditFShotVal.ReadOnly := TRUE;
EditFShotVal.MaxLength := 0;
EditFShotVal.AutoSize := TRUE;
//......................................
//......................................
//EditLureOID
EditLureOID := TEdit.Create(Result);
EditLureOID.Parent := GroupBox2;
EditLureOID.Left := 248;
EditLureOID.Top := 40;
EditLureOID.Width := 72;
EditLureOID.Height := 21;
EditLureOID.Visible := TRUE;
EditLureOID.Tag := 0;
EditLureOID.Enabled := TRUE;
EditLureOID.Hint := '';
EditLureOID.ShowHint := FALSE;
EditLureOID.Text := '0';
EditLureOID.Font.Name := 'Tahoma';
EditLureOID.Font.Size := 8;
EditLureOID.Font.Color := clWindowText;
EditLureOID.Color := clWindow;
EditLureOID.TabOrder := 19;
EditLureOID.TabStop := TRUE;
EditLureOID.ReadOnly := TRUE;
EditLureOID.MaxLength := 0;
EditLureOID.AutoSize := TRUE;
//......................................
//......................................
//EditWeaponOID
EditWeaponOID := TEdit.Create(Result);
EditWeaponOID.Parent := GroupBox2;
EditWeaponOID.Left := 248;
EditWeaponOID.Top := 64;
EditWeaponOID.Width := 72;
EditWeaponOID.Height := 21;
EditWeaponOID.Visible := TRUE;
EditWeaponOID.Tag := 0;
EditWeaponOID.Enabled := TRUE;
EditWeaponOID.Hint := '';
EditWeaponOID.ShowHint := FALSE;
EditWeaponOID.Text := '0';
EditWeaponOID.Font.Name := 'Tahoma';
EditWeaponOID.Font.Size := 8;
EditWeaponOID.Font.Color := clWindowText;
EditWeaponOID.Color := clWindow;
EditWeaponOID.TabOrder := 20;
EditWeaponOID.TabStop := TRUE;
EditWeaponOID.ReadOnly := TRUE;
EditWeaponOID.MaxLength := 0;
EditWeaponOID.AutoSize := TRUE;
//......................................
//......................................
//EditShieldOID
EditShieldOID := TEdit.Create(Result);
EditShieldOID.Parent := GroupBox2;
EditShieldOID.Left := 248;
EditShieldOID.Top := 88;
EditShieldOID.Width := 72;
EditShieldOID.Height := 21;
EditShieldOID.Visible := TRUE;
EditShieldOID.Tag := 0;
EditShieldOID.Enabled := TRUE;
EditShieldOID.Hint := '';
EditShieldOID.ShowHint := FALSE;
EditShieldOID.Text := '0';
EditShieldOID.Font.Name := 'Tahoma';
EditShieldOID.Font.Size := 8;
EditShieldOID.Font.Color := clWindowText;
EditShieldOID.Color := clWindow;
EditShieldOID.TabOrder := 21;
EditShieldOID.TabStop := TRUE;
EditShieldOID.ReadOnly := TRUE;
EditShieldOID.MaxLength := 0;
EditShieldOID.AutoSize := TRUE;
//......................................
//......................................
//EditFShotOID
EditFShotOID := TEdit.Create(Result);
EditFShotOID.Parent := GroupBox2;
EditFShotOID.Left := 248;
EditFShotOID.Top := 113;
EditFShotOID.Width := 72;
EditFShotOID.Height := 21;
EditFShotOID.Visible := TRUE;
EditFShotOID.Tag := 0;
EditFShotOID.Enabled := TRUE;
EditFShotOID.Hint := '';
EditFShotOID.ShowHint := FALSE;
EditFShotOID.Text := '0';
EditFShotOID.Font.Name := 'Tahoma';
EditFShotOID.Font.Size := 8;
EditFShotOID.Font.Color := clWindowText;
EditFShotOID.Color := clWindow;
EditFShotOID.TabOrder := 22;
EditFShotOID.TabStop := TRUE;
EditFShotOID.ReadOnly := TRUE;
EditFShotOID.MaxLength := 0;
EditFShotOID.AutoSize := TRUE;
//......................................
//......................................
//EditRodOID
EditRodOID := TEdit.Create(Result);
EditRodOID.Parent := GroupBox2;
EditRodOID.Left := 248;
EditRodOID.Top := 16;
EditRodOID.Width := 72;
EditRodOID.Height := 21;
EditRodOID.Visible := TRUE;
EditRodOID.Tag := 0;
EditRodOID.Enabled := TRUE;
EditRodOID.Hint := '';
EditRodOID.ShowHint := FALSE;
EditRodOID.Text := '0';
EditRodOID.Font.Name := 'Tahoma';
EditRodOID.Font.Size := 8;
EditRodOID.Font.Color := clWindowText;
EditRodOID.Color := clWindow;
EditRodOID.TabOrder := 23;
EditRodOID.TabStop := TRUE;
EditRodOID.ReadOnly := TRUE;
EditRodOID.MaxLength := 0;
EditRodOID.AutoSize := TRUE;
//......................................
//......................................
//GroupBox3
GroupBox3 := TGroupBox.Create(Result);
GroupBox3.Parent := Panel1;
GroupBox3.Left := 1;
GroupBox3.Top := 270;
GroupBox3.Width := 421;
GroupBox3.Height := 75;
GroupBox3.Visible := TRUE;
GroupBox3.Tag := 0;
GroupBox3.Enabled := TRUE;
GroupBox3.Hint := '';
GroupBox3.ShowHint := FALSE;
GroupBox3.Caption := 'Продать/купить';
GroupBox3.Align := alNone;
GroupBox3.Color := clBtnFace;
GroupBox3.Font.Name := 'Tahoma';
GroupBox3.Font.Size := 8;
GroupBox3.Font.Color := clWindowText;
GroupBox3.Font.CharSet := 1;
GroupBox3.TabOrder := 2;
GroupBox3.TabStop := FALSE;
//......................................
//......................................
//Label8
Label8 := TLabel.Create(Result);
Label8.Parent := GroupBox3;
Label8.Left := 18;
Label8.Top := 44;
Label8.Width := 77;
Label8.Height := 13;
Label8.Visible := TRUE;
Label8.Tag := 0;
Label8.Enabled := TRUE;
Label8.Hint := '';
Label8.ShowHint := FALSE;
Label8.Caption := 'Покупать Lure:';
Label8.Transparent := TRUE;
Label8.WordWrap := FALSE;
Label8.Alignment := taLeftJustify;
Label8.Layout := tlTop;
Label8.AutoSize := TRUE;
Label8.Align := alNone;
Label8.Font.Name := 'Tahoma';
Label8.Font.Size := 8;
Label8.Font.Color := clWindowText;
Label8.Color := clBtnFace;
//......................................
//......................................
//Label9
Label9 := TLabel.Create(Result);
Label9.Parent := GroupBox3;
Label9.Left := 175;
Label9.Top := 44;
Label9.Width := 18;
Label9.Height := 13;
Label9.Visible := TRUE;
Label9.Tag := 0;
Label9.Enabled := TRUE;
Label9.Hint := '';
Label9.ShowHint := FALSE;
Label9.Caption := 'шт.';
Label9.Transparent := TRUE;
Label9.WordWrap := FALSE;
Label9.Alignment := taLeftJustify;
Label9.Layout := tlTop;
Label9.AutoSize := TRUE;
Label9.Align := alNone;
Label9.Font.Name := 'Tahoma';
Label9.Font.Size := 8;
Label9.Font.Color := clWindowText;
Label9.Color := clBtnFace;
//......................................
//......................................
//Label17
Label17 := TLabel.Create(Result);
Label17.Parent := GroupBox3;
Label17.Left := 257;
Label17.Top := 3;
Label17.Width := 29;
Label17.Height := 13;
Label17.Visible := TRUE;
Label17.Tag := 0;
Label17.Enabled := TRUE;
Label17.Hint := '';
Label17.ShowHint := FALSE;
Label17.Caption := 'NpcOID';
Label17.Transparent := TRUE;
Label17.WordWrap := FALSE;
Label17.Alignment := taLeftJustify;
Label17.Layout := tlTop;
Label17.AutoSize := TRUE;
Label17.Align := alNone;
Label17.Font.Name := 'Tahoma';
Label17.Font.Size := 8;
Label17.Font.Color := clWindowText;
Label17.Color := clBtnFace;
//......................................
//......................................
//CheckBoxFisherman
CheckBoxFisherman := TCheckBox.Create(Result);
CheckBoxFisherman.Parent := GroupBox3;
CheckBoxFisherman.Left := 18;
CheckBoxFisherman.Top := 18;
CheckBoxFisherman.Width := 66;
CheckBoxFisherman.Height := 17;
CheckBoxFisherman.Visible := TRUE;
CheckBoxFisherman.Tag := 0;
CheckBoxFisherman.Enabled := TRUE;
CheckBoxFisherman.Hint := 'Поставить галочку если выбрали продавца';
CheckBoxFisherman.ShowHint := TRUE;
CheckBoxFisherman.Caption := 'Fisherman';
CheckBoxFisherman.Font.Name := 'Tahoma';
CheckBoxFisherman.Font.Size := 8;
CheckBoxFisherman.Font.Color := clWindowText;
CheckBoxFisherman.Color := clBtnFace;
CheckBoxFisherman.TabOrder := 0;
CheckBoxFisherman.TabStop := TRUE;
CheckBoxFisherman.Checked := FALSE;
CheckBoxFisherman.AllowGrayed := FALSE;
CheckBoxFisherman.State := cbUnchecked;
CheckBoxFisherman.OnClick := @CheckBoxFisherman_Click;
//......................................
//......................................
//ComboBoxFisherman
ComboBoxFisherman := TComboBox.Create(Result);
ComboBoxFisherman.Parent := GroupBox3;
ComboBoxFisherman.Left := 90;
ComboBoxFisherman.Top := 16;
ComboBoxFisherman.Width := 144;
ComboBoxFisherman.Height := 21;
ComboBoxFisherman.Visible := TRUE;
ComboBoxFisherman.Tag := 0;
ComboBoxFisherman.Enabled := TRUE;
ComboBoxFisherman.Hint := 'Выбери из списка продавца';
ComboBoxFisherman.ShowHint := TRUE;
ComboBoxFisherman.Text := 'ComboBoxFisherman';
ComboBoxFisherman.Font.Name := 'Tahoma';
ComboBoxFisherman.Font.Size := 8;
ComboBoxFisherman.Font.Color := clWindowText;
ComboBoxFisherman.Color := clWindow;
ComboBoxFisherman.TabOrder := 1;
ComboBoxFisherman.TabStop := TRUE;
ComboBoxFisherman.ItemIndex := -1;
ComboBoxFisherman.Sorted := FALSE;
ComboBoxFisherman.ItemHeight := 13;
ComboBoxFisherman.OnChange := @ComboBoxFisherman_Change;
//......................................
//......................................
//EditFishermanOID
EditFishermanOID := TEdit.Create(Result);
EditFishermanOID.Parent := GroupBox3;
EditFishermanOID.Left := 240;
EditFishermanOID.Top := 16;
EditFishermanOID.Width := 72;
EditFishermanOID.Height := 21;
EditFishermanOID.Visible := TRUE;
EditFishermanOID.Tag := 0;
EditFishermanOID.Enabled := TRUE;
EditFishermanOID.Hint := '';
EditFishermanOID.ShowHint := FALSE;
EditFishermanOID.Text := '0';
EditFishermanOID.Font.Name := 'Tahoma';
EditFishermanOID.Font.Size := 8;
EditFishermanOID.Font.Color := clWindowText;
EditFishermanOID.Color := clWindow;
EditFishermanOID.TabOrder := 2;
EditFishermanOID.TabStop := TRUE;
EditFishermanOID.ReadOnly := TRUE;
EditFishermanOID.MaxLength := 0;
EditFishermanOID.AutoSize := TRUE;
// EditFishermanOID.OnClick := @EditFishermanOID_Click;
//......................................
//......................................
//EditLure
EditLure := TEdit.Create(Result);
EditLure.Parent := GroupBox3;
EditLure.Left := 97;
EditLure.Top := 41;
EditLure.Width := 72;
EditLure.Height := 21;
EditLure.Visible := TRUE;
EditLure.Tag := 0;
EditLure.Enabled := TRUE;
EditLure.Hint := 'Введи количество крючков для закупки';
EditLure.ShowHint := TRUE;
EditLure.Text := '300';
EditLure.Font.Name := 'Tahoma';
EditLure.Font.Size := 8;
EditLure.Font.Color := clWindowText;
EditLure.Color := clWindow;
EditLure.TabOrder := 3;
EditLure.TabStop := TRUE;
EditLure.ReadOnly := FALSE;
EditLure.MaxLength := 0;
EditLure.AutoSize := TRUE;
// EditLure.OnClick := @EditLure_Click;
EditLure.OnEnter := @EditLure_Change;
//......................................
//......................................
//GroupBox4
GroupBox4 := TGroupBox.Create(Result);
GroupBox4.Parent := Panel1;
GroupBox4.Left := 1;
GroupBox4.Top := 194;
GroupBox4.Width := 421;
GroupBox4.Height := 78;
GroupBox4.Visible := TRUE;
GroupBox4.Tag := 0;
GroupBox4.Enabled := TRUE;
GroupBox4.Hint := '';
GroupBox4.ShowHint := FALSE;
GroupBox4.Caption := 'Лечение';
GroupBox4.Align := alNone;
GroupBox4.Color := clBtnFace;
GroupBox4.Font.Name := 'Tahoma';
GroupBox4.Font.Size := 8;
GroupBox4.Font.Color := clWindowText;
GroupBox4.Font.CharSet := 1;
GroupBox4.TabOrder := 3;
GroupBox4.TabStop := FALSE;
//......................................
//......................................
//Label10
Label10 := TLabel.Create(Result);
Label10.Parent := GroupBox4;
Label10.Left := 18;
Label10.Top := 44;
Label10.Width := 69;
Label10.Height := 13;
Label10.Visible := TRUE;
Label10.Tag := 0;
Label10.Enabled := TRUE;
Label10.Hint := '';
Label10.ShowHint := FALSE;
Label10.Caption := 'Лечиться при';
Label10.Transparent := TRUE;
Label10.WordWrap := FALSE;
Label10.Alignment := taLeftJustify;
Label10.Layout := tlTop;
Label10.AutoSize := TRUE;
Label10.Align := alNone;
Label10.Font.Name := 'Tahoma';
Label10.Font.Size := 8;
Label10.Font.Color := clWindowText;
Label10.Color := clBtnFace;
//......................................
//......................................
//Label11
Label11 := TLabel.Create(Result);
Label11.Parent := GroupBox4;
Label11.Left := 400;
Label11.Top := 17;
Label11.Width := 18;
Label11.Height := 13;
Label11.Visible := TRUE;
Label11.Tag := 0;
Label11.Enabled := TRUE;
Label11.Hint := '';
Label11.ShowHint := FALSE;
Label11.Caption := 'шт.';
Label11.Transparent := TRUE;
Label11.WordWrap := FALSE;
Label11.Alignment := taLeftJustify;
Label11.Layout := tlTop;
Label11.AutoSize := TRUE;
Label11.Align := alNone;
Label11.Font.Name := 'Tahoma';
Label11.Font.Size := 8;
Label11.Font.Color := clWindowText;
Label11.Color := clBtnFace;
//......................................
//......................................
//Label3
Label3 := TLabel.Create(Result);
Label3.Parent := GroupBox4;
Label3.Left := 171;
Label3.Top := 44;
Label3.Width := 11;
Label3.Height := 13;
Label3.Visible := TRUE;
Label3.Tag := 0;
Label3.Enabled := TRUE;
Label3.Hint := '';
Label3.ShowHint := FALSE;
Label3.Caption := '%';
Label3.Transparent := TRUE;
Label3.WordWrap := FALSE;
Label3.Alignment := taLeftJustify;
Label3.Layout := tlTop;
Label3.AutoSize := TRUE;
Label3.Align := alNone;
Label3.Font.Name := 'Tahoma';
Label3.Font.Size := 8;
Label3.Font.Color := clWindowText;
Label3.Color := clBtnFace;
//......................................
//......................................
//Label14
Label14 := TLabel.Create(Result);
Label14.Parent := GroupBox4;
Label14.Left := 333;
Label14.Top := 3;
Label14.Width := 35;
Label14.Height := 13;
Label14.Visible := TRUE;
Label14.Tag := 0;
Label14.Enabled := TRUE;
Label14.Hint := '';
Label14.ShowHint := FALSE;
Label14.Caption := 'Кол-во';
Label14.Transparent := TRUE;
Label14.WordWrap := FALSE;
Label14.Alignment := taLeftJustify;
Label14.Layout := tlTop;
Label14.AutoSize := TRUE;
Label14.Align := alNone;
Label14.Font.Name := 'Tahoma';
Label14.Font.Size := 8;
Label14.Font.Color := clWindowText;
Label14.Color := clBtnFace;
//......................................
//......................................
//Label15
Label15 := TLabel.Create(Result);
Label15.Parent := GroupBox4;
Label15.Left := 257;
Label15.Top := 3;
Label15.Width := 33;
Label15.Height := 13;
Label15.Visible := TRUE;
Label15.Tag := 0;
Label15.Enabled := TRUE;
Label15.Hint := '';
Label15.ShowHint := FALSE;
Label15.Caption := 'ItemID';
Label15.Transparent := TRUE;
Label15.WordWrap := FALSE;
Label15.Alignment := taLeftJustify;
Label15.Layout := tlTop;
Label15.AutoSize := TRUE;
Label15.Align := alNone;
Label15.Font.Name := 'Tahoma';
Label15.Font.Size := 8;
Label15.Font.Color := clWindowText;
Label15.Color := clBtnFace;
//......................................
//......................................
//CheckBoxHPotion
CheckBoxHPotion := TCheckBox.Create(Result);
CheckBoxHPotion.Parent := GroupBox4;
CheckBoxHPotion.Left := 18;
CheckBoxHPotion.Top := 16;
CheckBoxHPotion.Width := 52;
CheckBoxHPotion.Height := 17;
CheckBoxHPotion.Visible := TRUE;
CheckBoxHPotion.Tag := 0;
CheckBoxHPotion.Enabled := TRUE;
CheckBoxHPotion.Hint := 'Поставить галочку если выбрали бутылки лечения';
CheckBoxHPotion.ShowHint := TRUE;
CheckBoxHPotion.Caption := 'HPotion';
CheckBoxHPotion.Font.Name := 'Tahoma';
CheckBoxHPotion.Font.Size := 8;
CheckBoxHPotion.Font.Color := clWindowText;
CheckBoxHPotion.Color := clBtnFace;
CheckBoxHPotion.TabOrder := 0;
CheckBoxHPotion.TabStop := TRUE;
CheckBoxHPotion.Checked := FALSE;
CheckBoxHPotion.AllowGrayed := FALSE;
CheckBoxHPotion.State := cbUnchecked;
CheckBoxHPotion.OnClick := @CheckBoxHPotion_Click;
//......................................
//......................................
//EditHealt
EditHealt := TEdit.Create(Result);
EditHealt.Parent := GroupBox4;
EditHealt.Left := 93;
EditHealt.Top := 41;
EditHealt.Width := 72;
EditHealt.Height := 21;
EditHealt.Visible := TRUE;
EditHealt.Tag := 0;
EditHealt.Enabled := TRUE;
EditHealt.Hint := 'Введи процент при котором начинать пить бутылки';
EditHealt.ShowHint := TRUE;
EditHealt.Text := '80';
EditHealt.Font.Name := 'Tahoma';
EditHealt.Font.Size := 8;
EditHealt.Font.Color := clWindowText;
EditHealt.Color := clWindow;
EditHealt.TabOrder := 1;
EditHealt.TabStop := TRUE;
EditHealt.ReadOnly := FALSE;
EditHealt.MaxLength := 0;
EditHealt.AutoSize := TRUE;
// EditHealt.OnClick := @EditHealt_Click;
EditHealt.OnEnter := @EditHealt_Change;
//......................................
//......................................
//ComboBoxHPotion
ComboBoxHPotion := TComboBox.Create(Result);
ComboBoxHPotion.Parent := GroupBox4;
ComboBoxHPotion.Left := 74;
ComboBoxHPotion.Top := 14;
ComboBoxHPotion.Width := 169;
ComboBoxHPotion.Height := 21;
ComboBoxHPotion.Visible := TRUE;
ComboBoxHPotion.Tag := 0;
ComboBoxHPotion.Enabled := TRUE;
ComboBoxHPotion.Hint := 'Выбери из списка бутылку лечения';
ComboBoxHPotion.ShowHint := TRUE;
ComboBoxHPotion.Text := 'ComboBoxHPotion';
ComboBoxHPotion.Font.Name := 'Tahoma';
ComboBoxHPotion.Font.Size := 8;
ComboBoxHPotion.Font.Color := clWindowText;
ComboBoxHPotion.Color := clWindow;
ComboBoxHPotion.TabOrder := 2;
ComboBoxHPotion.TabStop := TRUE;
ComboBoxHPotion.ItemIndex := -1;
ComboBoxHPotion.Sorted := FALSE;
ComboBoxHPotion.ItemHeight := 13;
ComboBoxHPotion.OnChange := @ComboBoxHPotion_Change;
//......................................
//......................................
//EditHpotionOID
EditHpotionOID := TEdit.Create(Result);
EditHpotionOID.Parent := GroupBox4;
EditHpotionOID.Left := 248;
EditHpotionOID.Top := 14;
EditHpotionOID.Width := 72;
EditHpotionOID.Height := 21;
EditHpotionOID.Visible := TRUE;
EditHpotionOID.Tag := 0;
EditHpotionOID.Enabled := TRUE;
EditHpotionOID.Hint := '';
EditHpotionOID.ShowHint := FALSE;
EditHpotionOID.Text := '0';
EditHpotionOID.Font.Name := 'Tahoma';
EditHpotionOID.Font.Size := 8;
EditHpotionOID.Font.Color := clWindowText;
EditHpotionOID.Color := clWindow;
EditHpotionOID.TabOrder := 3;
EditHpotionOID.TabStop := TRUE;
EditHpotionOID.ReadOnly := TRUE;
EditHpotionOID.MaxLength := 0;
EditHpotionOID.AutoSize := TRUE;
//......................................
//......................................
//EditHPotionVal
EditHPotionVal := TEdit.Create(Result);
EditHPotionVal.Parent := GroupBox4;
EditHPotionVal.Left := 325;
EditHPotionVal.Top := 14;
EditHPotionVal.Width := 72;
EditHPotionVal.Height := 21;
EditHPotionVal.Visible := TRUE;
EditHPotionVal.Tag := 0;
EditHPotionVal.Enabled := TRUE;
EditHPotionVal.Hint := '';
EditHPotionVal.ShowHint := FALSE;
EditHPotionVal.Text := '0';
EditHPotionVal.Font.Name := 'Tahoma';
EditHPotionVal.Font.Size := 8;
EditHPotionVal.Font.Color := clWindowText;
EditHPotionVal.Color := clWindow;
EditHPotionVal.TabOrder := 4;
EditHPotionVal.TabStop := TRUE;
EditHPotionVal.ReadOnly := TRUE;
EditHPotionVal.MaxLength := 0;
EditHPotionVal.AutoSize := TRUE;
//......................................
//......................................
//Stats
Stats := TMemo.Create(Result);
Stats.Parent := Result;
Stats.Left := 428;
Stats.Top := 0;
Stats.Width := 185;
Stats.Height := 471;
Stats.Visible := TRUE;
Stats.Tag := 0;
Stats.Enabled := TRUE;
Stats.Hint := '';
Stats.ShowHint := FALSE;
Stats.Font.Name := 'Tahoma';
Stats.Font.Size := 8;
Stats.Font.Color := clWindowText;
Stats.Color := clWindow;
Stats.TabOrder := 1;
Stats.TabStop := TRUE;
Stats.Align := alRight;
Stats.WordWrap := TRUE;
Stats.Alignment := taLeftJustify;
Stats.WantTabs := FALSE;
Stats.WantReturns := TRUE;
Stats.HideSelection := TRUE;
Stats.MaxLength := 0;
Stats.OEMConvert := FALSE;
Stats.ReadOnly := FALSE;
Stats.ScrollBars := ssNone;
//......................................
//......................................
//Msg
Msg := TMemo.Create(Result);
Msg.Parent := Result;
Msg.Left := 0;
Msg.Top := 474;
Msg.Width := 613;
Msg.Height := 112;
Msg.Visible := TRUE;
Msg.Tag := 0;
Msg.Enabled := TRUE;
Msg.Hint := '';
Msg.ShowHint := FALSE;
Msg.Font.Name := 'Tahoma';
Msg.Font.Size := 8;
Msg.Font.Color := clWindowText;
Msg.Color := clWindow;
Msg.TabOrder := 2;
Msg.TabStop := TRUE;
Msg.Align := alBottom;
Msg.WordWrap := TRUE;
Msg.Alignment := taLeftJustify;
Msg.WantTabs := FALSE;
Msg.WantReturns := TRUE;
Msg.HideSelection := TRUE;
Msg.MaxLength := 0;
Msg.OEMConvert := FALSE;
Msg.ReadOnly := FALSE;
Msg.ScrollBars := ssNone;
//......................................
//......................................
//Splitter1
Splitter1 := TSplitter.Create(Result);
Splitter1.Parent := Result;
Splitter1.Align := alBottom;
Splitter1.Color := clBtnFace;
Splitter1.Left := 0;
Splitter1.Top := 471;
Splitter1.Width := 613;
Splitter1.Height := 3;
Splitter1.Visible := TRUE;
Splitter1.Tag := 0;
//......................................
//......................................
//Splitter2
Splitter2 := TSplitter.Create(Result);
Splitter2.Parent := Result;
Splitter2.Align := alRight;
Splitter2.Color := clBtnFace;
Splitter2.Left := 425;
Splitter2.Top := 0;
Splitter2.Width := 3;
Splitter2.Height := 471;
Splitter2.Visible := TRUE;
Splitter2.Tag := 0;
//......................................
Yes := TRUE;
FINALLY
if not Yes then begin
//Освобождаем ресурсы, если неудачно ...
if Result<>NIL then begin
Result.Free;
// Result:=NIL;
end;
end;
END;
Result.Show;
msg.Lines.Add('Автоматизация ловли рыбы by NLObP!');
//msg.Lines.Add('Для инициализации скрипта снять/одеть удочку, крючки!!!');
end;
//............................................
//************************************************** *************
//Обработчики событий для элементов управления на форме
//************************************************** *************
//ButtonPathBack
procedure ButtonPathBack_Click(Sender: TButton);
//Event : OnClick
begin
//идти в начало пути
RecordPathFileName:=EditPath.text;
try
MovePath.LoadFromFile(RecordFilesPath+RecordPathFi leName+RecordFileExt);
except
SendMsg2('файл пути не найден');
exit;
end;
cmd:='move'; GoToPath(back);
end;
//......................................
//......................................
//ButtonPathStop
procedure ButtonPathStop_Click(Sender: TButton);
//Event : OnClick
begin
MoveToPathEnabled:=False;
end;
//......................................
//......................................
//ButtonPathGo
procedure ButtonPathGo_Click(Sender: TButton);
//Event : OnClick
begin
//идти в конец пути
RecordPathFileName:=EditPath.text;
try
MovePath.LoadFromFile(RecordFilesPath+RecordPathFi leName+RecordFileExt);
except
SendMsg2('файл пути не найден');
exit;
end;
cmd:='move'; GoToPath(go);
end;
//......................................
//......................................
//ButtonPathSave
procedure ButtonPathSave_Click(Sender: TButton);
//Event : OnClick
begin
StopRecord;
end;
//......................................
//......................................
//ButtonPathRec
procedure ButtonPathRec_Click(Sender: TButton);
//Event : OnClick
begin
RecordPathFileName:=EditPath.text;
StartRecord;
end;
//......................................
//......................................
//EditPath
procedure EditPath_Change(Sender: TEdit);
//Event : OnChange
begin
RecordPathFileName:=EditPath.text;
end;
//......................................
//......................................
//ComboBoxPath
procedure ComboBoxPath_Change(Sender: TComboBox);
//Event : OnChange
begin
EditPath.text:=ComboBoxPath.Items.Strings[ComboBoxPath.ItemIndex];
end;
//......................................
//......................................
//ButtonFishingStart
procedure ButtonFishingStart_Click(Sender: TButton);
//Event : OnClick
begin
if not status then begin
msg.Lines.Add('Скрипт не инициализирован...');
exit;
end;
fishin.enabled:=true;
stop:=false; //нажали Sart
msg.Lines.Add('Начнем рыбачить...');
end;
//......................................
//......................................
//ButtonFishingStop
procedure ButtonFishingStop_Click(Sender: TButton);
//Event : OnClick
begin
// Status:=false;
fishin.enabled:=false;
trade1.enabled:=false;
CreatePFO.enabled:=false;
MoveTimer.Enabled:=False;
MoveToPathEnabled:=False;
stop:=true;
if isEquip(RodOID) and isFishing then MagicSkillUse(fish);
isFishing:=false; //ловим?
msg.Lines.Add('Останавливаем всё! Хватит на сегодня!');
end;
//......................................
//......................................
//CheckBoxRod
procedure CheckBoxRod_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxRod.Checked
then begin
ComboBoxRod.Enabled:=false; //выключаем
end else begin
MyRodID:=0; //отмена
RodOID:=0;
ComboBoxRod.Enabled:=true; //включаем
//Пакет RequestItemList
buf:=hstr('14');
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxRod
procedure ComboBoxRod_Change(Sender: TComboBox);
//Event : OnChange
begin
RodOID:=BaseItems[ComboBoxRod.ItemIndex+1,2];
myRodID:=BaseItems[ComboBoxRod.ItemIndex+1,3];
EditRodOID.Text:=Inttostr(myRodID);
EditRodVal.text:=inttostr(GetItem(RodOID,2,5));
end;
//......................................
//......................................
//CheckBoxLure
procedure CheckBoxLure_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxLure.Checked
then begin
ComboBoxLure.Enabled:=false; //выключаем
TradeBuyItem[0]:=MyLureID; //что будем покупать?
end else begin
MyLureID:=0; //отмена
LureOID:=0;
TradeBuyItem[0]:=MyLureID; //что будем покупать?
ComboBoxLure.Enabled:=true; //включаем
//Пакет c0F=RequestItemList c4
//Пакет c14=RequestItemList gracia
buf:=hstr('14'); //
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxLure
procedure ComboBoxLure_Change(Sender: TComboBox);
//Event : OnChange
begin
LureOID:=BaseItems[ComboBoxLure.ItemIndex+1,2];
myLureID:=BaseItems[ComboBoxLure.ItemIndex+1,3];
EditLureOID.Text:=Inttostr(myLureID);
EditLureVal.text:=inttostr(getitem(LureOID,2,5));
end;
//......................................
//......................................
//CheckBoxWeapon
procedure CheckBoxWeapon_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxWeapon.Checked
then begin
ComboBoxWeapon.Enabled:=false; //выключаем
WeaponUse1:=true;
end else begin
WeaponUse1:=false;
MyWeaponID:=0; //отмена
WeaponOID:=0;
ComboBoxWeapon.Enabled:=true; //включаем
//Пакет c0F=RequestItemList c4
//Пакет c14=RequestItemList gracia
buf:=hstr('14');
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxWeapon
procedure ComboBoxWeapon_Change(Sender: TComboBox);
//Event : OnChange
begin
WeaponOID:=BaseItems[ComboBoxWeapon.ItemIndex+1,2];
myWeaponID:=BaseItems[ComboBoxWeapon.ItemIndex+1,3];
EditWeaponOID.Text:=Inttostr(myWeaponID);
EditWeaponVal.text:=inttostr(getitem(WeaponOID,2,5 ));
end;
//......................................
//......................................
//CheckBoxShield
procedure CheckBoxShield_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxShield.Checked
then begin
ComboBoxShield.Enabled:=false; //выключаем
ShieldUse1:=true;
end else begin
ShieldUse1:=false;
MyShieldID:=0; //отмена
ShieldOID:=0;
ComboBoxShield.Enabled:=true; //включаем
//Пакет c0F=RequestItemList c4
//Пакет c14=RequestItemList gracia
buf:=hstr('14');
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxShield
procedure ComboBoxShield_Change(Sender: TComboBox);
//Event : OnChange
begin
ShieldOID:=BaseItems[ComboBoxShield.ItemIndex+1,2];
myShieldID:=BaseItems[ComboBoxShield.ItemIndex+1,3];
EditShieldOID.Text:=Inttostr(myShieldID);
EditShieldVal.text:=inttostr(getitem(ShieldOID,2,5 ));
end;
//......................................
//......................................
//CheckBoxFShot
procedure CheckBoxFShot_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxFShot.Checked
then begin
ComboBoxFShot.Enabled:=false; //выключаем
ShotUse1:=true;
end else begin
ShotUse1:=false;
MyShotID:=0; //отмена
ShotOID:=0;
ComboBoxFShot.Enabled:=true; //включаем
//Пакет c0F=RequestItemList c4
//Пакет c14=RequestItemList gracia
buf:=hstr('14');
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxFShot
procedure ComboBoxFShot_Change(Sender: TComboBox);
//Event : OnChange
begin
ShotOID:=BaseItems[ComboBoxFShot.ItemIndex+1,2];
myShotID:=BaseItems[ComboBoxFShot.ItemIndex+1,3];
EditFShotOID.Text:=Inttostr(myShotID);
EditFShotVal.text:=inttostr(getitem(ShotOID,2,5));
end;
//......................................
//......................................
//EditLure
//procedure EditLure_Click(Sender: TEdit);
procedure EditLure_Change(Sender: TEdit);
//Event : OnChange
begin
NeedBuy:=strtoint(EditLure.Text);
end;
//......................................
//......................................
//CheckBoxFO
procedure CheckBoxFO_Click(Sender: TCheckBox);
//Event : OnClick
begin
//FO->GFO-PFO
if CheckBoxFO.Checked
then CreatePFO.enabled:=true
else CreatePFO.enabled:=false;

if CreatePFO.enabled then begin
// buf:=hstr('2F 2A 05 00 00 00 00 00 00 00'); //common craft
buf:=hstr('39 2A 05 00 00 00 00 00 00 00'); //common craft
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//CheckBoxPU
procedure CheckBoxPU_Click(Sender: TCheckBox);
//Event : OnClick
begin

end;
//......................................
//......................................
//CheckBoxFisherman
procedure CheckBoxFisherman_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxFisherman.Checked
then begin
FishermanID:=ExtractIDValues(ComboBoxFisherman.Ite ms.Strings[ComboBoxFisherman.ItemIndex]); //берем ID
ComboBoxFisherman.Enabled:=false; //выключаем
FishermanOID:=strtoint(EditFishermanOID.text);
end else begin
FishermanID:=0; //отмена
FishermanOID:=0;
ComboBoxFisherman.Enabled:=true; //включаем
end;
end;
//......................................
//......................................
//ComboBoxFisherman
procedure ComboBoxFisherman_Change(Sender: TComboBox);
//Event : OnChange
begin
//by Xelat
{я видел у тебя там проблемы с пакетом UserInfo - отправляешь на сервер пакет 6E
- RequestRecordInfo и тебе придёт и юзеринфо, и инфа о всех нпц и игроках,
которые тут есть}
buf:=#$6E;
SendToServerEx(Name);
delay(1000);

FishermanID:=ExtractIDValues(ComboBoxFisherman.Ite ms.Strings[ComboBoxFisherman.ItemIndex]);
for i:=1 to maxnpc do begin
// msg.Lines.Add('i='+inttostr(i)+'ID='+inttostr(NpcB ase[2,i])+' FishermanID='+inttostr(FishermanID));
if NpcBase[2,i]=FishermanID then begin
EditFishermanOID.text:=inttostr(NpcBase[1,i]);
break;
end;
// else EditFishermanOID.text:='000';
end;
end;
//......................................
//......................................
//EditFishermanOID
procedure EditFishermanOID_Click(Sender: TEdit);
//Event : OnClick
begin

end;
//......................................
//......................................
//CheckBoxHPotion
procedure CheckBoxHPotion_Click(Sender: TCheckBox);
//Event : OnClick
begin
if CheckBoxHPotion.Checked
then begin
ComboBoxHPotion.Enabled:=false; //выключаем
PercentHP:=strtoint(EditHealt.Text);
ColvoHP:=strtoint(EditHPotionVal.Text);
HPUse1:=true;
end else begin
HPUse1:=false;
MyHPID:=0; //отмена
PercentHP:=0;
HPOID:=0;
ColvoHP:=0;
ComboBoxHPotion.Enabled:=true; //включаем
//Пакет c0F=RequestItemList c4
//Пакет c14=RequestItemList gracia
buf:=hstr('14');
SendToServerEx(Name);
end;
end;
//......................................
//......................................
//ComboBoxHPotion
procedure ComboBoxHPotion_Change(Sender: TComboBox);
//Event : OnChange
begin
HPOID:=BaseItems[ComboBoxHPotion.ItemIndex+1,2];
myHPID:=BaseItems[ComboBoxHPotion.ItemIndex+1,3];
EditHPotionOID.Text:=Inttostr(myHPID);
EditHPotionVal.text:=inttostr(getitem(HPOID,2,5));
end;
//......................................
//......................................
//EditHealt
//procedure EditHealt_Click(Sender: TEdit);
procedure EditHealt_Change(Sender: TEdit);
//Event : OnChange
begin
PercentHP:=strtoint(EditHealt.Text);
end;
//......................................
//......................................
procedure CheckBox11Click(Sender: TObject);
begin
//потрошить улов
end;
//......................................
//......................................
procedure CheckBox7Click(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure CheckBox8Click(Sender: TObject);
begin
//
end;
procedure CheckBox9Click(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox1Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox2Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox3Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox4Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox5Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox6Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox7Change(Sender: TObject);
begin
//
end;
//......................................
//......................................
procedure ComboBox8Change(Sender: TObject);
begin
//
end;
//......................................
//************************************************** ****************************
procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Action:=caNone;
end;
//......................................
//************************************************** *************
procedure debugmsg(msg: string);
begin
if debug then SendMsg2(msg);
end;
//......................................
//************************************************** *************
procedure SendMsg2(msg:string); //отправка системных сообщений клиенту
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(Name);
end;
//......................................
//************************************************** *************
function GetValue(ValName: string): string;
begin
result:=RecordPath.Values[ValName];
end;
//......................................
//************************************************** *************
procedure SetValue(ValName: string; Value: string);
begin
RecordPath.Values[ValName]:=Value;
end;
//......................................
//************************************************** *************
procedure StartRecord;
begin
if SavePathEnabled then exit;
if MoveToPathEnabled then
begin
SendMsg2('Во время следования по маршруту запись не возможна');
msg.Lines.Add('Во время следования по маршруту запись не возможна');
exit;
end;
RecordPath.Clear;
PointsCount:=0;
SendMsg2('Начата запись маршрута');
msg.Lines.Add('Начата запись маршрута');
SavePathEnabled:=True
end;
//......................................
//************************************************** *************
procedure StopRecord;
begin
if not SavePathEnabled then exit;
//записываем
RecordPath.SaveToFile(GetRecordFileName);
SendMsg2('Запись маршрута завершена');
msg.Lines.Add('Запись маршрута завершена');
SavePathEnabled:=False;
end;
//......................................
//************************************************** *************
function GetRecordFileName: string;
begin
result:=RecordFilesPath+RecordPathFileName+RecordF ileExt;
end;
//......................................
//************************************************** *************
procedure ParseMoveClient;
var
i,x,y,z: integer; s: string;
begin
if not SavePathEnabled then exit;
i:=2;
x:=readd(i);
y:=readd(i);
z:=readd(i);
inc(PointsCount);
s:='|'+inttostr(x)+'|'+inttostr(y)+'|'+inttostr(z) +'|';
RecordPath.Add(s);
SendMsg2('добавлен чекпоинт № '+inttostr(PointsCount));
msg.Lines.Add('добавлен чекпоинт № '+inttostr(PointsCount));
end;
//......................................
//************************************************** *************
function delta(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает растоянием между 2 точками
var
dx,dy,summa: extended;
begin
try
dx:=xpos1-xpos2;
dy:=ypos1-ypos2;
summa:=dx*dx+dy*dy;
if summa=0 then result:=0 else result:=Round(sqrt(summa));
debugmsg('delta='+inttostr(result));
except
debugmsg('error in delta');
end;
end;
{function delta(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает растоянием между 2 точками
begin
result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;}

//......................................
//************************************************** *************
function GetMinCheckPoint(PointsList: TStringList): integer;
var
i,m,min_dist: integer;
s: string;
x,y,z: integer;
begin
result:=-1;
min_dist:=-1;
//проверка на наличие маршрута
if PointsList.Count=0 then
begin
MoveTimer.Enabled:=False;
MoveToPathEnabled:=False;
SendMsg2('Нет данных по маршруту');
msg.Lines.Add('Нет данных по маршруту');
exit;
end;
try
for i:=0 to PointsList.count-1 do
begin
s:=PointsList[i];
y:=ExtractValue(s,2);
x:=ExtractValue(s,1);
debugMsg('GetMinCheckPoint:'+s+' x:='+inttostr(x)+' y:='+inttostr(y)+' myx:='+inttostr(myx)+' myy:='+inttostr(myy));
m:=delta(x,y,myx,myy);
if m>0 then begin
if (result=-1) then begin
min_dist:=m;
result:=i;
end else
if m<min_dist then begin
min_dist:=m;
result:=i;
end;
end;
end;
except
debugMsg('error in GetMinCheckPoint');
msg.Lines.Add('error in GetMinCheckPoint');
end;//try
end;
//......................................
//************************************************** *************
procedure GoToPath(ToForward: boolean);
var
x,y,z,i: integer;
s: string;
begin
MoveToPathEnabled:=not MoveToPathEnabled;
MoveToForward:=ToForward;
if not MoveToPathEnabled then
begin
MoveTimer.Enabled:=False;
SendMsg2('Следование по маршруту остановлено');
msg.Lines.Add('Следование по маршруту остановлено');
exit;
end;
//
//предположительно путь уже прописан в MovePath
//
SendMsg2('Пробуем выйти на путь...');
msg.Lines.Add('Пробуем выйти на путь...');
//сперва идем к ближайшему чекпоинту
i:=GetMinCheckPoint(MovePath);
if i<0 then
begin
SendMsg2('чекпоинт не найден');
msg.Lines.Add('чекпоинт не найден');
MoveToPathEnabled:=False;
end else
begin
SendMsg2('найден ближайший чекпоинт #'+inttostr(i)+' бежим туда');
msg.Lines.Add('найден ближайший чекпоинт #'+inttostr(i)+' бежим туда');
MoveToPathEnabled:=True;
MoveStepIndex:=i;
if debug then SendMsg2('checkpoint #'+inttostr(i));
s:=MovePath[MoveStepIndex];
x:=ExtractValue(s,1);
y:=ExtractValue(s,2);
z:=ExtractValue(s,3);
if (old_x<>x) and (old_y<>y) and (old_z<>z) then
begin
MoveTo(x,y,z);
old_x:=x;
old_y:=y;
old_z:=z;
old_time:=0;
end;
end;
MoveTimer.Enabled:=True;
chk_time:=0;
end;
//......................................
//************************************************** ****************
//Идти в точку с координатами x,y,z
procedure MoveTo(TargetX,TargetY,TargetZ:integer);
begin
//проверка на допустимость координат
if not PosInRange(targetx,targety,targetz,5000) then begin
MoveTimer.Enabled:=False;
MoveTimer.Enabled:=False;
SendMsg2('Слишком большая Дельта! Проверить папку с файлами перемещения! Движение остановлено!');
msg.Lines.Add('Слишком большая Дельта! Проверить папку с файлами перемещения! Движение остановлено!');
end else begin
//c01=MoveBackwardToLocation:d(targetX)d(targetY)d(t argetZ)d(originX)d(originY)d(originZ)d(moveByMouse )
//c0F=MoveBackwardToLocation:d(ToX)d(ToY)d(ToZ)d(Ori gX)d(OrigY)d(OrigZ)d(MoveMovement)
buf:=#$0F;
WriteD(targetx); //куда
WriteD(targety);
WriteD(targetz);
WriteD(MyX); //откуда
WriteD(MyY);
WriteD(MyZ);
WriteD(1); //используем 1-мышь 0-клавиатура
SendToServerEx(Name);
end;
end;
//......................................
//************************************************** *************
//Проверка находится ли заданная точка в пределах досягаемости.
function PosInRange(targetx,targety,targetz,distanciya:inte ger):boolean;
begin
if delta(targetx, targety, MyX, MyY)<=distanciya
then result:=true else result:=false;
end;
//......................................
//************************************************** *************
procedure OnMove(Sender: TObject);
var
x,y,z: integer; s: string;
begin
inc(old_time);//счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршруту
inc(chk_time);//счетчик
if not MoveToPathEnabled then begin
try
TTimer(Sender).Enabled:=False;
except
end;
SendMsg2('Движение остановлено');
msg.Lines.Add('Движение остановлено');
exit;
end;
{ //возможно мы пали смертью храбрых, то не дергаемся пока
if myHP<=0 then begin
SendMsg2('Die!');
msg.Lines.Add('Умерли!');
MoveToPathEnabled:=False;
exit;
end;}
MoveTimer.Interval:=MoveTrigerDelay;
debugmsg('MoveTrigerDelay:'+inttostr(MoveTimer.Int erval));
try
//проверяем на существ. объекта
//при отладке всякое может быть
MovePath.Count;
except
TTimer(Sender).Enabled:=False;
exit;
end;
s:=MovePath[MoveStepIndex];
x:=ExtractValue(s,1);
y:=ExtractValue(s,2);
z:=ExtractValue(s,3);
if PosInRange(x,y,z,RangeToCheckPoint) then begin
if MoveToForward then begin
if MoveStepIndex=MovePath.Count-1 then begin
MoveToPathEnabled:=False;
//эта точка на месте рыбалки или у фишермэна если после смерти
SendMsg2('Мы по идее в конечной точке');
case cmd of
'move': begin {просто идем по маршруту} end;
'fishing': begin //ловим
CanFishHere:=true; //здесь можно ловить
fishin.enabled:=true; //продолжим ловить рыбу
msg.Lines.Add('Продолжим ловить рыбу!!!');
debugmsg('Продолжим ловить рыбу!!!');
end;
'death': begin //продаём
msg.Lines.Add('Мы у фишермэна, бежим рыбачить...');
SendMsg2('Мы у фишермэна, бежим рыбачить...');
case MestoLovli of
1: begin cmd:='fishing'; MestoLovli1; end;
2: begin cmd:='fishing'; MestoLovli2; end;
3: begin cmd:='fishing'; MestoLovli3; end;
end;
end;
end;
exit;
end
else begin
inc(MoveStepIndex);
end;
end
else begin
if MoveStepIndex>0 then dec(MoveStepIndex)
else begin
MoveToPathEnabled:=False;
//эта точка у фишермэна
SendMsg2('Мы по идее в начальной точке');
case cmd of
'move': begin {просто идем по маршруту} end;
'fishing': begin //ловим
CanFishHere:=true; //здесь можно ловить
fishin.enabled:=true; //продолжим ловить рыбу
msg.Lines.Add('Продолжим ловить рыбу!!!');
SendMsg2('Продолжим ловить рыбу!!!');
end;
'trade': begin //продаём
trade:=200;
trade1.enabled:=true;
TradeCount:=0;
msg.Lines.Add('Продадим/купим/обменяем...');
SendMsg2('Продадим/купим/обменяем...');
end;
end;
exit;
end;
end;
//мы достигли чекпоинта идем далее
debugMsg('бежим к #'+inttostr(MoveStepIndex));
msg.Lines.Add('бежим к #'+inttostr(MoveStepIndex));
s:=MovePath[MoveStepIndex];
x:=ExtractValue(s,1);
y:=ExtractValue(s,2);
z:=ExtractValue(s,3);
MoveTo(x,y,z);
chk_time:=0; //сбрасываем если дошли до чекпоинта
end;
//проверка на застревание1
if chk_time=15 then //сколько ждем секунд, чтобы решить что застряли
begin
MoveTo(x,y,z); //тыкаем ещё раз, чтобы не стоял
debugMsg('тыкаем ещё раз:'+s+' x:='+inttostr(x)+' y:='+inttostr(y)+' myx:='+inttostr(myx)+' myy:='+inttostr(myy));
msg.Lines.Add('тыкаем ещё раз:'+s+' x:='+inttostr(x)+' y:='+inttostr(y)+' myx:='+inttostr(myx)+' myy:='+inttostr(myy));
end;
//проверка на застревание2
if chk_time=30 then //сколько ещё ждем секунд, чтобы решить что застряли и вернуться на точку назад
begin
chk_time:=0;
if MoveToForward and (MoveStepIndex>0) then begin
dec(MoveStepIndex);
SendMsg2('Проверка на застревание - бежим к #'+inttostr(MoveStepIndex));
msg.Lines.Add('Проверка на застревание - бежим к #'+inttostr(MoveStepIndex));
end else if MoveStepIndex<MovePath.Count then begin
inc(MoveStepIndex);
SendMsg2('Проверка на застревание - бежим к #'+inttostr(MoveStepIndex));
msg.Lines.Add('Проверка на застревание - бежим к #'+inttostr(MoveStepIndex));
end;
end;
end;
//......................................
//************************************************** *************
function ExtractValue(sData: string;nIndex: integer): integer;
var
s: string;
i,j: integer;
begin
i:=0;j:=0;s:='';
s:=sData;
while j<nIndex do
begin
i:=pos('|',S);
if i>=0 then
begin
s:=copy(s,i+1,length(s)-i);
inc(j);
end
else
break;
end;
i:=pos('|',s);
if i>=0 then
s:=copy(s,1,i-1);
try
result:=strtoint(s);
except
end;
end;
//......................................
//************************************************** *************
function ExtractIDValues(sData: string): integer;
var
s: string;
i,j: integer;
begin
i:=0;s:='';
s:=sData;
i:=pos('=',s);
if i>=0 then
s:=copy(s,1,i-1);
try
result:=strtoint(s);
except
result:=110;
end;
end;
//......................................
//************************************************** *************
// Все перемещения чара здесь!!!
//************************************************** *************
//1 бежим от фишермана на берег в Гиран-харбор
//-------------------------------------------------
procedure Mestolovli1;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Mestolovli1 '+RecordFileExt);
msg.Lines.Add('Место ловли: Mestolovli1');
except
SendMsg2('файл пути не найден');
exit;
end;
case cmd of
'fishing': GoToPath(go); //бежим ловить
'trade': GoToPath(back); //бежим продавать
end;
end;
//......................................
//-------------------------------------------------
//2 бежим от фишермана на берег в Гиран-харбор
//-------------------------------------------------
procedure Mestolovli2;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Mestolovli2 '+RecordFileExt);
msg.Lines.Add('Место ловли: Mestolovli2');
except
SendMsg2('файл пути не найден');
exit;
end;
case cmd of
'fishing': GoToPath(go); //бежим ловить
'trade': GoToPath(back); //бежим продавать
end;
end;
//......................................
//-------------------------------------------------
//3 бежим от фишермана на берег в Гиран-харбор
//-------------------------------------------------
procedure Mestolovli3;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Mestolovli3 '+RecordFileExt);
msg.Lines.Add('Место ловли: Mestolovli3');
except
SendMsg2('файл пути не найден');
exit;
end;
case cmd of
'fishing': GoToPath(go); //бежим ловить
'trade': GoToPath(back); //бежим продавать
end;
end;
//......................................
//-------------------------------------------------
//1 меняем место
//-------------------------------------------------
procedure MenayemMesto1;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'MenayemMest o1'+RecordFileExt);
msg.Lines.Add('Меняю место ловли: MenayemMesto1');
except
SendMsg2('файл пути не найден');
exit;
end;
GoToPath(go); //бежим ловить
end;
//......................................
//-------------------------------------------------
//2 меняем место
//-------------------------------------------------
procedure MenayemMesto2;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'MenayemMest o2'+RecordFileExt);
msg.Lines.Add('Меняю место ловли: MenayemMesto2');
except
SendMsg2('файл пути не найден');
exit;
end;
GoToPath(go); //бежим ловить
end;
//......................................
//-------------------------------------------------
//3 меняем место
//-------------------------------------------------
procedure MenayemMesto3;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'MenayemMest o3'+RecordFileExt);
msg.Lines.Add('Меняю место ловли: MenayemMesto3');
except
SendMsg2('файл пути не найден');
exit;
end;
GoToPath(go); //бежим ловить
end;
//......................................
//-------------------------------------------------
//1 Репозиция на месте рыбалки после боя с мобом
//-------------------------------------------------
procedure Reposition1;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Reposition1 '+RecordFileExt);
msg.Lines.Add('->Reposition1');
except
SendMsg2('файл пути не найден');
exit;
end;
MoveToForward:=go;
MoveStepIndex:=0;
MoveToPathEnabled:=True;
MoveTimer.Enabled:=True;
end;
//......................................
//-------------------------------------------------
//2 Репозиция на месте рыбалки после боя с мобом
//-------------------------------------------------
procedure Reposition2;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Reposition2 '+RecordFileExt);
msg.Lines.Add('Репозиция после боя: Reposition2');
except
SendMsg2('файл пути не найден');
exit;
end;
MoveToForward:=go;
MoveStepIndex:=0;
MoveToPathEnabled:=True;
MoveTimer.Enabled:=True;
end;
//......................................
//-------------------------------------------------
//3 Репозиция на месте рыбалки после боя с мобом
//-------------------------------------------------
procedure Reposition3;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'Reposition3 '+RecordFileExt);
msg.Lines.Add('Репозиция после боя: Reposition3');
except
SendMsg2('файл пути не найден');
exit;
end;
MoveToForward:=go;
MoveStepIndex:=0;
MoveToPathEnabled:=True;
MoveTimer.Enabled:=True;
end;
//......................................
//-------------------------------------------------
//Оживаем после боя с мобом
//-------------------------------------------------
procedure AfterDeath;
var
s:string;
x,y,z : integer;
begin
//загружаем маршрут
try
MovePath.LoadFromFile(RecordFilesPath+'afterdeath1 '+RecordFileExt);
msg.Lines.Add('После смерти: AfterDeath1');
except
SendMsg2('файл пути не найден');
exit;
end;
MoveToForward:=go;
MoveStepIndex:=0;
MoveToPathEnabled:=True;
MoveTimer.Enabled:=True;
msg.Lines.Add('Бежим к фишермэну...');
end;
//......................................
//************************************************** *************
procedure UserInfo; //обновление данных о себе
var
i:word;
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
i:=22;
ReadS(i);
inc(i,48);
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); //чисто информативно
MyMP:=ReadD(i);
pbMyHP.max:=MyMaxHP;
pbMyHP.position:=MyHP;
pbMyMP.max:=MyMaxMP;
pbMyMP.position:=MyMP;
gbMyHP.caption:=' HP: '+inttostr(MyHP)+'/'+inttostr(MyMaxHP)+' ';
gbMyMP.caption:=' MP: '+inttostr(MyMP)+'/'+inttostr(MyMaxMP)+' ';
end;
//......................................
//************************************************** *************
procedure StatusUpdate; //обновление данных о себе
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: MyHP:=ReadD(i*8+14);
#$0A: MyMaxHP:=ReadD(i*8+14);
#$0B: MyMP:=ReadD(i*8+14);
#$0C: MyMaxMP:=ReadD(i*8+14);
end;
pbMyHP.max:=MyMaxHP;
pbMyHP.position:=MyHP;
pbMyMP.max:=MyMaxMP;
pbMyMP.position:=MyMP;
gbMyHP.caption:=' HP: '+inttostr(MyHP)+'/'+inttostr(MyMaxHP)+' ';
gbMyMP.caption:=' MP: '+inttostr(MyMP)+'/'+inttostr(MyMaxMP)+' ';
if (MyMaxHP<>0) then //вычисляем процентное соотношение хп
begin
PercentHP:=strtoint(EditHealt.Text);
NeedBuy:=strtoint(EditLure.Text);
but:=Round((MyMaxHP/100)*PercentHP); //при каком количестве хп юзать бутылку лечения
end;
end;
//......................................
//************************************************** *************
//04=UserInfo:d(X)d(Y)d(Z)d(Heading)d(ObjectID)s(Nam e)d(Race)d(Sex)d(ClassID)d(Level)f(Exp)d(STR)d(DEX )d(CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurHP)d(MaxMP)d (CurMP)d(SP)d(CurLoad)d(MaxLoad)d(d)d(DHair)d(Rear )d(Lear)d(Neck)d(RFinger)d(LFinger)d(Head)d(RHand) d(LHand)d(Gloves)d(Chest)d(Legs)d(Feet)d(Back)d(LR Hand)d(Hair)d(Face)d(DHair)d(Rear)d(Lear)d(Neck)d( RFinger)d(LFinger)d(Head)d(RHand)d(LHand)d(Gloves) d(Chest)d(Legs)d(Feet)d(Back)d(LRHand)d(Hair)d(Fac e)-(0068)d(Patk)d(Paspd)d(Pdef)d(evasion)d(accur)d(cr ithit)d(Matk)d(Maspd)d(Paspd)d(Mdef)d(PvpFlag)d(Ka rma)d(runSpd)d(walkSpd)d(swimRSpd)d(swimWSpd)d(flR Spd)d(flWSpd)d(flyRSpd)d(flyWSpd)f(MoveMul)f(aspdM ul)f(collisRadius)f(collisHeight)d(HairStyle)d(Hai rColor)d(Face)d(AccessLvl)s(Title)d(clanID)d(clanC restId)d(AllyID)d(AllyCrestId)d(ClanLeader)b(Mount )b(shop)b(DwarfCraft)d(PKkills)d(PVPkills)w(cubics )w(cubID)b(findparty)d(abnEffects)b(c)d(clanPrivil )w(RecomLeft)w(RecomHave)d(d)w(InventLimit)d(class Id)d(sEff)d(maxCP)d(curCP)b(Mount)b(Team)d(clanBig CrestId)b(Noble)b(Hero)b(Fishing)d(fishX)d(fishY)d (fishZ)d(NameColor)b(isRun)d(PledgeClass)d(d)d(Tit leColor)d(d)d(CurseWeap)
//03=CharInfo:d(X)d(Y)d(Z)d(Heading)d(ObjectID)s(Nam e)d(Race)d(Sex)h(ClassID)d(DHair)i(Head)i(RHand)i( LHand)i(Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHa nd)i(Hair)i(PvpFlag)d(Karma)d(MSpeed)d(PSpeed)d(Pv pFlag)d(Karma)d(runSpd)d(walkSpd)d(swimRSpd)d(swim WSpd)d(flRunSpd)d(flWalkSpd)d(flyRSpd)d(flyWSpd)f( SpdMul)f(ASpdMul)f(collisRadius)f(collisHeight)d(H airStyle)d(HairColor)d(Face)s(Title)d(clanID)d(cla nCrest)d(allyID)d(allyCrest)d(siegeFlag)b(isStand) b(isRun)b(isInFight)b(isAlikeDead)b(Invis)b(Mount) b(shop)w(cubics)w(cubID)b(findparty)d(abnEffects)b (RecomLeft)w(RecomHave)h(ClassID)d(maxCP)d(curCP)b (isMounted)b(Team)d(clanBigCrestId)b(isNoble)b(isH ero)b(isFishing)d(fishX)d(fishY)d(fishZ)d(NameColo r)b(isRun)d(d)d(PItem)d(PledgeClass)d(PledgeColor) d(TitleColor)d(Cursed)

procedure TargetInfo; //обновление данных о цели
var
i:word;
begin
AttackerOID:=ReadD(18);
AttackerX:=ReadD(2);
AttackerY:=ReadD(6);
AttackerZ:=ReadD(10);
i:=22;
ReadS(i);
inc(i,48);
AttackerMaxHP:=ReadD(i);
AttackerHP:=ReadD(i);
pbTargetHP.max:=AttackerMaxHP;
pbTargetHP.position:=AttackerHP;
gbTargetHP.caption:=' HP: '+inttostr(AttackerHP)+'/'+inttostr(AttackerMaxHP)+' ';
end;
//......................................
//************************************************** *************
procedure TargetStatusUpdate; //обновление данных о цели
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: AttackerHP:=ReadD(i*8+14);
#$0A: AttackerMaxHP:=ReadD(i*8+14);
end;
pbTargetHP.max:=AttackerMaxHP;
pbTargetHP.position:=AttackerHP;
gbTargetHP.caption:=' HP: '+inttostr(AttackerHP)+'/'+inttostr(AttackerMaxHP)+' ';
end;
//......................................
//************************************************** *************
function ParseCmd(cmd: string):boolean;
var
s: string;
i,j,k: integer;
params: array[0..9] of string; //до 10 параметров, должно хватить
begin
result:=False;
try
j:=-1;
i:=pos(cmdPrefix,trim(cmd));
if i=0 then
exit;
debugmsg('start ParseCmd: idx:'+inttostr(i)+' cmd: '+cmd);
result:=true;
k:=length(cmdPrefix);
s:=trim(lowercase(cmd));
s:=trim(copy(s,i+k,length(cmd)-i));
debugmsg('trim:'+s);
repeat
inc(j);
k:=pos(cmdDlm,s);
if k>0 then
begin
params[j]:=copy(s,1,k-1);
s:=trim(copy(s,k+length(cmdDlm),length(s)-k));
debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);
end
else
begin
params[j]:=s;
debugmsg('param is one');
end;
until pos(cmdDlm,S)=0;
if j>-1 then
begin
inc(j);
params[j]:=s;
debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);
end;
if j=-1 then
exit;
//************************************************** *****
//пропарсили команду, теперь выполняем
//************************************************** *****
if params[0]=cmdRecordPath then
begin
if params[1]<>'' then
RecordPathFileName:=params[1]
else
RecordPathFileName:=RecordPathName;
StartRecord;
end
else
if params[0]=cmdSavePath then
begin
StopRecord;
end
else
if params[0]=cmdMove then
begin
if params[1]='' then
begin
SendMsg2('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg2('файл пути не найден');
exit;
end;
GoToPath(true);
end
else
if params[0]=cmdBack then
begin
if params[1]='' then
begin
SendMsg2('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg2('файл пути не найден');
exit;
end;
GoToPath(false);
end
else
if (params[0]=cmdStop) and MoveToPathEnabled then
MoveToPathEnabled:=False;
except
debugmsg('error in ParseCmd,params='+cmd);
end;
end;
//......................................
//************************************************** *************
procedure ShowInfo;
var
i: integer;
begin
stats.Lines.Clear;
stats.Lines.Add('Имя чара :'+Name);
stats.Lines.Add('Время старта :'+TimeToStr(starttime));
stats.Lines.Add('Время ловли :'+TimeToStr(time-starttime));
stats.Lines.Add('Поймали: '+IntToStr(fish1));
stats.Lines.Add('Сорвалось: '+IntToStr(fish2));
stats.Lines.Add('Преобр. успешно: '+IntToStr(lucky1));
stats.Lines.Add('Преобр. неуспешно: '+IntToStr(failed1));
stats.Lines.Add('На нас напали: '+IntToStr(mob1)+' раз');
stats.Lines.Add('Погибли: '+IntToStr(death1)+' раз');
stats.Lines.Add('');
stats.Lines.Add('MyMaxHP: '+IntToStr(MyMaxHP));
stats.Lines.Add('MyHP: '+IntToStr(MyHP));
stats.Lines.Add('MyOID: '+IntToStr(MyOID));
stats.Lines.Add('MyXpos: '+IntToStr(MyX));
stats.Lines.Add('MyYpos: '+IntToStr(MyY));
stats.Lines.Add('MyZpos: '+IntToStr(MyZ));
stats.Lines.Add('');
stats.Lines.Add('ReadyToSell: '+VarToStr(ReadyToSell));
stats.Lines.Add('ReadyToBuy: '+VarToStr(ReadyToBuy));
stats.Lines.Add('ReadyToMultiSell: '+VarToStr(ReadyToMultiSell));
stats.Lines.Add('NeedBuy: '+VarToStr(NeedBuy));
stats.Lines.Add('');
stats.Lines.Add('PMMesto: '+IntToStr(PMMesto));
stats.Lines.Add('MMesto: '+IntToStr(MMesto));
stats.Lines.Add('MestoLovli: '+IntToStr(MestoLovli));
stats.Lines.Add('CanFishHere: '+VarToStr(CanFishHere));
stats.Lines.Add('isFishing: '+VarToStr(isFishing));
// stats.Lines.Add('old_time: '+IntToStr(old_time));
// stats.Lines.Add('chk_time: '+IntToStr(chk_time));
// stats.Lines.Add('');
// stats.Lines.Add('but: '+IntToStr(but));
// stats.Lines.Add('PercentHP: '+IntToStr(PercentHP));
// stats.Lines.Add('Colvohp: '+VarToStr(Colvohp));
// stats.Lines.Add('iii: '+IntToStr(iii));
stats.Lines.Add('');
if (WeaponUse1=false) then stats.Lines.Add('Юзать оружие?: НЕТ!') else stats.Lines.Add('Юзать оружие?: ДА!');
if (ShieldUse1=false) then stats.Lines.Add('Юзать щит?: НЕТ!') else stats.Lines.Add('Юзать щит?: ДА!');
if (HPuse1=false) then stats.Lines.Add('Юзать бутылки?: НЕТ!') else stats.Lines.Add('Юзать бутылки?: ДА!');
if (ShotUse1=false) then stats.Lines.Add('Юзать фишин-шоты?: НЕТ!') else stats.Lines.Add('Юзать фишин-шоты?: ДА!');
if not CheckBoxPU.Checked then stats.Lines.Add('Потрошим?: НЕТ!') else stats.Lines.Add('Потрошим?: ДА!');
if not CheckBoxFO.Checked then stats.Lines.Add('FO->PFO: НЕТ!') else stats.Lines.Add('FO->PFO?: ДА!');
end;
//......................................
//************************************************** *************
procedure OnShowInfo(Sender: TObject); //выводим в форму
begin
ShowInfo;
if (MyHP<but) and HPuse1 then begin //если разрешено использование бутылок, то используем
if (iii>=5) and (colvohp>0) then begin
UseItem(HPOID); //проверка количества бутылок
iii:=0; //счетчик для личилок, чтобы не спамить
end else inc(iii)
end;
end;
//......................................
//************************************************** *************
procedure OnCreatePFO(Sender: TObject); //выводим в форму
begin
buf:=hstr('B8 A8 02 00 00'); //create GFO
SendToServerEx(Name);
delay(2000);
buf:=hstr('B8 A9 02 00 00'); //create PFO
SendToServerEx(Name);
end;
//......................................
//************************************************** *************
procedure RequestRestartPoint;
//c7D=RequestRestartPoint
begin
buf:=#$7D;
WriteD(00); //00-в город
SendToServerEx(Name);
MoveTimer.Interval:=10000;
delay(150);
end;
//......................................
//************************************************** *************
//RequestBypassToServer:s(Cmd)
//c23=RequestBypassToServer gracia
//посылаем, чтобы получить пакет BuyItem с ListID
procedure RequestByPassToServer(cmd:string);
begin
buf:=#$23;
WriteS(cmd);
SendToServerEx(Name);
delay(150);
end;
//......................................
//************************************************** *************
//s06=SellList:d(Money)d(Lease)h(ListSize:Loop.01.00 18)h(ItemType1)d(ObjectID)d(ItemID:Get.Func01)d(Co unt)h(ItemType2)h(0)d(ItemBodyPart)h(EnchantLevel) h(0)h(0)d(ReferencePrice/2)d(AttackAttrElement)d(AttackAttrElementVal)d(Def AttrFire)d(DefAttrWater)d(DefAttrWind)d(DefAttrEar th)d(DefAttrHoly)d(DefAttrUnholy)
//c37=RequestSellItem:d(ListID)d(ListSize:Loop.01.00 03)d(ObjectID)d(ItemID:Get.Func01)d(Count)
//продаем по одному типу
procedure RequestSellItem(ListID,ItemOID,ItemID,Count:intege r);
begin
if ReadyToSell then begin
msg.Lines.Add('Продадим предмет OID:'+inttostr(ItemOID)+' ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
buf:=#$37;
WriteD(ListID);
WriteD(1);
WriteD(ItemOID);
WriteD(ItemID);
WriteD(Count);
SendToServerEx(Name);
delay(150);
end;
end;
//......................................
//************************************************** *************
//c40=RequestBuyItem:d(ListID)d(ListSize:Loop.01.000 2)d(ItemID:Get.Func01)d(Count)
//купим по одному типу
procedure RequestBuyItem(ListID,ItemID,Count:integer);
begin
if ReadyToBuy then begin
msg.Lines.Add('Купим предмет ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
buf:=#$40;
WriteD(ListID); //ListID
WriteD(1); //ListSize
//повторять ListSize раз
WriteD(ItemID); //ItemID
WriteD(Count); //Count
//
SendToServerEx(Name);
delay(150);
end;
end;
//......................................
//************************************************** *************
//cB0=MultiSellChoose:d(ListID)d(EntryID)d(Amount)h( Enchantment)
//продаем по одному типу
procedure RequestMultiSellItem(ListId,EntryID,Count:integer) ;
begin
msg.Lines.Add('Обменяем предмет ListID:'+inttostr(ListID)+' EntryID:'+inttostr(EntryID)+' в кол-ве:'+inttostr(count));
if ReadyToMultiSell then begin
buf:=#$B0;
WriteD(ListID);
WriteD(EntryId);
WriteD(Count);
//buf:=buf+hstr('00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
buf:=buf+hstr('00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
SendToServerEx(Name);
delay(150);
end;
end;
//......................................
//************************************************** *************
procedure UseItem(OID:integer);
//c19=UseItem:d(ObjectID)d(Unknown)
begin
buf:=#$19;
WriteD(OID);
WriteD(0);
SendToServerEx(Name);
delay(150);
end;
//......................................
//************************************************** *************
//c39=RequestMagicSkillUse:dMagicID)d(CtrlPressed)b( ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$39;
WriteD(MagicID);
WriteD(00); //CtrlPressed
WriteC(00); //ShiftPressed
SendToServerEx(Name);
delay(150);
end;
//......................................
//************************************************** *************
procedure Pumping;
begin
if (ShotOID<>0) and (strtoint(EditFShotVal.text)>0) then UseItem(ShotOID)
else if shotuse1 then msg.Lines.Add('Кончились шоты!'); //просто сообщаем, без шотов можно ловить
MagicSkillUse(pump);
end;
//......................................
//************************************************** *************
procedure Reeling;
begin
if (ShotOID<>0) and (strtoint(EditFShotVal.text)>0) then UseItem(ShotOID)
else if shotuse1 then msg.Lines.Add('Кончились шоты!'); //просто сообщаем, без шотов можно ловить
MagicSkillUse(reel);
end;
//......................................
//************************************************** *************
procedure Fishing;
begin
if strtoint(EditLureVal.text)>1 then begin //оставляем один крючек, чтобы не сбился ItemOID
if not CanFishHere then begin
msg.Lines.Add('Здесь нельзя ловить...');
case MestoLovli of
1: begin cmd:='fishing'; Reposition1; end;
2: begin cmd:='fishing'; Reposition2; end;
3: begin cmd:='fishing'; Reposition3; end;
end;
exit;
end;
MagicSkillUse(fish);
end
else begin
msg.Lines.Add('Кончились крючки!');
fishin.enabled:=false;
if CheckBoxFisherman.Checked then begin
case MestoLovli of
1: begin cmd:='trade'; MestoLovli1; end;
2: begin cmd:='trade'; MestoLovli2; end;
3: begin cmd:='trade'; MestoLovli3; end;
end;
msg.Lines.Add('Бежим в магазин...');
end;
end;
end;
//......................................
//************************************************** *************
procedure OnFishing(Sender: TObject);
begin
if not isEquip(RodOID) then begin
msg.Lines.Add('Берем удочку');
giverod;
exit;
end else
msg.Lines.Add('Уже взята удочка');
if not isEquip(LureOID) then begin
msg.Lines.Add('Цепляем крючок');
givelure;
exit;
end else
msg.Lines.Add('Уже прицеплен крючок');

fishin.enabled:=false;
isFishing:=true; //ловим
Fishing;
end;
//......................................
//************************************************** *************
//c1F=Action:d(ObjectID)d(OriginX)d(OriginY)d(Origin Z)c(ActionID)
procedure Target(Attacker: Integer);
begin
buf:=#$1F;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
delay(800);
end;
//......................................
//************************************************** *************
//c01=AttackRequest:d(ObjectID)d(OriginX)d(OriginY)d (OriginZ)c(AttackID)
procedure Attack(Attacker: Integer);
begin
buf:=#$01;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
delay(800);
end;
//......................................
//************************************************** *************
procedure TargetAttacker(Attacker: Integer);
begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyOID));
fishin.enabled:=false;
Target(Attacker);
delay(150);
end;
//......................................
//************************************************** *************
procedure TargetFisherman;
begin
fishin.enabled:=false;
Target(FishermanOID);
delay(150);
Target(FishermanOID);
delay(150);
end;
//......................................
//************************************************** *************
procedure GiveWeapon;
begin
msg.Lines.Add('Берём='+IntToStr(WeaponOID)+' ID='+inttostr(MyWeaponID)+' Equip='+inttostr(GetItem(MyWeaponID,3,8)));
if WeaponOID=0 then exit;
if not isEquip(WeaponOID) then begin
UseItem(WeaponOID); //попробуем одеть снова
delay(650);
end;
end;
//......................................
//************************************************** *************
procedure GiveShield;
begin
msg.Lines.Add('Берём='+IntToStr(ShieldOID)+' ID='+inttostr(MyShieldID)+' Equip='+inttostr(GetItem(MyShieldID,3,8)));
if ShieldOID=0 then exit;
if not isEquip(ShieldOID) then begin
UseItem(ShieldOID); //попробуем одеть снова
delay(650);
end;
end;
//......................................
//************************************************** *************
procedure GiveRod;
begin
msg.Lines.Add('Берём='+IntToStr(RodOID)+' ID='+inttostr(MyRodID)+' Equip='+inttostr(GetItem(MyRodID,3,8)));
if RodOID=0 then exit;
if not isEquip(RodOID) then begin
UseItem(RodOID); //попробуем одеть снова
delay(650);
end;
end;
//......................................
//************************************************** *************
procedure GiveLure;
begin
msg.Lines.Add('Берём='+IntToStr(LureOID)+' ID='+inttostr(MyLureID)+' Equip='+inttostr(GetItem(MyLureID,3,8)));
if LureOID=0 then exit;
if not isEquip(LureOID) then begin
UseItem(LureOID); //попробуем одеть снова
delay(650);
end;
end;
//......................................
//************************************************** *************
function isEquip(ItemID:integer): boolean;
begin
if GetItem(ItemID,2,8)=0 then Result:=false else Result:=true;
end;
//......................................
//************************************************** *************
// Вся торговля здесь!!!
//************************************************** *************
procedure OnTrade(Sender: TObject);
begin
case trade of
//-------------------------------------------------
//продаем фишерману из массива TradeSellItem
//-------------------------------------------------
200: begin
//мы у фишермана, продаем всё ненужное
if FishermanOID=0 then begin
//RequestRecordInfo и тебе придёт и юзеринфо, и инфа о всех нпц и игроках, которые тут есть
buf:=#$6E;
SendToServerEx(Name);
//Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Не готовы к торговле, нет OID фишермана! Запросили сервер OID фишермана.');
exit; //выходим
end;
if ReadyToSell and (FishermanOID<>0) then begin //exit; //если мы в процессе продажи (еще не продали предыдущую вещь), то выходим сразу
if HtmlRcv then begin //ReadD(2)=FishermanOID then begin
RequestByPassToServer(GetSellList);
msg.Lines.Add('C>Пакет RequestBypassToServer #$23 (sell)');
HtmlRcv:=false;
//exit;
end;
if SellListRcv then begin
msg.Lines.Add('FindItem: OID:'+IntToStr(GetItem(TradeSellItem[Trd],3,2))+' ID:'+IntToStr(TradeSellItem[Trd])+' Count:'+IntToStr(GetItem(TradeSellItem[Trd],3,5)));
RequestSellItem(ListID,GetItem(TradeSellItem[Trd],3,2),TradeSellItem[Trd],GetItem(TradeSellItem[Trd],3,5));
msg.Lines.Add('C>Пакет RequestSellItem #$37');
ReadyToSell:=false; //закончили с предметом
SellListRcv:=false;
//exit;
end;
end else begin
if (TradeCount=TradeSellItemCount) then begin //проверка на выход из массива
trade:=300;
msg.Lines.Add('Всё продали!');
msg.Lines.Add('Переход к покупкам...');
TradeCount:=0; //начнем сначала массива
end else begin
if GetItem(TradeSellItem[TradeCount],3,5)>0 then begin //проверка, что предмет есть в инвентаре и его можно продать
TargetFisherman; //фишермана в таргет
msg.Lines.Add('Готовы продать:'+inttostr(TradeSellItem[TradeCount]));
ReadyToSell:=true; //готовы продавать
Trd:=TradeCount;
end else msg.Lines.Add('Нет такого предмета:'+inttostr(TradeSellItem[TradeCount]));
inc(TradeCount); //выбираем следующий предмет
msg.Lines.Add('TradeCount/TradeSellItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeSellItemCount-1));
end;
end;
end;
//-------------------------------------------------
//покупаем у фишермана из массива TradeBuyItem
//-------------------------------------------------
300: begin
//мы у фишермана, покупаем крючки
if FishermanOID=0 then begin
//RequestRecordInfo и тебе придёт и юзеринфо, и инфа о всех нпц и игроках, которые тут есть
buf:=#$6E;
SendToServerEx(Name);
// Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Не готовы к торговле, нет OID фишермана! Запросили сервер OID фишермана.');
exit; //выходим
end;
if ReadyToBuy and (FishermanOID<>0) then begin //exit; //если мы в процессе покупки (еще не купили предыдущую вещь), то выходим сразу
if HtmlRcv then begin //ReadD(2)=FishermanOID then begin
//шлем запрос выбора пункта - продажа
//c23=RequestBypassToServer:s(Cmd)
RequestByPassToServer(getbuylist);
msg.Lines.Add('C>Пакет RequestBypassToServer #$23 (buy)');
HtmlRcv:=false;
//exit;
end;
if BuyListRcv then begin
//после выбора пункта - продажа, приходит этот пакет
//s07=BuyList:d(Money)d(ListID)h(ListSize:Loop.01.00 19)h(ItemType1)d(0)d(ItemID:Get.Func01)d(CurrentCo unt)h(ItemType2)h(0)d(BodyPart)d(0)d(0)d(0)d(Price *TaxRate)d(-2)d(0)d(0)d(0)d(0)d(0)d(0)d(0) #$11: begin
//формируем запрос на покупку
//1F=RequestBuyItem:h(ListID)d(BuyCount)i(ItemID)d(C ount)
msg.Lines.Add('C>Пакет RequestBuyItem #$1F');
//продадим первый из списка
msg.Lines.Add('Item: ID:'+IntToStr(TradeBuyItem[Trd])+' Count:'+IntToStr(NeedBuy));
RequestBuyItem(ListID,TradeBuyItem[Trd],NeedBuy);
ReadyToBuy:=false;
BuyListRcv:=false;
//exit;
end;
end else begin
if TradeCount=TradeBuyItemCount then begin //проверка на выход из массива
trade:=400;
msg.Lines.Add('Всё купили!');
msg.Lines.Add('Переход к обмену...');
TradeCount:=0; //начнем сначала массива
end else begin
if GetItem(TradeBuyItem[TradeCount],3,5)<strtoint(EditLure.text) then begin
TargetFisherman; //фишермана в таргет
msg.Lines.Add('Готовы купить:'+inttostr(TradeBuyItem[TradeCount]));
ReadyToBuy:=true; //готовы покупать
Trd:=TradeCount;
NeedBuy:=strtoint(EditLure.text)-strtoint(EditLureVal.Text); //докупаем до нужного количества
msg.Lines.Add('Требуется докупит крючков:'+inttostr(NeedBuy));
end else msg.Lines.Add('Не надо покупать, уже есть:'+EditLureVal.Text);
inc(TradeCount);
msg.Lines.Add('TradeCount/TradeBuyItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeBuyItemCount-1));
end;
end;
end;
//-------------------------------------------------
//обмениваем у фишермана на пруфы
//-------------------------------------------------
400: begin
//мы у фишермана, обмениваем всё на пруфы
if FishermanOID=0 then begin
// Trade1.enabled:=false; //останавливаем торговлю
//RequestRecordInfo и тебе придёт и юзеринфо, и инфа о всех нпц и игроках, которые тут есть
buf:=#$6E;
SendToServerEx(Name);
msg.Lines.Add('Не готовы к торговле, нет OID фишермана! Запросили сервер OID фишермана.');
exit; //выходим
end;
if ReadyToMultiSell and (FishermanOID<>0) then begin //exit; //если еще не обменяли предыдущую вещь, то выходим сразу
if HtmlRcv then begin //ReadD(2)=FishermanOID then begin
//шлем запрос выбора пункта - продажа
//c23=RequestBypassToServer:s(Cmd)
RequestByPassToServer(getmultisell);
msg.Lines.Add('C>Пакет RequestBypassToServer #$23 (multisell)');
HtmlRcv:=false;
//exit;
end;
if MultiSellListRcv then begin
//шлем запрос на обмен
//cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Am ount)
msg.Lines.Add('C>Пакет RequestMultiSellChoose #$A7(ListId:'+IntToStr(ListId)+' EntryId:'+IntToStr(Trd*2+1)+' Count:'+IntToStr(GetItem(TradeMultiItem[Trd],3,5))+')');
RequestMultiSellItem(ListId,(Trd*2+1),GetItem(Trad eMultiItem[Trd],3,5));
ReadyToMultiSell:=false;
MultiSellListRcv:=false;
//exit;
end;
end else begin
if TradeCount=TradeMultiItemCount then begin //проверка на выход из массива
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Всё обменяли!');
case MestoLovli of
1: begin cmd:='fishing'; MestoLovli1; end;
2: begin cmd:='fishing'; MestoLovli2; end;
3: begin cmd:='fishing'; MestoLovli3; end;
end;
msg.Lines.Add('Бежим на берег...');
TradeCount:=0;
end else begin
if (TradeMultiItem[TradeCount]<>FO) and (TradeMultiItem[TradeCount]<>GFO) then begin
if GetItem(TradeMultiItem[TradeCount],3,5)>0 then begin
TargetFisherman; //фишермана в таргет
msg.Lines.Add('Готовы обменять:'+inttostr(TradeMultiItem[TradeCount]));
ReadyToMultiSell:=true; //готовы обменивать
Trd:=TradeCount;
end else msg.Lines.Add('Нет такого предмета:'+inttostr(TradeMultiItem[TradeCount]));
end;
inc(TradeCount);
msg.Lines.Add('TradeCount/TradeMultiItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeMultiItemCount-1));
end;
end;
end;
end;
end;
//......................................
//************************************************** ****************************
procedure ItemList;
{Создаем базу Items}
//11=ItemList:h(ShowWindow)h(ListSize:Loop.01.0021)h (ItemType1)d(ObjectID)
// d(ItemID:Get.Func01)d(LocationSlot)d(Count)h(ItemT ype2)h(CustomType1)
// h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2 )d(AugmentationID)
// d(Mana)d(AttackAttrElement)d(AttackAttrElementVal) d(DefAttrFire)
// d(DefAttrWater)d(DefAttrWind)d(DefAttrEarth)d(DefA ttrHoly)d(DefAttrUnholy)
var
i, j, k: integer;
ListCount: integer;
begin
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
for i:=1 to maxitems do
begin
if (i<=ListCount) then
begin
BaseItems[i,1]:=ReadH(j); //ItemType1
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadD(j); //Count
BaseItems[i,6]:=ReadH(j); //ItemType2
BaseItems[i,7]:=ReadH(j); //CustomType1
BaseItems[i,8]:=ReadH(j); //isEquipped
BaseItems[i,9]:=ReadD(j); //BodyPart
BaseItems[i,10]:=ReadH(j); //EnchantLevel
BaseItems[i,11]:=ReadH(j); //CustType2
BaseItems[i,12]:=ReadD(j); //AugmentationID
//debugmsg('OID='+inttostr(BaseItems[i,2])+' ID='+inttostr(BaseItems[i,3]));
//собираем ID и OID предметов и оружия
case BaseItems[i,3] of //ID
//MyWeaponID : begin
//WeaponOId:=BaseItems[i,2];
//WeaponId:=itemBase[i,3];
//end;
//MyShieldID : begin
//ShieldOId:=BaseItems[i,2];
//ShieldId:=itemBase[i,3];
//end;
MyShotID : begin
//ShotOID:=BaseItems[i,2];
ColvoShot:=BaseItems[i,5];
EditFShotVal.Text:=inttostr(BaseItems[i,5]);
end;
//MyRodID : begin
//RodOId:=BaseItems[i,2];
//MyRodEq:=BaseItems[i,8];
//end;
MyLureID : begin
//LureOId:=BaseItems[i,2];
ColvoLure:=BaseItems[i,5];
EditLureVal.Text:=inttostr(BaseItems[i,5]);
//MyLureEq:=BaseItems[i,8];
end;
MyHPID : begin
//HPOId:=BaseItems[i,2];
ColvoHP:=BaseItems[i,5];
EditHPotionVal.Text:=inttostr(BaseItems[i,5]);
end;
end;
inc(j,40);
end else
for k:=1 to 12 do BaseItems[i,k]:=0; // забиваем нулями
end;
ColvoItm:=ListCount;
if debug then msg.Lines.Add('>ColvoItm='+IntToStr(Colvoitm));
//вносим изменения в массив
StringList.Clear;
try
for i:=1 to ListCount do begin
try
StringList.Add(ItemsName.Values[IntToStr(BaseItems[i,3])]); //записываем название вещей из инвентаря
except;
msg.Lines.Add('Пропускаем! Нет ItemID='+inttostr(BaseItems[i,3])+' в itemsid.ini');
end
end;
except;
msg.Lines.Add('ошибка в CreateItemBase->StringList.Add()');
msg.Lines.Add(inttostr(BaseItems[i,3]));
exit;
end;
if not CheckBoxRod.Checked then begin //наполняем комбобокс
with ComboBoxRod do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxLure.Checked then begin //наполняем комбобокс
with ComboBoxLure do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxWeapon.Checked then begin //наполняем комбобокс
with ComboBoxWeapon do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxShield.Checked then begin //наполняем комбобокс
with ComboBoxShield do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxFShot.Checked then begin //наполняем комбобокс
with ComboBoxFShot do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxHPotion.Checked then begin //наполняем комбобокс
with ComboBoxHPotion do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
end;
//......................................
//************************************************** ****************************
procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID
var
i, ii, j, k, ListCount, UpdType : integer;
ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1,
isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID :integer;
additem : boolean;
begin
additem:=true;
ListCount:=ReadH(2); //количество итемов
// debugmsg('ListCount='+inttostr(ListCount));
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
for i:=1 to ListCount do
begin
UpdType:=ReadH(j);
ItemType1:=ReadH(j);
ObjectID:=ReadD(j);
ItemID:=ReadD(j);
LocationSlot:=ReadD(j);
Count:=ReadD(j);
ItemType2:=ReadH(j);
CustomType1:=ReadH(j);
isEquipped:=ReadH(j);
BodyPart:=ReadD(j);
EnchantLevel:=ReadH(j);
CustType2:=ReadH(j);
AugmentationID:=ReadD(j);
case UpdType of
1: k:=0; //добавлен новый предмет
2: k:=ObjectID; //изменен предмет в инвентаре
3: begin //удален
for ii:=1 to maxitems do
if (BaseItems[ii,2]=ObjectID) then
begin
//debugmsg('удаляем OID='+inttostr(BaseItems[ii,2])+' ID='+inttostr(BaseItems[ii,3]));
for k:=1 to 12 do BaseItems[ii,k]:=0;
break;
end;
end;
end;
for ii:=1 to maxitems do
begin
if (BaseItems[ii,2]=k) then
begin
BaseItems[ii,1]:=ItemType1;
BaseItems[ii,2]:=ObjectID;
BaseItems[ii,3]:=ItemID;
BaseItems[ii,4]:=LocationSlot;
BaseItems[ii,5]:=Count;
BaseItems[ii,6]:=ItemType2;
BaseItems[ii,7]:=CustomType1;
BaseItems[ii,8]:=isEquipped;
BaseItems[ii,9]:=BodyPart;
BaseItems[ii,10]:=EnchantLevel;
BaseItems[ii,11]:=CustType2;
BaseItems[ii,12]:=AugmentationID;
msg.Lines.Add('доб/изм OID='+inttostr(ObjectID)+' ID='+inttostr(ItemID)+' Equip='+inttostr(isEquipped));
break;
end;
end;
inc(j,40);
case ItemID of
6411..6518,7726..7806,8351..8359,8403..8483: begin
if not CheckBoxPU.Checked then exit;
delay(500); //стоит здесь и меньше нельзя
msg.Lines.Add('Потрошим! ObjectID='+IntToStr(ObjectID)+' ItemID='+IntToStr(ItemID)+' ColvoItem='+IntToStr(colv));
UseItem(ObjectID);//потрошим рыбу
end;
7807..7809,6519..6527: begin
if ItemID=MyLureID then begin
//LureOID:=ItemOID;
ColvoLure:=Count;
EditLureVal.Text:=inttostr(Count);
//MyLureEq:=isEquipped;
end;
end;
6535..6540: begin
if ItemID=MyShotID then begin
//ShotOID:=ItemOID;
ColvoShot:=Count;
EditFShotVal.Text:=inttostr(Count);
end;
end;
1060..1061: begin
if not CheckBoxHPotion.Checked then exit;
if ItemID=MyHPID then begin
//HPOID:=ItemOID;
ColvoHP:=Count;
EditHPotionVal.Text:=inttostr(Count);
end;
end;
end;
end;
end;
//.................................................. ............................
function GetItem(ID, FieldIn, FieldOut : integer): integer;
{GetInv(по чему будем искать, номер того по чему будем искать, номер того что надо найти)
где:
ID - искомый код;
FieldIn - по какому полю ищем;
FieldOut - какое поле возвращаем;
1=ItemType1; 2=ObjectID;3=ItemID;4=LocationSlot;5=Count;6=ItemT ype2;7=CustomType1;
8=isEquipped;9=BodyPart;10=EnchantLevel;11=CustTyp e2;12=AugmentationID;
ex1: GetInv(6408,2,1) - вернет ObjectID свадебного платья, если онное лежит в
инвентаре, иначе вернет -1
ex2: GetInv(6408,2,8) - вернет уровень заточки первого попавшегося в инвентаре
свадебного платья, если свадебного платья нет, то вернет -1
}
var
i: integer;
begin
for i:=1 to maxitems do
if (BaseItems[i,FieldIn]=ID) then begin
Result:=BaseItems[i,FieldOut];
debugmsg('Нашли='+inttostr(result));
exit;
end;
Result:=-1;
end;
//......................................
//************************************************** ****************************
function SumItem(Item: integer):integer;
var
sum, i : integer;
begin
result:=0;
//находим подходящий предмет по ItemID
for i:=1 to maxitems do begin
if (BaseItems[i,3]=item) then begin
msg.Lines.Add('Нашли предмет ItemOID='+inttostr(BaseItems[i,2])+' ItemID='+inttostr(BaseItems[i,3])+' ItemCol='+inttostr(BaseItems[i,5])+' Equip='+inttostr(BaseItems[i,8]));
msg.Lines.Add('i='+inttostr(i));
result:=result+BaseItems[i,5];
end;
end;
end;
//......................................
//************************************************** *************
procedure AppendNpc(OID, ID : integer);
//добавляем в базу данных мобов с коррекцией расстояния до них
var
i: integer;
ispovtor:boolean;
begin
isPovtor:=false;
for i:=1 to maxnpc do begin
//если нашли в базе, то коректируем его координаты на новые
if (NpcBase[1,i]=OID) and (MyOID<>OID) then begin
NpcBase[2,i]:=ID-kID; //ID
isPovtor:=true;
//msg.Lines.Add('Корректируем координаты Npc '+IntToStr(i)+' OID:'+IntToStr(NpcBase[1,i])+' ID:'+IntToStr(NpcBase[2,i]));
//msg.Lines.Add('KolvoNpc='+inttostr(kolvonpc));
end;
end;
if not isPovtor then
begin //иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового
for i:=1 to maxnpc do begin
if (NpcBase[1,i]=0) and (MyOID<>OID) then begin
//запоминаем моба в свободную ячейку
NpcBase[1,i]:=OID; //OID
NpcBase[2,i]:=ID-kID; //ID
inc(kolvonpc);
//добавляем имя Npc
//msg.Lines.Add('Вносим координаты Npc '+IntToStr(i)+' OID:'+IntToStr(NpcBase[1,i])+' ID:'+IntToStr(NpcBase[2,i]));
break;
end;
end;
end;
end;
//......................................
//************************************************** *************
procedure DeleteNpc(OID : integer); //удаляем Npc
var
i : integer;
begin
for i:=1 to maxnpc do begin
//если нашли в базе, то удаляем его
if (NpcBase[1,i]=OID) then begin
//msg.Lines.Add('Удаляем '+inttostr(NpcBase[1,i])+' '+inttostr(NpcBase[2,i]));
NpcBase[1,i]:=0; //OID
NpcBase[2,i]:=0; //ID
dec(kolvonpc);
//msg.Lines.Add('Удаляем Npc'+' KolvoNpc='+inttostr(kolvonpc));
break;
end;
end;
end;
//......................................
//************************************************** ****************************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****************************
begin
//************************************************** ************************
//не обрабатываем пустые пакеты
if pck='' then exit;

//************************************************** ************************
//проверка на готовность скрипта
if (MyOID<>0) and (LureOID<>0) and (RodOID<>0) and not status then begin
msg.Lines.Add('Скрипт инициализирован!');
status:=true;
end;

//************************************************** **************************
//серверные пакеты с ID - от хроник Интерлюдия
if (ConnectName=Name) and FromServer then begin
case pck[1] of
//************************************************** **********************
//01=MoveBackwardToLocation:d(ToX)d(ToY)d(ToZ)d(Orig X)d(OrigY)d(OrigZ)d(MoveMovement)
#$01: begin // MoveBackwardToLocation
//msg.Lines.Add('S>Пакет MoveBackwardToLocation #$01');
if ReadD(2) = MyOID then
begin
MyX := ReadD(18);
MyY := ReadD(22);
MyZ := ReadD(26);
end;
end;
//************************************************** **********************
#$04: begin //пакет с инфой о моём чаре
//msg.Lines.Add('S>Пакет UserInfo #$04');
UserInfo;
end;
//************************************************** **********************
//s05=Attack:d(AttackerID)d(TargetID)d(Damage)c(Flag s)d(X)d(Y)d(Z)h(HitsSize:Loop.01.0003)d(TargetID)d (Damage)c(Flags)
#$05: begin
msg.Lines.Add('S>Пакет Attack #$05');
if (MyOID=ReadD(6)) and (MyOID<>ReadD(2)) then begin
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
if MoveToPathEnabled then MoveTimer.Enabled:=false; //если бежали, то остановимся
if not underattack then begin
//сохраним OID напавшего
AttackerOID:=ReadD(2);
msg.Lines.Add('На нас напали! ObjectID='+IntToStr(AttackerOID));
//берем в руки оружие
if WeaponUse1 and not isEquip(WeaponOID) then giveweapon;
delay(650);
//берем в руки щит
if ShieldUse1 and not isEquip(ShieldOID) then giveshield;
delay(650);
//ставим таргет на врага
TargetAttacker(AttackerOID);
inc(mob1);
underattack:=true;
//выбираем воин или маг
if Hurricane=0
then TargetAttacker(AttackerOID) //атакуем оружием
else OnTimerA.Enabled:=True; //включаем магическую атаку
end;
//берем в руки оружие
//if WeaponUse1 and not isEquip(WeaponOID) then giveweapon;
//delay(650);
//берем в руки щит
//if ShieldUse1 and not isEquip(ShieldOID) then giveshield;
//delay(650);
end;
end;
//************************************************** **********************
//пакет Die (моб умер)
//06=Die:d(CharID)d(1)d(HasHideout)d(HasCastle)d(Fla gs)d(Sweepable)d(Access)
#$06: begin
msg.Lines.Add('S>Пакет Die #$06 ObjectID='+IntToStr(ReadD(2)));
if (AttackerOID=ReadD(2)) then begin
pbTargetHP.min:=0;
msg.Lines.Add('Убили моба ObjectID='+IntToStr(AttackerOID)+' в '+TimeToStr(time));
OnTimerA.Enabled:=false; //выключаем магическую атаку
if MoveToPathEnabled then MoveTimer.Enabled:=True; //если бежали, то продолжим путь
underattack:=false;
//репозиция
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
case MestoLovli of
1: begin cmd:='fishing'; Reposition1; end;
2: begin cmd:='fishing'; Reposition2; end;
3: begin cmd:='fishing'; Reposition3; end;
end;
msg.Lines.Add('Репозиция на месте рыбалки после боя с мобом...');
end;
if (MyOID=ReadD(2)) then begin
msg.Lines.Add('Нас убили в '+TimeToStr(time));
underattack:=false;
inc(death1);
OnTimerA.Enabled:=false; //выключаем магическую атаку
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
RequestRestartPoint; //оживаем после смерти в городе
end;
end;
//************************************************** **********************
#$07: begin //пакет Revive
//07=Revive:d(ObjectID)
msg.Lines.Add('S>Пакет Revive #$07');
if (MyOID=ReadD(2)) then begin
cmd:='death'; AfterDeath;
end;
end;
//************************************************** **********************
//0C=DropItem:d(PlayerID)d(ObjectID)d(ItemID:Get.Fun c01)d(X)d(Y)d(Z)d(Stackable)d(Count)d(1)
#$0C: begin
msg.Lines.Add('S>Пакет DropItem #$0C');
if (AttackerOID=ReadD(2)) then begin //дроп только с наших мобов
if (delta(MyX, MyY, ReadD(14), ReadD(18))<=200) then begin
//по ItemID здесь можно отсеивать ненужные предметы
//if ReadD(10)=57 then exit; //не поднимать адену
//msg.Lines.Add('Выпала вещь!!!');
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
Target(ReadD(6));
msg.Lines.Add(' Пробую поднять дроп!!!');
delay(1000);
fishin.enabled:=true;
end;
end;
end;
//************************************************** **********************
#$0E: begin
//msg.Lines.Add('S>Пакет StatusUpdate #$0E');
//0E=StatusUpdate:d(ObjectID)d(ListSize:Loop.01.0002 )d(AttrID:Get.FSup)d(Value)
if (MyOID=ReadD(2)) then StatusUpdate; //обновление информации о хп
if (AttackerOID=ReadD(2)) then TargetStatusUpdate; //обновление информации о хп
end;
//************************************************** **********************
//19 (NpcHtmlMessage)
#$0F: begin //abyss
//#$19: begin
//debugmsg('S>C Пакет NpcHtmlMessage #$19');
if ReadD(2)=FishermanOID then begin
HtmlRcv:=true; // сигналим, что был нужный HTML
end;
end;
//************************************************** **********************
#$10: begin //abyss
msg.Lines.Add('S>Пакет SellList #$10');
ListID:=ReadD(6); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
SellListRcv:=true; // сигналим, что был нужный пакет
end;
//************************************************** **********************
#$11: begin //abyss
msg.Lines.Add('S>Пакет BuyList #$11');
ListID:=ReadD(6); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
BuyListRcv:=true; // сигналим, что был нужный пакет
end;
//************************************************** **********************
#$D0: begin //abyss
msg.Lines.Add('S>Пакет MultiSellList #$D0');
ListID:=ReadD(2); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
MultiSellListRcv:=true; // сигналим, что был нужный пакет
end;
//************************************************** **********************
//12=DeleteObject:d(ObjectID)d(0)
#$12: begin
msg.Lines.Add('S>C $12 DeleteObject '+inttostr(ReadD(2)));
DeleteNpc(ReadD(2));
if (AttackerOID=ReadD(2)) then begin
pbTargetHP.min:=0;
msg.Lines.Add('Исчез напавший на нас ObjectID='+IntToStr(AttackerOID)+' в '+TimeToStr(time));
if MoveToPathEnabled then MoveTimer.Enabled:=True; //если бежали, то продолжим путь
underattack:=false;
OnTimerA.Enabled:=false; //выключае магическую атаку
//репозиция
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
case MestoLovli of
1: begin cmd:='fishing'; Reposition1; end;
2: begin cmd:='fishing'; Reposition2; end;
3: begin cmd:='fishing'; Reposition3; end;
end;
msg.Lines.Add('Репозиция на месте рыбалки после боя с мобом...');
end;
end;
//************************************************** **********************
//16=NpcInfo:d(ObjectID)d(NpcTypeId:Get.NpcId)d(IsAt tackable)d(X)d(Y)d(Z)
#$16: begin
msg.Lines.Add('S>Пакет NpcInfo #$16'+inttostr(ReadD(2)));
// OID ID
AppendNpc(ReadD(2), ReadD(6)); //добавляем в базу данных
if (FishermanID=ReadD(6)-kID) then begin
EditFishermanOID.text:=inttostr(ReadD(2));
FishermanOID:=strtoint(EditFishermanOID.text);
end;
end;
//************************************************** **********************
//1B=ItemList:h(ShowWindow)h(ListSize:Loop.01.0021)h (ItemType1)d(ObjectID)d(ItemID:Get.Func01)d(Locati onSlot)d(Count)h(ItemType2)h(CustomType1)h(isEquip ped)d(BodyPart)h(EnchantLevel)h(CustType2)d(Augmen tationID)d(Mana)d(AttackAttrElement)d(AttackAttrEl ementVal)d(DefAttrFire)d(DefAttrWater)d(DefAttrWin d)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)
#$1B: begin
msg.Lines.Add('S>Пакет ItemListPacket #$1B');
ItemList; //создание базы предметов
end;
//************************************************** **********************
//27=InventoryUpdate:h(ListSize:Loop.01.0021)h(Chang e)h(ItemType1)d(ObjectID)d(ItemID:Get.Func01)d(Loc ation)d(Count)h(ItemType2)h(CustomType1)h(isEquipp ed)d(BodyPart)h(EnchantLevel)h(CustType2)d(Augment ationBonus)d(Mana)d(AttackAttrElement)d(AttackAttr ElementVal)d(DefAttrFire)d(DefAttrWater)d(DefAttrW ind)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)
#$27: begin // 41(42) для IL, 32(34) для С4
msg.Lines.Add('S>Пакет InventoryUpdate #$27');
InventoryUpdate; //Обновление базы
end;
//************************************************** **********************
#$64: begin
//64=SystemMessage:d(MsgID:Get.MsgID)d(typesCount)
//msg.Lines.Add('S>Пакет Messages #$64');
//сорвалась или вышло время
if ((pck[2]+pck[3]=#$AC#$05)) or ((pck[2]+pck[3]=#$AA#$05)) then begin
inc(fish2);
exit;
end;
//что-то поймали
if (pck[2]+pck[3]=#$AD#$05) then //проверка, что мы начали ловить без удочки
begin
fishin.enabled:=true;
isFishing:=false;
giverod;
givelure;
end;
if (pck[2]+pck[3]=#$36#$00) then inc(fish1); //поймали рыбу
if (pck[2]+pck[3]=#$85#$06) then inc(failed1); //ничего не нашли в рыбе
if (pck[2]+pck[3]=#$35#$00) then inc(lucky1); //lucky1:=fish1-failed1; //удачно вскрыли
if (pck[2]+pck[3]=#$B1#$05) then begin //You can't fish here
//репозиция
if isEquip(RodOID) and isFishing then MagicSkillUse(fish);
fishin.enabled:=false;
isFishing:=false; //сейчас не ловим
CanFishHere:=false; //можно тут ловить?
msg.Lines.Add('Здесь нельзя ловить...');
case MestoLovli of
1: begin cmd:='fishing'; Reposition1; end;
2: begin cmd:='fishing'; Reposition2; end;
3: begin cmd:='fishing'; Reposition3; end;
end;
exit;
end;
end;
//************************************************** **********************
#$D3: begin // D3=NetPing:d(kID) на Нетпинг сервера шлем сохранённый пакет Нетпинга от клиента
//msg.Lines.Add('S>Пакет NetPing #$D3');
if LogOutOk then begin
buf:=NetPing;
SendToServerEx(Name);
//msg.Lines.Add('C>Пакет NetPing #$A8');
end;
end;
//************************************************** **********************
//ловим рыбу
//FE1300=ExFishingStart:h(charOID)d(fishType)d(X)d(Y )d(Z)b(isNightLure)b(c)
//-----FE1E00=ExFishingStart:h(subID)d(ObjectID)d(FishTyp e)d(X)d(Y)d(Z)c(0)c(0)c(isNightLure)c(0)
//FE1400=ExFishingEnd:h(charObjtId)b(isWin)
//-----FE1F00=ExFishingEnd:h(subID)d(CharID)c(isWin)
//FE1500=ExFishingStartCombat:h(charOID)d(time)d(HP) b(Fighting)b(LureType)b(isFishDeceptive)
//FE16=ExFishingHpRegen:h(subID)d(charObjID)d(time)d (fish_HP)c(HPstop/rise)c(GoodUse)c(anim)d(penalty)c(BarColor)
//-----FE2800=ExFishingHPRegen:h(subID)d(ObjectID)d(Time) d(FishHP)c(HPstop/Rise)c(GoodUse)c(Anim)d(Penalty)c(BarColor)
#$FE: begin
if Status and (MyOID<>0) then begin
case pck[2] of
//FE1400=ExFishingEnd:h(charObjtId)b(isWin)
#$14: begin
//msg.Lines.Add('S>Пакет ExFishingEnd #$FE1400');
if MyOID=ReadD(4) then begin
gooduse:=0;
isFishing:=false; //сейчас не ловим
inc (MMesto);
if ReadC(8)=1 then begin
msg.Lines.Add('Поймали!');
end else begin
if stop then exit; //нажали кнопку стоп!
msg.Lines.Add('Сорвалась!');
end;
//не пора ли поменять место ловли?
if (MMesto>=PMMesto) then begin
MMesto:=0; //сбрасываем готовность смены места
inc(MestoLovli);
if (MestoLovli>3) then MestoLovli:=1;
fishin.enabled:=false;
case MestoLovli of
1: begin cmd:='fishing'; MenayemMesto1; end;
2: begin cmd:='fishing'; MenayemMesto2; end;
3: begin cmd:='fishing'; MenayemMesto3; end;
end;
msg.Lines.Add('Бежим на новое место...');
exit;
end;
fishin.enabled:=true;
end;
end;
//FE1600=ExFishingHPRegen:h(subID)d(ObjectID)d(Time) d(FishHP)c(HPstop/Rise)c(GoodUse)c(Anim)d(Penalty)c(BarColor)
#$16: begin
//msg.Lines.Add('S>Пакет ExFishingHpRegen #$FE1600');
if MyOID=ReadD(4) then begin
if (pck[16]+pck[17]=#$00#$00) then begin
inc(gooduse);
if gooduse>=1 then pumping;
exit;
end;
if (pck[16]+pck[17]=#$01#$00) then begin
inc(gooduse);
if gooduse>=1 then reeling;
exit;
end;
if (pck[17]=#$01) then gooduse:=0;
end;
end;
end;
end;
end;
end;
end;
//************************************************** **************************
//клиентские пакеты с ID - от хроник Грация
if (ConnectName=Name) and FromClient then begin
case pck[1] of
//************************************************** **********************
#$09: begin //C>09=LogoutRequest - выходим ручками из клиента
//msg.Lines.Add('S>Пакет LogoutRequest #$09');
// вроде не надо тут их ставить?
// NoFreeOnClientDisconnect;
// NoFreeOnServerDisconnect;
pck:='';
// шлем s7E=LogOutOk, для отключения клиента
//msg.Lines.Add('S>Пакет LogOutOk #$7E');
buf:=#$7E;
SendToClientEx(Name);
LogOutOk:=true;
end;
//************************************************** **********************
//0F=MoveBackwardToLocation:d(ToX)d(ToY)d(ToZ)d(Orig X)d(OrigY)d(OrigZ)d(MoveMovement)
#$0F: ParseMoveClient; //move
//************************************************** **********************
//34=RequestSocialAction:d(Action:Get.Func09)
#$34: begin
//msg.Lines.Add('C>Пакет RequestSicialAction #$1B');
case ReadD(2) of
//социальное действие Yes для начала ловли
6: begin
//msg.Lines.Add('Отключили клиент из скрипта...');
//для версии 3.1.9+ можно попробовать отключить клиента
//Варнинг! Опасно для жизни! =)
LogOutOk:=true;
buf:=#$7E;
SendToClientEx(Name); // отключаем клиент
//msg.Lines.Add('S>Пакет LogOutOk #$7E');
//не передаем серверу социальное действие
pck:='';
end;
end;
end;
//************************************************** **********************
//49=Say2:s(Text)d(Type)s(Target)
#$49: //say2
//если это команда и она обработана и надо очистить чат
if ParseCmd(ReadS(2)) and EraseCommandFromChat then pck:='';//kill packet
//ValidatePosition пакет от клиента с моими кординатами
//59=ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
//************************************************** **********************
#$59: begin
//msg.Lines.Add('C>Пакет ValidatePosition #$48');
MyX:=ReadD(2); //получаю координату х моего чара
MyY:=ReadD(6); //получаю координату у моего чара
MyZ:=ReadD(10); //получаю координату z моего чара
end;
//************************************************** **********************
#$A8: begin // C>A8=NetPing:d(kID)d(PING)d(dta)
//msg.Lines.Add('C>Пакет NetPing #$A8');
NetPing:=pck; // запомним его
pck:='';
end;
end; //case
end;
end.

pickwick
18.04.2009, 15:53
что бы не создовать лишней темы решил спросить тут поскольку касается абисса:
дело в том что на абиссе при трейде с кем то во время этого нельзя удалять или перемещать вещи страйдеру к примеру, есть ли способ обойти это?

может мне хотя бы кто нить обяснить от чего это зависит, от сервера или клиента?

Romka
19.04.2009, 21:09
а какие настройки ставить в хаке? а то он у меня почему то не видит удочку, приманку и тд...

Velziv
19.04.2009, 21:52
Камелот ну кто здает манор? Я) И здают его не ботом а простой отправкой пакета.

Romka
19.04.2009, 23:14
ну наконец-то рыбачит :) теперь осталась одна проблема - не видит Monakana (( какой у него ID? или что сделать?

Добавлено через 51 минуту
Еще проблема :( после того как убьет моба не берет удочку обратно в руки...ХЭЛП

mOBSCENE
21.04.2009, 23:55
эх, сделать чтоль к абису платный патчик для валкера пока на шоках админы думают как привести в порядок то что они создали...

Уже передумал?)

dmitry501
22.04.2009, 05:59
Уже передумал?)

А это http://forum.theabyss.ru/index.php?showtopic=55541&st=1000&p=2916956&# тебя чем не устраивает? Тем что бесплатно?

NLObP
23.04.2009, 02:41
ну наконец-то рыбачит :) теперь осталась одна проблема - не видит Monakana (( какой у него ID? или что сделать?

Еще проблема :( после того как убьет моба не берет удочку обратно в руки...ХЭЛП

У меня Монакана видит. Удочку может не берет из-за лагов. Попробуй в скрипте паузы изменить между пакетами взятия удочки.

ЗЫЖ Я скрипт рыбалки для Абисс поправил на предмет мультиселла. Смотреть в моём предыдущем сообщении.

mOBSCENE
23.04.2009, 02:59
А это http://forum.theabyss.ru/index.php?showtopic=55541&st=1000&p=2916956&# тебя чем не устраивает? Тем что бесплатно?

Просто спросил..)

Romka
24.04.2009, 10:42
ну вот вроде рыбачу я на абуссе с горем пополам, но все же хочу еще раз обратится за помощью к профессионалам хака :)
NLObP, может получится исправить такую проблему:
(дословно) вылавливаю моба, берет в таргет, берет ствол, но не стреляет, с пина начинает стрелять - убивает моба, берет удочку, надевает наживку...снимает наживку, одевает наживку, снимает наживку, одевает и так бесконечно :) обратил внимание на то, что многочисленный вызов инвентаря меняет дело :confused: с рыбаком все впорядке - меняет, покупает :good: за это спасибо

NLObP
24.04.2009, 10:52
Romka, на выходных посмотрю, что случилось.

StekloReZ
25.04.2009, 13:26
Когда будешь разбираться, обрати внимание на то, что инвентарь сам по себе не сортируется в рюкзаке, в нём и пустые места бывают. А при вызове инвентаря он тутже перестраивается.

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

alexteam
25.04.2009, 13:41
гыг. а никому не кажеться что это уже "проблема" клиента именно он запоминал. ?
а т.н. "пробелы" существуют на офах. во всяком случае там можно укладывать инвентарь как душе угодно.
походу "это не баг а фича" ©

Grinch
25.04.2009, 16:48
какая разница обжект ид предмета при перестройке инвентаря не измениться сто пудов

NLObP
25.04.2009, 19:25
StekloReZ, глюки в самом скрипте. Пытается одеть крючки раньше удочки. Немного поправил скрипт, вечером еще буду править. Выложу как сделаю.

Romka
30.04.2009, 21:51
не знаю как другие, но я жду скрипт на рыбалку :) наивный :D

StekloReZ
01.05.2009, 06:15
не знаю как другие, но я жду скрипт на рыбалку :) наивный :D
Дядька сказал, Дядька зделает. А вот когда зделает он не сказал.;)
Времени всегда не хватает, да ещё на таких бедных и обиженных, типа,
как мы )) Я тоже жду, и торопить не собираюсь.
Сам пробую писать скрипты пока на работе, и не всегда даже проверить есть время.

NLObP
06.05.2009, 03:20
Обновил скрипт рыбалки в 45 сообщении (http://coderx.ru/showpost.php?p=27737&postcount=45).
0.10.10
+ Спасибо StekloReZ за предоставленных чаров для тестирования;
+ поменял работу с инвентарем;
+ поменял работу продажа/покупка/обмен;
+ удочку/крючок, оружие чар должен брать нормально;

StekloReZ
06.05.2009, 08:47
Благодарствую, а пока рыбачит
полезу разбираться в работу скрипта с инвентарём)):dance2:

Akropol
07.03.2010, 13:21
Например поставил версию 3.4.1.83 вроде все пашет пакеты хватает.Но как ток пробуешь что то отослать подумает секунда 10 и начинает выдавать ошибки и выкидывает из игры.Отписавшиеся ранее,есть ли у вас готовая версия проги под абисс?Или ссылка на нее,а если еще готовый пакетикик есть,так вообще было бы замечательно.

Excellence
10.03.2010, 03:24
Проверил сегодня, что там с Абиссом. Все пакеты, я так понял, форматом от грации, только айди серверных пакетов почему то остались от интерлюда.
Поэтому, у кого есть желание, в скриптах для грации просто смените айди серверных пакетов с грации на интерлюд.
Для проверки исправил скрипт рыбалки для грации, теперь он записывает маршрут, бегает по нему в обе стороны, видит инвентарь.

Пакеты от ИЛа потому что админы ручками всё с птс ИЛа дописывали. А клиент грации так прикрутили, вот и получается серверные пакеты идут как на ИЛ, клиентские как на Грации.

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

NLObP
10.03.2010, 21:39
З.Ы. Кстати волкер рабочий на абисс есть, выкладывали у них на форуме, сам пользовался правда как трейдботом о всё функционале не скажу. Если админы разрешат могу выложить даже в этой теме.

Не надо!