aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Battlefield/BattlefieldWG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/Battlefield/BattlefieldWG.cpp')
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.cpp143
1 files changed, 66 insertions, 77 deletions
diff --git a/src/server/scripts/Battlefield/BattlefieldWG.cpp b/src/server/scripts/Battlefield/BattlefieldWG.cpp
index ba7c3e4ca51..deff3280c15 100644
--- a/src/server/scripts/Battlefield/BattlefieldWG.cpp
+++ b/src/server/scripts/Battlefield/BattlefieldWG.cpp
@@ -38,6 +38,7 @@
#include "TemporarySummon.h"
#include "World.h"
#include "WorldSession.h"
+#include "WorldStateMgr.h"
#include "WorldStatePackets.h"
struct BfWGCoordGY
@@ -444,15 +445,16 @@ bool BattlefieldWG::SetupBattlefield()
SetGraveyardNumber(BATTLEFIELD_WG_GRAVEYARD_MAX);
// Load from db
- if ((sWorld->getWorldState(WS_BATTLEFIELD_WG_ACTIVE) == 0) && (sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER) == 0)
- && (sWorld->getWorldState(ClockWorldState[0]) == 0))
+ if (sWorld->getWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE) == 0
+ && sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER) == 0
+ && sWorld->getWorldState(ClockWorldState[0]) == 0)
{
- sWorld->setWorldState(WS_BATTLEFIELD_WG_ACTIVE, uint64(false));
- sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, uint64(urand(0, 1)));
- sWorld->setWorldState(ClockWorldState[0], uint64(m_NoWarBattleTime));
+ sWorld->setWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0);
+ sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, urand(0, 1));
+ sWorld->setWorldState(ClockWorldState[0], m_NoWarBattleTime);
}
- m_isActive = sWorld->getWorldState(WS_BATTLEFIELD_WG_ACTIVE) != 0;
+ m_isActive = sWorld->getWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE) == 0;
m_DefenderTeam = TeamId(sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER));
m_Timer = sWorld->getWorldState(ClockWorldState[0]);
@@ -462,10 +464,20 @@ bool BattlefieldWG::SetupBattlefield()
m_Timer = m_RestartAfterCrash;
}
- SetData(BATTLEFIELD_WG_DATA_WON_A, uint32(sWorld->getWorldState(WS_BATTLEFIELD_WG_ATTACKED_A)));
- SetData(BATTLEFIELD_WG_DATA_DEF_A, uint32(sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDED_A)));
- SetData(BATTLEFIELD_WG_DATA_WON_H, uint32(sWorld->getWorldState(WS_BATTLEFIELD_WG_ATTACKED_H)));
- SetData(BATTLEFIELD_WG_DATA_DEF_H, uint32(sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDED_H)));
+ auto loadSavedWorldState = [&](int32 id)
+ {
+ sWorldStateMgr->SetValue(id, sWorld->getWorldState(id), m_Map);
+ };
+
+ loadSavedWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE);
+ loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDER);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_ATTACKER, GetAttackerTeam(), m_Map);
+ sWorldStateMgr->SetValue(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, m_Map);
+ sWorldStateMgr->SetValue(ClockWorldState[1], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, m_Map);
+ loadSavedWorldState(WS_BATTLEFIELD_WG_ATTACKED_A);
+ loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDED_A);
+ loadSavedWorldState(WS_BATTLEFIELD_WG_ATTACKED_H);
+ loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDED_H);
for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
{
@@ -547,13 +559,18 @@ bool BattlefieldWG::Update(uint32 diff)
bool m_return = Battlefield::Update(diff);
if (m_saveTimer <= diff)
{
- sWorld->setWorldState(WS_BATTLEFIELD_WG_ACTIVE, m_isActive);
+ auto saveWorldState = [&](int32 id)
+ {
+ sWorld->setWorldState(id, sWorldStateMgr->GetValue(id, m_Map));
+ };
+
+ sWorld->setWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, !m_isActive);
sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, m_DefenderTeam);
sWorld->setWorldState(ClockWorldState[0], m_Timer);
- sWorld->setWorldState(WS_BATTLEFIELD_WG_ATTACKED_A, GetData(BATTLEFIELD_WG_DATA_WON_A));
- sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDED_A, GetData(BATTLEFIELD_WG_DATA_DEF_A));
- sWorld->setWorldState(WS_BATTLEFIELD_WG_ATTACKED_H, GetData(BATTLEFIELD_WG_DATA_WON_H));
- sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDED_H, GetData(BATTLEFIELD_WG_DATA_DEF_H));
+ saveWorldState(WS_BATTLEFIELD_WG_ATTACKED_A);
+ saveWorldState(WS_BATTLEFIELD_WG_DEFENDED_A);
+ saveWorldState(WS_BATTLEFIELD_WG_ATTACKED_H);
+ saveWorldState(WS_BATTLEFIELD_WG_DEFENDED_H);
m_saveTimer = 60 * IN_MILLISECONDS;
}
else
@@ -576,6 +593,12 @@ void BattlefieldWG::OnBattleStart()
else
TC_LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_ATTACKER, GetAttackerTeam(), m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_BATTLE_END, 1, m_Map);
+ sWorldStateMgr->SetValue(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, m_Map);
+
// Update tower visibility and update faction
for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
{
@@ -659,12 +682,22 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer)
building->RebuildGate();
}
- // successful defense
- if (endByTimer)
- UpdateData(GetDefenderTeam() == TEAM_HORDE ? BATTLEFIELD_WG_DATA_DEF_H : BATTLEFIELD_WG_DATA_DEF_A, 1);
- // successful attack (note that teams have already been swapped, so defender team is the one who won)
- else
- UpdateData(GetDefenderTeam() == TEAM_HORDE ? BATTLEFIELD_WG_DATA_WON_H : BATTLEFIELD_WG_DATA_WON_A, 1);
+ // update win statistics
+ {
+ int32 worldStateId;
+ // successful defense
+ if (endByTimer)
+ worldStateId = GetDefenderTeam() == TEAM_HORDE ? WS_BATTLEFIELD_WG_DEFENDED_H : WS_BATTLEFIELD_WG_DEFENDED_A;
+ // successful attack (note that teams have already been swapped, so defender team is the one who won)
+ else
+ worldStateId = GetDefenderTeam() == TEAM_HORDE ? WS_BATTLEFIELD_WG_ATTACKED_H : WS_BATTLEFIELD_WG_ATTACKED_A;
+
+ sWorldStateMgr->SetValue(worldStateId, sWorldStateMgr->GetValue(worldStateId, m_Map) + 1, m_Map);
+ }
+
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 1, m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_BATTLE_END, 0, m_Map);
+ sWorldStateMgr->SetValue(ClockWorldState[1], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, m_Map);
// Remove turret
for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
@@ -1149,42 +1182,6 @@ uint32 BattlefieldWG::GetData(uint32 data) const
return Battlefield::GetData(data);
}
-void BattlefieldWG::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)
-{
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_DEFENDED_A, GetData(BATTLEFIELD_WG_DATA_DEF_A));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_DEFENDED_H, GetData(BATTLEFIELD_WG_DATA_DEF_H));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_ATTACKED_A, GetData(BATTLEFIELD_WG_DATA_WON_A));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_ATTACKED_H, GetData(BATTLEFIELD_WG_DATA_WON_H));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_ATTACKER, GetAttackerTeam());
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam());
-
- // Note: cleanup these two, their names look awkward
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_ACTIVE, IsWarTime() ? 0 : 1);
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_SHOW_WORLDSTATE, IsWarTime() ? 1 : 0);
-
- for (uint32 itr = 0; itr < 2; ++itr)
- packet.Worldstates.emplace_back(ClockWorldState[itr], int32(GameTime::GetGameTime()) + int32(m_Timer) / int32(1000));
-
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_MAX_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
- packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_MAX_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A));
-
- for (BfWGGameObjectBuilding* building : BuildingsInZone)
- building->FillInitialWorldStates(packet);
-
- for (WintergraspWorkshop* workshop : Workshops)
- workshop->FillInitialWorldStates(packet);
-}
-
-void BattlefieldWG::SendInitWorldStatesToAll()
-{
- for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
- for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
- if (Player* player = ObjectAccessor::FindPlayer(*itr))
- SendInitWorldStatesTo(player);
-}
-
void BattlefieldWG::BrokenWallOrTower(TeamId team, BfWGGameObjectBuilding* building)
{
if (team == GetDefenderTeam())
@@ -1231,7 +1228,8 @@ void BattlefieldWG::UpdatedDestroyedTowerCount(TeamId team)
m_Timer = 0;
else
m_Timer -= 600000;
- SendInitWorldStatesToAll();
+
+ sWorldStateMgr->SetValue(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, m_Map);
}
}
else // Keep tower
@@ -1289,10 +1287,10 @@ void BattlefieldWG::UpdateDamagedTowerCount(TeamId team)
// Update vehicle count WorldState to player
void BattlefieldWG::UpdateVehicleCountWG()
{
- SendUpdateWorldState(WS_BATTLEFIELD_WG_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
- SendUpdateWorldState(WS_BATTLEFIELD_WG_MAX_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H));
- SendUpdateWorldState(WS_BATTLEFIELD_WG_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
- SendUpdateWorldState(WS_BATTLEFIELD_WG_MAX_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A));
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_VEHICLE_H), m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_MAX_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H), m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_VEHICLE_A), m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_MAX_VEHICLE_A, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A), m_Map);
}
void BattlefieldWG::UpdateTenacity()
@@ -1428,7 +1426,7 @@ void BfWGGameObjectBuilding::Rebuild()
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT - (_teamControl * 3));
- _wg->SendUpdateWorldState(_worldState, _state);
+ sWorldStateMgr->SetValue(_worldState, _state, _wg->GetMap());
}
UpdateCreatureAndGo();
build->SetFaction(WintergraspFaction[_teamControl]);
@@ -1451,7 +1449,7 @@ void BfWGGameObjectBuilding::Damaged()
{
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DAMAGE - (_teamControl * 3));
- _wg->SendUpdateWorldState(_worldState, _state);
+ sWorldStateMgr->SetValue(_worldState, _state, _wg->GetMap());
// Send warning message
if (_staticTowerInfo)
@@ -1475,7 +1473,7 @@ void BfWGGameObjectBuilding::Destroyed()
{
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DESTROY - (_teamControl * 3));
- _wg->SendUpdateWorldState(_worldState, _state);
+ sWorldStateMgr->SetValue(_worldState, _state, _wg->GetMap());
// Warn players
if (_staticTowerInfo)
@@ -1530,6 +1528,7 @@ void BfWGGameObjectBuilding::Init(GameObject* go)
}
_state = WintergraspGameObjectState(sWorld->getWorldState(_worldState));
+ sWorldStateMgr->SetValue(_worldState, _state, _wg->GetMap());
switch (_state)
{
case BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT:
@@ -1747,11 +1746,6 @@ void BfWGGameObjectBuilding::UpdateTurretAttack(bool disable)
}
}
-void BfWGGameObjectBuilding::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)
-{
- packet.Worldstates.emplace_back(_worldState, _state);
-}
-
void BfWGGameObjectBuilding::Save()
{
sWorld->setWorldState(_worldState, _state);
@@ -1787,7 +1781,7 @@ void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
{
// Updating worldstate
_state = BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT;
- _wg->SendUpdateWorldState(_staticInfo->WorldStateId, _state);
+ sWorldStateMgr->SetValue(_staticInfo->WorldStateId, _state, _wg->GetMap());
// Warning message
if (!init)
@@ -1805,7 +1799,7 @@ void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
{
// Update worldstate
_state = BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT;
- _wg->SendUpdateWorldState(_staticInfo->WorldStateId, _state);
+ sWorldStateMgr->SetValue(_staticInfo->WorldStateId, _state, _wg->GetMap());
// Warning message
if (!init)
@@ -1832,11 +1826,6 @@ void WintergraspWorkshop::UpdateGraveyardAndWorkshop()
GiveControlTo(_wg->GetDefenderTeam(), true);
}
-void WintergraspWorkshop::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)
-{
- packet.Worldstates.emplace_back(_staticInfo->WorldStateId, _state);
-}
-
void WintergraspWorkshop::Save()
{
sWorld->setWorldState(_staticInfo->WorldStateId, _state);