Каким образом (и можно ли вообще) не дать клиенту получить пакеты группы npc_talk_*, но при этом обработать их в плагине. Просто в режиме "XKore 1" парят не закрывшиеся чаты с NPC.
Со второй частью вопроса особых проблем не должно возникнуть (повешаюсь на packet_Pre и обработаю).
Как не пропустить в клиент пакеты?
Модератор: 4epT
Правила форума
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
Как не пропустить в клиент пакеты?
Последний раз редактировалось ivano Ср июл 21, 2010 8:59 am, всего редактировалось 1 раз.
-
- Разработчик
- Сообщения: 819
- Зарегистрирован: Пн окт 27, 2008 9:49 pm
Re: Как не пропустить в клиент пакеты npc_talk?
Примерно так:
Код: Выделить всё
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?
EternalHarvest, спасибо большое!
Только у меня еще один маааленький вопросик (возможно туплю): где можно подсмотреть структуру $args->{messageArgs}, т.к. полагаю что придется реагировать в mangle? Или мне в любом случае в плагин придет извещение о срабатывании хука на receive группы npc_talk, но только в клиент ничего не будет отправляться?
Извиняюсь, если задаю несколько странные вопросы, просто я не оч догоняю некоторые вещи в ОК, да и на данную тему примеров никаких нет %-)
Добавлено спустя 7 часов 57 минут 32 секунды:
Поставил нужные хуки на willMangle и mangle, но срабатывает только первый. Часть его кода ниже: и т.д.
Так если до wMangle дело доходит, то mangle совсем не вызывается. Подозреваю что что-то недоделываю. Прошу помощи.
Только у меня еще один маааленький вопросик (возможно туплю): где можно подсмотреть структуру $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 совсем не вызывается. Подозреваю что что-то недоделываю. Прошу помощи.
-
- Разработчик
- Сообщения: 819
- Зарегистрирован: Пн окт 27, 2008 9:49 pm
Re: Как не пропустить в клиент пакеты npc_talk?
Примеры только в Receive.pm, да и те какие-то левые.
$args->{messageArgs} то же самое, что $args в обработчиках пакетов в Network::Receive::ServerType0 (разобранный пакет в соответствии со структурой).
Можно проверить так:
Странно, что mangle не вызывается. Сам вызов willMangle и mangle в functions.pl - sub parseIncomingMessage, можно попробовать проверить там работает ли всё как надо.
$args->{messageArgs} то же самое, что $args в обработчиках пакетов в Network::Receive::ServerType0 (разобранный пакет в соответствии со структурой).
Можно проверить так:
Код: Выделить всё
use Data::Dumper; Log::message(Dumper $args);