diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptLoader.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 21 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/ChatHandler.cpp | 110 | ||||
-rw-r--r-- | src/server/scripts/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/server/scripts/World/chat_log.cpp | 164 |
7 files changed, 231 insertions, 103 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a0d830ff7e8..9ba259f8c88 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18577,35 +18577,29 @@ void Player::BuildPlayerChat(WorldPacket *data, uint8 msgtype, const std::string void Player::Say(const std::string& text, const uint32 language) { + sScriptMgr.OnPlayerChat(this, CHAT_MSG_SAY, language, text); + WorldPacket data(SMSG_MESSAGECHAT, 200); BuildPlayerChat(&data, CHAT_MSG_SAY, text, language); SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),true); - - if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) - sLog.outChat("[SAY] Player %s says (language %u): %s", - GetName(), language, text.c_str()); } void Player::Yell(const std::string& text, const uint32 language) { + sScriptMgr.OnPlayerChat(this, CHAT_MSG_YELL, language, text); + WorldPacket data(SMSG_MESSAGECHAT, 200); BuildPlayerChat(&data, CHAT_MSG_YELL, text, language); SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_YELL),true); - - if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) - sLog.outChat("[YELL] Player %s yells (language %u): %s", - GetName(), language, text.c_str()); } void Player::TextEmote(const std::string& text) { + sScriptMgr.OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, text); + WorldPacket data(SMSG_MESSAGECHAT, 200); BuildPlayerChat(&data, CHAT_MSG_EMOTE, text, LANG_UNIVERSAL); SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE),true, !sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT)); - - if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) - sLog.outChat("[TEXTEMOTE] Player %s emotes: %s", - GetName(), text.c_str()); } void Player::Whisper(const std::string& text, uint32 language,uint64 receiver) @@ -18615,9 +18609,7 @@ void Player::Whisper(const std::string& text, uint32 language,uint64 receiver) Player *rPlayer = sObjectMgr.GetPlayer(receiver); - if (sWorld.getConfig(CONFIG_CHATLOG_WHISPER)) - sLog.outChat("[WHISPER] Player %s tells %s: %s", - GetName(), rPlayer->GetName(), text.c_str()); + sScriptMgr.OnPlayerChat(this, CHAT_MSG_WHISPER, language, text, rPlayer); // when player you are whispering to is dnd, he cannot receive your message, unless you are in gm mode if (!rPlayer->isDND() || isGameMaster()) diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index cc29d4fdc43..75b223f541a 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -535,6 +535,9 @@ void AddSC_outdoorpvp_si(); void AddSC_outdoorpvp_tf(); void AddSC_outdoorpvp_zm(); +// player +void AddSC_chat_log(); + #endif void AddScripts() @@ -597,6 +600,7 @@ void AddWorldScripts() AddSC_npcs_special(); AddSC_npc_taxi(); AddSC_achievement_scripts(); + AddSC_chat_log(); #endif } diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index eb907d1e6e4..52781455c96 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1112,19 +1112,19 @@ void ScriptMgr::OnPlayerReputationChange(Player *player, uint32 factionID, int32 FOREACH_SCRIPT(PlayerScript)->OnReputationChange(player, factionID, standing, incremental); } -void ScriptMgr::OnPlayerChat(WorldSession *session, uint32 type, uint32 lang, std::string msg, std::string toOrChannel) +void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string msg, void* param) { - FOREACH_SCRIPT(PlayerScript)->OnChat(session, type, lang, msg, toOrChannel); + FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, param); } -void ScriptMgr::OnPlayerEmote(WorldSession *session, uint32 emote) +void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote) { - FOREACH_SCRIPT(PlayerScript)->OnEmote(session, emote); + FOREACH_SCRIPT(PlayerScript)->OnEmote(player, emote); } -void ScriptMgr::OnPlayerTextEmote(WorldSession *session, uint32 text_emote, uint32 emoteNum, uint64 guid) +void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 text_emote, uint32 emoteNum, uint64 guid) { - FOREACH_SCRIPT(PlayerScript)->OnTextEmote(session, text_emote, emoteNum, guid); + FOREACH_SCRIPT(PlayerScript)->OnTextEmote(player, text_emote, emoteNum, guid); } SpellHandlerScript::SpellHandlerScript(const char* name) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 1767ea92562..9442c38ea0a 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -687,12 +687,19 @@ public: // Called when a player's reputation changes (before it is actually changed) virtual void OnReputationChange(Player *player, uint32 factionID, int32& standing, bool incremental) { } - // Called when a player sends a chat message. toOrChannel is empty when type is neither whisper nor channel - virtual void OnChat(WorldSession *session, uint32 type, uint32 lang, std::string msg, std::string toOrChannel) { } + // Called when a player sends a chat message. param depends on the chat type: + // CHAT_MSG_WHISPER - Player*: receiver; + // CHAT_MSG_PARTY, CHAT_MSG_PARTY_LEADER - Group*: group of player; + // CHAT_MSG_OFFICER, CHAT_MSG_GUILD - Guild*: guild of player; + // CHAT_MSG_RAID, CHAT_MSG_RAID_LEADER, CHAT_MSG_RAID_WARNING - Group*: group of player; + // CHAT_MSG_BATTLEGROUND, CHAT_MSG_BATTLEGROUND_LEADER - Group*: group of player; + // CHAT_MSG_CHANNEL - Channel*: channel player speaks to; + // other - NULL. + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string msg, void* param = NULL) { } // Both of the below are called on emote opcodes - virtual void OnEmote(WorldSession *session, uint32 emote) { } - virtual void OnTextEmote(WorldSession *session, uint32 text_emote, uint32 emoteNum, uint64 guid) { } + virtual void OnEmote(Player* player, uint32 emote) { } + virtual void OnTextEmote(Player* player, uint32 text_emote, uint32 emoteNum, uint64 guid) { } }; // Placed here due to ScriptRegistry::AddScript dependency. @@ -877,9 +884,9 @@ class ScriptMgr void OnPlayerMoneyChanged(Player *player, int32& amount); void OnGivePlayerXP(Player *player, uint32& amount, Unit *victim); void OnPlayerReputationChange(Player *player, uint32 factionID, int32& standing, bool incremental); - void OnPlayerChat(WorldSession *session, uint32 type, uint32 lang, std::string msg, std::string toOrChannel); - void OnPlayerEmote(WorldSession *session, uint32 emote); - void OnPlayerTextEmote(WorldSession *session, uint32 text_emote, uint32 emoteNum, uint64 guid); + void OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string msg, void* param = NULL); + void OnPlayerEmote(Player* player, uint32 emote); + void OnPlayerTextEmote(Player* player, uint32 text_emote, uint32 emoteNum, uint64 guid); public: /* ScriptRegistry */ diff --git a/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp b/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp index d13eeab8f03..3f8678603de 100644 --- a/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp @@ -119,8 +119,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) return; } - sLog.outChat("[ADDON] Player %s sends: %s", - GetPlayer()->GetName(), msg.c_str()); + sScriptMgr.OnPlayerChat(GetPlayer(), CHAT_MSG_ADDON, lang, msg); } // Disabled addon channel? @@ -193,7 +192,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -226,7 +224,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) std::string to, msg; recv_data >> to; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, to); if (_player->getLevel() < sWorld.getConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ)) { @@ -280,7 +277,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -306,20 +302,17 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if ((type == CHAT_MSG_PARTY_LEADER) && !group->IsLeader(_player->GetGUID())) return; + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; ChatHandler::FillMessageData(&data, this, type, lang, NULL, 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID())); - - if (sWorld.getConfig(CONFIG_CHATLOG_PARTY)) - sLog.outChat("[PARTY] Player %s tells group with leader %s: %s", - GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str()); } break; case CHAT_MSG_GUILD: { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -335,20 +328,11 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (GetPlayer()->GetGuildId()) { - Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); + if (Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId())) + { + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, guild); - if (guild) guild->BroadcastToGuild(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); - - if (lang != LANG_ADDON && sWorld.getConfig(CONFIG_CHATLOG_GUILD)) - { - sLog.outChat("[GUILD] Player %s tells guild %s: %s", - GetPlayer()->GetName(), guild->GetName().c_str(), msg.c_str()); - } - else if (lang == LANG_ADDON && sWorld.getConfig(CONFIG_CHATLOG_ADDON)) - { - sLog.outChat("[ADDON] Player %s sends to guild %s: %s", - GetPlayer()->GetName(), guild->GetName().c_str(), msg.c_str()); } } @@ -358,7 +342,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -374,14 +357,12 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (GetPlayer()->GetGuildId()) { - Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); + if (Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId())) + { + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, guild); - if (guild) guild->BroadcastToOfficers(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); - - if (sWorld.getConfig(CONFIG_CHATLOG_GUILD)) - sLog.outChat("[OFFICER] Player %s tells guild %s officers: %s", - GetPlayer()->GetName(), guild->GetName().c_str(), msg.c_str()); + } } break; } @@ -389,7 +370,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -412,19 +392,16 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) return; } + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID, lang, "", 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false); - - if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) - sLog.outChat("[RAID] Player %s tells raid with leader %s: %s", - GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str()); } break; case CHAT_MSG_RAID_LEADER: { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty()) break; @@ -447,19 +424,16 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) return; } + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_LEADER, lang, "", 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false); - - if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) - sLog.outChat("[RAID] Leader player %s tells raid: %s", - GetPlayer()->GetName(), msg.c_str()); } break; case CHAT_MSG_RAID_WARNING: { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (!processChatmessageFurtherAfterSecurityChecks(msg, lang)) return; @@ -471,21 +445,18 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (!group || !group->isRaidGroup() || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup()) return; + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; //in battleground, raid warning is sent only to players in battleground - code is ok ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_WARNING, lang, "", 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false); - - if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) - sLog.outChat("[RAID] Leader player %s warns raid with: %s", - GetPlayer()->GetName(), msg.c_str()); } break; case CHAT_MSG_BATTLEGROUND: { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (!processChatmessageFurtherAfterSecurityChecks(msg, lang)) return; @@ -498,20 +469,17 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (!group || !group->isBGGroup()) return; + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; ChatHandler::FillMessageData(&data, this, CHAT_MSG_BATTLEGROUND, lang, "", 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false); - - if (sWorld.getConfig(CONFIG_CHATLOG_BGROUND)) - sLog.outChat("[BATTLEGROUND] Player %s tells battleground with leader %s: %s", - GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str()); } break; case CHAT_MSG_BATTLEGROUND_LEADER: { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (!processChatmessageFurtherAfterSecurityChecks(msg, lang)) return; @@ -524,13 +492,11 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (!group || !group->isBGGroup() || !group->IsLeader(GetPlayer()->GetGUID())) return; + sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, group); + WorldPacket data; ChatHandler::FillMessageData(&data, this, CHAT_MSG_BATTLEGROUND_LEADER, lang, "", 0, msg.c_str(), NULL); group->BroadcastPacket(&data, false); - - if (sWorld.getConfig(CONFIG_CHATLOG_BGROUND)) - sLog.outChat("[RAID] Leader player %s tells battleground: %s", - GetPlayer()->GetName(), msg.c_str()); } break; case CHAT_MSG_CHANNEL: @@ -538,16 +504,15 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) std::string channel, msg; recv_data >> channel; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, channel); if (!processChatmessageFurtherAfterSecurityChecks(msg, lang)) return; - if (_player->getLevel() < sWorld.getConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ)) - { - SendNotification(GetTrinityString(LANG_CHANNEL_REQ), sWorld.getConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ)); - return; - } + if (_player->getLevel() < sWorld.getConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ)) + { + SendNotification(GetTrinityString(LANG_CHANNEL_REQ), sWorld.getConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ)); + return; + } if (msg.empty()) break; @@ -557,18 +522,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (Channel *chn = cMgr->GetChannel(channel, _player)) { - chn->Say(_player->GetGUID(), msg.c_str(), lang); + sScriptMgr.OnPlayerChat(_player, type, lang, msg, chn); - if ((chn->HasFlag(CHANNEL_FLAG_TRADE) || - chn->HasFlag(CHANNEL_FLAG_GENERAL) || - chn->HasFlag(CHANNEL_FLAG_CITY) || - chn->HasFlag(CHANNEL_FLAG_LFG)) && - sWorld.getConfig(CONFIG_CHATLOG_SYSCHAN)) - sLog.outChat("[SYSCHAN] Player %s tells channel %s: %s", - GetPlayer()->GetName(), chn->GetName().c_str(), msg.c_str()); - else if (sWorld.getConfig(CONFIG_CHATLOG_CHANNEL)) - sLog.outChat("[CHANNEL] Player %s tells channel %s: %s", - GetPlayer()->GetName(), chn->GetName().c_str(), msg.c_str()); + chn->Say(_player->GetGUID(), msg.c_str(), lang); } } } break; @@ -577,7 +533,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if ((msg.empty() || !_player->isAFK()) && !_player->isInCombat()) { @@ -587,6 +542,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) msg = GetTrinityString(LANG_PLAYER_AFK_DEFAULT); _player->afkMsg = msg; } + + sScriptMgr.OnPlayerChat(_player, type, lang, msg); + _player->ToggleAFK(); if (_player->isAFK() && _player->isDND()) _player->ToggleDND(); @@ -597,7 +555,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) { std::string msg; recv_data >> msg; - sScriptMgr.OnPlayerChat(this, type, lang, msg, ""); if (msg.empty() || !_player->isDND()) { @@ -607,6 +564,9 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) msg = GetTrinityString(LANG_PLAYER_DND_DEFAULT); _player->dndMsg = msg; } + + sScriptMgr.OnPlayerChat(_player, type, lang, msg); + _player->ToggleDND(); if (_player->isDND() && _player->isAFK()) _player->ToggleAFK(); @@ -626,7 +586,7 @@ void WorldSession::HandleEmoteOpcode(WorldPacket & recv_data) uint32 emote; recv_data >> emote; - sScriptMgr.OnPlayerEmote(this, emote); + sScriptMgr.OnPlayerEmote(GetPlayer(), emote); GetPlayer()->HandleEmoteCommand(emote); } @@ -681,7 +641,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket & recv_data) recv_data >> emoteNum; recv_data >> guid; - sScriptMgr.OnPlayerTextEmote(this, text_emote, emoteNum, guid); + sScriptMgr.OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid); EmotesTextEntry const *em = sEmotesTextStore.LookupEntry(text_emote); if (!em) diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index ae9ba964eca..a1b22f8d4b4 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -84,6 +84,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat + ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/game/Combat diff --git a/src/server/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp new file mode 100644 index 00000000000..f958ec8f240 --- /dev/null +++ b/src/server/scripts/World/chat_log.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ScriptPCH.h" +#include "Channel.h" +#include "Guild.h" + +class ChatLogScript : public PlayerScript +{ +public: + ChatLogScript() : PlayerScript("ChatLogScript") { } + + void OnChat(Player* player, uint32 type, uint32 lang, std::string msg, void* param) + { + switch (type) + { + case CHAT_MSG_ADDON: + if (sWorld.getConfig(CONFIG_CHATLOG_ADDON)) + sLog.outChat("[ADDON] Player %s sends: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_SAY: + if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) + sLog.outChat("[SAY] Player %s says (language %u): %s", + player->GetName(), lang, msg.c_str()); + break; + + case CHAT_MSG_EMOTE: + if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) + sLog.outChat("[TEXTEMOTE] Player %s emotes: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_YELL: + if (sWorld.getConfig(CONFIG_CHATLOG_PUBLIC)) + sLog.outChat("[YELL] Player %s yells (language %u): %s", + player->GetName(), lang, msg.c_str()); + break; + + case CHAT_MSG_WHISPER: + if (sWorld.getConfig(CONFIG_CHATLOG_WHISPER)) + { + Player* pReceiver = reinterpret_cast <Player*> (param); + sLog.outChat("[WHISPER] Player %s tells %s: %s", + player->GetName(), pReceiver ? pReceiver->GetName() : "<unknown>", msg.c_str()); + } + break; + + case CHAT_MSG_PARTY: + if (sWorld.getConfig(CONFIG_CHATLOG_PARTY)) + { + Group* pGroup = reinterpret_cast <Group*> (param); + sLog.outChat("[PARTY] Player %s tells group with leader %s: %s", + player->GetName(), pGroup ? pGroup->GetLeaderName() : "<unknown>", msg.c_str()); + } + break; + + case CHAT_MSG_PARTY_LEADER: + if (sWorld.getConfig(CONFIG_CHATLOG_PARTY)) + sLog.outChat("[PARTY] Leader %s tells group: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_GUILD: + { + Guild* pGuild = reinterpret_cast <Guild*> (param); + if (lang != LANG_ADDON && sWorld.getConfig(CONFIG_CHATLOG_GUILD)) + { + sLog.outChat("[GUILD] Player %s tells guild %s: %s", + player->GetName(), pGuild ? pGuild->GetName().c_str() : "<unknown>", msg.c_str()); + } + else if (lang == LANG_ADDON && sWorld.getConfig(CONFIG_CHATLOG_ADDON)) + { + sLog.outChat("[ADDON] Player %s sends to guild %s: %s", + player->GetName(), pGuild ? pGuild->GetName().c_str() : "<unknown>", msg.c_str()); + } + break; + } + + case CHAT_MSG_OFFICER: + if (sWorld.getConfig(CONFIG_CHATLOG_GUILD)) + { + Guild* pGuild = reinterpret_cast <Guild*> (param); + sLog.outChat("[OFFICER] Player %s tells guild %s officers: %s", + player->GetName(), pGuild ? pGuild->GetName().c_str() : "<unknown>", msg.c_str()); + } + break; + + case CHAT_MSG_RAID: + if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) + { + Group* pGroup = reinterpret_cast <Group*> (param); + sLog.outChat("[RAID] Player %s tells raid with leader %s: %s", + player->GetName(), pGroup ? pGroup->GetLeaderName() : "<unknown>", msg.c_str()); + } + break; + + case CHAT_MSG_RAID_LEADER: + if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) + sLog.outChat("[RAID] Leader player %s tells raid: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_RAID_WARNING: + if (sWorld.getConfig(CONFIG_CHATLOG_RAID)) + sLog.outChat("[RAID] Leader player %s warns raid with: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_BATTLEGROUND: + if (sWorld.getConfig(CONFIG_CHATLOG_BGROUND)) + { + Group* pGroup = reinterpret_cast <Group*> (param); + sLog.outChat("[BATTLEGROUND] Player %s tells battleground with leader %s: %s", + player->GetName(), pGroup ? pGroup->GetLeaderName() : "<unknown>", msg.c_str()); + } + break; + + case CHAT_MSG_BATTLEGROUND_LEADER: + if (sWorld.getConfig(CONFIG_CHATLOG_BGROUND)) + sLog.outChat("[RAID] Leader player %s tells battleground: %s", + player->GetName(), msg.c_str()); + break; + + case CHAT_MSG_CHANNEL: + { + Channel* pChannel = reinterpret_cast <Channel*> (param); + bool isSystem = pChannel && + (pChannel->HasFlag(CHANNEL_FLAG_TRADE) || + pChannel->HasFlag(CHANNEL_FLAG_GENERAL) || + pChannel->HasFlag(CHANNEL_FLAG_CITY) || + pChannel->HasFlag(CHANNEL_FLAG_LFG)); + if (sWorld.getConfig(CONFIG_CHATLOG_SYSCHAN) && isSystem) + sLog.outChat("[SYSCHAN] Player %s tells channel %s: %s", + player->GetName(), pChannel->GetName().c_str(), msg.c_str()); + else if (sWorld.getConfig(CONFIG_CHATLOG_CHANNEL)) + sLog.outChat("[CHANNEL] Player %s tells channel %s: %s", + player->GetName(), pChannel ? pChannel->GetName().c_str() : "<unknown>", msg.c_str()); + break; + } + } + } +}; + +void AddSC_chat_log() +{ + new ChatLogScript(); +} |