TrinityCore
cs_group.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#include "ScriptMgr.h"
19#include "CharacterCache.h"
20#include "ChatCommandTags.h"
21#include "Chat.h"
22#include "ChatCommand.h"
23#include "DatabaseEnv.h"
24#include "DB2Stores.h"
25#include "Group.h"
26#include "GroupMgr.h"
27#include "Language.h"
28#include "LFG.h"
29#include "Map.h"
30#include "ObjectAccessor.h"
31#include "PhasingHandler.h"
32#include "Player.h"
33#include "RBAC.h"
34#include "WorldSession.h"
35
36#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
37#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
38#endif
39
40using namespace Trinity::ChatCommands;
41
43{
44public:
45 group_commandscript() : CommandScript("group_commandscript") { }
46
47 std::vector<ChatCommand> GetCommands() const override
48 {
49 static std::vector<ChatCommand> groupSetCommandTable =
50 {
55 };
56
57 static std::vector<ChatCommand> groupCommandTable =
58 {
59 { "set", rbac::RBAC_PERM_COMMAND_GROUP_SET, false, nullptr, "", groupSetCommandTable },
69 };
70
71 static std::vector<ChatCommand> commandTable =
72 {
73 { "group", rbac::RBAC_PERM_COMMAND_GROUP, false, nullptr, "", groupCommandTable },
74 };
75 return commandTable;
76 }
77
79 {
80 if (level < 1)
81 return false;
82 if (!player)
83 player = PlayerIdentifier::FromTargetOrSelf(handler);
84 if (!player)
85 return false;
86
87 Player* target = player->GetConnectedPlayer();
88 if (!target)
89 return false;
90
91 Group* groupTarget = target->GetGroup();
92 if (!groupTarget)
93 return false;
94
95 for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next())
96 {
97 target = it->GetSource();
98 if (target)
99 {
100 uint8 oldlevel = static_cast<uint8>(target->GetLevel());
101
102 if (level != oldlevel)
103 {
104 target->SetLevel(static_cast<uint8>(level));
105 target->InitTalentForLevel();
106 target->SetXP(0);
107 }
108
109 if (handler->needReportToTarget(target))
110 {
111 if (oldlevel < static_cast<uint8>(level))
112 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_UP, handler->GetNameLink().c_str(), level);
113 else // if (oldlevel > newlevel)
114 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, handler->GetNameLink().c_str(), level);
115 }
116 }
117 }
118 return true;
119 }
120
121 static bool HandleGroupReviveCommand(ChatHandler* handler, char const* args)
122 {
123 Player* playerTarget;
124 if (!handler->extractPlayerTarget((char*)args, &playerTarget))
125 return false;
126
127 Group* groupTarget = playerTarget->GetGroup();
128 if (!groupTarget)
129 return false;
130
131 for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next())
132 {
133 Player* target = it->GetSource();
134 if (target)
135 {
137 target->SpawnCorpseBones();
138 target->SaveToDB();
139 }
140 }
141
142 return true;
143 }
144
145 // Repair group of players
146 static bool HandleGroupRepairCommand(ChatHandler* handler, char const* args)
147 {
148 Player* playerTarget;
149 if (!handler->extractPlayerTarget((char*)args, &playerTarget))
150 return false;
151
152 Group* groupTarget = playerTarget->GetGroup();
153 if (!groupTarget)
154 return false;
155
156 for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next())
157 {
158 Player* target = it->GetSource();
159 if (target)
160 {
161 target->DurabilityRepairAll(false, 0, false);
162 }
163 }
164
165 return true;
166 }
167
168 // Summon group of player
169 static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
170 {
171 Player* target;
172 if (!handler->extractPlayerTarget((char*)args, &target))
173 return false;
174
175 // check online security
176 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
177 return false;
178
179 Group* group = target->GetGroup();
180
181 std::string nameLink = handler->GetNameLink(target);
182
183 if (!group)
184 {
185 handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
186 return false;
187 }
188
189 Player* gmPlayer = handler->GetSession()->GetPlayer();
190 Map* gmMap = gmPlayer->GetMap();
191 bool toInstance = gmMap->Instanceable();
192 bool onlyLocalSummon = false;
193
194 // make sure people end up on our instance of the map, disallow far summon if intended destination is different from actual destination
195 // note: we could probably relax this further by checking permanent saves and the like, but eh
196 // :close enough:
197 if (toInstance)
198 {
199 Player* groupLeader = ObjectAccessor::GetPlayer(gmMap, group->GetLeaderGUID());
200 if (!groupLeader || (groupLeader->GetMapId() != gmMap->GetId()) || (groupLeader->GetInstanceId() != gmMap->GetInstanceId()))
201 {
203 onlyLocalSummon = true;
204 }
205 }
206
207 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
208 {
209 Player* player = itr->GetSource();
210
211 if (!player || player == gmPlayer || !player->GetSession())
212 continue;
213
214 // check online security
215 if (handler->HasLowerSecurity(player, ObjectGuid::Empty))
216 continue;
217
218 std::string plNameLink = handler->GetNameLink(player);
219
220 if (player->IsBeingTeleported())
221 {
222 handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
223 continue;
224 }
225
226 if (toInstance)
227 {
228 Map* playerMap = player->GetMap();
229
230 if (
231 (onlyLocalSummon || (playerMap->Instanceable() && playerMap->GetId() == gmMap->GetId())) && // either no far summon allowed or we're in the same map as player (no map switch)
232 ((playerMap->GetId() != gmMap->GetId()) || (playerMap->GetInstanceId() != gmMap->GetInstanceId())) // so we need to be in the same map and instance of the map, otherwise skip
233 )
234 {
235 // cannot summon from instance to instance
236 handler->PSendSysMessage(LANG_CANNOT_SUMMON_INST_INST, plNameLink.c_str());
237 continue;
238 }
239 }
240
241 handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
242 if (handler->needReportToTarget(player))
243 ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
244
245 // stop flight if need
246 if (player->IsInFlight())
247 player->FinishTaxiFlight();
248 else
249 player->SaveRecallPosition(); // save only in non-flight case
250
251 // before GM
252 float x, y, z;
253 gmPlayer->GetClosePoint(x, y, z, player->GetCombatReach());
254 player->TeleportTo(gmPlayer->GetMapId(), x, y, z, player->GetOrientation(), TELE_TO_NONE, gmPlayer->GetInstanceId());
255 }
256
257 return true;
258 }
259
260 static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
261 {
262 Player* player = nullptr;
263 Group* group = nullptr;
264 ObjectGuid guid;
265 char* nameStr = strtok((char*)args, " ");
266
267 if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
268 return false;
269
270 if (!group)
271 {
272 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
273 handler->SetSentErrorMessage(true);
274 return false;
275 }
276
277 if (group->GetLeaderGUID() != guid)
278 {
279 group->ChangeLeader(guid);
280 group->SendUpdate();
281 }
282
283 return true;
284 }
285
286 static bool GroupFlagCommand(ChatHandler* handler, char const* args, GroupMemberFlags flag, char const* what)
287 {
288 Player* player = nullptr;
289 Group* group = nullptr;
290 ObjectGuid guid;
291 char* nameStr = strtok((char*)args, " ");
292
293 if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
294 return false;
295
296 if (!group)
297 {
298 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
299 handler->SetSentErrorMessage(true);
300 return false;
301 }
302
303 if (!group->isRaidGroup())
304 {
305 handler->PSendSysMessage(LANG_GROUP_NOT_IN_RAID_GROUP, player->GetName().c_str());
306 handler->SetSentErrorMessage(true);
307 return false;
308 }
309
310 if (flag == MEMBER_FLAG_ASSISTANT && group->IsLeader(guid))
311 {
312 handler->PSendSysMessage(LANG_LEADER_CANNOT_BE_ASSISTANT, player->GetName().c_str());
313 handler->SetSentErrorMessage(true);
314 return false;
315 }
316
317 if (group->GetMemberFlags(guid) & flag)
318 {
319 group->SetGroupMemberFlag(guid, false, flag);
320 handler->PSendSysMessage(LANG_GROUP_ROLE_CHANGED, player->GetName().c_str(), "no longer", what);
321 }
322 else
323 {
324 group->SetGroupMemberFlag(guid, true, flag);
325 handler->PSendSysMessage(LANG_GROUP_ROLE_CHANGED, player->GetName().c_str(), "now", what);
326 }
327 return true;
328 }
329
330 static bool HandleGroupAssistantCommand(ChatHandler* handler, char const* args)
331 {
332 return GroupFlagCommand(handler, args, MEMBER_FLAG_ASSISTANT, "Assistant");
333 }
334
335 static bool HandleGroupMainTankCommand(ChatHandler* handler, char const* args)
336 {
337 return GroupFlagCommand(handler, args, MEMBER_FLAG_MAINTANK, "Main Tank");
338 }
339
340 static bool HandleGroupMainAssistCommand(ChatHandler* handler, char const* args)
341 {
342 return GroupFlagCommand(handler, args, MEMBER_FLAG_MAINASSIST, "Main Assist");
343 }
344
345 static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
346 {
347 Player* player = nullptr;
348 Group* group = nullptr;
349 ObjectGuid guid;
350 char* nameStr = strtok((char*)args, " ");
351
352 if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
353 return false;
354
355 if (!group)
356 {
357 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
358 handler->SetSentErrorMessage(true);
359 return false;
360 }
361
362 group->Disband();
363 return true;
364 }
365
366 static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
367 {
368 Player* player = nullptr;
369 Group* group = nullptr;
370 ObjectGuid guid;
371 char* nameStr = strtok((char*)args, " ");
372
373 if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
374 return false;
375
376 if (!group)
377 {
378 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
379 handler->SetSentErrorMessage(true);
380 return false;
381 }
382
383 group->RemoveMember(guid);
384 return true;
385 }
386
387 static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
388 {
389 if (!*args)
390 return false;
391
392 Player* playerSource = nullptr;
393 Player* playerTarget = nullptr;
394 Group* groupSource = nullptr;
395 Group* groupTarget = nullptr;
396 ObjectGuid guidSource;
397 ObjectGuid guidTarget;
398 char* nameplgrStr = strtok((char*)args, " ");
399 char* nameplStr = strtok(nullptr, " ");
400
401 if (!handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
402 return false;
403
404 if (!groupSource)
405 {
406 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
407 handler->SetSentErrorMessage(true);
408 return false;
409 }
410
411 if (!handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
412 return false;
413
414 if (groupTarget || playerTarget->GetGroup() == groupSource)
415 {
416 handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
417 handler->SetSentErrorMessage(true);
418 return false;
419 }
420
421 if (groupSource->IsFull())
422 {
424 handler->SetSentErrorMessage(true);
425 return false;
426 }
427
428 groupSource->AddMember(playerTarget);
429 groupSource->BroadcastGroupUpdate();
430 handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
431 return true;
432 }
433
434 static bool HandleGroupListCommand(ChatHandler* handler, PlayerIdentifier const& target)
435 {
436 char const* zoneName = "<ERROR>";
437 char const* onlineState = "Offline";
438
439 // Next, we need a group. So we define a group variable.
440 Group* groupTarget = nullptr;
441
442 // We try to extract a group from an online player.
443 if (target.IsConnected())
444 groupTarget = target.GetConnectedPlayer()->GetGroup();
445 else
446 {
447 // If not, we extract it from the SQL.
449 stmt->setUInt64(0, target.GetGUID().GetCounter());
450 PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
451 if (resultGroup)
452 groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
453 }
454
455 // If both fails, players simply has no party. Return false.
456 if (!groupTarget)
457 {
458 handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, target.GetName().c_str());
459 handler->SetSentErrorMessage(true);
460 return false;
461 }
462
463 // We get the group members after successfully detecting a group.
464 Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
465
466 // To avoid a cluster fuck, namely trying multiple queries to simply get a group member count...
467 handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"), std::to_string(members.size()).c_str());
468 // ... we simply move the group type and member count print after retrieving the slots and simply output it's size.
469
470 // While rather dirty codestyle-wise, it saves space (if only a little). For each member, we look several informations up.
471 for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
472 {
473 // Define temporary variable slot to iterator.
474 Group::MemberSlot const& slot = *itr;
475
476 // Check for given flag and assign it to that iterator
477 std::string flags;
478 if (slot.flags & MEMBER_FLAG_ASSISTANT)
479 flags = "Assistant";
480
481 if (slot.flags & MEMBER_FLAG_MAINTANK)
482 {
483 if (!flags.empty())
484 flags.append(", ");
485 flags.append("MainTank");
486 }
487
488 if (slot.flags & MEMBER_FLAG_MAINASSIST)
489 {
490 if (!flags.empty())
491 flags.append(", ");
492 flags.append("MainAssist");
493 }
494
495 if (flags.empty())
496 flags = "None";
497
498 // Check if iterator is online. If is...
499 Player* p = ObjectAccessor::FindPlayer((*itr).guid);
500 std::string phases;
501 if (p)
502 {
503 // ... than, it prints information like "is online", where he is, etc...
504 onlineState = "online";
505 LocaleConstant locale = handler->GetSessionDbcLocale();
507
508 AreaTableEntry const* area = sAreaTableStore.LookupEntry(p->GetAreaId());
509 if (area && area->GetFlags().HasFlag(AreaFlags::IsSubzone))
510 {
511 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID);
512 if (zone)
513 zoneName = zone->AreaName[locale];
514 }
515 }
516
517 // Now we can print those informations for every single member of each group!
518 handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
519 zoneName, phases.c_str(), slot.guid.ToString().c_str(), flags.c_str(),
520 lfg::GetRolesString(slot.roles).c_str());
521 }
522
523 // And finish after every iterator is done.
524 return true;
525 }
526};
527
529{
531}
@ CHAR_SEL_GROUP_MEMBER
LocaleConstant
Definition: Common.h:48
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
uint8_t uint8
Definition: Define.h:144
int16_t int16
Definition: Define.h:139
uint16 flags
Definition: DisableMgr.cpp:49
#define sGroupMgr
Definition: GroupMgr.h:61
GroupMemberFlags
Definition: Group.h:75
@ MEMBER_FLAG_ASSISTANT
Definition: Group.h:76
@ MEMBER_FLAG_MAINASSIST
Definition: Group.h:78
@ MEMBER_FLAG_MAINTANK
Definition: Group.h:77
@ LANG_SUMMONING
Definition: Language.h:142
@ LANG_NOT_IN_GROUP
Definition: Language.h:151
@ LANG_IS_TELEPORTED
Definition: Language.h:136
@ LANG_GROUP_PLAYER_JOINED
Definition: Language.h:919
@ LANG_CANNOT_SUMMON_INST_INST
Definition: Language.h:141
@ LANG_GROUP_NOT_IN_GROUP
Definition: Language.h:920
@ LANG_GROUP_FULL
Definition: Language.h:921
@ LANG_GROUP_PLAYER_NAME_GUID
Definition: Language.h:923
@ LANG_LEADER_CANNOT_BE_ASSISTANT
Definition: Language.h:960
@ LANG_GROUP_NOT_IN_RAID_GROUP
Definition: Language.h:958
@ LANG_SUMMONED_BY
Definition: Language.h:143
@ LANG_GROUP_ALREADY_IN_GROUP
Definition: Language.h:918
@ LANG_YOURS_LEVEL_UP
Definition: Language.h:638
@ LANG_GROUP_TYPE
Definition: Language.h:922
@ LANG_GROUP_ROLE_CHANGED
Definition: Language.h:959
@ LANG_YOURS_LEVEL_DOWN
Definition: Language.h:639
@ LANG_PARTIAL_GROUP_SUMMON
Definition: Language.h:231
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
@ TELE_TO_NONE
Definition: Player.h:801
Role Based Access Control related classes definition.
WorldSession * GetSession()
Definition: Chat.h:42
virtual LocaleConstant GetSessionDbcLocale() const
Definition: Chat.cpp:592
virtual std::string GetNameLink() const
Definition: Chat.cpp:58
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
bool HasLowerSecurity(Player *target, ObjectGuid guid, bool strong=false)
Definition: Chat.cpp:63
void SetSentErrorMessage(bool val)
Definition: Chat.h:114
bool GetPlayerGroupAndGUIDByName(const char *cname, Player *&player, Group *&group, ObjectGuid &guid, bool offline=false)
Definition: Chat.cpp:643
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:113
virtual bool needReportToTarget(Player *chr) const
Definition: Chat.cpp:586
bool extractPlayerTarget(char *args, Player **player, ObjectGuid *player_guid=nullptr, std::string *player_name=nullptr)
Definition: Chat.cpp:489
GroupReference * next()
Definition: Group.h:197
MemberSlotList const & GetMemberSlots() const
Definition: Group.h:324
void BroadcastGroupUpdate(void)
Definition: Group.cpp:1411
void Disband(bool hideDestroy=false)
Definition: Group.cpp:733
std::list< MemberSlot > MemberSlotList
Definition: Group.h:210
bool AddMember(Player *player)
Definition: Group.cpp:426
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:1700
void SendUpdate()
Definition: Group.cpp:834
void SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags flag)
Definition: Group.cpp:1760
void ChangeLeader(ObjectGuid guid)
Definition: Group.cpp:688
bool RemoveMember(ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Group.cpp:570
GroupReference * GetFirstMember()
Definition: Group.h:325
bool IsFull() const
Definition: Group.cpp:1628
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:1658
uint8 GetMemberFlags(ObjectGuid guid) const
Definition: Group.cpp:1713
bool isRaidGroup() const
Definition: Group.cpp:1638
Definition: Map.h:189
bool Instanceable() const
Definition: Map.cpp:3233
uint32 GetId() const
Definition: Map.cpp:3228
uint32 GetInstanceId() const
Definition: Map.h:314
LowType GetCounter() const
Definition: ObjectGuid.h:293
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
std::string ToString() const
Definition: ObjectGuid.cpp:554
static std::string FormatPhases(PhaseShift const &phaseShift)
void InitTalentForLevel()
Definition: Player.cpp:2370
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
Definition: Player.cpp:1250
void SpawnCorpseBones(bool triggerSave=true)
Definition: Player.cpp:4598
void DurabilityRepairAll(bool takeCost, float discountMod, bool guildBank)
Definition: Player.cpp:4718
WorldSession * GetSession() const
Definition: Player.h:2101
void SaveRecallPosition()
Definition: Player.h:2491
void FinishTaxiFlight()
Definition: Player.cpp:22706
void SetXP(uint32 xp)
Definition: Player.cpp:2197
void SaveToDB(bool create=false)
Definition: Player.cpp:19978
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
bool IsBeingTeleported() const
Definition: Player.h:2219
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition: Player.cpp:4408
void setUInt64(const uint8 index, const uint64 value)
float GetCombatReach() const override
Definition: Unit.h:694
bool IsInFlight() const
Definition: Unit.h:1012
void SetLevel(uint8 lvl, bool sendUpdate=true)
Definition: Unit.cpp:9329
uint8 GetLevel() const
Definition: Unit.h:746
constexpr uint32 GetMapId() const
Definition: Position.h:201
Map * GetMap() const
Definition: Object.h:624
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
Definition: Object.cpp:3403
PhaseShift & GetPhaseShift()
Definition: Object.h:523
uint32 GetInstanceId() const
Definition: Object.h:521
std::string const & GetName() const
Definition: Object.h:555
uint32 GetAreaId() const
Definition: Object.h:546
Player * GetPlayer() const
bool HasPermission(uint32 permissionId)
static bool GroupFlagCommand(ChatHandler *handler, char const *args, GroupMemberFlags flag, char const *what)
Definition: cs_group.cpp:286
static bool HandleGroupRemoveCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:366
static bool HandleGroupDisbandCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:345
static bool HandleGroupMainTankCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:335
static bool HandleGroupAssistantCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:330
static bool HandleGroupRepairCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:146
static bool HandleGroupLeaderCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:260
static bool HandleGroupReviveCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:121
static bool HandleGroupListCommand(ChatHandler *handler, PlayerIdentifier const &target)
Definition: cs_group.cpp:434
static bool HandleGroupJoinCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:387
static bool HandleGroupMainAssistCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:340
static bool HandleGroupSummonCommand(ChatHandler *handler, char const *args)
Definition: cs_group.cpp:169
std::vector< ChatCommand > GetCommands() const override
Definition: cs_group.cpp:47
static bool HandleGroupLevelCommand(ChatHandler *handler, Optional< PlayerIdentifier > player, int16 level)
Definition: cs_group.cpp:78
void AddSC_group_commandscript()
Definition: cs_group.cpp:528
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
std::string GetRolesString(uint8 roles)
Definition: LFG.cpp:41
@ RBAC_PERM_COMMAND_GROUP_DISBAND
Definition: RBAC.h:346
@ RBAC_PERM_COMMAND_GROUP
Definition: RBAC.h:344
@ RBAC_PERM_COMMAND_GROUP_SUMMON
Definition: RBAC.h:350
@ RBAC_PERM_COMMAND_GROUP_LIST
Definition: RBAC.h:349
@ RBAC_PERM_COMMAND_GROUP_REMOVE
Definition: RBAC.h:347
@ RBAC_PERM_COMMAND_GROUP_LEADER
Definition: RBAC.h:345
@ RBAC_PERM_COMMAND_GROUP_MAINTANK
Definition: RBAC.h:733
@ RBAC_PERM_COMMAND_CHARACTER_LEVEL
Definition: RBAC.h:197
@ RBAC_PERM_COMMAND_REPAIRITEMS
Definition: RBAC.h:393
@ RBAC_PERM_COMMAND_GROUP_MAINASSIST
Definition: RBAC.h:734
@ RBAC_PERM_COMMAND_GROUP_ASSISTANT
Definition: RBAC.h:732
@ RBAC_PERM_COMMAND_GROUP_JOIN
Definition: RBAC.h:348
@ RBAC_PERM_COMMAND_REVIVE
Definition: RBAC.h:395
@ RBAC_PERM_COMMAND_GROUP_SET
Definition: RBAC.h:731
@ RBAC_PERM_RESURRECT_WITH_FULL_HPS
Definition: RBAC.h:91
uint16 ParentAreaID
Definition: DB2Structure.h:131
EnumFlag< AreaFlags > GetFlags() const
Definition: DB2Structure.h:153
LocalizedString AreaName
Definition: DB2Structure.h:129
ObjectGuid guid
Definition: Group.h:201
std::string name
Definition: Group.h:202
constexpr float GetOrientation() const
Definition: Position.h:79
std::string const & GetName() const