PDA

Просмотр полной версии : Подборочка скриптов...


ElKornacio
11.06.2009, 14:20
Сдул пыль со старого пнх, и достал оттуда бот найденый мною на кодриксе, но который я так и не смог запустить. Мозги подросли, перенастроил все пакеты, стёр лишнее(для меня лишнее), добавил новое и родил 2ух ботов - мага и спойлера.
Маг:

//Бот_маг with 'Hachling of Star' by NLObP
// Edited by ElKornacio. Переведён под Грацию, не лупит игроков, которые лупят Вас и куча другого бреда, как автохилки и тп.
{
Социальное действие YES включить
Социальное действие NO выключить
Пить хилки - нажимаем на саааамый первый сошиал экшн в клиенте и стираем одну хилку. вот и всё. дальше она сама будет жрать хилки когда жизни меньше чем MinHP.
NLObP:
"Скрипт распространяется как есть, и я не несу ответственности за то, что
ВЫ натворили у себя, его используя."
А я тем более)
}

//************************************************** ****************************
Const
Name='ElKornacio'; //имя чара
max=50; //max количество контролируемых мобов
Radius=4000; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
Distance=700; //дистанция до моба
DU=1031;
HB=1235;
SF=1265;
MinHP=1900;
ToCH='7D 01 00 00 00';
GKID='268464554';
RGKID='268465231';
//************************************************** ****************************
VAR
NameChar: string;
CharID, Attacker, ObjectID: integer;
tempX,tempY, tempLenght: extended;
tempZ, ColvoMobs: integer;
xe,ye: extended;
x,y,z,ox,oy,oz,n,tmp,tmp2: integer;
First,stoped:boolean;
Log:TStrings;
MobCurHP, MobMaxHP, CurHP, MaxHP, CurMP, MaxMP: integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timerA: TTimer; //вспомогательный
i, itm, SocialID, HealID: integer; // вспомогательная
AddMob, UnderAttack, scrready, wh: boolean;
Text,Nick:string;
CharBase: array[1..4,1..max] of integer; // описатель игроков (которых не атакуем)
MobBase: array[1..4,1..max] of integer; // описатель мобов вокруг
MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
{ 1 - ID
2 - X
3 - Y
4 - Z}

//************************************************** ****************************
procedure Init; //Вызывается при включении скрипта
begin
Log:=TStringList.Create;
UnderAttack:=false;
itm:=0;
scrready:=false;
colvomobs:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=False;
timer1.interval:=2000;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=False;
timerA.interval:=500;
stoped:=true;
end;

procedure ReloadLog;
var
e:string;
n:integer;
begin
n:=0;
e:='<html>';
while n<>Log.Count do begin
e:=e+Log[i]+'<br>';
n:=n+1;
end;
e:=e+'</html>';
buf:=#$19;
WriteD(0);
WriteS(e);
SendToClientEx(Name);
end;

procedure AddLog(s:string);
var
t:string;
begin
t:=Log.Text;
t:='['+TimeToStr(Time)+'] '+s+#13+t;
Log.Text:=t;
ReloadLog;
end;

procedure Free; //Вызывается при выключении скрипта
begin
Log.Free;
timer1.Free;
timerA.Free;
stoped:=false;
wh:=false;
HealID:=0;
First:=true;
BotCoordX:=0;
BotCoordY:=0;
BotCoordZ:=0;
CharID:=0;
ObjectID:=0;
Attacker:=0;
end;

//************************************************** ****************************
//сообщения в приват, на сервер не отправляются
procedure Say(msg:string);
begin
//AddLog(msg);
end;

{procedure SendHTML(s:String);
begin
buf:=#$23;
WriteS('npc_'+GKID+'_'+s);
SendToServer;
end;

procedure ComeToRune;
begin
buf:=hstr('0F 57 D0 FF FF F7 DF 01 00 C9 F3 FF FF');
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteD(1);
SendToServerEx(Name);
Delay(15000);
buf:=hstr('0F 4C CE FF FF C3 DF 01 00 B9 F3 FF FF');
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteD(1);
SendToServerEx(Name);
Delay(6000);
Attacker:=StrToInt(GKID);
TargetAtt;
SendHTML('goto 1041');
Delay(5000);
Attacker:=StrToInt(RGKID);
TargetAtt;
TargetAtt;
SendHTML('goto 1104');
Delay(5000);
stoped:=false;
Timer1.Enabled:=true;
end; }

