TrinityCore
cs_arena.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: arena_commandscript
20%Complete: 100
21Comment: All arena team related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "ArenaTeamMgr.h"
27#include "CharacterCache.h"
28#include "Chat.h"
29#include "ChatCommand.h"
30#include "Language.h"
31#include "RBAC.h"
32#include "WorldSession.h"
33
34using namespace Trinity::ChatCommands;
35
37{
38public:
39 arena_commandscript() : CommandScript("arena_commandscript") { }
40
42 {
43 static ChatCommandTable arenaCommandTable =
44 {
51 };
52 static ChatCommandTable commandTable =
53 {
54 { "arena", arenaCommandTable },
55 };
56 return commandTable;
57 }
58
60 {
61 if (sArenaTeamMgr->GetArenaTeamByName(name))
62 {
63 handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_EXISTS, name.c_str());
64 handler->SetSentErrorMessage(true);
65 return false;
66 }
67
68 if (!captain)
69 captain = PlayerIdentifier::FromTargetOrSelf(handler);
70 if (!captain)
71 return false;
72
73 if (sCharacterCache->GetCharacterArenaTeamIdByGuid(captain->GetGUID(), type) != 0)
74 {
75 handler->PSendSysMessage(LANG_ARENA_ERROR_SIZE, captain->GetName().c_str());
76 handler->SetSentErrorMessage(true);
77 return false;
78 }
79
80 ArenaTeam* arena = new ArenaTeam();
81
82 if (!arena->Create(captain->GetGUID(), type, name, 4293102085, 101, 4293253939, 4, 4284049911))
83 {
84 delete arena;
86 handler->SetSentErrorMessage(true);
87 return false;
88 }
89
90 sArenaTeamMgr->AddArenaTeam(arena);
91 handler->PSendSysMessage(LANG_ARENA_CREATE, arena->GetName().c_str(), arena->GetId(), arena->GetType(), arena->GetCaptain().ToString().c_str());
92
93 return true;
94 }
95
96 static bool HandleArenaDisbandCommand(ChatHandler* handler, uint32 teamId)
97 {
98 ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamById(teamId);
99
100 if (!arena)
101 {
103 handler->SetSentErrorMessage(true);
104 return false;
105 }
106
107 if (arena->IsFighting())
108 {
110 handler->SetSentErrorMessage(true);
111 return false;
112 }
113
114 std::string name = arena->GetName();
115 arena->Disband();
116 delete arena;
117
118 handler->PSendSysMessage(LANG_ARENA_DISBAND, name.c_str(), teamId);
119 return true;
120 }
121
122 static bool HandleArenaRenameCommand(ChatHandler* handler, QuotedString oldName, QuotedString newName)
123 {
124 ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamByName(oldName);
125 if (!arena)
126 {
127 handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_NOT_FOUND, oldName.c_str());
128 handler->SetSentErrorMessage(true);
129 return false;
130 }
131
132 if (sArenaTeamMgr->GetArenaTeamByName(newName))
133 {
134 handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_EXISTS, newName.c_str());
135 handler->SetSentErrorMessage(true);
136 return false;
137 }
138
139 if (arena->IsFighting())
140 {
142 handler->SetSentErrorMessage(true);
143 return false;
144 }
145
146 if (arena->SetName(newName))
147 {
148 handler->PSendSysMessage(LANG_ARENA_RENAME, arena->GetId(), oldName.c_str(), newName.c_str());
149 return true;
150 }
151 else
152 {
154 handler->SetSentErrorMessage(true);
155 return false;
156 }
157 }
158
160 {
161 ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamById(teamId);
162 if (!arena)
163 {
165 handler->SetSentErrorMessage(true);
166 return false;
167 }
168
169 if (arena->IsFighting())
170 {
172 handler->SetSentErrorMessage(true);
173 return false;
174 }
175
176 if (!target)
177 target = PlayerIdentifier::FromTargetOrSelf(handler);
178 if (!target)
179 return false;
180
181 if (!arena->IsMember(target->GetGUID()))
182 {
183 handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_MEMBER, target->GetName().c_str(), arena->GetName().c_str());
184 handler->SetSentErrorMessage(true);
185 return false;
186 }
187
188 if (arena->GetCaptain() == target->GetGUID())
189 {
190 handler->PSendSysMessage(LANG_ARENA_ERROR_CAPTAIN, target->GetName().c_str(), arena->GetName().c_str());
191 handler->SetSentErrorMessage(true);
192 return false;
193 }
194
195 CharacterCacheEntry const* oldCaptainNameData = sCharacterCache->GetCharacterCacheByGuid(arena->GetCaptain());
196 char const* oldCaptainName = oldCaptainNameData ? oldCaptainNameData->Name.c_str() : "<unknown>";
197
198 arena->SetCaptain(target->GetGUID());
199 handler->PSendSysMessage(LANG_ARENA_CAPTAIN, arena->GetName().c_str(), arena->GetId(), oldCaptainName, target->GetName().c_str());
200
201 return true;
202 }
203
204 static bool HandleArenaInfoCommand(ChatHandler* handler, uint32 teamId)
205 {
206 ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamById(teamId);
207
208 if (!arena)
209 {
211 handler->SetSentErrorMessage(true);
212 return false;
213 }
214
215 handler->PSendSysMessage(LANG_ARENA_INFO_HEADER, arena->GetName().c_str(), arena->GetId(), arena->GetRating(), arena->GetType(), arena->GetType());
216 for (ArenaTeam::MemberList::iterator itr = arena->m_membersBegin(); itr != arena->m_membersEnd(); ++itr)
217 handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr->Name.c_str(), itr->Guid.ToString().c_str(), itr->PersonalRating, (arena->GetCaptain() == itr->Guid ? " - Captain" : ""));
218
219 return true;
220 }
221
222 static bool HandleArenaLookupCommand(ChatHandler* handler, Tail needle)
223 {
224 if (needle.empty())
225 return false;
226
227 bool found = false;
228 for (auto [teamId, team] : sArenaTeamMgr->GetArenaTeams())
229 {
230 if (StringContainsStringI(team->GetName(), needle))
231 {
232 if (handler->GetSession())
233 {
234 handler->PSendSysMessage(LANG_ARENA_LOOKUP, team->GetName().c_str(), team->GetId(), team->GetType(), team->GetType());
235 found = true;
236 continue;
237 }
238 }
239 }
240
241 if (!found)
242 handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_NOT_FOUND, std::string(needle).c_str());
243
244 return true;
245 }
246};
247
249{
251}
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:53
ArenaTeamTypes
Definition: ArenaTeam.h:77
#define sCharacterCache
uint32_t uint32
Definition: Define.h:142
@ LANG_ARENA_DISBAND
Definition: Language.h:811
@ LANG_ARENA_ERROR_NAME_EXISTS
Definition: Language.h:804
@ LANG_ARENA_ERROR_NAME_NOT_FOUND
Definition: Language.h:807
@ LANG_ARENA_CAPTAIN
Definition: Language.h:813
@ LANG_ARENA_INFO_HEADER
Definition: Language.h:814
@ LANG_ARENA_CREATE
Definition: Language.h:810
@ LANG_ARENA_ERROR_CAPTAIN
Definition: Language.h:809
@ LANG_ARENA_ERROR_NOT_MEMBER
Definition: Language.h:808
@ LANG_ARENA_ERROR_SIZE
Definition: Language.h:805
@ LANG_ARENA_RENAME
Definition: Language.h:812
@ LANG_BAD_VALUE
Definition: Language.h:149
@ LANG_ARENA_LOOKUP
Definition: Language.h:816
@ LANG_ARENA_INFO_MEMBERS
Definition: Language.h:815
@ LANG_ARENA_ERROR_NOT_FOUND
Definition: Language.h:803
@ LANG_ARENA_ERROR_COMBAT
Definition: Language.h:806
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
Role Based Access Control related classes definition.
bool StringContainsStringI(std::string_view haystack, std::string_view needle)
Definition: Util.cpp:896
MemberList::iterator m_membersBegin()
Definition: ArenaTeam.h:142
void Disband(WorldSession *session)
Definition: ArenaTeam.cpp:345
ObjectGuid GetCaptain() const
Definition: ArenaTeam.h:128
uint32 GetRating() const
Definition: ArenaTeam.h:132
bool IsMember(ObjectGuid guid) const
Definition: ArenaTeam.cpp:495
bool SetName(std::string const &name)
Definition: ArenaTeam.cpp:271
bool Create(ObjectGuid captainGuid, uint8 type, std::string const &teamName, uint32 backgroundColor, uint8 emblemStyle, uint32 emblemColor, uint8 borderStyle, uint32 borderColor)
Definition: ArenaTeam.cpp:47
void SetCaptain(ObjectGuid guid)
Definition: ArenaTeam.cpp:284
uint32 GetType() const
Definition: ArenaTeam.h:124
bool IsFighting() const
Definition: ArenaTeam.cpp:797
std::string const & GetName() const
Definition: ArenaTeam.h:129
MemberList::iterator m_membersEnd()
Definition: ArenaTeam.h:143
uint32 GetId() const
Definition: ArenaTeam.h:123
WorldSession * GetSession()
Definition: Chat.h:42
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
void SetSentErrorMessage(bool val)
Definition: Chat.h:114
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:113
std::string ToString() const
Definition: ObjectGuid.cpp:554
static bool HandleArenaDisbandCommand(ChatHandler *handler, uint32 teamId)
Definition: cs_arena.cpp:96
static bool HandleArenaCreateCommand(ChatHandler *handler, Optional< PlayerIdentifier > captain, QuotedString name, ArenaTeamTypes type)
Definition: cs_arena.cpp:59
ChatCommandTable GetCommands() const override
Definition: cs_arena.cpp:41
static bool HandleArenaRenameCommand(ChatHandler *handler, QuotedString oldName, QuotedString newName)
Definition: cs_arena.cpp:122
static bool HandleArenaLookupCommand(ChatHandler *handler, Tail needle)
Definition: cs_arena.cpp:222
static bool HandleArenaCaptainCommand(ChatHandler *handler, uint32 teamId, Optional< PlayerIdentifier > target)
Definition: cs_arena.cpp:159
static bool HandleArenaInfoCommand(ChatHandler *handler, uint32 teamId)
Definition: cs_arena.cpp:204
void AddSC_arena_commandscript()
Definition: cs_arena.cpp:248
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
@ RBAC_PERM_COMMAND_ARENA_LOOKUP
Definition: RBAC.h:151
@ RBAC_PERM_COMMAND_ARENA_RENAME
Definition: RBAC.h:152
@ RBAC_PERM_COMMAND_ARENA_INFO
Definition: RBAC.h:150
@ RBAC_PERM_COMMAND_ARENA_DISBAND
Definition: RBAC.h:149
@ RBAC_PERM_COMMAND_ARENA_CAPTAIN
Definition: RBAC.h:147
@ RBAC_PERM_COMMAND_ARENA_CREATE
Definition: RBAC.h:148