/* * This file is part of the AzerothCore 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 Affero General Public License as published by the * Free Software Foundation; either version 3 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 Affero 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 . */ #include "Chat.h" #include "CommandScript.h" #include "GroupMgr.h" #include "Language.h" #include "Player.h" using namespace Acore::ChatCommands; class group_commandscript : public CommandScript { public: group_commandscript() : CommandScript("group_commandscript") { } ChatCommandTable GetCommands() const override { static ChatCommandTable groupCommandTable = { { "list", HandleGroupListCommand, SEC_GAMEMASTER, Console::Yes }, { "join", HandleGroupJoinCommand, SEC_GAMEMASTER, Console::No }, { "remove", HandleGroupRemoveCommand, SEC_GAMEMASTER, Console::No }, { "disband", HandleGroupDisbandCommand, SEC_GAMEMASTER, Console::No }, { "revive", HandleGroupReviveCommand, SEC_GAMEMASTER, Console::No }, { "leader", HandleGroupLeaderCommand, SEC_GAMEMASTER, Console::No } }; static ChatCommandTable commandTable = { { "group", groupCommandTable } }; return commandTable; } static bool HandleGroupLeaderCommand(ChatHandler* handler, Optional target) { if (!target) { target = PlayerIdentifier::FromTargetOrSelf(handler); } if (!target) { return false; } Player* player = nullptr; Group* group = nullptr; ObjectGuid guid; if (handler->GetPlayerGroupAndGUIDByName(target->GetName().c_str(), player, group, guid)) { if (group && group->GetLeaderGUID() != guid) { group->ChangeLeader(guid); group->SendUpdate(); } } return true; } static bool HandleGroupDisbandCommand(ChatHandler* handler, Optional target) { if (!target) { target = PlayerIdentifier::FromTargetOrSelf(handler); } if (!target || !target->IsConnected()) { return false; } Player* player = nullptr; Group* group = nullptr; ObjectGuid guid; if (handler->GetPlayerGroupAndGUIDByName(target->GetName().c_str(), player, group, guid)) { if (group) { group->Disband(); } } return true; } static bool HandleGroupRemoveCommand(ChatHandler* handler, Optional target) { if (!target) { target = PlayerIdentifier::FromTargetOrSelf(handler); } if (!target || !target->IsConnected()) { return false; } Player* player = nullptr; Group* group = nullptr; ObjectGuid guid; if (handler->GetPlayerGroupAndGUIDByName(target->GetName().c_str(), player, group, guid, true)) { if (group) { group->RemoveMember(guid); } } return true; } static bool HandleGroupJoinCommand(ChatHandler* handler, std::string const& playerInGroup, std::string const& playerName) { if (playerInGroup.empty() || playerName.empty()) { return false; } Player* playerSource = nullptr; Group* groupSource = nullptr; ObjectGuid guidSource; ObjectGuid guidTarget; if (handler->GetPlayerGroupAndGUIDByName(playerInGroup.c_str(), playerSource, groupSource, guidSource, true)) { if (groupSource) { Group* groupTarget = nullptr; Player* playerTarget = nullptr; if (handler->GetPlayerGroupAndGUIDByName(playerName.c_str(), playerTarget, groupTarget, guidTarget, true)) { if (!groupTarget && playerTarget->GetGroup() != groupSource) { if (!groupSource->IsFull()) { groupSource->AddMember(playerTarget); groupSource->BroadcastGroupUpdate(); handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName(), playerSource->GetName()); return true; } else { // group is full handler->PSendSysMessage(LANG_GROUP_FULL); return true; } } else { // group is full or target player already in a group handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName()); return true; } } } else { // specified source player is not in a group handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName()); return true; } } return true; } static bool HandleGroupListCommand(ChatHandler* handler, Optional target) { if (!target) { target = PlayerIdentifier::FromTargetOrSelf(handler); } if (!target) { return false; } Group* groupTarget = nullptr; if (target->IsConnected()) { groupTarget = target->GetConnectedPlayer()->GetGroup(); } if (!groupTarget) { if (ObjectGuid groupGUID = sCharacterCache->GetCharacterGroupGuidByGuid(target->GetGUID())) { groupTarget = sGroupMgr->GetGroupByGUID(groupGUID.GetCounter()); } } if (!groupTarget) { handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, target->GetName()); return true; } handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "Raid" : "Party"), groupTarget->GetMembersCount()); for (auto const& slot : groupTarget->GetMemberSlots()) { std::string flags; if (slot.flags & MEMBER_FLAG_ASSISTANT) { flags = "Assistant"; } if (slot.flags & MEMBER_FLAG_MAINTANK) { if (!flags.empty()) { flags.append(", "); } flags.append("MainTank"); } if (slot.flags & MEMBER_FLAG_MAINASSIST) { if (!flags.empty()) { flags.append(", "); } flags.append("MainAssist"); } if (flags.empty()) { flags = "None"; } } return true; } static bool HandleGroupReviveCommand(ChatHandler* handler, Optional target) { if (!target) target = PlayerIdentifier::FromTargetOrSelf(handler); if (!target) return false; Player* targetPlayer = target->GetConnectedPlayer(); Group* group = targetPlayer->GetGroup(); std::string nameLink = handler->playerLink(target->GetName()); if (!group) { handler->SendErrorMessage(LANG_NOT_IN_GROUP, nameLink); return false; } for (GroupReference* it = group->GetFirstMember(); it != nullptr; it = it->next()) { Player* target = it->GetSource(); if (target) { target->RemoveAurasDueToSpell(27827); // Spirit of Redemption target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f); target->SpawnCorpseBones(); target->SaveToDB(false, false); } } return true; } }; void AddSC_group_commandscript() { new group_commandscript(); }