Страница 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, можно попробовать проверить там работает ли всё как надо.