Core/PacketIO: Fixed chat packet building in CreatureTextMgr

Closes #14871
This commit is contained in:
Shauren
2015-06-15 00:25:18 +02:00
parent ee01fad0d2
commit 66d8ccde7f
13 changed files with 117 additions and 80 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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(); }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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