Как не пропустить в клиент пакеты?

Общие вопросы по OpenKore обсуждаются здесь. Можно сказать, что это - основной раздел форума.
Возник вопрос? Вам сюда.

Модератор: 4epT

Правила форума
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
ivano
Энтузиаст
Сообщения: 74
Зарегистрирован: Чт ноя 20, 2008 8:19 am

Как не пропустить в клиент пакеты?

Сообщение ivano »

Каким образом (и можно ли вообще) не дать клиенту получить пакеты группы npc_talk_*, но при этом обработать их в плагине. Просто в режиме "XKore 1" парят не закрывшиеся чаты с NPC.
Со второй частью вопроса особых проблем не должно возникнуть (повешаюсь на packet_Pre и обработаю).
Последний раз редактировалось ivano Ср июл 21, 2010 8:59 am, всего редактировалось 1 раз.
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Как не пропустить в клиент пакеты npc_talk?

Сообщение 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 - пропустить
    }
}
ivano
Энтузиаст
Сообщения: 74
Зарегистрирован: Чт ноя 20, 2008 8:19 am

Re: Как не пропустить в клиент пакеты npc_talk?

Сообщение 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 совсем не вызывается. Подозреваю что что-то недоделываю. Прошу помощи.
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Как не пропустить в клиент пакеты npc_talk?

Сообщение EternalHarvest »

Примеры только в Receive.pm, да и те какие-то левые.

$args->{messageArgs} то же самое, что $args в обработчиках пакетов в Network::Receive::ServerType0 (разобранный пакет в соответствии со структурой).
Можно проверить так:

Код: Выделить всё

use Data::Dumper; Log::message(Dumper $args);
Странно, что mangle не вызывается. Сам вызов willMangle и mangle в functions.pl - sub parseIncomingMessage, можно попробовать проверить там работает ли всё как надо.
Ответить