Местный
Регистрация: 08.05.2008
Сообщений: 107
Сказал Спасибо: 6
Имеет 12 спасибок в 6 сообщенях
|
Скрипт Бота(кач/споил)
Первый мой дельный скрипт.
Бот для кача и спойла. v1.2
Возможности
-сам качается
-ищет ближайшего моба
-спойлит\свипает (1.1)
-подбирает вещи
-садится при 45%хп, встает при 95%
-пьет банки при 30%хп (1.2)
-если во время боя напал другой моб, бьем его а не ближайшего (1.2)
-если долго не убили ни одного моба ищем следующего (1.1)
-лог в приват чат
-на пользовательской вкладке инвентарь, окрестные мобы и монитор хп/мп/цп
В разработке
-обход препятствий (ожидается в 1.3)
-атака агрессивных первыми (ожидается в 1.5)
-атака только одиночных мобов (ожидается в 1.5)
-движение по маршруту (ожидается в 1.4)
-покупка лечилок в городе (ожидается в 1.6)
-аутгейм режим (ожидается в 2.0)
-манор (ожидается в 1.3)
delphi Код:
{
Бот для кача и спойла. v1.2
Возможности
-сам качается
-ищет ближайшего моба
-спойлит\свипает (1.1)
-подбирает вещи
-садится при 45%хп, встает при 95%
-пьет банки при 30%хп (1.2)
-если во время боя напал другой моб, бьем его а не ближайшего (1.2)
-если долго не убили ни одного моба ищем следующего (1.1)
-лог в приват чат
-на пользовательской вкладке инвентарь, окрестные мобы и монитор хп/мп/цп
В разработке
-обход препятствий (ожидается в 1.3)
-атака агрессивных первыми (ожидается в 1.5)
-атака только одиночных мобов (ожидается в 1.5)
-движение по маршруту (ожидается в 1.4)
-покупка лечилок в городе (ожидается в 1.6)
-аутгейм режим (ожидается в 2.0)
-манор (ожидается в 1.3)
Ошибки
-атакет мобов под текстурами
-упирается в стены
-ошибка, если запустить после входа в мир
-ошибка если атаковать (или поднять) сидящего
-знает не всех мобов и вещи
-не ограничена область кача
-после смерти ничего не делает
Использование:
-на экране выбора чаров ставим галку на скрипт
-убираем галку "сохранять пакеты"
-входим в игру
-жмем Yes
}
//******************************************
//******************************************
//служебные константы
//******************************************
//******************************************
const
OID=0;
atk=1;
id=2;
x=3;
y=4;
z=5;
CHP=6;
MHP=7;
//******************************************
//******************************************
//переменные
//******************************************
//******************************************
var
State, Log, Inv, Npc:TMemo;
Search, Avard:TTimer;
CurHP,CurMP, MaxHP, MaxMP, MaxCP, CurCP:Integer;
MyX,MyY,MyZ,MyID:Integer;
Name:String;
i:integer;
Inventory: Array[0..79,0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
Mob:Array [0..100,0..7] of integer;
target, lasttarget:integer;
sitting:boolean;
Battle:Array[0..11] of integer;
//******************************************
//******************************************
//служебные функции
//******************************************
//******************************************
//******************************************
//количество атакующих нас мобов
//******************************************
function BattleCount:integer;
var
i, count:integer;
begin
count:=0;
for i:=0 to 10 do begin
if NOT (Battle[i]=0) then count:=count+1;
end;
Result:=count;
end;
//******************************************
//удалить из списка атакующих
//******************************************
procedure DelBattle(id:integer);
var
i:integer;
begin
for i:=0 to 10 do begin
if (Battle[i]=id) then begin
Battle[i]:=0;
exit;
end;
end;
end;
//******************************************
//добавить в список атакующих
//******************************************
procedure AddBattle(id:integer);
var
i:integer;
begin
for i:=0 to 10 do begin
if (Battle[i]=0) then begin
Battle[i]:=id;
exit;
end;
end;
end;
//******************************************
//выбрать атакующего
//******************************************
function BattleSel:integer;
var
i, id:integer;
begin
id:=0;
for i:=0 to 10 do begin
if NOT (Battle[i]=0) then begin
id:=Battle[i];
break;
end;
end;
Result:=id;
end;
//******************************************
//атака
//******************************************
procedure Attack(id:integer);
begin
if(id>-1) then begin
SendMsg('Бьем гада');
SendAction(id);
spoil;
SendAction(id);
end;
end;
//******************************************
//сесть
//******************************************
procedure sit;
begin
buf:=#$45;
WriteD(0);
WriteD(0);
buf:=buf+#$00;
SendToServer;
sitting:=NOT sitting;
end;
//******************************************
//споил
//******************************************
procedure spoil;
begin
buf:=#$2f;
WriteD(254);
WriteD(0);
buf:=buf+#$00;
SendToServer;
end;
//******************************************
//свипер
//******************************************
procedure sweeper;
begin
buf:=#$2f;
WriteD(42);
WriteD(0);
buf:=buf+#$00;
SendToServer;
end;
//******************************************
//сообщение в чат
//******************************************
procedure SendMsg(str:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(2);
WriteS('BOT');
WriteS(str);
SendToClient;
end;
//******************************************
//название вещи
//******************************************
function ItemName(id:integer):string;
var
str:string;
begin
str:=IntToStr(id);
case id of
57: str:='Adena';
727: str:='Healing Potion';
1060: str:='Lesser Healing Potion';
1864: str:='Stem';
1865: str:='Varnish';
1866: str:='Suede';
1867: str:='Animal Skin';
1868: str:='Thread';
1869: str:='Iron Ore';
1870: str:='Coal';
1871: str:='Charcoal';
1872: str:='Animal Bone';
1873: str:='Silver Nugget';
1874: str:='Oriharukon Ore';
1875: str:='Stone of Purity';
1876: str:='Mithril Ore';
1877: str:='Adamantite Nugget';
1878: str:='Braided Hemp';
1879: str:='Cokes';
1880: str:='Steel';
1881: str:='Coarse Bone Powder';
1882: str:='Leather';
1883: str:='Steel Mold';
1884: str:='Cord';
1885: str:='High Grade Suede';
1886: str:='Silver Mold';
1887: str:='Varnish of Purity';
1888: str:='Synthetic Cokes';
1889: str:='Compound Braid';
1890: str:='Mithril Alloy';
1891: str:='Artisan Frame';
1892: str:='Blacksmiths Frame';
1893: str:='Oriharukon';
1894: str:='Crafted Leather';
1895: str:='Metallic Fiber';
end;
Result:=str;
end;
//******************************************
//имя моба
//******************************************
function NpcName(id:integer):string;
var
str:string;
begin
str:=IntToStr(id);
case id of
1000317: str:='Black Wolf';
1000327: str:='Goblin Snooper';
1000322: str:='Goblin Bridgand';
1000307: str:='Garum Werewolf';
1000447: str:='Utuku Orc Archer';
end;
Result:=str;
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 79 do
if (Inventory[i,up]=obj) then begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;
//******************************************
//использовать вещь
//******************************************
procedure UseItem(ItemObjID,shift:integer);
begin
buf:=#$14;
WriteD(ItemObjID);
WriteD(shift);
SendToServer;
end;
//******************************************
//поиск ближаишего к нам моба
//******************************************
function NearestMob:integer;
var
i, min:integer;
mdist,dist: Double;
begin
mdist:=3600000;
min:=-1;
for i:=0 to 100 do begin
if (Mob[i,OID]>0) then begin
if(Mob[i,Atk]=1) then begin
dist:=((Mob[i,x]-MyX)*(Mob[i,x]-MyX))+((Mob[i,y]-MyY)*(Mob[i,y]-MyY))+((Mob[i,z]-MyZ)*(Mob[i,z]-MyZ));
if(dist<mdist) then begin
mdist:=dist;
min:=i;
end;
end;
end;
end;
Result:=min;
end;
//******************************************
//отправка пакета action(таргет атака и подбор вещи)
//******************************************
procedure SendAction(id:integer);
var
i:integer;
begin
buf:=#$04;
WriteD(id);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
buf:=buf+#$00;
SendToServer;
target:=-1;
for i:=0 to 100 do begin
if(Mob[i,OID]=id) then begin
target:=i;
lasttarget:=id;
break;
end;
end;
StateShow;
end;
//******************************************
//******************************************
//таймеры
//******************************************
//******************************************
//******************************************
//основной таймер
//******************************************
procedure OnSearch;
var
id:int;
begin
if ((CurHP*100 DIV MaxHP)<40) AND NOT(sitting) AND Search.Enabled then begin
delay(100);
sit;
exit;
end;
Avard.Enabled:=false;
Avard.Enabled:=True;
SendMsg('Выбираем цель');
id:=NearestMob;
Attack(Mob[id,OID]);
Search.Enabled:=False;
end;
//******************************************
//аварийный таймер, если долго ничего не происходило
//******************************************
procedure OnAvard;
begin
SendMsg('Долгая пауза!Рестарт скрипта!');
Search.Enabled:=true;
end;
//******************************************
//******************************************
//Инициализация и освобождение ресурсов
//******************************************
//******************************************
procedure Init; //Вызывается при включении скрипта
begin
ShowTab;
State:=TMemo.Create(UserTab);
State.parent:=UserTab;
State.align:=alRight;
State.ReadOnly:=true;
State.ScrollBars:=2;
State.Width:=100;
State.Height:=100;
Inv:=TMemo.Create(UserTab);
Inv.parent:=UserTab;
Inv.align:=alLeft;
Inv.ReadOnly:=true;
Inv.ScrollBars:=2;
Inv.Width:=180;
Inv.Height:=100;
Npc:=TMemo.Create(UserTab);
Npc.parent:=UserTab;
Npc.align:=alLeft;
Npc.ReadOnly:=true;
Npc.ScrollBars:=2;
Npc.Width:=180;
Npc.Height:=100;
Log:=TMemo.Create(UserTab);
Log.parent:=UserTab;
Log.align:=alBottom;
Log.ReadOnly:=true;
Log.ScrollBars:=2;
Log.Width:=100;
Log.Height:=100;
Log.Lines.Add('...');
CurHP:=0;
CurMP:=0;
MaxHP:=0;
MaxMP:=0;
target:=-1;
sitting:=false;
StateShow;
Search:=TTimer.Create(nil); // создаем таймеры
Search.OnTimer:=@OnSearch;
Search.enabled:=false;
Search.Interval:=2000;
Avard:=TTimer.Create(nil); // создаем таймеры
Avard.OnTimer:=@OnAvard;
Avard.enabled:=false;
Avard.Interval:=50000;
for i:=0 to 100 do begin
mob[i,0]:=0;
end;
for i:=0 to 10 do begin
Battle[i]:=0;
end;
end;
procedure Free; //Вызывается при выключении скрипта
begin
HideTab;
State.Free;
Log.Free;
Inv.Free;
Npc.Free;
Search.Enabled:=False;
Search.Free;
Avard.Enabled:=false;
Avard.free;
end;
//******************************************
//******************************************
//Обработка пакетов
//******************************************
//******************************************
procedure InitStats;
var
i: integer;
begin
MyID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
i:=22;
Name:=ReadS(i);
i:=i+44;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:=i+363;
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
if ((CurHP*100 DIV MaxHP)>95) AND sitting then begin
sit;
Search.Enabled:=true;
end;
if ((CurHP*100 DIV MaxHP)<30) then begin
SendMsg('Пьем банку');
UseItem(GetInv(1060,2,1),0);
end;
StateShow;
end;
procedure CorsUpdate;
begin
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
StateShow;
end;
procedure InventoryCreate;
var
i,k: integer;
begin
for i:=0 to 79 do
if (i<ReadH(4)) then begin
Inventory[i,0]:=ReadH(i*28+6); // itemType1
Inventory[i,1]:=ReadD(i*28+8); // ObjectId
Inventory[i,2]:=ReadD(i*28+12); // ItemID
Inventory[i,3]:=ReadD(i*28+16); // count
Inventory[i,4]:=ReadH(i*28+20); // itemType2
Inventory[i,5]:=ReadH(i*28+22); // CustType1
Inventory[i,6]:=ReadH(i*28+24); // isEquipped
Inventory[i,7]:=ReadD(i*28+26); // BodyPart
Inventory[i,8]:=ReadH(i*28+30); // EnchantLevel
Inventory[i,9]:=ReadH(i*28+32); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
InvShow;
end;
procedure InventoryUpdate;
var
i,j,k: integer;
begin
for j:=0 to (ReadH(2)-1) do begin
case pck[j*30+4] of
#$01: k:=0; // add item, запишет на пустую ячейку
#$02: k:=ReadD(j*30+8); // mod item
#$03: begin // remove item, обнулит ячейки удаленного предмета
k:=ReadD(j*30+8);
for i:=0 to 79 do
if (Inventory[i,0]=k) then begin
for k:=0 to 9 do Inventory[i,k]:=0;
exit;
end;
end;
end;
for i:=0 to 79 do
if (Inventory[i,1]=k) then begin
Inventory[i,0]:=ReadH(j*30+6); // itemType1
Inventory[i,1]:=ReadD(j*30+8); // ObjectId
Inventory[i,2]:=ReadD(j*30+12); // ItemID
Inventory[i,3]:=ReadD(j*30+16); // count
Inventory[i,4]:=ReadH(j*30+20); // itemType2
Inventory[i,5]:=ReadH(j*30+22); // CustType1
Inventory[i,6]:=ReadH(j*30+24); // isEquipped
Inventory[i,7]:=ReadD(j*30+26); // BodyPart
Inventory[i,8]:=ReadH(j*30+30); // EnchantLevel
Inventory[i,9]:=ReadH(j*30+32); // CustType2
break;
end;
end;
InvShow;
end;
procedure NpcInfo;
var
mid, matk, mx, my, mz, mtype:integer;
i:integer;
begin
i:=2;
mid:=ReadD(i);
mtype:=ReadD(i);
matk:=ReadD(i);
mx:=ReadD(i);
my:=ReadD(i);
mz:=ReadD(i);
for i:=0 to 100 do begin
if(Mob[i,OID]=mid) then begin
Mob[i,OID]:=0;
{if(target=i) then begin
target:=-1;
end;}
break;
end;
end;
for i:=0 to 100 do begin
//if(mob[i,OID]=mid) then mob[i,OID]:=0;
if(mob[i,OID]=0) then begin
mob[i,OID]:=mid;
mob[i,atk]:=matk;
mob[i,id]:=mtype;
mob[i,x]:=mx;
mob[i,y]:=my;
mob[i,z]:=mz;
mob[i,CHP]:=0;
mob[i,MHP]:=0;
break;
end;
end;
ShowNpc;
end;
procedure Action;
var
id:integer;
act:integer;
i:integer;
begin
id:=ReadD(2);
target:=-1;
for i:=0 to 100 do begin
if(Mob[i,OID]=id) then begin
target:=i;
lasttarget:=id;
break;
end;
end;
StateShow;
end;
procedure DeleteObject;
var
i, id:integer;
begin
id:=ReadD(2);
DelBattle(id);
for i:=0 to 100 do begin
if(Mob[i,OID]=id) then begin
Mob[i,OID]:=0;
if(target=i) then begin
target:=-1;
Search.Enabled:=true;
end;
break;
end;
ShowNpc;
end;
end;
procedure Die;
var
i, id:integer;
begin
id:=ReadD(2);
for i:=0 to 100 do begin
if(Mob[i,OID]=id) then begin
Mob[i,Atk]:=-1;
if(lasttarget=id) then begin
SendMsg('Убили гада');
DelBattle(id);
Avard.Enabled:=false;
Avard.Enabled:=True;
delay(100);
sweeper;
SendMsg('Еще в битве:'+IntToStr(BattleCount));
if(BattleCount=0) then Search.Enabled:=true
else begin
Attack(BattleSel);
end;
end;
break;
end;
ShowNpc;
end;
end;
procedure MoveToLocation;
var
i, id, cx,cy,cz,dx,dy,dz:integer;
begin
i:=2;
id:=ReadD(i);
cx:=ReadD(i);
cy:=ReadD(i);
cz:=ReadD(i);
dx:=ReadD(i);
dy:=ReadD(i);
dz:=ReadD(i);
for i:=0 to 100 do begin
if(Mob[i,OID]=id) then begin
Mob[i,x]:=dx;
Mob[i,y]:=dy;
Mob[i,z]:=dz;
break;
end;
//ShowNpc;
end;
end;
procedure DropItem;
var
pid, iid,i:integer;
begin
i:=2;
pid:=ReadD(i);
iid:=ReadD(i);
if(lasttarget>-1) then begin
//Log.Lines.Add(IntToStr(Mob[target,OID])+' '+IntToStr(pid));
if (pid=lasttarget) then begin
Log.Lines.Add('Try pickup');
SendMsg('Выпала вещь');
delay(1000);
SendAction(iid);
Log.Lines.Add('Try pickup');
SendMsg('Пытаюсь поднять');
end;
end;
end;
procedure UnderAttack;
var
id, target,i:integer;
begin
i:=2;
id:=ReadD(i);
target:=ReadD(i);
if(target=MyID) then begin
DelBattle(id);
AddBattle(id);
end;
end;
//******************************************
//******************************************
//заготовка под аутгейм
//******************************************
//******************************************
procedure ShowNpc;
var
i:integer;
str:string;
begin
Npc.Lines.Clear;
for i:=0 to 100 do begin
if NOT(mob[i,OID]=0) then begin
if (mob[i,Atk]=1) then
str:=IntToStr(i)+'Mob:'
else
if (mob[i,Atk]=-1) then
str:=IntToStr(i)+'Corpse:'
else
str:=IntToStr(i)+'NPC:';
str:=str{+'ID:'}{+IntToStr(Mob[i,OID])+'Type:'}+NpcName(Mob[i,id]){+' On:('+IntToStr(Mob[i,x])+IntToStr(Mob[i,y])+IntToStr(Mob[i,z])+')'};
Npc.Lines.Add(str);
end;
end;
end;
procedure StateShow;
begin
State.Lines.Clear;
State.Lines.Add(Name);
State.Lines.Add('CP '+IntToStr(CurCP)+'/'+IntToStr(MaxCP));
State.Lines.Add('HP '+IntToStr(CurHP)+'/'+IntToStr(MaxHP));
State.Lines.Add('MP '+IntToStr(CurMP)+'/'+IntToStr(MaxMP));
State.Lines.Add('X '+IntToStr(MyX));
State.Lines.Add('Z '+IntToStr(MyY));
State.Lines.Add('Y '+IntToStr(MyZ));
if(target>-1) then
State.Lines.Add('Target:'+NpcName(Mob[target,id])+'('+IntToStr(target)+')')
else
State.Lines.Add('Target:NO');
if(lasttarget>-1) then
State.Lines.Add('LastTarget:'+IntToStr(lasttarget));
end;
procedure InvShow;
var
i:integer;
begin
Inv.Lines.Clear;
for i:=0 to 79 do begin
if NOT(Inventory[i,2]=0) then
Inv.Lines.Add('Item:'+ItemName(Inventory[i,2])+' Count:'+IntToStr(Inventory[i,3]));
end;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//****************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
if FromServer then begin
case pck[1] of
#$04: begin
Log.Lines.Add('S>Пакет UserInfo #$04');
//пакет с инфой о моём чаре
InitStats;
end;
#$0E: begin
Log.Lines.Add('S>Пакет StatusUpdate #$0E');
if (MyID=ReadD(2)) then StatsUpdate; //обновление информации о хп
end;
#$1B: begin
Log.Lines.Add('S>Пакет InventoryCreate #$1B');
InventoryCreate;
end;
#$27:begin
Log.Lines.Add('S>Пакет InventoryUpdate #$27');
InventoryUpdate;
end;
#$16: begin
Log.Lines.Add('S>Пакет NpcInfo #$16');
NpcInfo;
end;
#$12: begin
Log.Lines.Add('S>Пакет DeleteObject #$12');
DeleteObject;
end;
#$06: begin
Log.Lines.Add('S>Пакет Die #$06');
Die;
end;
#$0C: begin
Log.Lines.Add('S>Пакет DropItem #$0C');
DropItem;
end;
#$01: begin
Log.Lines.Add('S>Пакет MoveToLocation #$01');
MoveToLocation;
end;
#$05: begin
Log.Lines.Add('S>Пакет Attack #$05');
UnderAttack;
end;
end;
end
else begin
case pck[1] of
#$48: begin
Log.Lines.Add('C>Пакет ValidateLocation #$48');
CorsUpdate;
end;
#$04:begin
Log.Lines.Add('C>Пакет Action #$04');
Action;
end;
#$1B: begin
Log.Lines.Add('S>Пакет SocialAction #$1B:'+IntToStr(ReadD(2)));
case ReadD(2) of
6:begin
//Log.Lines.Add('NearestTarget');
Log.Lines.Add('Start');
Search.Enabled:=True;
//SendAction(Mob[NearestMob,OID]);
pck:='';
end;
5:begin
sit;
pck:='';
end;
end;
end;
end;
end;
end.
Последний раз редактировалось finomen, 19.05.2008 в 21:13.
|