automacro hook/saveN bug - нужна проверка и помошь

Дополнения к OpenKore, расширяющиее её функциональность, называются плагинами.

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

DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

automacro hook/saveN bug - нужна проверка и помошь

Сообщение DInvalid »

Есть такая вешь в automacro - hook
hook <hookname>
triggers when openkore calls <hookname>.
saveN <hash key>
(use in combination with hook)
saves the value of <hash key> in a variable .hooksave1 to .hooksaveN
Вот мой код:
automacro player1 {
hook player
save0 player
call LogPlayer
}
macro LogPlayer {
log Player Hook!
log $.hooksave0
}
Не работает, причем весьма подозрительно, выдавая следующую
ошибку:

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

[Feb 16 18:24:39 2007.29] [console] [macro] $args->{ARRAY(0x4a4ced0)} does not exist
Печатается это тут:
if (defined $args->{$save}) {setVar(".hooksave$s", $args->{$save})}
else {error "[macro] \$args->{$save} does not exist\n"}

вывод - или $save инициализируется неправильно, или проверяется не правильно, но оно дожно иметь знаечение не ссылки на массив, а значение 'player'.

Просьба проверить кто может работу этого макроса на последней сборке Коре
И какие идеи есть как это исправить?
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Оффтоп!

Очевидно, этот автомакрос будет вызываться очень-очень часто. Я бы вообще не делал такую х-ню макросом!.... Есть же плагинчеги, типо там плеер рекордер. Например...

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

######################################################
# This plugin is licensed under the GNU GPL          #
# Copyright 2005 by isieo                            #
# contact : - isieo <AT> *NOSPAM* G*MAIL <DOT> COM   #
# -------------------------------------------------- #
# -------------------------------------------------- #
# playerrecorder.pl                                  #
# Records Player's name together with AIDs           #
# Usefull for players to findout other players' other#
# characters...                                      #
#                                                    #
######################################################

package playerRecord;
use strict;
use Plugins;
use Log qw(message);
use Globals;

Plugins::register("prec", "playerRecord", \&on_unload, \&on_reload);
my $hooks = Plugins::addHooks(
        ['charNameUpdate', \&write_player],
);
my $datadir = $Plugins::current_plugin_folder;

sub on_unload {
        # This plugin is about to be unloaded; remove hooks
        Plugins::delHook("charNameUpdate", $hooks);
}

sub on_reload {
}

sub write_player {
        my $hookname = shift;
        my $args = shift;
        my $targetId = unpack("V1",$args->{ID});
        my $targetName = $args->{name};
        my $file = "$datadir\\players.txt";

        my ($uId, $name);
        my $exist=0;
        my $line;
        open FILE, "< $file";
        foreach (<FILE>){
                next if (/^#/);
                s/[\r\n]//g;
                s/\s+$//g;
                $line = $_;
           ($uId, $name ) = $line =~ /^(\d+) (.*)$/;
           if ($uId eq $targetId && $name eq $targetName){
                $exist=1;
           }
        }
        close FILE;
        if (!$exist){
          message $name.$targetName."\n";
          open FILE, ">> $file";
          print FILE "$targetId $targetName\n" if ($targetName) ;
          close FILE;
        }
}

1;
(Это под 1.9.0, не уверен что оно работает с 1.9.3).
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Оффтоп: что значть очень и очень часто?
Каждый раз когда вызывается хук player он и будет вызываться.
Мне это и надо, вообще то...
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

DInvalid
Видимо ты не посмотрел названия индексов в масиве который передаётся на хук. Глянь внимательно, оно пытается найти по хешу. а не по названию
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Во, Маус, глянь пожалуйста, если бует время, мне кажется это баг все таки в макро плугине. Оно пытается найти по ссылка на массив, а должно обращаться к хэшу по названию поля, т.е. $save должно быть равно 'player', а оно равно ARRAY(0x4a4ced0) т.е. ссылке на массив

if (defined $args->{$save}) {setVar(".hooksave$s", $args->{$save})}
else {error "[macro] \$args->{$save} does not exist\n"}

Если я заменяю $save на $$save[0] то оно даже работает... т.е. я обращаюсь к 0 элементу массива на которое ссылается $save

Названия полей хэша я глянул, вроде не совсем нуп. Вот вызов хука:
# Shouldn't this have a more specific hook name?
Plugins::callHook('player', {player => $actor});

в плугине пишу
sub player {
my $hookName = shift;
my $args = shift;
my $switch = $args->{'player'};

...

Вот, но не могу понять как это $save устанавливается так, что становится массивом.
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

DInvalid
Всё вроде ясно. в $save не записывается строка. посмотри почему оно туда не пишется. (просто я не дома, нет времени качать, смотреть)
Ответить