Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

анти паровоз

Рег
2 Мар 2016
Сообщения
234
Реакции
0
Можно использовать в качестве основы...

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(n);
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;

Она будет и проверять на наличие “паровоза” и если за другим игроком бежит 3 (minMobs) моба, мы тоже начнём убегать. Минус этой функции, что это может быть простой игрок, который убегает от мобов или паровоз не на нас. Плюс, что мы можем защититься от стана.
 
А реализация не убегать а отбиться если пати все на месте придусмотрена ? А то уж не охота копаться .
 
Назад
Сверху