PDA

Просмотр полной версии : Скрипт Бота(кач/споил)


finomen
19.05.2008, 20:16
Первый мой дельный скрипт.

Бот для кача и спойла. 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)


{
Бот для кача и спойла. 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.

Grinch
19.05.2008, 21:04
оформи плиз скрипт по правилам форума (http://coderx.ru/showthread.php?t=391)

finomen
19.05.2008, 21:14
офрмил...сначала в написал в [ code ] [ /code ]....по привычке...

pir
19.05.2008, 21:22
Это для какой версии lineage?

finomen
19.05.2008, 21:26
это для С4. Тестил на шоке (народный) на гноме. Поддержка С5 в ближайшее время не предвидится, но ничего не мешает подправить обработку пакетов.

NLObP
20.05.2008, 00:02
Подобные процедуры не стоит так делать
//******************************************
//название вещи
//******************************************
function ItemName(id:integer):string;


Лучше переделать примерно так:
var
ItemsName: TStringList; //названия предметов
procedure Init;
begin
ItemsName:=TStringList.Create;
ItemsName.LoadFromFile('itemsid.ini'); //загрузка из файла
end;

function free;
begin
ItemsName.free;
end;
//******************************************
//название вещи
//******************************************
function ItemName(id:integer):string;
begin
result:=ItemsName.Strings[ID];
end;

finomen
20.05.2008, 17:13
в фаиле итемс.ини не все предметы. да и записаны 57=adena...

NLObP
21.05.2008, 00:11
Вот, как можно до равно выцеплять:
//************************************************** *************
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:=0;
end;
end;

Соответственно и после равно можно. Так что это не проблема.

finomen
21.05.2008, 08:58
я про то что в массиве куча пустых будет....там не все id..хотя памяти много...можно попробовать))
ЗЫ никто не знает как переслать из пакетхака расшифрованные пакеты другому приложению? а то на С++ хотел бота написать....я с дельфи не очень....

poizon
21.05.2008, 12:18
finomen, ты уже думал на счёт аутгейма?аутгейм работает прекрасно если координаты не меняются перса вообще.если перс двигается то нужно посылать серваку validateposition с частым интервалом во время движения.у тебя какие на этот повод мысли?там ведь ещё координата Z кроме всего прочего..чтобы бот не палился более менее и если он не двигаетс явообще то я делал аутгейм и все прекрасно работает.просто ответ на пинг отсылает...скрипт в теме ОГ бот.+чтобы ваще ен палится можно былобы ещё сделать requestPledgeInfo этот пакет клиент шлёт если рядом появляется чувак который в клане , мне кажется это чтото связанно с картинкой клана

OlegDX
21.05.2008, 12:38
есть более лутший способ читать с ини данные :)

Добавлено через 2 минуты
В место :

function ItemName(id:integer):string;
begin
result:=ItemsName.Strings[ID];
end;



function ItemName(id:integer):string;
begin
result:=ItemsName.Values[ID];
end;


это значт что строка (123=адена) -- 'адена'=ItemName(123)

Добавлено через 3 минуты

var
ItemsName: TStringList; //названия предметов
namestr:String;
procedure Init;
begin
ItemsName:=TStringList.Create;
ItemsName.LoadFromFile('itemsid.ini'); //загрузка из файла
end;

function free;
begin
ItemsName.free;
end;
//******************************************
//название вещи
//******************************************
function ItemName(id:integer):string;
begin
result:=ItemsName.values[ID];
end;

Begin
namestr:=ItemName(53);
//namestr->'adena';
end;

finomen
21.05.2008, 16:21
на счет аутгейма-покачто мысли тока выщитывать Z координату по близлежащим нпс и игрокам. или второй вариант (лучше, но сложнее) это дернуть карту из клиента. (аутгейм скорее всего будет не скриптом, а переписанным пакетхаком...если не с нуля на С...ибо слишком сложен по своей структуре

DashKAaa
21.05.2008, 17:10
шо то пошли однотипные скрипты и что людям не иметься... делая туже работу что уже была сделана

nezabudkin
21.05.2008, 17:56
Не, скрипты не однотипные, каждый программист пришедший на этот форум, сначало пытается все скрипты уже выложенные на форуме как-то систематизировать, разобраться в них, переписать под себя...
И кач-бот типа "локомотив" написанный с нуля, как нельзя лучше подходит для обкатки новых идей, алгоритмов и скриптов!
Так что finomen, респект тебе и уважуха. Я тоже начинал именно с этого.
Тока вот надо затестить твой скриптик!
Очень советую тебе незамедлительно внедрить туда поддержку интерлюда. А то тестеров особенно и не найдешь!

finomen
22.05.2008, 09:32
мне самому тестить неначем...подскажите серв с рейтами пониже...тогда введу

NLObP
22.05.2008, 10:28
Я на Абисс тестирую.

finomen
22.05.2008, 10:51
не охота на яве....там многое проходит что на нормальном не пройдет и наоборот
ЗЫ ява локальная есть...

DashKAaa
22.05.2008, 13:54
не охота на яве....там многое проходит что на нормальном не пройдет и наоборот
ЗЫ ява локальная есть...

абусс ява?

finomen
22.05.2008, 20:15
а разве уже нет? Оо

DashKAaa
23.05.2008, 08:57
ООоо 5.5к онлайна явка держит без единых лагов Ооо что-то мазевые явки пошли, ну если там явка то ждем перехода скоро на камаэль вроде в локальной сети у меня давно камаэль запущено на яве-то!!!

finomen
23.05.2008, 09:23
ну...то что самопис это точно...на абусе никогда не стояло офф ядро.

dmitry501
23.05.2008, 13:24
Всегда стояло и стоит. Как у всех основа - С4ПТС.
Самодельные только экстендеры -dll

DashKAaa
23.05.2008, 13:43
пока что только спи... с4 птс...
с6 не утянули (((
хелбоунд тоже(
камаэлька вроде тоже был птс....

Добавлено через 1 минуту
щас... выпустят какое нить продолжение ла2 -с20 грубо говоря мб и появится какая нить хроника с7-10 птсная)
но остается только мечтать об этом и играть на самописи

Grinch
23.05.2008, 14:26
ООоо 5.5к онлайна явка держит без единых лагов Ооо что-то мазевые явки пошли, ну если там явка то ждем перехода скоро на камаэль вроде в локальной сети у меня давно камаэль запущено на яве-то!!!

железко пошло а не явки :)

DashKAaa
23.05.2008, 15:56
железко пошло а не явки :)

Ну явы не тянут более 200-400 людей начинает лагать,тупить и т.д

Grinch
23.05.2008, 16:26
Ну явы не тянут более 200-400 людей начинает лагать,тупить и т.д

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

finomen
23.05.2008, 21:54
сервера С4 офф есть..С5 мало....очень мало.....а я самопис практически не перевариваю....тк хочу сервер, который на 100% соответствует оффу (рейты в том числе)

Grinch
23.05.2008, 22:35
сервера С4 офф есть..С5 мало....очень мало.....а я самопис практически не перевариваю....тк хочу сервер, который на 100% соответствует оффу (рейты в том числе)

а офф чем тебе не нравиться?

finomen
23.05.2008, 23:54
платный)) и не чисто русский

