/
CreatureTextMgr.h
130 lines (105 loc) · 4.48 KB
/
CreatureTextMgr.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TRINITY_CREATURE_TEXT_MGR_H
#define TRINITY_CREATURE_TEXT_MGR_H
#include "Common.h"
#include "SharedDefines.h"
#include <map>
#include <unordered_map>
#include <vector>
class Creature;
class Player;
class Unit;
class WorldObject;
class WorldPacket;
enum CreatureTextRange
{
TEXT_RANGE_NORMAL = 0,
TEXT_RANGE_AREA = 1,
TEXT_RANGE_ZONE = 2,
TEXT_RANGE_MAP = 3,
TEXT_RANGE_WORLD = 4,
TEXT_RANGE_PERSONAL = 5
};
enum class SoundKitPlayType : uint8
{
Normal = 0,
ObjectSound = 1,
Max = 2,
};
struct CreatureTextEntry
{
uint32 creatureId;
uint8 groupId;
uint8 id;
std::string text;
ChatMsg type;
Language lang;
float probability;
Emote emote;
uint32 duration;
uint32 sound;
SoundKitPlayType SoundPlayType;
uint32 BroadcastTextId;
CreatureTextRange TextRange;
};
struct CreatureTextLocale
{
std::vector<std::string> Text;
};
struct CreatureTextId
{
CreatureTextId(uint32 e, uint32 g, uint32 i) : entry(e), textGroup(g), textId(i) { }
friend std::strong_ordering operator<=>(CreatureTextId const& left, CreatureTextId const& right) = default;
uint32 entry;
uint32 textGroup;
uint32 textId;
};
typedef std::vector<CreatureTextEntry> CreatureTextGroup; // texts in a group
typedef std::unordered_map<uint8, CreatureTextGroup> CreatureTextHolder; // groups for a creature by groupid
typedef std::unordered_map<uint32, CreatureTextHolder> CreatureTextMap; // all creatures by entry
typedef std::map<CreatureTextId, CreatureTextLocale> LocaleCreatureTextMap;
class TC_GAME_API CreatureTextMgr
{
private:
CreatureTextMgr();
~CreatureTextMgr();
public:
CreatureTextMgr(CreatureTextMgr const&) = delete;
CreatureTextMgr(CreatureTextMgr&&) = delete;
CreatureTextMgr& operator=(CreatureTextMgr const&) = delete;
CreatureTextMgr& operator=(CreatureTextMgr&&) = delete;
static CreatureTextMgr* instance();
void LoadCreatureTexts();
void LoadCreatureTextLocales();
CreatureTextMap const& GetTextMap() const { return mTextMap; }
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, uint32 keyBroadcastTextId = 0, SoundKitPlayType playType = SoundKitPlayType::Normal);
static void SendEmote(Unit* source, Emote 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, SoundKitPlayType playType = SoundKitPlayType::Normal, Team team = TEAM_OTHER, bool gmOnly = false, Player* srcPlr = nullptr);
bool TextExist(uint32 sourceEntry, uint8 textGroup) const;
std::string GetLocalizedChatString(uint32 entry, uint8 gender, uint8 textGroup, uint32 id, LocaleConstant locale) 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);
static float GetRangeForChatType(ChatMsg msgType);
private:
static void SendNonChatPacket(WorldObject* source, WorldPacket const* data, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly);
CreatureTextMap mTextMap;
LocaleCreatureTextMap mLocaleTextMap;
};
#define sCreatureTextMgr CreatureTextMgr::instance()
#endif