PDA

Просмотр полной версии : Фарм скриптом,или для Олдскус парней.


goodvin1709
21.01.2014, 11:44
Вот возникла в принципе потребность пофармить на одном сервере через пакетник.
Взял некра.
Нужно было написать скрипт для фарма в любой локации любых мобов.
Есть автолут на сервере т.е адена и другие ценные вещи падают в сумку.
Вот мой скрипт

const
name='...';
Radius=900;
Base=20;//Розмер базы.
var
Timer,timer2:TTimer;
DieOid,a:Integer;
NpcInfo:array[0..7] of Integer;
CenterX, CenterY, CenterZ : integer;
TargetID:Integer;
number:Integer;
started:boolean;
potionOid:Integer;
tick:integer;
MOBarray:array [0..Base,0..6] of Integer;
procedure Init;
begin
started:=false;
number:=0;
Timer := TTimer.Create(nil) ;
Timer.Interval := 500;
Timer.Enabled :=False;
Timer.Ontimer := @OnTimer ;

Timer2 := TTimer.Create(nil) ;
Timer2.Interval := 1000;
Timer2.Enabled :=False;
Timer2.Ontimer := @OnTimer2 ;
tick:=0;
end;
Procedure Ontimer2;//Атака моба.
begin
timer2.enabled:=false;
SendMSG('Ждем моба...');
NextTarget;
end;
function DIST(MOBX, MOBY, MOBZ:integer) : Integer;
var
x,y,z, summa : integer;
begin
x:= MOBX-CenterX;
y:= MOBY-CenterY;
z:= MOBZ-CenterZ;
summa:= x*x+y*y+z*z;
result:=Round(sqrt(summa));
end;

Procedure Ontimer;//Атака моба.
var
i:integer;
begin
Timer.enabled:=false;
if tick>25 then
begin
SendMSG('Моба убили уже до нас.');
For i:=0 to Base do
if MOBarray[i,0]=TargetID then
begin
MOBarray[i,0]:=0;
MOBarray[i,1]:=0;
MOBarray[i,2]:=0;
MOBarray[i,3]:=0;
MOBarray[i,4]:=0;
MOBarray[i,5]:=0;
MOBarray[i,6]:=0;
break;
end;
nexttarget;
end;
if a=1 then
begin
Buf:=hstr('39 EF 04 00 00 00 00 00 00 00'); //Глум.
SendToServerEx(name);
a:=a+1;
tick:=tick+1;
if TargetID<>0 then Timer.enabled:=True;
end;
if (a mod 2) = 0 then
begin
buf:=hstr('39 7C 04 00 00 00 00 00 00 00');//Кости.
SendToServerEx(name);
Inc(a);
tick:=tick+1;
if TargetID<>0 then Timer.enabled:=True;
end;
if (a mod 2)<>0 then
begin
buf:=hstr('39 D2 04 00 00 00 00 00 00 00');//Вамп
SendToServerEx(name);
a:=a+1;
tick:=tick+1;
if TargetID<>0 then Timer.enabled:=True;
end;
end;

procedure Free;
begin
Timer.free;
Timer2.free;
end;

Procedure MobDie;
var
i:Integer;
begin
For I:=0 to Base do
if MOBarray[i,0]=ReadD(2) then
begin
MOBarray[i,0]:=0;
MOBarray[i,1]:=0;
MOBarray[i,2]:=0;
MOBarray[i,3]:=0;
MOBarray[i,4]:=0;
MOBarray[i,5]:=0;
MOBarray[i,6]:=0;
break;
end;
end;

Procedure MobBase;
var
I:Integer;
begin
NpcInfo[0]:=ReadD(2);//OID
NpcInfo[1]:=ReadD(6);//ID
NpcInfo[2]:=ReadD(10);//Atackable
NpcInfo[3]:=readD(14);//X
NpcInfo[4]:=ReadD(18);//y
NpcInfo[5]:=readD(22);//z
NpcInfo[6]:=readC(121);//Dead.
NPCInfo[7]:=ReadC(120);//ISCombat
if (NpcInfo[2]=1) and (NpcInfo[7]=0) and (NpcInfo[0]<>TargetID) and (NPCInfo[6]=0) and (DIST(NpcInfo[3],NpcInfo[4],NpcInfo[5])<Radius) then
begin
for i:=0 to Base do
if MOBarray[i,0]=0 then
begin
number:=i;
break;
end;
MOBarray[number,0]:=NpcInfo[0];
MOBarray[number,1]:=NpcInfo[1];
MOBarray[number,2]:=NpcInfo[2];
MOBarray[number,3]:=NpcInfo[3];
MOBarray[number,4]:=NpcInfo[4];
MOBarray[number,5]:=NpcInfo[5];
MOBarray[number,6]:=NpcInfo[6];
SendMSG('Добавил моба в базу его ИД:'+vartostR(number));
end;
end;

