Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 63 additions & 2 deletions src/CFBG_SC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,12 @@ class CFBG_Player : public PlayerScript
// and do not need to be handled here.
Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId());
if (bf && bf->GetTypeId() == BATTLEFIELD_WG && !bf->IsWarTime())
{
auto trace = bf->Trace("CFBG_Player::OnPlayerLogout::ClearFakePlayer");
trace.ArgPlayer(player);

sCFBG->ClearFakePlayer(player);
}
}

// Fires after Player::UpdateZone has finished all Battlefield/OutdoorPvP/WorldState
Expand Down Expand Up @@ -230,6 +235,11 @@ class CFBG_Player : public PlayerScript
if (!bf || bf->GetTypeId() != BATTLEFIELD_WG)
return;

{
auto trace = bf->Trace("CFBG_Player::OnPlayerResurrect::ReapplyFakePlayer");
trace.ArgPlayer(player);
}

sCFBG->ReapplyFakePlayer(player);
}

Expand Down Expand Up @@ -269,17 +279,38 @@ class CFBG_Battlefield : public BattlefieldScript

void OnBattlefieldPlayerJoinWar(Battlefield* bf, Player* player) override
{
{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::Begin");
trace.ArgPlayer(player);
trace.Arg("fake", sCFBG->IsPlayerFake(player));
}

if (!sCFBG->IsEnableSystem() || !sCFBG->IsEnableWGSystem())
{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::ReturnDisabled");
trace.ArgPlayer(player);
return;
}

if (bf->GetTypeId() != BATTLEFIELD_WG)
{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::ReturnNotWintergrasp");
trace.Arg("battlefieldType", bf->GetTypeId());
trace.ArgPlayer(player);
return;
}

if (sCFBG->IsPlayerFake(player))
{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::ReturnAlreadyFake");
trace.ArgPlayer(player);
return;
}

TeamId realTeam = player->GetTeamId(true);
TeamId assignedTeam = realTeam;
uint32 allianceCount = 0;
uint32 hordeCount = 0;

// Reuse the team locked earlier this war so rejoining keeps the same
// side instead of re-rolling the balance.
Expand All @@ -296,8 +327,8 @@ class CFBG_Battlefield : public BattlefieldScript
// parallel bucket we used to maintain and removes the divergence path
// where AddOrSetPlayerToCorrectBfGroup rejects the join after the
// hook has already mutated module state.
uint32 allianceCount = static_cast<uint32>(bf->GetPlayersInWarSet(TEAM_ALLIANCE).size());
uint32 hordeCount = static_cast<uint32>(bf->GetPlayersInWarSet(TEAM_HORDE).size());
allianceCount = static_cast<uint32>(bf->GetPlayersInWarSet(TEAM_ALLIANCE).size());
hordeCount = static_cast<uint32>(bf->GetPlayersInWarSet(TEAM_HORDE).size());

if (realTeam == TEAM_ALLIANCE && allianceCount > hordeCount)
assignedTeam = TEAM_HORDE;
Expand All @@ -308,8 +339,25 @@ class CFBG_Battlefield : public BattlefieldScript
sCFBG->SetWGWarAssignment(player->GetGUID(), assignedTeam);
}

{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::Assign");
trace.ArgPlayer(player);
trace.Arg("teamLockEnabled", sCFBG->IsEnableWGTeamLock());
trace.Arg("locked", locked.has_value());
trace.Arg("allianceCount", allianceCount);
trace.Arg("hordeCount", hordeCount);
trace.Arg("realTeam", uint32(realTeam));
trace.Arg("assignedTeam", uint32(assignedTeam));
}

if (assignedTeam != realTeam)
sCFBG->SetFakeRaceAndMorphForBF(player, assignedTeam);

{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldPlayerJoinWar::End");
trace.ArgPlayer(player);
trace.Arg("fake", sCFBG->IsPlayerFake(player));
}
}

void OnBattlefieldPlayerKill(Battlefield* bf, Player* killer, Player* victim) override
Expand Down Expand Up @@ -356,6 +404,8 @@ class CFBG_Battlefield : public BattlefieldScript
if (bf->GetTypeId() != BATTLEFIELD_WG)
return;

uint32 clearedFakePlayers = 0;

// Hook fires before OnBattleEnd clears PlayersInWar, so each side's
// war set still reflects who was actively fighting. ClearFakePlayer
// is a no-op for unfaked players, so iterating GUIDs that may or may
Expand All @@ -364,7 +414,18 @@ class CFBG_Battlefield : public BattlefieldScript
for (ObjectGuid const& guid : bf->GetPlayersInWarSet(static_cast<TeamId>(team)))
if (Player* player = ObjectAccessor::FindPlayer(guid))
if (sCFBG->IsPlayerFake(player))
{
sCFBG->ClearFakePlayer(player);
++clearedFakePlayers;
}

{
auto trace = bf->Trace("CFBG_Battlefield::OnBattlefieldWarEnd");
trace.Arg("allianceCount", uint32(bf->GetPlayersInWarSet(TEAM_ALLIANCE).size()));
trace.Arg("hordeCount", uint32(bf->GetPlayersInWarSet(TEAM_HORDE).size()));
trace.Arg("clearedFakePlayers", clearedFakePlayers);
trace.Arg("teamLockEnabled", sCFBG->IsEnableWGTeamLock());
}

// Lock is per-war: drop assignments so the next war re-balances.
sCFBG->ClearWGWarAssignments();
Expand Down