From 8422ec906f691bf75112af72ad2efa16c6b95295 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 2 Mar 2026 20:05:43 -0300 Subject: [PATCH] feat(Core/Scripting): Implement OnBattlefieldBeforeInvitePlayerToWar() (#24973) --- src/server/game/Battlefield/Battlefield.cpp | 2 ++ .../ScriptDefines/BattlefieldScript.cpp | 5 +++++ .../ScriptDefines/BattlefieldScript.h | 21 +++++++++++++++---- src/server/game/Scripting/ScriptMgr.h | 1 + 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 708e8462a..ace179e8f 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -312,6 +312,8 @@ void Battlefield::InvitePlayerToWar(Player* player) if (m_PlayersInWar[player->GetTeamId()].count(player->GetGUID()) || m_InvitedPlayers[player->GetTeamId()].count(player->GetGUID())) return; + sScriptMgr->OnBattlefieldBeforeInvitePlayerToWar(this, player); + m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID()); m_InvitedPlayers[player->GetTeamId()][player->GetGUID()] = GameTime::GetGameTime().count() + m_TimeForAcceptInvite; player->GetSession()->SendBfInvitePlayerToWar(m_BattleId, m_ZoneId, m_TimeForAcceptInvite); diff --git a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp index 106f02d23..d614f1a8d 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp @@ -39,6 +39,11 @@ void ScriptMgr::OnBattlefieldPlayerLeaveWar(Battlefield* bf, Player* player) CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, script->OnBattlefieldPlayerLeaveWar(bf, player)); } +void ScriptMgr::OnBattlefieldBeforeInvitePlayerToWar(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_BEFORE_INVITE_PLAYER_TO_WAR, script->OnBattlefieldBeforeInvitePlayerToWar(bf, player)); +} + BattlefieldScript::BattlefieldScript(char const* name, std::vector enabledHooks) : ScriptObject(name, BATTLEFIELDHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h index 5f96741f7..f2a4e19d9 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h +++ b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h @@ -23,10 +23,11 @@ enum BattlefieldHook { - BATTLEFIELDHOOK_ON_PLAYER_ENTER_ZONE, // 0 - fires at start of HandlePlayerEnterZone, before team assignment - BATTLEFIELDHOOK_ON_PLAYER_LEAVE_ZONE, // 1 - fires at end of HandlePlayerLeaveZone, after all cleanup - BATTLEFIELDHOOK_ON_PLAYER_JOIN_WAR, // 2 - fires after player is added to the active war - BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, // 3 - fires after player is removed from the active war + BATTLEFIELDHOOK_ON_PLAYER_ENTER_ZONE, // 0 - fires at start of HandlePlayerEnterZone, before team assignment + BATTLEFIELDHOOK_ON_PLAYER_LEAVE_ZONE, // 1 - fires at end of HandlePlayerLeaveZone, after all cleanup + BATTLEFIELDHOOK_ON_PLAYER_JOIN_WAR, // 2 - fires after player is added to the active war + BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, // 3 - fires after player is removed from the active war + BATTLEFIELDHOOK_BEFORE_INVITE_PLAYER_TO_WAR, // 4 - fires in InvitePlayerToWar before InvitedPlayers insert BATTLEFIELDHOOK_END }; @@ -74,6 +75,18 @@ public: * @param player The player leaving the war */ virtual void OnBattlefieldPlayerLeaveWar(Battlefield* /*bf*/, Player* /*player*/) { } + + /** + * @brief Called inside InvitePlayerToWar after the WillBeKick entry is erased + * (using the player's current team) and before the player is inserted into + * m_InvitedPlayers. This is the correct place to reassign a player's effective + * team for pre-war zone players: the invite bucket write that follows will use + * the newly assigned team, keeping all subsequent core operations consistent. + * + * @param bf The Battlefield instance + * @param player The player being invited to war + */ + virtual void OnBattlefieldBeforeInvitePlayerToWar(Battlefield* /*bf*/, Player* /*player*/) { } }; #endif // SCRIPT_OBJECT_BATTLEFIELD_SCRIPT_H_ diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index d0540acb1..7024e52d5 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -583,6 +583,7 @@ public: /* BattlefieldScript */ void OnBattlefieldPlayerLeaveZone(Battlefield* bf, Player* player); void OnBattlefieldPlayerJoinWar(Battlefield* bf, Player* player); void OnBattlefieldPlayerLeaveWar(Battlefield* bf, Player* player); + void OnBattlefieldBeforeInvitePlayerToWar(Battlefield* bf, Player* player); public: /* BGScript */ void OnBattlegroundStart(Battleground* bg);