Procedure NextTarget;
var
I:Integer;
begin
For i:=0 to Base do
if MOBarray[i,0]<>0 then
begin
TargetID:=MOBarray[i,0];
buf:=#$1f;
WriteD(TargetID);
WriteD(0);
WriteD(0);
WriteD(0);
WriteC(0);
SendToServerEx(name);
a:=1;
tick:=0;
Timer.enabled:=true;
SendMSG('Target OID:'+vartostr(TargetID));
break;
end;
if TargetID=0 then
begin
timer2.enabled:=true;
SendMSG('В базе нет мобов. Включаем режим ожидания.');
end;
end;

Procedure CheckMP;
var
i:Integer;
CurMP,MaxMp:Integer;
begin
//Проверяем мое мп.
if (ReadD(10)=11) and (ReadD(18)=12) then
begin
CurMP:=ReadD(14);
MaxMP:=ReadD(22);
if CurMP<1000 then
begin
buf:=#$19;//Выпиваем банку по нужде.
WriteD(PotionOid);
WriteD(0);
SendToServerEx(name);
end;
end;
//Если убили моба.
if (ReadD(2)=TargetID) and (readD(10)=9) and (ReadD(14)=0) then
begin
timer.enabled:=false;
buf:=hstr('48 00 00');
SendToServerEx(name);
targetID:=0;
SendMSG('Убили моба:'+vartostr(ReadD(2)));
For i:=0 to Base do
if MOBarray[i,0]=ReadD(2) then
begin
MOBarray[i,0]:=0;
MOBarray[i,1]:=0;
MOBarray[i,2]:=0;
MOBarray[i,3]:=0;
MOBarray[i,4]:=0;
MOBarray[i,5]:=0;
MOBarray[i,6]:=0;
SendMSG('Удалил моба з базы.OID:'+vartostr(ReadD(2)));
break;
end;
NextTarget;
end;
end;
begin
if ConnectName=Name then
begin
If FromServer then
Begin
if pck[1]=#$00 then MobDie; //Плохо срабатывает некоректная работа.
if pck[1]=#$0C then MobBase;
if pck[1]=#$18 then CheckMP;
end;
If FromClient then
begin
if pck[1]=#$1f then
begin
//TargetID:=ReadD(2);
//SendMSG('Target OID:'+vartostr(TargetID));
end;
if pck[1]=#$19 then
begin
PotionOiD:=ReadD(2);
if started=false then
begin
started:=true;
NextTarget;
end;
end;
if pck[1]=#$0F then
begin
CenterX:= ReadD(2);
CenterY:= ReadD(6);
CenterZ:= ReadD(10);
SendMSG('Записали Координаты: X: '+vartostr(CenterX)+' Y: '+vartostr(centerY)+' Z: '+vartostr(centerZ));
end;
end;
end;
end.

Но проблемка.Он то конечно фармит,и довольно долго.Но помогите его пофиксить.Иногда долго над убитым стоит.Но как таргет сменить он дальше фармит.

SeregaZ
21.01.2014, 19:22
по всей видимости Die порой теряется. я бы сделал следующее:
добавил переменную начала атаки. то есть если ботинок взял в таргет моба, после этого юзал скилы и был урон, то переменная = 1. теперь в случае когда переменная = 1 и пошли пакеты action fail - то предположительно моб здох и пора переключатся на следующего.

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

goodvin1709
21.01.2014, 20:01
наброски подкинь)

Добавлено через 2 минуты
Взял Бот локомотива, взят оттуда только нужное вроде норм)

SeregaZ
21.01.2014, 20:03
легко сказать наброски :) у меня ж другие хроники скорей всего... смотри системное сообщение приходит, которое урон показывает - вот от него и танцуй.

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

goodvin1709
22.01.2014, 22:35
Вальнул себе локомотива)

Добавлено через 22 часа 24 минуты
SeregaZ, Дай свой скайп,нужно пообщаться.

SeregaZ
23.01.2014, 15:22
да я им не пользуюсь блин... ты так спроси :)

goodvin1709
24.01.2014, 03:06
Нужно так пообщаться нужно скрипт локомотива под ГФ переделать под мага что то мой древние знания меня уже подводят,нужно совет ну или как реализовать эту дрянь атаку 2 скилами.(вамп,кость),дроп то я убрал что бы он не собирал даже если он есть а вот как с физ атаки сделать маг я вобще хз, http://rghost.ru/private/51879743/c7dfb4ecf7c7b1c3fa7361de2e4da91eВот скрипт локомотива.