баг это или фича я хз.
Ситуация: бот решил атаковать моба но еще не атаковал (ждет условия блока скиллов, идет к нему, и т.п.),
если в этот момент на моба кто-либо скастует заклинание не наносящее урон (!), то он откажется от атаки, вякнув про киллстил.
При этом не важно, находится ли кастующий с нами в пати или в списке танков; распространенный случай - каст пристом Lex Aeterna.
Это происходит из за логики проверки на КС - если по мобу не нанесено дамага/он сам не нанес дамага, проверяется количество игроков, скастовавших что либо на моба:
Код: Выделить всё
&& scalar(keys %{$monster->{castOnByPlayer}}) == 0
естественно, если наш собственный сопартиец-прист кастанул на него
Lex Aeterna или еще что то, то условие не срабатывает и моб считается "нечистым", и атака отменяется.
Я вижу 2 способа это исправить:
1) вообще выкинуть эту проверку, так как то что на моба кто то кинул аги даун, атерну, молчанку не означает что мы его не можем бить, вед так? А для особых случаев есть режим agressiveAntiKS
2) вместо этой элементарной проверки перебирать хэш %{$monster->{castOnByPlayer}} и сравнивать ID кастовавших со списком пати/танкерслист и в случае если найден хотя бы 1 не входящий в эти списки игрок, считать что моб "нечистый", иначе - что "чистый".
Misc.pm
Код: Выделить всё
###
my $allowed = 1;
if (scalar(keys %{$monster->{castOnByPlayer}}) > 0) {
foreach (keys %{$monster->{castOnByPlayer}}) {
my $ID1=$_;
my $source = Actor::get($_);
warning TF("Player %s is casting on mob %d times\n",$source->name,$monster->{castOnByPlayer}{$_});
if ( existsInList($config{tankersList}, $source->{name}) ||
($char->{party} && %{$char->{party}} && $char->{party}{users}{$ID1} && %{$char->{party}{users}{$ID1}})
) {
warning TF("And it is a party member\n");
}
else
{
warning TF("And it is not a party member");
$allowed = 0;
}
}
}
###
# If monster hasn't been attacked by other players
if (scalar(keys %{$monster->{missedFromPlayer}}) == 0
&& scalar(keys %{$monster->{dmgFromPlayer}}) == 0
### && scalar(keys %{$monster->{castOnByPlayer}}) == 0
&& $allowed == 1