- 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.
This commit is contained in:
treeston
2017-06-12 17:01:47 +02:00
parent 4e41d3e6bd
commit ac0f76f8c5
9 changed files with 133 additions and 22 deletions

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,6 @@ DELETE FROM `rbac_permissions` WHERE `id` = 855;
INSERT INTO `rbac_permissions` (`id`,`name`) VALUES
(855, 'Command: debug play music');
DELETE FROM `rbac_linked_permissions` WHERE `id` = 855;
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 855;
INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES
(198, 855);

View File

@@ -0,0 +1,10 @@
DELETE FROM `rbac_permissions` WHERE `id` IN (861,862,863,864);
INSERT INTO `rbac_permissions` (`id`,`name`) VALUES
(861, 'Command: group set'),
(862, 'Command: group set assistant'),
(863, 'Command: group set maintank'),
(864, 'Command: group set mainassist');
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` IN (473,861,862,863,864);
INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES
(197,473),(197,861),(197,862),(197,863),(197,864);

View File

@@ -0,0 +1,21 @@
--
DELETE FROM `trinity_string` WHERE `entry` IN (1185,1186);
INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES
(1185, '%s is not in a raid group!'),
(1186, '%s %s has raid role \'%s\'.'),
(1187, 'The raid leader cannot be set as an assistant!');
DELETE FROM `command` WHERE `name` LIKE 'group set%';
INSERT INTO `command` (`name`,`permission`,`help`) VALUES
('group set leader', 473, "Syntax: .group set leader [$characterName]
Sets the given character (or selected) as his group's leader. Alias for '.group leader'."),
('group set assistant', 862, "Syntax: .group set assistant [$characterName]
Toggles the given character's assistant state in his raid group."),
('group set maintank', 863, "Syntax: .group set maintank [$characterName]
Toggles the given character's main tank flag in his raid group."),
('group set mainassist', 864, "Syntax: .group set mainassist [$characterName]
Toggles the given character's main assist flag in his raid group.");

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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,

View File

@@ -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)