Спец. переменная

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

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

Правила форума
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
Fearless
Энтузиаст
Сообщения: 76
Зарегистрирован: Вт окт 05, 2010 5:39 pm
Сервер RO:: aRO

Спец. переменная

Сообщение Fearless »

Итак, ввиду того, что в этой темке viewtopic.php?f=32&t=9348 никаких идей услышать не удалось, пришлось писать что есть "на глаз".

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

automacro ahtung {
console /Sound alert: GM near/i
run-once 1
call {
do p Ahtung Afina
do ai off
do c GM o_O
}
}


automacro GMnear {
console /Sound alert: public gm chat/i
run-once 1
call {
do ai off
do p Ahtung Afina
pause 2
do c Hello
}
}

automacro react {
console /Ahtung Dionis/i
run-once 1
call {
do quit
}
Макрос, безусловно, не был закончен и не имеет продолжения предполагаемого диалога, с ГМ-ом, однако уже спас 2 бота (да, на аРО такое канает, так как все баны идут под видео, и если чар отвечает ГМ-у что-то , то это косяк для них). Однако, после спасения уже 2-х ботов (2 раза одного и 1 раз его пати), успех дальнейших "спасений" становится под вопросом, так как гм-ы тоже могут что-то придумать, поэтому вопрос - как извлечь ник ГМ-а, который пишет боту - хочется чтобы бот отвечал, обращаясь к персональному нику, а не безлично говорил "здравствуйте" ? То есть, активация макроса идет на консоль от alertsound-a (это не хотелось бы менять, так как ГМ может сказать не только "Hi" или "Hello" как приветствие, но и что либо еще) и переменная $.lastpub, разумеется, не возвращает ничего, но я уверен, что из самого плагина можно вытащить ник ГМ-а (сам не смог - никак не владею Перлом), хочу спросить - КАК ? )

p.s.

пример одного из двух (почти синхронных случаев) произошедших сегодня

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

