From 7c933794e6f9956413ef6023cdce1dd31220bd28 Mon Sep 17 00:00:00 2001 From: luis Date: Wed, 27 May 2026 08:46:34 -0300 Subject: [PATCH] Core/RBAC: Add permission that prevents getting a battleground deserter debuff. --- sql/updates/auth/master/2024_01_06_00_auth.sql | 7 +++++++ src/server/game/Accounts/RBAC.h | 1 + src/server/game/Entities/Player/Player.cpp | 16 ++++++++++------ 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 sql/updates/auth/master/2024_01_06_00_auth.sql diff --git a/sql/updates/auth/master/2024_01_06_00_auth.sql b/sql/updates/auth/master/2024_01_06_00_auth.sql new file mode 100644 index 000000000..188513853 --- /dev/null +++ b/sql/updates/auth/master/2024_01_06_00_auth.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `rbac_permissions` WHERE `id` = 52; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (52, "No battleground deserter debuff"); + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 52; +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(193, 52); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index ef6ddb039..14de992dc 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -102,6 +102,7 @@ enum RBACPermissions RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49, RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50, RBAC_PERM_ALLOW_TWO_SIDE_TRADE = 51, + RBAC_PERM_NO_BATTLEGROUND_DESERTER_DEBUFF = 52, // Free space for core permissions (till 149) // Roles (Permissions with delegated permissions) use 199 and descending diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 64bc245ed..37e996f66 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25306,14 +25306,18 @@ Team Player::GetBGTeam() const return m_bgData.bgTeam ? m_bgData.bgTeam : GetTeam(); } -void Player::LeaveBattleground(bool teleportToEntryPoint) +void Player::LeaveBattleground(bool teleportToEntryPoint /*= true*/) { - if (Battleground* bg = GetBattleground()) - { - bg->RemovePlayerAtLeave(GetGUID(), teleportToEntryPoint, true); + Battleground* bg = GetBattleground(); + if (!bg) + return; - // call after remove to be sure that player resurrected for correct cast - if (bg->isBattleground() && !IsGameMaster() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_CAST_DESERTER)) + bg->RemovePlayerAtLeave(GetGUID(), teleportToEntryPoint, true); + + // call after remove to be sure that player resurrected for correct cast + if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_CAST_DESERTER)) + { + if (!GetSession()->HasPermission(rbac::RBAC_PERM_NO_BATTLEGROUND_DESERTER_DEBUFF)) { if (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN) {