finomen
25.05.2008, 22:46
при разработке уперся в одну огромную проблему...как высчитать Z координату? чтобы обходить препятствия...

DashKAaa
26.05.2008, 08:55
тут почитай http://coderx.ru/showthread.php?t=289 только в этом боте был обходи препятствий

dmitry501
26.05.2008, 09:28
откуда такая увереность? отличие явы от птс, птс сразу даёт нагрузку и требует железа, ява геометрическая прогрессия по нагрузке ну или около того, так что на современых машинах и ява вылизаная тока, может работать.

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

Grinch
26.05.2008, 18:30
dmitry501, я не играю на явах :) и не собирался мало норм инфы о них вот мне допустим интересно как со стороны сервера реализован полеарм кач :) хз где искать на АЧ задавал вопрос, но кроме флуда, а зачем тебе это надо - ничего. А птс запустить не реально и тем более хз где взять, а вот яву можно запустить и порыться в скриптах то ж можно тока влом.

finomen
26.05.2008, 20:38
про Z координату. это не то что предполашается в SKYdll. мне нужна карта или геодата, тк бот должен ходить сам по созданным им маршрутам или указанию пользователя из окна бота. он будет бежать до моба не по таргету а по маршруту посылая пакеты движения до некоторого расстояния, чтобы меньше палился.

ChiterEPT
28.05.2008, 02:07
про Z координату. это не то что предполашается в SKYdll. мне нужна карта или геодата, тк бот должен ходить сам по созданным им маршрутам или указанию пользователя из окна бота. он будет бежать до моба не по таргету а по маршруту посылая пакеты движения до некоторого расстояния, чтобы меньше палился.

Может стоит использовать скрипт движения по маршруту и скажем разрешить отходить от чекпоинтов на определенный радиус за мобами, а если что то пойдет не так(уткнется) то вернуться к чекпоинту. Конечно вариант не идеал... далеко не идеал, но есть два плюса... Ходет не только по таргету но и по MoveToLocation и гораздо более легко реализуемо чем доставать геодату.

finomen
28.05.2008, 23:54
э...имелось ввиду не это...ну ладно...придется самому карты локаций делать +динамическое их пополнение на основе пакетов клиента, но боюсь на паскале а тем более в скрипте это не реализуемо, надо трафик выводить во внешнюю прогу....в дешифрованном виде...

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

ЗЫ почти волкер, и потянуть его я могу...но только на С++, на что у меня будет локальная ява и 3 летних месяца...в планах полноценный аутгейм с ингейм режимом...осталось только разобраться в перехвате коннекта и криптографии.

ChiterEPT
29.05.2008, 01:36
выводить во внешнюю прогу....в дешифрованном виде...
Ну сделай ДЛЛ на родном тебе C++ :) и скриптом выводи к нему инфу в расшифрованном виде.

а. прокладка маршрута до моба с учетом препятствий и движение по нему
б. перемещение к выпавшим вещам
в. обход препятствий
г. наличие в карте дорог и движение между городами
д. прокладка маршрутов с учетом обхода агро мобов
ЗЫ почти волкер, и потянуть его я могу...но только на С++, на что у меня будет локальная ява и 3 летних месяца...в планах полноценный аутгейм с ингейм режимом...осталось только разобраться в перехвате коннекта и криптографии.
Грандиозные планы :) УДАЧИ

finomen
29.05.2008, 09:32
Ну сделай ДЛЛ на родном тебе C++ :) и скриптом выводи к нему инфу в расшифрованном виде.

может проще тогда расковырять пакетхак до уровня ДЛЛ? и прогу на родном мне С++ -)

NLObP
29.05.2008, 19:34
может проще тогда расковырять пакетхак до уровня ДЛЛ? и прогу на родном мне С++ -)

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

ChiterEPT
29.05.2008, 22:11
может проще тогда расковырять пакетхак до уровня ДЛЛ? и прогу на родном мне С++ -)
:D
Ну уж как тебе удобней :)

finomen
30.05.2008, 00:07
исходники пакетхака я ужо правил...тока с другими целями....
пойду вникать в принцип его работы и попробую написать на С++ перехватчик+дешифратор...на его базе потом бота...
релиз ожидается в сентябре))