[May 21 13:25:08 2011.26] [13:25] Party EXP set to Even Share
[May 21 13:25:08 2011.52] You are now: MAPPROPERTY_EVENTPVPZONE
[May 21 13:25:08 2011.52] You are now: MAPPROPERTY_TELEPORT
[May 21 13:25:08 2011.53] You are now: MAPPROPERTY_NOTREMEMBER
[May 21 13:25:08 2011.53] You are now: MAPPROPERTY_EXP
[May 21 13:25:08 2011.54] You are now: MAPPROPERTY_CALLMONSTER
[May 21 13:25:08 2011.54] You are now: MAPTYPE_FIELD
[May 21 13:25:08 2011.65] [13:25] Party EXP set to Even Share
[May 21 13:25:08 2011.65] [13:25] Exp gained: 2068/1300 (0.13%/0.16%)
[May 21 13:25:08 2011.80] [13:25] Teleporting to avoid all players
[May 21 13:25:08 2011.89] Sound alert: GM near
[May 21 13:25:08 2011.90] [macro] automacro ahtung triggered.
[May 21 13:25:09 2011.12] [13:25] Player logged: GM Nour
[May 21 13:25:09 2011.14] [13:25] AI turned off
[May 21 13:25:09 2011.15] [13:25] Map Change: cmd_fild01.gat (157, 329)
[May 21 13:25:09 2011.25] [13:25] Party EXP set to Even Share
[May 21 13:25:09 2011.62] You are again: MAPPROPERTY_EVENTPVPZONE
[May 21 13:25:09 2011.62] You are again: MAPPROPERTY_TELEPORT
[May 21 13:25:09 2011.63] You are again: MAPPROPERTY_NOTREMEMBER
[May 21 13:25:09 2011.63] You are again: MAPPROPERTY_EXP
[May 21 13:25:09 2011.64] You are again: MAPPROPERTY_CALLMONSTER
[May 21 13:25:09 2011.64] You are again: MAPTYPE_FIELD
[May 21 13:25:10 2011.15] Dionis : GM o_O
[May 21 13:25:11 2011.41] [13:25] Map Change: cmd_fild01.gat (291, 351)
[May 21 13:25:11 2011.52] You are again: MAPPROPERTY_EVENTPVPZONE
[May 21 13:25:11 2011.52] You are again: MAPPROPERTY_TELEPORT
[May 21 13:25:11 2011.53] You are again: MAPPROPERTY_NOTREMEMBER
[May 21 13:25:11 2011.53] You are again: MAPPROPERTY_EXP
[May 21 13:25:11 2011.54] You are again: MAPPROPERTY_CALLMONSTER
[May 21 13:25:11 2011.54] You are again: MAPTYPE_FIELD
[May 21 13:25:11 2011.55] [13:25] Party EXP set to Even Share
[May 21 13:25:13 2011.83] [13:25] Party EXP set to Even Share
[May 21 13:25:24 2011.14] [13:25] Map Change: cmd_fild01.gat (287, 350)
[May 21 13:25:24 2011.23] [13:25] Party EXP set to Even Share
[May 21 13:25:24 2011.54] You are again: MAPPROPERTY_EVENTPVPZONE
[May 21 13:25:24 2011.54] You are again: MAPPROPERTY_TELEPORT
[May 21 13:25:24 2011.54] You are again: MAPPROPERTY_NOTREMEMBER
[May 21 13:25:24 2011.55] You are again: MAPPROPERTY_EXP
[May 21 13:25:24 2011.55] You are again: MAPPROPERTY_CALLMONSTER
[May 21 13:25:24 2011.56] You are again: MAPTYPE_FIELD
[May 21 13:25:36 2011.23] You are no longer: Increase Agility
[May 21 13:25:37 2011.13] Sound alert: public GM chat
[May 21 13:25:37 2011.13] [macro] automacro GMnear triggered.
[May 21 13:25:37 2011.13] [13:25] AI is already off
[May 21 13:25:37 2011.14] [13:25] [dist=2.2] GM Nour (0): Hello dear
[May 21 13:25:38 2011.54] [13:25] [Party] Dionis : Ahtung Afina
[May 21 13:25:40 2011.77] Sound alert: public GM chat
[May 21 13:25:40 2011.78] [13:25] [dist=2.  2] GM Nour (0): ÃåáÇ ÚÒíÒí
[May 21 13:25:41 2011.10] Dionis : hallo
[May 21 13:25:47 2011.46] Sound alert: public GM chat
[May 21 13:25:47 2011.46] [13:25] [dist=2.2] GM Nour (0): Welcome back
[May 21 13:25:49 2011.86] Sound alert: public GM chat
[May 21 13:25:49 2011.86] [13:25] [dist=2.2] GM Nour (0): Botter
[May 21 13:26:13 2011.62] Sound alert: public GM chat
[May 21 13:26:13 2011.63] [13:26] [dist=2.2] GM Nour (0): r u there ?
[May 21 13:26:45 2011.23] [13:26] [dist=unknown] Unknown #53826: *Whistling*
[May 21 13:26:45 2011.43] [13:26] [dist=unknown] Unknown #53826: *Whistling*
[May 21 13:26:53 2011.29] Sound alert: public GM chat
[May 21 13:26:53 2011.34] [13:26] [dist=3.2] GM Nour (0): u r added to the black list
[May 21 13:26:54 2011.24] You are no longer: Concentration Potion
[May 21 13:26:57 2011.42] Sound alert: public GM chat
[May 21 13:26:57 2011.42] [13:26] [dist=3.2] GM Nour (0): I'll be watching u
[May 21 13:27:00 2011.23] Sound alert: public GM chat
[May 21 13:27:00 2011.23] [13:27] [dist=3.2] GM Nour (0): good luck
[May 21 13:27:01 2011.23] [13:27] [dist=12.6] Monster Savage (0): *Whistling*
[May 21 13:27:01 2011.44] [13:27] [dist=12.6] Monster Savage (0): *Whistling*
[May 21 13:27:01 2011.64] [13:27] Found perfectly hidden Player GM Nour (0)
[May 21 13:27:47 2011.30] [13:27] [dist=1] Monster Savage (0): *Whistling*
[May 21 13:27:47 2011.58] [13:27] [dist=1] Monster Savage (0): *Whistling*
*макрос писался из расчета личного присутствия недалеко от компа и продолжения беседы online, но ... отошел поесть, в итоге этого бота гм таскала раз 5, прежде чем появится на свет.
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Спец. переменная

