BloodAngel
02.05.2011, 21:02
Давно не ботил. Решил взяться за старое =)
Суть проблемы:
Использую самую новую версию бота скачанную с СВН.
Revision: r7718
Есть два персонажа Син и Прист. Качаются в пати и прист в роли суппорта. Когда прист задерживается(при любых обстоятельствах хоть то долгий каст или даже отключение ai на короткое время) и теряет ведущего из поля зрения выдаёт вот такую ошибку: "BUG: Actor::move(undef, undef) called!"
После чего бот пытается идти вперёд, но его откидывает назад как буд-то он и не пытался двигаться и выдаёт следующую ошибку "You tried too long to move". и эта ошибка повторяется несколько раз после чего бот перестаёт пытаться. Координаты показанные в боте отличаются от координат в игре (/where)
Вопрос:
Как избавиться от этой ошибки?
Мой временный и глупый вариант от залипания бота:
С помощью макроса
1)при виде строчки "You tried too long to move" останавливаю движение "move stop"
2)вывожу в игровой чат команду "@refresh"(обновляет место положение персонажа. В игре это выглядит как использование винга)
3)двигаюсь рандомно на 1-2 клетки в любую сторону
После всего этого бот пытается двигаться дальше к ведущиму, но иногда ошибка повторяется.
Пытался найти решение на форумах, но не нашёл. Нашёл хороший плагин "ReactOnActor" с помощью которого можно было заставить ведущего ждать ведомого если тот отстал на определённое количество клеток, но ссылка битая. Если у кого есть новая версия подходящая под мою ревизию киньте ссылку.
В помощь по устранению данной ошибки:
"BUG: Actor::move(undef, undef) called!" - данная строка находится в "src\Actor.pm"
sub move {
my ($self, $x, $y, $attackID) = @_;
unless ($x and $y) {
# that happens when called from AI::CoreLogic::processFollow
error "BUG: Actor::move(undef, undef) called!\n";
return;
}
require Task::Move;
$self->queue('move', my $task = new Task::Move(
actor => $self,
x => $x,
y => $y,
));
$task->{attackID} = $attackID;
}
Удивил комментарий "# that happens when called from AI::CoreLogic::processFollow" в переводе означает "# Это происходит когда вызывается из AI::CoreLogic::processFollow" это типа пометка разработчикам что есть такой баг?
"You tried too long to move" - находится в "src\Task\Move.pm"
sub iterate {
my ($self) = @_;
return if (!$self->SUPER::iterate());
return if ($net->getState() != Network::IN_GAME);
# If we're sitting, wait until we've stood up.
if ($self->{actor}{sitting}) {
debug "Move $self->{actor} - trying to stand\n", "move";
my $task = new Task::SitStand(actor => $self->{actor}, mode => 'stand');
$self->setSubtask($task);
# Stop if the map changed.
} elsif ($self->{mapChanged}) {
debug "Move $self->{actor} - map change detected\n", "move";
$self->setDone();
# Stop if we've moved.
} elsif ($self->{actor}{time_move} > $self->{start_time}) {
debug "Move $self->{actor} - done\n", "move";
$self->setDone();
# Stop if we've timed out.
} elsif (timeOut($self->{giveup})) {
debug "Move $self->{actor} - timeout\n", "move";
$self->setError(TOO_LONG, TF("%s tried too long to move", $self->{actor}));
} elsif (timeOut($self->{retry})) {
debug "Move $self->{actor} - (re)trying\n", "move";
$self->{actor}->sendMove(@{$self}{qw(x y)});
$self->{retry}{time} = time;
}
}
Суть проблемы:
Использую самую новую версию бота скачанную с СВН.
Revision: r7718
Есть два персонажа Син и Прист. Качаются в пати и прист в роли суппорта. Когда прист задерживается(при любых обстоятельствах хоть то долгий каст или даже отключение ai на короткое время) и теряет ведущего из поля зрения выдаёт вот такую ошибку: "BUG: Actor::move(undef, undef) called!"
После чего бот пытается идти вперёд, но его откидывает назад как буд-то он и не пытался двигаться и выдаёт следующую ошибку "You tried too long to move". и эта ошибка повторяется несколько раз после чего бот перестаёт пытаться. Координаты показанные в боте отличаются от координат в игре (/where)
Вопрос:
Как избавиться от этой ошибки?
Мой временный и глупый вариант от залипания бота:
С помощью макроса
1)при виде строчки "You tried too long to move" останавливаю движение "move stop"
2)вывожу в игровой чат команду "@refresh"(обновляет место положение персонажа. В игре это выглядит как использование винга)
3)двигаюсь рандомно на 1-2 клетки в любую сторону
После всего этого бот пытается двигаться дальше к ведущиму, но иногда ошибка повторяется.
Пытался найти решение на форумах, но не нашёл. Нашёл хороший плагин "ReactOnActor" с помощью которого можно было заставить ведущего ждать ведомого если тот отстал на определённое количество клеток, но ссылка битая. Если у кого есть новая версия подходящая под мою ревизию киньте ссылку.
В помощь по устранению данной ошибки:
"BUG: Actor::move(undef, undef) called!" - данная строка находится в "src\Actor.pm"
sub move {
my ($self, $x, $y, $attackID) = @_;
unless ($x and $y) {
# that happens when called from AI::CoreLogic::processFollow
error "BUG: Actor::move(undef, undef) called!\n";
return;
}
require Task::Move;
$self->queue('move', my $task = new Task::Move(
actor => $self,
x => $x,
y => $y,
));
$task->{attackID} = $attackID;
}
Удивил комментарий "# that happens when called from AI::CoreLogic::processFollow" в переводе означает "# Это происходит когда вызывается из AI::CoreLogic::processFollow" это типа пометка разработчикам что есть такой баг?
"You tried too long to move" - находится в "src\Task\Move.pm"
sub iterate {
my ($self) = @_;
return if (!$self->SUPER::iterate());
return if ($net->getState() != Network::IN_GAME);
# If we're sitting, wait until we've stood up.
if ($self->{actor}{sitting}) {
debug "Move $self->{actor} - trying to stand\n", "move";
my $task = new Task::SitStand(actor => $self->{actor}, mode => 'stand');
$self->setSubtask($task);
# Stop if the map changed.
} elsif ($self->{mapChanged}) {
debug "Move $self->{actor} - map change detected\n", "move";
$self->setDone();
# Stop if we've moved.
} elsif ($self->{actor}{time_move} > $self->{start_time}) {
debug "Move $self->{actor} - done\n", "move";
$self->setDone();
# Stop if we've timed out.
} elsif (timeOut($self->{giveup})) {
debug "Move $self->{actor} - timeout\n", "move";
$self->setError(TOO_LONG, TF("%s tried too long to move", $self->{actor}));
} elsif (timeOut($self->{retry})) {
debug "Move $self->{actor} - (re)trying\n", "move";
$self->{actor}->sendMove(@{$self}{qw(x y)});
$self->{retry}{time} = time;
}
}