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

проверка на наличие мобов

Рег
4 Апр 2016
Сообщения
6
Реакции
0
Всем привет. Подскажите . Есть ли команда проверки в бою персонаж или нет?
В адреналине у меня не работает фарм по точкам нашел на форуме скрипт http://rawr.su/topic/2604-prostoj-skript-na-farm-katakomb/, где указан пример проверки мобов в комнате . Но почему то мой персонаж игнорирует наличие мобов рядом и сразу перемещается в указанную точку. (Круги наворачивает) пробывал и с зонами и без.


P.S не мог скопировать код в данную тему так как создал ее на телефоне.
 
if(user.incombat) then ...

там идет подгрузка зон, которые должны быть сохранены, мб что-то не так сделал? ибо код оттуда точно рабочий)

function MobInZone: boolean;
var
mob: integer;
begin
result:= False;
for mob:=0 to npclist.count-1 do begin
if npclist.items(mob).inzone and not npclist.items(mob).dead then begin
if npclist.items(mob).z > (user.z-400) then begin
if npclist.items(mob).z < (user.z+400) then begin
result:= true;
end;
end;
end;
end;
end;

begin
print(mobinzone);
end.

можно такой код запустить, без циклов и подгрузки зон, узнать есть ли какие-то мобы в нашей зоне.
 
Скорей всего что то не так сделал раз не работает. Я скопировал код и вставил . Но убрал подгрузку зон. Настроил бота чтобы он без зоны фармил. Ставлю его в полную комнату. И он тупо бегает. Я проверю на работоспособность функцию . Но можно подробней расшифровать все условия кода..
 
ХОРВЕСТР написал(а):
после присвоения результата нужно прервать цикл.
без прерывания и так все нормально работает, false же нигде после не присваивается.



Tacejibxob написал(а):
Скорей всего что то не так сделал раз не работает. Я скопировал код и вставил . Но убрал подгрузку зон. Настроил бота чтобы он без зоны фармил. Ставлю его в полную комнату. И он тупо бегает. Я проверю на работоспособность функцию . Но можно подробней расшифровать все условия кода..
мб ты не нажал второй раз после редактирвоания зоны? она должна залиться зеленым цветом или стоит галочка на "отключить зону"
 
ХОРВЕСТР написал(а):
Это называется БЫДЛО-код
челик не может справиться с этим кодом, а ты ему рассказываешь про какие-то прерывания циклов, хотя ему это никак не поможет, смысл в этом, если проблема не в этом? твои посты несут 0 помощи и 0 смысловой нагрузки. если бы ты сказал что это даст немного оптимизация то я еще понял бы, но быдло-код, спасибо, поржал :D
 
Tacejibxob написал(а):
Скорей всего что то не так сделал раз не работает. Я скопировал код и вставил . Но убрал подгрузку зон. Настроил бота чтобы он без зоны фармил. Ставлю его в полную комнату. И он тупо бегает. Я проверю на работоспособность функцию . Но можно подробней расшифровать все условия кода..
Функция идет по списку мобов. Если моб в зоне и он не мертв, то дальше две проверки на то что бы он был от персонажа не выше и не ниже 400метров. Если все условия соблюдены то функция пришлет true...при каждом мобе, пока не пройдет по всему списку. Да, там не хватает прерывания, что бы не грузить лишний раз систему.
 
SoundShocking написал(а):
если бы ты сказал что это даст немного оптимизация то я еще понял бы
прерывание цикла в данном случае действительно даст некоторую оптимизацию по кол-ву совершенных операций, в списке может быть условно 200 мобов, а у тебя уже 3ий будет в зоне, т.е. условие выполнено - следовательно оставшиеся 197 итераций делать не к чему.


for i:= 0 to List.Count-1 do begin
if (условие) then result:= true; // результат то присвоили, но цикл будет работать дальше
end;


for i:= 0 to List.Count-1 do begin
if (условие) then begin
result:= true; // присвоили результат
break; // прервали цикл
end;
end;


понятное дело, что в конкретном примере это не критично, т.к. мало пробегов и они быстрые, но представь, что каждая итерация занимает ~1секунду, и полный проход по циклу займет более пары минут. посыл думаю понятен)
 
farmwl написал(а):
прерывание цикла в данном случае действительно даст некоторую оптимизацию по кол-ву совершенных операций, в списке может быть условно 200 мобов, а у тебя уже 3ий будет в зоне, т.е. условие выполнено - следовательно оставшиеся 197 итераций делать не к чему.
я лишь скопировал код человеку из соседней темы, чтобы помочь ему как-то решить проблему, но тут уже два человека на меня нападают :О


