Можно использовать в качестве основы...
Сами вписываем куда убегать (runAway) и куда возвращаться (returnToSpot).
if (n > 1) or ((user.hp < 10) and user.inCombat) then
Здесь n число мобов, которое на нас сагрилось.
User.HP наше хп%.
В данном случае мы начнём убегать, если на нас сагрилось больше 1 моба или у нас меньше 20% хп, тогда релогаемся и бежим обратно.
Ещё можно изменить эту строчку на
if (n > 1) or ((user.hp < 10) and user.inCombat) or inDanger then
и добавить фикцию в код
Она будет и проверять на наличие “паровоза” и если за другим игроком бежит 3 (minMobs) моба, мы тоже начнём убегать. Минус этой функции, что это может быть простой игрок, который убегает от мобов или паровоз не на нас. Плюс, что мы можем защититься от стана.
procedure runAway;
begin
Engine.MoveTo(11, 22, 33);
//...
end;
procedure returnToSpot;
begin
Engine.MoveTo(11, 22, 33);
//...
end;
procedure agroCheck;
var
i, n : integer;
begin
while True do begin
n := 0;
for i := 0 to NpcList.Count - 1 do begin
if (NpcList.Items(i).Target = User) and not NpcList.Items(i).Dead then begin
Inc;
print(NpcList.Items(i).Name); /// <<<<<<<<<<<<<<<<<<
end;
if i = NpcList.Count - 1 then print('-------------' + ' n = ' + n.ToString); /// <<<<<<<<<<<<<<<<<<
end;
if (n > 1) or ((User.HP < 10) and User.InCombat) then begin
print('Running n = ' + n.ToString); /// <<<<<<<<<<<<<<<<<<
Engine.FaceControl(0, False);
Script.NewThread(@runAway);
Engine.BlinkWindow(True);
While User.InCombat do
Delay(100);
if not User.Dead then begin
Engine.Restart;
Engine.GameStart(0); //GameStart(CharIndex: cardinal) 0 = first CharIndex
while not (Engine.Status = lsOnline) do
Delay(500);
returnToSpot;
Engine.FaceControl(0, True);
end
else begin
Engine.GoHome;
// код если всётаки умерли
end;
end;
Delay(500); // two checks per second
end;
end;
begin
Script.NewThread(@agroCheck);
end.
begin
Engine.MoveTo(11, 22, 33);
//...
end;
procedure returnToSpot;
begin
Engine.MoveTo(11, 22, 33);
//...
end;
procedure agroCheck;
var
i, n : integer;
begin
while True do begin
n := 0;
for i := 0 to NpcList.Count - 1 do begin
if (NpcList.Items(i).Target = User) and not NpcList.Items(i).Dead then begin
Inc;
print(NpcList.Items(i).Name); /// <<<<<<<<<<<<<<<<<<
end;
if i = NpcList.Count - 1 then print('-------------' + ' n = ' + n.ToString); /// <<<<<<<<<<<<<<<<<<
end;
if (n > 1) or ((User.HP < 10) and User.InCombat) then begin
print('Running n = ' + n.ToString); /// <<<<<<<<<<<<<<<<<<
Engine.FaceControl(0, False);
Script.NewThread(@runAway);
Engine.BlinkWindow(True);
While User.InCombat do
Delay(100);
if not User.Dead then begin
Engine.Restart;
Engine.GameStart(0); //GameStart(CharIndex: cardinal) 0 = first CharIndex
while not (Engine.Status = lsOnline) do
Delay(500);
returnToSpot;
Engine.FaceControl(0, True);
end
else begin
Engine.GoHome;
// код если всётаки умерли
end;
end;
Delay(500); // two checks per second
end;
end;
begin
Script.NewThread(@agroCheck);
end.
Сами вписываем куда убегать (runAway) и куда возвращаться (returnToSpot).
if (n > 1) or ((user.hp < 10) and user.inCombat) then
Здесь n число мобов, которое на нас сагрилось.
User.HP наше хп%.
В данном случае мы начнём убегать, если на нас сагрилось больше 1 моба или у нас меньше 20% хп, тогда релогаемся и бежим обратно.
Ещё можно изменить эту строчку на
if (n > 1) or ((user.hp < 10) and user.inCombat) or inDanger then
и добавить фикцию в код
function inDanger: boolean;
var mobsInTrain,minMobs,i,j: integer;
begin
Result := false;
minMobs := 3;
for i:=0 to charlist.count-1 do begin
mobsInTrain := 0;
if (user.distto(charlist.items(i)) < 3000) and charlist.items(i).moved then begin //close, runing
for j:=0 to npclist.count-1 do begin
if (npclist.items(j).target = charlist.items(i)) and (charlist.items(i).distto(npclist.items(j)) < 1500) then inc(mobsInTrain);
if (mobsInTrain >= minMobs) then begin
Result := true;
exit;
end;
end;
end;
end;
end;
var mobsInTrain,minMobs,i,j: integer;
begin
Result := false;
minMobs := 3;
for i:=0 to charlist.count-1 do begin
mobsInTrain := 0;
if (user.distto(charlist.items(i)) < 3000) and charlist.items(i).moved then begin //close, runing
for j:=0 to npclist.count-1 do begin
if (npclist.items(j).target = charlist.items(i)) and (charlist.items(i).distto(npclist.items(j)) < 1500) then inc(mobsInTrain);
if (mobsInTrain >= minMobs) then begin
Result := true;
exit;
end;
end;
end;
end;
end;
Она будет и проверять на наличие “паровоза” и если за другим игроком бежит 3 (minMobs) моба, мы тоже начнём убегать. Минус этой функции, что это может быть простой игрок, который убегает от мобов или паровоз не на нас. Плюс, что мы можем защититься от стана.