//0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID) d(AttrValue)
procedure StatusUpdate;
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do if pck[i*8+10]=#$09 then CurHP:=ReadD(i*8+14);
if CurHP<=MinHP then begin
buf:=#$19;
WriteD(HealID);
WriteD(0);
SendToServerEx(Name);
end;
end;

//************************************************** ****************************
procedure OnTimer1(Sender: TObject);
begin
if Stoped=false then begin
if UnderAttack then exit;
MinPutID:=0;
MinPutLenght:=99999999;
for i:=1 to max do begin
if (MobBaseExt[1,i]<>0) then begin
tempX:=MobBaseExt[2,i];
tempY:=MobBaseExt[3,i];
tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
if (tempLenght<MinPutLenght) and (CharID<>MobBase[1,i]) then begin
if (MinPutLenght-tempLenght)>=20 then begin
MinPutLenght:=tempLenght;
MinPutID:=i;
end;
end;
end;
end;
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker;
say('Атакуем моба!');
end;
end;
end;


//************************************************** ****************************
//01=MoveBackwardToLocation:d(targetX)d(targetY)d(ta rgetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
procedure MoveDistance;
begin
if Stoped=false then begin
xe:=MobBase[2,MinPutID]+Distance/4+round(random*(Distance/4));
ye:=MobBase[3,MinPutID]+Distance/4+round(random*(Distance/4));
x:=round(xe);
y:=round(ye);
z:=MobBase[4,MinPutID];
buf:=#$0F;
WriteD(x);
WriteD(y);
WriteD(z);
WriteD(BotCoordx);
WriteD(BotCoordy);
WriteD(BotCoordz);
WriteD(01);
SendToServerEx(Name);
say('Держим дистанцию');
end;
end;

//************************************************** ****************************
procedure TargetAtt;
begin
if Stoped=false then begin
buf:=#$1F;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;
end;

//************************************************** *************
//2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b( ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$39;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
procedure OnTimerA(Sender: TObject);
begin
if Stoped=false then begin
if First then begin MagicSkillUse(SF); First:=false; end;
Delay(50);
MagicSkillUse(HB);
end;
end;

//************************************************** ****************************
procedure TargetAttacker;
begin
TargetAtt;
timerA.enabled:=true;
First:=true;
UnderAttack:=true; //зацепимся за атакуемого
end;

procedure iDie;
begin

end;

procedure WriteOK;
begin
buf:=hstr('49 59 00 65 00 73 00 20 00 53 00 69 00 72 00 21 00 00 00 03 00 00 00 ');
SendToServerEx(Name);
end;

begin
//************************************************** **************************
//не пропускаем пустые пакеты
if pck='' then exit;

//************************************************** **************************
//16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d (X)d(Y)d(Z)d(Heading)d(d)d(Maspd)d(Paspd)d(runSpd) d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd) d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRa dius)f(CollisHeight)d(RHand)d(d)d(LHand)b(nameabov e)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s (Name)s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d )d(d)d(d)b(c)b(Team)f(collisRadius)f(collisHeight) d(d)
//NPCInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
AddMob:=true;

//проверка, входит моб в радиус действия?
tempX:=ReadD(14); //x
tempY:=ReadD(18); //y
tempLenght:=sqrt((BotCoordX-tempX)*(BotCoordX-tempX)+(BotCoordY-tempY)*(BotCoordY-tempY));

