diff options
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 8 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Groups/Group.h | 6 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 5 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_group.cpp | 92 |
5 files changed, 98 insertions, 22 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 564ceafbf53..a63f4c66a3e 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -766,10 +766,10 @@ enum RBACPermissions RBAC_PERM_COMMAND_GOBJECT_SPAWNGROUP = 858, // reserved for dynamic_spawning RBAC_PERM_COMMAND_GOBJECT_DESPAWNGROUP = 859, // reserved for dynamic_spawning RBAC_PERM_COMMAND_LIST_RESPAWNS = 860, // reserved for dynamic_spawning - RBAC_PERM_COMMAND_GROUP_SET = 861, // reserved - RBAC_PERM_COMMAND_GROUP_ASSISTANT = 862, // reserved - RBAC_PERM_COMMAND_GROUP_MAINTANK = 863, // reserved - RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864, // reserved + RBAC_PERM_COMMAND_GROUP_SET = 861, + RBAC_PERM_COMMAND_GROUP_ASSISTANT = 862, + RBAC_PERM_COMMAND_GROUP_MAINTANK = 863, + RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864, RBAC_PERM_COMMAND_NPC_SHOWLOOT = 865, // reserved RBAC_PERM_COMMAND_LIST_SPAWNPOINTS = 866, // reserved RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING_LOCALE = 867, // reserved diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 24f8a2ac541..bf6a23692fe 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -2501,12 +2501,12 @@ ObjectGuid Group::GetMemberGUID(const std::string& name) return ObjectGuid::Empty; } -bool Group::IsAssistant(ObjectGuid guid) const +uint8 Group::GetMemberFlags(ObjectGuid guid) const { member_citerator mslot = _getMemberCSlot(guid); if (mslot == m_memberSlots.end()) - return false; - return mslot->flags & MEMBER_FLAG_ASSISTANT; + return 0u; + return mslot->flags; } bool Group::SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const @@ -2560,7 +2560,8 @@ void Group::SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags fla return; // Do flag specific actions, e.g ensure uniqueness - switch (flag) { + switch (flag) + { case MEMBER_FLAG_MAINASSIST: RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINASSIST); // Remove main assist flag from current if any. break; diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index b5a6d4dd75e..14ad431f96c 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -310,7 +310,11 @@ class TC_GAME_API Group bool IsMember(ObjectGuid guid) const; bool IsLeader(ObjectGuid guid) const; ObjectGuid GetMemberGUID(const std::string& name); - bool IsAssistant(ObjectGuid guid) const; + uint8 GetMemberFlags(ObjectGuid guid) const; + bool IsAssistant(ObjectGuid guid) const + { + return (GetMemberFlags(guid) & MEMBER_FLAG_ASSISTANT) == MEMBER_FLAG_ASSISTANT; + } Player* GetInvited(ObjectGuid guid) const; Player* GetInvited(const std::string& name) const; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index e6491388c61..4893d46c5d3 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -928,7 +928,10 @@ enum TrinityStrings LANG_DISALLOW_TICKETS_CONFIG = 1190, LANG_BAN_EXISTS = 1191, LANG_CHANGEACCOUNT_SUCCESS = 1192, - // Room for more level 3 1193-1198 not used + LANG_GROUP_NOT_IN_RAID_GROUP = 1193, + LANG_GROUP_ROLE_CHANGED = 1194, + LANG_LEADER_CANNOT_BE_ASSISTANT = 1195, + // Room for more level 3 1196-1198 not used // Debug commands LANG_DEBUG_AREATRIGGER_LEFT = 1999, diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 99d4c003479..e821b68a3a5 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -39,8 +39,17 @@ public: std::vector<ChatCommand> GetCommands() const override { + static std::vector<ChatCommand> groupSetCommandTable = + { + { "leader", rbac::RBAC_PERM_COMMAND_GROUP_LEADER, false, &HandleGroupLeaderCommand, "" }, + { "assistant", rbac::RBAC_PERM_COMMAND_GROUP_ASSISTANT, false, &HandleGroupAssistantCommand, "" }, + { "maintank", rbac::RBAC_PERM_COMMAND_GROUP_MAINTANK, false, &HandleGroupMainTankCommand, "" }, + { "mainassist", rbac::RBAC_PERM_COMMAND_GROUP_MAINASSIST, false, &HandleGroupMainAssistCommand, "" }, + }; + static std::vector<ChatCommand> groupCommandTable = { + { "set", rbac::RBAC_PERM_COMMAND_GROUP_SET, false, nullptr, "", groupSetCommandTable }, { "leader", rbac::RBAC_PERM_COMMAND_GROUP_LEADER, false, &HandleGroupLeaderCommand, "" }, { "disband", rbac::RBAC_PERM_COMMAND_GROUP_DISBAND, false, &HandleGroupDisbandCommand, "" }, { "remove", rbac::RBAC_PERM_COMMAND_GROUP_REMOVE, false, &HandleGroupRemoveCommand, "" }, @@ -51,7 +60,7 @@ public: static std::vector<ChatCommand> commandTable = { - { "group", rbac::RBAC_PERM_COMMAND_GROUP, false, NULL, "", groupCommandTable }, + { "group", rbac::RBAC_PERM_COMMAND_GROUP, false, nullptr, "", groupCommandTable }, }; return commandTable; } @@ -154,8 +163,8 @@ public: static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args) { - Player* player = NULL; - Group* group = NULL; + Player* player = nullptr; + Group* group = nullptr; ObjectGuid guid; char* nameStr = strtok((char*)args, " "); @@ -178,10 +187,69 @@ public: return true; } + static bool GroupFlagCommand(ChatHandler* handler, char const* args, GroupMemberFlags flag, const char* what) + { + Player* player = nullptr; + Group* group = nullptr; + ObjectGuid guid; + char* nameStr = strtok((char*)args, " "); + + if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid)) + return false; + + if (!group) + { + handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + if (!group->isRaidGroup()) + { + handler->PSendSysMessage(LANG_GROUP_NOT_IN_RAID_GROUP, player->GetName().c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + if (flag == MEMBER_FLAG_ASSISTANT && group->IsLeader(guid)) + { + handler->PSendSysMessage(LANG_LEADER_CANNOT_BE_ASSISTANT, player->GetName().c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + if (group->GetMemberFlags(guid) & flag) + { + group->SetGroupMemberFlag(guid, false, flag); + handler->PSendSysMessage(LANG_GROUP_ROLE_CHANGED, player->GetName().c_str(), "no longer", what); + } + else + { + group->SetGroupMemberFlag(guid, true, flag); + handler->PSendSysMessage(LANG_GROUP_ROLE_CHANGED, player->GetName().c_str(), "now", what); + } + return true; + } + + static bool HandleGroupAssistantCommand(ChatHandler* handler, char const* args) + { + return GroupFlagCommand(handler, args, MEMBER_FLAG_ASSISTANT, "Assistant"); + } + + static bool HandleGroupMainTankCommand(ChatHandler* handler, char const* args) + { + return GroupFlagCommand(handler, args, MEMBER_FLAG_MAINTANK, "Main Tank"); + } + + static bool HandleGroupMainAssistCommand(ChatHandler* handler, char const* args) + { + return GroupFlagCommand(handler, args, MEMBER_FLAG_MAINASSIST, "Main Assist"); + } + static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args) { - Player* player = NULL; - Group* group = NULL; + Player* player = nullptr; + Group* group = nullptr; ObjectGuid guid; char* nameStr = strtok((char*)args, " "); @@ -201,8 +269,8 @@ public: static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args) { - Player* player = NULL; - Group* group = NULL; + Player* player = nullptr; + Group* group = nullptr; ObjectGuid guid; char* nameStr = strtok((char*)args, " "); @@ -225,10 +293,10 @@ public: if (!*args) return false; - Player* playerSource = NULL; - Player* playerTarget = NULL; - Group* groupSource = NULL; - Group* groupTarget = NULL; + Player* playerSource = nullptr; + Player* playerTarget = nullptr; + Group* groupSource = nullptr; + Group* groupTarget = nullptr; ObjectGuid guidSource; ObjectGuid guidTarget; char* nameplgrStr = strtok((char*)args, " "); @@ -290,7 +358,7 @@ public: return false; // Next, we need a group. So we define a group variable. - Group* groupTarget = NULL; + Group* groupTarget = nullptr; // We try to extract a group from an online player. if (playerTarget) |