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