//проверям, не под землей ли моб(в катакомбах)
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (tempLenght<Radius) then begin
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) then begin
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
inc(colvomobs);
say('Запоминаем координаты Моба'+' Количество мобов: '+inttostr(colvomobs));
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//CharInfo, запоминаем игроков
if FromServer and (ConnectName=Name) and (pck[1]=#$31) then begin
AddMob:=true;
for i:=1 to max do begin
//если нашли чара в базе, то коректируем его координаты на новые
if (CharBase[1,i]=ReadD(18)) then begin
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового чара
for i:=1 to max do begin
if (CharBase[1,i]=0) and AddMob then begin
//запоминаем моба в свободную ячейку
CharBase[1,i]:=ReadD(18); //ObjectID
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
NameChar:=ReadS(22);
say('Приближается Игрок '+NameChar+'!!!');
break;
end;
end;

for i:=1 to max do begin
//если нашли Чара в базе Мобов, то удаляем его
if (MobBase[1,i]=ReadD(18)) then begin
MobBase[1,i]:=0; //x
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //x
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
dec(colvomobs);
say('Нашли Чара в базе Мобов, удаляем его'+' Количество мобов: '+inttostr(colvomobs));
end;
end;
end;

if FromServer and (pck[1]=#$4A) and (ReadD(6)=3) and (ReadS(10)='Marix') then begin
Text:=ReadS(22);
if Text='stop' then begin
timer1.enabled:=false;
timerA.enabled:=False;
underattack:=false;
BotCoordX:=0;
BotCoordY:=0;
BotCoordZ:=0;
Say('Команда Стоп!!!');
stoped:=true;
WriteOK;
end else
if Text='start' then begin
Say('Команда Старт!!!');
timer1.enabled:=true;
stoped:=false;
WriteOK;
end else
if Text='clear' then begin UnderAttack:=false; TimerA.enabled:=false; Attacker:=0; WriteOK; end else
if Text='unselect_target' then begin buf:=hstr('48 01 00'); SendToServerEx(Name); end else
if Text='go_with_me' then begin
tmp:=ReadD(2);
buf:=#$1F;
WriteD(tmp);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
Delay(100);
buf:=#$1F;
WriteD(tmp);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
WriteOK;
end;
end;

//************************************************** **************************
//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$2F) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((BotCoordX-tempX)*(BotCoordX-tempX)+(BotCoordY-tempY)*(BotCoordY-tempY));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (int(tempLenght)<Radius) then begin
//перебираем базу и ищем там моба, который бежит
for i:=1 to max do begin
//если нашли моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
inc(colvomobs);
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//MagicSkillUse 48, Attack 05
if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$33)) then begin
if UnderAttack then exit; //сначало убъем одного
tmp:=ReadD(2);
ObjectID:=ReadD(6);
tmp2:=0;
for i:=1 to max do if (CharBase[1,i]=tmp) then tmp2:=1;
if (tmp2=0) and (CharID=ObjectID) then begin
UnderAttack:=true; //нас атакуют
Attacker:=tmp;
Say('Нас атакуют!');
TargetAttacker;
end;
end;

