///////////////////////////////////////////////////////////
//
//& nbsp; FARM SCRIPT
//
///////////////////////////////////////////////////////////
uses
SysUtils, Classes, RegExpr;
const
MOB_RANGE = 400;
DEATH_DELAY = 2000;
type
UsePath = procedure();
var
Status: boolean = false;
///////////////////////////////////////////////////////////
//
// HELPER FUNCTIONS
//
//////////////////////////////////////////////////////// ///
function SendBypass(dlg: string; AltB: boolean): boolean;
var
RegExp : TRegExpr;
List : TStringList;
i : integer;
bps : string;
begin
result:= true;
RegExp:= TRegExpr.Create;
List:= TStringList.Create;
RegExp.Expression:= '(<a *(.+?)</a>)|(<button *(.+?)>)';
if (AltB)
then begin
if RegExp.Exec(Engine.cbText) then
repeat List.Add(RegExp.Match[0]);
until (not RegExp.ExecNext);
end else
begin
if RegExp.Exec(Engine.DlgText)
then begin
repeat List.Add(RegExp.Match[0]);
until (not RegExp.ExecNext);
end;
end;
for i := 0 to List.Count - 1 do
begin
if (Pos(dlg, List[i]) > 0)
then begin
if (AltB)
then begin
RegExp.Expression:= '"bypass *(.+?)"';
if RegExp.Exec(List[i])
then bps:= TrimLeft(Copy(RegExp.Match[0], 9, Length(RegExp.Match[0]) - 9));
end else
begin
RegExp.Expression:= '"bypass -h *(.+?)"';
if RegExp.Exec(List[i])
then bps:= TrimLeft(Copy(RegExp.Match[0], 12, Length(RegExp.Match[0]) - 12));
end;
end;
end;
if (Length(bps) > 0)
then Engine.BypassToServer(bps);
RegExp.Free;
List.Free;
end;
/////////////////////////////////////////////////// ////////
//
// USER PATH
//
///////////////////////////////////////////////////////////
procedure UserPath0();
begin
Engine.MoveTo(83448, 209240, -5432);
Engine.MoveTo(83464, 209992, -5432);
Engine.MoveTo(84504, 209976, -5432);
Engine.MoveTo(84552, 211752, -5432);
Engine.MoveTo(85528, 211880, -5432);
Engine.MoveTo(86248, 212104, -5432);
Engine.MoveTo(87096, 212056, -5432);
Engine.MoveTo(87128, 211320, -5432);
Engine.MoveTo(87992, 211352, -5432);
Engine.MoveTo(88088, 212696, -5432);
Engine.MoveTo(88104, 213768, -5432);
Engine.MoveTo(89128, 213896, -5432);
Engine.MoveTo(89080, 214984, -5432);
Engine.MoveTo(89144, 216024, -5432);
Engine.MoveTo(89432, 215992, -5432);
Engine.MoveTo(89464, 217384, -5432);
end;
procedure UserPath1();
begin
Engine.MoveTo(89464, 217384, -5432);
Engine.MoveTo(89448, 218168, -5432);
Engine.MoveTo(89400, 218472, -5432);
Engine.MoveTo(89144, 218648, -5432);
Engine.MoveTo(89144, 219096, -5432);
Engine.MoveTo(89160, 219512, -5432);
end;
procedure UserPath2();
begin
Engine.MoveTo(89368, 219528, -5432);
Engine.MoveTo(89768, 219512, -5432);
Engine.MoveTo(90280, 219512, -5432);
Engine.MoveTo(90872, 219528, -5432);
end;
procedure UserPath3();
begin
Engine.MoveTo(91176, 219512, -5432);
Engine.MoveTo(91848, 219512, -5432);
Engine.MoveTo(92120, 219448, -5432);
Engine.MoveTo(92296, 219192, -5432);
Engine.MoveTo(92760, 219144, -5432);
Engine.MoveTo(92968, 219080, -5432);
Engine.MoveTo(93016, 218408, -5432);
end;
procedure UserPath4();
begin
Engine.MoveTo(118024, -52440, -2512);
Engine.MoveTo(93160, 218040, -5432);
Engine.MoveTo(93240, 217512, -5432);
Engine.MoveTo(93176, 217096, -5432);
Engine.MoveTo(92840, 216968, -5432);
Engine.MoveTo(92760, 216728, -5432);
Engine.MoveTo(92616, 216552, -5432);
Engine.MoveTo(92360, 216552, -5432);
Engine.MoveTo(91928, 216536, -5432);
end;
procedure UserPath5();
begin
Engine.MoveTo(91864, 216168, -5432);
Engine.MoveTo(91832, 215480, -5432);
Engine.MoveTo(91720, 215176, -5432);
Engine.MoveTo(91448, 215176, -5432);
Engine.MoveTo(91064, 215208, -5432);
Engine.MoveTo(90648, 215208, -5432);
end;
procedure UserPath6();
begin
Engine.MoveTo(90168, 215928, -5432);
Engine.MoveTo(89912, 215976, -5432);
Engine.MoveTo(89592, 215992, -5432);
Engine.MoveTo(89416, 216072, -5432);
Engine.MoveTo(89464, 216424, -5432);
Engine.MoveTo(89464, 217128, -5432);
end;
////////////////////////////////////////////////////// /////
//
// ACTION FUNCTIONS
//
//////////////////////////////////////////////////////// ///
function MobInZone(): boolean;
var
i: integer;
target: TL2Npc;
begin
for i := 0 to NpcList.Count - 1 do
begin
target := NpcList.Items(i);
if (target.InZone) and (not target.Dead)
then begin
if (target.Z > (User.Z - MOB_RANGE))
then begin
if (target.Z < (User.Z + MOB_RANGE))
then begin
result := true;
exit;
end;
end;
end;
end;
result := false;
end;
function Farm(map: string; path: UsePath): boolean;
begin
Engine.LoadZone(map);
Engine.FaceControl(0, true);
while MobInZone() do
begin
if (not Status)
then begin
result := false;
Engine.FaceControl(0, false);
exit;
end;
delay(2000);
end;
Engine.FaceControl(0, false);
path();
result := true;
end;
procedure GoToSpot();
begin
Engine.MoveTo(111384, 219336, -3544);
delay(1000);
// Buff
Engine.SetTarget(100910);
Engine.DlgOpen();
delay(1000);
SendBypass('Исп. профиль', false);
delay(1000);
SendBypass('Подтвердить', false);
delay(1000);
SendBypass('HP,CP,MP', false);
delay(1000);
// Teleport
Engine.BypassToServer('_bbshome');
delay(1000);
SendBypass('Телепорт', true);
delay(1000);
SendBypass('Катакомбы', true);
delay(1000);
SendBypass('The Saint', true);
delay(5000);
// Start farm
Status := true;
UserPath0();
end;
///////////////////////////////////////////////// //////////
//
// SCRIPT THREADS
//
////////////////////////////////////////////////////////// /
procedure FarmThread();
begin
while True do
begin
if (Status)
then begin
if (not Farm('s1.zmap', @UserPath1)) then continue;
if (not Farm('s2.zmap', @UserPath2)) then continue;
if (not Farm('s3.zmap', @UserPath3)) then continue;
if (not Farm('s4.zmap', @UserPath4)) then continue;
if (not Farm('s5.zmap', @UserPath5)) then continue;
if (not Farm('s6.zmap', @UserPath6)) then continue;
end;
delay(10);
end;
end;
procedure BuffCheckThread();
var
Buff: TL2Buff;
begin
if not User.Buffs.ByID(1059,Buff)
and (not User.Dead)
or (Buff.EndTime<300000)then
begin
delay(555);
Engine.FaceControl(0,false);
delay(555);
Engine.Unstuck;
Delay(25000);
end;
end;
procedure DeathCheckThread();
begin
while True do
begin
if (User.Dead)
then begin
Status := false;
Engine.FaceControl(0, false);
delay(DEATH_DELAY);
Engine.GoHome();
delay(30000);
GoToSpot();
end;
delay(100);
end;
end;
procedure EnemyCheckThread();
var
i:integer;
char2:TL2char;
  ;radius, radius_max:integer;
