PDA

Просмотр полной версии : [plugin] Ждём ведомого


BloodAngel
15.05.2011, 18:17
В связи с тем что ведущий постоянно убегает от ведомого. Я решил написать плагин который будет ждать ведомого если тот отстает.
Инфа:
Плагин помогает ведущему не потерять ведомого.

waitSupport.pl
#==========================================
# Автор: Expelled
# версия: 201105192
# Имя файла: waitSupport.pl
#==========================================
package waitSupport;

use strict;
use Plugins;
use Globals;
use Utils;
use Utils qw/timeOut/;
use Misc;
use AI;
use Log qw(message warning error);
use Network::Send ();
use Time::HiRes qw(time);
use encoding 'utf8';

my $start;
my $time;
my $nextTime;

Plugins::register('waitSupport', 'Master wait Support', \&Unload, \&Reload);

my $hooks = Plugins::addHooks(
['mainLoop_pre', \&waitSupport, undef]
);
my $chooks = Commands::register(
['waitSupport', "waitSupport plugin", \&commandHandler]
);
sub Unload {
print "Plugin: waitSupport - unloaded!\n";
Plugins::delHooks($hooks);
Commands::unregister($chooks);
}
sub Reload {
print "Plugin: waitSupport - reloaded!\n";
Plugins::delHooks($hooks);
Commands::unregister($chooks);
}
sub waitSupport {
return unless $field;
my ($self) = @_;
if($config{slave} == 1){
my $maxdist = $config{slaveDistanceMax};
my $slave = $config{slaveTarget};
my $aggressives = AI::ai_getAggressives(1, 1);
my $online;
my $map;
my $OnMap;
for (my $i = 0; $i < @partyUsersID; $i++) {
next if (@partyUsersID[$i] eq "");
if ($char->{'party'}{'users'}{@partyUsersID[$i]}{'name'} eq $slave){
$online = $char->{'party'}{'users'}{@partyUsersID[$i]}{'online'};
($map) = $char->{'party'}{'users'}{@partyUsersID[$i]}{'map'} =~ /([\s\S]*)\.gat/;
}
}
if($config{slaveOnMap} == 1){$OnMap=($map eq $field->{name})?1:0;}else{$OnMap=1;}
if ($aggressives eq 0 && $online eq 1 && $OnMap eq 1){
foreach my $player (@{$playersList->getItems()}) {
if ($maxdist > 0 && $player->{name} eq $slave) {
my $dist = sprintf("%.2f", Utils::distance($char->{pos_to}, $player->{pos_to}));
if ($dist <= $maxdist){
$time = time+$config{slaveWalkTime};
return 1;
}else{
if ($time <= time && $config{slaveWalkTime} != 0 && $config{slaveWalk} == 2){
my $x = sprintf("%.0f",$char->{pos_to}{x}+rand(2)-1);
my $y = sprintf("%.0f",$char->{pos_to}{y}+rand(2)-1);
$char->sendMove($x, $y);
$time = time+$config{slaveWalkTime};
}
AI::ai_clientSuspend(0, 0.5);
if($config{slaveMsg} == 1 && time>=$nextTime){
warning ("Ведомый $player->{name} отстаёт на: $dist клеток\n");
$nextTime = time+$config{slaveMsgTime};
}
return 1;
}
}
}
if ($time <= time && $config{slaveWalkTime} != 0 && $config{slaveWalk} >= 1){
my $x = sprintf("%.0f",$char->{pos_to}{x}+rand(2)-1);
my $y = sprintf("%.0f",$char->{pos_to}{y}+rand(2)-1);
$char->sendMove($x, $y);
$time = time+$config{slaveWalkTime};
}
if ($config{slaveWait}==1){
AI::ai_clientSuspend(0, 0.5);
if($config{slaveMsg} == 1 && time>=$nextTime){
warning ("Ведомый $slave скрылся с поля зрения\n");
$nextTime = time+$config{slaveMsgTime};
}
}
return 1;
}
return 1;
}
}
1;

Этот plugin положить в папку plugins у ведущего. В config.txt ведущего дописать следующие параметры
#настройки для ведомого!
#1=ждать ведомого; 0=Не ждать;
slave 1
#Имя ведомого
slaveTarget NickName
#Дистанция на которое можно отбежать от ведомого(Желательно на 2 клетки дальше чем у ведомого followDistanceMax)
slaveDistanceMax 8
#1=Ждать ведомого если он скрылся с экрана(по умолчанию); 0=неждать;
slaveWait 1
#Передвигаться что бы ведомый мог определить координаты ведущего. 0=не двигаться 1=двигаться только когда ведомый скрылся с экрана; 2=двигаться всегда когда ждём ведомого(по умолчанию)
slaveWalk 2
#Время(в секундах) через которое будет двигаться если установлен параметр slaveWalk.
slaveWalkTime 5
#0=Ждать если ведомого нет на локации; 1=не ждать если ведомого нет на локации.
slaveOnMap 0
#1=выводить сообщения отстования ведомого; 0=не выводить;
slaveMsg 1
#Частота вывода сообщение отстования ведомого(В секундах. По умолчанию 1(каждую секунду). Должен быть установлен параметр slaveMsg=1)
slaveMsgTime 1