//************************************************** **************************
//если принят пакет Die
if FromServer and (ConnectName=Name) and (pck[1]=#$00) then begin
if ReadD(2)<>CharID then begin
//ищем моба в базе
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
end else begin
stoped:=true;
iDie;
say('Бот был остановлен в связи со смертью.');
end;
end;
if FromServer and (ConnectName=Name) and (pck[1]=#$23) then begin
// Здесь место для Вашей рекламы. А точнее для создания фигни, что бы бот не бил чужих мобов. Дерзайте :)
end;
//************************************************** **************************
//если принят пакет DeleteObject
if FromServer and (ConnectName=Name) and (pck[1]=#$08) then begin
//ищем моба в базе
//say('DeleteObject');
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
for i:=1 to max do begin
//если нашли в базе, то удаляем
if (CharBase[1,i]=ReadD(2)) then begin
CharBase[2,i]:=0; //x
CharBase[3,i]:=0; //y
CharBase[4,i]:=0; //z
end;
end;
end;

//************************************************** **************************
//ValidatePosition если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName=Name) and (pck[1]=#$59) then begin
//запоминаем мои координаты
BotCoordX:=ReadD(2);
BotCoordY:=ReadD(6);
BotCoordZ:=ReadD(10);
//ext
BotCoordXext:=ReadD(2);
BotCoordYext:=ReadD(6);
BotCoordZext:=ReadD(10);
end;

//************************************************** **************************
//если от сервака принят пакет с UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$32) then begin
//Запоминаем собственный ИД
CharID:=ReadD(18);
if scrready then exit
else begin
Say('Бот готов. ID лидера записаны.');
scrready:=true;
end;
end;
if FromClient and (ConnectName=Name) and (pck[1]=#$60) and (wh) then begin wh:=false; say('ID банки записаны!'); HealID:=ReadD(2); end;
if FromServer and (ConnectName=Name) and (pck[1]=#$18) and (CharID=ReadD(2)) then StatusUpdate;

if FromClient {and (ConnectName=Name)} and (pck[1]=#$34) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала
6: begin
Say('Команда Старт!!!');
timer1.enabled:=true;
stoped:=false;
exit;
pck:='';
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
timerA.enabled:=False;
underattack:=false;
BotCoordX:=0;
BotCoordY:=0;
BotCoordZ:=0;
Say('Команда Стоп!!!');
stoped:=true;
exit;
pck:='';
end;
2: begin wh:=true; say('Ожидаем удаления банки'); pck:=''; end;
3: begin wh:=false; say('Отменено удаление банки'); pck:=''; end;
4: begin pck:=''; UnderAttack:=false; TimerA.enabled:=false; Attacker:=0; end;
end;
end;
end.


Спойлер:

//Бот_маг with 'Hachling of Star' by NLObP
// Edited by ElKornacio. Переведён под Грацию, не лупит игроков, которые лупят Вас. Да и вообще.. Теперь это бот-воин-спойлер, а не маг :)
{
Социальное действие YES включить
Социальное действие NO выключить
Пить хилки - нажимаем на саааамый первый сошиал экшн в клиенте и стираем одну хилку. вот и всё. дальше она сама будет жрать хилки когда жизни меньше чем MinHP.
NLObP:
"Скрипт распространяется как есть, и я не несу ответственности за то, что
ВЫ натворили у себя, его используя."
А я тем более)
}

//************************************************** ****************************
Const
Name='Zhirdyachik'; //имя чара
max=50; //max количество контролируемых мобов
Radius=4000; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
Distance=700; //дистанция до моба
MinHP=1500;
Spoil=254;
Sweeper=42;
//************************************************** ****************************
VAR
NameChar: string;
CharID, Attacker, ObjectID: integer;
tempX,tempY, tempLenght: extended;
tempZ, ColvoMobs: integer;
xe,ye: extended;
x,y,z,ox,oy,oz,n,tmp,tmp2: integer;
stoped:boolean;
Log:TStrings;
MobCurHP, MobMaxHP, CurHP, MaxHP, CurMP, MaxMP: integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timerA: TTimer; //вспомогательный
i, itm, SocialID, HealID: integer; // вспомогательная
AddMob, UnderAttack, scrready, wh, Spoiled: boolean;
Text,Nick:string;
IDH:TStrings;
CharBase: array[1..4,1..max] of integer; // описатель игроков (которых не атакуем)
MobBase: array[1..4,1..max] of integer; // описатель мобов вокруг
MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
{ 1 - ID
2 - X
3 - Y
4 - Z}

//************************************************** ****************************
procedure Init; //Вызывается при включении скрипта
begin
Log:=TStringList.Create;
UnderAttack:=false;
itm:=0;
scrready:=false;
colvomobs:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=False;
timer1.interval:=2000;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=False;
timerA.interval:=500;
stoped:=true;
IDH:=TStringList.Create;
IDH.LoadFromFile('IDH.txt');
HealID:=StrToInt(IDH[0]);
end;

procedure Free; //Вызывается при выключении скрипта
begin
Log.Free;
timer1.Free;
timerA.Free;
stoped:=false;
wh:=false;
IDH[0]:=IntToStr(HealID);
IDH.SaveToFile('IDH.txt');
HealID:=0;
BotCoordX:=0;
BotCoordY:=0;
BotCoordZ:=0;
CharID:=0;
ObjectID:=0;
Attacker:=0;
end;

procedure Say(msg:string);
begin
//AddLog(msg);
end;

procedure StatusUpdate;
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do if pck[i*8+10]=#$09 then CurHP:=ReadD(i*8+14);
if CurHP<=MinHP then begin
buf:=#$19;
WriteD(HealID);
WriteD(0);
SendToServerEx(Name);
end;
end;

procedure OnTimer1(Sender: TObject);
begin
if Stoped=false then begin
if UnderAttack then exit;
MinPutID:=0;
MinPutLenght:=99999999;
for i:=1 to max do begin
if (MobBaseExt[1,i]<>0) then begin
tempX:=MobBaseExt[2,i];
tempY:=MobBaseExt[3,i];
tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
if (tempLenght<MinPutLenght) and (CharID<>MobBase[1,i]) then begin
MinPutLenght:=tempLenght;
MinPutID:=i;
end;
end;
end;
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker;
say('Атакуем моба!');
end;
end;
end;

procedure TargetAtt;
begin
if Stoped=false then begin
buf:=#$1F;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;
end;

procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$39;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

procedure OnTimerA(Sender: TObject);
begin
if (Stoped=false) and (UnderAttack) and (Spoiled=false) then begin MagicSkillUse(Spoil); TargetAtt; end;
end;

procedure TargetAttacker;
begin
TargetAtt; //Берём в таргет
timerA.enabled:=true;
Spoiled:=false;
UnderAttack:=true; //зацепимся за атакуемого
end;

begin
//не пропускаем пустые пакеты
if pck='' then exit;

//NPCInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(14); //x
tempY:=ReadD(18); //y
tempLenght:=sqrt((BotCoordX-tempX)*(BotCoordX-tempX)+(BotCoordY-tempY)*(BotCoordY-tempY));
//проверям, не под землей ли моб(в катакомбах)
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (tempLenght<Radius) then begin
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) then begin
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
inc(colvomobs);
say('Запоминаем координаты Моба'+' Количество мобов: '+inttostr(colvomobs));
break;
end;
end;
end;
end;
end;

//CharInfo, запоминаем игроков
if FromServer and (ConnectName=Name) and (pck[1]=#$31) then begin
AddMob:=true;
for i:=1 to max do begin
//если нашли чара в базе, то коректируем его координаты на новые
if (CharBase[1,i]=ReadD(18)) then begin
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового чара
for i:=1 to max do begin
if (CharBase[1,i]=0) and AddMob then begin
//запоминаем моба в свободную ячейку
CharBase[1,i]:=ReadD(18); //ObjectID
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
NameChar:=ReadS(22);
say('Приближается Игрок '+NameChar+'!!!');
break;
end;
end;

for i:=1 to max do begin
//если нашли Чара в базе Мобов, то удаляем его
if (MobBase[1,i]=ReadD(18)) then begin
MobBase[1,i]:=0; //x
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //x
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
dec(colvomobs);
say('Нашли Чара в базе Мобов, удаляем его'+' Количество мобов: '+inttostr(colvomobs));
end;
end;
end;

//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$2F) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((BotCoordX-tempX)*(BotCoordX-tempX)+(BotCoordY-tempY)*(BotCoordY-tempY));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (int(tempLenght)<Radius) then begin
//перебираем базу и ищем там моба, который бежит
for i:=1 to max do begin
//если нашли моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
inc(colvomobs);
break;
end;
end;
end;
end;
end;

//MagicSkillUse , Attack
if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$33)) then begin
if UnderAttack then exit; //сначало убъем одного
tmp:=ReadD(2);
ObjectID:=ReadD(6);
tmp2:=0;
for i:=1 to max do if (CharBase[1,i]=tmp) then tmp2:=1;
if (tmp2=0) and (CharID=ObjectID) and (tmp<>CharID) then begin
UnderAttack:=true; //нас атакуют
Attacker:=tmp;
Say('Нас атакуют!');
TargetAttacker;
end;
end;

//если принят пакет Die
if FromServer and (ConnectName=Name) and (pck[1]=#$00) then begin
if ReadD(2)<>CharID then begin
//ищем моба в базе
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
if Spoiled then MagicSkillUse(Sweeper);
Spoiled:=false;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
end else begin
stoped:=true;
say('Бот был остановлен в связи со смертью.');
end;
end;
if FromServer and (ConnectName=Name) and (pck[1]=#$23) then begin
// Здесь место для Вашей рекламы. А точнее для создания фигни, что бы бот не бил чужих мобов. Дерзайте :)
end;

//если принят пакет DeleteObject
if FromServer and (ConnectName=Name) and (pck[1]=#$08) then begin
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
for i:=1 to max do begin
//если нашли в базе, то удаляем
if (CharBase[1,i]=ReadD(2)) then begin
CharBase[2,i]:=0; //x
CharBase[3,i]:=0; //y
CharBase[4,i]:=0; //z
end;
end;
end;

//ValidatePosition если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName=Name) and (pck[1]=#$59) then begin
//запоминаем мои координаты
BotCoordX:=ReadD(2);
BotCoordY:=ReadD(6);
BotCoordZ:=ReadD(10);
//ext
BotCoordXext:=ReadD(2);
BotCoordYext:=ReadD(6);
BotCoordZext:=ReadD(10);
end;

//если от сервака принят пакет с UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$32) then begin
//Запоминаем собственный ИД
CharID:=ReadD(18);
if scrready then exit
else begin
Say('Бот готов. ID лидера записаны.');
scrready:=true;
end;
end;
if FromClient and (ConnectName=Name) and (pck[1]=#$60) and (wh) then begin wh:=false; say('ID банки записаны!'); HealID:=ReadD(2); pck:=''; end;
if FromServer and (ConnectName=Name) and (pck[1]=#$18) and (CharID=ReadD(2)) then StatusUpdate;
if FromServer and (ConnectName=Name) and (pck[1]=#$62) and (ReadD(2)=612) then Spoiled:=true;

if FromClient and (ConnectName=Name) and (pck[1]=#$34) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала
6: begin
Say('Команда Старт!!!');
timer1.enabled:=true;
stoped:=false;
UnderAttack:=false;
pck:='';
exit;
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
timerA.enabled:=False;
underattack:=false;
BotCoordX:=0;
BotCoordY:=0;
BotCoordZ:=0;
Say('Команда Стоп!!!');
stoped:=true;
pck:='';
exit;
end;
2: begin wh:=true; say('Ожидаем удаления банки'); pck:=''; end;
3: begin wh:=false; say('Отменено удаление банки'); pck:=''; end;
4: begin pck:=''; UnderAttack:=false; TimerA.enabled:=false; Attacker:=0; end;
end;
end;
end.


Для игроков fanage.ru, которым недавно подсунули тривиального антибота(при входе в игру диалог, в котором просят ввести код с картинок, минуту не вводишь - дисконнект):

// тупо включи и наслаждайся жизнью.
var
ids:array[0..9] of integer;
s:string;
html:string;
tmp:TStrings;
i:integer;

procedure Init;
begin
ids[1]:=1;
ids[2]:=6;
ids[3]:=3;
ids[4]:=9;
ids[5]:=5;
ids[6]:=2;
ids[7]:=8;
ids[8]:=0;
ids[9]:=4;
ids[0]:=7;
end;

function MiniSR(Sourse,Old,New:string):string;
var
i:integer;
e,s:string;
begin
i:=Pos(Old,Sourse);
s:=Copy(Sourse,0,i-1);
e:=Copy(Sourse,i+length(Old),length(Sourse)-i);
Result:=s+New+e;
end;

function SR(Sourse,Old,New:string):string;
begin
while Pos(Old,Sourse)<>0 do Sourse:=MiniSR(Sourse,Old,New);
Result:=Sourse;
end;

begin
if pck[1]=#$19 then begin
s:='';
html:=ReadS(6);
if Copy(html,Pos('<title>',html)+7,13)='Антибот(тест)' then begin
HTML:=Copy(Html,Pos('<table>',html)+7,length(html)-Pos('<table>',html));
HTML:=Copy(html,0,Pos('</table>',html)-1);
HTML:=SR(html,'<tr><td>','');
HTML:=SR(HTML,'</td></tr>','');
HTML:=SR(html,'</td><td>',#13);
tmp:=TStringList.Create;
tmp.Text:=html;
i:=0;
while i<>tmp.Count do begin
tmp[i]:=Copy(tmp[i],Pos('00',tmp[i])+2,1);
s:=s+IntToStr(ids[StrToInt(tmp[i])]);;
i:=i+1;
end;
buf:=#$23;
WriteS('capcha '+s);
SendToServer;
pck:='';
end;
end;
end.

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

var
e:string;
begin
buf:=#$49;
e:=chr(8);
e:=e+'Type=1 ID=269991058 Color=0 Underline=0 Title=';
e:=e+#$1B;
e:=e+'Анальные шарики';
e:=e+#$1B+chr(8);
e:=e+'. Доставь себе удовольствие за 50кк!!))';
WriteS(e);
WriteD(4);
SendToServer;
end.

Ну и гвоздь программы - мой скрипт на рыбалку. Интелект на уровне ИИ. Тыкаем - не попали, тыкаем другое, пока сново не промажем. как ни странно но помогает) умеет кушать соски. для его работы вы обязаны создать файл IDs.txt в папке пнх и записать в 6 строчек нули. потом работаем с сошиал экшенами и указываем ID сосок, удочки, пушки и тп..

const
Fishing=1312;
Reeling=1313;
RFail=1468;
Pumping=1314;
PFail=1466;
AF=1231;
MoveTime=300;
MinHP=2200;
Name='ElKornacio';

var
CharID,MobID,X,Y,Z,tmp,ShotID,SocialID,PuhaID,colv ,Udochka,Nazhivka,HealID:integer;
stoped,Skill,wh,wh2,wh3,wh4,wh5,First,InFishing,In War:boolean;
LT,AT:TTimer;
IDs:TStrings;

procedure OnTimer(Sender:TObject);
begin
if Skill then begin UseItem(ShotID); MagicSkillUse(Reeling); end else begin UseItem(ShotID); MagicSkillUse(Pumping); end;
end;

procedure StatusUpdate;
var
i,CurHP:integer;
begin
for i:=0 to ReadD(6)-1 do if pck[i*8+10]=#$09 then CurHP:=ReadD(i*8+14);
if CurHP<=MinHP then UseItem(HealID);
end;

procedure Init; //Вызывается при включении скрипта
begin
CharID:=0;
MobID:=0;
Skill:=true;
stoped:=true;
LT:=TTimer.Create(nil);
LT.Interval:=250;
LT.OnTimer:=@OnTimer;
LT.Enabled:=false;
AT:=TTimer.Create(nil);
AT.Interval:=MoveTime;
AT.OnTimer:=@OnTimerA;
AT.Enabled:=false;
wh:=false;
wh2:=false;
wh3:=false;
wh4:=false;
InFishing:=false;
InWar:=false;
IDs:=TStringList.Create;
IDs.LoadFromFile('IDs.txt');
ShotID:=StrToInt(IDs[0]);
PuhaID:=StrToInt(IDs[1]);
Udochka:=StrToInt(IDs[2]);
Nazhivka:=StrToInt(IDs[3]);
HealID:=StrToInt(IDs[4]);
end;

procedure OnTimerA(Sender: TObject);
begin
if InWar then begin MagicSkillUseA(AF);
if colv=12 then begin AT.Enabled:=false; UseItem(Udochka); UseItem(Nazhivka); MagicSkillUse(Fishing); LT.Enabled:=false; InWar:=false; end else colv:=colv+1; end;
end;

procedure Free;
begin
LT.Free;
AT.Free;
IDs.Clear;
IDs.Add(IntToStr(ShotID));
IDs.Add(IntToStr(PuhaID));
IDs.Add(IntToStr(Udochka));
IDs.Add(IntToStr(Nazhivka));
IDs.Add(IntToStr(HealID));
IDs.SaveToFile('IDs.txt');
IDs.Free;
end;

procedure UseItem(ItemID:integer);
begin
buf:=#$19;
WriteD(ItemID);
WriteD(0);
SendToServerEx(Name);
end;

procedure MagicSkillUse(MagicID:integer);
begin
if stoped=false then begin
buf:=#$39;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;
end;

procedure MagicSkillUseA(MagicID:integer);
begin
buf:=#$39;
WriteD(MagicID);
WriteD(01);
WriteC(00);
SendToServerEx(Name);
end;

procedure TargetAttacker;
begin
buf:=#$1F;
WriteD(MobID);
WriteD(X);
WriteD(Y);
WriteD(Z);
WriteC(00);
SendToServerEx(Name);
end;

procedure Say(s:string);
begin
buf:=#$4A;
WriteD(CharID);
WriteD(1);
WriteS(Name);
WriteS(s);
SendToClientEx(Name);
end;

begin
if FromServer and (ConnectName=Name) and (pck[1]=#$33) then begin
tmp:=ReadD(6);
if (CharID=tmp) and (InWar=false) then begin
Say('Нас ударили');
InWar:=true;
if InFishing then MagicSkillUse(Fishing);
LT.Enabled:=false;
UseItem(PuhaID);
MobID:=ReadD(2);
colv:=0;
TargetAttacker;
AT.Enabled:=true;
end;
end else
if FromClient and (ConnectName=Name) and (pck[1]=#$59) then begin
X:=ReadD(2);
Y:=ReadD(6);
Z:=ReadD(10);
end else
if FromServer and (ConnectName=Name) and (pck[1]+pck[2]=#$FE+#$27) then begin
if stoped=false then begin
Skill:=true;
LT.Enabled:=true;
end;
end else
if FromClient and (ConnectName=Name) and (pck[1]=#$34) then begin
SocialID:=ReadD(2);
case SocialID of
6: begin stoped:=false; AT.Enabled:=false; MagicSkillUse(Fishing); pck:=''; end;
5: begin if InFishing then MagicSkillUse(Fishing); stoped:=true; LT.Enabled:=false; AT.Enabled:=false; pck:=''; end;
2: begin wh:=true; pck:=''; end;
3: begin wh2:=true; pck:=''; end;
7: begin wh3:=true; pck:=''; end;
8: begin wh4:=true; pck:=''; end;
9: begin wh5:=true; pck:=''; end;
4: begin pck:=''; stoped:=false; MagicSkillUseA(AF); stoped:=true; end;
end;
end else
if FromClient and (ConnectName=Name) and (pck[1]=#$17) then begin
if (wh) then begin wh:=false; ShotID:=ReadD(2); end else
if (wh3) then begin wh3:=false; Udochka:=ReadD(2); end else
if (wh4) then begin wh4:=false; Nazhivka:=ReadD(2); end else
if (wh5) then begin wh5:=false; HealID:=ReadD(2); end else
if (wh2) then begin wh2:=false; PuhaID:=ReadD(2); end;
end else
if FromServer and (ConnectName=Name) and (pck[1]=#$62) then begin
if (ReadD(2)=RFail) or (ReadD(2)=PFail) then Skill:=not Skill;
end else
if FromServer and (ConnectName=Name) and (pck[1]+pck[2]=#$FE+#$1F) then begin
InFishing:=false;
if InWar=false then begin
LT.Enabled:=false;
Delay(500);
MagicSkillUse(Fishing);
end;
end else
if FromServer and (ConnectName=Name) and (pck[1]+pck[2]=#$FE+#$1E) then InFishing:=true else
if FromServer and (ConnectName=Name) and (pck[1]=#$32) then CharID:=ReadD(18) else
if FromServer and (ConnectName=Name) and (pck[1]=#$18) and (CharID=ReadD(2)) then StatusUpdate;
end.

На самом деле он корявый до безумия, но мне нравицо :)

Ну вроде всё... если что то кто то ниасилил - пишите..