diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index 25c2e7a7..b855106d 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -52,6 +52,13 @@ SayModes = { [3] = { speakTypeDesc = 'yell', icon = '/images/game/console/yell' } } +ChannelEventFormats = { + [ChannelEvent.Join] = '%s joined the channel.', + [ChannelEvent.Leave] = '%s left the channel.', + [ChannelEvent.Invite] = '%s has been invited to the channel.', + [ChannelEvent.Exclude] = '%s has been removed from the channel.', +} + MAX_HISTORY = 500 MAX_LINES = 100 HELP_CHANNEL = 9 @@ -98,7 +105,8 @@ function init() onRuleViolationCancel = onRuleViolationCancel, onRuleViolationLock = onRuleViolationLock, onGameStart = online, - onGameEnd = offline + onGameEnd = offline, + onChannelEvent = onChannelEvent, }) consolePanel = g_ui.loadUI('console', modules.game_interface.getBottomPanel()) @@ -240,7 +248,8 @@ function terminate() onRuleViolationCancel = onRuleViolationCancel, onRuleViolationLock = onRuleViolationLock, onGameStart = online, - onGameEnd = offline + onGameEnd = offline, + onChannelEvent = onChannelEvent, }) if g_game.isOnline() then clear() end @@ -684,7 +693,7 @@ function addTabText(text, speaktype, tab, creatureName) child:setSelection(string.len(child:getText()), textPos) end end - + return true end @@ -857,14 +866,14 @@ function sendMessage(message, tab) message = chatCommandMessage channel = 0 end - + -- player red talk on channel chatCommandMessage = message:match("^%#[c|C] (.*)") if chatCommandMessage ~= nil then chatCommandSayMode = 'channelRed' message = chatCommandMessage end - + -- player broadcast chatCommandMessage = message:match("^%#[b|B] (.*)") if chatCommandMessage ~= nil then @@ -1437,3 +1446,19 @@ function offline() end clear() end + +function onChannelEvent(channelId, name, type) + local fmt = ChannelEventFormats[type] + if not fmt then + print(('Unknown channel event type (%d).'):format(type)) + return + end + + local channel = channels[channelId] + if channel then + local tab = getTab(channel) + if tab then + addTabText(fmt:format(name), SpeakTypesSettings.channelOrange, tab) + end + end +end diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index dbd18531..29df1f1b 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -333,4 +333,11 @@ SubscriptionStatus = { Premium = 1, } +ChannelEvent = { + Join = 0, + Leave = 1, + Invite = 2, + Exclude = 3, +} + -- @} diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 5bb49816..caf0fad5 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -1296,7 +1296,7 @@ void ProtocolGame::parsePremiumTrigger(const InputMessagePtr& msg) for(int i=0;igetU8()); } - + if(g_game.getClientVersion() <= 1096) { bool something = msg->getU8() == 1; } @@ -1903,9 +1903,11 @@ void ProtocolGame::parseQuestLine(const InputMessagePtr& msg) void ProtocolGame::parseChannelEvent(const InputMessagePtr& msg) { - msg->getU16(); // channel id - g_game.formatCreatureName(msg->getString()); // player name - msg->getU8(); // event type + uint16 channelId = msg->getU16(); + std::string name = g_game.formatCreatureName(msg->getString()); + uint8 type = msg->getU8(); + + g_lua.callGlobalField("g_game", "onChannelEvent", channelId, name, type); } void ProtocolGame::parseItemInfo(const InputMessagePtr& msg)