aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNay <dnpd.dd@gmail.com>2012-08-04 15:58:09 +0100
committerNay <dnpd.dd@gmail.com>2012-08-04 15:58:09 +0100
commit5518daa74b6db8852ca000ee4e3a3fee0418596b (patch)
treee7a6ab946285d1013d7dc9fd015e1348ab1e2630 /src
parent17e852d9b3c7a28a66934e7ec9d7ab00a770d06d (diff)
Core/Chat: Send addon prefix in addon messages
Correct structure of some CMSG_MESSAGECHAT_ADDON_x opcodes Fix a compile error in HandleReforgeItemOpcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp11
-rwxr-xr-xsrc/server/game/Chat/Chat.h2
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp39
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h3
-rwxr-xr-xsrc/server/game/Guilds/Guild.cpp14
-rwxr-xr-xsrc/server/game/Guilds/Guild.h1
-rwxr-xr-xsrc/server/game/Handlers/ChatHandler.cpp57
-rwxr-xr-xsrc/server/game/Handlers/ItemHandler.cpp2
8 files changed, 86 insertions, 43 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 8a6b668b7f2..b95b5f41921 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -747,7 +747,7 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
}
//Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
-void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker)
+void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker, const char* addonPrefix /*= NULL*/)
{
uint32 messageLength = (message ? strlen(message) : 0) + 1;
@@ -823,9 +823,16 @@ void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint
{
ASSERT(channelName);
*data << channelName;
+ *data << uint64(target_guid);
}
+ else if (type == CHAT_MSG_ADDON)
+ {
+ ASSERT(addonPrefix);
+ *data << addonPrefix;
+ }
+ else
+ *data << uint64(target_guid);
- *data << uint64(target_guid);
*data << uint32(messageLength);
*data << message;
if (session != 0 && type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 95f14bc2a3a..84a2b601472 100755
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -51,7 +51,7 @@ class ChatHandler
explicit ChatHandler(Player* player) : m_session(player->GetSession()) {}
virtual ~ChatHandler() {}
- static void FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker);
+ static void FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker, const char* addonPrefix = NULL);
void FillMessageData(WorldPacket* data, uint8 type, uint32 language, uint64 target_guid, const char* message)
{
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2b08ffb38d8..6b786b79985 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -20046,13 +20046,16 @@ void Player::StopCastingCharm()
}
}
-inline void Player::BuildPlayerChat(WorldPacket* data, uint8 msgtype, const std::string& text, uint32 language) const
+inline void Player::BuildPlayerChat(WorldPacket* data, uint8 msgtype, const std::string& text, uint32 language, const char* addonPrefix /*= NULL*/) const
{
*data << uint8(msgtype);
*data << uint32(language);
*data << uint64(GetGUID());
*data << uint32(0); // constant unknown time
- *data << uint64(GetGUID());
+ if (addonPrefix)
+ *data << addonPrefix;
+ else
+ *data << uint64(GetGUID());
*data << uint32(text.length() + 1);
*data << text;
*data << uint8(GetChatTag());
@@ -20088,13 +20091,20 @@ void Player::TextEmote(const std::string& text)
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT));
}
-void Player::Whisper(const std::string& text, uint32 language, uint64 receiver)
+void Player::WhisperAddon(const std::string& text, const std::string& prefix, uint64 receiver)
{
- bool isAddonMessage = language == LANG_ADDON;
+ Player* rPlayer = ObjectAccessor::FindPlayer(receiver);
- if (!isAddonMessage) // if not addon data
- language = LANG_UNIVERSAL; // whispers should always be readable
+ std::string _text(text);
+ sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, LANG_UNIVERSAL, _text, rPlayer);
+
+ WorldPacket data(SMSG_MESSAGECHAT, 200);
+ BuildPlayerChat(&data, CHAT_MSG_WHISPER, _text, LANG_UNIVERSAL, prefix.c_str());
+ rPlayer->GetSession()->SendPacket(&data);
+}
+void Player::Whisper(const std::string& text, uint32 language, uint64 receiver)
+{
Player* rPlayer = ObjectAccessor::FindPlayer(receiver);
std::string _text(text);
@@ -20107,22 +20117,13 @@ void Player::Whisper(const std::string& text, uint32 language, uint64 receiver)
BuildPlayerChat(&data, CHAT_MSG_WHISPER, _text, language);
rPlayer->GetSession()->SendPacket(&data);
- // not send confirmation for addon messages
- if (!isAddonMessage)
- {
- data.Initialize(SMSG_MESSAGECHAT, 200);
- rPlayer->BuildPlayerChat(&data, CHAT_MSG_WHISPER_INFORM, _text, language);
- GetSession()->SendPacket(&data);
- }
+ data.Initialize(SMSG_MESSAGECHAT, 200);
+ rPlayer->BuildPlayerChat(&data, CHAT_MSG_WHISPER_INFORM, _text, language);
+ GetSession()->SendPacket(&data);
}
- else if (!isAddonMessage)
- // announce to player that player he is whispering to is dnd and cannot receive his message
+ else // announce to player that player he is whispering to is dnd and cannot receive his message
ChatHandler(this).PSendSysMessage(LANG_PLAYER_DND, rPlayer->GetName(), rPlayer->dndMsg.c_str());
- // rest stuff shouldn't happen in case of addon message
- if (isAddonMessage)
- return;
-
if (!isAcceptWhispers() && !isGameMaster() && !rPlayer->isGameMaster())
{
SetAcceptWhispers(true);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d29d03e9df7..48249a56c60 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1262,7 +1262,8 @@ class Player : public Unit, public GridObject<Player>
void Yell(const std::string& text, const uint32 language);
void TextEmote(const std::string& text);
void Whisper(const std::string& text, const uint32 language, uint64 receiver);
- void BuildPlayerChat(WorldPacket* data, uint8 msgtype, const std::string& text, uint32 language) const;
+ void WhisperAddon(const std::string& text, const std::string& prefix, uint64 receiver);
+ void BuildPlayerChat(WorldPacket* data, uint8 msgtype, const std::string& text, uint32 language, const char* addonPrefix = NULL) const;
/*********************************************************/
/*** STORAGE SYSTEM ***/
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index ac4802a3091..fc73da04f12 100755
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -2069,6 +2069,20 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, const std:
}
}
+void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, const std::string& msg, const std::string& prefix) const
+{
+ if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
+ {
+ WorldPacket data;
+ ChatHandler::FillMessageData(&data, session, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, CHAT_MSG_ADDON, NULL, 0, msg.c_str(), NULL, prefix.c_str());
+ for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
+ if (Player* player = itr->second->FindPlayer())
+ if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
+ !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()))
+ player->GetSession()->SendPacket(&data);
+ }
+}
+
void Guild::BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const
{
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 446eede5dc8..036d61144e5 100755
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -658,6 +658,7 @@ public:
// Broadcasts
void BroadcastToGuild(WorldSession* session, bool officerOnly, const std::string& msg, uint32 language = LANG_UNIVERSAL) const;
+ void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, const std::string& msg, const std::string& prefix) const;
void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const;
void BroadcastPacket(WorldPacket* packet) const;
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index 41e9664b69f..2cbab68266e 100755
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -180,7 +180,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
// LANG_ADDON should not be changed nor be affected by flood control
else
{
- // send in universal language if player in .gmon mode (ignore spell effects)
+ // send in universal language if player in .gm on mode (ignore spell effects)
if (sender->isGameMaster())
lang = LANG_UNIVERSAL;
else
@@ -538,23 +538,41 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
return;
}
- uint32 msgLen = recvData.ReadBits(9);
- uint32 prefixLen = recvData.ReadBits(5);
- std::string message = "";
- std::string prefix = "";
- std::string targetName = "";
+ std::string message;
+ std::string prefix;
+ std::string targetName;
- if (type == CHAT_MSG_WHISPER)
- {
- uint32 targetLen = recvData.ReadBits(10);
- message = recvData.ReadString(msgLen);
- prefix = recvData.ReadString(prefixLen);
- targetName = recvData.ReadString(targetLen);
- }
- else
+ switch (type)
{
- message = recvData.ReadString(msgLen);
- prefix = recvData.ReadString(prefixLen);
+ case CHAT_MSG_WHISPER:
+ {
+ uint32 msgLen = recvData.ReadBits(9);
+ uint32 prefixLen = recvData.ReadBits(5);
+ uint32 targetLen = recvData.ReadBits(10);
+ message = recvData.ReadString(msgLen);
+ prefix = recvData.ReadString(prefixLen);
+ targetName = recvData.ReadString(targetLen);
+ break;
+ }
+ case CHAT_MSG_PARTY:
+ case CHAT_MSG_RAID:
+ case CHAT_MSG_OFFICER:
+ {
+ uint32 prefixLen = recvData.ReadBits(5);
+ uint32 msgLen = recvData.ReadBits(9);
+ prefix = recvData.ReadString(prefixLen);
+ message = recvData.ReadString(msgLen);
+ break;
+ }
+ case CHAT_MSG_GUILD:
+ case CHAT_MSG_BATTLEGROUND:
+ {
+ uint32 msgLen = recvData.ReadBits(9);
+ uint32 prefixLen = recvData.ReadBits(5);
+ message = recvData.ReadString(msgLen);
+ prefix = recvData.ReadString(prefixLen);
+ break;
+ }
}
// Logging enabled?
@@ -585,10 +603,11 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
break;
}
case CHAT_MSG_GUILD:
+ case CHAT_MSG_OFFICER:
{
if (sender->GetGuildId())
if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId()))
- guild->BroadcastToGuild(this, false, message, LANG_ADDON);
+ guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, message, prefix);
break;
}
case CHAT_MSG_WHISPER:
@@ -599,7 +618,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
if (!receiver)
break;
- sender->Whisper(message, LANG_ADDON, receiver->GetGUID());
+ sender->WhisperAddon(message, prefix, receiver->GetGUID());
break;
}
// Messages sent to "RAID" while in a party will get delivered to "PARTY"
@@ -612,7 +631,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
break;
WorldPacket data;
- ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL);
+ ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL, prefix.c_str());
group->BroadcastPacket(&data, true, -1, group->GetMemberGroup(sender->GetGUID()));
break;
}
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 4b349857c96..354a8e92cb1 100755
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -1697,7 +1697,7 @@ void WorldSession::HandleReforgeItemOpcode(WorldPacket& recvData)
return;
}
- if (player->HasEnoughMoney(item->GetSpecialPrice())) // cheating
+ if (player->HasEnoughMoney(uint64(item->GetSpecialPrice()))) // cheating
{
SendReforgeResult(false);
return;