feat(Core/Scripting): Implement OnBattlefieldBeforeInvitePlayerToWar() (#24973)

This commit is contained in:
Andrew
2026-03-02 20:05:43 -03:00
committed by GitHub
parent c880590180
commit 8422ec906f
4 changed files with 25 additions and 4 deletions

View File

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

View File

@@ -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<uint16> enabledHooks) :
ScriptObject(name, BATTLEFIELDHOOK_END)
{

View File

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

View File

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