farmwl написал(а):
понятное дело, что в конкретном примере это не критично, т.к. мало пробегов и они быстрые, но представь, что каждая итерация занимает ~1секунду, и полный проход по циклу займет более пары минут. посыл думаю понятен)
я в курсе насчет оптимизация, это все хорошо да, но что насчет ложных срабатываний с выходом из цикла? допустим есть у нас комната в катах, она не круглая идет, есть большая вероятность того что мы можем стоять с краю комнаты, будет чекаться 1ый моб в списке, который может быть выше заданного условия, в другой комнате, получается мы можем выбежать из комнаты, из-за того что на 1ом нцп нас выкинет из цикла, уже не говоря про зоны с разнообразными формами, не говоря о том если нам надо посчитать точное кол-во мобов в зоне, етс.

да и чет сомнительная оптимизация, когда цикл из выборки 500 игроков выполняется за >0 ms, а 100`000 циклов по 500 человек за ~2800 мс,

procedure ggwp;
var i, j, count, timer_c, timer_a:integer;
begin
timer_a:=gettickcount;
for j:=1 to 100000 do
begin
count:=0;
timer_c:=gettickcount;
for i:=0 to charlist.count-1 do
begin
if(charlist.items(i).sitting) then inc(count);
//else break;
end;
print('#'+inttostr(j)+' All: '+inttostr(charlist.count-1)+'. Sitting: '+inttostr(count)+'. Time (cycle): '+inttostr(gettickcount-timer_c)+' ms. Time (All) '+inttostr(gettickcount-timer_a)+' ms.');
end;
print('Execution: '+inttostr(gettickcount-timer_a)+' ms.');
end;
Clip2net_160902005723.png
 
@SoundShocking, я вроде как не нападаю) высеры хорвестра про говно код и никаких альтернатив\советов - пустой звон. ты привел рабочий код, который решает поставленную задачу - это главное я считаю.
все загоны "а как можно сделать идеальней" - второстепенны, в конкретном случае вообще не значительны. однако ты сказал
SoundShocking написал(а):
если бы ты сказал что это даст немного оптимизация то я еще понял бы
и я лишь отметил, что прерывание действительно даст в данном случае некоторую оптимизацию. не более


про ложные срабатывания не понял что ты имел в виду, ложных срабатываний не может быть, если сформулировано грамотное и полное условие в if
мой посыл был не в том, что "делай обязательно так" а в том, что "так делать грамотней"
в скриптах под бота на современных ПК большинство пользователей вряд ли вообще когда-либо столкнется с проблемой долгих вычислений, это и ежу понятно (ну если конечно математику считать бешеную не придется)

в пример могу привести недавнюю задачу: у меня было 2к координат, мне нужно было найти оптимальный путь, который бы проходил все 2к точек ровно 1 раз. такой пусть вычислялся несколько минут:
2016-09-02_02-00-20.gif
берешь 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.
 
farmwl написал(а):
и я лишь отметил, что прерывание действительно даст в данном случае некоторую оптимизацию. не более
я с самого начала написал если бы он сказал что даст немного оптимизации в коде то да, это полезно, но писать про какой-то быдло-код на форуме в ветке адреналина, где люди делают для себя скрипты, которые мало что понимают в программировании как минимум глупо, такой был посыл в моем сообщении)



farmwl написал(а):
про ложные срабатывания не понял что ты имел в виду, ложных срабатываний не может быть, если сформулировано грамотное и полное условие в if
да, мой бок, накрутил себя с конструкцией if else, а нужно все через if сделать - найти 1го моба в зоне и выйти из цикла)



farmwl написал(а):
каким софтом делаешь такие гифки?



farmwl написал(а):
берешь 1ую точку, строишь для нее оптимальный маршрут, запоминаешь расстояние, берешь 2ую точку, строишь для нее оптимальный маршрут, сравнимаешь полученное расстояние с 1ым случаем и если результат лучше, то запоминаем.. и так всего 2к раз
если не сложно, может натолкнешь на путь истинный. есть небольшое палево с ботом, когда бежишь к мобу, но на тебя или твоего саппорта агратися какой-то моб, который кастует какой-то скилл, соответственно часто моб находится сзади за углом обзора и дд сразу бежит к нему, сложно ли будет сделать функцию проверки моба в радиусе обзора, то есть по умолчанию у нас есть угол обзора и какой-то радиус обзора что ли, так как камера на руофе далеко не отдаляется.
 
@SoundShocking, в скайп добавляйся, подробней идею опишешь
 
@farmwl, Петов принимает за мобов, как исправить можна? Я так понимаю нужно добавить условие подобное (party.pets.count-1) , только для всех петов и сумонов в зоне.

Вот нашел вроде бы команду:
Код:
petlist.Count > 0
 
@sasha282, добавь проверку на Attackable чтоб отличать мобов от нпс. if NpcList(i).Attackable then это моб
 
Назад
Сверху