From b0e914ac45252ae75b5c8c244d0f7aa8247b21ef Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:08:23 +0200 Subject: [PATCH] =?UTF-8?q?feat(Core/Commands):=20add=20.group=20invites?= =?UTF-8?q?=20command=20to=20toggle=20accepting=20g=E2=80=A6=20(#26370)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Skjalf <47818697+Nyeriah@users.noreply.github.com> --- .../rev_1782631139396176100.sql | 7 +++++++ .../rev_1782631139396176100.sql | 10 ++++++++++ src/server/game/Accounts/RBAC.h | 1 + src/server/game/Entities/Player/Player.h | 3 +++ src/server/game/Handlers/GroupHandler.cpp | 7 +++++++ src/server/game/Miscellaneous/Language.h | 7 ++++++- src/server/scripts/Commands/cs_group.cpp | 18 +++++++++++++++++- 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_auth/rev_1782631139396176100.sql create mode 100644 data/sql/updates/pending_db_world/rev_1782631139396176100.sql diff --git a/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql b/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql new file mode 100644 index 000000000..0afd17a40 --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql @@ -0,0 +1,7 @@ +DELETE FROM `rbac_permissions` WHERE `id` = 940; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(940, 'Command: group invites'); + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 940; +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(197, 940); diff --git a/data/sql/updates/pending_db_world/rev_1782631139396176100.sql b/data/sql/updates/pending_db_world/rev_1782631139396176100.sql new file mode 100644 index 000000000..49bec6f72 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1782631139396176100.sql @@ -0,0 +1,10 @@ +DELETE FROM `command` WHERE `name`='group invites'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('group invites', 2, 'Syntax: .group invites on|off\r\nEnable/disable accepting group invites.'); + +-- acore_string entries for .groupinvites command. +DELETE FROM `acore_string` WHERE `entry` IN (35462, 35463, 35464); +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(35462, 'Accepting Group Invites: {}'), +(35463, 'Accepting Group Invites: ON'), +(35464, 'Accepting Group Invites: OFF'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index aecb77882..ec4b71654 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -701,6 +701,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_SPELLINFO_TARGETS = 937, RBAC_PERM_COMMAND_SPELLINFO_ALL = 938, RBAC_PERM_COMMAND_SERVER_SET_SECURITY = 939, + RBAC_PERM_COMMAND_GROUP_INVITES = 940, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8e30a419c..bfd7491bb 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -577,6 +577,7 @@ enum PlayerExtraFlags PLAYER_EXTRA_PVP_DEATH = 0x0100, // store PvP death status until corpse creating. PLAYER_EXTRA_SHOW_DK_PET = 0x0400, // Marks if player should see ghoul on login screen PLAYER_EXTRA_GM_SPECTATOR = 0x0800, + PLAYER_EXTRA_DECLINE_GROUP_INVITES = 0x1000, // Set when the player opted out of receiving group invites }; // 2^n values @@ -1171,6 +1172,8 @@ public: void SetBeastMaster(bool on) { if (on) SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); else RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; } + [[nodiscard]] bool IsAcceptGroupInvites() const { return !(m_ExtraFlags & PLAYER_EXTRA_DECLINE_GROUP_INVITES); } + void SetAcceptGroupInvites(bool on) { if (on) m_ExtraFlags &= ~PLAYER_EXTRA_DECLINE_GROUP_INVITES; else m_ExtraFlags |= PLAYER_EXTRA_DECLINE_GROUP_INVITES; } [[nodiscard]] bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; } [[nodiscard]] bool CanBeGameMaster() const; void SetGameMaster(bool on); diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 3f0884ebe..d0bd34262 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -108,6 +108,13 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) return; } + // target has opted out of receiving group invites + if (!invitedPlayer->IsAcceptGroupInvites()) + { + SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S); + return; + } + // can't group with if (!invitingPlayer->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && invitingPlayer->GetTeamId() != invitedPlayer->GetTeamId()) { diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index e645954fb..26330f93e 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1532,7 +1532,12 @@ enum AcoreStrings LANG_COMMAND_NPC_SHOWLOOT_MONEY = 35458, LANG_COMMAND_NPC_SHOWLOOT_ITEMS = 35459, LANG_COMMAND_NPC_SHOWLOOT_ENTRY = 35460, - LANG_COMMAND_NPC_SHOWLOOT_QUEST = 35461 + LANG_COMMAND_NPC_SHOWLOOT_QUEST = 35461, + + // Group invites toggle command + LANG_COMMAND_GROUP_INVITES_ACCEPTING = 35462, + LANG_COMMAND_GROUP_INVITES_ON = 35463, + LANG_COMMAND_GROUP_INVITES_OFF = 35464 }; #endif diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 83b4e001a..188f16542 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -38,7 +38,8 @@ public: { "remove", HandleGroupRemoveCommand, rbac::RBAC_PERM_COMMAND_GROUP_REMOVE, Console::No }, { "disband", HandleGroupDisbandCommand, rbac::RBAC_PERM_COMMAND_GROUP_DISBAND, Console::No }, { "revive", HandleGroupReviveCommand, rbac::RBAC_PERM_COMMAND_GROUP_REVIVE, Console::No }, - { "leader", HandleGroupLeaderCommand, rbac::RBAC_PERM_COMMAND_GROUP_LEADER, Console::No } + { "leader", HandleGroupLeaderCommand, rbac::RBAC_PERM_COMMAND_GROUP_LEADER, Console::No }, + { "invites", HandleGroupInvitesCommand, rbac::RBAC_PERM_COMMAND_GROUP_INVITES, Console::No } }; static ChatCommandTable commandTable = @@ -292,6 +293,21 @@ public: return true; } + + // Enable/disable accepting group invites + static bool HandleGroupInvitesCommand(ChatHandler* handler, Optional args) + { + Player* player = handler->GetSession()->GetPlayer(); + if (!args) + { + handler->PSendSysMessage(LANG_COMMAND_GROUP_INVITES_ACCEPTING, player->IsAcceptGroupInvites() ? handler->GetAcoreString(LANG_ON) : handler->GetAcoreString(LANG_OFF)); + return true; + } + + player->SetAcceptGroupInvites(*args); + handler->SendSysMessage(*args ? LANG_COMMAND_GROUP_INVITES_ON : LANG_COMMAND_GROUP_INVITES_OFF); + return true; + } }; void AddSC_group_commandscript()