Суть в следующем, у меня на сервере, после минут 15 бот начинает тупить и не брать в таргет мобов которые стоят подальше от него, только рядом, а если в паре шагов некого нету, стоит тупит! Подскажите что в этом скрипте не так?
Код:
function get_next: TL2Npc;
var
value: TL2Npc;
value_priority: integer;
npc: TL2Npc;
i, j: integer;
priority: integer;
distance: Cardinal;
begin
value:= nil;
value_priority:= 0;
for i:= 0 to NpcList.Count do begin
priority:= 0;
npc:= NpcList.Items(i);
distance:= npc.DistTo(User);
if (npc.IsPet or npc.IsMember or npc.Dead or (distance > 5000)) then Continue;
/// Если у цели персонаж или группа в таргете
if (npc.Target.Valid) and (npc.Target.OID = User.OID) or (npc.Target.IsMember) then
priority:= (5000 + 20 * (100 - npc.HP));
/// Если цель находится в бою, умножить на два
if (npc.InCombat) then
priority:= priority * 2;
/// Изменяем приоритет в зависимости от дистанции
priority:= priority + (5000 - distance);
/// Если цель в бою и дерется с другим игроком
if npc.InCombat and npc.Target.Valid and ( (npc.Target.OID <> User.OID) or not npc.Target.IsMember ) then begin
priority:= Trunc(priority * npc.HP / 500);
end;
/// Проверяем соседних монстров на дистацию от текущего монстра
for j:= 0 to NpcList.Count do begin
if (NpcList.Items(j).OID = npc.OID) then Continue;
if (NpcList.Items(j).DistTo(npc) < 500) then
priority:= priority - (100 + Random(100));
end;
/// Сравниваем с нашим монстром
if (value = nil) then begin
value:= npc;
value_priority:= priority;
end;
if (priority > value_priority) then begin
value:= npc;
value_priority:= priority;
end;
// Print(npc.Name +'[ ' + npc.ID.toString + '] priority: ' + priority.toString);
end;
Result:= value;
end;