begin
while delay(150) do
begin
radius := 900; // Take target range
radius_max := 2500; // Max target search range
for i := 0 to CharList.count -1 do
begin
Char2 := CharList.Items(i);
if (user.DistTo(char2) < radius_max)
and not (char2.ismember)
and not (char2.dead)
and (char2.pvp)then
begin
if user.DistTo(char2) <= radius
then Engine.SetTarget(Char2);
Engine.UseSkill(1417, True);
Engine.UseSkill(1265, True);
Engine.UseSkill(1231, True);
Engine.UseSkill(1231, True);
Engine.UseSkill(1231, True);
Engine.UseSkill(1231, True);
Engine.UseSkill(1288, True);
break
end;
end;
end;
end;
///////////////////////////////////////////////////// //////
//
// MAIN FUNCTION
//
///////////////////////////////////////////////////////// //
begin
while (not Engine.SetGameWindow(true)) do
delay(5000);
GoToSpot();
script.NewThread(@FarmThread);
script.NewThread(@DeathCheckThread);
script.NewThread(@BuffCheckThread);
script.NewThread(@EnemyCheckThread);
end.
Создать фаил saintsRebuff.txt.pas (создаем txt и затем переименовываем) и поместить туда скрипт.
В архиве зоны. Распаковать в папку Settings.