Core/Chat: Send addon prefix in addon messages

Correct structure of some CMSG_MESSAGECHAT_ADDON_x opcodes
Fix a compile error in HandleReforgeItemOpcode
This commit is contained in:
Nay
2012-08-04 15:58:09 +01:00
parent 17e852d9b3
commit 5518daa74b
8 changed files with 87 additions and 44 deletions

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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::WhisperAddon(const std::string& text, const std::string& prefix, uint64 receiver)
{
Player* rPlayer = ObjectAccessor::FindPlayer(receiver);
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)
{
bool isAddonMessage = language == LANG_ADDON;
if (!isAddonMessage) // if not addon data
language = LANG_UNIVERSAL; // whispers should always be readable
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);

View File

@@ -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 ***/

View File

@@ -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)

View File

@@ -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;

View File

@@ -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)
switch (type)
{
uint32 targetLen = recvData.ReadBits(10);
message = recvData.ReadString(msgLen);
prefix = recvData.ReadString(prefixLen);
targetName = recvData.ReadString(targetLen);
}
else
{
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;
}

View File

@@ -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;