Changelog:
201105153:
1)Теперь ведущий не стоит на месте если slaveWait=1,ведомый отстает и его бьют. Он атакует агрессивных и не ждёт ведомого. Так же если бьют ведомого то ведущий не ждёт пока он к нему подойдёт.
2)Убрал функцию distance. Теперь использует функцию из OpenKore.
3)Появился новый параметр slaveWalk который позволяет двигаться через указанное время(в сек.) что бы ведомый мог определить координаты ведущего. Полезно поставить 5 если параметр slaveWait = 1
3)Добавлена проверка на онлайн ведомого
4)Добавлен параметр slaveMsg. Показывает сообщение что ведомый отстал и на сколько клеток.
201105161:
1)Перевёл из макроса в плагин. Теперь это полноценный plugin.

201105192:
1)Теперь плагин основан на времени, а не на тиках.
2)Добавлена более гибкая настройка вывода сообщений.
3)Добавлен параметр slaveOnMap проверяющий находится ли ведомый на той же локации где и ведущий.
4)Теперь корректно выгружает и перезагружает плагин.


Bugs:
#1 Не корректно выгружает и перезагружает плагин.
#2 При ожидание иногда не ждёт.
last version: 201105192

4epT
15.05.2011, 19:12
ещё можно использовать настройку конфига
http://ragbot.ru/wiki/followBot

BloodAngel
15.05.2011, 23:29
ещё можно использовать настройку конфига
http://ragbot.ru/wiki/followBot

Ну при этом параметре ведущий всё равно убегает. + это палево в чате пати =) Если админ шарит в РО то он может прослушать разговор пати. А там "move X Y" =)

Добавлено через 4 часа 5 минут
Не прошло и дня, а уже новая версия =)

4epT
16.05.2011, 01:10
кстати забавная ситуация.. никогда даже не думал что конструкцию вида:
sub slaveDist {
можно использовать в macros.txt

BloodAngel
16.05.2011, 23:13
кстати забавная ситуация.. никогда даже не думал что конструкцию вида:

можно использовать в macros.txt

=) Полезно иногда использовать sub а не простой macro. Даёт больше возможностей.

P.S. - Перевёл из макроса в плагин! =) Можно тему переименовать? вместо [macros] написать [plugin]

4epT
19.05.2011, 00:49
не плохо было бы прикрепить сам файл плагина

у меня при запуске сначала ругался на UTF-8, потом:

Загрузка всех плагинов...
Загрузка плагина plugins/1.pl...
Plugin: waitSupport - unloaded!
Плагин не может быть загружен из-за проблемы в нём. Пожалуйста, сообщите автору
плагина, или удалите плагин, тогда OpenKore сможет запуститься.

Сообщение об ошибке:
Плагин содержит синтаксическую ошибку:
Invalid hook handle passed to Plugins::delHook().
Нажмите ENTER для завершения программы.

BloodAngel
19.05.2011, 16:07
не плохо было бы прикрепить сам файл плагина

у меня при запуске сначала ругался на UTF-8, потом:

UTF-8 используется для того что бы в консоле выводились надписи на кириллице. Для этого надо что бы и файл имел кодировку UTF-8.

Какую версию бота используешь?

Файл прикреплю чуть позже.

Добавлено через 1 час 52 минуты
update:
Новая версия 201105191.
Изменения:
1)Теперь плагин основан на времени, а не на тиках.
2)Добавлена более гибкая настройка вывода сообщений.
3)Добавлен параметр slaveOnMap проверяющий находится ли ведомый на той же локации где и ведущий.
4)Теперь корректно выгружает и перезагружает плагин.
Исправленные баги:
#1 Не корректно выгружает и перезагружает плагин.
#2 При ожидание иногда не ждёт.

P.S. - Выложил архив с файлом.

Zloba
28.05.2011, 11:11
Возможно стоит поправить вызов AI::ai_clientSuspend(0, 0.5); на что-то подобное:
AI::ai_clientSuspend(0, 1) if (!AI::is(qw(clientSuspend)));

или

AI::ai_clientSuspend(0, 0.5) if @AI::ai_seq < N;

или же поправить сам AI::ai_clientSuspend, иначе начинается дикий спам им в AI queue, это можно наблюдать, например, написав "aiv" во время ожидания сапорта.

BloodAngel
30.05.2011, 00:47
Возможно стоит поправить вызов AI::ai_clientSuspend(0, 0.5); на что-то подобное:
AI::ai_clientSuspend(0, 1) if (!AI::is(qw(clientSuspend)));

или

AI::ai_clientSuspend(0, 0.5) if @AI::ai_seq < N;

или же поправить сам AI::ai_clientSuspend, иначе начинается дикий спам им в AI queue, это можно наблюдать, например, написав "aiv" во время ожидания сапорта.

Спасибо за подсказку как устранить проблему. Возьму на заметку. Я знал об этой ошибке, но она как-то не мешала до вчерашнего дня.