From d55c0cbf3a4bc8fe7851b49acc144058d598a40f Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sun, 16 Nov 2014 06:08:46 +0100 Subject: Core/Packets: updated AccountData packets --- src/server/scripts/Commands/cs_gobject.cpp | 8 ++------ src/server/scripts/Commands/cs_reset.cpp | 5 +++-- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 5a00267d6aa..20ce825ad5e 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -675,12 +675,8 @@ public: if (objectType < 4) object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, objectState); else if (objectType == 4) - { - WorldPacket data(SMSG_GAMEOBJECT_CUSTOM_ANIM, 8+4); - data << object->GetGUID(); - data << (uint32)(objectState); - object->SendMessageToSet(&data, true); - } + object->SendCustomAnim(objectState); + handler->PSendSysMessage("Set gobject type %d state %d", objectType, objectState); return true; } diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 4a58a7f7e5d..01a0094bfc7 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -204,9 +204,10 @@ public: Player* target; ObjectGuid targetGuid; std::string targetName; - /* TODO: 6.x remove/update pet talents + if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) { + /* TODO: 6.x remove/update pet talents // Try reset talents as Hunter Pet Creature* creature = handler->getSelectedCreature(); if (!*args && creature && creature->IsPet()) @@ -223,12 +224,12 @@ public: } return true; } + */ handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); return false; } - */ if (target) { -- cgit v1.2.3 From 218f14f84b692288e58c292a9808a073e50f96ad Mon Sep 17 00:00:00 2001 From: Intel Date: Sun, 16 Nov 2014 18:17:08 +0200 Subject: Core/Packets: Added some chat message packets --- src/server/game/Battlegrounds/Battleground.cpp | 17 +- src/server/game/Chat/Channels/Channel.cpp | 18 +- src/server/game/Chat/Channels/Channel.h | 6 +- src/server/game/Chat/Chat.cpp | 167 ++++--------- src/server/game/Chat/Chat.h | 10 +- src/server/game/Entities/Object/Object.cpp | 6 +- src/server/game/Entities/Object/Object.h | 6 +- src/server/game/Entities/Player/Player.cpp | 63 ++--- src/server/game/Entities/Player/Player.h | 25 +- src/server/game/Entities/Unit/Unit.cpp | 13 +- src/server/game/Grids/Notifiers/GridNotifiers.h | 5 +- src/server/game/Groups/Group.cpp | 6 +- src/server/game/Groups/Group.h | 6 +- src/server/game/Guilds/Guild.cpp | 15 +- src/server/game/Handlers/ChatHandler.cpp | 277 ++++++++++++++++++++- src/server/game/Miscellaneous/SharedDefines.h | 12 + src/server/game/Server/Packets/ChatPackets.cpp | 55 ++++ src/server/game/Server/Packets/ChatPackets.h | 68 +++++ src/server/game/Server/Protocol/Opcodes.cpp | 29 +-- src/server/game/Server/Protocol/Opcodes.h | 6 +- src/server/game/Server/WorldSession.h | 7 +- src/server/game/Texts/ChatTextBuilder.h | 15 +- src/server/game/Texts/CreatureTextMgr.cpp | 15 +- src/server/game/Texts/CreatureTextMgr.h | 27 +- src/server/game/World/World.cpp | 18 +- src/server/scripts/Commands/cs_debug.cpp | 6 +- .../BattleForMountHyjal/instance_hyjal.cpp | 8 +- 27 files changed, 611 insertions(+), 295 deletions(-) create mode 100644 src/server/game/Server/Packets/ChatPackets.cpp create mode 100644 src/server/game/Server/Packets/ChatPackets.h (limited to 'src/server/scripts/Commands') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 7f9359053a1..2f99bc0a6cc 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -70,7 +70,9 @@ namespace Trinity private: void do_helper(WorldPacket& data, char const* text) { - ChatHandler::BuildChatPacket(data, _msgtype, LANG_UNIVERSAL, _source, _source, text); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, text); + data = *packet.Write(); } ChatMsg _msgtype; @@ -94,7 +96,9 @@ namespace Trinity char str[2048]; snprintf(str, 2048, text, arg1str, arg2str); - ChatHandler::BuildChatPacket(data, _msgtype, LANG_UNIVERSAL, _source, _source, str); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, str); + data = *packet.Write(); } private: @@ -1693,11 +1697,12 @@ void Battleground::SendWarningToAll(uint32 entry, ...) if (!entry) return; - std::map localizedPackets; + std::map localizedPackets; for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) if (Player* player = _GetPlayer(itr, "SendWarningToAll")) { - if (localizedPackets.find(player->GetSession()->GetSessionDbLocaleIndex()) == localizedPackets.end()) + auto packetItr = localizedPackets.find(player->GetSession()->GetSessionDbLocaleIndex()); + if (packetItr == localizedPackets.end()) { char const* format = sObjectMgr->GetTrinityString(entry, player->GetSession()->GetSessionDbLocaleIndex()); @@ -1707,10 +1712,10 @@ void Battleground::SendWarningToAll(uint32 entry, ...) vsnprintf(str, 1024, format, ap); va_end(ap); - ChatHandler::BuildChatPacket(localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()], CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, NULL, NULL, str); + ChatHandler::BuildChatPacket(&packetItr->second, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, NULL, NULL, str); } - player->SendDirectMessage(&localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()]); + player->SendDirectMessage(packetItr->second.Write()); } } diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 65f07b625e1..7695ab45de0 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -622,13 +622,17 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) return; } - WorldPacket data; + WorldPackets::Chat::Chat packet; if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name); + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name); else - ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), guid, guid, what, 0, "", "", 0, false, _name); + { + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), NULL, NULL, what, 0, _name); + packet.SenderGUID = guid; + packet.TargetGUID = guid; + } - SendToAll(&data, !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); + SendToAll(packet.Write(), !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); } void Channel::Invite(Player const* player, std::string const& newname) @@ -722,7 +726,7 @@ void Channel::SetOwner(ObjectGuid guid, bool exclaim) } } -void Channel::SendToAll(WorldPacket* data, ObjectGuid guid) +void Channel::SendToAll(WorldPacket const* data, ObjectGuid guid) { for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) @@ -730,7 +734,7 @@ void Channel::SendToAll(WorldPacket* data, ObjectGuid guid) player->GetSession()->SendPacket(data); } -void Channel::SendToAllButOne(WorldPacket* data, ObjectGuid who) +void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid who) { for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) if (i->first != who) @@ -738,7 +742,7 @@ void Channel::SendToAllButOne(WorldPacket* data, ObjectGuid who) player->GetSession()->SendPacket(data); } -void Channel::SendToOne(WorldPacket* data, ObjectGuid who) +void Channel::SendToOne(WorldPacket const* data, ObjectGuid who) { if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) player->GetSession()->SendPacket(data); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 6489c8b47ad..f1f01e64f44 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -226,9 +226,9 @@ class Channel void MakeVoiceOn(WorldPacket* data, ObjectGuid guid); //+ 0x22 void MakeVoiceOff(WorldPacket* data, ObjectGuid guid); //+ 0x23 - void SendToAll(WorldPacket* data, ObjectGuid guid = ObjectGuid::Empty); - void SendToAllButOne(WorldPacket* data, ObjectGuid who); - void SendToOne(WorldPacket* data, ObjectGuid who); + void SendToAll(WorldPacket const* data, ObjectGuid guid = ObjectGuid::Empty); + void SendToAllButOne(WorldPacket const* data, ObjectGuid who); + void SendToOne(WorldPacket const* data, ObjectGuid who); bool IsOn(ObjectGuid who) const { return playersStore.find(who) != playersStore.end(); } bool IsBanned(ObjectGuid guid) const { return bannedStore.find(guid) != bannedStore.end(); } diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index ec3bc458066..fa89dca294c 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -35,6 +35,8 @@ #include "SpellMgr.h" #include "ScriptMgr.h" #include "ChatLink.h" +#include "Guild.h" +#include "Group.h" bool ChatHandler::load_command_table = true; @@ -202,7 +204,7 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part) void ChatHandler::SendSysMessage(const char *str) { - WorldPacket data; + WorldPackets::Chat::Chat packet; // need copy to prevent corruption by strtok call in LineFromMessage original string char* buf = strdup(str); @@ -210,8 +212,8 @@ void ChatHandler::SendSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); - m_session->SendPacket(&data); + BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + m_session->SendPacket(packet.Write()); } free(buf); @@ -220,7 +222,7 @@ void ChatHandler::SendSysMessage(const char *str) void ChatHandler::SendGlobalSysMessage(const char *str) { // Chat output - WorldPacket data; + WorldPackets::Chat::Chat packet; // need copy to prevent corruption by strtok call in LineFromMessage original string char* buf = strdup(str); @@ -228,8 +230,8 @@ void ChatHandler::SendGlobalSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); - sWorld->SendGlobalMessage(&data); + BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + sWorld->SendGlobalMessage(packet.Write()); } free(buf); @@ -238,7 +240,7 @@ void ChatHandler::SendGlobalSysMessage(const char *str) void ChatHandler::SendGlobalGMSysMessage(const char *str) { // Chat output - WorldPacket data; + WorldPackets::Chat::Chat packet; // need copy to prevent corruption by strtok call in LineFromMessage original string char* buf = strdup(str); @@ -246,8 +248,8 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); - sWorld->SendGlobalGMMessage(&data); + BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + sWorld->SendGlobalGMMessage(packet.Write()); } free(buf); @@ -628,132 +630,55 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd) return ShowHelpForSubCommands(table, "", cmd); } -size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag, - std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, - uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/, - std::string const& addonPrefix /*= ""*/) +void ChatHandler::BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, + uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string const& addonPrefix /*= ""*/) { - size_t receiverGUIDPos = 0; - data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT); - data << uint8(chatType); - data << int32(language); - data << senderGUID; - data << uint32(0); // some flags - switch (chatType) - { - case CHAT_MSG_MONSTER_SAY: - case CHAT_MSG_MONSTER_PARTY: - case CHAT_MSG_MONSTER_YELL: - case CHAT_MSG_MONSTER_WHISPER: - case CHAT_MSG_MONSTER_EMOTE: - case CHAT_MSG_RAID_BOSS_EMOTE: - case CHAT_MSG_RAID_BOSS_WHISPER: - case CHAT_MSG_BATTLENET: - data << uint32(senderName.length() + 1); - data << senderName; - receiverGUIDPos = data.wpos(); - data << receiverGUID; - if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer() && !receiverGUID.IsPet()) - { - data << uint32(receiverName.length() + 1); - data << receiverName; - } - - if (language == LANG_ADDON) - data << addonPrefix; - break; - case CHAT_MSG_WHISPER_FOREIGN: - data << uint32(senderName.length() + 1); - data << senderName; - receiverGUIDPos = data.wpos(); - data << receiverGUID; - if (language == LANG_ADDON) - data << addonPrefix; - break; - case CHAT_MSG_BG_SYSTEM_NEUTRAL: - case CHAT_MSG_BG_SYSTEM_ALLIANCE: - case CHAT_MSG_BG_SYSTEM_HORDE: - receiverGUIDPos = data.wpos(); - data << receiverGUID; - if (!receiverGUID.IsEmpty() && !receiverGUID.IsPlayer()) - { - data << uint32(receiverName.length() + 1); - data << receiverName; - } - - if (language == LANG_ADDON) - data << addonPrefix; - break; - case CHAT_MSG_ACHIEVEMENT: - case CHAT_MSG_GUILD_ACHIEVEMENT: - receiverGUIDPos = data.wpos(); - data << receiverGUID; - if (language == LANG_ADDON) - data << addonPrefix; - break; - default: - if (gmMessage) - { - data << uint32(senderName.length() + 1); - data << senderName; - } - - if (chatType == CHAT_MSG_CHANNEL) - { - ASSERT(channelName.length() > 0); - data << channelName; - } + // Clear everything because same packet can be used multiple times + packet->SenderGUID.Clear(); + packet->SenderAccountGUID.Clear(); + packet->SenderGuildGUID.Clear(); + packet->PartyGUID.Clear(); + packet->TargetGUID.Clear(); + packet->SenderName.clear(); + packet->TargetName.clear(); + packet->ChatFlags = CHAT_FLAG_NONE; + + packet->SlashCmd = chatType; + packet->Language = language; - receiverGUIDPos = data.wpos(); - data << receiverGUID; - - if (language == LANG_ADDON) - data << addonPrefix; - break; - } - - data << uint32(message.length() + 1); - data << message; - data << uint8(chatTag); - - if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT) - data << uint32(achievementId); - else if (chatType == CHAT_MSG_RAID_BOSS_WHISPER || chatType == CHAT_MSG_RAID_BOSS_EMOTE) + if (sender) { - data << float(0.0f); // Display time in middle of the screen (in seconds), defaults to 10 if not set (cannot be below 1) - data << uint8(0); // Hide in chat frame (only shows in middle of the screen) - } + packet->SenderGUID = sender->GetGUID(); - return receiverGUIDPos; -} + if (Creature const* creatureSender = sender->ToCreature()) + packet->SenderName = creatureSender->GetNameForLocaleIdx(locale); -size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, - uint32 achievementId /*= 0*/, std::string const& channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string const& addonPrefix /*= ""*/) -{ - ObjectGuid senderGUID; - std::string senderName = ""; - uint8 chatTag = 0; - bool gmMessage = false; - ObjectGuid receiverGUID; - std::string receiverName = ""; - if (sender) - { - senderGUID = sender->GetGUID(); - senderName = sender->GetNameForLocaleIdx(locale); if (Player const* playerSender = sender->ToPlayer()) { - chatTag = playerSender->GetChatTag(); - gmMessage = playerSender->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT); + packet->SenderAccountGUID = ObjectGuid::Create(playerSender->GetSession()->GetAccountId()); + packet->ChatFlags = playerSender->GetChatFlags(); + + if (Guild const* guild = playerSender->GetGuild()) + packet->SenderGuildGUID = guild->GetGUID(); + + if (Group const* group = playerSender->GetGroup()) + packet->PartyGUID = group->GetGUID(); } } if (receiver) { - receiverGUID = receiver->GetGUID(); - receiverName = receiver->GetNameForLocaleIdx(locale); + packet->TargetGUID = receiver->GetGUID(); + if (Creature const* creatureReceiver = receiver->ToCreature()) + packet->TargetName = creatureReceiver->GetNameForLocaleIdx(locale); } - return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName, addonPrefix); + packet->SenderVirtualAddress = GetVirtualRealmAddress(); + packet->TargetVirtualAddress = GetVirtualRealmAddress(); + packet->AchievementID = achievementId; + packet->Channel = channelName; + packet->Prefix = addonPrefix; + packet->ChatText = message; } Player* ChatHandler::getSelectedPlayer() diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 98c3bc3efbb..5db48db0fbe 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -22,6 +22,7 @@ #include "SharedDefines.h" #include "WorldSession.h" #include "RBAC.h" +#include "Packets/ChatPackets.h" #include @@ -53,14 +54,7 @@ class ChatHandler explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) { } virtual ~ChatHandler() { } - // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders - static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag, - std::string const& senderName = "", std::string const& receiverName = "", - uint32 achievementId = 0, bool gmMessage = false, std::string const& channelName = "", - std::string const& addonPrefix = ""); - - // Builds chat packet and returns receiver guid position in the packet to substitute in whisper builders - static size_t BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string const& addonPrefix = ""); + static void BuildChatPacket(WorldPackets::Chat::Chat* packet, ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string const& message, uint32 achievementId = 0, std::string const& channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string const& addonPrefix = ""); static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = NULL; return start; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index e482e0a449d..70612910797 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2359,19 +2359,19 @@ void Object::ForceValuesUpdateAtIndex(uint32 i) } } -void WorldObject::SendMessageToSet(WorldPacket* data, bool self) +void WorldObject::SendMessageToSet(WorldPacket const* data, bool self) { if (IsInWorld()) SendMessageToSetInRange(data, GetVisibilityRange(), self); } -void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*self*/) +void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/) { Trinity::MessageDistDeliverer notifier(this, data, dist); VisitNearbyWorldObject(dist, notifier); } -void WorldObject::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) +void WorldObject::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) { Trinity::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); VisitNearbyWorldObject(GetVisibilityRange(), notifier); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index bae3a8b07c1..d2dd0108d20 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -661,9 +661,9 @@ class WorldObject : public Object, public WorldLocation virtual void CleanupsBeforeDelete(bool finalCleanup = true); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units - virtual void SendMessageToSet(WorldPacket* data, bool self); - virtual void SendMessageToSetInRange(WorldPacket* data, float dist, bool self); - virtual void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr); + virtual void SendMessageToSet(WorldPacket const* data, bool self); + virtual void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self); + virtual void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr); virtual uint8 getLevelForTarget(WorldObject const* /*target*/) const { return 1; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ae8f0191137..67f533f0833 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -87,6 +87,7 @@ #include "WorldSession.h" #include "WorldStatePackets.h" #include "MiscPackets.h" +#include "ChatPackets.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -1930,18 +1931,18 @@ void Player::ToggleDND() ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_DND); } -uint8 Player::GetChatTag() const +uint8 Player::GetChatFlags() const { - uint8 tag = CHAT_TAG_NONE; + uint8 tag = CHAT_FLAG_NONE; if (isGMChat()) - tag |= CHAT_TAG_GM; + tag |= CHAT_FLAG_GM; if (isDND()) - tag |= CHAT_TAG_DND; + tag |= CHAT_FLAG_DND; if (isAFK()) - tag |= CHAT_TAG_AFK; + tag |= CHAT_FLAG_AFK; if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER)) - tag |= CHAT_TAG_DEV; + tag |= CHAT_FLAG_DEV; return tag; } @@ -6346,7 +6347,7 @@ void Player::SaveRecallPosition() m_recallO = GetOrientation(); } -void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self) +void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) { if (self) GetSession()->SendPacket(data); @@ -6355,7 +6356,7 @@ void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self) VisitNearbyWorldObject(dist, notifier); } -void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self, bool own_team_only) +void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only) { if (self) GetSession()->SendPacket(data); @@ -6364,7 +6365,7 @@ void Player::SendMessageToSetInRange(WorldPacket* data, float dist, bool self, b VisitNearbyWorldObject(dist, notifier); } -void Player::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) +void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) { if (skipped_rcvr != this) GetSession()->SendPacket(data); @@ -6375,7 +6376,7 @@ void Player::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) VisitNearbyWorldObject(GetVisibilityRange(), notifier); } -void Player::SendDirectMessage(WorldPacket const* data) +void Player::SendDirectMessage(WorldPacket const* data) const { m_session->SendPacket(data); } @@ -20416,9 +20417,9 @@ void Player::Say(std::string const& text, Language language, WorldObject const* std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text); - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SAY, language, this, this, _text); + SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); } void Player::Yell(std::string const& text, Language language, WorldObject const* /*= nullptr*/) @@ -20426,9 +20427,9 @@ void Player::Yell(std::string const& text, Language language, WorldObject const* std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text); - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_YELL, language, this, this, _text); + SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true); } void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/, bool /*= false*/) @@ -20436,9 +20437,9 @@ void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/ std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text); - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT)); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text); + SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT)); } void Player::WhisperAddon(std::string const& text, const std::string& prefix, Player* receiver) @@ -20449,9 +20450,9 @@ void Player::WhisperAddon(std::string const& text, const std::string& prefix, Pl if (!receiver->GetSession()->IsAddonRegistered(prefix)) return; - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); - receiver->GetSession()->SendPacket(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); + receiver->GetSession()->SendPacket(packet.Write()); } void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/) @@ -20466,16 +20467,16 @@ void Player::Whisper(std::string const& text, Language language, Player* target, std::string _text(text); sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target); - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, Language(language), this, this, _text); - target->GetSession()->SendPacket(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, Language(language), this, this, _text); + target->GetSession()->SendPacket(packet.Write()); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; - ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); - GetSession()->SendPacket(&data); + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); + GetSession()->SendPacket(packet.Write()); if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) { @@ -26742,7 +26743,13 @@ std::string Player::GetCoordsMapAreaAndZoneString() Guild* Player::GetGuild() { ObjectGuid::LowType guildId = GetGuildId(); - return guildId ? sGuildMgr->GetGuildById(guildId) : NULL; + return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr; +} + +Guild const* Player::GetGuild() const +{ + ObjectGuid::LowType guildId = GetGuildId(); + return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr; } Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1dd993e5b5f..5f3eda1d69d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -858,18 +858,6 @@ enum EnviromentalDamage DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss }; -enum PlayerChatTag -{ - CHAT_TAG_NONE = 0x00, - CHAT_TAG_AFK = 0x01, - CHAT_TAG_DND = 0x02, - CHAT_TAG_GM = 0x04, - CHAT_TAG_COM = 0x08, // Commentator - CHAT_TAG_DEV = 0x10, - CHAT_TAG_BOSS_SOUND = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper - CHAT_TAG_MOBILE = 0x40 -}; - enum PlayedTimeIndex { PLAYED_TIME_TOTAL = 0, @@ -1314,7 +1302,7 @@ class Player : public Unit, public GridObject void ToggleDND(); bool isAFK() const { return HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK); } bool isDND() const { return HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DND); } - uint8 GetChatTag() const; + uint8 GetChatFlags() const; std::string autoReplyMsg; uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL); @@ -1968,6 +1956,7 @@ class Player : public Unit, public GridObject void SetGuildIdInvited(ObjectGuid::LowType GuildId) { m_GuildIdInvited = GuildId; } ObjectGuid::LowType GetGuildId() const { return GetUInt64Value(OBJECT_FIELD_DATA); /* return only lower part */ } Guild* GetGuild(); + Guild const* GetGuild() const; static ObjectGuid::LowType GetGuildIdFromDB(ObjectGuid guid); static uint8 GetRankFromDB(ObjectGuid guid); ObjectGuid::LowType GetGuildIdInvited() { return m_GuildIdInvited; } @@ -2089,10 +2078,10 @@ class Player : public Unit, public GridObject bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } void UpdateUnderwaterState(Map* m, float x, float y, float z) override; - void SendMessageToSet(WorldPacket* data, bool self) override {SendMessageToSetInRange(data, GetVisibilityRange(), self); };// overwrite Object::SendMessageToSet - void SendMessageToSetInRange(WorldPacket* data, float fist, bool self) override;// overwrite Object::SendMessageToSetInRange - void SendMessageToSetInRange(WorldPacket* data, float dist, bool self, bool own_team_only); - void SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) override; + void SendMessageToSet(WorldPacket const* data, bool self) override {SendMessageToSetInRange(data, GetVisibilityRange(), self); };// overwrite Object::SendMessageToSet + void SendMessageToSetInRange(WorldPacket const* data, float fist, bool self) override;// overwrite Object::SendMessageToSetInRange + void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only); + void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) override; Corpse* GetCorpse() const; void SpawnCorpseBones(); @@ -2245,7 +2234,7 @@ class Player : public Unit, public GridObject void SendInitWorldStates(uint32 zone, uint32 area); void SendUpdateWorldState(uint32 variable, uint32 value, bool hidden = false); - void SendDirectMessage(WorldPacket const* data); + void SendDirectMessage(WorldPacket const* data) const; void SendBGWeekendWorldStates(); void SendBattlefieldWorldStates(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 89ded594990..b7cefedec87 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -62,6 +62,7 @@ #include "WorldPacket.h" #include "MovementStructures.h" #include "WorldSession.h" +#include "ChatPackets.h" #include @@ -16766,9 +16767,9 @@ void Unit::Whisper(std::string const& text, Language language, Player* target, b return; LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); - WorldPacket data; - ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale); - target->SendDirectMessage(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale); + target->SendDirectMessage(packet.Write()); } void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target) @@ -16813,7 +16814,7 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/ } LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); - WorldPacket data; - ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale); - target->SendDirectMessage(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale); + target->SendDirectMessage(packet.Write()); } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index ae3bef5a8df..b693d2e13ac 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -33,6 +33,7 @@ #include "CreatureAI.h" #include "Spell.h" #include "WorldSession.h" +#include "Packets/ChatPackets.h" class Player; //class Map; @@ -125,11 +126,11 @@ namespace Trinity struct MessageDistDeliverer { WorldObject* i_source; - WorldPacket* i_message; + WorldPacket const* i_message; float i_distSq; uint32 team; Player const* skipped_receiver; - MessageDistDeliverer(WorldObject* src, WorldPacket* msg, float dist, bool own_team_only = false, Player const* skipped = NULL) + MessageDistDeliverer(WorldObject* src, WorldPacket const* msg, float dist, bool own_team_only = false, Player const* skipped = NULL) : i_source(src), i_message(msg), i_distSq(dist * dist) , team(0) , skipped_receiver(skipped) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index c4e4b6f21ae..85e78071d01 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1623,7 +1623,7 @@ void Group::UpdatePlayerOutOfRange(Player* player) } } -void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/) +void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/) { for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) { @@ -1638,7 +1638,7 @@ void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& } } -void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer) +void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer) { for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) { @@ -1651,7 +1651,7 @@ void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int } } -void Group::BroadcastReadyCheck(WorldPacket* packet) +void Group::BroadcastReadyCheck(WorldPacket const* packet) { for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) { diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 0bdfbf24a71..6216b7323b0 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -288,9 +288,9 @@ class Group worker(itr->GetSource()); } - void BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty); - void BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty); - void BroadcastReadyCheck(WorldPacket* packet); + void BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty); + void BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty); + void BroadcastReadyCheck(WorldPacket const* packet); void OfflineReadyCheck(); /*********************************************************/ diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 4fb361209c1..b99ac0496e6 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -30,6 +30,7 @@ #include "ScriptMgr.h" #include "SocialMgr.h" #include "Opcodes.h" +#include "ChatPackets.h" #define MAX_GUILD_BANK_TAB_TEXT_LEN 500 #define EMBLEM_PRICE 10 * GOLD @@ -2593,13 +2594,14 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin { if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { - WorldPacket data; - ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), NULL, msg); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), NULL, msg); + WorldPacket const* data = packet.Write(); for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if (Player* player = itr->second->FindConnectedPlayer()) if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID())) - player->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(data); } } @@ -2607,14 +2609,15 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std:: { if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { - WorldPacket data; - ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), NULL, msg, 0, "", DEFAULT_LOCALE, prefix); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), NULL, msg, 0, "", DEFAULT_LOCALE, prefix); + WorldPacket const* data = packet.Write(); 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()->GetGUID()) && player->GetSession()->IsAddonRegistered(prefix)) - player->GetSession()->SendPacket(&data); + player->GetSession()->SendPacket(data); } } diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a2fc248bb61..ce1f0f8ea2d 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -39,7 +39,260 @@ #include "Util.h" #include "ScriptMgr.h" #include "AccountMgr.h" +#include "ChatPackets.h" +void WorldSession::HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& packet) +{ + uint32 type = 0; + uint32 lang = packet.Language; + std::string msg = packet.Text; + + switch (packet.GetOpcode()) + { + case CMSG_MESSAGECHAT_SAY: + type = CHAT_MSG_SAY; + break; + case CMSG_MESSAGECHAT_YELL: + type = CHAT_MSG_YELL; + break; + case CMSG_MESSAGECHAT_GUILD: + type = CHAT_MSG_GUILD; + break; + case CMSG_MESSAGECHAT_OFFICER: + type = CHAT_MSG_OFFICER; + break; + case CMSG_MESSAGECHAT_PARTY: + type = CHAT_MSG_PARTY; + break; + case CMSG_MESSAGECHAT_RAID: + type = CHAT_MSG_RAID; + break; + case CMSG_MESSAGECHAT_RAID_WARNING: + type = CHAT_MSG_RAID_WARNING; + break; + default: + TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", packet.GetOpcode()); + return; + } + + Player* sender = GetPlayer(); + + if (packet.Language == LANG_UNIVERSAL) + { + TC_LOG_ERROR("network", "CMSG_MESSAGECHAT: Possible hacking-attempt: %s tried to send a message in universal language", GetPlayerInfo().c_str()); + SendNotification(LANG_UNKNOWN_LANGUAGE); + return; + } + + // prevent talking at unknown language (cheating) + LanguageDesc const* langDesc = GetLanguageDescByID(lang); + if (!langDesc) + { + SendNotification(LANG_UNKNOWN_LANGUAGE); + return; + } + + if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id)) + { + // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language) + Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE); + bool foundAura = false; + for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i) + { + if ((*i)->GetMiscValue() == int32(lang)) + { + foundAura = true; + break; + } + } + if (!foundAura) + { + SendNotification(LANG_NOT_LEARNED_LANGUAGE); + return; + } + } + + // send in universal language if player in .gm on mode (ignore spell effects) + if (sender->IsGameMaster()) + lang = LANG_UNIVERSAL; + else + { + // send in universal language in two side iteration allowed mode + if (HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT)) + lang = LANG_UNIVERSAL; + else + { + switch (type) + { + case CHAT_MSG_PARTY: + case CHAT_MSG_RAID: + case CHAT_MSG_RAID_WARNING: + // allow two side chat at group channel if two side group allowed + if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP)) + lang = LANG_UNIVERSAL; + break; + case CHAT_MSG_GUILD: + case CHAT_MSG_OFFICER: + // allow two side chat at guild channel if two side guild allowed + if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD)) + lang = LANG_UNIVERSAL; + break; + } + } + + // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used) + Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE); + if (!ModLangAuras.empty()) + lang = ModLangAuras.front()->GetMiscValue(); + } + + if (!sender->CanSpeak()) + { + std::string timeStr = secsToTimeString(m_muteTime - time(NULL)); + SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); + return; + } + + if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER) + { + SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); + return; + } + + if (msg.empty()) + return; + + if (ChatHandler(this).ParseCommands(msg.c_str())) + return; + + // Strip invisible characters for non-addon messages + if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) + stripLineInvisibleChars(msg); + + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str())) + { + TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().ToString().c_str(), msg.c_str()); + + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + KickPlayer(); + + return; + } + + switch (type) + { + case CHAT_MSG_SAY: + case CHAT_MSG_YELL: + { + // Prevent cheating + if (!sender->IsAlive()) + return; + + if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ)) + { + SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ)); + return; + } + + if (type == CHAT_MSG_SAY) + sender->Say(msg, Language(lang)); + else if (type == CHAT_MSG_EMOTE) + sender->TextEmote(msg); + else if (type == CHAT_MSG_YELL) + sender->Yell(msg, Language(lang)); + break; + } + case CHAT_MSG_PARTY: + { + // if player is in battleground, he cannot say to battleground members by /p + Group* group = GetPlayer()->GetOriginalGroup(); + if (!group) + { + group = sender->GetGroup(); + if (!group || group->isBGGroup()) + return; + } + + if (group->IsLeader(GetPlayer()->GetGUID())) + type = CHAT_MSG_PARTY_LEADER; + + sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); + + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID())); + break; + } + case CHAT_MSG_GUILD: + { + if (GetPlayer()->GetGuildId()) + { + if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) + { + sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild); + + guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); + } + } + break; + } + case CHAT_MSG_OFFICER: + { + if (GetPlayer()->GetGuildId()) + { + if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId())) + { + sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild); + + guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL); + } + } + break; + } + case CHAT_MSG_RAID: + { + // if player is in battleground, he cannot say to battleground members by /ra + Group* group = GetPlayer()->GetOriginalGroup(); + if (!group) + { + group = GetPlayer()->GetGroup(); + if (!group || group->isBGGroup() || !group->isRaidGroup()) + return; + } + + if (group->IsLeader(GetPlayer()->GetGUID())) + type = CHAT_MSG_RAID_LEADER; + + sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); + + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false); + break; + } + case CHAT_MSG_RAID_WARNING: + { + Group* group = GetPlayer()->GetGroup(); + if (!group || !group->isRaidGroup() || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup()) + return; + + sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); + + WorldPackets::Chat::Chat packet; + //in battleground, raid warning is sent only to players in battleground - code is ok + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg); + group->BroadcastPacket(packet.Write(), false); + break; + } + default: + TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang); + break; + } +} + + +/** Left in here until all chat messages are moved to new packets void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) { uint32 type = 0; @@ -47,7 +300,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) switch (recvData.GetOpcode()) { - /* case CMSG_MESSAGECHAT_SAY: type = CHAT_MSG_SAY; break; @@ -87,7 +339,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) case CMSG_MESSAGECHAT_RAID_WARNING: type = CHAT_MSG_RAID_WARNING; break; - */ default: TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode()); recvData.hexlike(); @@ -535,7 +786,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) TC_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", type, lang); break; } -} +}*/ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) { @@ -627,9 +878,9 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) if (!group || !group->isBGGroup()) return; - WorldPacket data; - ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); - group->BroadcastAddonMessagePacket(&data, prefix, false); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); + group->BroadcastAddonMessagePacket(packet.Write(), prefix, false); break; } case CHAT_MSG_GUILD: @@ -660,9 +911,9 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) if (!group || group->isBGGroup()) break; - WorldPacket data; - ChatHandler::BuildChatPacket(data, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); - group->BroadcastAddonMessagePacket(&data, prefix, true, -1, sender->GetGUID()); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix); + group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID()); break; } default: @@ -718,6 +969,7 @@ namespace Trinity void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) { + /* if (!GetPlayer()->IsAlive()) return; @@ -780,6 +1032,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) //Send scripted event call if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote); + */ } void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) @@ -811,9 +1064,9 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) if (!player || !player->GetSession()) return; - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); - player->GetSession()->SendPacket(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); + player->GetSession()->SendPacket(packet.Write()); } void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 4c44a4f94a1..2b5c2e9e052 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4131,6 +4131,18 @@ enum ChatMsg #define MAX_CHAT_MSG_TYPE 0x41 +enum ChatFlags +{ + CHAT_FLAG_NONE = 0x00, + CHAT_FLAG_AFK = 0x01, + CHAT_FLAG_DND = 0x02, + CHAT_FLAG_GM = 0x04, + CHAT_FLAG_COM = 0x08, // Commentator + CHAT_FLAG_DEV = 0x10, + CHAT_FLAG_BOSS_SOUND = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper + CHAT_FLAG_MOBILE = 0x40 +}; + enum ChatLinkColors { CHAT_LINK_COLOR_TRADE = 0xffffd000, // orange diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp new file mode 100644 index 00000000000..6b544480a71 --- /dev/null +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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, see . + */ + +#include "ChatPackets.h" + +void WorldPackets::Chat::ChatMessage::Read() +{ + _worldPacket >> Language; + uint32 len = _worldPacket.ReadBits(8); + Text = _worldPacket.ReadString(len); +} + +WorldPacket const* WorldPackets::Chat::Chat::Write() +{ + _worldPacket << SlashCmd; + _worldPacket << Language; + _worldPacket << SenderGUID; + _worldPacket << SenderGuildGUID; + _worldPacket << SenderAccountGUID; + _worldPacket << TargetGUID; + _worldPacket << TargetVirtualAddress; + _worldPacket << SenderVirtualAddress; + _worldPacket << PartyGUID; + _worldPacket << AchievementID; + _worldPacket << DisplayTime; + _worldPacket.WriteBits(SenderName.length(), 11); + _worldPacket.WriteBits(TargetName.length(), 11); + _worldPacket.WriteBits(Prefix.length(), 5); + _worldPacket.WriteBits(Channel.length(), 7); + _worldPacket.WriteBits(ChatText.length(), 12); + _worldPacket.WriteBits(ChatFlags, 10); + _worldPacket.WriteBit(HideChatLog); + _worldPacket.WriteBit(FakeSenderName); + _worldPacket.WriteString(SenderName); + _worldPacket.WriteString(TargetName); + _worldPacket.WriteString(Prefix); + _worldPacket.WriteString(Channel); + _worldPacket.WriteString(ChatText); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h new file mode 100644 index 00000000000..4aa49312daf --- /dev/null +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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, see . + */ + +#ifndef ChatPackets_h__ +#define ChatPackets_h__ + +#include "Packet.h" + +namespace WorldPackets +{ + namespace Chat + { + class ChatMessage final : public ClientPacket + { + public: + ChatMessage(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override; + + std::string Text; + int32 Language = LANG_UNIVERSAL; + }; + + class Chat final : public ServerPacket + { + public: + Chat() : ServerPacket(SMSG_MESSAGECHAT, 1+1+8+8+8+8+8+4+4+4+1+4+20) { } + + WorldPacket const* Write() override; + + uint8 SlashCmd = 0; + uint8 Language = LANG_UNIVERSAL; + ObjectGuid SenderGUID; + ObjectGuid SenderGuildGUID; + ObjectGuid SenderAccountGUID; // Not in JAM messages but appears in packet? + ObjectGuid TargetGUID; + ObjectGuid PartyGUID; + uint32 SenderVirtualAddress; + uint32 TargetVirtualAddress; + std::string SenderName; + std::string TargetName; + std::string Prefix; + std::string Channel; + std::string ChatText; + uint32 AchievementID = 0; + uint8 ChatFlags = 0; + float DisplayTime = 0.0f; + bool HideChatLog = false; + bool FakeSenderName = false; + }; + } +} + +#endif // ChatPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 84efecae188..9699d519fd3 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -19,6 +19,7 @@ #include "Opcodes.h" #include "WorldSession.h" #include "Packets/CharacterPackets.h" +#include "Packets/ChatPackets.h" #include "Packets/ClientConfigPackets.h" #include "Packets/CombatPackets.h" #include "Packets/GuildPackets.h" @@ -409,19 +410,19 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_DND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_OFFICER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_RAID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_SAY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_YELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_DND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_MESSAGECHAT_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleMessagechatOpcode); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIGAME_MOVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode ); @@ -1072,7 +1073,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index aeb5bada68c..1fd3250d8ca 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -366,10 +366,10 @@ enum OpcodeClient : uint32 CMSG_MESSAGECHAT_DND = 0x0AAB, CMSG_MESSAGECHAT_EMOTE = 0x113C, CMSG_MESSAGECHAT_GUILD = 0x0B1B, - CMSG_MESSAGECHAT_OFFICER = 0xBADD, + CMSG_MESSAGECHAT_OFFICER = 0x0114, CMSG_MESSAGECHAT_PARTY = 0x0134, - CMSG_MESSAGECHAT_RAID = 0xBADD, - CMSG_MESSAGECHAT_RAID_WARNING = 0xBADD, + CMSG_MESSAGECHAT_RAID = 0x0B33, + CMSG_MESSAGECHAT_RAID_WARNING = 0x0313, CMSG_MESSAGECHAT_SAY = 0x1884, CMSG_MESSAGECHAT_WHISPER = 0x1829, CMSG_MESSAGECHAT_YELL = 0x1161, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index b508acb604e..3eaf30bd779 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -102,6 +102,11 @@ namespace WorldPackets class UserClientUpdateAccountData; } + namespace Chat + { + class ChatMessage; + } + namespace Combat { class AttackSwing; @@ -815,7 +820,7 @@ class WorldSession void HandlePushQuestToParty(WorldPacket& recvPacket); void HandleQuestPushResult(WorldPacket& recvPacket); - void HandleMessagechatOpcode(WorldPacket& recvPacket); + void HandleMessagechatOpcode(WorldPackets::Chat::ChatMessage& packet); void HandleAddonMessagechatOpcode(WorldPacket& recvPacket); void SendPlayerNotFoundNotice(std::string const& name); void SendPlayerAmbiguousNotice(std::string const& name); diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index 72f80bb07a3..a4834d555d3 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -20,6 +20,7 @@ #include "Chat.h" #include "ObjectMgr.h" +#include "Packets/ChatPackets.h" namespace Trinity { @@ -32,13 +33,9 @@ namespace Trinity void operator()(WorldPacket& data, LocaleConstant locale) { BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); - ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); - } - - size_t operator()(WorldPacket* data, LocaleConstant locale) const - { - BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); - return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); + data = *packet.Write(); } private: @@ -57,7 +54,9 @@ namespace Trinity void operator()(WorldPacket& data, LocaleConstant locale) { - ChatHandler::BuildChatPacket(data, _msgType, _language, _source, _target, _text, 0, "", locale); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, _msgType, _language, _source, _target, _text, 0, "", locale); + data = *packet.Write(); } private: diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 77819b87ec0..07d0bd53629 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -24,6 +24,7 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "CreatureTextMgr.h" +#include "ChatPackets.h" class CreatureTextBuilder { @@ -31,11 +32,12 @@ class CreatureTextBuilder CreatureTextBuilder(WorldObject const* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - size_t operator()(WorldPacket* data, LocaleConstant locale) const + void operator()(WorldPacket& data, LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - - return ChatHandler::BuildChatPacket(*data, _msgType, Language(_language), _source, _target, text, 0, "", locale); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _source, _target, text, 0, "", locale); + data = *packet.Write(); } private: @@ -54,11 +56,12 @@ class PlayerTextBuilder PlayerTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - size_t operator()(WorldPacket* data, LocaleConstant locale) const + void operator()(WorldPacket& data, LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - - return ChatHandler::BuildChatPacket(*data, _msgType, Language(_language), _talker, _target, text, 0, "", locale); + WorldPackets::Chat::Chat packet; + return ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _talker, _target, text, 0, "", locale); + data = *packet.Write(); } private: diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 06efadb1dc7..647d8249e68 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -24,6 +24,7 @@ #include "SharedDefines.h" #include "Opcodes.h" #include "Group.h" +#include "Packets/ChatPackets.h" enum CreatureTextRange { @@ -133,50 +134,38 @@ class CreatureTextLocalizer ~CreatureTextLocalizer() { for (size_t i = 0; i < _packetCache.size(); ++i) - { - if (_packetCache[i]) - delete _packetCache[i]->first; delete _packetCache[i]; - } } void operator()(Player* player) { LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - WorldPacket* messageTemplate; - size_t whisperGUIDpos; + WorldPackets::Chat::Chat* messageTemplate; // create if not cached yet if (!_packetCache[loc_idx]) { - messageTemplate = new WorldPacket(); - whisperGUIDpos = _builder(messageTemplate, loc_idx); - ASSERT(messageTemplate->GetOpcode() != NULL_OPCODE); - _packetCache[loc_idx] = new std::pair(messageTemplate, whisperGUIDpos); + messageTemplate = new WorldPackets::Chat::Chat(); + _packetCache[loc_idx] = messageTemplate; } else - { - messageTemplate = _packetCache[loc_idx]->first; - whisperGUIDpos = _packetCache[loc_idx]->second; - } + messageTemplate = _packetCache[loc_idx]; - WorldPacket data(*messageTemplate); switch (_msgType) { case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: - // TODO: Fix this. GUIDs are now always written packed and can have different packed lengths - //data.put(whisperGUIDpos, player->GetGUID().GetRawValue()); + messageTemplate->TargetGUID = player->GetGUID(); break; default: break; } - player->SendDirectMessage(&data); + player->SendDirectMessage(messageTemplate->Write()); } private: - std::vector* > _packetCache; + std::vector _packetCache; Builder const& _builder; ChatMsg _msgType; }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 098181c76a1..a7a5a8ae7bb 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -64,6 +64,7 @@ #include "WaypointMovementGenerator.h" #include "WeatherMgr.h" #include "WorldSession.h" +#include "ChatPackets.h" #include @@ -2287,7 +2288,9 @@ namespace Trinity while (char* line = lineFromMessage(pos)) { WorldPacket* data = new WorldPacket(); - ChatHandler::BuildChatPacket(*data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + *data = *packet.Write(); data_list.push_back(data); } } @@ -2345,16 +2348,15 @@ void World::SendGMText(uint32 string_id, ...) /// DEPRECATED, only for debug purpose. Send a System Message to all players (except self if mentioned) void World::SendGlobalText(const char* text, WorldSession* self) { - WorldPacket data; - // need copy to prevent corruption by strtok call in LineFromMessage original string char* buf = strdup(text); char* pos = buf; while (char* line = ChatHandler::LineFromMessage(pos)) { - ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); - SendGlobalMessage(&data, self); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + SendGlobalMessage(packet.Write(), self); } free(buf); @@ -2386,9 +2388,9 @@ bool World::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession /// Send a System Message to all players in the zone (except self if mentioned) void World::SendZoneText(uint32 zone, const char* text, WorldSession* self, uint32 team) { - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, text); - SendZoneMessage(zone, &data, self, team); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, text); + SendZoneMessage(zone, packet.Write(), self, team); } /// Kick (and save) all players diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 0c37b1491c3..db8ebe62775 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -481,9 +481,9 @@ public: char const* msg = "testtest"; uint8 type = atoi(args); - WorldPacket data; - ChatHandler::BuildChatPacket(data, ChatMsg(type), LANG_UNIVERSAL, handler->GetSession()->GetPlayer(), handler->GetSession()->GetPlayer(), msg, 0, "chan"); - handler->GetSession()->SendPacket(&data); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, ChatMsg(type), LANG_UNIVERSAL, handler->GetSession()->GetPlayer(), handler->GetSession()->GetPlayer(), msg, 0, "chan"); + handler->GetSession()->SendPacket(packet.Write()); return true; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 176c24f6707..bf28ccbb17e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -31,6 +31,7 @@ EndScriptData */ #include "WorldPacket.h" #include "Chat.h" #include "WorldSession.h" +#include "Packets/ChatPackets.h" /* Battle of Mount Hyjal encounters: 0 - Rage Winterchill event @@ -173,10 +174,9 @@ public: { if (Player* player = i->GetSource()) { - WorldPacket packet; - - ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS); - player->SendDirectMessage(&packet); + WorldPackets::Chat::Chat packet; + ChatHandler::BuildChatPacket(&packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS); + player->SendDirectMessage(packet.Write()); player->PlayDirectSound(10986, player); } } -- cgit v1.2.3 From 7f96163c94a3fab3da492c5d4ec91976c0fd4391 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sun, 23 Nov 2014 04:25:47 +0100 Subject: Core/Packets: - updated/enabled CMSG_CHANNEL_DISPLAY_LIST, CMSG_CHANNEL_LIST, CMSG_JOIN_CHANNEL, CMSG_LEAVE_CHANNEL, SMSG_CHANNEL_LIST, SMSG_CHANNEL_NOTIFY_JOINED, SMSG_CHANNEL_NOTIFY_LEFT - updated CMSG_SET_SELECTION - updated CMSG_TUTORIAL_FLAG (removed CMSG_TUTORIAL_CLEAR, CMSG_TUTORIAL_RESET) - fixed null guid in EquipmentSetList - fixed struct of MonsterMove --- src/server/game/Chat/Channels/Channel.cpp | 650 ++++++++++----------- src/server/game/Chat/Channels/Channel.h | 185 +++--- src/server/game/Chat/Channels/ChannelMgr.cpp | 53 +- src/server/game/Chat/Channels/ChannelMgr.h | 21 +- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Creature/Creature.h | 2 +- src/server/game/Entities/Player/Player.cpp | 16 +- src/server/game/Entities/Player/Player.h | 4 +- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Handlers/ChannelHandler.cpp | 103 ++-- src/server/game/Handlers/CharacterHandler.cpp | 56 +- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/MiscHandler.cpp | 7 +- src/server/game/Server/Packets/ChannelPackets.cpp | 15 +- src/server/game/Server/Packets/ChannelPackets.h | 38 +- src/server/game/Server/Packets/MiscPackets.cpp | 11 + src/server/game/Server/Packets/MiscPackets.h | 21 + src/server/game/Server/Packets/MovementPackets.cpp | 16 +- src/server/game/Server/Packets/MovementPackets.h | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 37 +- src/server/game/Server/Protocol/Opcodes.h | 51 +- src/server/game/Server/WorldSession.h | 54 +- src/server/scripts/Commands/cs_message.cpp | 2 +- 23 files changed, 721 insertions(+), 629 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 7695ab45de0..e2b6b16c9f2 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -31,18 +31,16 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): _IsSaved(false), _flags(0), _channelId(channelId), - _Team(team), - _ownerGUID(), - _name(name), - _password("") + _team(team), + _name(name) { // set special flags if built-in channel if (ChatChannelsEntry const* ch = sChatChannelsStore.LookupEntry(channelId)) // check whether it's a built-in channel { - _announce = false; // no join/leave announces - _ownership = false; // no ownership handout + _announce = false; // no join/leave announces + _ownership = false; // no ownership handout - _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels + _flags |= CHANNEL_FLAG_GENERAL; // for all built-in channels if (ch->Flags & CHANNEL_DBC_FLAG_TRADE) // for trade channel _flags |= CHANNEL_FLAG_TRADE; @@ -62,31 +60,31 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): // If storing custom channels in the db is enabled either load or save the channel if (sWorld->getBoolConfig(CONFIG_PRESERVE_CUSTOM_CHANNELS)) { - PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHANNEL); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (result) //load + if (result) // load { Field* fields = result->Fetch(); _announce = fields[0].GetBool(); _ownership = fields[1].GetBool(); _password = fields[2].GetString(); - const char* db_BannedList = fields[3].GetCString(); + std::string bannedList = fields[3].GetString(); - if (db_BannedList) + if (!bannedList.empty()) { - Tokenizer tokens(db_BannedList, ' '); + Tokenizer tokens(bannedList, ' '); for (Tokenizer::const_iterator i = tokens.begin(); i != tokens.end(); ++i) { std::string bannedGuidStr(*i); - ObjectGuid banned_guid; - banned_guid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), NULL, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), NULL, 16))); - if (!banned_guid.IsEmpty()) + ObjectGuid bannedGuid; + bannedGuid.SetRawValue(uint64(strtoull(bannedGuidStr.substr(0, 16).c_str(), nullptr, 16)), uint64(strtoull(bannedGuidStr.substr(16).c_str(), nullptr, 16))); + if (!bannedGuid.IsEmpty()) { - TC_LOG_DEBUG("chat.system", "Channel(%s) loaded bannedStore %s", name.c_str(), banned_guid.ToString().c_str()); - bannedStore.insert(banned_guid); + TC_LOG_DEBUG("chat.system", "Channel (%s) loaded bannedStore %s", _name.c_str(), bannedGuid.ToString().c_str()); + _bannedStore.insert(bannedGuid); } } } @@ -94,10 +92,10 @@ Channel::Channel(std::string const& name, uint32 channelId, uint32 team): else // save { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHANNEL); - stmt->setString(0, name); - stmt->setUInt32(1, _Team); + stmt->setString(0, _name); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) saved in database", name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) saved in database", _name.c_str()); } _IsSaved = true; @@ -110,22 +108,19 @@ void Channel::UpdateChannelInDB() const if (_IsSaved) { std::ostringstream banlist; - BannedContainer::const_iterator iter; - for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter) - banlist << *iter << ' '; - - std::string banListStr = banlist.str(); + for (ObjectGuid const& guid : _bannedStore) + banlist << guid << ' '; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL); stmt->setBool(0, _announce); stmt->setBool(1, _ownership); stmt->setString(2, _password); - stmt->setString(3, banListStr); + stmt->setString(3, banlist.str()); stmt->setString(4, _name); - stmt->setUInt32(5, _Team); + stmt->setUInt32(5, _team); CharacterDatabase.Execute(stmt); - TC_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str()); + TC_LOG_DEBUG("chat.system", "Channel (%s) updated in database", _name.c_str()); } } @@ -133,7 +128,7 @@ void Channel::UpdateChannelUseageInDB() const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_USAGE); stmt->setString(0, _name); - stmt->setUInt32(1, _Team); + stmt->setUInt32(1, _team); CharacterDatabase.Execute(stmt); } @@ -151,32 +146,32 @@ void Channel::CleanOldChannelsInDB() void Channel::JoinChannel(Player* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (IsOn(guid)) { // Do not send error message for built-in channels if (!IsConstant()) { - WorldPacket data; - MakePlayerAlreadyMember(&data, guid); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, guid); + player->SendDirectMessage(notify.Write()); } return; } if (IsBanned(guid)) { - WorldPacket data; - MakeBanned(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeBanned(notify); + player->SendDirectMessage(notify.Write()); return; } if (!_password.empty() && pass != _password) { - WorldPacket data; - MakeWrongPassword(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeWrongPassword(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -185,9 +180,9 @@ void Channel::JoinChannel(Player* player, std::string const& pass) AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && //FIXME: Move to RBAC player->GetGroup()) { - WorldPacket data; - MakeNotInLfg(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotInLfg(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -195,73 +190,90 @@ void Channel::JoinChannel(Player* player, std::string const& pass) if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeJoined(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeJoined(notify, guid); + SendToAll(notify.Write()); } - PlayerInfo pinfo; - pinfo.player = guid; - pinfo.flags = MEMBER_FLAG_NONE; - playersStore[guid] = pinfo; + PlayerInfo playerInfo; + playerInfo.PlayerGuid = guid; + _playersStore[guid] = playerInfo; - WorldPacket data; - MakeYouJoined(&data); - SendToOne(&data, guid); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouJoined(notify); + player->SendDirectMessage(notify.Write()); + */ - JoinNotify(guid); + WorldPackets::Channel::ChannelNotifyJoined notify; + //notify.ChannelWelcomeMsg = ""; + notify.ChatChannelID = _channelId; + //notify.InstanceID = 0; + notify.ChannelFlags = _flags; + notify.Channel = _name; + player->SendDirectMessage(notify.Write()); + + JoinNotify(player); // Custom channel handling if (!IsConstant()) { // Update last_used timestamp in db - if (!playersStore.empty()) + if (!_playersStore.empty()) UpdateChannelUseageInDB(); // If the channel has no owner yet and ownership is allowed, set the new owner. - if (!_ownerGUID && _ownership) + if (_ownerGUID.IsEmpty() && _ownership) { - SetOwner(guid, playersStore.size() > 1); - playersStore[guid].SetModerator(true); + SetOwner(guid, _playersStore.size() > 1); + _playersStore[guid].SetModerator(true); } } } void Channel::LeaveChannel(Player* player, bool send) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { if (send) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } return; } + player->LeftChannel(this); + if (send) { - WorldPacket data; - MakeYouLeft(&data); - SendToOne(&data, guid); - player->LeftChannel(this); - data.clear(); + /* + WorldPackets::Channel::ChannelNotify notify; + MakeYouLeft(notify); + player->SendDirectMessage(notify.Write()); + */ + + WorldPackets::Channel::ChannelNotifyLeft notify; + notify.Channel = _name; + notify.ChatChannelID = 0; + //notify.Suspended = false; + player->SendDirectMessage(notify.Write()); } - bool changeowner = playersStore[guid].IsOwner(); + bool changeowner = _playersStore[guid].IsOwner(); - playersStore.erase(guid); + _playersStore.erase(guid); if (_announce && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakeLeft(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeLeft(notify, guid); + SendToAll(notify.Write()); } - LeaveNotify(guid); + LeaveNotify(player); if (!IsConstant()) { @@ -269,10 +281,10 @@ void Channel::LeaveChannel(Player* player, bool send) UpdateChannelUseageInDB(); // If the channel owner left and there are still playersStore inside, pick a new owner - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = playersStore.begin()->second.player; - playersStore[newowner].SetModerator(true); + ObjectGuid const& newowner = _playersStore.begin()->second.PlayerGuid; + _playersStore[newowner].SetModerator(true); SetOwner(newowner); } } @@ -280,21 +292,21 @@ void Channel::LeaveChannel(Player* player, bool send) void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -302,9 +314,9 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; if (!victim || !IsOn(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } @@ -312,154 +324,152 @@ void Channel::KickOrBan(Player const* player, std::string const& badname, bool b if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } if (ban && !IsBanned(victim)) { - bannedStore.insert(victim); + _bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerBanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerBanned(notify, victim, good); + SendToAll(notify.Write()); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { - WorldPacket data; - MakePlayerKicked(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerKicked(notify, victim, good); + SendToAll(notify.Write()); } - playersStore.erase(victim); + _playersStore.erase(victim); bad->LeftChannel(this); - if (changeowner && _ownership && !playersStore.empty()) + if (changeowner && _ownership && !_playersStore.empty()) { - ObjectGuid newowner = good; - playersStore[newowner].SetModerator(true); - SetOwner(newowner); + _playersStore[good].SetModerator(true); + SetOwner(good); } } void Channel::UnBan(Player const* player, std::string const& badname) { - ObjectGuid good = player->GetGUID(); + ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname); ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsBanned(victim)) + if (victim.IsEmpty() || !IsBanned(victim)) { - WorldPacket data; - MakePlayerNotFound(&data, badname); - SendToOne(&data, good); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, badname); + player->SendDirectMessage(notify.Write()); return; } - bannedStore.erase(victim); + _bannedStore.erase(victim); - WorldPacket data; - MakePlayerUnbanned(&data, victim, good); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerUnbanned(notify, victim, good); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::Password(Player const* player, std::string const& pass) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); - ChatHandler chat(player->GetSession()); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _password = pass; - WorldPacket data; - MakePasswordChanged(&data, guid); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakePasswordChanged(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bool set) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } - if (guid == _ownerGUID && std::string(p2n) == player->GetName() && mod) + if (guid == _ownerGUID && p2n == player->GetName() && mod) return; Player* newp = ObjectAccessor::FindConnectedPlayerByName(p2n); ObjectGuid victim = newp ? newp->GetGUID() : ObjectGuid::Empty; - if (!victim || !IsOn(victim) || + if (victim.IsEmpty() || !IsOn(victim) || (player->GetTeam() != newp->GetTeam() && (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, p2n); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, p2n); + player->SendDirectMessage(notify.Write()); return; } if (_ownerGUID == victim && _ownerGUID != guid) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -471,21 +481,21 @@ void Channel::SetMode(Player const* player, std::string const& p2n, bool mod, bo void Channel::SetOwner(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && guid != _ownerGUID) { - WorldPacket data; - MakeNotOwner(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotOwner(notify); + player->SendDirectMessage(notify.Write()); return; } @@ -497,55 +507,49 @@ void Channel::SetOwner(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL)))) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } - playersStore[victim].SetModerator(true); + _playersStore[victim].SetModerator(true); SetOwner(victim); } -void Channel::SendWhoOwner(ObjectGuid guid) +void Channel::SendWhoOwner(Player const* player) { - WorldPacket data; - if (IsOn(guid)) - MakeChannelOwner(&data); + WorldPackets::Channel::ChannelNotify notify; + if (IsOn(player->GetGUID())) + MakeChannelOwner(notify); else - MakeNotMember(&data); - SendToOne(&data, guid); + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); } void Channel::List(Player const* player) { - ObjectGuid guid = player->GetGUID(); - - if (!IsOn(guid)) + if (!IsOn(player->GetGUID())) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } TC_LOG_DEBUG("chat.system", "SMSG_CHANNEL_LIST %s Channel: %s", player->GetSession()->GetPlayerInfo().c_str(), GetName().c_str()); - WorldPacket data(SMSG_CHANNEL_LIST, 1+(GetName().size()+1)+1+4+playersStore.size()*(8+1)); - data << uint8(1); // channel type? - data << GetName(); // channel name - data << uint8(GetFlags()); // channel flags? - - size_t pos = data.wpos(); - data << uint32(0); // size of list, placeholder + WorldPackets::Channel::ChannelListResponse list; + list.Display = true; /// always true? + list.Channel = GetName(); + list.ChannelFlags = GetFlags(); uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST); - uint32 count = 0; - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) + for (PlayerContainer::value_type const& i : _playersStore) { - Player* member = ObjectAccessor::FindConnectedPlayer(i->first); + Player* member = ObjectAccessor::FindConnectedPlayer(i.first); // PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all @@ -554,50 +558,46 @@ void Channel::List(Player const* player) member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) && member->IsVisibleGloballyFor(player)) { - data << i->first; - data << uint8(i->second.flags); // flags seems to be changed... - ++count; + list.Members.emplace_back(i.second.PlayerGuid, GetVirtualRealmAddress(), i.second.GetFlags()); } } - data.put(pos, count); - - SendToOne(&data, guid); + player->SendDirectMessage(list.Write()); } void Channel::Announce(Player const* player) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } - if (!playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) + if (!_playersStore[guid].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { - WorldPacket data; - MakeNotModerator(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotModerator(notify); + player->SendDirectMessage(notify.Write()); return; } _announce = !_announce; - WorldPacket data; + WorldPackets::Channel::ChannelNotify notify; if (_announce) - MakeAnnouncementsOn(&data, guid); + MakeAnnouncementsOn(notify, guid); else - MakeAnnouncementsOff(&data, guid); - SendToAll(&data); + MakeAnnouncementsOff(notify, guid); + SendToAll(notify.Write()); UpdateChannelInDB(); } -void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) +void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) { if (what.empty()) return; @@ -608,17 +608,17 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + SendToOne(notify.Write(), guid); return; } - if (playersStore[guid].IsMuted()) + if (_playersStore[guid].IsMuted()) { - WorldPacket data; - MakeMuted(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeMuted(notify); + SendToOne(notify.Write(), guid); return; } @@ -632,35 +632,35 @@ void Channel::Say(ObjectGuid guid, std::string const& what, uint32 lang) packet.TargetGUID = guid; } - SendToAll(packet.Write(), !playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); + SendToAll(packet.Write(), !_playersStore[guid].IsModerator() ? guid : ObjectGuid::Empty); } void Channel::Invite(Player const* player, std::string const& newname) { - ObjectGuid guid = player->GetGUID(); + ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) { - WorldPacket data; - MakeNotMember(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeNotMember(notify); + player->SendDirectMessage(notify.Write()); return; } Player* newp = ObjectAccessor::FindConnectedPlayerByName(newname); if (!newp || !newp->isGMVisible()) { - WorldPacket data; - MakePlayerNotFound(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerNotFound(notify, newname); + player->SendDirectMessage(notify.Write()); return; } if (IsBanned(newp->GetGUID())) { - WorldPacket data; - MakePlayerInviteBanned(&data, newname); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInviteBanned(notify, newname); + player->SendDirectMessage(notify.Write()); return; } @@ -668,169 +668,167 @@ void Channel::Invite(Player const* player, std::string const& newname) (!player->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL) || !newp->GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL))) { - WorldPacket data; - MakeInviteWrongFaction(&data); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakeInviteWrongFaction(notify); + player->SendDirectMessage(notify.Write()); return; } if (IsOn(newp->GetGUID())) { - WorldPacket data; - MakePlayerAlreadyMember(&data, newp->GetGUID()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerAlreadyMember(notify, newp->GetGUID()); + player->SendDirectMessage(notify.Write()); return; } if (!newp->GetSocial()->HasIgnore(guid)) { - WorldPacket data; - MakeInvite(&data, guid); - SendToOne(&data, newp->GetGUID()); - data.clear(); + WorldPackets::Channel::ChannelNotify notify; + MakeInvite(notify, guid); + newp->SendDirectMessage(notify.Write()); } - WorldPacket data; - MakePlayerInvited(&data, newp->GetName()); - SendToOne(&data, guid); + WorldPackets::Channel::ChannelNotify notify; + MakePlayerInvited(notify, newp->GetName()); + player->SendDirectMessage(notify.Write()); } -void Channel::SetOwner(ObjectGuid guid, bool exclaim) +void Channel::SetOwner(ObjectGuid const& guid, bool exclaim) { if (!_ownerGUID.IsEmpty()) { // [] will re-add player after it possible removed - PlayerContainer::iterator p_itr = playersStore.find(_ownerGUID); - if (p_itr != playersStore.end()) - p_itr->second.SetOwner(false); + PlayerContainer::iterator itr = _playersStore.find(_ownerGUID); + if (itr != _playersStore.end()) + itr->second.SetOwner(false); } _ownerGUID = guid; if (!_ownerGUID.IsEmpty()) { - uint8 oldFlag = GetPlayerFlags(_ownerGUID); - playersStore[_ownerGUID].SetModerator(true); - playersStore[_ownerGUID].SetOwner(true); + uint8 oldFlag = _playersStore[_ownerGUID].GetFlags(); + _playersStore[_ownerGUID].SetModerator(true); + _playersStore[_ownerGUID].SetOwner(true); - WorldPacket data; - MakeModeChange(&data, _ownerGUID, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify notify; + MakeModeChange(notify, _ownerGUID, oldFlag, _playersStore[_ownerGUID].GetFlags()); + SendToAll(notify.Write()); if (exclaim) { - MakeOwnerChanged(&data, _ownerGUID); - SendToAll(&data); + MakeOwnerChanged(notify, _ownerGUID); + SendToAll(notify.Write()); } UpdateChannelInDB(); } } -void Channel::SendToAll(WorldPacket const* data, ObjectGuid guid) +void Channel::SendToAll(WorldPacket const* data, ObjectGuid const& guid) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - if (!guid || !player->GetSocial()->HasIgnore(guid)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + if (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid)) + player->SendDirectMessage(data); } -void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToAllButOne(WorldPacket const* data, ObjectGuid const& who) { - for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) - if (i->first != who) - if (Player* player = ObjectAccessor::FindConnectedPlayer(i->first)) - player->GetSession()->SendPacket(data); + for (PlayerContainer::value_type const& i : _playersStore) + if (i.first != who) + if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first)) + player->SendDirectMessage(data); } -void Channel::SendToOne(WorldPacket const* data, ObjectGuid who) +void Channel::SendToOne(WorldPacket const* data, ObjectGuid const& who) { if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } -void Channel::Voice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::Voice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::DeVoice(ObjectGuid /*guid1*/, ObjectGuid /*guid2*/) +void Channel::DeVoice(ObjectGuid const& /*guid1*/, ObjectGuid const& /*guid2*/) { } -void Channel::MakeNotifyPacket(WorldPacket* data, uint8 notify_type) +void Channel::MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + _name.size()); - *data << uint8(notify_type); - *data << _name; + data.Type = notifyType; + data.Channel = _name; } -void Channel::MakeJoined(WorldPacket* data, ObjectGuid guid) +void Channel::MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_JOINED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeLeft(WorldPacket* data, ObjectGuid guid) +void Channel::MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_LEFT_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeYouJoined(WorldPacket* data) +void Channel::MakeYouJoined(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE); - *data << uint8(GetFlags()); - *data << uint32(GetChannelId()); - *data << uint32(0); + //*data << uint8(GetFlags()); + data.ChatChannelID = GetChannelId(); + //*data << uint32(0); } -void Channel::MakeYouLeft(WorldPacket* data) +void Channel::MakeYouLeft(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE); - *data << uint32(GetChannelId()); - *data << uint8(IsConstant()); + data.ChatChannelID = GetChannelId(); + //*data << uint8(IsConstant()); } -void Channel::MakeWrongPassword(WorldPacket* data) +void Channel::MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_PASSWORD_NOTICE); } -void Channel::MakeNotMember(WorldPacket* data) +void Channel::MakeNotMember(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE); } -void Channel::MakeNotModerator(WorldPacket* data) +void Channel::MakeNotModerator(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE); } -void Channel::MakePasswordChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PASSWORD_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeOwnerChanged(WorldPacket* data, ObjectGuid guid) +void Channel::MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_OWNER_CHANGED_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakePlayerNotFound(WorldPacket* data, std::string const& name) +void Channel::MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_FOUND_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeNotOwner(WorldPacket* data) +void Channel::MakeNotOwner(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_OWNER_NOTICE); } -void Channel::MakeChannelOwner(WorldPacket* data) +void Channel::MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data) { std::string name; @@ -838,139 +836,140 @@ void Channel::MakeChannelOwner(WorldPacket* data) name = "PLAYER_NOT_FOUND"; MakeNotifyPacket(data, CHAT_CHANNEL_OWNER_NOTICE); - *data << ((IsConstant() || !_ownerGUID) ? "Nobody" : name); + data.Sender = ((IsConstant() || !_ownerGUID) ? "Nobody" : name); } -void Channel::MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags) +void Channel::MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags) { MakeNotifyPacket(data, CHAT_MODE_CHANGE_NOTICE); - *data << guid; - *data << uint8(oldflags); - *data << uint8(GetPlayerFlags(guid)); + data.SenderGuid = guid; + data.OldFlags = oldFlags; + data.NewFlags = newFlags; } -void Channel::MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_ANNOUNCEMENTS_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeMuted(WorldPacket* data) +void Channel::MakeMuted(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_MUTED_NOTICE); } -void Channel::MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_KICKED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakeBanned(WorldPacket* data) +void Channel::MakeBanned(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_BANNED_NOTICE); } -void Channel::MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_BANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good) +void Channel::MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good) { MakeNotifyPacket(data, CHAT_PLAYER_UNBANNED_NOTICE); - *data << bad; - *data << good; + data.SenderGuid = good; + data.TargetGuid = bad; } -void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string &name) +void Channel::MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid) +void Channel::MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_PLAYER_ALREADY_MEMBER_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInvite(WorldPacket* data, ObjectGuid guid) +void Channel::MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_INVITE_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeInviteWrongFaction(WorldPacket* data) +void Channel::MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVITE_WRONG_FACTION_NOTICE); } -void Channel::MakeWrongFaction(WorldPacket* data) +void Channel::MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_WRONG_FACTION_NOTICE); } -void Channel::MakeInvalidName(WorldPacket* data) +void Channel::MakeInvalidName(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_INVALID_NAME_NOTICE); } -void Channel::MakeNotModerated(WorldPacket* data) +void Channel::MakeNotModerated(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_MODERATED_NOTICE); } -void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITE_BANNED_NOTICE); - *data << name; + data.Sender = name; } -void Channel::MakeThrottled(WorldPacket* data) +void Channel::MakeThrottled(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_THROTTLED_NOTICE); } -void Channel::MakeNotInArea(WorldPacket* data) +void Channel::MakeNotInArea(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_AREA_NOTICE); } -void Channel::MakeNotInLfg(WorldPacket* data) +void Channel::MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data) { MakeNotifyPacket(data, CHAT_NOT_IN_LFG_NOTICE); } -void Channel::MakeVoiceOn(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_ON_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::MakeVoiceOff(WorldPacket* data, ObjectGuid guid) +void Channel::MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid) { MakeNotifyPacket(data, CHAT_VOICE_OFF_NOTICE); - *data << guid; + data.SenderGuid = guid; } -void Channel::JoinNotify(ObjectGuid guid) +void Channel::JoinNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(IsConstant() ? SMSG_USERLIST_ADD : SMSG_USERLIST_UPDATE, 8 + 1 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetPlayerFlags(guid)); @@ -984,8 +983,9 @@ void Channel::JoinNotify(ObjectGuid guid) SendToAll(&data); } -void Channel::LeaveNotify(ObjectGuid guid) +void Channel::LeaveNotify(Player const* player) { + ObjectGuid const& guid = player->GetGUID(); WorldPacket data(SMSG_USERLIST_REMOVE, 8 + 1 + 4 + GetName().size()); data << guid; data << uint8(GetFlags()); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index f1f01e64f44..4ee83b8fbb2 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -19,14 +19,11 @@ #ifndef _CHANNEL_H #define _CHANNEL_H -#include -#include -#include - #include "Common.h" #include "WorldSession.h" -#include "WorldPacket.h" + +#include "Packets/ChannelPackets.h" class Player; @@ -122,33 +119,47 @@ class Channel { struct PlayerInfo { - ObjectGuid player; - uint8 flags; + ObjectGuid PlayerGuid; + + uint8 GetFlags() const { return _flags; } + inline bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } + inline void SetFlag(uint8 flag) { _flags |= flag; } + inline void RemoveFlag(uint8 flag) { _flags &= ~flag; } - bool HasFlag(uint8 flag) const { return (flags & flag) != 0; } - void SetFlag(uint8 flag) { flags |= flag; } - bool IsOwner() const { return (flags & MEMBER_FLAG_OWNER) != 0; } + bool IsOwner() const { return HasFlag(MEMBER_FLAG_OWNER); } void SetOwner(bool state) { - if (state) flags |= MEMBER_FLAG_OWNER; - else flags &= ~MEMBER_FLAG_OWNER; + if (state) + SetFlag(MEMBER_FLAG_OWNER); + else + RemoveFlag(MEMBER_FLAG_OWNER); } - bool IsModerator() const { return (flags & MEMBER_FLAG_MODERATOR) != 0; } + + bool IsModerator() const { return HasFlag(MEMBER_FLAG_MODERATOR); } void SetModerator(bool state) { - if (state) flags |= MEMBER_FLAG_MODERATOR; - else flags &= ~MEMBER_FLAG_MODERATOR; + if (state) + SetFlag(MEMBER_FLAG_MODERATOR); + else + RemoveFlag(MEMBER_FLAG_MODERATOR); } - bool IsMuted() const { return (flags & MEMBER_FLAG_MUTED) != 0; } + + bool IsMuted() const { return HasFlag(MEMBER_FLAG_MUTED); } void SetMuted(bool state) { - if (state) flags |= MEMBER_FLAG_MUTED; - else flags &= ~MEMBER_FLAG_MUTED; + if (state) + SetFlag(MEMBER_FLAG_MUTED); + else + RemoveFlag(MEMBER_FLAG_MUTED); } + + private: + uint8 _flags = MEMBER_FLAG_NONE; }; public: Channel(std::string const& name, uint32 channel_id, uint32 Team = 0); + std::string const& GetName() const { return _name; } uint32 GetChannelId() const { return _channelId; } bool IsConstant() const { return _channelId != 0; } @@ -157,7 +168,7 @@ class Channel std::string const& GetPassword() const { return _password; } void SetPassword(std::string const& npassword) { _password = npassword; } void SetAnnounce(bool nannounce) { _announce = nannounce; } - uint32 GetNumPlayers() const { return playersStore.size(); } + uint32 GetNumPlayers() const { return _playersStore.size(); } uint8 GetFlags() const { return _flags; } bool HasFlag(uint8 flag) const { return (_flags & flag) != 0; } @@ -169,102 +180,102 @@ class Channel void UnBan(Player const* player, std::string const& badname); void Password(Player const* player, std::string const& pass); void SetMode(Player const* player, std::string const& p2n, bool mod, bool set); - void SetOwner(ObjectGuid guid, bool exclaim = true); + void SetOwner(ObjectGuid const& guid, bool exclaim = true); void SetOwner(Player const* player, std::string const& name); - void SendWhoOwner(ObjectGuid guid); + void SendWhoOwner(Player const* player); void SetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, true); } void UnsetModerator(Player const* player, std::string const& newname) { SetMode(player, newname, true, false); } void SetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, true); } void UnsetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, false); } void List(Player const* player); void Announce(Player const* player); - void Say(ObjectGuid guid, std::string const& what, uint32 lang); + void Say(ObjectGuid const& guid, std::string const& what, uint32 lang); void Invite(Player const* player, std::string const& newp); - void Voice(ObjectGuid guid1, ObjectGuid guid2); - void DeVoice(ObjectGuid guid1, ObjectGuid guid2); - void JoinNotify(ObjectGuid guid); // invisible notify - void LeaveNotify(ObjectGuid guid); // invisible notify + void Voice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void DeVoice(ObjectGuid const& guid1, ObjectGuid const& guid2); + void JoinNotify(Player const* player); + void LeaveNotify(Player const* player); void SetOwnership(bool ownership) { _ownership = ownership; }; static void CleanOldChannelsInDB(); private: // initial packet data (notify type and channel name) - void MakeNotifyPacket(WorldPacket* data, uint8 notify_type); + void MakeNotifyPacket(WorldPackets::Channel::ChannelNotify& data, uint8 notifyType); // type specific packet data - void MakeJoined(WorldPacket* data, ObjectGuid guid); //+ 0x00 - void MakeLeft(WorldPacket* data, ObjectGuid guid); //+ 0x01 - void MakeYouJoined(WorldPacket* data); //+ 0x02 - void MakeYouLeft(WorldPacket* data); //+ 0x03 - void MakeWrongPassword(WorldPacket* data); //? 0x04 - void MakeNotMember(WorldPacket* data); //? 0x05 - void MakeNotModerator(WorldPacket* data); //? 0x06 - void MakePasswordChanged(WorldPacket* data, ObjectGuid guid); //+ 0x07 - void MakeOwnerChanged(WorldPacket* data, ObjectGuid guid); //? 0x08 - void MakePlayerNotFound(WorldPacket* data, std::string const& name); //+ 0x09 - void MakeNotOwner(WorldPacket* data); //? 0x0A - void MakeChannelOwner(WorldPacket* data); //? 0x0B - void MakeModeChange(WorldPacket* data, ObjectGuid guid, uint8 oldflags);//+ 0x0C - void MakeAnnouncementsOn(WorldPacket* data, ObjectGuid guid); //+ 0x0D - void MakeAnnouncementsOff(WorldPacket* data, ObjectGuid guid); //+ 0x0E - void MakeMuted(WorldPacket* data); //? 0x11 - void MakePlayerKicked(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x12 - void MakeBanned(WorldPacket* data); //? 0x13 - void MakePlayerBanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x14 - void MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid good);//? 0x15 - void MakePlayerNotBanned(WorldPacket* data, std::string const& name); //? 0x16 - void MakePlayerAlreadyMember(WorldPacket* data, ObjectGuid guid); //+ 0x17 - void MakeInvite(WorldPacket* data, ObjectGuid guid); //? 0x18 - void MakeInviteWrongFaction(WorldPacket* data); //? 0x19 - void MakeWrongFaction(WorldPacket* data); //? 0x1A - void MakeInvalidName(WorldPacket* data); //? 0x1B - void MakeNotModerated(WorldPacket* data); //? 0x1C - void MakePlayerInvited(WorldPacket* data, std::string const& name); //+ 0x1D - void MakePlayerInviteBanned(WorldPacket* data, std::string const& name);//? 0x1E - void MakeThrottled(WorldPacket* data); //? 0x1F - void MakeNotInArea(WorldPacket* data); //? 0x20 - void MakeNotInLfg(WorldPacket* data); //? 0x21 - void MakeVoiceOn(WorldPacket* data, ObjectGuid guid); //+ 0x22 - void MakeVoiceOff(WorldPacket* data, ObjectGuid guid); //+ 0x23 + void MakeJoined(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x00 + void MakeLeft(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x01 + void MakeYouJoined(WorldPackets::Channel::ChannelNotify& data); //+ 0x02 + void MakeYouLeft(WorldPackets::Channel::ChannelNotify& data); //+ 0x03 + void MakeWrongPassword(WorldPackets::Channel::ChannelNotify& data); //? 0x04 + void MakeNotMember(WorldPackets::Channel::ChannelNotify& data); //? 0x05 + void MakeNotModerator(WorldPackets::Channel::ChannelNotify& data); //? 0x06 + void MakePasswordChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x07 + void MakeOwnerChanged(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x08 + void MakePlayerNotFound(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x09 + void MakeNotOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0A + void MakeChannelOwner(WorldPackets::Channel::ChannelNotify& data); //? 0x0B + void MakeModeChange(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags); //+ 0x0C + void MakeAnnouncementsOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0D + void MakeAnnouncementsOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x0E + void MakeMuted(WorldPackets::Channel::ChannelNotify& data); //? 0x11 + void MakePlayerKicked(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x12 + void MakeBanned(WorldPackets::Channel::ChannelNotify& data); //? 0x13 + void MakePlayerBanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x14 + void MakePlayerUnbanned(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& bad, ObjectGuid const& good); //? 0x15 + void MakePlayerNotBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x16 + void MakePlayerAlreadyMember(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x17 + void MakeInvite(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //? 0x18 + void MakeInviteWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x19 + void MakeWrongFaction(WorldPackets::Channel::ChannelNotify& data); //? 0x1A + void MakeInvalidName(WorldPackets::Channel::ChannelNotify& data); //? 0x1B + void MakeNotModerated(WorldPackets::Channel::ChannelNotify& data); //? 0x1C + void MakePlayerInvited(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //+ 0x1D + void MakePlayerInviteBanned(WorldPackets::Channel::ChannelNotify& data, std::string const& name); //? 0x1E + void MakeThrottled(WorldPackets::Channel::ChannelNotify& data); //? 0x1F + void MakeNotInArea(WorldPackets::Channel::ChannelNotify& data); //? 0x20 + void MakeNotInLfg(WorldPackets::Channel::ChannelNotify& data); //? 0x21 + void MakeVoiceOn(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x22 + void MakeVoiceOff(WorldPackets::Channel::ChannelNotify& data, ObjectGuid const& guid); //+ 0x23 - void SendToAll(WorldPacket const* data, ObjectGuid guid = ObjectGuid::Empty); - void SendToAllButOne(WorldPacket const* data, ObjectGuid who); - void SendToOne(WorldPacket const* data, ObjectGuid who); + void SendToAll(WorldPacket const* data, ObjectGuid const& guid = ObjectGuid::Empty); + void SendToAllButOne(WorldPacket const* data, ObjectGuid const& who); + void SendToOne(WorldPacket const* data, ObjectGuid const& who); - bool IsOn(ObjectGuid who) const { return playersStore.find(who) != playersStore.end(); } - bool IsBanned(ObjectGuid guid) const { return bannedStore.find(guid) != bannedStore.end(); } + bool IsOn(ObjectGuid const& who) const { return _playersStore.find(who) != _playersStore.end(); } + bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.find(guid) != _bannedStore.end(); } void UpdateChannelInDB() const; void UpdateChannelUseageInDB() const; - uint8 GetPlayerFlags(ObjectGuid guid) const + uint8 GetPlayerFlags(ObjectGuid const& guid) const { - PlayerContainer::const_iterator itr = playersStore.find(guid); - return itr != playersStore.end() ? itr->second.flags : 0; + PlayerContainer::const_iterator itr = _playersStore.find(guid); + return itr != _playersStore.end() ? itr->second.GetFlags() : 0; } - void SetModerator(ObjectGuid guid, bool set) + void SetModerator(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsModerator() != set) + if (_playersStore[guid].IsModerator() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetModerator(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetModerator(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } - void SetMute(ObjectGuid guid, bool set) + void SetMute(ObjectGuid const& guid, bool set) { - if (playersStore[guid].IsMuted() != set) + if (_playersStore[guid].IsMuted() != set) { - uint8 oldFlag = GetPlayerFlags(guid); - playersStore[guid].SetMuted(set); + uint8 oldFlag = _playersStore[guid].GetFlags(); + _playersStore[guid].SetMuted(set); - WorldPacket data; - MakeModeChange(&data, guid, oldFlag); - SendToAll(&data); + WorldPackets::Channel::ChannelNotify data; + MakeModeChange(data, guid, oldFlag, _playersStore[guid].GetFlags()); + SendToAll(data.Write()); } } @@ -276,12 +287,12 @@ class Channel bool _IsSaved; uint8 _flags; uint32 _channelId; - uint32 _Team; + uint32 _team; ObjectGuid _ownerGUID; std::string _name; std::string _password; - PlayerContainer playersStore; - BannedContainer bannedStore; + PlayerContainer _playersStore; + BannedContainer _bannedStore; }; -#endif +#endif diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index a3a4ef69e63..ca664abffd9 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -23,11 +23,11 @@ ChannelMgr::~ChannelMgr() { - for (ChannelMap::iterator itr = channels.begin(); itr != channels.end(); ++itr) + for (ChannelMap::iterator itr = _channels.begin(); itr != _channels.end(); ++itr) delete itr->second; } -ChannelMgr* ChannelMgr::forTeam(uint32 team) +ChannelMgr* ChannelMgr::ForTeam(uint32 team) { static ChannelMgr allianceChannelMgr; static ChannelMgr hordeChannelMgr; @@ -40,49 +40,43 @@ ChannelMgr* ChannelMgr::forTeam(uint32 team) if (team == HORDE) return &hordeChannelMgr; - return NULL; + return nullptr; } Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - Channel* nchan = new Channel(name, channelId, team); - channels[wname] = nchan; + Channel* nchan = new Channel(name, channelId, _team); + _channels[wname] = nchan; return nchan; } return i->second; } -Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pkt) +Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool notify /*= true*/) { std::wstring wname; if (!Utf8toWStr(name, wname)) - return NULL; + return nullptr; wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) { - if (pkt) - { - WorldPacket data; - MakeNotOnPacket(&data, name); - player->GetSession()->SendPacket(&data); - } - - return NULL; + if (notify) + SendNotOnChannelNotify(player, name); + + return nullptr; } return i->second; @@ -96,22 +90,23 @@ void ChannelMgr::LeftChannel(std::string const& name) wstrToLower(wname); - ChannelMap::const_iterator i = channels.find(wname); - - if (i == channels.end()) + ChannelMap::const_iterator i = _channels.find(wname); + if (i == _channels.end()) return; Channel* channel = i->second; if (!channel->GetNumPlayers() && !channel->IsConstant()) { - channels.erase(wname); + _channels.erase(i); delete channel; } } -void ChannelMgr::MakeNotOnPacket(WorldPacket* data, std::string const& name) +void ChannelMgr::SendNotOnChannelNotify(Player const* player, std::string const& name) { - data->Initialize(SMSG_CHANNEL_NOTIFY, 1 + name.size()); - (*data) << uint8(5) << name; + WorldPackets::Channel::ChannelNotify notify; + notify.Type = CHAT_NOT_MEMBER_NOTICE; + notify.Channel = name; + player->SendDirectMessage(notify.Write()); } diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index eee45ba5b97..9a8fdb10767 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -21,11 +21,6 @@ #include "Common.h" #include "Channel.h" -#include -#include - -#include "World.h" - #define MAX_CHANNEL_PASS_STR 31 class ChannelMgr @@ -33,22 +28,22 @@ class ChannelMgr typedef std::map ChannelMap; protected: - ChannelMgr() : team(0) { } + ChannelMgr() : _team(0) { } ~ChannelMgr(); public: - static ChannelMgr* forTeam(uint32 team); - void setTeam(uint32 newTeam) { team = newTeam; } + static ChannelMgr* ForTeam(uint32 team); + void SetTeam(uint32 newTeam) { _team = newTeam; } - Channel* GetJoinChannel(std::string const& name, uint32 channel_id); - Channel* GetChannel(std::string const& name, Player* p, bool pkt = true); + Channel* GetJoinChannel(std::string const& name, uint32 channelId); + Channel* GetChannel(std::string const& name, Player* player, bool notify = true); void LeftChannel(std::string const& name); private: - ChannelMap channels; - uint32 team; + ChannelMap _channels; + uint32 _team; - void MakeNotOnPacket(WorldPacket* data, std::string const& name); + static void SendNotOnChannelNotify(Player const* player, std::string const& name); }; #endif diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 3a74d2cc045..6bf579fff14 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2574,7 +2574,7 @@ void Creature::SetDisplayId(uint32 modelId) } } -void Creature::SetTarget(ObjectGuid guid) +void Creature::SetTarget(ObjectGuid const& guid) { if (!_focusSpell) SetGuidValue(UNIT_FIELD_TARGET, guid); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ef171e311ae..4f805088548 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -674,7 +674,7 @@ class Creature : public Unit, public GridObject, public MapObject bool m_isTempWorldObject; //true when possessed // Handling caster facing during spellcast - void SetTarget(ObjectGuid guid) override; + void SetTarget(ObjectGuid const& guid) override; void FocusTarget(Spell const* focusSpell, WorldObject const* target); void ReleaseFocus(Spell const* focusSpell); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7e6d56279b2..29d4e12604c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5225,8 +5225,8 @@ void Player::CleanupChannels() { Channel* ch = *m_channels.begin(); m_channels.erase(m_channels.begin()); // remove from player's channel list - ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam())) + ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam())) cMgr->LeftChannel(ch->GetName()); // deleted channel if empty } TC_LOG_DEBUG("chat.system", "Player %s: channels cleaned up!", GetName().c_str()); @@ -5241,12 +5241,10 @@ void Player::UpdateLocalChannels(uint32 newZone) if (!current_zone) return; - ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam()); + ChannelMgr* cMgr = ChannelMgr::ForTeam(GetTeam()); if (!cMgr) return; - std::string current_zone_name = current_zone->ZoneName; - for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i) { if (ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i)) @@ -5279,7 +5277,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY) currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY); else - currentNameExt = current_zone_name.c_str(); + currentNameExt = current_zone->ZoneName; snprintf(new_channel_name_buf, 100, channel->Name_lang, currentNameExt); @@ -16757,7 +16755,8 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) eqSet.State = EQUIPMENT_SET_UNCHANGED; for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - eqSet.Data.Pieces[i] = ObjectGuid::Create(fields[5 + i].GetUInt64()); + if (uint64 guid = fields[5 + i].GetUInt64()) + eqSet.Data.Pieces[i] = ObjectGuid::Create(guid); if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit continue; @@ -22997,6 +22996,9 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_SEND_UNLEARN_SPELLS SendDirectMessage(WorldPackets::Spell::SendUnlearnSpells().Write()); + /// @todo: SMSG_SEND_SPELL_HISTORY + /// @todo: SMSG_SEND_SPELL_CHARGES + /// SMSG_ACTION_BUTTONS SendInitialActionButtons(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8a90204b70f..1dcd75a156e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1758,8 +1758,8 @@ class Player : public Unit, public GridObject Unit* GetSelectedUnit() const; Player* GetSelectedPlayer() const; - void SetTarget(ObjectGuid /*guid*/) override { } /// Used for serverside target changes, does not apply to players - void SetSelection(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } + void SetTarget(ObjectGuid const& /*guid*/) override { } /// Used for serverside target changes, does not apply to players + void SetSelection(ObjectGuid const& guid) { SetGuidValue(UNIT_FIELD_TARGET, guid); } uint8 GetComboPoints() const { return m_comboPoints; } ObjectGuid GetComboTarget() const { return m_comboTarget; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1905f41e84e..1418dc2ad35 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2164,7 +2164,7 @@ class Unit : public WorldObject TempSummon const* ToTempSummon() const { if (IsSummon()) return reinterpret_cast(this); else return NULL; } ObjectGuid GetTarget() const { return GetGuidValue(UNIT_FIELD_TARGET); } - virtual void SetTarget(ObjectGuid /*guid*/) = 0; + virtual void SetTarget(ObjectGuid const& /*guid*/) = 0; // Movement info Movement::MoveSpline * movespline; diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index 5826415a201..c6cd5337c5b 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -18,31 +18,20 @@ #include "ObjectMgr.h" // for normalizePlayerName #include "ChannelMgr.h" +#include "ChannelPackets.h" #include "Player.h" #include "WorldSession.h" #include -void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) +void WorldSession::HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet) { - uint32 channelId; - uint32 channelLength, passLength; - std::string channelName, password; + TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s ChatChannelId: %u, CreateVoiceSession: %u, Internal: %u, ChannelName: %s, Password: %s", + GetPlayerInfo().c_str(), packet.ChatChannelId, packet.CreateVoiceSession, packet.Internal, packet.ChannelName.c_str(), packet.Password.c_str()); - recvPacket >> channelId; - uint8 unknown1 = recvPacket.ReadBit(); // unknowns - uint8 unknown2 = recvPacket.ReadBit(); - channelLength = recvPacket.ReadBits(8); - passLength = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(channelLength); - password = recvPacket.ReadString(passLength); - - TC_LOG_DEBUG("chat.system", "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s", - GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str()); - - if (channelId) + if (packet.ChatChannelId) { - ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId); + ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(packet.ChatChannelId); if (!channel) return; @@ -51,53 +40,43 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) return; } - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (isdigit(channelName[0])) + if (isdigit(packet.ChannelName[0])) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - cMgr->setTeam(GetPlayer()->GetTeam()); - if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId)) - channel->JoinChannel(GetPlayer(), password); + cMgr->SetTeam(GetPlayer()->GetTeam()); + if (Channel* channel = cMgr->GetJoinChannel(packet.ChannelName, packet.ChatChannelId)) + channel->JoinChannel(GetPlayer(), packet.Password); } } -void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) +void WorldSession::HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet) { - uint32 unk; - std::string channelName; - recvPacket >> unk; // channel id? - uint32 length = recvPacket.ReadBits(8); - channelName = recvPacket.ReadString(length); + TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s ChannelName: %s, ZoneChannelID: %u", + GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.ZoneChannelID); - TC_LOG_DEBUG("chat.system", "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", - GetPlayerInfo().c_str(), channelName.c_str(), unk); - - if (channelName.empty()) + if (packet.ChannelName.empty()) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->LeaveChannel(GetPlayer(), true); - cMgr->LeftChannel(channelName); + cMgr->LeftChannel(packet.ChannelName); } } -void WorldSession::HandleChannelList(WorldPacket& recvPacket) +void WorldSession::HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet) { - uint32 length = recvPacket.ReadBits(8); - std::string channelName = recvPacket.ReadString(length); - - TC_LOG_DEBUG("chat.system", "%s %s Channel: %s", - recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST", - GetPlayerInfo().c_str(), channelName.c_str()); + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) channel->List(GetPlayer()); } @@ -115,7 +94,7 @@ void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) if (password.length() > MAX_CHANNEL_PASS_STR) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Password(GetPlayer(), password); } @@ -134,7 +113,7 @@ void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetOwner(GetPlayer(), targetName); } @@ -147,9 +126,9 @@ void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SendWhoOwner(GetPlayer()->GetGUID()); + channel->SendWhoOwner(GetPlayer()); } void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) @@ -166,7 +145,7 @@ void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetModerator(GetPlayer(), targetName); } @@ -185,7 +164,7 @@ void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetModerator(GetPlayer(), targetName); } @@ -204,7 +183,7 @@ void WorldSession::HandleChannelMute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->SetMute(GetPlayer(), targetName); } @@ -223,7 +202,7 @@ void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnsetMute(GetPlayer(), targetName); } @@ -242,7 +221,7 @@ void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Invite(GetPlayer(), targetName); } @@ -261,7 +240,7 @@ void WorldSession::HandleChannelKick(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Kick(GetPlayer(), targetName); } @@ -283,7 +262,7 @@ void WorldSession::HandleChannelBan(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Ban(GetPlayer(), targetName); } @@ -302,7 +281,7 @@ void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) if (!normalizePlayerName(targetName)) return; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->UnBan(GetPlayer(), targetName); } @@ -315,17 +294,11 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) channel->Announce(GetPlayer()); } -void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket) -{ - // this should be OK because the 2 function _were_ the same - HandleChannelList(recvPacket); -} - void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) { std::string channelName; @@ -334,7 +307,7 @@ void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) TC_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s", GetPlayerInfo().c_str(), channelName.c_str()); - if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) { if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 83844a257cc..2c98d6c1bd6 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -37,6 +37,7 @@ #include "Language.h" #include "LFGMgr.h" #include "Log.h" +#include "MiscPackets.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" @@ -836,6 +837,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) return; } + SendTutorialsData(); + pCurrChar->GetMotionMaster()->Initialize(); pCurrChar->SendDungeonDifficulty(false); @@ -1107,32 +1110,35 @@ void WorldSession::HandleSetFactionCheat(WorldPacket& /*recvData*/) GetPlayer()->GetReputationMgr().SendStates(); } -void WorldSession::HandleTutorialFlag(WorldPacket& recvData) -{ - uint32 data; - recvData >> data; - - uint8 index = uint8(data / 32); - if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) - return; - - uint32 value = (data % 32); - - uint32 flag = GetTutorialInt(index); - flag |= (1 << value); - SetTutorialInt(index, flag); -} - -void WorldSession::HandleTutorialClear(WorldPacket& /*recvData*/) -{ - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0xFFFFFFFF); -} - -void WorldSession::HandleTutorialReset(WorldPacket& /*recvData*/) +void WorldSession::HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet) { - for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) - SetTutorialInt(i, 0x00000000); + switch (packet.Action) + { + case TUTORIAL_ACTION_UPDATE: + { + uint8 index = uint8(packet.TutorialBit >> 5); + if (index >= MAX_ACCOUNT_TUTORIAL_VALUES) + { + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received bad TutorialBit %u.", packet.TutorialBit); + return; + } + uint32 flag = GetTutorialInt(index); + flag |= (1 << (packet.TutorialBit & 0x1F)); + SetTutorialInt(index, flag); + break; + } + case TUTORIAL_ACTION_CLEAR: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0xFFFFFFFF); + break; + case TUTORIAL_ACTION_RESET: + for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) + SetTutorialInt(i, 0x00000000); + break; + default: + TC_LOG_ERROR("network", "CMSG_TUTORIAL_FLAG received unknown TutorialAction %u.", packet.Action); + return; + } } void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index a2485d7854b..b51f0d52480 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -354,7 +354,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, } } - if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam())) { if (Channel* chn = cMgr->GetChannel(target, sender)) { diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 613f1e46d7b..91ffa3aff87 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -538,12 +538,9 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/) SendPacket(&data); } -void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) +void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet) { - ObjectGuid guid; - recvData >> guid; - - _player->SetSelection(guid); + _player->SetSelection(packet.Selection); } void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index 28a50a6c9aa..2ece521b42b 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -18,7 +18,12 @@ #include "ChannelPackets.h" #include "Channel.h" -WorldPacket const* WorldPackets::Channel::ChannelList::Write() +void WorldPackets::Channel::ChannelListRequest::Read() +{ + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} + +WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write() { _worldPacket.WriteBit(Display); _worldPacket.WriteBits(Channel.length(), 7); @@ -43,7 +48,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotify::Write() _worldPacket.WriteBits(Sender.length(), 6); _worldPacket << SenderGuid; - _worldPacket << SenderBnetAccountID; + _worldPacket << SenderAccountID; _worldPacket << uint32(SenderVirtualRealm); _worldPacket << TargetGuid; _worldPacket << uint32(TargetVirtualRealm); @@ -94,3 +99,9 @@ void WorldPackets::Channel::JoinChannel::Read() ChannelName = _worldPacket.ReadString(channelLength); Password = _worldPacket.ReadString(passwordLength); } + +void WorldPackets::Channel::LeaveChannel::Read() +{ + _worldPacket >> ZoneChannelID; + ChannelName = _worldPacket.ReadString(_worldPacket.ReadBits(7)); +} diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index 3fe2a353070..36a0a516928 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -25,7 +25,20 @@ namespace WorldPackets { namespace Channel { - class ChannelList final : public ServerPacket + class ChannelListRequest final : public ClientPacket + { + public: + ChannelListRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) + { + ASSERT(packet.GetOpcode() == CMSG_CHANNEL_LIST || packet.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST); + } + + void Read() override; + + std::string ChannelName; + }; + + class ChannelListResponse final : public ServerPacket { public: struct ChannelPlayer @@ -38,7 +51,7 @@ namespace WorldPackets uint8 Flags = 0; ///< @see enum ChannelMemberFlags }; - ChannelList() : ServerPacket(SMSG_CHANNEL_LIST) { } + ChannelListResponse() : ServerPacket(SMSG_CHANNEL_LIST) { } WorldPacket const* Write() override; @@ -57,11 +70,11 @@ namespace WorldPackets std::string Sender; ObjectGuid SenderGuid; - ObjectGuid SenderBnetAccountID; + ObjectGuid SenderAccountID; uint8 Type = 0; ///< @see enum ChatNotify uint8 OldFlags = 0; ///< @see enum ChannelMemberFlags uint8 NewFlags = 0; ///< @see enum ChannelMemberFlags - std::string Channel; + std::string Channel; ///< Channel Name uint32 SenderVirtualRealm = 0; ObjectGuid TargetGuid; uint32 TargetVirtualRealm = 0; @@ -79,7 +92,7 @@ namespace WorldPackets int32 ChatChannelID = 0; int32 InstanceID = 0; uint8 ChannelFlags = 0; ///< @see enum ChannelFlags - std::string Channel; + std::string Channel; ///< Channel Name }; class ChannelNotifyLeft final : public ServerPacket @@ -89,9 +102,9 @@ namespace WorldPackets WorldPacket const* Write() override; - std::string Channel; + std::string Channel; ///< Channel Name int32 ChatChannelID = 0; - bool Suspended = false; + bool Suspended = false; ///< User Leave - false, On Zone Change - true }; class JoinChannel final : public ClientPacket @@ -107,6 +120,17 @@ namespace WorldPackets int32 ChatChannelId = 0; bool Internal = false; }; + + class LeaveChannel final : public ClientPacket + { + public: + LeaveChannel(WorldPacket&& packet) : ClientPacket(CMSG_LEAVE_CHANNEL, std::move(packet)) { } + + void Read() override; + + int32 ZoneChannelID = 0; + std::string ChannelName; + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index e406829a760..154ff134a6a 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -46,6 +46,11 @@ WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write() return &_worldPacket; } +void WorldPackets::Misc::SetSelection::Read() +{ + _worldPacket >> Selection; +} + void WorldPackets::Misc::ViolenceLevel::Read() { _worldPacket >> ViolenceLvl; @@ -78,6 +83,12 @@ WorldPacket const* WorldPackets::Misc::TutorialFlags::Write() return &_worldPacket; } +void WorldPackets::Misc::TutorialSetFlag::Read() +{ + Action = _worldPacket.ReadBits(2); + _worldPacket >> TutorialBit; +} + WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() { _worldPacket << uint32(DifficultyID); diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 7bb2cb3fb9b..c25370505d3 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -62,6 +62,16 @@ namespace WorldPackets int32 GameTimeHolidayOffset = 0; }; + class SetSelection final : public ClientPacket + { + public: + SetSelection(WorldPacket&& packet) : ClientPacket(CMSG_SET_SELECTION, std::move(packet)) { } + + void Read() override; + + ObjectGuid Selection; ///< Target + }; + class ViolenceLevel final : public ClientPacket { public: @@ -116,6 +126,17 @@ namespace WorldPackets uint32 TutorialData[MAX_ACCOUNT_TUTORIAL_VALUES]; }; + class TutorialSetFlag final : public ClientPacket + { + public: + TutorialSetFlag(WorldPacket&& packet) : ClientPacket(CMSG_TUTORIAL_FLAG, std::move(packet)) { } + + void Read() override; + + uint8 Action = 0; + uint32 TutorialBit = 0; + }; + class WorldServerInfo final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c3f7906e0fd..bab7ad89ce4 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -242,6 +242,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonster data << movementMonsterSpline.Destination; data << movementMonsterSpline.Move; data.WriteBit(movementMonsterSpline.CrzTeleport); + + // Unk bits. 0 if monster is moving, 1 or 2 if stopped + if (movementMonsterSpline.Move.Flags) + data.WriteBits(0, 2); + else + data.WriteBits(2, 2); + data.FlushBits(); return data; @@ -252,15 +259,6 @@ WorldPacket const* WorldPackets::Movement::MonsterMove::Write() _worldPacket << MoverGUID; _worldPacket << Pos; _worldPacket << SplineData; - - // Unk bits. 0 if monster is moving, 1 or 2 if stopped - if (SplineData.Move.Flags) - _worldPacket.WriteBits(0, 2); - else - _worldPacket.WriteBits(2, 2); - - _worldPacket.FlushBits(); - return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 2b92fe4fed9..6f3b19a661d 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -171,7 +171,7 @@ namespace WorldPackets class WorldPortAck final : public ClientPacket { public: - WorldPortAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + WorldPortAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_WORLDPORT_ACK, std::move(packet)) { } void Read() override { } }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index acc3b67f12c..9d6ab2514b8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -215,10 +215,10 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_BAN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_DISPLAY_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery ); + DEFINE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelInvite ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_KICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelKick ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelList ); + DEFINE_HANDLER(CMSG_CHANNEL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelListRequest, &WorldSession::HandleChannelList); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MODERATOR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelModerator ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_MUTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelMute ); @@ -364,12 +364,12 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefundInfoRequest ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel ); + DEFINE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::JoinChannel, &WorldSession::HandleJoinChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalents ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsPet ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel ); + DEFINE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::LeaveChannel, &WorldSession::HandleLeaveChannel); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode ); @@ -594,7 +594,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SELECTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode ); + DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); @@ -634,16 +634,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_CLEAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_FLAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_RESET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset ); + DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode); - DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData ); + DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition ); DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -697,12 +695,14 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED); @@ -762,6 +762,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED); @@ -800,11 +801,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_START, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED); @@ -921,6 +922,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED); @@ -933,6 +935,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED); @@ -964,6 +967,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED); @@ -1075,6 +1079,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER); @@ -1244,6 +1249,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFORGE_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED); @@ -1261,6 +1267,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED); @@ -1268,6 +1276,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED); @@ -1275,6 +1285,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_UNHANDLED); @@ -1341,6 +1352,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED); @@ -1391,6 +1403,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 06654acb0bc..cf98d5335db 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -149,10 +149,10 @@ enum OpcodeClient : uint32 CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD, CMSG_CHANNEL_ANNOUNCEMENTS = 0xBADD, CMSG_CHANNEL_BAN = 0xBADD, - CMSG_CHANNEL_DISPLAY_LIST = 0xBADD, + CMSG_CHANNEL_DISPLAY_LIST = 0x093B, CMSG_CHANNEL_INVITE = 0xBADD, CMSG_CHANNEL_KICK = 0xBADD, - CMSG_CHANNEL_LIST = 0xBADD, + CMSG_CHANNEL_LIST = 0x093B, CMSG_CHANNEL_MODERATE = 0xBADD, CMSG_CHANNEL_MODERATOR = 0xBADD, CMSG_CHANNEL_MUTE = 0xBADD, @@ -193,7 +193,7 @@ enum OpcodeClient : uint32 CMSG_COMPLAIN = 0xBADD, CMSG_COMPLETE_CINEMATIC = 0xBADD, CMSG_COMPLETE_MOVIE = 0xBADD, - CMSG_CONNECT_TO_FAILED = 0xBADD, + CMSG_CONNECT_TO_FAILED = 0x0135, CMSG_CONTACT_LIST = 0xBADD, CMSG_CORPSE_MAP_POSITION_QUERY = 0xBADD, CMSG_CREATURE_QUERY = 0x0505, @@ -315,7 +315,7 @@ enum OpcodeClient : uint32 CMSG_LEARN_PREVIEW_TALENTS = 0xBADD, CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD, CMSG_LEARN_TALENT = 0xBADD, - CMSG_LEAVE_CHANNEL = 0xBADD, + CMSG_LEAVE_CHANNEL = 0x19F2, CMSG_LFG_GET_STATUS = 0xBADD, CMSG_LFG_JOIN = 0xBADD, CMSG_LFG_LEAVE = 0xBADD, @@ -459,7 +459,7 @@ enum OpcodeClient : uint32 CMSG_PET_SPELL_AUTOCAST = 0xBADD, CMSG_PET_STOP_ATTACK = 0xBADD, CMSG_PING = 0x0416, - CMSG_PLAYED_TIME = 0xBADD, + CMSG_PLAYED_TIME = 0x1BB2, CMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD, CMSG_PLAYER_LOGIN = 0x0B1D, CMSG_PLAYER_LOGOUT = 0xBADD, @@ -508,7 +508,7 @@ enum OpcodeClient : uint32 CMSG_REPORT_PVP_AFK = 0xBADD, CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD, - CMSG_REQUEST_CEMETERY_LIST = 0xBADD, + CMSG_REQUEST_CEMETERY_LIST = 0x10A2, CMSG_REQUEST_HOTFIX = 0xBADD, CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0xBADD, CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD, @@ -543,7 +543,7 @@ enum OpcodeClient : uint32 CMSG_SET_ACTIONBAR_TOGGLES = 0xBADD, CMSG_SET_ACTION_BUTTON = 0x0599, CMSG_SET_ACTIVE_MOVER = 0xBADD, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0xBADD, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x031E, CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xBADD, CMSG_SET_ALLOW_LOW_LEVEL_RAID2 = 0xBADD, CMSG_SET_CHANNEL_WATCH = 0xBADD, @@ -608,9 +608,7 @@ enum OpcodeClient : uint32 CMSG_TRANSMOGRIFY_ITEMS = 0x0A85, CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD, CMSG_TURN_IN_PETITION = 0xBADD, - CMSG_TUTORIAL_CLEAR = 0xBADD, - CMSG_TUTORIAL_FLAG = 0xBADD, - CMSG_TUTORIAL_RESET = 0xBADD, + CMSG_TUTORIAL_FLAG = 0x0B16, CMSG_UNACCEPT_TRADE = 0xBADD, CMSG_UNDELETE_CHARACTER = 0x0D99, CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9, @@ -623,7 +621,7 @@ enum OpcodeClient : uint32 CMSG_USED_FOLLOW = 0xBADD, CMSG_USE_ITEM = 0x08B6, CMSG_VIOLENCE_LEVEL = 0x098D, - CMSG_VOICE_SESSION_ENABLE = 0xBADD, + CMSG_VOICE_SESSION_ENABLE = 0x1102, CMSG_VOID_STORAGE_QUERY = 0x019E, CMSG_VOID_STORAGE_TRANSFER = 0x0463, CMSG_VOID_STORAGE_UNLOCK = 0x13BB, @@ -685,12 +683,14 @@ enum OpcodeServer : uint32 SMSG_ACCOUNT_INFO_RESPONSE = 0xBADD, SMSG_ACCOUNT_MOUNT_UPDATE = 0x0140, SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD, + SMSG_ACCOUNT_TOYS_UPDATE = 0x0590, SMSG_ACHIEVEMENT_DELETED = 0xBADD, SMSG_ACHIEVEMENT_EARNED = 0xBADD, SMSG_ACTION_BUTTONS = 0x1D1F, SMSG_ACTIVATETAXIREPLY = 0xBADD, SMSG_ADDON_INFO = 0x1D9F, SMSG_ADD_RUNE_POWER = 0xBADD, + SMSG_ADJUST_SPLINE_DURATION = 0x0104, SMSG_AI_REACTION = 0x0BA1, SMSG_ALL_ACHIEVEMENT_DATA = 0xBADD, SMSG_ALL_ACHIEVEMENT_DATA_ACCOUNT = 0x0123, @@ -724,12 +724,12 @@ enum OpcodeServer : uint32 SMSG_AUCTION_OWNER_NOTIFICATION = 0xBADD, SMSG_AUCTION_REMOVED_NOTIFICATION = 0xBADD, SMSG_AURACASTLOG = 0xBADD, - SMSG_AURA_POINTS_DEPLETED = 0xBADD, + SMSG_AURA_POINTS_DEPLETED = 0x093B, SMSG_AURA_UPDATE = 0x091C, SMSG_AURA_UPDATE_ALL = 0xBADD, SMSG_AUTH_CHALLENGE = 0x1759, SMSG_AUTH_RESPONSE = 0x0DA9, - SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x04D4, SMSG_AVERAGE_ITEM_LEVEL_INFORM = 0xBADD, SMSG_BARBER_SHOP_RESULT = 0xBADD, SMSG_BATTLEFIELD_LIST = 0xBADD, @@ -753,6 +753,7 @@ enum OpcodeServer : uint32 SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BE3, SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0F2A, SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x12A4, SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x168A, @@ -787,7 +788,7 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD, SMSG_CALENDAR_SEND_CALENDAR = 0xBADD, SMSG_CALENDAR_SEND_EVENT = 0xBADD, - SMSG_CALENDAR_SEND_NUM_PENDING = 0xBADD, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A, SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD, SMSG_CAMERA_SHAKE = 0xBADD, SMSG_CANCEL_AUTO_REPEAT = 0xBADD, @@ -922,6 +923,7 @@ enum OpcodeServer : uint32 SMSG_GAMETIME_UPDATE = 0xBADD, SMSG_GAME_EVENT_DEBUG_LOG = 0xBADD, SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0952, + SMSG_GARRISON_REMOTE_INFO = 0x0151, SMSG_GMRESPONSE_DB_ERROR = 0xBADD, SMSG_GMRESPONSE_RECEIVED = 0xBADD, SMSG_GMRESPONSE_STATUS_UPDATE = 0xBADD, @@ -934,6 +936,7 @@ enum OpcodeServer : uint32 SMSG_GM_PLAYER_INFO = 0xBADD, SMSG_GM_TICKET_CASE_STATUS = 0x1D8D, SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229, SMSG_GODMODE = 0xBADD, SMSG_GOSSIP_COMPLETE = 0x15D1, SMSG_GOSSIP_MESSAGE = 0x1746, @@ -966,6 +969,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_CRITERIA_UPDATE = 0x1208, SMSG_GUILD_DECLINE = 0xBADD, SMSG_GUILD_EVENT = 0x1027, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1077, SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD, SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228, SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD, @@ -992,7 +996,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD, SMSG_GUILD_RESET = 0xBADD, - SMSG_GUILD_REWARDS_LIST = 0xBADD, + SMSG_GUILD_REWARDS_LIST = 0x1818, SMSG_GUILD_ROSTER = 0x1026, SMSG_GUILD_SET_NOTE = 0xBADD, SMSG_GUILD_TRADESKILL_UPDATE = 0xBADD, @@ -1088,6 +1092,7 @@ enum OpcodeServer : uint32 SMSG_LOOT_SLOT_CHANGED = 0xBADD, SMSG_LOOT_START_ROLL = 0xBADD, SMSG_MAIL_LIST_RESULT = 0x0B3F, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x153D, SMSG_MAP_OBJ_EVENTS = 0xBADD, SMSG_MEETINGSTONE_COMPLETE = 0xBADD, SMSG_MEETINGSTONE_IN_PROGRESS = 0xBADD, @@ -1267,9 +1272,10 @@ enum OpcodeServer : uint32 SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD, SMSG_REFER_A_FRIEND_FAILURE = 0xBADD, SMSG_REFORGE_RESULT = 0xBADD, + SMSG_REFRESH_SPELL_HISTORY = 0x0A2A, SMSG_REMOVED_SPELL = 0xBADD, SMSG_REPORT_PVP_AFK_RESULT = 0xBADD, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0xBADD, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x059E, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD, SMSG_RESEARCH_COMPLETE = 0xBADD, SMSG_RESEARCH_SETUP_HISTORY = 0x0A25, @@ -1285,13 +1291,17 @@ enum OpcodeServer : uint32 SMSG_RWHOIS = 0xBADD, SMSG_SELL_ITEM = 0xBADD, SMSG_SEND_MAIL_RESULT = 0x0302, - SMSG_SEND_UNLEARN_SPELLS = 0x1A82, + SMSG_SEND_SPELL_CHARGES = 0x1A82, + SMSG_SEND_SPELL_HISTORY = 0x1933, + SMSG_SEND_UNLEARN_SPELLS = 0x0BCB, SMSG_SERVERTIME = 0xBADD, SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD, SMSG_SERVER_INFO_RESPONSE = 0xBADD, SMSG_SERVER_MESSAGE = 0x0683, SMSG_SERVER_PERF = 0xBADD, SMSG_SET_AI_ANIM_KIT = 0x0335, + SMSG_SET_ALL_TASK_PROGRESS = 0x1B52, + SMSG_SET_CURRENCY = 0x17BE, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD, SMSG_SET_FACTION_ATWAR = 0xBADD, SMSG_SET_FACTION_NOT_VISIBLE = 0xBADD, @@ -1299,6 +1309,7 @@ enum OpcodeServer : uint32 SMSG_SET_FACTION_VISIBLE = 0x138B, SMSG_SET_FLAT_SPELL_MODIFIER = 0x1884, SMSG_SET_FORCED_REACTIONS = 0x09A9, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1489, SMSG_SET_MELEE_ANIM_KIT = 0xBADD, SMSG_SET_MOVEMENT_ANIM_KIT = 0xBADD, SMSG_SET_PCT_SPELL_MODIFIER = 0x113C, @@ -1367,6 +1378,7 @@ enum OpcodeServer : uint32 SMSG_SPLINE_MOVE_WATER_WALK = 0xBADD, SMSG_STABLE_RESULT = 0xBADD, SMSG_STANDSTATE_UPDATE = 0x1311, + SMSG_START_ELAPSED_TIMERS = 0x093F, SMSG_START_MIRROR_TIMER = 0xBADD, SMSG_START_TIMER = 0xBADD, SMSG_STOP_DANCE = 0xBADD, @@ -1381,7 +1393,7 @@ enum OpcodeServer : uint32 SMSG_TALENTS_ERROR = 0xBADD, SMSG_TALENTS_INFO = 0x012D, SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD, - SMSG_TAXINODE_STATUS = 0xBADD, + SMSG_TAXINODE_STATUS = 0x0338, SMSG_TEST_DROP_RATE_RESULT = 0xBADD, SMSG_TEXT_EMOTE = 0x0383, SMSG_THREAT_CLEAR = 0xBADD, @@ -1417,6 +1429,7 @@ enum OpcodeServer : uint32 SMSG_UPDATE_LAST_INSTANCE = 0xBADD, SMSG_UPDATE_OBJECT = 0x122C, SMSG_UPDATE_SERVER_PLAYER_POSITION = 0xBADD, + SMSG_UPDATE_TASK_PROGRESS = 0x1209, SMSG_UPDATE_WORLD_STATE = 0x03EC, SMSG_USERLIST_ADD = 0xBADD, SMSG_USERLIST_REMOVE = 0xBADD, @@ -1424,7 +1437,7 @@ enum OpcodeServer : uint32 SMSG_VOICESESSION_FULL = 0xBADD, SMSG_VOICE_CHAT_STATUS = 0xBADD, SMSG_VOICE_PARENTAL_CONTROLS = 0xBADD, - SMSG_VOICE_SESSION_LEAVE = 0xBADD, + SMSG_VOICE_SESSION_LEAVE = 0x0403, SMSG_VOICE_SESSION_ROSTER_UPDATE = 0xBADD, SMSG_VOICE_SET_TALKER_MUTED = 0xBADD, SMSG_VOID_ITEM_SWAP_RESPONSE = 0x1131, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index eae081f2b74..6bb4daf9fc3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -104,7 +104,9 @@ namespace WorldPackets namespace Channel { + class ChannelListRequest; class JoinChannel; + class LeaveChannel; } namespace Chat @@ -148,8 +150,10 @@ namespace WorldPackets namespace Misc { + class SetSelection; class ViolenceLevel; class TimeSyncResponse; + class TutorialSetFlag; } namespace Query @@ -191,17 +195,38 @@ enum AccountDataType #define REGISTERED_ADDON_PREFIX_SOFTCAP 64 +enum TutorialAction +{ + TUTORIAL_ACTION_UPDATE = 0, + TUTORIAL_ACTION_CLEAR = 1, + TUTORIAL_ACTION_RESET = 2 +}; + +/* enum Tutorials { - TUTORIAL_TALENT = 0, - TUTORIAL_SPEC = 1, - TUTORIAL_GLYPH = 2, - TUTORIAL_SPELLBOOK = 3, - TUTORIAL_PROFESSIONS = 4, - TUTORIAL_CORE_ABILITITES = 5, - TUTORIAL_PET_JOURNAL = 6, - TUTORIAL_WHAT_HAS_CHANGED = 7 + TUTORIAL_TALENT = 0, + TUTORIAL_SPEC = 1, + TUTORIAL_GLYPH = 2, + TUTORIAL_SPELLBOOK = 3, + TUTORIAL_PROFESSIONS = 4, + TUTORIAL_CORE_ABILITITES = 5, + TUTORIAL_PET_JOURNAL = 6, + TUTORIAL_WHAT_HAS_CHANGED = 7, + TUTORIAL_GARRISON_BUILDING = 8, + TUTORIAL_GARRISON_MISSION_LIST = 9, + TUTORIAL_GARRISON_MISSION_PAGE = 10, + TUTORIAL_GARRISON_LANDING = 11, + TUTORIAL_GARRISON_ZONE_ABILITY = 12, + TUTORIAL_WORLD_MAP_FRAME = 13, + TUTORIAL_CLEAN_UP_BAGS = 14, + TUTORIAL_BAG_SETTINGS = 15, + TUTORIAL_REAGENT_BANK_UNLOCK = 16, + TUTORIAL_TOYBOX_FAVORITE = 17, + TUTORIAL_TOYBOX_MOUSEWHEEL_PAGING = 18, + TUTORIAL_LFG_LIST = 19 }; +*/ #define MAX_ACCOUNT_TUTORIAL_VALUES 8 @@ -621,7 +646,7 @@ class WorldSession void HandleTogglePvP(WorldPacket& recvPacket); void HandleZoneUpdateOpcode(WorldPacket& recvPacket); - void HandleSetSelectionOpcode(WorldPacket& recvPacket); + void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet); void HandleStandStateChangeOpcode(WorldPacket& recvPacket); void HandleEmoteOpcode(WorldPacket& recvPacket); void HandleContactListOpcode(WorldPacket& recvPacket); @@ -887,9 +912,9 @@ class WorldSession void HandleResurrectResponseOpcode(WorldPacket& recvPacket); void HandleSummonResponseOpcode(WorldPacket& recvData); - void HandleJoinChannel(WorldPacket& recvPacket); - void HandleLeaveChannel(WorldPacket& recvPacket); - void HandleChannelList(WorldPacket& recvPacket); + void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet); + void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet); + void HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet); void HandleChannelPassword(WorldPacket& recvPacket); void HandleChannelSetOwner(WorldPacket& recvPacket); void HandleChannelOwner(WorldPacket& recvPacket); @@ -904,7 +929,6 @@ class WorldSession void HandleChannelAnnouncements(WorldPacket& recvPacket); void HandleChannelModerate(WorldPacket& recvPacket); void HandleChannelDeclineInvite(WorldPacket& recvPacket); - void HandleChannelDisplayListQuery(WorldPacket& recvPacket); void HandleGetChannelMemberCount(WorldPacket& recvPacket); void HandleSetChannelWatch(WorldPacket& recvPacket); @@ -913,9 +937,7 @@ class WorldSession void HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet); - void HandleTutorialFlag (WorldPacket& recvData); - void HandleTutorialClear(WorldPacket& recvData); - void HandleTutorialReset(WorldPacket& recvData); + void HandleTutorialFlag(WorldPackets::Misc::TutorialSetFlag& packet); //Pet void HandlePetAction(WorldPacket& recvData); diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 715487eff99..664c8f3d216 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -74,7 +74,7 @@ public: Player* player = handler->GetSession()->GetPlayer(); Channel* channcel = NULL; - if (ChannelMgr* cMgr = ChannelMgr::forTeam(player->GetTeam())) + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(player->GetTeam())) channcel = cMgr->GetChannel(channelStr, player); if (strcmp(argStr, "on") == 0) -- cgit v1.2.3 From a1d4c9f9dc14352a108339e006d3f17e88de1672 Mon Sep 17 00:00:00 2001 From: Nayd Date: Wed, 26 Nov 2014 02:03:30 +0000 Subject: Core: Use the correct function to convert strings to unsigned longs and unsigned long longs Fixes wrong data being inserted into the database (i.e explored zones). More info in #13493 Fixes #13493 Thanks to @jackpoz for finding the code issue and @Vavehl for an expectional bug report. --- src/server/game/Chat/Chat.cpp | 4 ++-- src/server/game/Entities/Object/Object.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 6 +++--- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Globals/ObjectMgr.cpp | 16 ++++++++-------- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/Tools/PlayerDump.cpp | 8 ++++---- src/server/scripts/Commands/cs_debug.cpp | 4 ++-- src/server/scripts/Commands/cs_gobject.cpp | 4 ++-- src/server/scripts/Commands/cs_list.cpp | 14 +++++++------- src/server/scripts/Commands/cs_misc.cpp | 10 +++++----- src/server/scripts/Commands/cs_modify.cpp | 2 +- src/server/scripts/Commands/cs_npc.cpp | 8 ++++---- src/server/scripts/Commands/cs_quest.cpp | 8 ++++---- src/server/shared/Common.h | 3 +++ 15 files changed, 48 insertions(+), 45 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 0cee5868bb1..cbb0e4683aa 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -926,7 +926,7 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text) if (!idS) return 0; - uint32 id = (uint32)atol(idS); + uint32 id = atoul(idS); switch (type) { @@ -946,7 +946,7 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text) return id; case SPELL_LINK_GLYPH: { - uint32 glyph_prop_id = param1_str ? (uint32)atol(param1_str) : 0; + uint32 glyph_prop_id = param1_str ? atoul(param1_str) : 0; GlyphPropertiesEntry const* glyphPropEntry = sGlyphPropertiesStore.LookupEntry(glyph_prop_id); if (!glyphPropEntry) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 70612910797..d2ac852bbfe 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1001,7 +1001,7 @@ void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uin for (uint32 index = 0; index < count; ++index) { - m_uint32Values[startOffset + index] = atol(tokens[index]); + m_uint32Values[startOffset + index] = atoul(tokens[index]); _changesMask.SetBit(startOffset + index); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 29d4e12604c..ac9c77746d5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -172,7 +172,7 @@ void PlayerTaxi::LoadTaxiMask(std::string const &data) for (Tokenizer::const_iterator iter = tokens.begin(); index < TaxiMaskSize && iter != tokens.end(); ++iter, ++index) { // load and set bits only for existing taxi nodes - m_taximask[index] = sTaxiNodesMask[index] & uint32(atol(*iter)); + m_taximask[index] = sTaxiNodesMask[index] & atoul(*iter); } } @@ -199,7 +199,7 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint3 for (Tokenizer::const_iterator iter = Tokenizer.begin(); iter != Tokenizer.end(); ++iter) { - uint32 node = uint32(atol(*iter)); + uint32 node = atoul(*iter); AddTaxiDestination(node); } @@ -17397,7 +17397,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (i >= talentSpecs.size()) break; - uint32 talentSpec = atol(talentSpecs[i]); + uint32 talentSpec = atoul(talentSpecs[i]); if (sChrSpecializationStore.LookupEntry(talentSpec)) SetTalentSpec(i, talentSpec); else diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 23ea85dcc91..f14d7daec21 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12209,7 +12209,7 @@ void CharmInfo::LoadPetActionBar(const std::string& data) // use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion ActiveStates type = ActiveStates(atol(*iter)); ++iter; - uint32 action = uint32(atol(*iter)); + uint32 action = atoul(*iter); PetActionBar[index].SetActionAndType(action, type); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b624926df3b..52cc9fec2bd 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -584,17 +584,17 @@ void ObjectMgr::LoadCreatureTemplateAddons() creatureAddon.auras.resize(tokens.size()); for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr) { - SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(uint32(atol(*itr))); + SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(atoul(*itr)); if (!AdditionalSpellInfo) { - TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong spell %u defined in `auras` field in `creature_template_addon`.", entry, uint32(atol(*itr))); + TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong spell %u defined in `auras` field in `creature_template_addon`.", entry, atoul(*itr)); continue; } if (AdditionalSpellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE)) - TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_template_addon`.", entry, uint32(atol(*itr))); + TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_template_addon`.", entry, atoul(*itr)); - creatureAddon.auras[i++] = uint32(atol(*itr)); + creatureAddon.auras[i++] = atoul(*itr); } if (creatureAddon.mount) @@ -1032,17 +1032,17 @@ void ObjectMgr::LoadCreatureAddons() creatureAddon.auras.resize(tokens.size()); for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr) { - SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(uint32(atol(*itr))); + SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(atoul(*itr)); if (!AdditionalSpellInfo) { - TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has wrong spell %u defined in `auras` field in `creature_addon`.", guid, uint32(atol(*itr))); + TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has wrong spell %u defined in `auras` field in `creature_addon`.", guid, atoul(*itr)); continue; } if (AdditionalSpellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE)) - TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_addon`.", guid, uint32(atol(*itr))); + TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has SPELL_AURA_CONTROL_VEHICLE aura %u defined in `auras` field in `creature_addon`.", guid, atoul(*itr)); - creatureAddon.auras[i++] = uint32(atol(*itr)); + creatureAddon.auras[i++] = atoul(*itr); } if (creatureAddon.mount) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 2c98d6c1bd6..de7d44bdc69 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2175,7 +2175,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res } for (uint32 index = 0; index < ktcount; ++index) - knownTitles[index] = atol(tokens[index]); + knownTitles[index] = atoul(tokens[index]); for (std::map::const_iterator it = sObjectMgr->FactionChangeTitles.begin(); it != sObjectMgr->FactionChangeTitles.end(); ++it) { diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 6f42d41c694..43d4374c544 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -519,10 +519,10 @@ DumpReturn PlayerDumpReader::LoadDump(std::string const& file, uint32 account, s if (!changenth(line, 2, chraccount)) // characters.account update ROLLBACK(DUMP_FILE_BROKEN); - race = uint8(atol(getnth(line, 4).c_str())); - playerClass = uint8(atol(getnth(line, 5).c_str())); - gender = uint8(atol(getnth(line, 6).c_str())); - level = uint8(atol(getnth(line, 7).c_str())); + race = uint8(atoul(getnth(line, 4).c_str())); + playerClass = uint8(atoul(getnth(line, 5).c_str())); + gender = uint8(atoul(getnth(line, 6).c_str())); + level = uint8(atoul(getnth(line, 7).c_str())); if (name.empty()) { // check if the original name already exists diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index db8ebe62775..22a8fcb67f0 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -489,7 +489,7 @@ public: static bool HandleDebugSendQuestPartyMsgCommand(ChatHandler* handler, char const* args) { - uint32 msg = atol((char*)args); + uint32 msg = atoul(args); handler->GetSession()->GetPlayer()->SendPushToPartyResponse(handler->GetSession()->GetPlayer(), msg); return true; } @@ -508,7 +508,7 @@ public: static bool HandleDebugSendQuestInvalidMsgCommand(ChatHandler* handler, char const* args) { - QuestFailedReason msg = static_cast(atol((char*)args)); + QuestFailedReason msg = static_cast(atoul(args)); handler->GetSession()->GetPlayer()->SendCanTakeQuestResponse(msg); return true; } diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 20ce825ad5e..d802d5a496d 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -118,7 +118,7 @@ public: if (!id) return false; - uint32 objectId = atol(id); + uint32 objectId = atoul(id); if (!objectId) return false; @@ -241,7 +241,7 @@ public: if (!id) return false; - uint32 objectId = atol(id); + uint32 objectId = atoul(id); if (objectId) result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1", diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 46929e3967c..7721fed3fba 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -65,7 +65,7 @@ public: if (!id) return false; - uint32 creatureId = atol(id); + uint32 creatureId = atoul(id); if (!creatureId) { handler->PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, creatureId); @@ -82,7 +82,7 @@ public: } char* countStr = strtok(NULL, " "); - uint32 count = countStr ? atol(countStr) : 10; + uint32 count = countStr ? atoul(countStr) : 10; if (count == 0) return false; @@ -133,11 +133,11 @@ public: if (!*args) return false; - char* id = handler->extractKeyFromLink((char*)args, "Hitem"); + char const* id = handler->extractKeyFromLink((char*)args, "Hitem"); if (!id) return false; - uint32 itemId = atol(id); + uint32 itemId = atoul(id); if (!itemId) { handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); @@ -154,7 +154,7 @@ public: } char* countStr = strtok(NULL, " "); - uint32 count = countStr ? atol(countStr) : 10; + uint32 count = countStr ? atoul(countStr) : 10; if (count == 0) return false; @@ -354,7 +354,7 @@ public: if (!id) return false; - uint32 gameObjectId = atol(id); + uint32 gameObjectId = atoul(id); if (!gameObjectId) { handler->PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, gameObjectId); @@ -371,7 +371,7 @@ public: } char* countStr = strtok(NULL, " "); - uint32 count = countStr ? atol(countStr) : 10; + uint32 count = countStr ? atoul(countStr) : 10; if (count == 0) return false; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index e868811b113..f1b6e7f7289 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1135,7 +1135,7 @@ public: char const* id = handler->extractKeyFromLink((char*)args, "Hitem"); if (!id) return false; - itemId = uint32(atol(id)); + itemId = atoul(id); } char const* ccount = strtok(NULL, " "); @@ -1217,7 +1217,7 @@ public: if (!id) return false; - uint32 itemSetId = atol(id); + uint32 itemSetId = atoul(id); // prevent generation all items with itemset field value '0' if (itemSetId == 0) @@ -1358,7 +1358,7 @@ public: return false; } - int32 level = uint32(atol(levelStr)); + int32 level = atol(levelStr); Player* target = handler->getSelectedPlayer(); if (!target) @@ -1380,7 +1380,7 @@ public: // If our target does not yet have the skill they are trying to add to them, the chosen level also becomes // the max level of the new profession. - uint16 max = maxPureSkill ? atol(maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level); + uint16 max = maxPureSkill ? atoul(maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level); if (level <= 0 || level > max || max <= 0) return false; @@ -1779,7 +1779,7 @@ public: uint32 totalmail = uint32(fields[1].GetUInt64()); // ... we have to convert it from Char to int. We can use totalmail as it is - rmailint = atol(readmail.c_str()); + rmailint = atoul(readmail.c_str()); // Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given if (totalmail >= 1) diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 7d42609a2a0..eb64c2f3eaa 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1004,7 +1004,7 @@ public: if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c')) moneyToAdd = MoneyStringToMoney(std::string(args)); else - moneyToAdd = atol(args); + moneyToAdd = atoll(args); uint64 targetMoney = target->GetMoney(); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 9d64ba60bc4..3e841f45f59 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -332,15 +332,15 @@ public: char* fmaxcount = strtok(NULL, " "); //add maxcount, default: 0 uint32 maxcount = 0; if (fmaxcount) - maxcount = atol(fmaxcount); + maxcount = atoul(fmaxcount); char* fincrtime = strtok(NULL, " "); //add incrtime, default: 0 uint32 incrtime = 0; if (fincrtime) - incrtime = atol(fincrtime); + incrtime = atoul(fincrtime); char* fextendedcost = strtok(NULL, " "); //add ExtendedCost, default: 0 - uint32 extendedcost = fextendedcost ? atol(fextendedcost) : 0; + uint32 extendedcost = fextendedcost ? atoul(fextendedcost) : 0; Creature* vendor = handler->getSelectedCreature(); if (!vendor) { @@ -570,7 +570,7 @@ public: handler->SetSentErrorMessage(true); return false; } - uint32 itemId = atol(pitem); + uint32 itemId = atoul(pitem); const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index b5186bdb948..8138a755f87 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -67,7 +67,7 @@ public: if (!cId) return false; - uint32 entry = atol(cId); + uint32 entry = atoul(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); @@ -112,7 +112,7 @@ public: if (!cId) return false; - uint32 entry = atol(cId); + uint32 entry = atoul(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); @@ -165,7 +165,7 @@ public: if (!cId) return false; - uint32 entry = atol(cId); + uint32 entry = atoul(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); @@ -269,7 +269,7 @@ public: if (!cId) return false; - uint32 entry = atol(cId); + uint32 entry = atoul(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h index 4bd4d16a6d7..578bc7aa61f 100644 --- a/src/server/shared/Common.h +++ b/src/server/shared/Common.h @@ -79,6 +79,9 @@ inline float finiteAlways(float f) { return std::isfinite(f) ? f : 0.0f; } +inline unsigned long atoul(char const* str) { return strtoul(str, nullptr, 10); } +inline unsigned long long atoull(char const* str) { return strtoull(str, nullptr, 10); } + #define STRINGIZE(a) #a enum TimeConstants -- cgit v1.2.3