Код:
{БОТ - Воин помошник от Alexus
версия: 0.3 (бета)
дата: 08.04.08
Описание:
Универсальный скрипт для война - помошника в каче.
Помошник бегает за вами куда бы вы не пошли и атакует ваши цели по ассисту,
как только вы сами начнете атаку (двойным кликом мыши по цели).
Либо может быть вагончиком в паровозе ботов и бегать за Локомотивом
Возможности:
1. Может бегать и за живим игроком и за ботом - локомотивом (от Alexus)
1. Бегает за Вами, не отлипает.
2. Помогает бить врагов.
3. Умеет лечиться (тип банки легко настраивается).
4. Скрипту неважно, находятся ли персы в пати или нет.
5. Работает на С4 и С6 серверах.
Инструкция:
1. Запускаем ПакетХак.
2. Если используем совместно с ботом - Локомотивом (от Alexus), то в "Списке скриптов" ставим этот скрипт ниже локомотива.
2. Запускаем оба клиента игры.
3. Задаем (ниже) реальные имена командира и помошника.
4. Внимательно настраиваем остальные константы в Секции настройки.
5. Запускаем скрипт.
}
//######################## Секция настройки ######################################################
const
interlude = true; // C6 - true, C4 - false;
CommanderName = 'x'; // Ник командира
AssistantName = 'x'; // Ник помошника
CommanderBot = true; // Командир - это "бот - Локомотив", или человек?
HPMedium = 70; // % с которого начинаем лечиться банками
HPBottleID = 1061; // ItemID 1060=Lesser Healing Potion; 1061=Healing Potion; 1539=Greater Healing Potion;
DrinkDelay = 14; // минимальное время задержки повторного питься бутылки (10 - 20 сек)
InvRazmer = 79; // Размер инвенторя у ассистента -1 (если инвентарь 80, то писать надо 79, если 100, то писать 99)
//#################################################################################################
var
CommanderX, CommanderY, CommanderZ : integer; // Мои статы
CommanderID, CommanderHP, CommanderMaxHP: integer;
AssistX, AssistY, AssistZ : integer; // Статы помошника
AssistID, AssistHP, AssistMaxHP: integer;
AssistMP, AssistMaxMP : integer;
AssistHPlevelProcent : integer;
TargetID : integer;
time1: integer;
Inventory: array[0..InvRazmer, 0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
HPBottleObjID: integer; // ObjectID бутыли
HpBottleCount: integer; // количество бутылей
procedure Init; //Вызывается при включении скрипта
begin
CommanderID:= 0; // обнуляем ВСЕ данные
CommanderX:= 0;
CommanderY:= 0;
CommanderZ:= 0;
CommanderID:= 0;
CommanderHP:= 0;
CommanderMaxHP:= 0;
// MyMP:= 0;
// MyMaxMP:= 0;
AssistID:= 0;
AssistX:= 0;
AssistY:= 0;
AssistZ:= 0;
AssistID:= 0;
AssistHP:= 0;
AssistMaxHP:= 0;
AssistMP:= 0;
AssistMaxMP:= 0;
TargetID:=0;
time1:=1;
buf:= #$14; //запрашиваем пакеты с инвентарем и userinfo
SendToServerEx(AssistantName);
SendToServerEx(CommanderName);
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
if interlude then offset:= 8 else offset:=0;
for i:=0 to InvRazmer do
if (i<ReadH(4)) then begin
Inventory[i,0]:=ReadH(i*(28+offset)+6); // itemType1
Inventory[i,1]:=ReadD(i*(28+offset)+8); // ObjectId
Inventory[i,2]:=ReadD(i*(28+offset)+12); // ItemID
Inventory[i,3]:=ReadD(i*(28+offset)+16); // count
Inventory[i,4]:=ReadH(i*(28+offset)+20); // itemType2
Inventory[i,5]:=ReadH(i*(28+offset)+22); // CustType1
Inventory[i,6]:=ReadH(i*(28+offset)+24); // isEquipped
Inventory[i,7]:=ReadD(i*(28+offset)+26); // BodyPart
Inventory[i,8]:=ReadH(i*(28+offset)+30); // EnchantLevel
Inventory[i,9]:=ReadH(i*(28+offset)+32); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
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 InvRazmer do if (Inventory[i,up]=obj) then
begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;
procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemID
begin
buf:=#$19;
WriteD(ItemObjID);
WriteD(0);
SendToServerEx(AssistantName);;
end;
//############################################################################################
procedure AssistUserInfo; // обновление данных о ассистенте
var
i:word;
begin
AssistID:=ReadD(18);
AssistX:=ReadD(2);
AssistY:=ReadD(6);
AssistZ:=ReadD(10);
i:=22;
ReadS(i);
if interlude then i:=i+48 else i:=i+44;
AssistMaxHP:=ReadD(i);
AssistHP:=ReadD(i);
AssistMaxMP:=ReadD(i); // чисто информативно
AssistMP:=ReadD(i);
// i:=i+363; пока не используется
// MyMaxCP:=ReadD(i);
// MyCP:=ReadD(i);
end;
procedure AssistStatusUpdate; // обновление данных о ассистенте
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$00: AssistHP:=ReadD(i*8+14);
#$01: AssistMaxHP:=ReadD(i*8+14);
#$0C: AssistMP:=ReadD(i*8+14);
#$0D: AssistMaxMP:=ReadD(i*8+14);
// #$23: MyCP:=ReadD(i*8+14); пока не используется
// #$24: MyMaxCP:=ReadD(i*8+14);
end;
if AssistMaxHP > 0 then AssistHPlevelProcent:= Round((AssistMaxHP/100)*HPMedium);
end;
procedure CommanderUserInfo; // обновление данных о себе
var
i:word;
begin
CommanderID:=ReadD(18);
CommanderX:=ReadD(2);
CommanderY:=ReadD(6);
CommanderZ:=ReadD(10);
i:=22;
ReadS(i);
if interlude then i:=i+48 else i:=i+44;
CommanderMaxHP:=ReadD(i);
CommanderHP:=ReadD(i);
end;
procedure Action; // команда действия
begin
buf:=#$1F; //action
WriteD(TargetID);
WriteD(AssistX);
WriteD(AssistY);
WriteD(AssistZ);
WriteC(0);
SendToServerEx(AssistantName);
end;
procedure DrinkBottle; // пьем бутылки и следим за их количеством
begin
if HPBottleCount > 0 then
begin
UseItemObjID(HPBottleObjID);
dec (HPBottleCount);
end;
end;
begin // Далее обработка входящих пакетов
if pck = '' then exit;
if (ConnectName = CommanderName) and FromServer then
case pck[1] of
#$31: if ReadS(22) = CommanderName then CommanderUserInfo;
end;
if (ConnectName = AssistantName) and FromServer then
case pck[1] of
#$31: if ReadS(22) = AssistantName then AssistUserInfo;
#$18: if AssistID=ReadD(2) then // StatusUpdate:h(ObjectID)d(Attributes)
begin
AssistStatusUpdate;
if (AssistHP > 0) and (AssistHP < AssistHPlevelProcent) then if Wait(time1, DrinkDelay) then DrinkBottle; // пьем бутылки с интервалом в 19 сек
if (AssistHP > 0) and (AssistHP > AssistHPlevelProcent) then time1:=1;
end;
#$11: begin
InventoryCreate; // Инвентарь
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
//#$21: InventoryUpdate;
end;
if (ConnectName = AssistantName) and FromServer and CommanderBot then
case pck[1] of
#$2F: if CommanderID = ReadD(2) then
begin
TargetID:= CommanderID;
Action; Action;
end;
#$33, #$72 : if CommanderID = ReadD(2) then //Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d(X)d(Y)d(Z)h(Hits)
begin
TargetID:= ReadD(6);
Action; Action;
end;
end;
if (ConnectName = CommanderName) and FromClient and (not CommanderBot) then
case pck[1] of
#$2F: begin
TargetID:= CommanderID;
Action; Action;
end;
#$31: begin
TargetID:= ReadD(2); // Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ActionID)
Action;
end;
end;
end.__________________
уже пробовал править ИД пакетов, но чтото не очень получилось.
PanAm,если этот милый человек вновь мне поможет, то буду рад выложить отредоктированный под ХБ скриптик.
Загвозда как всегда, по всему скрипту искал пакеты эти, а в одном месте даже не понял что это за пакет. Отсутствие знания паскаля даёт свои отпечатки.
Добавлено через 2 минуты
Код:
procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemID
begin
buf:=#$14;
вот что это за пакетик???