diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 6 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 12 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvP.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Scripting/MapScripts.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packet.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.cpp | 69 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChatPackets.h | 15 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Texts/ChatTextBuilder.h | 18 | ||||
-rw-r--r-- | src/server/game/Texts/CreatureTextMgr.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Texts/CreatureTextMgr.h | 8 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 10 |
13 files changed, 117 insertions, 80 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index f37526ae71b..2b5c335bce0 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -48,7 +48,7 @@ namespace Trinity BattlegroundChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, va_list* args = NULL) : _msgtype(msgtype), _textId(textId), _source(source), _args(args) { } - void operator()(WorldPacket& data, LocaleConstant loc_idx) + WorldPackets::Packet* operator()(LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx); if (_args) @@ -61,19 +61,18 @@ namespace Trinity vsnprintf(str, 2048, text, ap); va_end(ap); - do_helper(data, &str[0]); + return do_helper(&str[0]); } - else - do_helper(data, text); + + return do_helper(text); } private: - void do_helper(WorldPacket& data, char const* text) + WorldPackets::Packet* do_helper(char const* text) { - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text); + return packet; } ChatMsg _msgtype; @@ -88,7 +87,7 @@ namespace Trinity Battleground2ChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, uint32 arg1, uint32 arg2) : _msgtype(msgtype), _textId(textId), _source(source), _arg1(arg1), _arg2(arg2) { } - void operator()(WorldPacket& data, LocaleConstant loc_idx) + WorldPackets::Packet* operator()(LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx); char const* arg1str = _arg1 ? sObjectMgr->GetTrinityString(_arg1, loc_idx) : ""; @@ -97,10 +96,9 @@ namespace Trinity char str[2048]; snprintf(str, 2048, text, arg1str, arg2str); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str); + return packet; } private: diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index aea2d8ec383..e6a574efe74 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -33,7 +33,7 @@ #include "CreatureAI.h" #include "Spell.h" #include "WorldSession.h" -#include "Packets/ChatPackets.h" +#include "Packet.h" class Player; //class Map; @@ -1411,7 +1411,7 @@ namespace Trinity private: Builder& i_builder; - std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index + std::vector<WorldPackets::Packet*> i_data_cache; // 0 = default, i => i-1 locale index }; // Prepare using Builder localized packets with caching and send to player @@ -1419,7 +1419,7 @@ namespace Trinity class LocalizedPacketListDo { public: - typedef std::vector<WorldPacket*> WorldPacketList; + typedef std::vector<WorldPackets::Packet*> WorldPacketList; explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) { } ~LocalizedPacketListDo() diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 30c5e523f21..3e00cb4741a 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -563,7 +563,7 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p) { LocaleConstant loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); uint32 cache_idx = loc_idx+1; - WorldPacket* data; + WorldPackets::Packet* data; // create if not cached yet if (i_data_cache.size() < cache_idx + 1 || !i_data_cache[cache_idx]) @@ -571,18 +571,18 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p) if (i_data_cache.size() < cache_idx + 1) i_data_cache.resize(cache_idx + 1); - data = new WorldPacket(); + data = i_builder(loc_idx); - i_builder(*data, loc_idx); + ASSERT(data->GetSize() == 0); - ASSERT(data->GetOpcode() != NULL_OPCODE); + data->Write(); i_data_cache[cache_idx] = data; } else data = i_data_cache[cache_idx]; - p->SendDirectMessage(data); + p->SendDirectMessage(data->GetRawPacket()); } template<class Builder> @@ -606,7 +606,7 @@ void Trinity::LocalizedPacketListDo<Builder>::operator()(Player* p) data_list = &i_data_cache[cache_idx]; for (size_t i = 0; i < data_list->size(); ++i) - p->SendDirectMessage((*data_list)[i]); + p->SendDirectMessage((*data_list)[i]->GetRawPacket()); } #endif // TRINITY_GRIDNOTIFIERSIMPL_H diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 117891140da..d91dc2bc469 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -26,6 +26,7 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "CellImpl.h" +#include "Packets/ChatPackets.h" class DefenseMessageBuilder { @@ -33,14 +34,14 @@ class DefenseMessageBuilder DefenseMessageBuilder(uint32 zoneId, uint32 id) : _zoneId(zoneId), _id(id) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::DefenseMessage* operator()(LocaleConstant locale) const { std::string text = sOutdoorPvPMgr->GetDefenseMessage(_zoneId, _id, locale); - data.Initialize(SMSG_DEFENSE_MESSAGE, 4 + 4 + text.length()); - data.append<uint32>(_zoneId); - data.append<uint32>(text.length()); - data << text; + WorldPackets::Chat::DefenseMessage* defenseMessage = new WorldPackets::Chat::DefenseMessage(); + defenseMessage->ZoneID = _zoneId; + defenseMessage->MessageText = text; + return defenseMessage; } private: diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index ecfc069ca78..225ab7386c6 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -799,7 +799,6 @@ void Map::ScriptsProcess() } Creature* cTarget = NULL; - WorldObject* wSource = dynamic_cast<WorldObject*>(source); auto creatureBounds = _creatureBySpawnIdStore.equal_range(step.script->CallScript.CreatureEntry); if (creatureBounds.first != creatureBounds.second) { diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index 85d65e967be..89435db31e3 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -35,6 +35,7 @@ namespace WorldPackets virtual WorldPacket const* Write() = 0; virtual void Read() = 0; + WorldPacket const* GetRawPacket() const { return &_worldPacket; } size_t GetSize() const { return _worldPacket.size(); } ConnectionType GetConnection() const { return _worldPacket.GetConnection(); } diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 4204278d514..726e1b87cc6 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -92,6 +92,15 @@ void WorldPackets::Chat::ChatMessageEmote::Read() Text = _worldPacket.ReadString(len); } +WorldPackets::Chat::Chat::Chat(Chat const& chat) : ServerPacket(SMSG_CHAT, chat._worldPacket.size()), + SlashCmd(chat.SlashCmd), _Language(chat._Language), SenderGUID(chat.SenderGUID), + SenderGuildGUID(chat.SenderGuildGUID), SenderAccountGUID(chat.SenderAccountGUID), TargetGUID(chat.TargetGUID), PartyGUID(chat.PartyGUID), + SenderVirtualAddress(chat.SenderVirtualAddress), TargetVirtualAddress(chat.TargetVirtualAddress), SenderName(chat.SenderName), TargetName(chat.TargetName), + Prefix(chat.Prefix), _Channel(chat._Channel), ChatText(chat.ChatText), AchievementID(chat.AchievementID), _ChatFlags(chat._ChatFlags), + DisplayTime(chat.DisplayTime), HideChatLog(chat.HideChatLog), FakeSenderName(chat.FakeSenderName) +{ +} + void WorldPackets::Chat::Chat::Initialize(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 /*= ""*/) { @@ -111,30 +120,10 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W _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(); - } - } + SetSender(sender, locale); if (receiver) - { - TargetGUID = receiver->GetGUID(); - if (Creature const* creatureReceiver = receiver->ToCreature()) - TargetName = creatureReceiver->GetNameForLocaleIdx(locale); - } + SetReceiver(receiver, locale); SenderVirtualAddress = GetVirtualRealmAddress(); TargetVirtualAddress = GetVirtualRealmAddress(); @@ -144,6 +133,32 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W ChatText = std::move(message); } +void WorldPackets::Chat::Chat::SetSender(WorldObject const* sender, LocaleConstant locale) +{ + 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(); + } +} + +void WorldPackets::Chat::Chat::SetReceiver(WorldObject const* receiver, LocaleConstant locale) +{ + TargetGUID = receiver->GetGUID(); + if (Creature const* creatureReceiver = receiver->ToCreature()) + TargetName = creatureReceiver->GetNameForLocaleIdx(locale); +} + WorldPacket const* WorldPackets::Chat::Chat::Write() { _worldPacket << SlashCmd; @@ -245,3 +260,13 @@ void WorldPackets::Chat::ChatRegisterAddonPrefixes::Read() Prefixes.push_back(_worldPacket.ReadString(lenghts)); } } + +WorldPacket const* WorldPackets::Chat::DefenseMessage::Write() +{ + _worldPacket << int32(ZoneID); + _worldPacket.WriteBits(MessageText.length(), 12); + _worldPacket.FlushBits(); + _worldPacket.WriteString(MessageText); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index c8bb038ce19..0686fe63c00 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -150,8 +150,12 @@ namespace WorldPackets { public: Chat() : ServerPacket(SMSG_CHAT, 100) { } + Chat(Chat const& chat); void Initialize(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 = ""); + void SetSender(WorldObject const* sender, LocaleConstant locale); + void SetReceiver(WorldObject const* receiver, LocaleConstant locale); + WorldPacket const* Write() override; uint8 SlashCmd = 0; ///< @see enum ChatMsg @@ -268,6 +272,17 @@ namespace WorldPackets void Read() override { } }; + + class DefenseMessage final : public ServerPacket + { + public: + DefenseMessage() : ServerPacket(SMSG_DEFENSE_MESSAGE) { } + + WorldPacket const* Write() override; + + int32 ZoneID = 0; + std::string MessageText; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 45071d14cd4..39d3f002a94 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1055,7 +1055,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index 167680f1cd2..68cd375edb6 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -30,13 +30,12 @@ namespace Trinity BroadcastTextBuilder(Unit const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, uint32 achievementId = 0) : _source(obj), _msgType(msgType), _textId(textId), _target(target), _achievementId(achievementId) { } - void operator()(WorldPacket& data, LocaleConstant locale) + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale); + return chat; } private: @@ -53,12 +52,11 @@ namespace Trinity CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr) : _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { } - void operator()(WorldPacket& data, LocaleConstant locale) + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); + return chat; } private: diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index c1ea235a3e2..4d61e2ec5d2 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -33,13 +33,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) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale); + return chat; } private: @@ -58,13 +57,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) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); + return chat; } private: diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 307f6ece4f8..f2963006599 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -145,23 +145,25 @@ class CreatureTextLocalizer // create if not cached yet if (!_packetCache[loc_idx]) { - messageTemplate = new WorldPackets::Chat::Chat(); + messageTemplate = _builder(loc_idx); _packetCache[loc_idx] = messageTemplate; } else messageTemplate = _packetCache[loc_idx]; + WorldPackets::Chat::Chat message(*messageTemplate); + switch (_msgType) { case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: - messageTemplate->TargetGUID = player->GetGUID(); + message.SetReceiver(player, loc_idx); break; default: break; } - player->SendDirectMessage(messageTemplate->Write()); + player->SendDirectMessage(message.Write()); } private: diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d68da8fbc63..0e98eb265cc 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2351,7 +2351,7 @@ namespace Trinity class WorldWorldTextBuilder { public: - typedef std::vector<WorldPacket*> WorldPacketList; + typedef std::vector<WorldPackets::Packet*> WorldPacketList; static size_t const BufferSize = 2048; explicit WorldWorldTextBuilder(uint32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) { } @@ -2383,10 +2383,10 @@ namespace Trinity { while (char* line = ChatHandler::LineFromMessage(text)) { - WorldPackets::Chat::Chat packet; - packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); - packet.Write(); - dataList.emplace_back(new WorldPacket(packet.Move())); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + packet->Write(); + dataList.push_back(packet); } } |