mirror of
https://github.com/araxiaonline/TrinityCore2.git
synced 2026-06-13 03:22:40 -04:00
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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ***/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user