diff options
author | treeston <treeston.mmoc@gmail.com> | 2017-06-12 17:01:47 +0200 |
---|---|---|
committer | treeston <treeston.mmoc@gmail.com> | 2017-06-12 17:01:47 +0200 |
commit | ac0f76f8c57bba195b773a6a31ade2e8e2318aeb (patch) | |
tree | 57b875bb1b89f478ca3812b320cf194711e032cd /src | |
parent | 4e41d3e6bd90047e2f9e228b6f3adc52012d7b08 (diff) |
- Add new commands .group set assistant, .group set maintank and .group set mainassist to toggle raid member flags.
- Fix 2017_05_29_00_auth.sql to be reapply safe.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 4 | ||||
-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, 18 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index c6c367fb9b3..4ff5032e60b 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -765,6 +765,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, + RBAC_PERM_COMMAND_GROUP_ASSISTANT = 862, + RBAC_PERM_COMMAND_GROUP_MAINTANK = 863, + RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index d931343b5e2..dffe6250444 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -2347,12 +2347,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 @@ -2407,7 +2407,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 cd8c50a8efd..53ef13e501a 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -225,7 +225,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 ea86658e771..eb518ea19b7 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -988,7 +988,10 @@ enum TrinityStrings LANG_GUILD_INFO_MOTD = 1182, LANG_GUILD_INFO_EXTRA_INFO = 1183, LANG_CHANGEACCOUNT_SUCCESS = 1184, // log - // Room for more level 3 1185-1198 not used + LANG_GROUP_NOT_IN_RAID_GROUP = 1185, + LANG_GROUP_ROLE_CHANGED = 1186, + LANG_LEADER_CANNOT_BE_ASSISTANT = 1187, + // Room for more level 3 1188-1198 not used // Debug commands LANG_DO_NOT_USE_6X_DEBUG_AREATRIGGER_LEFT = 1999, diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 7a194b686da..49bb13f4786 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -31,8 +31,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, "" }, @@ -43,7 +52,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; } @@ -146,8 +155,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, " "); @@ -170,10 +179,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, " "); @@ -193,8 +261,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, " "); @@ -217,10 +285,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, " "); @@ -283,7 +351,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) |