@SoundShocking, я вроде как не нападаю) высеры хорвестра про говно код и никаких альтернатив\советов - пустой звон. ты привел рабочий код, который решает поставленную задачу - это главное я считаю.
все загоны "а как можно сделать идеальней" - второстепенны, в конкретном случае вообще не значительны. однако ты сказал
SoundShocking написал(а):
если бы ты сказал что это даст немного оптимизация то я еще понял бы
и я лишь отметил, что прерывание действительно даст в данном случае некоторую оптимизацию. не более
про ложные срабатывания не понял что ты имел в виду, ложных срабатываний не может быть, если сформулировано грамотное и полное условие в if
мой посыл был не в том, что "делай обязательно так" а в том, что "так делать грамотней"
в скриптах под бота на современных ПК большинство пользователей вряд ли вообще когда-либо столкнется с проблемой долгих вычислений, это и ежу понятно (ну если конечно математику считать бешеную не придется)
в пример могу привести недавнюю задачу: у меня было 2к координат, мне нужно было найти оптимальный путь, который бы проходил все 2к точек ровно 1 раз. такой пусть вычислялся несколько минут:
берешь 1ую точку, строишь для нее оптимальный маршрут, запоминаешь расстояние, берешь 2ую точку, строишь для нее оптимальный маршрут, сравнимаешь полученное расстояние с 1ым случаем и если результат лучше, то запоминаем.. и так всего 2к раз
А что касаемо функции о которой просили, то можно сделать так:
Код:
function mobsInZoneCount(zoneName: string): integer; // считает кол-во мобов в указанной зоне (имя файла указывать вместе с расширением)
var i: integer;
begin
result:= 0; // по умолчанию = 0
if Engine.LoadZone(zoneName) then begin // если нам удалось загрузить зону, то
for i:= 0 to NpcList.Count-1 do begin // пробегаем по списку мобов
if (NpcList(i).InZone) // если моб внутри загруженной зоны
and (not NpcList(i).Dead) // и не мертв и разница по Z < 400, то
and (Abs(NpcList(i).Z - User.Z) < 400) then inc(result); // увеличиваем счетчик
end;
end else begin // если же нам не удалось загрузить карту, то
Print('Не смог загрузить зону: '+zoneName); // пишем об этом
result:= -1; // присваиваем отрицательный результат (чтобы различать случаи ошибки и когда просто не нашли мобов)
end;
end;
function haveMobsInZone(zoneName: string): boolean; // есть мобы в указанной зоне или нет
var i: integer;
begin
result:= false; // по умолчанию "нет"
if Engine.LoadZone(zoneName) then begin // если нам удалось загрузить зону, то
for i:= 0 to NpcList.Count-1 do begin // пробегаем по списку мобов
if (NpcList(i).InZone) // если моб внутри загруженной зоны
and (not NpcList(i).Dead) // и не мертв
and (Abs(NpcList(i).Z - User.Z) < 400) then begin // и разница по Z < 400, то
result:= true; // результат "да"
break; // прерываем дальнейший поиск, т.к. УЖЕ нашли хотя бы 1го моба в зоне
end;
end;
end else Print('Не смог загрузить зону: '+zoneName); // если же нам не удалось загрузить карту, то пишем об этом
end;
begin
Print(mobsInZoneCount('Gaints_Cave_0.zmap'));
Print(haveMobsInZone('Gaints_Cave_0.zmap'));
end.