aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp44
-rw-r--r--src/server/game/Texts/ChatTextBuilder.cpp58
-rw-r--r--src/server/game/Texts/ChatTextBuilder.h46
-rw-r--r--src/server/game/Texts/CreatureTextMgrImpl.h6
4 files changed, 72 insertions, 82 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index b18439244db..d66163527a6 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -42,6 +42,7 @@
#include "CharacterPackets.h"
#include "Chat.h"
#include "ChatPackets.h"
+#include "ChatTextBuilder.h"
#include "CinematicMgr.h"
#include "CombatLogPackets.h"
#include "CombatPackets.h"
@@ -21969,54 +21970,15 @@ void Player::Say(std::string const& text, Language language, WorldObject const*
SendChatMessageToSetInRange(CHAT_MSG_SAY, language, std::move(_text), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY));
}
-struct ChatMessageDistDelivererCustomizer
-{
- // params
- ChatMsg Type;
- ::Language Language;
- WorldObject const* Sender;
- WorldObject const* Receiver;
- std::string Text;
-
- // caches
- WorldPackets::Chat::Chat UntranslatedPacket;
- mutable Optional<WorldPackets::Chat::Chat> TranslatedPacket;
- uint32 LanguageSkillId;
-
- ChatMessageDistDelivererCustomizer(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver, std::string message)
- : Type(chatType), Language(language), Sender(sender), Receiver(receiver), Text(std::move(message)), LanguageSkillId(0)
- {
- UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text);
- UntranslatedPacket.Write();
- if (LanguageDesc const* languageDesc = sLanguageMgr->GetLanguageDescById(language))
- LanguageSkillId = languageDesc->SkillId;
- }
-
- WorldPacket const* operator()(Player* player) const
- {
- if (player->CanUnderstandLanguageSkillId(LanguageSkillId))
- return UntranslatedPacket.GetRawPacket();
-
- if (!TranslatedPacket)
- {
- TranslatedPacket.emplace();
- TranslatedPacket->Initialize(Type, Language, Sender, Receiver, sLanguageMgr->Translate(Text, Language));
- TranslatedPacket->Write();
- }
-
- return TranslatedPacket->GetRawPacket();
- }
-};
-
void Player::SendChatMessageToSetInRange(ChatMsg chatMsg, Language language, std::string&& text, float range)
{
- ChatMessageDistDelivererCustomizer customizer(chatMsg, language, this, this, std::move(text));
+ Trinity::ChatPacketSender customizer(chatMsg, language, this, this, std::move(text));
// Send to self
SendDirectMessage(customizer.UntranslatedPacket.GetRawPacket());
// Send to players
- Trinity::MessageDistDeliverer<ChatMessageDistDelivererCustomizer> notifier(this, std::move(customizer), range);
+ Trinity::MessageDistDeliverer<Trinity::ChatPacketSender> notifier(this, customizer, range);
Cell::VisitWorldObjects(this, notifier, range);
}
diff --git a/src/server/game/Texts/ChatTextBuilder.cpp b/src/server/game/Texts/ChatTextBuilder.cpp
index 4abaa62392b..6c4b7b3761d 100644
--- a/src/server/game/Texts/ChatTextBuilder.cpp
+++ b/src/server/game/Texts/ChatTextBuilder.cpp
@@ -18,32 +18,54 @@
#include "ChatTextBuilder.h"
#include "CreatureTextMgr.h"
#include "DB2Stores.h"
-#include "GridNotifiers.h"
+#include "LanguageMgr.h"
#include "ObjectMgr.h"
#include "Player.h"
#include <cstdarg>
namespace Trinity
{
-PacketSenderOwning<WorldPackets::Chat::Chat>* BroadcastTextBuilder::operator()(LocaleConstant locale) const
+ChatPacketSender::ChatPacketSender(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver,
+ std::string message, uint32 achievementId /*= 0*/, LocaleConstant locale /*= LOCALE_enUS*/)
+ : Type(chatType), Language(language), Sender(sender), Receiver(receiver), Text(std::move(message)), AchievementId(achievementId), Locale(locale), LanguageSkillId(0)
{
- BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId);
- PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
- chat->Data.Initialize(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale);
- return chat;
+ UntranslatedPacket.Initialize(Type, Language, Sender, Receiver, Text, AchievementId, "", Locale);
+ UntranslatedPacket.Write();
+ if (LanguageDesc const* languageDesc = sLanguageMgr->GetLanguageDescById(language))
+ LanguageSkillId = languageDesc->SkillId;
}
-PacketSenderOwning<WorldPackets::Chat::Chat>* CustomChatTextBuilder::operator()(LocaleConstant locale) const
+void ChatPacketSender::operator()(Player const* player) const
{
- PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
- chat->Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
- return chat;
+ if (player->CanUnderstandLanguageSkillId(LanguageSkillId))
+ {
+ player->SendDirectMessage(UntranslatedPacket.GetRawPacket());
+ return;
+ }
+
+ if (!TranslatedPacket)
+ {
+ TranslatedPacket.emplace();
+ TranslatedPacket->Initialize(Type, Language, Sender, Receiver, sLanguageMgr->Translate(Text, Language), AchievementId, "", Locale);
+ TranslatedPacket->Write();
+ }
+
+ player->SendDirectMessage(TranslatedPacket->GetRawPacket());
}
-PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator()(LocaleConstant locale) const
+ChatPacketSender* BroadcastTextBuilder::operator()(LocaleConstant locale) const
{
- PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
+ BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId);
+ return new ChatPacketSender(_msgType, bct ? Language(bct->LanguageID) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, locale);
+}
+
+ChatPacketSender* CustomChatTextBuilder::operator()(LocaleConstant locale) const
+{
+ return new ChatPacketSender(_msgType, _language, _source, _target, _text, 0, locale);
+}
+ChatPacketSender* TrinityStringChatBuilder::operator()(LocaleConstant locale) const
+{
char const* text = sObjectMgr->GetTrinityString(_textId, locale);
if (_args)
@@ -57,18 +79,14 @@ PacketSenderOwning<WorldPackets::Chat::Chat>* TrinityStringChatBuilder::operator
vsnprintf(strBuffer, BufferSize, text, ap);
va_end(ap);
- chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, "", locale);
+ return new ChatPacketSender(_msgType, LANG_UNIVERSAL, _source, _target, strBuffer, 0, locale);
}
- else
- chat->Data.Initialize(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, "", locale);
- return chat;
+ return new ChatPacketSender(_msgType, LANG_UNIVERSAL, _source, _target, text, 0, locale);
}
-PacketSenderOwning<WorldPackets::Chat::Chat>* CreatureTextTextBuilder::operator()(LocaleConstant locale) const
+ChatPacketSender* CreatureTextTextBuilder::operator()(LocaleConstant locale) const
{
- PacketSenderOwning<WorldPackets::Chat::Chat>* chat = new PacketSenderOwning<WorldPackets::Chat::Chat>();
- chat->Data.Initialize(_msgType, _language, _talker, _target, sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale), 0, "", locale);
- return chat;
+ return new ChatPacketSender(_msgType, _language, _talker, _target, sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale), 0, locale);
}
}
diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h
index d5304e0c09e..74d677dfbfa 100644
--- a/src/server/game/Texts/ChatTextBuilder.h
+++ b/src/server/game/Texts/ChatTextBuilder.h
@@ -19,6 +19,7 @@
#define __CHATTEXT_BUILDER_H
#include "Common.h"
+#include "ChatPackets.h"
#include "SharedDefines.h"
#include <string>
@@ -27,29 +28,38 @@ class WorldObject;
namespace Trinity
{
- template<typename Packet>
- struct PacketSenderOwning;
-}
-
-namespace WorldPackets
-{
- class Packet;
-
- namespace Chat
+ class ChatPacketSender
{
- class Chat;
- }
-}
+ private:
+ // params
+ ChatMsg Type;
+ ::Language Language;
+ WorldObject const* Sender;
+ WorldObject const* Receiver;
+ std::string Text;
+ uint32 AchievementId;
+ LocaleConstant Locale;
+
+ uint32 LanguageSkillId;
+
+ public:
+ // caches
+ WorldPackets::Chat::Chat UntranslatedPacket;
+ mutable Optional<WorldPackets::Chat::Chat> TranslatedPacket;
+
+ ChatPacketSender(ChatMsg chatType, ::Language language, WorldObject const* sender, WorldObject const* receiver, std::string message,
+ uint32 achievementId = 0, LocaleConstant locale = LOCALE_enUS);
+
+ void operator()(Player const* player) const;
+ };
-namespace Trinity
-{
class BroadcastTextBuilder
{
public:
BroadcastTextBuilder(WorldObject const* obj, ChatMsg msgType, uint32 textId, uint8 gender, WorldObject const* target = nullptr, uint32 achievementId = 0)
: _source(obj), _msgType(msgType), _textId(textId), _gender(gender), _target(target), _achievementId(achievementId) { }
- PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const;
+ ChatPacketSender* operator()(LocaleConstant locale) const;
private:
WorldObject const* _source;
@@ -66,7 +76,7 @@ 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) { }
- PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const;
+ ChatPacketSender* operator()(LocaleConstant locale) const;
private:
WorldObject const* _source;
@@ -82,7 +92,7 @@ namespace Trinity
TrinityStringChatBuilder(WorldObject const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, va_list* args = nullptr)
: _source(obj), _msgType(msgType), _textId(textId), _target(target), _args(args) { }
- PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const;
+ ChatPacketSender* operator()(LocaleConstant locale) const;
private:
WorldObject const* _source;
@@ -98,7 +108,7 @@ namespace Trinity
CreatureTextTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, Language language, WorldObject const* target)
: _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { }
- PacketSenderOwning<WorldPackets::Chat::Chat>* operator()(LocaleConstant locale) const;
+ ChatPacketSender* operator()(LocaleConstant locale) const;
private:
WorldObject const* _source;
diff --git a/src/server/game/Texts/CreatureTextMgrImpl.h b/src/server/game/Texts/CreatureTextMgrImpl.h
index 46b7c8e909c..a4d368457ad 100644
--- a/src/server/game/Texts/CreatureTextMgrImpl.h
+++ b/src/server/game/Texts/CreatureTextMgrImpl.h
@@ -37,7 +37,7 @@ public:
void operator()(Player const* player) const
{
LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex();
- Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* sender;
+ Trinity::ChatPacketSender* sender;
// create if not cached yet
if (!_cache[loc_idx])
@@ -53,7 +53,7 @@ public:
case CHAT_MSG_MONSTER_WHISPER:
case CHAT_MSG_RAID_BOSS_WHISPER:
{
- WorldPackets::Chat::Chat message(sender->Data);
+ WorldPackets::Chat::Chat message(sender->UntranslatedPacket);
message.SetReceiver(player, loc_idx);
player->SendDirectMessage(message.Write());
return;
@@ -66,7 +66,7 @@ public:
}
private:
- mutable std::array<std::unique_ptr<Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>>, TOTAL_LOCALES> _cache;
+ mutable std::array<std::unique_ptr<Trinity::ChatPacketSender>, TOTAL_LOCALES> _cache;
Builder const& _builder;
ChatMsg _msgType;
};