Страница 1 из 1
Как не пропустить в клиент пакеты?
Добавлено: Вт июл 20, 2010 11:03 am
ivano
Каким образом (и можно ли вообще) не дать клиенту получить пакеты группы npc_talk_*, но при этом обработать их в плагине. Просто в режиме "XKore 1" парят не закрывшиеся чаты с NPC.
Со второй частью вопроса особых проблем не должно возникнуть (повешаюсь на packet_Pre и обработаю).
Re: Как не пропустить в клиент пакеты npc_talk?
Добавлено: Вт июл 20, 2010 11:39 am
EternalHarvest
Примерно так:
Код: Выделить всё
Plugins::addHook("Network::Receive/willMangle", \&willMangle);
Plugins::addHook("Network::Receive/mangle", \&mangle);
sub willMangle {
my (undef, $args) = @_;
if ($args->{name} eq 'npc_talk') {
$args->{return} = 1; # надо ли mangle
}
}
sub mangle {
my (undef, $args) = @_;
if ($args->{messageName} eq 'npc_talk') {
$args->{return} = 2; # 0 - отправить исходный пакет, 1 - отправить изменённый пакет ($args->{messageArgs}), 2 - пропустить
}
}
Re: Как не пропустить в клиент пакеты npc_talk?
Добавлено: Вт июл 20, 2010 7:45 pm
ivano
EternalHarvest, спасибо большое!
Только у меня еще один маааленький вопросик (возможно туплю): где можно подсмотреть структуру $args->{messageArgs}, т.к. полагаю что придется реагировать в mangle? Или мне в любом случае в плагин придет извещение о срабатывании хука на receive группы npc_talk, но только в клиент ничего не будет отправляться?
Извиняюсь, если задаю несколько странные вопросы, просто я не оч догоняю некоторые вещи в ОК, да и на данную тему примеров никаких нет %-)
Добавлено спустя 7 часов 57 минут 32 секунды:
Поставил нужные хуки на willMangle и mangle, но срабатывает только первый. Часть его кода ниже:
Код: Выделить всё
sub wMangle {
my (undef, $args) = @_;
if ($args->{name} eq 'npc_talk') {
$args->{willMangle} = 1; # взято из Receive.pm
$args->{return} = 1; # надо ли mangle
} elsif ($args->{name} eq 'npc_talk_continue') {
$args->{willMangle} = 1;
$args->{return} = 1;
и т.д.
Так если до wMangle дело доходит, то mangle совсем не вызывается. Подозреваю что что-то недоделываю. Прошу помощи.
Re: Как не пропустить в клиент пакеты npc_talk?
Добавлено: Вт июл 20, 2010 10:42 pm
EternalHarvest
Примеры только в Receive.pm, да и те какие-то левые.
$args->{messageArgs} то же самое, что $args в обработчиках пакетов в Network::Receive::ServerType0 (разобранный пакет в соответствии со структурой).
Можно проверить так:
Код: Выделить всё
use Data::Dumper; Log::message(Dumper $args);
Странно, что mangle не вызывается. Сам вызов willMangle и mangle в functions.pl - sub parseIncomingMessage, можно попробовать проверить там работает ли всё как надо.