Обсуждение AI (баги, затупки, способы решения)
Модератор: 4epT
Обсуждение AI (баги, затупки, способы решения)
Не возражаете против создания подобного топика?
давайте собирать здесь проблемы по типу -
1. кора, версия такая-то
2. бот, специализация такая-то
3. проблема, суть
4. логи (и по возможности дебаги тоже)
давайте собирать здесь проблемы по типу -
1. кора, версия такая-то
2. бот, специализация такая-то
3. проблема, суть
4. логи (и по возможности дебаги тоже)
начну сам:
1. 206SVN6458
2. лукообразный
3. и 4. проблем много:
[1]
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
СУТЬ: если не можем попасть по мобу из данной точки то идем в эту же точку.
РЕШЕНИЕ: в аttack.pm добавляем еще одно условие проверки координат
меняем это:
на это:
[2]
No LOS from (354, 222) to target (364, 216); moving to (353, 221)
Attacking: Monster Geographer (0)
No LOS from (353, 221) to target (364, 216); moving to (352, 220)
Attacking: Monster Geographer (0)
No LOS from (352, 220) to target (364, 216); moving to (351, 219)
Attacking: Monster Geographer (0)
No LOS from (351, 219) to target (364, 216); moving to (350, 218)
Attacking: Monster Geographer (0)
No LOS from (350, 218) to target (364, 216); moving to (349, 217)
Attacking: Monster Geographer (0)
СУТЬ: моб находиться за небольшим или большим препятствием, но почему то точки которые мы получаем
чтобы атаковать моба - неудачные, мы оттуда так же не можем по нему выстрелить.
РЕШЕНИЕ: в аttack.pm опять таки меняем в том же блоке условия (теперь мы идем только в ту точку из которой
мы точно можем попасть в моба):
это:
на это:
[3]
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
СУТЬ: после всех изменений вышеуказанных возникает ситуация - моб по одну сторону длинной стены, а
мы по другую, соответственно к нему доступа нет, и мы попадаем в бесконечный цикл.
РЕШЕНИЕ: нам надо проигнорить моба, что мы делаем добавляя в attack.pm неоторые изменения( описание ниже):
итак в attack.pm после:
добавим:
и еще в AI.pm после:
добавим строку:
КАК ОНО ДЕЙСТВУЕТ: если мы лучники, и для моба находящегося за препятствием нет ни одной точки откуда мы можем в него попасть, то мы устанавливаем для него таймаут равный 6 секундам, в течении которых он будет игнорироваться, если же этот гад по истечении 6 секунд стал нам доступен - мы его атакуем. :секунд - оптимальное время за которое мы пройдем мимо моба так чтобы он скрылся из обзора коры. в принципе можно менять это значение по своему усмотрению. я так подумал что таймаут будет жрать меньше ресурсов процессора чем считать для каждого моба растояние и сравнивать его attackMaxRouteDistance в конфиге, хотя можно сделать и так, для этого можно в упрощенном виде использовать функцию checkLineWalkable($realMyPos, $realMonsterPos, 40), но не думаю что это надо.
зы пожалуйста потестите, если есть баги напишите.
1. 206SVN6458
2. лукообразный
3. и 4. проблем много:
[1]
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
СУТЬ: если не можем попасть по мобу из данной точки то идем в эту же точку.
РЕШЕНИЕ: в аttack.pm добавляем еще одно условие проверки координат
меняем это:
Код: Выделить всё
if (
(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos))
|| checkLineWalkable($spot, $realMonsterPos))
&& $field->isWalkable($spot->{x}, $spot->{y})
&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
) {
Код: Выделить всё
if (
(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos))
|| checkLineWalkable($spot, $realMonsterPos))
&& $field->isWalkable($spot->{x}, $spot->{y})
&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y}) #+++++++++add this string+++++++
&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
) {
No LOS from (354, 222) to target (364, 216); moving to (353, 221)
Attacking: Monster Geographer (0)
No LOS from (353, 221) to target (364, 216); moving to (352, 220)
Attacking: Monster Geographer (0)
No LOS from (352, 220) to target (364, 216); moving to (351, 219)
Attacking: Monster Geographer (0)
No LOS from (351, 219) to target (364, 216); moving to (350, 218)
Attacking: Monster Geographer (0)
No LOS from (350, 218) to target (364, 216); moving to (349, 217)
Attacking: Monster Geographer (0)
СУТЬ: моб находиться за небольшим или большим препятствием, но почему то точки которые мы получаем
чтобы атаковать моба - неудачные, мы оттуда так же не можем по нему выстрелить.
РЕШЕНИЕ: в аttack.pm опять таки меняем в том же блоке условия (теперь мы идем только в ту точку из которой
мы точно можем попасть в моба):
это:
Код: Выделить всё
if (
(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos))
|| checkLineWalkable($spot, $realMonsterPos))
&& $field->isWalkable($spot->{x}, $spot->{y})
&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y}) #+++++++++add this string+++++++
&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
) {
Код: Выделить всё
f (
$config{attackCanSnipe}
&& checkLineSnipable($spot, $realMonsterPos)
&& checkLineWalkable($realMyPos, $spot) #+++++++++change OR to AND+++++++
&& $field->isWalkable($spot->{x}, $spot->{y})
&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y}) #+++++++++add this string+++++++
&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
) {
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
СУТЬ: после всех изменений вышеуказанных возникает ситуация - моб по одну сторону длинной стены, а
мы по другую, соответственно к нему доступа нет, и мы попадаем в бесконечный цикл.
РЕШЕНИЕ: нам надо проигнорить моба, что мы делаем добавляя в attack.pm неоторые изменения( описание ниже):
итак в attack.pm после:
Код: Выделить всё
warning TF("%s; no acceptable place to stand\n", $msg);
Код: Выделить всё
$target->{attack_failedLOS} = time;
AI::dequeue;
AI::dequeue;
AI::dequeue if (AI::action eq "attack");
Код: Выделить всё
my $control = Misc::mon_control($monster->name,$monster->{nameID}) if $type || !$wantArray;
my $ID = $monster->{ID};
Код: Выделить всё
next if (!timeOut($monster->{attack_failedLOS}, 6));
зы пожалуйста потестите, если есть баги напишите.
Последний раз редактировалось Rumata Пт окт 17, 2008 1:52 pm, всего редактировалось 3 раза.
вобчем такая хрень - я стою в низинке, моб на взгорье, между нами соответственно стена этого взгорья тянущаяся далеко, моба то я вижу (дистанция около 10 клеток) но даже в ручном режиме не могу в него стрельнуть, нет такой возможности, соответствнно а надо ли нам вообще дават боту возможность стрелять через стену? если существуют стены через которые невозможно физически пальнуть?
по идее должен работать блок на проверку attackMaxRouteDistance, но где он хэ его знает , вопервых он вообче не работает, и есть ли он вообще? я не смог найти....
Добавлено спустя 3 минуты 9 секунд:
офигеть вот что нарыл
народ какая функция расчитывает путь до моба в блоках учитывая препятствия?
Добавлено спустя 3 минуты 9 секунд:
офигеть вот что нарыл
Добавлено спустя 22 минуты 35 секунд:attackMaxRoute distance is disabled when you use lockmap_x _y
народ какая функция расчитывает путь до моба в блоках учитывая препятствия?
- Click
- Разработчик
- Сообщения: 1564
- Зарегистрирован: Сб ноя 04, 2006 11:30 pm
- Сервер RO:: clickro.sytes.net
- Откуда: Великий Новгород
- Контактная информация:
[3] так должно получиться?
Код: Выделить всё
} else {
warning TF("%s; no acceptable place to stand\n", $msg);
$target->{attack_failedLOS} = time;
AI::dequeue;
AI::dequeue;
AI::dequeue if (AI::action eq "attack");
AI::dequeue;
}
- Click
- Разработчик
- Сообщения: 1564
- Зарегистрирован: Сб ноя 04, 2006 11:30 pm
- Сервер RO:: clickro.sytes.net
- Откуда: Великий Новгород
- Контактная информация:
svn 6576. так что обновляемся и тестим.
Добавлено спустя 42 минуты 31 секунду:
перенёс в баги, ну как то не идея это всё таки, а баг-фикс.
Добавлено спустя 42 минуты 31 секунду:
перенёс в баги, ну как то не идея это всё таки, а баг-фикс.
- Вложения
-
- src.rar
- изменённые файлы
- (11.66 КБ) 223 скачивания