Сообщение EternalHarvest »

Fearless писал(а):console /Sound alert: GM near/i
гм-ы тоже могут что-то придумать
Тогда для начала стоит прочитать красный текст в мануале по макроплагину. Обрабатывать внешние данные (имена, сообщения чата) макросами - вообще плохая идея, в отсутствие нормального синтаксиса, экранирования и прочего.
как извлечь ник ГМ-а
Там, где "GM Near" есть где-то его ID аккаунта, пусть будет $id. Тогда имя получить можно так: my $gm = Actor::get($id); $gm->{name}
Для случаев, когда ГМ пишет в приват или общий чат, ещё проще (имя уже есть), только сам плагин тоже надо видеть (в svn его нет).
В глобальный чат они теоретически могут писать вообще без имён, или оформляя их в произвольном формате.
Fearless
Энтузиаст
Сообщения: 76
Зарегистрирован: Вт окт 05, 2010 5:39 pm
Сервер RO:: aRO

Re: Спец. переменная

Сообщение Fearless »

Eternal, так как навыками программирования в перле я не обладаю, то приходится использовать то, что есть, а именно макросы и ничто иное(( Я читал красный текст в мануале, однако или я не понял того, что ты хотел сказать мне , или ты переоцениваешь уровень подготовки конкретных данных гм-ов (хотя бы потому, что против них вообще проканала подобная схема).

По второй части ответа - если я , опять же, правильно понимаю, то ты предлагаешь идти путем плагина(или, иначе, съема данных из коры) путем использования перл , судя по синтаксису, однако повторюсь - в перле я zero. Я пробовал "методом тыка" извлечь имя гм-а из alertsound-a, однако это не удалось у меня. Уверен, что это(при написании в общий чат) более, чем просто, но использовать средства плагина не знаю как, а получить имя через $.lastMatch почему-то не получилось (пробовал на обычном public chat-е с обычным чаром)

Это, собственно , alertsound. Можно ли как-то в нем добавить в выводе данных (для случая GM near) ник ГМ-а ? Я реально не умею использовать иные инструменты, кроме макросов(

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

# alertsound plugin by joseph
# Fixed to 1.9.x version by h4rry84
# http://openkore.sourceforge.net/forum/viewtopic.php?t=2032
#
#
# This software is open source, licensed under the GNU General Public
# License, version 2.

package alertsound;

use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);
use Network::Send;
use Utils::Win32;

Plugins::register('alertsound', 'plays sounds on certain events', \&Unload);
my $packetHook = Plugins::addHook('parseMsg/pre', \&CheckPacket);

sub Unload {
        Plugins::delHook('parseMsg/pre', $packetHook);
}

sub CheckPacket {
        return if (!$config{'alertSound'});

        my $hookName = shift;
        my $args = shift;
        my $switch = $args->{switch};
        my $msg = $args->{msg};


        if ($switch eq "008D") {
        # Public chat message.
                my $ID = substr($msg, 4, 4);
                my $msg_size = length($msg);
                my $chat = substr($msg, 8, $msg_size - 8);
                $chat =~ s/\000//g;
                my ($chatMsgUser, $chatMsg) = $chat =~ /([\s\S]*?):([\s\S]*)/;
                $chatMsg =~ s/^ +//;
                $chatMsgUser =~ s/ $//;

                if ($chatMsgUser =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
                        alertSound("public GM chat");
		  } elsif (unpack("V", $ID) == 0) {
                        alertSound("npc chat");
                } else {
                        alertSound("public chat");
                }
        } elsif ($switch eq "0097") {
        # Private chat message.
                my $msg_size = length($msg);
                my $newmsg;
                Network::Receive->decrypt(\$newmsg, substr($msg, 28, length($msg)-28));
                $msg = substr($msg, 0, 28).$newmsg;
                my ($privMsgUser) = substr($msg, 4, 24) =~ /([\s\S]*?)\000/;
                my $privMsg = substr($msg, 28, $msg_size - 29);

                if ($privMsgUser =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
                        alertSound("private GM chat");
                } else {
                        alertSound("private chat");
                }
        } elsif ($switch eq "009A") {
        # System message/GM message (is this always global?)
                alertSound("system message");
        } elsif ($switch eq "00C0") {
        # Emoticon
                my $ID = substr($msg, 2, 4);

                if ($players{$ID} && $ID ne $accountID) {
                        alertSound("emoticon");
                }
        } elsif ($switch eq "0091") {
        # Map change
                alertSound("map change");
        } elsif ($switch eq "0092") {
        # Map change - switching map servers
                alertSound("map change");
        } elsif ($switch eq "0095") {
        # Identify GM Names
                my $ID = substr($msg, 2, 4);

                if ($players{$ID} && %{$players{$ID}}) {
                        my ($name) = substr($msg, 6, 24) =~ /([\s\S]*?)\000/;
                        if ($name =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
                                alertSound("GM near");
                        }
                }
        } elsif ($switch eq "0195") {
        #Identify GM Names
                my $ID = substr($msg, 2, 4);

                if ($players{$ID}) {
                        my ($name) = substr($msg, 6, 24) =~ /([\s\S]*?)\000/;
                        if ($name =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
                                alertSound("GM near");
                        }
                }
        } elsif ($switch eq "0080") {
        # someone disappeared here
                my $ID = substr($msg, 2, 4);

                if ($ID eq $accountID) {
                # You are dead.
                        alertSound("death");
                }
        } elsif ($switch eq "0078") {
        # Existance packet used to tell if monster exists
                my $ID = substr($msg, 2, 4);
                my $type = unpack("S*",substr($msg, 14,  2));
                my $pet = unpack("C*",substr($msg, 16,  1));
                if (!$jobs_lut{$type} && $type >= 1000 && !$pet) {
                        my $display = ($::monsters_lut{$type} ne "")
                                ? $::monsters_lut{$type}
                                : "Unknown ".$type;
                        alertSound("monster $display");
                }
        } elsif ($switch eq "01D8") {
        # Existance packet used to tell if monster exists
                my $ID = substr($msg, 2, 4);
                my $type = unpack("S*",substr($msg, 14,  2));
                my $pet = unpack("C*",substr($msg, 16,  1));
                if (!$jobs_lut{$type} && $type >= 1000 && !$pet) {
                        my $display = ($::monsters_lut{$type} ne "")
                                ? $::monsters_lut{$type}
                                : "Unknown ".$type;
                        alertSound("monster $display");
                }
        }
}


##
# alertSound($event)
# $event: unique event name
#
# Plays a sound if alertSound is enabled,
# and if a sound is specified for the event.
#
# The config option "alertSound_#_eventList" should have a comma
# seperated list of all the desired events.
#
# Supported events:
# public chat, public GM chat, private chat, private GM chat, emoticon, system message
# map change, GM near, monster <monster name>
sub alertSound {
        return if (!$config{'alertSound'});
        my $event = shift;
        my $i = 0;
        for (my $i = 0; exists $config{"alertSound_".$i."_eventList"}; $i++) {
                next if (!$config{"alertSound_".$i."_eventList"});
                if (Utils::existsInList($config{"alertSound_".$i."_eventList"}, $event)
                && (!$config{"alertSound_".$i."_notInTown"} || !$cities_lut{$field{name}.'.rsw'})
                && (!$config{"alertSound_".$i."_inLockOnly"} || $field{name} eq $config{'lockMap'})) {
 
                        message "Sound alert: $event\n", "alertSound";
                        Utils::Win32::playSound($config{"alertSound_".$i."_play"});
                        return;
                }
        }
}

return 1;
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Спец. переменная

Сообщение EternalHarvest »

Можно сразу писать в переменную макро-плагина $gm, сделав примерно такие изменения (не проверял):

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

@@ -43,6 +43,7 @@
                 $chatMsgUser =~ s/ $//;
 
                 if ($chatMsgUser =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
+                        $Macro::Data::varStack{gm} = $chatMsgUser;
                         alertSound("public GM chat");
         } elsif (unpack("V", $ID) == 0) {
                         alertSound("npc chat");
@@ -59,6 +60,7 @@
                 my $privMsg = substr($msg, 28, $msg_size - 29);
 
                 if ($privMsgUser =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
+                        $Macro::Data::varStack{gm} = $privMsgUser;
                         alertSound("private GM chat");
                 } else {
                         alertSound("private chat");
@@ -86,6 +88,7 @@
                 if ($players{$ID} && %{$players{$ID}}) {
                         my ($name) = substr($msg, 6, 24) =~ /([\s\S]*?)\000/;
                         if ($name =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
+                                $Macro::Data::varStack{gm} = $name;
                                 alertSound("GM near");
                         }
                 }
@@ -96,6 +99,7 @@
                 if ($players{$ID}) {
                         my ($name) = substr($msg, 6, 24) =~ /([\s\S]*?)\000/;
                         if ($name =~ /^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/i) {
+                                $Macro::Data::varStack{gm} = $name;
                                 alertSound("GM near");
                         }
                 }
Если надо только вывести, то вместо присваивания сделать вывод сообщения, примерно так: message "Text $variable text\n".
Fearless
Энтузиаст
Сообщения: 76
Зарегистрирован: Вт окт 05, 2010 5:39 pm
Сервер RO:: aRO

Re: Спец. переменная

Сообщение Fearless »

А чтобы попробовать можно было бы еще увидеть как будет выглядеть кусок плагина не для ГМ-а, а для любого игрока (ну чтобы тесты провести) ?
Мне в принципе нужен не только вывод ника, а его ... даже не знаю как сказать "сейв" в чем-то, чтобы можно было использовать ник в макросе приветствия, но я полагаю, что если он будет хотя бы выводится (до начала ГМ-ом чата), то его можно будет вытащить из consol-и с помощью regexp.
Вообще суть моей затеи в том, чтобы бот упреждая ГМ-а начинал общаться как человек (так как для данных ГМ-ов) это будет достаточным признаком "человечности" на какое-то время. Да , и в основном, мои боты работают только когда я онлайн, так что по сути это мера предосторожности на сам момент встречи, потому что сколько я не старался, но пока мне не удается написать макрос, который бы отслеживал попадание бота в одну и ту же точку на локации за X времени.
И спасибо за уже оказанную помощь.
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Спец. переменная

Сообщение EternalHarvest »

Fearless писал(а):А чтобы попробовать можно было бы еще увидеть как будет выглядеть кусок плагина не для ГМ-а, а для любого игрока (ну чтобы тесты провести)?
То же самое, но вне этих проверок (/^([a-z]?ro)?-?(Sub)?-?\[?GM\]?/).
Fearless
Энтузиаст
Сообщения: 76
Зарегистрирован: Вт окт 05, 2010 5:39 pm
Сервер RO:: aRO

Re: Спец. переменная

Сообщение Fearless »

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

Re: Спец. переменная

Сообщение kLabMouse »

EternalHarvest
Я боюсь сказать. Но если например ГМ будет в своём Хайде, то Кора его имя не запросит. (ТК, ей запрещено запрашивать имя того кого она не видит).
Fearless
Энтузиаст
Сообщения: 76
Зарегистрирован: Вт окт 05, 2010 5:39 pm
Сервер RO:: aRO

Re: Спец. переменная

Сообщение Fearless »

Ммм... собственно именно поэтому я и хотел обратится к alertsound-у, так как 4 ГМ-а из 5-ти на аРО сперва здороваются из своего перфект-хайда, а затем только появляются и весь эффект "неожиданности" и доказательства "человечности" бота (так как банят они с видео и такое видео с баном они просто не смогут выложить) заключается в том, что бот вроде как не может увидеть ГМ-а в хайде, но обращается персонально к нему -> значит это не бот и он все видит. Если бы не в этом была суть, то я пробовал бы ковырять Recordplayer.

p.s. тут правда пока тоже нихера не получилось - Perl все-таки сильно отличается от иных языков, которые я когда-то изучал.
Ответить