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
Инфа:
Плагин помогает ведущему не потерять ведомого.
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