diff options
27 files changed, 247 insertions, 230 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 4c8348f0238..603f76560de 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -742,7 +742,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (e.action.flee.withEmote) { Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_FLEE_FOR_ASSIST); - sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); + CreatureTextMgr::SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: %s DoFleeToGetAssistance", me->GetGUID().ToString().c_str()); break; @@ -993,7 +993,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (e.action.callHelp.withEmote) { Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP); - sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); + CreatureTextMgr::SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: %s", me->GetGUID().ToString().c_str()); } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 49bd25e6252..0756870f723 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -71,8 +71,9 @@ namespace Trinity void do_helper(WorldPacket& data, char const* text) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, text); - data = *packet.Write(); + packet.Initalize(_msgtype, LANG_UNIVERSAL, _source, _source, text); + packet.Write(); + data = packet.Move(); } ChatMsg _msgtype; @@ -97,8 +98,9 @@ namespace Trinity snprintf(str, 2048, text, arg1str, arg2str); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, _msgtype, LANG_UNIVERSAL, _source, _source, str); - data = *packet.Write(); + packet.Initalize(_msgtype, LANG_UNIVERSAL, _source, _source, str); + packet.Write(); + data = packet.Move(); } private: diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index a316c8630dc..05c8914a9f1 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -625,10 +625,10 @@ void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang) WorldPackets::Chat::Chat packet; if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name); + packet.Initalize(CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name); else { - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_CHANNEL, Language(lang), NULL, NULL, what, 0, _name); + packet.Initalize(CHAT_MSG_CHANNEL, Language(lang), nullptr, nullptr, what, 0, _name); packet.SenderGUID = guid; packet.TargetGUID = guid; } diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index cbb0e4683aa..8bc0ac2952b 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -212,7 +212,7 @@ void ChatHandler::SendSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); m_session->SendPacket(packet.Write()); } @@ -230,7 +230,7 @@ void ChatHandler::SendGlobalSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); sWorld->SendGlobalMessage(packet.Write()); } @@ -248,7 +248,7 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str) while (char* line = LineFromMessage(pos)) { - BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); sWorld->SendGlobalGMMessage(packet.Write()); } @@ -630,58 +630,6 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd) return ShowHelpForSubCommands(table, "", cmd); } -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 /*= ""*/) -{ - // Clear everything because same packet can be used multiple times - packet->Reset(); - 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; - - if (sender) - { - packet->SenderGUID = sender->GetGUID(); - - if (Creature const* creatureSender = sender->ToCreature()) - packet->SenderName = creatureSender->GetNameForLocaleIdx(locale); - - if (Player const* playerSender = sender->ToPlayer()) - { - packet->SenderAccountGUID = playerSender->GetSession()->GetAccountGUID(); - 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) - { - packet->TargetGUID = receiver->GetGUID(); - if (Creature const* creatureReceiver = receiver->ToCreature()) - packet->TargetName = creatureReceiver->GetNameForLocaleIdx(locale); - } - - packet->SenderVirtualAddress = GetVirtualRealmAddress(); - packet->TargetVirtualAddress = GetVirtualRealmAddress(); - packet->AchievementID = achievementId; - packet->Channel = channelName; - packet->Prefix = addonPrefix; - packet->ChatText = message; -} - Player* ChatHandler::getSelectedPlayer() { if (!m_session) diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 5db48db0fbe..9f647183b62 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -54,8 +54,6 @@ class ChatHandler explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) { } virtual ~ChatHandler() { } - 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; } // function with different implementation for chat/console diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1b96a1c5bb3..45ab3c84bb5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20232,7 +20232,7 @@ void Player::Say(std::string const& text, Language language, WorldObject const* sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SAY, language, this, this, _text); + packet.Initalize(CHAT_MSG_SAY, language, this, this, _text); SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); } @@ -20242,7 +20242,7 @@ void Player::Yell(std::string const& text, Language language, WorldObject const* sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_YELL, language, this, this, _text); + packet.Initalize(CHAT_MSG_YELL, language, this, this, _text); SendMessageToSetInRange(packet.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true); } @@ -20252,7 +20252,7 @@ void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/ sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text); + packet.Initalize(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)); } @@ -20265,7 +20265,7 @@ void Player::WhisperAddon(std::string const& text, const std::string& prefix, Pl return; WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); + packet.Initalize(CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); receiver->SendDirectMessage(packet.Write()); } @@ -20282,14 +20282,14 @@ void Player::Whisper(std::string const& text, Language language, Player* target, sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, Language(language), this, this, _text); + packet.Initalize(CHAT_MSG_WHISPER, Language(language), this, this, _text); target->SendDirectMessage(packet.Write()); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); + packet.Initalize(CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); SendDirectMessage(packet.Write()); if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 814c4af9781..8f16ef54864 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2107,7 +2107,7 @@ class Player : public Unit, public GridObject<Player> void UpdateUnderwaterState(Map* m, float x, float y, float z) 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) 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; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 35bd9767b77..ede8c959594 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6958,7 +6958,6 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const return *repRank; } - if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE)) { if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE)) @@ -6989,8 +6988,6 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const { if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry()) { - if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry)) - return *repRank; if (!selfPlayerOwner->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_IGNORE_REPUTATION)) { if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->Faction)) @@ -16459,7 +16456,7 @@ void Unit::Whisper(std::string const& text, Language language, Player* target, b LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale); + packet.Initalize(isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale); target->SendDirectMessage(packet.Write()); } @@ -16506,6 +16503,6 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/ LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex(); 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); + packet.Initalize(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/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index d3dddfcfd3a..0bfa08d62c9 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2595,7 +2595,7 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), NULL, msg); + packet.Initalize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, 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()) @@ -2610,7 +2610,7 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std:: if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), NULL, msg, 0, "", DEFAULT_LOCALE, prefix); + packet.Initalize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, LANG_ADDON, session->GetPlayer(), nullptr, 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()) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 81248519994..e3d6e47e3a6 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -285,7 +285,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + packet.Initalize(ChatMsg(type), Language(lang), sender, nullptr, msg); group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID())); break; } @@ -327,7 +327,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, ChatMsg(type), Language(lang), sender, NULL, msg); + packet.Initalize(ChatMsg(type), Language(lang), sender, nullptr, msg); group->BroadcastPacket(packet.Write(), false); break; } @@ -341,7 +341,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, 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); + packet.Initalize(CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg); group->BroadcastPacket(packet.Write(), false); break; } @@ -446,7 +446,7 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: break; WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, type, LANG_ADDON, sender, NULL, text, 0U, "", DEFAULT_LOCALE, prefix); + packet.Initalize(type, LANG_ADDON, sender, nullptr, text, 0, "", DEFAULT_LOCALE, prefix); group->BroadcastAddonMessagePacket(packet.Write(), prefix, true, -1, sender->GetGUID()); break; } @@ -535,57 +535,27 @@ void WorldSession::HandleEmoteOpcode(WorldPacket& recvData) GetPlayer()->HandleEmoteCommand(emote); } -namespace Trinity -{ - class EmoteChatBuilder - { - public: - EmoteChatBuilder(Player const& player, uint32 soundIndex, uint32 emoteID, Unit const* target) - : _player(player), _soundIndex(soundIndex), _emoteID(emoteID), _target(target) { } - - void operator()(WorldPacket& data, LocaleConstant loc_idx) - { - WorldPackets::Chat::STextEmote packet; - packet.SourceGUID = _player.GetGUID(); - packet.SourceAccountGUID = _player.GetSession()->GetAccountGUID(); - if (_target) - packet.TargetGUID = _target->GetGUID(); - packet.EmoteID = _emoteID; - packet.SoundIndex = _soundIndex; - data = *packet.Write(); - } - - private: - Player const& _player; - uint32 _soundIndex; - uint32 _emoteID; - Unit const* _target; - }; -} - void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet) { - Player* player = GetPlayer(); - - if (!player->IsAlive()) + if (!_player->IsAlive()) return; - if (!player->CanSpeak()) + if (!_player->CanSpeak()) { std::string timeStr = secsToTimeString(m_muteTime - time(NULL)); SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); return; } - sScriptMgr->OnPlayerTextEmote(player, packet.SoundIndex, packet.EmoteID, packet.Target); + sScriptMgr->OnPlayerTextEmote(_player, packet.SoundIndex, packet.EmoteID, packet.Target); EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.EmoteID); if (!em) return; - uint32 emote_anim = em->EmoteID; + uint32 emoteAnim = em->EmoteID; - switch (emote_anim) + switch (emoteAnim) { case EMOTE_STATE_SLEEP: case EMOTE_STATE_SIT: @@ -594,34 +564,32 @@ void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet) break; case EMOTE_STATE_DANCE: case EMOTE_STATE_READ: - player->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim); + _player->SetUInt32Value(UNIT_NPC_EMOTESTATE, emoteAnim); break; default: // Only allow text-emotes for "dead" entities (feign death included) - if (player->HasUnitState(UNIT_STATE_DIED)) + if (_player->HasUnitState(UNIT_STATE_DIED)) break; - player->HandleEmoteCommand(emote_anim); + _player->HandleEmoteCommand(emoteAnim); break; } - Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target); - - CellCoord p = Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY()); - - Cell cell(p); - cell.SetNoCreate(); + WorldPackets::Chat::STextEmote textEmote; + textEmote.SourceGUID = _player->GetGUID(); + textEmote.SourceAccountGUID = GetAccountGUID(); + textEmote.TargetGUID = packet.Target; + textEmote.EmoteID = packet.EmoteID; + textEmote.SoundIndex = packet.SoundIndex; + _player->SendMessageToSetInRange(textEmote.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true); - Trinity::EmoteChatBuilder emote_builder(*player, packet.SoundIndex, packet.EmoteID, unit); - Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > emote_do(emote_builder); - Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > > emote_worker(player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do); - TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder> >, WorldTypeMapContainer> message(emote_worker); - cell.Visit(p, message, *player->GetMap(), *player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE)); + Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target); - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit); - //Send scripted event call - if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) - ((Creature*)unit)->AI()->ReceiveEmote(player, packet.SoundIndex); + // Send scripted event call + if (unit) + if (Creature* creature = unit->ToCreature()) + creature->AI()->ReceiveEmote(_player, packet.SoundIndex); } void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) @@ -654,7 +622,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) return; WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); + packet.Initalize(CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); player->SendDirectMessage(packet.Write()); } diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index f1a2d92cda5..040b36bbbc3 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -25,10 +25,7 @@ namespace WorldPackets class Packet { public: - Packet(WorldPacket&& worldPacket) : _worldPacket(std::move(worldPacket)) - { - _connectionIndex = _worldPacket.GetConnection(); - } + Packet(WorldPacket&& worldPacket) : _worldPacket(std::move(worldPacket)) { } virtual ~Packet() = default; @@ -39,11 +36,10 @@ namespace WorldPackets virtual void Read() = 0; size_t GetSize() const { return _worldPacket.size(); } - ConnectionType GetConnection() const { return _connectionIndex; } + ConnectionType GetConnection() const { return _worldPacket.GetConnection(); } protected: WorldPacket _worldPacket; - ConnectionType _connectionIndex; }; class ServerPacket : public Packet @@ -53,7 +49,8 @@ namespace WorldPackets void Read() override final { ASSERT(!"Read not implemented for server packets."); } - void Reset() { _worldPacket.clear(); } + void Clear() { _worldPacket.clear(); } + WorldPacket&& Move() { return std::move(_worldPacket); } OpcodeServer GetOpcode() const { return OpcodeServer(_worldPacket.GetOpcode()); } }; diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 7590a092b2c..d33ce6e3ad9 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -16,6 +16,9 @@ */ #include "ChatPackets.h" +#include "Group.h" +#include "Player.h" +#include "World.h" void WorldPackets::Chat::ChatMessage::Read() { @@ -38,7 +41,6 @@ void WorldPackets::Chat::ChatMessageChannel::Read() _worldPacket >> Language; uint32 targetLen = _worldPacket.ReadBits(9); uint32 textLen = _worldPacket.ReadBits(8); - _worldPacket.ResetBitPos(); Target = _worldPacket.ReadString(targetLen); Text = _worldPacket.ReadString(textLen); } @@ -79,10 +81,62 @@ void WorldPackets::Chat::ChatMessageEmote::Read() Text = _worldPacket.ReadString(len); } +void WorldPackets::Chat::Chat::Initalize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, + uint32 achievementId /*= 0*/, std::string channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string addonPrefix /*= ""*/) +{ + // Clear everything because same packet can be used multiple times + Clear(); + + SenderGUID.Clear(); + SenderAccountGUID.Clear(); + SenderGuildGUID.Clear(); + PartyGUID.Clear(); + TargetGUID.Clear(); + SenderName.clear(); + TargetName.clear(); + _ChatFlags = CHAT_FLAG_NONE; + + SlashCmd = chatType; + _Language = language; + + if (sender) + { + SenderGUID = sender->GetGUID(); + + if (Creature const* creatureSender = sender->ToCreature()) + SenderName = creatureSender->GetNameForLocaleIdx(locale); + + if (Player const* playerSender = sender->ToPlayer()) + { + SenderAccountGUID = playerSender->GetSession()->GetAccountGUID(); + _ChatFlags = playerSender->GetChatFlags(); + + SenderGuildGUID = ObjectGuid::Create<HighGuid::Guild>(playerSender->GetGuildId()); + + if (Group const* group = playerSender->GetGroup()) + PartyGUID = group->GetGUID(); + } + } + + if (receiver) + { + TargetGUID = receiver->GetGUID(); + if (Creature const* creatureReceiver = receiver->ToCreature()) + TargetName = creatureReceiver->GetNameForLocaleIdx(locale); + } + + SenderVirtualAddress = GetVirtualRealmAddress(); + TargetVirtualAddress = GetVirtualRealmAddress(); + AchievementID = achievementId; + _Channel = std::move(channelName); + Prefix = std::move(addonPrefix); + ChatText = std::move(message); +} + WorldPacket const* WorldPackets::Chat::Chat::Write() { _worldPacket << SlashCmd; - _worldPacket << Language; + _worldPacket << _Language; _worldPacket << SenderGUID; _worldPacket << SenderGuildGUID; _worldPacket << SenderAccountGUID; @@ -95,15 +149,15 @@ WorldPacket const* WorldPackets::Chat::Chat::Write() _worldPacket.WriteBits(SenderName.length(), 11); _worldPacket.WriteBits(TargetName.length(), 11); _worldPacket.WriteBits(Prefix.length(), 5); - _worldPacket.WriteBits(Channel.length(), 7); + _worldPacket.WriteBits(_Channel.length(), 7); _worldPacket.WriteBits(ChatText.length(), 12); - _worldPacket.WriteBits(ChatFlags, 10); + _worldPacket.WriteBits(_ChatFlags, 10); _worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteString(SenderName); _worldPacket.WriteString(TargetName); _worldPacket.WriteString(Prefix); - _worldPacket.WriteString(Channel); + _worldPacket.WriteString(_Channel); _worldPacket.WriteString(ChatText); return &_worldPacket; @@ -113,7 +167,7 @@ WorldPacket const* WorldPackets::Chat::Emote::Write() { _worldPacket << Guid; _worldPacket << EmoteID; - + return &_worldPacket; } @@ -131,6 +185,6 @@ WorldPacket const* WorldPackets::Chat::STextEmote::Write() _worldPacket << EmoteID; _worldPacket << SoundIndex; _worldPacket << TargetGUID; - + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index 9cdc534528f..c64109dad89 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -134,10 +134,11 @@ namespace WorldPackets public: Chat() : ServerPacket(SMSG_MESSAGECHAT, 100) { } + void Initalize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = ""); WorldPacket const* Write() override; - uint8 SlashCmd = 0; - uint8 Language = LANG_UNIVERSAL; + uint8 SlashCmd = 0; ///< @see enum ChatMsg + uint8 _Language = LANG_UNIVERSAL; ObjectGuid SenderGUID; ObjectGuid SenderGuildGUID; ObjectGuid SenderAccountGUID; @@ -147,11 +148,11 @@ namespace WorldPackets uint32 TargetVirtualAddress = 0; std::string SenderName; std::string TargetName; - std::string Prefix; - std::string Channel; + std::string Prefix; ///< Addon Prefix + std::string _Channel; ///< Channel Name std::string ChatText; uint32 AchievementID = 0; - uint8 ChatFlags = 0; + uint8 _ChatFlags = 0; ///< @see enum ChatFlags float DisplayTime = 0.0f; bool HideChatLog = false; bool FakeSenderName = false; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 50ffe46260b..ed57485299c 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -40,18 +40,18 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& data << itemInstance.ItemID; data << itemInstance.RandomPropertiesSeed; data << itemInstance.RandomPropertiesID; - + data.WriteBit(itemInstance.ItemBonus.HasValue); data.WriteBit(!itemInstance.Modifications.empty()); data.FlushBits(); - + if (itemInstance.ItemBonus.HasValue) data << itemInstance.ItemBonus.Value; - + if (!itemInstance.Modifications.empty()) { data << uint32(itemInstance.Modifications.size() * sizeof(uint32)); - for (uint32 itemMod : itemInstance.Modifications) + for (int32 itemMod : itemInstance.Modifications) data << itemMod; } @@ -120,4 +120,4 @@ void WorldPackets::Item::AutoEquipItem::Read() void WorldPackets::Item::DestroyItem::Read() { _worldPacket >> count >> bag >> slot; -}
\ No newline at end of file +} diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b3c486b6e78..eff113b89c3 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -532,6 +532,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildRewardsQueryOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_XP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryXPOpcode ); // STATUS_AUTHED DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryInspectAchievements ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryNextMailTime ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_QUESTS_COMPLETED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryQuestsCompleted ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryTimeOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_ACCEPT_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); @@ -684,7 +685,6 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(MSG_PARTY_ASSIGNMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_PETITION_DECLINE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionDeclineOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_PETITION_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionRenameOpcode ); - DEFINE_OPCODE_HANDLER_OLD(MSG_QUERY_NEXT_MAIL_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryNextMailTime ); DEFINE_OPCODE_HANDLER_OLD(MSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult ); DEFINE_OPCODE_HANDLER_OLD(MSG_RAID_READY_CHECK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidReadyCheckOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_RAID_READY_CHECK_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -839,6 +839,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_QUEST_COMPLETED_BITS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -945,6 +946,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1136,6 +1138,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_WALK_IN_AIR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1268,6 +1272,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1327,6 +1332,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index cde1f7b030b..07971244cf0 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -101,7 +101,7 @@ enum OpcodeClient : uint32 CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST = 0xBADD, CMSG_BATTLEFIELD_PORT = 0x11EB, CMSG_BATTLEFIELD_REQUEST_SCORE_DATA = 0xBADD, - CMSG_BATTLEFIELD_STATUS = 0xBADD, + CMSG_BATTLEFIELD_STATUS = 0x0320, CMSG_BATTLEGROUND_PLAYER_POSITIONS = 0xBADD, CMSG_BATTLEMASTER_JOIN = 0x0D2E, CMSG_BATTLEMASTER_JOIN_ARENA = 0x0DAE, @@ -268,7 +268,7 @@ enum OpcodeClient : uint32 CMSG_GUILD_BANK_BUY_TAB = 0xBADD, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0xBADD, CMSG_GUILD_BANK_LOG_QUERY = 0xBADD, - CMSG_GUILD_BANK_MONEY_WITHDRAWN_QUERY = 0xBADD, + CMSG_GUILD_BANK_MONEY_WITHDRAWN_QUERY = 0x063D, CMSG_GUILD_BANK_NOTE = 0xBADD, CMSG_GUILD_BANK_QUERY_TAB = 0xBADD, CMSG_GUILD_BANK_QUERY_TEXT = 0xBADD, @@ -288,7 +288,7 @@ enum OpcodeClient : uint32 CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0xBADD, CMSG_GUILD_MOTD = 0xBADD, CMSG_GUILD_NEWS_UPDATE_STICKY = 0xBADD, - CMSG_GUILD_PERMISSIONS = 0xBADD, + CMSG_GUILD_PERMISSIONS = 0x1436, CMSG_GUILD_PROMOTE = 0xBADD, CMSG_GUILD_QUERY = 0x0930, CMSG_GUILD_QUERY_NEWS = 0xBADD, @@ -319,12 +319,12 @@ enum OpcodeClient : uint32 CMSG_LEARN_PREVIEW_TALENTS_PET = 0xBADD, CMSG_LEARN_TALENT = 0x0BB6, CMSG_LEAVE_CHANNEL = 0x19F2, - CMSG_LFG_GET_STATUS = 0xBADD, + CMSG_LFG_GET_STATUS = 0x1BA4, CMSG_LFG_JOIN = 0xBADD, CMSG_LFG_LEAVE = 0xBADD, CMSG_LFG_LFR_JOIN = 0xBADD, CMSG_LFG_LFR_LEAVE = 0xBADD, - CMSG_LFG_LOCK_INFO_REQUEST = 0xBADD, + CMSG_LFG_LOCK_INFO_REQUEST = 0x030F, CMSG_LFG_PROPOSAL_RESULT = 0xBADD, CMSG_LFG_SET_BOOT_VOTE = 0xBADD, CMSG_LFG_SET_COMMENT = 0xBADD, @@ -470,13 +470,14 @@ enum OpcodeClient : uint32 CMSG_PLAY_DANCE = 0xBADD, CMSG_PUSHQUESTTOPARTY = 0xBADD, CMSG_PVP_LOG_DATA = 0x08B5, - CMSG_QUERY_BATTLEFIELD_STATE = 0xBADD, + CMSG_QUERY_BATTLEFIELD_STATE = 0x0359, CMSG_QUERY_GUILD_MEMBERS_FOR_RECIPE = 0xBADD, CMSG_QUERY_GUILD_MEMBER_RECIPES = 0xBADD, CMSG_QUERY_GUILD_RECIPES = 0xBADD, CMSG_QUERY_GUILD_REWARDS = 0xBADD, CMSG_QUERY_GUILD_XP = 0xBADD, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0xBADD, + CMSG_QUERY_NEXT_MAIL_TIME = 0x0B31, CMSG_QUERY_QUESTS_COMPLETED = 0xBADD, CMSG_QUERY_TIME = 0xBADD, CMSG_QUESTGIVER_ACCEPT_QUEST = 0xBADD, @@ -588,7 +589,7 @@ enum OpcodeClient : uint32 CMSG_SUGGESTION_SUBMIT = 0xBADD, CMSG_SUMMON_RESPONSE = 0xBADD, CMSG_SUSPEND_COMMS_ACK = 0x0C56, - CMSG_SUSPEND_TOKEN_RESPONSE = 0xBADD, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x041E, CMSG_SWAP_INV_ITEM = 0x0F17, CMSG_SWAP_ITEM = 0x0736, CMSG_SYNC_DANCE = 0xBADD, @@ -790,7 +791,7 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A, SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD, SMSG_CAMERA_SHAKE = 0xBADD, - SMSG_CANCEL_AUTO_REPEAT = 0xBADD, + SMSG_CANCEL_AUTO_REPEAT = 0x0B18, SMSG_CANCEL_COMBAT = 0xBADD, SMSG_CAST_FAILED = 0x1A89, SMSG_CHANNEL_LIST = 0x1411, @@ -822,6 +823,7 @@ enum OpcodeServer : uint32 SMSG_CLEAR_COOLDOWN = 0xBADD, SMSG_CLEAR_COOLDOWNS = 0xBADD, SMSG_CLEAR_FAR_SIGHT_IMMEDIATE = 0xBADD, + SMSG_CLEAR_QUEST_COMPLETED_BITS = 0x1D47, SMSG_CLEAR_TARGET = 0xBADD, SMSG_CLIENTCACHE_VERSION = 0x080D, SMSG_CLIENT_CONTROL_UPDATE = 0xBADD, @@ -934,6 +936,7 @@ enum OpcodeServer : uint32 SMSG_GM_MESSAGECHAT = 0xBADD, SMSG_GM_PLAYER_INFO = 0xBADD, SMSG_GM_TICKET_CASE_STATUS = 0x1D8D, + SMSG_GM_TICKET_GET_TICKET_RESPONSE = 0x0389, SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD, SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229, SMSG_GODMODE = 0xBADD, @@ -953,13 +956,13 @@ enum OpcodeServer : uint32 SMSG_GUILD_ACHIEVEMENT_DELETED = 0xBADD, SMSG_GUILD_ACHIEVEMENT_EARNED = 0xBADD, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0xBADD, - SMSG_GUILD_BANK_LIST = 0xBADD, - SMSG_GUILD_BANK_LOG_QUERY_RESULT = 0xBADD, + SMSG_GUILD_BANK_LIST = 0x1245, + SMSG_GUILD_BANK_LOG_QUERY_RESULT = 0x1237, SMSG_GUILD_BANK_MONEY_WITHDRAWN = 0x1047, SMSG_GUILD_BANK_QUERY_TEXT_RESULT = 0xBADD, SMSG_GUILD_CANCEL = 0xBADD, SMSG_GUILD_CHALLENGE_COMPLETED = 0xBADD, - SMSG_GUILD_CHALLENGE_UPDATED = 0xBADD, + SMSG_GUILD_CHALLENGE_UPDATED = 0x1A06, SMSG_GUILD_CHANGE_NAME_RESULT = 0xBADD, SMSG_GUILD_COMMAND_RESULT = 0xBADD, SMSG_GUILD_COMMAND_RESULT_2 = 0xBADD, @@ -972,12 +975,12 @@ enum OpcodeServer : uint32 SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD, SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228, SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD, - SMSG_GUILD_INVITE = 0xBADD, + SMSG_GUILD_INVITE = 0x1025, SMSG_GUILD_INVITE_CANCEL = 0xBADD, SMSG_GUILD_KNOWN_RECIPES = 0xBADD, SMSG_GUILD_MAX_DAILY_XP = 0xBADD, SMSG_GUILD_MEMBERS_FOR_RECIPE = 0xBADD, - SMSG_GUILD_MEMBER_DAILY_RESET = 0xBADD, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x1015, SMSG_GUILD_MEMBER_RECIPES = 0xBADD, SMSG_GUILD_MEMBER_UPDATE_NOTE = 0xBADD, SMSG_GUILD_MOTD = 0x1825, @@ -989,7 +992,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x1827, SMSG_GUILD_QUERY_RESPONSE = 0x1046, SMSG_GUILD_RANK = 0x1218, - SMSG_GUILD_RANKS_UPDATE = 0xBADD, + SMSG_GUILD_RANKS_UPDATE = 0x1207, SMSG_GUILD_RECIPES = 0x1078, SMSG_GUILD_RENAMED = 0xBADD, SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, @@ -1122,7 +1125,7 @@ enum OpcodeServer : uint32 SMSG_MOVE_ROOT = 0x1B5A, SMSG_MOVE_SET_ACTIVE_MOVER = 0xBADD, SMSG_MOVE_SET_CAN_FLY = 0x01F6, - SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD, + SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x08CE, SMSG_MOVE_SET_COLLISION_HEIGHT = 0x008D, SMSG_MOVE_SET_COMPOUND_STATE = 0xBADD, SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0xBADD, @@ -1138,10 +1141,11 @@ enum OpcodeServer : uint32 SMSG_MOVE_SET_WALK_IN_AIR = 0xBADD, SMSG_MOVE_SET_WALK_SPEED = 0xBADD, SMSG_MOVE_TELEPORT = 0x03A6, - SMSG_MOVE_UNROOT = 0xBADD, + SMSG_MOVE_UNROOT = 0x08BD, SMSG_MOVE_UNSET_CAN_FLY = 0x0BAE, - SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD, + SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x00C5, SMSG_MOVE_UNSET_HOVER = 0x01A5, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x039E, SMSG_MOVE_UNSET_WALK_IN_AIR = 0xBADD, SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0xBADD, SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0xBADD, @@ -1202,7 +1206,7 @@ enum OpcodeServer : uint32 SMSG_PET_SPELLS = 0x0174, SMSG_PET_TAME_FAILURE = 0xBADD, SMSG_PET_UPDATE_COMBO_POINTS = 0xBADD, - SMSG_PLAYED_TIME = 0xBADD, + SMSG_PLAYED_TIME = 0x038B, SMSG_PLAYERBINDERROR = 0xBADD, SMSG_PLAYERBOUND = 0xBADD, SMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD, @@ -1280,6 +1284,7 @@ enum OpcodeServer : uint32 SMSG_RESISTLOG = 0xBADD, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0xBADD, SMSG_RESUME_COMMS = 0x07C9, + SMSG_RESUME_TOKEN = 0x0326, SMSG_RESURRECT_FAILED = 0xBADD, SMSG_RESURRECT_REQUEST = 0xBADD, SMSG_RESYNC_RUNES = 0xBADD, @@ -1340,6 +1345,7 @@ enum OpcodeServer : uint32 SMSG_SPELL_FAILED_OTHER = 0x1A03, SMSG_SPELL_FAILURE = 0x11DB, SMSG_SPELL_GO = 0x1161, + SMSG_SPELL_MULTISTRIKE_EFFECT = 0x131C, SMSG_SPELL_START = 0x0803, SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x0374, SMSG_SPIRIT_HEALER_CONFIRM = 0xBADD, diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index 270f2598553..d711bdcab3f 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -54,6 +54,18 @@ class WorldPacket : public ByteBuffer return *this; } + WorldPacket& operator=(WorldPacket&& right) + { + if (this != &right) + { + m_opcode = right.m_opcode; + _connection = right._connection; + ByteBuffer::operator=(std::move(right)); + } + + return *this; + } + WorldPacket(uint32 opcode, MessageBuffer&& buffer, ConnectionType connection) : ByteBuffer(std::move(buffer)), m_opcode(opcode), _connection(connection) { } void Initialize(uint32 opcode, size_t newres = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index da3135f6001..607fbe84471 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -441,7 +441,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* // base amount modification based on spell lvl vs caster lvl if (Scaling.Coefficient != 0.0f) { - int32 level = _spellInfo->SpellLevel; + uint32 level = _spellInfo->SpellLevel; if (target && _spellInfo->IsPositiveEffect(EffectIndex) && (Effect == SPELL_EFFECT_APPLY_AURA)) level = target->getLevel(); else if (caster) diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index a4834d555d3..1cab1f3576c 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -34,8 +34,9 @@ namespace Trinity { BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId); 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(); + packet.Initalize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale); + packet.Write(); + data = packet.Move(); } private: @@ -55,8 +56,9 @@ namespace Trinity void operator()(WorldPacket& data, LocaleConstant locale) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, _msgType, _language, _source, _target, _text, 0, "", locale); - data = *packet.Write(); + packet.Initalize(_msgType, _language, _source, _target, _text, 0, "", locale); + packet.Write(); + data = packet.Move(); } private: diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 992942cefeb..7f299c57c21 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -36,8 +36,9 @@ class CreatureTextBuilder { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _source, _target, text, 0, "", locale); - data = *packet.Write(); + packet.Initalize(_msgType, Language(_language), _source, _target, text, 0, "", locale); + packet.Write(); + data = packet.Move(); } private: @@ -60,8 +61,9 @@ class PlayerTextBuilder { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _talker, _target, text, 0, "", locale); - data = *packet.Write(); + packet.Initalize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); + packet.Write(); + data = packet.Move(); } private: @@ -308,7 +310,7 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject return iter->duration; } -float CreatureTextMgr::GetRangeForChatType(ChatMsg msgType) const +float CreatureTextMgr::GetRangeForChatType(ChatMsg msgType) { float dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY); switch (msgType) @@ -327,7 +329,7 @@ float CreatureTextMgr::GetRangeForChatType(ChatMsg msgType) const return dist; } -void CreatureTextMgr::SendSound(Creature* source, uint32 sound, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly) +void CreatureTextMgr::SendSound(Creature* source, uint32 sound, ChatMsg msgType, WorldObject const* whisperTarget /*= nullptr*/, CreatureTextRange range /*= TEXT_RANGE_NORMAL*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/) { if (!sound || !source) return; @@ -338,7 +340,7 @@ void CreatureTextMgr::SendSound(Creature* source, uint32 sound, ChatMsg msgType, SendNonChatPacket(source, &data, msgType, whisperTarget, range, team, gmOnly); } -void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly) const +void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly) { switch (msgType) { @@ -437,7 +439,7 @@ void CreatureTextMgr::SetRepeatId(Creature* source, uint8 textGroup, uint8 id) TC_LOG_ERROR("sql.sql", "CreatureTextMgr: TextGroup %u for Creature (%s) %s, id %u already added", uint32(textGroup), source->GetName().c_str(), source->GetGUID().ToString().c_str(), uint32(id)); } -CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) +CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) const { ASSERT(source);//should never happen CreatureTextRepeatIds ids; @@ -452,7 +454,7 @@ CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 te return ids; } -bool CreatureTextMgr::TextExist(uint32 sourceEntry, uint8 textGroup) +bool CreatureTextMgr::TextExist(uint32 sourceEntry, uint8 textGroup) const { if (!sourceEntry) return false; diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 647d8249e68..f15ec94c69b 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -96,24 +96,24 @@ class CreatureTextMgr void LoadCreatureTexts(); void LoadCreatureTextLocales(); - CreatureTextMap const& GetTextMap() const { return mTextMap; } + CreatureTextMap const& GetTextMap() const { return mTextMap; } - void SendSound(Creature* source, uint32 sound, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly); - void SendEmote(Unit* source, uint32 emote); + static void SendSound(Creature* source, uint32 sound, ChatMsg msgType, WorldObject const* whisperTarget = nullptr, CreatureTextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false); + static void SendEmote(Unit* source, uint32 emote); //if sent, returns the 'duration' of the text else 0 if error uint32 SendChat(Creature* source, uint8 textGroup, WorldObject const* whisperTarget = nullptr, ChatMsg msgType = CHAT_MSG_ADDON, Language language = LANG_ADDON, CreatureTextRange range = TEXT_RANGE_NORMAL, uint32 sound = 0, Team team = TEAM_OTHER, bool gmOnly = false, Player* srcPlr = nullptr); - bool TextExist(uint32 sourceEntry, uint8 textGroup); + bool TextExist(uint32 sourceEntry, uint8 textGroup) const; std::string GetLocalizedChatString(uint32 entry, uint8 gender, uint8 textGroup, uint32 id, LocaleConstant locale) const; - template<class Builder> void SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, WorldObject const* whisperTarget = nullptr, CreatureTextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false) const; + template<class Builder> static void SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, WorldObject const* whisperTarget = nullptr, CreatureTextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false); private: - CreatureTextRepeatIds GetRepeatGroup(Creature* source, uint8 textGroup); + CreatureTextRepeatIds GetRepeatGroup(Creature* source, uint8 textGroup) const; void SetRepeatId(Creature* source, uint8 textGroup, uint8 id); - void SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly) const; - float GetRangeForChatType(ChatMsg msgType) const; + static void SendNonChatPacket(WorldObject* source, WorldPacket* data, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly); + static float GetRangeForChatType(ChatMsg msgType); CreatureTextMap mTextMap; CreatureTextRepeatMap mTextRepeatMap; @@ -171,7 +171,7 @@ class CreatureTextLocalizer }; template<class Builder> -void CreatureTextMgr::SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, WorldObject const* whisperTarget /*= nullptr*/, CreatureTextRange range /*= TEXT_RANGE_NORMAL*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/) const +void CreatureTextMgr::SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, WorldObject const* whisperTarget /*= nullptr*/, CreatureTextRange range /*= TEXT_RANGE_NORMAL*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/) { if (!source) return; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 53a2ee814a7..a3ee2fa1265 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2260,38 +2260,38 @@ namespace Trinity { public: typedef std::vector<WorldPacket*> WorldPacketList; + static size_t const BufferSize = 2048; + explicit WorldWorldTextBuilder(uint32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) { } - void operator()(WorldPacketList& data_list, LocaleConstant loc_idx) + + void operator()(WorldPacketList& dataList, LocaleConstant locale) { - char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx); + char const* text = sObjectMgr->GetTrinityString(i_textId, locale); + char strBuffer[BufferSize]; if (i_args) { // we need copy va_list before use or original va_list will corrupted va_list ap; va_copy(ap, *i_args); - - char str[2048]; - vsnprintf(str, 2048, text, ap); + vsnprintf(strBuffer, BufferSize, text, ap); va_end(ap); - - do_helper(data_list, &str[0]); } else - do_helper(data_list, (char*)text); + std::strcpy(strBuffer, text); + + do_helper(dataList, strBuffer); } + private: - char* lineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = NULL; return start; } - void do_helper(WorldPacketList& data_list, char* text) + void do_helper(WorldPacketList& dataList, char* text) { - char* pos = text; - while (char* line = lineFromMessage(pos)) + while (char* line = ChatHandler::LineFromMessage(text)) { - WorldPacket* data = new WorldPacket(); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); - *data = *packet.Write(); - data_list.push_back(data); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + packet.Write(); + dataList.emplace_back(new WorldPacket(packet.Move())); } } @@ -2355,7 +2355,7 @@ void World::SendGlobalText(const char* text, WorldSession* self) while (char* line = ChatHandler::LineFromMessage(pos)) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, line); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); SendGlobalMessage(packet.Write(), self); } @@ -2389,7 +2389,7 @@ bool World::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession void World::SendZoneText(uint32 zone, const char* text, WorldSession* self, uint32 team) { WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, NULL, text); + packet.Initalize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, text); SendZoneMessage(zone, packet.Write(), self, team); } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 22a8fcb67f0..b6afc619387 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -482,7 +482,7 @@ public: char const* msg = "testtest"; uint8 type = atoi(args); WorldPackets::Chat::Chat packet; - ChatHandler::BuildChatPacket(&packet, ChatMsg(type), LANG_UNIVERSAL, handler->GetSession()->GetPlayer(), handler->GetSession()->GetPlayer(), msg, 0, "chan"); + packet.Initalize(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/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index caba9ff5262..645df91d8ea 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1079,7 +1079,7 @@ class boss_the_lich_king : public CreatureScript break; case EVENT_OUTRO_SOUL_BARRAGE: me->CastSpell((Unit*)NULL, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); - sCreatureTextMgr->SendSound(me, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_OTHER, false); + CreatureTextMgr::SendSound(me, SOUND_PAIN, CHAT_MSG_MONSTER_YELL); // set flight me->SetDisableGravity(true); me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 391aebf9229..3c84776edad 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -967,7 +967,7 @@ class boss_yogg_saron : public CreatureScript break; case EVENT_LUNATIC_GAZE: DoCast(me, SPELL_LUNATIC_GAZE); - sCreatureTextMgr->SendSound(me, SOUND_LUNATIC_GAZE, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_OTHER, false); + CreatureTextMgr::SendSound(me, SOUND_LUNATIC_GAZE, CHAT_MSG_MONSTER_YELL); _events.ScheduleEvent(EVENT_LUNATIC_GAZE, 12000, 0, PHASE_THREE); break; case EVENT_DEAFENING_ROAR: diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index 02713a30cc6..ba78a19f31a 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -26,8 +26,7 @@ ByteBuffer::ByteBuffer(MessageBuffer&& buffer) : _rpos(0), _wpos(0), _bitpos(Ini { } -ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, - size_t size, size_t valueSize) +ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize) { std::ostringstream ss; @@ -38,8 +37,7 @@ ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, message().assign(ss.str()); } -ByteBufferSourceException::ByteBufferSourceException(size_t pos, size_t size, - size_t valueSize) +ByteBufferSourceException::ByteBufferSourceException(size_t pos, size_t size, size_t valueSize) { std::ostringstream ss; diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 67e940e263c..42bd66c3c1d 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -86,13 +86,22 @@ class ByteBuffer } ByteBuffer(ByteBuffer&& buf) : _rpos(buf._rpos), _wpos(buf._wpos), - _bitpos(buf._bitpos), _curbitval(buf._curbitval), _storage(std::move(buf._storage)) { } + _bitpos(buf._bitpos), _curbitval(buf._curbitval), _storage(buf.Move()) { } ByteBuffer(ByteBuffer const& right) : _rpos(right._rpos), _wpos(right._wpos), _bitpos(right._bitpos), _curbitval(right._curbitval), _storage(right._storage) { } ByteBuffer(MessageBuffer&& buffer); + std::vector<uint8>&& Move() + { + _rpos = 0; + _wpos = 0; + _bitpos = InitialBitPos; + _curbitval = 0; + return std::move(_storage); + } + ByteBuffer& operator=(ByteBuffer const& right) { if (this != &right) @@ -107,12 +116,29 @@ class ByteBuffer return *this; } + ByteBuffer& operator=(ByteBuffer&& right) + { + if (this != &right) + { + _rpos = right._rpos; + _wpos = right._wpos; + _bitpos = right._bitpos; + _curbitval = right._curbitval; + _storage = right.Move(); + } + + return *this; + } + virtual ~ByteBuffer() { } void clear() { + _rpos = 0; + _wpos = 0; + _bitpos = InitialBitPos; + _curbitval = 0; _storage.clear(); - _rpos = _wpos = 0; } template <typename T> void append(T value) |