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