доработал немного плагин, вот что получилось:
+ добавил проверку на SelfCondition, это значит что теперь можно использовать следующие условия:
Код: Выделить всё
disabled
whenIdle
manualAI
hp
sp
homunculus_hp
homunculus_sp
homunculus_dead
aggressives
partyAggressives
stopWhenHit
whenFollowing
whenStatusActive
whenStatusInactive
onAction
notOnAction
spirit
timeout (не работает!)
inLockOnly
notWhileSitting
notInTown
monsters
defendMonsters
notMonsters
inInventory
inCart
whenGround
whenNotGround
whenPermitSkill
whenNotPermitSkill
whenFlag
whenNotFlag
onlyWhenSafe
inMap
notInMap
whenEquipped
whenNotEquipped
zeny
whenWater (возможно не работает)
согласен что некоторые условия никогда использоваться не будут, но зато теперь существует тонкая настройка звука
+ для событий "public GM chat", "public chat", "private GM chat", "private chat" и "emoticon" добавились дополнительные условия условия "Players" и "notPlayers"
Players - играть звук если игрок показавший эмоцию или сказавший в чат находится в данном списке (имена пишутся через запятую)
notPlayers - играть звук для всех, кроме этого списка
Например:
допустим игрок [GM]#05 и 4epT наши братаны и никогда нас банить не будут, зачем нам тогда на них пищать??
Код: Выделить всё
alertSound - {
eventList public GM chat, private GM chat, emoticon
play sounds\peep.wav
notPlayers [GM]#05, 4epT
}
допустим нам в приват пишут много поклонниц, но наше сердце принадлежит одной, от которой мы не хотим пропустить сообщения:
Код: Выделить всё
alertSound - {
eventList private chat, emoticon
play sounds\love.wav
Players AHHA
}
скачать плагин можно
отсюда
в будущем планирую добавить обработки ги-чата и пати-чата
Код: Выделить всё
# alertsound plugin by joseph
# Fixed to 1.9.x version by h4rry84
# Edib by 4epT (ICQ: 2227733)
# http://bibian.ath.cx/openkore/viewtopic.php?t=2032
# http://forums.openkore.com/viewtopic.php?f=34&t=1490
#
# This software is open source, licensed under the GNU General Public
# License, version 3.
package alertsound;
use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);
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", $chatMsgUser);
} elsif (unpack("V", $ID) == 0) {
alertSound("npc chat");
} else {
alertSound("public chat", $chatMsgUser);
}
} 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", $privMsgUser);
} else {
alertSound("private chat", $privMsgUser);
}
} elsif ($switch eq "00D7") {
# chat msg
alertSound("chat room");
} 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", $playersList->getByID($ID)->name);
}
} 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 GM chat, npc chat, public chat, private GM chat, private chat, chat room
# system message, emoticon, map change, GM near, death, monster <monster name>
sub alertSound {
return if (!$config{'alertSound'});
my $event = shift;
my $MsgUser = 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)
&& main::checkSelfCondition("alertSound_$i")
&& !Utils::existsInList($config{"alertSound_".$i."_notPlayers"}, $MsgUser)) {
return if ($config{"alertSound_".$i."_Players"} && !Utils::existsInList($config{"alertSound_".$i."_Players"}, $MsgUser));
message "Sound alert: $event\n", "alertSound";
Utils::Win32::playSound($config{"alertSound_".$i."_play"});
}
}
}
return 1;