AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
WorldState Class Reference

#include "WorldState.h"

Public Member Functions

 WorldState ()
 
virtual ~WorldState ()
 
void Load ()
 
void LoadWorldStates ()
 
void setWorldState (uint32 index, uint64 value)
 
uint64 getWorldState (uint32 index) const
 
void Save (WorldStateSaveIds saveId)
 
void SaveHelper (std::string &stringToSave, WorldStateSaveIds saveId)
 
void HandlePlayerEnterZone (Player *player, AreaTableIDs zoneId)
 
void HandlePlayerLeaveZone (Player *player, AreaTableIDs zoneId)
 
bool IsConditionFulfilled (uint32 conditionId, uint32 state=WORLD_STATE_CONDITION_STATE_NONE) const
 
void HandleConditionStateChange (WorldStateCondition conditionId, WorldStateConditionState state)
 
void HandleExternalEvent (WorldStateEvent eventId, uint32 param)
 
void Update (uint32 diff)
 
void AddSunwellGateProgress (uint32 questId)
 
void AddSunsReachProgress (uint32 questId)
 
std::string GetSunsReachPrintout ()
 
void FillInitialWorldStates (WorldPackets::WorldState::InitWorldStates &packet, uint32 zoneId, uint32)
 
void HandleSunsReachPhaseTransition (uint32 newPhase)
 
void HandleSunsReachSubPhaseTransition (int32 subPhaseMask, bool initial=false)
 
void SetSunsReachCounter (SunsReachCounters index, uint32 value)
 
void HandleSunwellGateTransition (uint32 newGate)
 
void SetSunwellGateCounter (SunwellGateCounters index, uint32 value)
 
void SetScourgeInvasionState (SIState state)
 
void StartScourgeInvasion (bool sendMail)
 
void StopScourgeInvasion ()
 
uint32 GetSIRemaining (SIRemaining remaining) const
 
uint32 GetSIRemainingByZone (uint32 zoneId) const
 
void SetSIRemaining (SIRemaining remaining, uint32 value)
 
TimePoint GetSITimer (SITimers timer)
 
void SetSITimer (SITimers timer, TimePoint timePoint)
 
uint32 GetBattlesWon ()
 
void AddBattlesWon (int32 count)
 
uint32 GetLastAttackZone ()
 
void SetLastAttackZone (uint32 zoneId)
 
void BroadcastSIWorldstates ()
 
void HandleDefendedZones ()
 
std::string GetScourgeInvasionPrintout ()
 
void StartZoneEvent (SIZoneIds eventId)
 
void StartNewInvasionIfTime (uint32 attackTimeVar, uint32 zoneId)
 
void StartNewCityAttackIfTime (uint32 attackTimeVar, uint32 zoneId)
 
void StartNewInvasion (uint32 zoneId)
 
void StartNewCityAttack (uint32 zoneId)
 
bool ResumeInvasion (ScourgeInvasionData::InvasionZone &zone)
 
bool SummonMouth (Map *map, ScourgeInvasionData::InvasionZone &zone, Position position, bool newInvasion)
 
bool SummonPallid (Map *map, ScourgeInvasionData::CityAttack &zone, const Position &position, uint32 spawnLoc)
 
void HandleActiveZone (uint32 attackTimeVar, uint32 zoneId, uint32 remainingVar, TimePoint now)
 
MapGetMap (uint32 mapId, Position const &invZone)
 
bool IsActiveZone (uint32 zoneId)
 
uint32 GetActiveZones ()
 
uint32 GetTimerIdForZone (uint32 zoneId)
 
void SetPallidGuid (uint32 zoneId, ObjectGuid guid)
 
void SetMouthGuid (uint32 zoneId, ObjectGuid guid)
 
void AddPendingInvasion (uint32 zoneId)
 
void RemovePendingInvasion (uint32 zoneId)
 
void AddPendingPallid (uint32 zoneId)
 
void RemovePendingPallid (uint32 zoneId)
 
void OnEnable (ScourgeInvasionData::InvasionZone &zone)
 
void OnDisable (ScourgeInvasionData::InvasionZone &zone)
 
void OnDisable (ScourgeInvasionData::CityAttack &zone)
 

Static Public Member Functions

static WorldStateinstance ()
 

Private Types

typedef std::map< uint32, uint64WorldStatesMap
 

Private Member Functions

void SendWorldstateUpdate (std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
 
void StopSunsReachPhase (bool forward)
 
void StartSunsReachPhase (bool initial=false)
 
void StartSunwellGatePhase ()
 
void StopSunwellGatePhase ()
 
void BuffAdalsSongOfBattle ()
 
void DispelAdalsSongOfBattle ()
 
void BuffMagtheridonTeam (TeamId team)
 
void DispelMagtheridonTeam (TeamId team)
 
void SendScourgeInvasionMail ()
 

Private Attributes

WorldStatesMap _worldstates
 
uint32 _adalSongOfBattleTimer
 
bool _isMagtheridonHeadSpawnedHorde
 
bool _isMagtheridonHeadSpawnedAlliance
 
SunsReachReclamationData m_sunsReachData
 
std::map< uint32, std::atomic< WorldStateConditionState > > _transportStates
 
std::mutex _mutex
 
ScourgeInvasionData m_siData
 

Detailed Description

Member Typedef Documentation

◆ WorldStatesMap

typedef std::map<uint32, uint64> WorldState::WorldStatesMap
private

Constructor & Destructor Documentation

◆ WorldState()

WorldState::WorldState ( )
39{
43}
@ WORLD_STATE_CONDITION_STATE_NONE
Definition WorldState.h:38
@ WORLD_STATE_CONDITION_THE_THUNDERCALLER
Definition WorldState.h:31
@ WORLD_STATE_CONDITION_THE_IRON_EAGLE
Definition WorldState.h:32
@ WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS
Definition WorldState.h:33
std::map< uint32, std::atomic< WorldStateConditionState > > _transportStates
Definition WorldState.h:326
bool _isMagtheridonHeadSpawnedAlliance
Definition WorldState.h:324
bool _isMagtheridonHeadSpawnedHorde
Definition WorldState.h:323

References _transportStates, WORLD_STATE_CONDITION_STATE_NONE, WORLD_STATE_CONDITION_THE_IRON_EAGLE, WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS, and WORLD_STATE_CONDITION_THE_THUNDERCALLER.

◆ ~WorldState()

WorldState::~WorldState ( )
virtual
46{
47}

Member Function Documentation

◆ AddBattlesWon()

void WorldState::AddBattlesWon ( int32  count)
1505{
1506 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1507 m_siData.m_battlesWon += count;
1510}
@ SAVE_ID_SCOURGE_INVASION
Definition WorldState.h:60
ScourgeInvasionData m_siData
Definition WorldState.h:374
void Save(WorldStateSaveIds saveId)
Definition WorldState.cpp:188
void HandleDefendedZones()
Definition WorldState.cpp:1568
std::mutex m_siMutex
Definition WorldState.h:202
uint32 m_battlesWon
Definition WorldState.h:198

References HandleDefendedZones(), ScourgeInvasionData::m_battlesWon, m_siData, ScourgeInvasionData::m_siMutex, Save(), and SAVE_ID_SCOURGE_INVASION.

◆ AddPendingInvasion()

void WorldState::AddPendingInvasion ( uint32  zoneId)
1852{
1853 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1854 m_siData.m_pendingInvasions.insert(zoneId);
1855}
std::set< uint32 > m_pendingInvasions
Definition WorldState.h:204

References ScourgeInvasionData::m_pendingInvasions, m_siData, and ScourgeInvasionData::m_siMutex.

Referenced by SummonMouth().

◆ AddPendingPallid()

void WorldState::AddPendingPallid ( uint32  zoneId)
1864{
1865 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1866 m_siData.m_pendingPallids.insert(zoneId);
1867}
std::set< uint32 > m_pendingPallids
Definition WorldState.h:205

References ScourgeInvasionData::m_pendingPallids, m_siData, and ScourgeInvasionData::m_siMutex.

Referenced by SummonPallid().

◆ AddSunsReachProgress()

void WorldState::AddSunsReachProgress ( uint32  questId)
568{
569 uint32 counter = 0;
570 int32 otherCounter = -1;
571 int32 worldState = 0;
572 uint32 subPhaseMask = 0;
573 uint32 addedValue = 1;
574 switch (questId)
575 {
577 counter = COUNTER_ERRATIC_BEHAVIOR;
578 otherCounter = COUNTER_SANCTUM_WARDS;
580 break;
582 counter = COUNTER_SANCTUM_WARDS;
583 otherCounter = COUNTER_ERRATIC_BEHAVIOR;
585 break;
590 break;
595 break;
598 subPhaseMask = SUBPHASE_PORTAL;
600 break;
603 otherCounter = COUNTER_TAKING_THE_HARBOR;
605 break;
610 break;
612 counter = COUNTER_MAKING_READY;
613 subPhaseMask = SUBPHASE_ANVIL;
614 worldState = WORLD_STATE_QUEL_DANAS_ANVIL;
615 break;
618 subPhaseMask = SUBPHASE_ALCHEMY_LAB;
620 break;
623 subPhaseMask = SUBPHASE_MONUMENT;
625 break;
628 subPhaseMask = SUBPHASE_MONUMENT;
630 addedValue = 150;
631 break;
632 default:
633 return;
634 }
635
636 uint32 previousValue = 0;
637 uint32 newValue = 0;
638
639 if (!subPhaseMask)
641 else
642 previousValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
643 m_sunsReachData.m_sunsReachReclamationCounters[counter] += addedValue;
644 if (!subPhaseMask)
646 else
647 newValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
648 if (previousValue != newValue)
650
651 bool save = true;
653 uint32 modifier = 1;
654 if (otherCounter != -1)
655 {
656 modifier = 2;
657 counterValue += m_sunsReachData.m_sunsReachReclamationCounters[otherCounter];
658 }
659 if (counterValue >= sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX) * modifier)
660 {
661 save = false;
662 switch (questId)
663 {
666 {
669 break;
670 }
673 {
676 break;
677 }
679 {
682 break;
683 }
686 {
689 break;
690 }
692 {
695 break;
696 }
698 {
701 break;
702 }
705 {
708 break;
709 }
710 }
711 }
712 if (save)
714}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_SUNSREACH_COUNTER_MAX
Definition WorldConfig.h:382
@ WORLD_STATE_QUEL_DANAS_MONUMENT
Definition WorldStateDefines.h:56
@ WORLD_STATE_QUEL_DANAS_HARBOR
Definition WorldStateDefines.h:50
@ WORLD_STATE_QUEL_DANAS_ANVIL
Definition WorldStateDefines.h:55
@ WORLD_STATE_QUEL_DANAS_ALCHEMY_LAB
Definition WorldStateDefines.h:51
@ WORLD_STATE_QUEL_DANAS_SANCTUM
Definition WorldStateDefines.h:53
@ WORLD_STATE_QUEL_DANAS_ARMORY
Definition WorldStateDefines.h:52
@ WORLD_STATE_QUEL_DANAS_PORTAL
Definition WorldStateDefines.h:54
@ QUEST_ERRATIC_BEHAVIOR
Definition WorldState.cpp:553
@ QUEST_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.cpp:557
@ QUEST_SANCTUM_WARDS
Definition WorldState.cpp:554
@ QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.cpp:555
@ QUEST_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.cpp:558
@ QUEST_MAKING_READY
Definition WorldState.cpp:560
@ QUEST_A_MAGNANIMOUS_BENEFACTOR
Definition WorldState.cpp:563
@ QUEST_DISCOVERING_YOUR_ROOTS
Definition WorldState.cpp:561
@ QUEST_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.cpp:556
@ QUEST_TAKING_THE_HARBOR
Definition WorldState.cpp:559
@ QUEST_A_CHARITABLE_DONATION
Definition WorldState.cpp:562
@ SUBPHASE_ALCHEMY_LAB
Definition WorldState.h:227
@ SUBPHASE_ANVIL
Definition WorldState.h:226
@ SUBPHASE_MONUMENT
Definition WorldState.h:228
@ SUBPHASE_PORTAL
Definition WorldState.h:225
@ SUNS_REACH_PHASE_3_ARMORY
Definition WorldState.h:219
@ SUNS_REACH_PHASE_2_SANCTUM
Definition WorldState.h:218
@ SUNS_REACH_PHASE_1_STAGING_AREA
Definition WorldState.h:217
@ SUNS_REACH_PHASE_4_HARBOR
Definition WorldState.h:220
@ COUNTER_ERRATIC_BEHAVIOR
Definition WorldState.h:234
@ COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.h:236
@ COUNTER_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.h:238
@ COUNTER_MAKING_READY
Definition WorldState.h:241
@ COUNTER_TAKING_THE_HARBOR
Definition WorldState.h:240
@ COUNTER_A_CHARITABLE_DONATION
Definition WorldState.h:243
@ COUNTER_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.h:239
@ COUNTER_DISCOVERING_YOUR_ROOTS
Definition WorldState.h:242
@ COUNTER_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.h:237
@ COUNTER_SANCTUM_WARDS
Definition WorldState.h:235
@ SAVE_ID_QUEL_DANAS
Definition WorldState.h:61
void HandleSunsReachPhaseTransition(uint32 newPhase)
Definition WorldState.cpp:716
void SendWorldstateUpdate(std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
Definition WorldState.cpp:543
SunsReachReclamationData m_sunsReachData
Definition WorldState.h:325
void HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool initial=false)
Definition WorldState.cpp:748
#define sWorld
Definition World.h:317
uint32 m_subphaseMask
Definition WorldState.h:265
std::mutex m_sunsReachReclamationMutex
Definition WorldState.h:268
uint32 m_sunsReachReclamationCounters[COUNTERS_MAX]
Definition WorldState.h:266
uint32 GetPhasePercentage(uint32 phase)
Definition WorldState.cpp:1111
uint32 m_phase
Definition WorldState.h:264
GuidVector m_sunsReachReclamationPlayers
Definition WorldState.h:267
uint32 GetSubPhasePercentage(uint32 subPhase)
Definition WorldState.cpp:1122

References CONFIG_SUNSREACH_COUNTER_MAX, COUNTER_A_CHARITABLE_DONATION, COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY, COUNTER_DISCOVERING_YOUR_ROOTS, COUNTER_DISTRACTION_AT_THE_DEAD_SCAR, COUNTER_ERRATIC_BEHAVIOR, COUNTER_INTERCEPT_THE_REINFORCEMENTS, COUNTER_INTERCEPTING_THE_MANA_CELLS, COUNTER_MAKING_READY, COUNTER_SANCTUM_WARDS, COUNTER_TAKING_THE_HARBOR, SunsReachReclamationData::GetPhasePercentage(), SunsReachReclamationData::GetSubPhasePercentage(), HandleSunsReachPhaseTransition(), HandleSunsReachSubPhaseTransition(), SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationCounters, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, QUEST_A_CHARITABLE_DONATION, QUEST_A_MAGNANIMOUS_BENEFACTOR, QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY, QUEST_DISCOVERING_YOUR_ROOTS, QUEST_DISTRACTION_AT_THE_DEAD_SCAR, QUEST_ERRATIC_BEHAVIOR, QUEST_INTERCEPT_THE_REINFORCEMENTS, QUEST_INTERCEPTING_THE_MANA_CELLS, QUEST_MAKING_READY, QUEST_SANCTUM_WARDS, QUEST_TAKING_THE_HARBOR, Save(), SAVE_ID_QUEL_DANAS, SendWorldstateUpdate(), SUBPHASE_ALCHEMY_LAB, SUBPHASE_ANVIL, SUBPHASE_MONUMENT, SUBPHASE_PORTAL, SUNS_REACH_PHASE_1_STAGING_AREA, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, SUNS_REACH_PHASE_4_HARBOR, sWorld, WORLD_STATE_QUEL_DANAS_ALCHEMY_LAB, WORLD_STATE_QUEL_DANAS_ANVIL, WORLD_STATE_QUEL_DANAS_ARMORY, WORLD_STATE_QUEL_DANAS_HARBOR, WORLD_STATE_QUEL_DANAS_MONUMENT, WORLD_STATE_QUEL_DANAS_PORTAL, and WORLD_STATE_QUEL_DANAS_SANCTUM.

◆ AddSunwellGateProgress()

void WorldState::AddSunwellGateProgress ( uint32  questId)
1144{
1145 uint32 counter = 0;
1146 int32 worldState = 0;
1147 uint32 addedValue = 1;
1148 switch (questId)
1149 {
1153 break;
1154 default: return;
1155 }
1156 switch (m_sunsReachData.m_gate)
1157 {
1161 default: return;
1162 }
1164 uint32 newValue = 0;
1165 m_sunsReachData.m_gateCounters[counter] += addedValue;
1167 if (previousValue != newValue)
1169 bool save = true;
1171 {
1172 save = false;
1173 switch (questId)
1174 {
1176 {
1179 break;
1180 }
1182 {
1185 break;
1186 }
1188 {
1191 break;
1192 }
1193 }
1194 }
1195 if (save)
1197}
@ WORLD_STATE_ROHENDOR_THE_SECOND_GATE_HEALTH
Definition WorldStateDefines.h:60
@ WORLD_STATE_ARCHONISUS_THE_FINAL_GATE_HEALTH
Definition WorldStateDefines.h:61
@ WORLD_STATE_AGAMATH_THE_FIRST_GATE_HEALTH
Definition WorldStateDefines.h:59
@ QUEST_AGAMATH_THE_FIRST_GATE
Definition WorldState.cpp:1137
@ QUEST_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.cpp:1139
@ QUEST_ROHENDOR_THE_SECOND_GATE
Definition WorldState.cpp:1138
@ COUNTER_MAX_VAL_REQ_SWP_GATES
Definition WorldState.cpp:1140
@ SUNWELL_ARCHONISUS_GATE3_OPEN
Definition WorldState.h:252
@ SUNWELL_ALL_GATES_CLOSED
Definition WorldState.h:249
@ SUNWELL_AGAMATH_GATE1_OPEN
Definition WorldState.h:250
@ SUNWELL_ROHENDOR_GATE2_OPEN
Definition WorldState.h:251
@ COUNTER_ROHENDOR_THE_SECOND_GATE
Definition WorldState.h:257
@ COUNTER_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.h:258
@ COUNTER_AGAMATH_THE_FIRST_GATE
Definition WorldState.h:256
void HandleSunwellGateTransition(uint32 newGate)
Definition WorldState.cpp:869
uint32 m_gate
Definition WorldState.h:269
uint32 m_gateCounters[COUNTERS_MAX_GATES]
Definition WorldState.h:270
uint32 GetSunwellGatePercentage(uint32 gate)
Definition WorldState.cpp:1228

References COUNTER_AGAMATH_THE_FIRST_GATE, COUNTER_ARCHONISUS_THE_FINAL_GATE, COUNTER_MAX_VAL_REQ_SWP_GATES, COUNTER_ROHENDOR_THE_SECOND_GATE, SunsReachReclamationData::GetSunwellGatePercentage(), HandleSunwellGateTransition(), SunsReachReclamationData::m_gate, SunsReachReclamationData::m_gateCounters, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, QUEST_AGAMATH_THE_FIRST_GATE, QUEST_ARCHONISUS_THE_FINAL_GATE, QUEST_ROHENDOR_THE_SECOND_GATE, Save(), SAVE_ID_QUEL_DANAS, SendWorldstateUpdate(), SUNWELL_AGAMATH_GATE1_OPEN, SUNWELL_ALL_GATES_CLOSED, SUNWELL_ARCHONISUS_GATE3_OPEN, SUNWELL_ROHENDOR_GATE2_OPEN, WORLD_STATE_AGAMATH_THE_FIRST_GATE_HEALTH, WORLD_STATE_ARCHONISUS_THE_FINAL_GATE_HEALTH, and WORLD_STATE_ROHENDOR_THE_SECOND_GATE_HEALTH.

◆ BroadcastSIWorldstates()

void WorldState::BroadcastSIWorldstates ( )
1525{
1526 uint32 victories = GetBattlesWon();
1527
1528 uint32 remainingAzshara = GetSIRemaining(SI_REMAINING_AZSHARA);
1529 uint32 remainingBlastedLands = GetSIRemaining(SI_REMAINING_BLASTED_LANDS);
1530 uint32 remainingBurningSteppes = GetSIRemaining(SI_REMAINING_BURNING_STEPPES);
1531 uint32 remainingEasternPlaguelands = GetSIRemaining(SI_REMAINING_EASTERN_PLAGUELANDS);
1532 uint32 remainingTanaris = GetSIRemaining(SI_REMAINING_TANARIS);
1533 uint32 remainingWinterspring = GetSIRemaining(SI_REMAINING_WINTERSPRING);
1534
1535 sMapMgr->DoForAllMaps([&](Map* map) -> void
1536 {
1537 switch (map->GetId())
1538 {
1539 case MAP_EASTERN_KINGDOMS:
1540 case MAP_KALIMDOR:
1541 map->DoForAllPlayers([&](Player* pl)
1542 {
1543 // do not process players which are not in world
1544 if (!pl->IsInWorld())
1545 return;
1546
1547 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_AZSHARA, remainingAzshara > 0 ? 1 : 0);
1548 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, remainingBlastedLands > 0 ? 1 : 0);
1549 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, remainingBurningSteppes > 0 ? 1 : 0);
1550 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, remainingEasternPlaguelands > 0 ? 1 : 0);
1551 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_TANARIS, remainingTanaris > 0 ? 1 : 0);
1552 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, remainingWinterspring > 0 ? 1 : 0);
1553
1554 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_VICTORIES, victories);
1555 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, remainingAzshara);
1556 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, remainingBlastedLands);
1557 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, remainingBurningSteppes);
1558 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, remainingEasternPlaguelands);
1559 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, remainingTanaris);
1560 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, remainingWinterspring);
1561 });
1562 default:
1563 break;
1564 }
1565 });
1566}
#define sMapMgr
Definition MapMgr.h:220
@ SI_REMAINING_BURNING_STEPPES
Definition WorldState.h:159
@ SI_REMAINING_EASTERN_PLAGUELANDS
Definition WorldState.h:160
@ SI_REMAINING_TANARIS
Definition WorldState.h:161
@ SI_REMAINING_BLASTED_LANDS
Definition WorldState.h:158
@ SI_REMAINING_AZSHARA
Definition WorldState.h:157
@ SI_REMAINING_WINTERSPRING
Definition WorldState.h:162
Definition Map.h:160
uint32 GetId() const
Definition Map.h:226
uint32 GetBattlesWon()
Definition WorldState.cpp:1498
uint32 GetSIRemaining(SIRemaining remaining) const
Definition WorldState.cpp:1458

References GetBattlesWon(), Map::GetId(), GetSIRemaining(), SI_REMAINING_AZSHARA, SI_REMAINING_BLASTED_LANDS, SI_REMAINING_BURNING_STEPPES, SI_REMAINING_EASTERN_PLAGUELANDS, SI_REMAINING_TANARIS, SI_REMAINING_WINTERSPRING, and sMapMgr.

Referenced by StartScourgeInvasion(), StopScourgeInvasion(), and Update().

◆ BuffAdalsSongOfBattle()

void WorldState::BuffAdalsSongOfBattle ( )
private
490{
491 sMapMgr->DoForAllMaps([&](Map* map) -> void
492 {
493 switch (map->GetId())
494 {
495 case MAP_OUTLAND:
496 map->DoForAllPlayers([&](Player* player)
497 {
498 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
499 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
500 });
501 break;
505 map->DoForAllPlayers([&](Player* player)
506 {
507 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
508 });
509 break;
510 default:
511 break;
512 }
513 });
514}
@ MAP_TEMPEST_KEEP_THE_BOTANICA
Definition AreaDefines.h:231
@ MAP_TEMPEST_KEEP_THE_ARCATRAZ
Definition AreaDefines.h:230
@ MAP_TEMPEST_KEEP_THE_MECHANAR
Definition AreaDefines.h:232
@ SPELL_ADAL_SONG_OF_BATTLE
Definition WorldState.h:50
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:2876
Definition Player.h:1072
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194

References Unit::CastSpell(), Map::DoForAllPlayers(), Map::GetId(), MAP_TEMPEST_KEEP_THE_ARCATRAZ, MAP_TEMPEST_KEEP_THE_BOTANICA, MAP_TEMPEST_KEEP_THE_MECHANAR, sMapMgr, and SPELL_ADAL_SONG_OF_BATTLE.

Referenced by HandleExternalEvent().

◆ BuffMagtheridonTeam()

void WorldState::BuffMagtheridonTeam ( TeamId  team)
private
424{
425 sMapMgr->DoForAllMaps([&](Map* map) -> void
426 {
427 switch (map->GetId())
428 {
429 case MAP_OUTLAND:
430 map->DoForAllPlayers([&](Player* player)
431 {
432 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
433 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
434 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
435 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
436 });
437 break;
442 map->DoForAllPlayers([&](Player* player)
443 {
444 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
445 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
446 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
447 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
448 });
449 break;
450 default:
451 break;
452 }
453 });
454}
@ MAP_HELLFIRE_CITADEL_THE_BLOOD_FURNACE
Definition AreaDefines.h:222
@ MAP_HELLFIRE_CITADEL_RAMPARTS
Definition AreaDefines.h:223
@ MAP_HELLFIRE_CITADEL_THE_SHATTERED_HALLS
Definition AreaDefines.h:221
@ MAP_MAGTHERIDONS_LAIR
Definition AreaDefines.h:224
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
@ SPELL_NAZGRELS_FAVOR
Definition WorldState.h:53
@ SPELL_TROLLBANES_COMMAND
Definition WorldState.h:52
TeamId GetTeamId(bool original=false) const
Definition Player.h:2115

References Unit::CastSpell(), Map::DoForAllPlayers(), Map::GetId(), Player::GetTeamId(), MAP_HELLFIRE_CITADEL_RAMPARTS, MAP_HELLFIRE_CITADEL_THE_BLOOD_FURNACE, MAP_HELLFIRE_CITADEL_THE_SHATTERED_HALLS, MAP_MAGTHERIDONS_LAIR, sMapMgr, SPELL_NAZGRELS_FAVOR, SPELL_TROLLBANES_COMMAND, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by HandleExternalEvent().

◆ DispelAdalsSongOfBattle()

void WorldState::DispelAdalsSongOfBattle ( )
private
517{
518 sMapMgr->DoForAllMaps([&](Map* map) -> void
519 {
520 switch (map->GetId())
521 {
522 case MAP_OUTLAND:
523 map->DoForAllPlayers([&](Player* player)
524 {
525 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
526 player->RemoveAurasDueToSpell(SPELL_ADAL_SONG_OF_BATTLE);
527 });
528 break;
532 map->DoForAllPlayers([&](Player* player)
533 {
535 });
536 break;
537 default:
538 break;
539 }
540 });
541}
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4974

References Map::DoForAllPlayers(), Map::GetId(), MAP_TEMPEST_KEEP_THE_ARCATRAZ, MAP_TEMPEST_KEEP_THE_BOTANICA, MAP_TEMPEST_KEEP_THE_MECHANAR, Unit::RemoveAurasDueToSpell(), sMapMgr, and SPELL_ADAL_SONG_OF_BATTLE.

Referenced by Update().

◆ DispelMagtheridonTeam()

void WorldState::DispelMagtheridonTeam ( TeamId  team)
private
457{
458 sMapMgr->DoForAllMaps([&](Map* map) -> void
459 {
460 switch (map->GetId())
461 {
462 case MAP_OUTLAND:
463 map->DoForAllPlayers([&](Player* player)
464 {
465 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
466 player->RemoveAurasDueToSpell(SPELL_TROLLBANES_COMMAND);
467 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
468 player->RemoveAurasDueToSpell(SPELL_NAZGRELS_FAVOR);
469 });
470 break;
475 map->DoForAllPlayers([&](Player* player)
476 {
477 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
479 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
481 });
482 break;
483 default:
484 break;
485 }
486 });
487}

References Map::DoForAllPlayers(), Map::GetId(), Player::GetTeamId(), MAP_HELLFIRE_CITADEL_RAMPARTS, MAP_HELLFIRE_CITADEL_THE_BLOOD_FURNACE, MAP_HELLFIRE_CITADEL_THE_SHATTERED_HALLS, MAP_MAGTHERIDONS_LAIR, Unit::RemoveAurasDueToSpell(), sMapMgr, SPELL_NAZGRELS_FAVOR, SPELL_TROLLBANES_COMMAND, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by HandleExternalEvent().

◆ FillInitialWorldStates()

void WorldState::FillInitialWorldStates ( WorldPackets::WorldState::InitWorldStates packet,
uint32  zoneId,
uint32   
)
1952{
1953 if (m_siData.m_state != STATE_0_DISABLED) // scourge invasion active - need to send all worldstates
1954 {
1955 uint32 victories = GetBattlesWon();
1956
1957 uint32 remainingAzshara = GetSIRemaining(SI_REMAINING_AZSHARA);
1958 uint32 remainingBlastedLands = GetSIRemaining(SI_REMAINING_BLASTED_LANDS);
1959 uint32 remainingBurningSteppes = GetSIRemaining(SI_REMAINING_BURNING_STEPPES);
1960 uint32 remainingEasternPlaguelands = GetSIRemaining(SI_REMAINING_EASTERN_PLAGUELANDS);
1961 uint32 remainingTanaris = GetSIRemaining(SI_REMAINING_TANARIS);
1962 uint32 remainingWinterspring = GetSIRemaining(SI_REMAINING_WINTERSPRING);
1963
1964 packet.Worldstates.reserve(13);
1965 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_AZSHARA, remainingAzshara > 0 ? 1 : 0);
1966 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, remainingBlastedLands > 0 ? 1 : 0);
1967 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, remainingBurningSteppes > 0 ? 1 : 0);
1968 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, remainingEasternPlaguelands > 0 ? 1 : 0);
1969 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_TANARIS, remainingTanaris > 0 ? 1 : 0);
1970 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, remainingWinterspring > 0 ? 1 : 0);
1971 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_VICTORIES, victories);
1972 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, remainingAzshara);
1973 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, remainingBlastedLands);
1974 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, remainingBurningSteppes);
1975 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, remainingEasternPlaguelands);
1976 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, remainingTanaris);
1977 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, remainingWinterspring);
1978 }
1979
1980 switch (zoneId)
1981 {
1986 {
1987 // Sunwell Reclamation
1988 switch (m_sunsReachData.m_phase)
1989 {
1992 break;
1995 break;
1998 break;
2004 break;
2005 }
2011
2012 // Sunwell Gates
2013 switch (m_sunsReachData.m_gate)
2014 {
2017 break;
2020 break;
2023 break;
2024 }
2025 break;
2026 }
2027 default:
2028 break;
2029 }
2030}
@ AREA_ISLE_OF_QUEL_DANAS
Definition AreaDefines.h:139
@ AREA_MAGISTERS_TERRACE
Definition AreaDefines.h:142
@ AREA_SUNWELL_PLATEAU
Definition AreaDefines.h:138
@ AREA_SHATTRATH_CITY
Definition AreaDefines.h:117
@ WORLD_STATE_SCOURGE_INVASION_VICTORIES
Definition WorldStateDefines.h:24
@ WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldStateDefines.h:32
@ WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldStateDefines.h:29
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES
Definition WorldStateDefines.h:37
@ WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldStateDefines.h:30
@ WORLD_STATE_SCOURGE_INVASION_TANARIS
Definition WorldStateDefines.h:31
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING
Definition WorldStateDefines.h:40
@ WORLD_STATE_SCOURGE_INVASION_WINTERSPRING
Definition WorldStateDefines.h:27
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS
Definition WorldStateDefines.h:36
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS
Definition WorldStateDefines.h:39
@ WORLD_STATE_QUEL_DANAS_MUSIC
Definition WorldStateDefines.h:49
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA
Definition WorldStateDefines.h:35
@ WORLD_STATE_SCOURGE_INVASION_AZSHARA
Definition WorldStateDefines.h:28
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS
Definition WorldStateDefines.h:38
@ STATE_0_DISABLED
Definition WorldState.h:125
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
SIState m_state
Definition WorldState.h:195

References AREA_ISLE_OF_QUEL_DANAS, AREA_MAGISTERS_TERRACE, AREA_SHATTRATH_CITY, AREA_SUNWELL_PLATEAU, GetBattlesWon(), SunsReachReclamationData::GetPhasePercentage(), GetSIRemaining(), SunsReachReclamationData::GetSubPhasePercentage(), SunsReachReclamationData::GetSunwellGatePercentage(), SunsReachReclamationData::m_gate, SunsReachReclamationData::m_phase, m_siData, ScourgeInvasionData::m_state, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SI_REMAINING_AZSHARA, SI_REMAINING_BLASTED_LANDS, SI_REMAINING_BURNING_STEPPES, SI_REMAINING_EASTERN_PLAGUELANDS, SI_REMAINING_TANARIS, SI_REMAINING_WINTERSPRING, STATE_0_DISABLED, SUBPHASE_ALCHEMY_LAB, SUBPHASE_ANVIL, SUBPHASE_MONUMENT, SUBPHASE_PORTAL, SUNS_REACH_PHASE_1_STAGING_AREA, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, SUNS_REACH_PHASE_4_HARBOR, SUNWELL_AGAMATH_GATE1_OPEN, SUNWELL_ALL_GATES_CLOSED, SUNWELL_ROHENDOR_GATE2_OPEN, WORLD_STATE_AGAMATH_THE_FIRST_GATE_HEALTH, WORLD_STATE_ARCHONISUS_THE_FINAL_GATE_HEALTH, WORLD_STATE_QUEL_DANAS_ALCHEMY_LAB, WORLD_STATE_QUEL_DANAS_ANVIL, WORLD_STATE_QUEL_DANAS_ARMORY, WORLD_STATE_QUEL_DANAS_HARBOR, WORLD_STATE_QUEL_DANAS_MONUMENT, WORLD_STATE_QUEL_DANAS_MUSIC, WORLD_STATE_QUEL_DANAS_PORTAL, WORLD_STATE_QUEL_DANAS_SANCTUM, WORLD_STATE_ROHENDOR_THE_SECOND_GATE_HEALTH, WORLD_STATE_SCOURGE_INVASION_AZSHARA, WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, WORLD_STATE_SCOURGE_INVASION_TANARIS, WORLD_STATE_SCOURGE_INVASION_VICTORIES, WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, and WorldPackets::WorldState::InitWorldStates::Worldstates.

◆ GetActiveZones()

uint32 WorldState::GetActiveZones ( )
1915{
1916 size_t i = m_siData.m_pendingInvasions.size();
1917 for (auto const& [zoneId, invasionData] : m_siData.m_activeInvasions)
1918 {
1919 Map* map = GetMap(invasionData.map, invasionData.mouth[0]);
1920 if (!map)
1921 {
1922 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetActiveZones no map for zone {}.", invasionData.map);
1923 continue;
1924 }
1925
1926 Creature* mouth = map->GetCreature(invasionData.mouthGuid);
1927 if (mouth)
1928 i++;
1929 }
1930 return i;
1931}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
Definition Creature.h:43
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2364
Map * GetMap(uint32 mapId, Position const &invZone)
Definition WorldState.cpp:252

References Map::GetCreature(), GetMap(), LOG_ERROR, ScourgeInvasionData::m_activeInvasions, ScourgeInvasionData::m_pendingInvasions, and m_siData.

Referenced by HandleActiveZone(), and StartNewInvasion().

◆ GetBattlesWon()

uint32 WorldState::GetBattlesWon ( )
1499{
1500 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1501 return m_siData.m_battlesWon;
1502}

References ScourgeInvasionData::m_battlesWon, m_siData, and ScourgeInvasionData::m_siMutex.

Referenced by BroadcastSIWorldstates(), and FillInitialWorldStates().

◆ GetLastAttackZone()

uint32 WorldState::GetLastAttackZone ( )
1513{
1514 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1516}
uint32 m_lastAttackZone
Definition WorldState.h:199

References ScourgeInvasionData::m_lastAttackZone, m_siData, and ScourgeInvasionData::m_siMutex.

◆ GetMap()

Map * WorldState::GetMap ( uint32  mapId,
Position const &  invZone 
)
253{
254 Map* map = sMapMgr->FindBaseMap(mapId);
255 if (!map)
256 LOG_ERROR("scripts",
257 "ScourgeInvasionEvent::GetMap found no map with mapId {} , x: {}, y: {}.",
258 mapId,
259 invZone.GetPositionX(),
260 invZone.GetPositionY());
261 return map;
262}

References Position::GetPositionX(), Position::GetPositionY(), LOG_ERROR, and sMapMgr.

Referenced by GetActiveZones(), OnDisable(), OnDisable(), ResumeInvasion(), StartNewCityAttack(), and StartNewInvasion().

◆ GetScourgeInvasionPrintout()

std::string WorldState::GetScourgeInvasionPrintout ( )
1040{
1041 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1042 std::string output = "Scourge Invasion Status:\n";
1043
1044 auto formatState = [this]() -> std::string
1045 {
1046 switch (m_siData.m_state)
1047 {
1048 case STATE_0_DISABLED:
1049 return "Disabled";
1050 case STATE_1_ENABLED:
1051 return "Enabled";
1052 default:
1053 return "Unknown";
1054 }
1055 };
1056 auto formatRemaining = [this](SIRemaining val, char const* name) { return " " + std::string(name) + ": " + std::to_string(m_siData.m_remaining[val]) + "\n"; };
1057
1058 output += "State: " + formatState() + " (" + std::to_string(static_cast<uint32>(m_siData.m_state)) + ")\n";
1059 output += "Battles Won: " + std::to_string(m_siData.m_battlesWon) + "\n";
1060 output += "Last Attack Zone ID: " + std::to_string(m_siData.m_lastAttackZone) + "\n";
1061
1062 output += "Zone Necropolis Count Remaining:\n";
1063 output += formatRemaining(SI_REMAINING_WINTERSPRING, "Winterspring");
1064 output += formatRemaining(SI_REMAINING_AZSHARA, "Azshara");
1065 output += formatRemaining(SI_REMAINING_BLASTED_LANDS, "Blasted Lands");
1066 output += formatRemaining(SI_REMAINING_BURNING_STEPPES, "Burning Steppes");
1067 output += formatRemaining(SI_REMAINING_TANARIS, "Tanaris");
1068 output += formatRemaining(SI_REMAINING_EASTERN_PLAGUELANDS, "Eastern Plaguelands");
1069
1070 output += "Zone Timers (time until next event):\n";
1071 TimePoint now = std::chrono::steady_clock::now();
1072 auto formatTimer = [this](SITimers timerId, char const* name, TimePoint now)
1073 {
1074 TimePoint tp = m_siData.m_timers[timerId];
1075 std::string timerStr;
1076 if (tp == TimePoint())
1077 timerStr = "Not set";
1078 else if (tp <= now)
1079 timerStr = "Elapsed";
1080 else
1081 {
1082 auto diff = std::chrono::duration_cast<std::chrono::seconds>(tp - now);
1083 timerStr = std::to_string(diff.count()) + "s remaining";
1084 }
1085 return " " + std::string(name) + ": " + timerStr + "\n";
1086 };
1087
1088 output += formatTimer(SI_TIMER_WINTERSPRING, "Winterspring Invasion", now);
1089 output += formatTimer(SI_TIMER_AZSHARA, "Azshara Invasion", now);
1090 output += formatTimer(SI_TIMER_BLASTED_LANDS, "Blasted Lands Invasion", now);
1091 output += formatTimer(SI_TIMER_BURNING_STEPPES, "Burning Steppes Invasion", now);
1092 output += formatTimer(SI_TIMER_TANARIS, "Tanaris Invasion", now);
1093 output += formatTimer(SI_TIMER_EASTERN_PLAGUELANDS, "Eastern Plaguelands Invasion", now);
1094 output += formatTimer(SI_TIMER_STORMWIND, "Stormwind City Attack", now);
1095 output += formatTimer(SI_TIMER_UNDERCITY, "Undercity Attack", now);
1096
1097 return output;
1098}
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
Definition Duration.h:69
SIRemaining
Definition WorldState.h:156
SITimers
Definition WorldState.h:143
@ SI_TIMER_UNDERCITY
Definition WorldState.h:151
@ SI_TIMER_BLASTED_LANDS
Definition WorldState.h:145
@ SI_TIMER_STORMWIND
Definition WorldState.h:150
@ SI_TIMER_AZSHARA
Definition WorldState.h:144
@ SI_TIMER_TANARIS
Definition WorldState.h:148
@ SI_TIMER_BURNING_STEPPES
Definition WorldState.h:146
@ SI_TIMER_WINTERSPRING
Definition WorldState.h:149
@ SI_TIMER_EASTERN_PLAGUELANDS
Definition WorldState.h:147
@ STATE_1_ENABLED
Definition WorldState.h:126
TimePoint m_timers[SI_TIMER_MAX]
Definition WorldState.h:197
uint32 m_remaining[SI_REMAINING_MAX]
Definition WorldState.h:200

References ScourgeInvasionData::m_battlesWon, ScourgeInvasionData::m_lastAttackZone, ScourgeInvasionData::m_remaining, m_siData, ScourgeInvasionData::m_siMutex, ScourgeInvasionData::m_state, ScourgeInvasionData::m_timers, SI_REMAINING_AZSHARA, SI_REMAINING_BLASTED_LANDS, SI_REMAINING_BURNING_STEPPES, SI_REMAINING_EASTERN_PLAGUELANDS, SI_REMAINING_TANARIS, SI_REMAINING_WINTERSPRING, SI_TIMER_AZSHARA, SI_TIMER_BLASTED_LANDS, SI_TIMER_BURNING_STEPPES, SI_TIMER_EASTERN_PLAGUELANDS, SI_TIMER_STORMWIND, SI_TIMER_TANARIS, SI_TIMER_UNDERCITY, SI_TIMER_WINTERSPRING, STATE_0_DISABLED, and STATE_1_ENABLED.

◆ GetSIRemaining()

uint32 WorldState::GetSIRemaining ( SIRemaining  remaining) const

◆ GetSIRemainingByZone()

uint32 WorldState::GetSIRemainingByZone ( uint32  zoneId) const
1464{
1465 SIRemaining remainingId;
1466 switch (zoneId)
1467 {
1468 case AREA_WINTERSPRING: remainingId = SI_REMAINING_WINTERSPRING; break;
1469 case AREA_AZSHARA: remainingId = SI_REMAINING_AZSHARA; break;
1471 case AREA_BLASTED_LANDS: remainingId = SI_REMAINING_BLASTED_LANDS; break;
1472 case AREA_BURNING_STEPPES: remainingId = SI_REMAINING_BURNING_STEPPES; break;
1473 case AREA_TANARIS: remainingId = SI_REMAINING_TANARIS; break;
1474 default:
1475 LOG_ERROR("WorldState", "GetSIRemainingByZone called with invalid zone ID: {}", zoneId);
1476 return 0;
1477 }
1478 return GetSIRemaining(remainingId);
1479}
@ AREA_AZSHARA
Definition AreaDefines.h:34
@ AREA_TANARIS
Definition AreaDefines.h:73
@ AREA_WINTERSPRING
Definition AreaDefines.h:76
@ AREA_EASTERN_PLAGUELANDS
Definition AreaDefines.h:53
@ AREA_BLASTED_LANDS
Definition AreaDefines.h:27
@ AREA_BURNING_STEPPES
Definition AreaDefines.h:42

References AREA_AZSHARA, AREA_BLASTED_LANDS, AREA_BURNING_STEPPES, AREA_EASTERN_PLAGUELANDS, AREA_TANARIS, AREA_WINTERSPRING, GetSIRemaining(), LOG_ERROR, SI_REMAINING_AZSHARA, SI_REMAINING_BLASTED_LANDS, SI_REMAINING_BURNING_STEPPES, SI_REMAINING_EASTERN_PLAGUELANDS, SI_REMAINING_TANARIS, and SI_REMAINING_WINTERSPRING.

◆ GetSITimer()

TimePoint WorldState::GetSITimer ( SITimers  timer)
1489{
1490 return m_siData.m_timers[timer];
1491}

References m_siData, and ScourgeInvasionData::m_timers.

Referenced by StartNewCityAttackIfTime(), and StartNewInvasionIfTime().

◆ GetSunsReachPrintout()

std::string WorldState::GetSunsReachPrintout ( )
954{
955 auto formatPhase = [this]() -> std::string {
956 std::string name;
957 switch (m_sunsReachData.m_phase)
958 {
959 case SUNS_REACH_PHASE_1_STAGING_AREA: name = "Phase 1: Staging Area"; break;
960 case SUNS_REACH_PHASE_2_SANCTUM: name = "Phase 2: Sanctum"; break;
961 case SUNS_REACH_PHASE_3_ARMORY: name = "Phase 3: Armory"; break;
962 case SUNS_REACH_PHASE_4_HARBOR: name = "Phase 4: Harbor"; break;
963 default: name = "Unknown"; break;
964 }
965 return "Phase: " + std::to_string(m_sunsReachData.m_phase) + " (" + name + ") " + std::to_string(m_sunsReachData.GetPhasePercentage(m_sunsReachData.m_phase)) + "%\n";
966 };
967
968 auto formatSubPhase = [this](uint32 subPhase) -> std::string {
969 std::string name;
970 switch (subPhase)
971 {
972 case SUBPHASE_PORTAL: name = "Portal"; break;
973 case SUBPHASE_ANVIL: name = "Anvil"; break;
974 case SUBPHASE_ALCHEMY_LAB: name = "Alchemy Lab"; break;
975 case SUBPHASE_MONUMENT: name = "Monument"; break;
976 default: name = "Unknown"; break;
977 }
978 return name + ": " + (m_sunsReachData.m_subphaseMask & subPhase ? "100%" : std::to_string(m_sunsReachData.GetSubPhasePercentage(subPhase)) + "%");
979 };
980
981 auto formatCounter = [](uint32 counter, uint32 value) -> std::string {
982 switch (counter)
983 {
985 return "Erratic Behavior: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
987 return "Sanctum Wards: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
989 return "Battle for the Sun's Reach Armory: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
991 return "Distraction at the Dead Scar: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
993 return "Intercepting the Mana Cells: " + std::to_string(value) + " (counts towards Subphase: Portal)";
995 return "Intercept the Reinforcements: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
997 return "Taking the Harbor: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
999 return "Making Ready: " + std::to_string(value) + " (counts towards Subphase: Anvil)";
1001 return "Discovering Your Roots: " + std::to_string(value) + " (counts towards Subphase: Alchemy Lab)";
1003 return "A Charitable Donation: " + std::to_string(value) + " (counts towards Subphase: Monument)";
1004 default:
1005 return "Unknown: " + std::to_string(value) + " (Unknown goal)";
1006 }
1007 };
1008
1009 std::string output = formatPhase();
1010 output += "Subphase mask: " + std::to_string(m_sunsReachData.m_subphaseMask) + "\n";
1011 for (uint32 i = 0; i < 4; ++i)
1012 {
1013 uint32 subPhaseMask = 1 << i;
1014 output += " " + formatSubPhase(subPhaseMask) + "\n";
1015 }
1016 output += "Counters:\n";
1017 output += " Sunsreach.CounterMax = " + std::to_string(sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX)) + "\n";
1018 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
1019 output += " " + std::to_string(i) + ". " + formatCounter(i, m_sunsReachData.m_sunsReachReclamationCounters[i]) + "\n";
1020
1021 // Sunwell Gates
1022 auto formatGatePhase = [](uint32 gate) -> std::string {
1023 switch (gate)
1024 {
1025 case SUNWELL_ALL_GATES_CLOSED: return "All Gates Closed"; break;
1026 case SUNWELL_AGAMATH_GATE1_OPEN: return "Gate 1 Agamath Open"; break;
1027 case SUNWELL_ROHENDOR_GATE2_OPEN: return "Gate 2 Rohendar Open"; break;
1028 case SUNWELL_ARCHONISUS_GATE3_OPEN: return "Gate 3 Archonisus Open"; break;
1029 default: return "Unknown"; break;
1030 }
1031 };
1032 output += "Sunwell Plateau Gate Phase " + std::to_string(m_sunsReachData.m_gate) + " (" + formatGatePhase(m_sunsReachData.m_gate) + ")" + ":\n";
1033 output += " 0. Gate 1 (Agamath): " + std::string(m_sunsReachData.m_gate >= SUNWELL_AGAMATH_GATE1_OPEN ? "Open " : "Closed ") + std::to_string(m_sunsReachData.m_gateCounters[COUNTER_AGAMATH_THE_FIRST_GATE]) + " (" + std::to_string(m_sunsReachData.GetSunwellGatePercentage(SUNWELL_ALL_GATES_CLOSED)) + "%)\n";
1034 output += " 1. Gate 2 (Rohendor): " + std::string(m_sunsReachData.m_gate >= SUNWELL_ROHENDOR_GATE2_OPEN ? "Open " : "Closed ") + std::to_string(m_sunsReachData.m_gateCounters[COUNTER_ROHENDOR_THE_SECOND_GATE]) + " (" + std::to_string(m_sunsReachData.GetSunwellGatePercentage(SUNWELL_AGAMATH_GATE1_OPEN)) + "%)\n";
1035 output += " 2. Gate 3 (Archonisus): " + std::string(m_sunsReachData.m_gate >= SUNWELL_ARCHONISUS_GATE3_OPEN ? "Open " : "Closed ") + std::to_string(m_sunsReachData.m_gateCounters[COUNTER_ARCHONISUS_THE_FINAL_GATE]) + " (" + std::to_string(m_sunsReachData.GetSunwellGatePercentage(SUNWELL_ROHENDOR_GATE2_OPEN)) + "%)\n";
1036 return output;
1037}
@ COUNTERS_MAX
Definition WorldState.h:244
STL namespace.

References CONFIG_SUNSREACH_COUNTER_MAX, COUNTER_A_CHARITABLE_DONATION, COUNTER_AGAMATH_THE_FIRST_GATE, COUNTER_ARCHONISUS_THE_FINAL_GATE, COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY, COUNTER_DISCOVERING_YOUR_ROOTS, COUNTER_DISTRACTION_AT_THE_DEAD_SCAR, COUNTER_ERRATIC_BEHAVIOR, COUNTER_INTERCEPT_THE_REINFORCEMENTS, COUNTER_INTERCEPTING_THE_MANA_CELLS, COUNTER_MAKING_READY, COUNTER_ROHENDOR_THE_SECOND_GATE, COUNTER_SANCTUM_WARDS, COUNTER_TAKING_THE_HARBOR, COUNTERS_MAX, SunsReachReclamationData::GetPhasePercentage(), SunsReachReclamationData::GetSubPhasePercentage(), SunsReachReclamationData::GetSunwellGatePercentage(), SunsReachReclamationData::m_gate, SunsReachReclamationData::m_gateCounters, SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationCounters, SUBPHASE_ALCHEMY_LAB, SUBPHASE_ANVIL, SUBPHASE_MONUMENT, SUBPHASE_PORTAL, SUNS_REACH_PHASE_1_STAGING_AREA, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, SUNS_REACH_PHASE_4_HARBOR, SUNWELL_AGAMATH_GATE1_OPEN, SUNWELL_ALL_GATES_CLOSED, SUNWELL_ARCHONISUS_GATE3_OPEN, SUNWELL_ROHENDOR_GATE2_OPEN, and sWorld.

◆ GetTimerIdForZone()

uint32 WorldState::GetTimerIdForZone ( uint32  zoneId)
1934{
1935 uint32 attackTime = 0;
1936 switch (zoneId)
1937 {
1938 case AREA_TANARIS: attackTime = SI_TIMER_TANARIS; break;
1939 case AREA_BLASTED_LANDS: attackTime = SI_TIMER_BLASTED_LANDS; break;
1941 case AREA_BURNING_STEPPES: attackTime = SI_TIMER_BURNING_STEPPES; break;
1942 case AREA_WINTERSPRING: attackTime = SI_TIMER_WINTERSPRING; break;
1943 case AREA_AZSHARA: attackTime = SI_TIMER_AZSHARA; break;
1944 default:
1945 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetTimerIdForZone unknown zoneId {}.", zoneId);
1946 return 0;
1947 }
1948 return attackTime;
1949}

References AREA_AZSHARA, AREA_BLASTED_LANDS, AREA_BURNING_STEPPES, AREA_EASTERN_PLAGUELANDS, AREA_TANARIS, AREA_WINTERSPRING, LOG_ERROR, SI_TIMER_AZSHARA, SI_TIMER_BLASTED_LANDS, SI_TIMER_BURNING_STEPPES, SI_TIMER_EASTERN_PLAGUELANDS, SI_TIMER_TANARIS, and SI_TIMER_WINTERSPRING.

Referenced by OnEnable(), and Update().

◆ getWorldState()

uint64 WorldState::getWorldState ( uint32  index) const
183{
184 auto const& itr = _worldstates.find(index);
185 return itr != _worldstates.end() ? itr->second : 0;
186}
WorldStatesMap _worldstates
Definition WorldState.h:312

References _worldstates.

◆ HandleActiveZone()

void WorldState::HandleActiveZone ( uint32  attackTimeVar,
uint32  zoneId,
uint32  remainingVar,
TimePoint  now 
)
1791{
1792 TimePoint timePoint = sWorldState->GetSITimer(SITimers(attackTimeVar));
1793
1795
1796 Map* map = sMapMgr->FindMap(zone.map, 0);
1797
1798 if (zone.zoneId != zoneId)
1799 return;
1800
1801 uint32 remaining = GetSIRemaining(SIRemaining(remainingVar));
1802
1803 // Calculate the next possible attack between ZONE_ATTACK_TIMER_MIN and ZONE_ATTACK_TIMER_MAX.
1805 TimePoint next_attack = now + std::chrono::seconds(zoneAttackTimer);
1806 uint64 timeToNextAttack = std::chrono::duration_cast<std::chrono::minutes>(next_attack-now).count();
1807
1808 if (zone.mouthGuid)
1809 {
1810 // Handles the inactive zone, without a Mouth of Kel'Thuzad summoned (which spawns the whole zone event).
1811 Creature* mouth = map->GetCreature(zone.mouthGuid);
1812 if (!mouth)
1813 sWorldState->SetMouthGuid(zone.zoneId, ObjectGuid()); // delays spawning until next tick
1814 // Handles the active zone that has no necropolis left.
1815 else if (timePoint < now && remaining == 0)
1816 {
1817 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1818 sWorldState->AddBattlesWon(1);
1819 sWorldState->SetLastAttackZone(zoneId);
1820
1821 LOG_INFO("gameevent", "[Scourge Invasion Event] The Scourge has been defeated in {}, next attack starting in {} minutes.", zoneId, timeToNextAttack);
1822 LOG_DEBUG("gameevent", "[Scourge Invasion Event] {} victories", sWorldState->GetBattlesWon());
1823
1824 if (mouth)
1826 else
1827 LOG_ERROR("gameevent", "ScourgeInvasionEvent::HandleActiveZone ObjectGuid {} not found.", zone.mouthGuid.ToString());
1828 }
1829 }
1830 else
1831 {
1832 // If more than one zones are alreay being attacked, set the timer again to ZONE_ATTACK_TIMER.
1833 if (GetActiveZones() > 1)
1834 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1835
1836 // Try to start the zone if attackTimeVar is 0.
1837 StartNewInvasionIfTime(attackTimeVar, zoneId);
1838 }
1839}
std::uint64_t uint64
Definition Define.h:106
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
#define sWorldState
Definition WorldState.h:377
@ EVENT_HERALD_OF_THE_LICH_KING_ZONE_STOP
Definition WorldState.h:114
@ ZONE_ATTACK_TIMER_MIN
Definition WorldState.h:169
@ ZONE_ATTACK_TIMER_MAX
Definition WorldState.h:170
Definition ObjectGuid.h:118
std::string ToString() const
Definition ObjectGuid.cpp:47
virtual void DoAction(int32)
Definition UnitAI.h:217
UnitAI * GetAI()
Definition Unit.h:648
uint32 GetActiveZones()
Definition WorldState.cpp:1914
void StartNewInvasionIfTime(uint32 attackTimeVar, uint32 zoneId)
Definition WorldState.cpp:1613
Definition WorldState.h:178
ObjectGuid mouthGuid
Definition WorldState.h:184
uint32 map
Definition WorldState.h:179
uint32 zoneId
Definition WorldState.h:180
std::map< uint32, InvasionZone > m_activeInvasions
Definition WorldState.h:206

References UnitAI::DoAction(), EVENT_HERALD_OF_THE_LICH_KING_ZONE_STOP, GetActiveZones(), Unit::GetAI(), Map::GetCreature(), GetSIRemaining(), LOG_DEBUG, LOG_ERROR, LOG_INFO, ScourgeInvasionData::m_activeInvasions, m_siData, ScourgeInvasionData::InvasionZone::map, ScourgeInvasionData::InvasionZone::mouthGuid, sMapMgr, StartNewInvasionIfTime(), sWorldState, ObjectGuid::ToString(), urand(), ZONE_ATTACK_TIMER_MAX, ZONE_ATTACK_TIMER_MIN, and ScourgeInvasionData::InvasionZone::zoneId.

Referenced by Update().

◆ HandleConditionStateChange()

void WorldState::HandleConditionStateChange ( WorldStateCondition  conditionId,
WorldStateConditionState  state 
)
248{
249 _transportStates[conditionId] = state;
250}

References _transportStates.

◆ HandleDefendedZones()

void WorldState::HandleDefendedZones ( )
1569{
1571 {
1575 }
1581 {
1584 }
1586 {
1587 // The event is enabled via command, so we expect it to be disabled via command as well.
1588 // sGameEventMgr->StopEvent(GAME_EVENT_SCOURGE_INVASION);
1593 }
1594}
#define sGameEventMgr
Definition GameEventMgr.h:201
@ CONFIG_SCOURGEINVASION_COUNTER_THIRD
Definition WorldConfig.h:385
@ CONFIG_SCOURGEINVASION_COUNTER_SECOND
Definition WorldConfig.h:384
@ CONFIG_SCOURGEINVASION_COUNTER_FIRST
Definition WorldConfig.h:383
@ GAME_EVENT_SCOURGE_INVASION_150_INVASIONS
Definition WorldState.h:77
@ GAME_EVENT_SCOURGE_INVASION_INVASIONS_DONE
Definition WorldState.h:78
@ GAME_EVENT_SCOURGE_INVASION_50_INVASIONS
Definition WorldState.h:75
@ GAME_EVENT_SCOURGE_INVASION_100_INVASIONS
Definition WorldState.h:76

References CONFIG_SCOURGEINVASION_COUNTER_FIRST, CONFIG_SCOURGEINVASION_COUNTER_SECOND, CONFIG_SCOURGEINVASION_COUNTER_THIRD, GAME_EVENT_SCOURGE_INVASION_100_INVASIONS, GAME_EVENT_SCOURGE_INVASION_150_INVASIONS, GAME_EVENT_SCOURGE_INVASION_50_INVASIONS, GAME_EVENT_SCOURGE_INVASION_INVASIONS_DONE, ScourgeInvasionData::m_battlesWon, m_siData, sGameEventMgr, and sWorld.

Referenced by AddBattlesWon(), and Load().

◆ HandleExternalEvent()

void WorldState::HandleExternalEvent ( WorldStateEvent  eventId,
uint32  param 
)
265{
266 std::lock_guard<std::mutex> guard(_mutex);
267 switch (eventId)
268 {
271 {
274 }
275 break;
277 if (param == TEAM_ALLIANCE)
278 {
281 }
282 else
283 {
286 }
287 break;
289 if (param == TEAM_ALLIANCE)
290 {
293 }
294 else
295 {
298 }
299 break;
300 default:
301 break;
302 }
303}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
constexpr auto MINUTE
Definition Common.h:47
@ WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_DESPAWN
Definition WorldState.h:45
@ WORLD_STATE_CUSTOM_EVENT_ON_ADALS_SONG_OF_BATTLE
Definition WorldState.h:43
@ WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_SPAWN
Definition WorldState.h:44
void BuffAdalsSongOfBattle()
Definition WorldState.cpp:489
void DispelMagtheridonTeam(TeamId team)
Definition WorldState.cpp:456
std::mutex _mutex
Definition WorldState.h:327
void BuffMagtheridonTeam(TeamId team)
Definition WorldState.cpp:423
uint32 _adalSongOfBattleTimer
Definition WorldState.h:320

References _adalSongOfBattleTimer, _isMagtheridonHeadSpawnedAlliance, _isMagtheridonHeadSpawnedHorde, _mutex, BuffAdalsSongOfBattle(), BuffMagtheridonTeam(), DispelMagtheridonTeam(), IN_MILLISECONDS, MINUTE, TEAM_ALLIANCE, TEAM_HORDE, WORLD_STATE_CUSTOM_EVENT_ON_ADALS_SONG_OF_BATTLE, WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_DESPAWN, and WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_SPAWN.

◆ HandlePlayerEnterZone()

void WorldState::HandlePlayerEnterZone ( Player player,
AreaTableIDs  zoneId 
)
348{
349 std::lock_guard<std::mutex> guard(_mutex);
350 switch (zoneId)
351 {
357 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
358 break;
366 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
367 else if (_isMagtheridonHeadSpawnedHorde && player->GetTeamId() == TEAM_HORDE)
368 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
369 break;
373 {
374 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
377 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
378 break;
379 }
380 default:
381 break;
382 }
383};
@ AREA_THE_MECHANAR
Definition AreaDefines.h:134
@ AREA_THE_BLOOD_FURNACE
Definition AreaDefines.h:120
@ AREA_HELLFIRE_CITADEL
Definition AreaDefines.h:110
@ AREA_THE_ARCATRAZ
Definition AreaDefines.h:133
@ AREA_HELLFIRE_RAMPARTS
Definition AreaDefines.h:109
@ AREA_MAGTHERIDONS_LAIR
Definition AreaDefines.h:131
@ AREA_THE_BOTANICA
Definition AreaDefines.h:132
@ AREA_HELLFIRE_PENINSULA
Definition AreaDefines.h:98
@ AREA_THE_SHATTERED_HALLS
Definition AreaDefines.h:121
@ SUBPHASE_ALL
Definition WorldState.h:229
@ SPELL_KIRU_SONG_OF_VICTORY
Definition WorldState.h:55
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113

References _adalSongOfBattleTimer, _isMagtheridonHeadSpawnedAlliance, _isMagtheridonHeadSpawnedHorde, _mutex, AREA_HELLFIRE_CITADEL, AREA_HELLFIRE_PENINSULA, AREA_HELLFIRE_RAMPARTS, AREA_ISLE_OF_QUEL_DANAS, AREA_MAGISTERS_TERRACE, AREA_MAGTHERIDONS_LAIR, AREA_SHATTRATH_CITY, AREA_SUNWELL_PLATEAU, AREA_THE_ARCATRAZ, AREA_THE_BLOOD_FURNACE, AREA_THE_BOTANICA, AREA_THE_MECHANAR, AREA_THE_SHATTERED_HALLS, Unit::CastSpell(), Object::GetGUID(), Player::GetTeamId(), SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, SPELL_ADAL_SONG_OF_BATTLE, SPELL_KIRU_SONG_OF_VICTORY, SPELL_NAZGRELS_FAVOR, SPELL_TROLLBANES_COMMAND, SUBPHASE_ALL, TEAM_ALLIANCE, and TEAM_HORDE.

◆ HandlePlayerLeaveZone()

void WorldState::HandlePlayerLeaveZone ( Player player,
AreaTableIDs  zoneId 
)
385{
386 std::lock_guard<std::mutex> guard(_mutex);
387 switch (zoneId)
388 {
395 break;
402 if (player->GetTeamId() == TEAM_ALLIANCE)
404 else if (player->GetTeamId() == TEAM_HORDE)
406 break;
410 {
411 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
416 break;
417 }
418 default:
419 break;
420 }
421};

References _adalSongOfBattleTimer, _mutex, AREA_HELLFIRE_CITADEL, AREA_HELLFIRE_PENINSULA, AREA_HELLFIRE_RAMPARTS, AREA_ISLE_OF_QUEL_DANAS, AREA_MAGISTERS_TERRACE, AREA_MAGTHERIDONS_LAIR, AREA_SHATTRATH_CITY, AREA_SUNWELL_PLATEAU, AREA_THE_ARCATRAZ, AREA_THE_BLOOD_FURNACE, AREA_THE_BOTANICA, AREA_THE_MECHANAR, AREA_THE_SHATTERED_HALLS, Object::GetGUID(), Player::GetTeamId(), m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, Unit::RemoveAurasDueToSpell(), SPELL_ADAL_SONG_OF_BATTLE, SPELL_KIRU_SONG_OF_VICTORY, SPELL_NAZGRELS_FAVOR, SPELL_TROLLBANES_COMMAND, TEAM_ALLIANCE, and TEAM_HORDE.

◆ HandleSunsReachPhaseTransition()

void WorldState::HandleSunsReachPhaseTransition ( uint32  newPhase)
717{
718 if (newPhase < m_sunsReachData.m_phase)
719 {
720 while (newPhase != m_sunsReachData.m_phase)
721 {
724 }
726 }
727 else
728 {
730 bool moreThanOne = newPhase > m_sunsReachData.m_phase + 1; // custom command case
731 m_sunsReachData.m_phase = newPhase;
732 StartSunsReachPhase(moreThanOne);
733 }
734 switch (m_sunsReachData.m_phase)
735 {
741 break;
742 default: break;
743 }
746}
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB
Definition WorldState.h:101
@ GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL
Definition WorldState.h:92
@ GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL
Definition WorldState.h:96
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT
Definition WorldState.h:99
void StopSunsReachPhase(bool forward)
Definition WorldState.cpp:904
void StartSunsReachPhase(bool initial=false)
Definition WorldState.cpp:916

References GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL, GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL, GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB, GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT, SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, Save(), SAVE_ID_QUEL_DANAS, SendWorldstateUpdate(), sGameEventMgr, StartSunsReachPhase(), StopSunsReachPhase(), SUBPHASE_ALCHEMY_LAB, SUBPHASE_ANVIL, SUBPHASE_MONUMENT, SUBPHASE_PORTAL, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, SUNS_REACH_PHASE_4_HARBOR, and WORLD_STATE_QUEL_DANAS_MUSIC.

Referenced by AddSunsReachProgress().

◆ HandleSunsReachSubPhaseTransition()

void WorldState::HandleSunsReachSubPhaseTransition ( int32  subPhaseMask,
bool  initial = false 
)
749{
750 bool start = true;
751 if (subPhaseMask < 0)
752 {
753 start = false;
754 subPhaseMask = -subPhaseMask;
755 }
756 bool all = false;
757 if (start)
758 {
759 m_sunsReachData.m_subphaseMask |= subPhaseMask;
761 all = true;
762 }
763 else
764 {
766 all = true;
767 m_sunsReachData.m_subphaseMask &= ~subPhaseMask;
768 }
769 if (initial)
770 {
772 if ((subPhaseMask & SUBPHASE_PORTAL) == 0)
775 if ((subPhaseMask & SUBPHASE_ANVIL) == 0)
778 {
779 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB) == 0)
781 if ((subPhaseMask & SUBPHASE_MONUMENT) == 0)
783 }
784 }
785 if ((subPhaseMask & SUBPHASE_PORTAL))
786 {
789 if (start)
790 {
791 sGameEventMgr->StopEvent(first);
792 sGameEventMgr->StartEvent(second);
793 }
794 else
795 {
796 sGameEventMgr->StopEvent(second);
797 sGameEventMgr->StartEvent(first);
798 }
799 }
800 if ((subPhaseMask & SUBPHASE_ANVIL))
801 {
804 if (start)
805 {
806 sGameEventMgr->StopEvent(first);
807 sGameEventMgr->StartEvent(second);
808 }
809 else
810 {
811 sGameEventMgr->StopEvent(second);
812 sGameEventMgr->StartEvent(first);
813 }
814 }
815 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB))
816 {
819 if (start)
820 {
821 sGameEventMgr->StopEvent(first);
822 sGameEventMgr->StartEvent(second);
823 }
824 else
825 {
826 sGameEventMgr->StopEvent(second);
827 sGameEventMgr->StartEvent(first);
828 }
829 }
830 if ((subPhaseMask & SUBPHASE_MONUMENT))
831 {
834 if (start)
835 {
836 sGameEventMgr->StopEvent(first);
837 sGameEventMgr->StartEvent(second);
838 }
839 else
840 {
841 sGameEventMgr->StopEvent(second);
842 sGameEventMgr->StartEvent(first);
843 }
844 }
845 if (all)
846 {
847 if (start)
849 else
851
852 if (!initial)
853 {
854 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
855 for (ObjectGuid& guid : m_sunsReachData.m_sunsReachReclamationPlayers)
856 if (Player* player = ObjectAccessor::FindPlayer(guid))
857 {
858 if (start)
859 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
860 else
861 player->RemoveAurasDueToSpell(SPELL_KIRU_SONG_OF_VICTORY);
862 }
863 }
864 }
865 if (!initial)
867}
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL
Definition WorldState.h:93
@ GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT
Definition WorldState.h:100
@ GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU
Definition WorldState.h:103
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL
Definition WorldState.h:97
@ GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB
Definition WorldState.h:102
Definition ObjectAccessor.h:61
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

References ObjectAccessor::FindPlayer(), GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL, GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL, GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL, GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL, GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB, GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU, GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT, GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB, GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT, SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, Save(), SAVE_ID_QUEL_DANAS, sGameEventMgr, SPELL_KIRU_SONG_OF_VICTORY, SUBPHASE_ALCHEMY_LAB, SUBPHASE_ALL, SUBPHASE_ANVIL, SUBPHASE_MONUMENT, SUBPHASE_PORTAL, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, and SUNS_REACH_PHASE_4_HARBOR.

Referenced by AddSunsReachProgress(), and Load().

◆ HandleSunwellGateTransition()

void WorldState::HandleSunwellGateTransition ( uint32  newGate)
870{
871 if (newGate < m_sunsReachData.m_gate)
872 {
873 while (newGate != m_sunsReachData.m_gate)
874 {
877 }
879 }
880 else
881 {
883 m_sunsReachData.m_gate = newGate;
885 }
886 int32 worldState = 0;
887 switch (newGate)
888 {
892 }
893 if (worldState)
895
897}
void StartSunwellGatePhase()
Definition WorldState.cpp:1204
void StopSunwellGatePhase()
Definition WorldState.cpp:1216

References SunsReachReclamationData::m_gate, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationMutex, SunsReachReclamationData::m_sunsReachReclamationPlayers, Save(), SAVE_ID_QUEL_DANAS, SendWorldstateUpdate(), StartSunwellGatePhase(), StopSunwellGatePhase(), SUNWELL_AGAMATH_GATE1_OPEN, SUNWELL_ARCHONISUS_GATE3_OPEN, SUNWELL_ROHENDOR_GATE2_OPEN, WORLD_STATE_AGAMATH_THE_FIRST_GATE_HEALTH, WORLD_STATE_ARCHONISUS_THE_FINAL_GATE_HEALTH, and WORLD_STATE_ROHENDOR_THE_SECOND_GATE_HEALTH.

Referenced by AddSunwellGateProgress().

◆ instance()

WorldState * WorldState::instance ( )
static
33{
34 static WorldState instance;
35 return &instance;
36}
Definition WorldState.h:284
static WorldState * instance()
Definition WorldState.cpp:32

References instance().

Referenced by instance().

◆ IsActiveZone()

bool WorldState::IsActiveZone ( uint32  zoneId)
1909{
1910 return false;
1911}

Referenced by StartNewInvasion().

◆ IsConditionFulfilled()

bool WorldState::IsConditionFulfilled ( uint32  conditionId,
uint32  state = WORLD_STATE_CONDITION_STATE_NONE 
) const
218{
219 switch (conditionId)
220 {
228 return _transportStates.at(conditionId) == state;
241 default:
242 LOG_ERROR("scripts", "WorldState::IsConditionFulfilled: Unhandled WorldStateCondition {}", conditionId);
243 return false;
244 }
245}
@ WORLD_STATE_CONDITION_NAZGRELS_FAVOR
Definition WorldState.h:29
@ WORLD_STATE_CONDITION_TROLLBANES_COMMAND
Definition WorldState.h:28

References _isMagtheridonHeadSpawnedAlliance, _isMagtheridonHeadSpawnedHorde, _transportStates, GetSIRemaining(), LOG_ERROR, SI_REMAINING_AZSHARA, SI_REMAINING_BLASTED_LANDS, SI_REMAINING_BURNING_STEPPES, SI_REMAINING_EASTERN_PLAGUELANDS, SI_REMAINING_TANARIS, SI_REMAINING_WINTERSPRING, WORLD_STATE_CONDITION_NAZGRELS_FAVOR, WORLD_STATE_CONDITION_THE_IRON_EAGLE, WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS, WORLD_STATE_CONDITION_THE_THUNDERCALLER, WORLD_STATE_CONDITION_TROLLBANES_COMMAND, WORLD_STATE_SCOURGE_INVASION_AZSHARA, WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, WORLD_STATE_SCOURGE_INVASION_TANARIS, and WORLD_STATE_SCOURGE_INVASION_WINTERSPRING.

◆ Load()

void WorldState::Load ( )
50{
52 PreparedQueryResult result = CharacterDatabase.Query(stmt);
53
54 if (result)
55 {
56 do
57 {
58 Field* fields = result->Fetch();
59 uint32 id = fields[0].Get<uint32>();
60 std::string data = fields[1].Get<std::string>();
61 std::istringstream loadStream(data);
62
63 switch (id)
64 {
66 {
67 if (data.size())
68 {
69 try
70 {
72 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
74 loadStream >> m_sunsReachData.m_gate;
75 for (uint32 i = 0; i < COUNTERS_MAX_GATES; ++i)
76 loadStream >> m_sunsReachData.m_gateCounters[i];
77 }
78 catch (std::exception& e)
79 {
80 LOG_ERROR("scripts", "WorldState::Load: Exception reading SunsReach data {}", e.what());
86 }
87 }
88 else
89 {
95 }
96 break;
97 }
99 if (data.size())
100 {
101 try
102 {
103 uint32 state;
104 loadStream >> state;
105 m_siData.m_state = SIState(state);
106 for (TimePoint& m_timer : m_siData.m_timers)
107 {
108 uint64 time;
109 loadStream >> time;
110 m_timer = TimePoint(std::chrono::milliseconds(time));
111 }
113 for (unsigned int& i : m_siData.m_remaining)
114 loadStream >> i;
115 }
116 catch (std::exception& e)
117 {
118 LOG_ERROR("scripts", "WorldState::Load: Exception reading ScourgeInvasion data {}", e.what());
119 m_siData.Reset();
120 }
121 }
122 break;
123 }
124 } while (result->NextRow());
125 }
129
131 {
134 }
135}
@ CHAR_SEL_WORLD_STATE
Definition CharacterDatabase.h:531
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ COUNTERS_MAX_GATES
Definition WorldState.h:259
SIState
Definition WorldState.h:124
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
Definition PreparedStatement.h:157
void StartScourgeInvasion(bool sendMail)
Definition WorldState.cpp:1290
void Reset()
Definition WorldState.cpp:1409

References CHAR_SEL_WORLD_STATE, CharacterDatabase, COUNTERS_MAX, COUNTERS_MAX_GATES, Field::Get(), HandleDefendedZones(), HandleSunsReachSubPhaseTransition(), LOG_ERROR, ScourgeInvasionData::m_battlesWon, SunsReachReclamationData::m_gate, SunsReachReclamationData::m_gateCounters, ScourgeInvasionData::m_lastAttackZone, SunsReachReclamationData::m_phase, ScourgeInvasionData::m_remaining, m_siData, ScourgeInvasionData::m_state, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationCounters, ScourgeInvasionData::m_timers, ScourgeInvasionData::Reset(), SAVE_ID_QUEL_DANAS, SAVE_ID_SCOURGE_INVASION, StartScourgeInvasion(), StartSunsReachPhase(), StartSunwellGatePhase(), STATE_1_ENABLED, and SUNWELL_ALL_GATES_CLOSED.

◆ LoadWorldStates()

void WorldState::LoadWorldStates ( )
138{
139 uint32 oldMSTime = getMSTime();
140
141 QueryResult result = CharacterDatabase.Query("SELECT entry, value FROM worldstates");
142
143 if (!result)
144 {
145 LOG_WARN("server.loading", ">> Loaded 0 world states. DB table `worldstates` is empty!");
146 LOG_INFO("server.loading", " ");
147 return;
148 }
149
150 do
151 {
152 Field* fields = result->Fetch();
153 _worldstates[fields[0].Get<uint32>()] = fields[1].Get<uint32>();
154 } while (result->NextRow());
155
156 LOG_INFO("server.loading", ">> Loaded {} World States in {} ms", _worldstates.size(), GetMSTimeDiffToNow(oldMSTime));
157 LOG_INFO("server.loading", " ");
158}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_WARN(filterType__,...)
Definition Log.h:162
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103

References _worldstates, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, and LOG_WARN.

◆ OnDisable() [1/2]

void WorldState::OnDisable ( ScourgeInvasionData::CityAttack zone)
1898{
1899 if (!zone.pallidGuid)
1900 return;
1901
1902 Map* map = GetMap(zone.map, zone.pallid[0]);
1903
1904 if (Creature* pallid = map->GetCreature(zone.pallidGuid))
1905 pallid->DespawnOrUnsummon();
1906}
std::vector< Position > pallid
Definition WorldState.h:191
uint32 map
Definition WorldState.h:189
ObjectGuid pallidGuid
Definition WorldState.h:192

References Map::GetCreature(), GetMap(), ScourgeInvasionData::CityAttack::map, ScourgeInvasionData::CityAttack::pallid, and ScourgeInvasionData::CityAttack::pallidGuid.

◆ OnDisable() [2/2]

void WorldState::OnDisable ( ScourgeInvasionData::InvasionZone zone)
1887{
1888 if (!zone.mouthGuid)
1889 return;
1890
1891 Map* map = GetMap(zone.map, zone.mouth[0]);
1892
1893 if (Creature* mouth = map->GetCreature(zone.mouthGuid))
1894 mouth->DespawnOrUnsummon();
1895}
std::vector< Position > mouth
Definition WorldState.h:183

References Map::GetCreature(), GetMap(), ScourgeInvasionData::InvasionZone::map, ScourgeInvasionData::InvasionZone::mouth, and ScourgeInvasionData::InvasionZone::mouthGuid.

Referenced by StopScourgeInvasion().

◆ OnEnable()

void WorldState::OnEnable ( ScourgeInvasionData::InvasionZone zone)
1876{
1877 // If there were remaining necropolises in the old zone before shutdown, we
1878 // restore that zone
1879 if (sWorldState->GetSIRemaining(SIRemaining(zone.remainingNecropoli)) > 0)
1880 ResumeInvasion(zone);
1881 // Otherwise we start a new Invasion
1882 else
1884}
uint32 GetTimerIdForZone(uint32 zoneId)
Definition WorldState.cpp:1933
bool ResumeInvasion(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1707
uint32 remainingNecropoli
Definition WorldState.h:182

References GetTimerIdForZone(), ScourgeInvasionData::InvasionZone::remainingNecropoli, ResumeInvasion(), StartNewInvasionIfTime(), sWorldState, and ScourgeInvasionData::InvasionZone::zoneId.

Referenced by StartScourgeInvasion().

◆ RemovePendingInvasion()

void WorldState::RemovePendingInvasion ( uint32  zoneId)
1858{
1859 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1860 m_siData.m_pendingInvasions.erase(zoneId);
1861}

References ScourgeInvasionData::m_pendingInvasions, m_siData, and ScourgeInvasionData::m_siMutex.

◆ RemovePendingPallid()

void WorldState::RemovePendingPallid ( uint32  zoneId)
1870{
1871 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1872 m_siData.m_pendingPallids.erase(zoneId);
1873}

References ScourgeInvasionData::m_pendingPallids, m_siData, and ScourgeInvasionData::m_siMutex.

◆ ResumeInvasion()

bool WorldState::ResumeInvasion ( ScourgeInvasionData::InvasionZone zone)
1708{
1709 // Dont have a save variable to know which necropolises had already been destroyed, so we
1710 // just summon the same amount, but not necessarily the same necropolises
1711 LOG_DEBUG("gameevent", "Scourge Invasion Event: Resuming Scourge invasion in zone {}", zone.zoneId);
1712
1713 uint32 num_necropolises_remaining = sWorldState->GetSIRemaining(SIRemaining(zone.remainingNecropoli));
1714
1715 // Just making sure we can access all maps before starting the invasion
1716 for (uint32 i = 0; i < num_necropolises_remaining; i++)
1717 {
1718 if (!GetMap(zone.map, zone.mouth[0]))
1719 {
1720 LOG_ERROR("gameevent", "ScourgeInvasionEvent::ResumeInvasion map {} not accessible. Retry next update.", zone.map);
1721 return false;
1722 }
1723 }
1724
1725 Map* mapPtr = GetMap(zone.map, zone.mouth[0]);
1726 if (!mapPtr)
1727 {
1728 LOG_ERROR("gameevent", "ScourgeInvasionEvent::ResumeInvasion failed getting map, even after making sure they were loaded....");
1729 return false;
1730 }
1731
1732 SummonMouth(mapPtr, zone, zone.mouth[0], false);
1733
1734 return true;
1735}
bool SummonMouth(Map *map, ScourgeInvasionData::InvasionZone &zone, Position position, bool newInvasion)
Definition WorldState.cpp:1737

References GetMap(), LOG_DEBUG, LOG_ERROR, ScourgeInvasionData::InvasionZone::map, ScourgeInvasionData::InvasionZone::mouth, ScourgeInvasionData::InvasionZone::remainingNecropoli, SummonMouth(), sWorldState, and ScourgeInvasionData::InvasionZone::zoneId.

Referenced by OnEnable().

◆ Save()

void WorldState::Save ( WorldStateSaveIds  saveId)
189{
190 switch (saveId)
191 {
193 {
194 std::string expansionData = m_sunsReachData.GetData();
195 SaveHelper(expansionData, SAVE_ID_QUEL_DANAS);
196 break;
197 }
199 {
200 std::string siData = m_siData.GetData();
202 break;
203 }
204 default:
205 break;
206 }
207}
void SaveHelper(std::string &stringToSave, WorldStateSaveIds saveId)
Definition WorldState.cpp:209
std::string GetData()
Definition WorldState.cpp:1421
std::string GetData()
Definition WorldState.cpp:1100

References ScourgeInvasionData::GetData(), SunsReachReclamationData::GetData(), m_siData, m_sunsReachData, SAVE_ID_QUEL_DANAS, SAVE_ID_SCOURGE_INVASION, and SaveHelper().

Referenced by AddBattlesWon(), AddSunsReachProgress(), AddSunwellGateProgress(), HandleSunsReachPhaseTransition(), HandleSunsReachSubPhaseTransition(), HandleSunwellGateTransition(), SetScourgeInvasionState(), and SetSIRemaining().

◆ SaveHelper()

void WorldState::SaveHelper ( std::string &  stringToSave,
WorldStateSaveIds  saveId 
)
210{
212 stmt->SetData(0, saveId);
213 stmt->SetData(1, stringToSave);
214 CharacterDatabase.Execute(stmt);
215}
@ CHAR_REP_WORLD_STATE
Definition CharacterDatabase.h:532
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77

References CHAR_REP_WORLD_STATE, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by Save().

◆ SendScourgeInvasionMail()

void WorldState::SendScourgeInvasionMail ( )
private
1263{
1264 QueryResult result = CharacterDatabase.Query("SELECT guid FROM characters WHERE level >= 50");
1265 if (result)
1266 {
1267 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1269 uint32 count = 0;
1270 do
1271 {
1272 Field* fields = result->Fetch();
1273 ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
1274
1275 // Add item manually. SendMailTo does not add items for offline players
1277 {
1278 item->SaveToDB(trans);
1279 draft.AddItem(item);
1280 }
1281
1282 draft.SendMailTo(trans, MailReceiver(playerGUID.GetCounter()), NPC_ARGENT_EMISSARY, MAIL_CHECK_MASK_HAS_BODY);
1283 ++count;
1284 } while (result->NextRow());
1285 CharacterDatabase.CommitTransaction(trans);
1286 LOG_INFO("WorldState", "SendScourgeInvasionMail sent to {} characters", count);
1287 }
1288}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
@ MAIL_CHECK_MASK_HAS_BODY
Definition Mail.h:51
@ MAIL_TEMPLATE_ARGENT_DAWN_NEEDS_YOUR_HELP
Definition WorldState.h:120
@ ITEM_A_LETTER_FROM_THE_KEEPER_OF_THE_ROLLS
Definition WorldState.h:118
@ NPC_ARGENT_EMISSARY
Definition WorldState.h:119
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087
Definition Mail.h:119
Definition Mail.h:105
LowType GetCounter() const
Definition ObjectGuid.h:145

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), ObjectGuid::GetCounter(), ITEM_A_LETTER_FROM_THE_KEEPER_OF_THE_ROLLS, LOG_INFO, MAIL_CHECK_MASK_HAS_BODY, MAIL_TEMPLATE_ARGENT_DAWN_NEEDS_YOUR_HELP, NPC_ARGENT_EMISSARY, and MailDraft::SendMailTo().

Referenced by StartScourgeInvasion().

◆ SendWorldstateUpdate()

void WorldState::SendWorldstateUpdate ( std::mutex &  mutex,
GuidVector const &  guids,
uint32  value,
uint32  worldStateId 
)
private
544{
545 std::lock_guard<std::mutex> guard(mutex);
546 for (ObjectGuid const& guid : guids)
547 if (Player* player = ObjectAccessor::FindPlayer(guid))
548 player->SendUpdateWorldState(worldStateId, value);
549}

References ObjectAccessor::FindPlayer().

Referenced by AddSunsReachProgress(), AddSunwellGateProgress(), HandleSunsReachPhaseTransition(), and HandleSunwellGateTransition().

◆ SetLastAttackZone()

void WorldState::SetLastAttackZone ( uint32  zoneId)
1519{
1520 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1521 m_siData.m_lastAttackZone = zoneId;
1522}

References ScourgeInvasionData::m_lastAttackZone, m_siData, and ScourgeInvasionData::m_siMutex.

◆ SetMouthGuid()

void WorldState::SetMouthGuid ( uint32  zoneId,
ObjectGuid  guid 
)
1847{
1848 m_siData.m_activeInvasions[zoneId].mouthGuid = guid;
1849}

References ScourgeInvasionData::m_activeInvasions, and m_siData.

◆ SetPallidGuid()

void WorldState::SetPallidGuid ( uint32  zoneId,
ObjectGuid  guid 
)
1842{
1843 m_siData.m_cityAttacks[zoneId].pallidGuid = guid;
1844}
std::map< uint32, CityAttack > m_cityAttacks
Definition WorldState.h:207

References ScourgeInvasionData::m_cityAttacks, and m_siData.

◆ SetScourgeInvasionState()

void WorldState::SetScourgeInvasionState ( SIState  state)
1249{
1250 SIState oldState = m_siData.m_state;
1251 if (oldState == state)
1252 return;
1253
1254 m_siData.m_state = state;
1255 if (oldState == STATE_0_DISABLED)
1257 else if (state == STATE_0_DISABLED)
1260}
void StopScourgeInvasion()
Definition WorldState.cpp:1437

References m_siData, ScourgeInvasionData::m_state, Save(), SAVE_ID_SCOURGE_INVASION, StartScourgeInvasion(), STATE_0_DISABLED, and StopScourgeInvasion().

◆ SetSIRemaining()

void WorldState::SetSIRemaining ( SIRemaining  remaining,
uint32  value 
)
1482{
1483 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1484 m_siData.m_remaining[remaining] = value;
1486}

References ScourgeInvasionData::m_remaining, m_siData, ScourgeInvasionData::m_siMutex, Save(), and SAVE_ID_SCOURGE_INVASION.

◆ SetSITimer()

void WorldState::SetSITimer ( SITimers  timer,
TimePoint  timePoint 
)
1494{
1495 m_siData.m_timers[timer] = timePoint;
1496}

References m_siData, and ScourgeInvasionData::m_timers.

◆ SetSunsReachCounter()

void WorldState::SetSunsReachCounter ( SunsReachCounters  index,
uint32  value 
)

◆ SetSunwellGateCounter()

void WorldState::SetSunwellGateCounter ( SunwellGateCounters  index,
uint32  value 
)

◆ setWorldState()

void WorldState::setWorldState ( uint32  index,
uint64  value 
)
162{
163 auto const& it = _worldstates.find(index);
164 if (it != _worldstates.end())
165 {
167 stmt->SetData(0, uint32(timeValue));
168 stmt->SetData(1, index);
169 CharacterDatabase.Execute(stmt);
170 }
171 else
172 {
174 stmt->SetData(0, index);
175 stmt->SetData(1, uint32(timeValue));
176 CharacterDatabase.Execute(stmt);
177 }
178
179 _worldstates[index] = timeValue;
180}
@ CHAR_INS_WORLDSTATE
Definition CharacterDatabase.h:307
@ CHAR_UPD_WORLDSTATE
Definition CharacterDatabase.h:306

References _worldstates, CHAR_INS_WORLDSTATE, CHAR_UPD_WORLDSTATE, CharacterDatabase, and PreparedStatementBase::SetData().

◆ StartNewCityAttack()

void WorldState::StartNewCityAttack ( uint32  zoneId)
1681{
1682 LOG_DEBUG("gameevent", "Scourge Invasion Event: Starting new City attack in zone {}.", zoneId);
1683
1685
1686 uint32 SpawnLocationID = urand(0, static_cast<uint32>(zone.pallid.size() - 1));
1687
1688 Map* map = GetMap(zone.map, zone.pallid[SpawnLocationID]);
1689
1690 // If any of the required maps are not available we return. Will cause the invasion to be started
1691 // on next update instead
1692 if (!map)
1693 {
1694 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime unable to access required map (%{}). Retrying next update.", zone.map);
1695 return;
1696 }
1697
1698 if (m_siData.m_pendingPallids.find(zoneId) != m_siData.m_pendingPallids.end())
1699 return;
1700
1701 if (map && SummonPallid(map, zone, zone.pallid[SpawnLocationID], SpawnLocationID))
1702 LOG_DEBUG("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime pallid spawned in {}.", zone.map);
1703 else
1704 LOG_DEBUG("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime unable to spawn pallid in {}.", zone.map);
1705}
bool SummonPallid(Map *map, ScourgeInvasionData::CityAttack &zone, const Position &position, uint32 spawnLoc)
Definition WorldState.cpp:1764
Definition WorldState.h:188

References GetMap(), LOG_DEBUG, LOG_ERROR, ScourgeInvasionData::m_cityAttacks, ScourgeInvasionData::m_pendingPallids, m_siData, ScourgeInvasionData::CityAttack::map, ScourgeInvasionData::CityAttack::pallid, SummonPallid(), and urand().

Referenced by StartNewCityAttackIfTime(), and StartZoneEvent().

◆ StartNewCityAttackIfTime()

void WorldState::StartNewCityAttackIfTime ( uint32  attackTimeVar,
uint32  zoneId 
)
1625{
1626 TimePoint now = std::chrono::steady_clock::now();
1627
1628 // Not yet time
1629 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1630 return;
1631
1632 StartNewCityAttack(zoneId);
1634 TimePoint next_attack = now + std::chrono::seconds(cityAttackTimer);
1635 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1636}
@ CITY_ATTACK_TIMER_MAX
Definition WorldState.h:172
@ CITY_ATTACK_TIMER_MIN
Definition WorldState.h:171
TimePoint GetSITimer(SITimers timer)
Definition WorldState.cpp:1488
void StartNewCityAttack(uint32 zoneId)
Definition WorldState.cpp:1680

References CITY_ATTACK_TIMER_MAX, CITY_ATTACK_TIMER_MIN, GetSITimer(), StartNewCityAttack(), sWorldState, and urand().

Referenced by StartScourgeInvasion(), and Update().

◆ StartNewInvasion()

void WorldState::StartNewInvasion ( uint32  zoneId)
1639{
1640 if (IsActiveZone(zoneId))
1641 return;
1642
1643 // Don't attack same zone as before.
1644 if (zoneId == sWorldState->GetLastAttackZone())
1645 return;
1646
1647 // If we have at least one victory and more than 1 active zones stop here.
1648 if (GetActiveZones() > 1 && sWorldState->GetBattlesWon() > 0)
1649 return;
1650
1651 LOG_DEBUG("gameevent", "Scourge Invasion Event: Starting new invasion in {}.", zoneId);
1652
1654
1655 Map* map = GetMap(zone.map, zone.mouth[0]);
1656
1657 if (!map)
1658 {
1659 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unable to access required map ({}). Retrying next update.", zone.map);
1660 return;
1661 }
1662
1663 switch (zoneId)
1664 {
1671 default:
1672 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unknown zoneId {}.", zoneId);
1673 return;
1674 }
1675
1676 if (map)
1677 SummonMouth(map, zone, zone.mouth[0], true);
1678}
@ GAME_EVENT_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldState.h:72
@ GAME_EVENT_SCOURGE_INVASION_AZSHARA
Definition WorldState.h:71
@ GAME_EVENT_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldState.h:74
@ GAME_EVENT_SCOURGE_INVASION_WINTERSPRING
Definition WorldState.h:69
@ GAME_EVENT_SCOURGE_INVASION_TANARIS
Definition WorldState.h:70
@ GAME_EVENT_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldState.h:73
bool IsActiveZone(uint32 zoneId)
Definition WorldState.cpp:1908

References AREA_AZSHARA, AREA_BLASTED_LANDS, AREA_BURNING_STEPPES, AREA_EASTERN_PLAGUELANDS, AREA_TANARIS, AREA_WINTERSPRING, GAME_EVENT_SCOURGE_INVASION_AZSHARA, GAME_EVENT_SCOURGE_INVASION_BLASTED_LANDS, GAME_EVENT_SCOURGE_INVASION_BURNING_STEPPES, GAME_EVENT_SCOURGE_INVASION_EASTERN_PLAGUELANDS, GAME_EVENT_SCOURGE_INVASION_TANARIS, GAME_EVENT_SCOURGE_INVASION_WINTERSPRING, GetActiveZones(), GetMap(), IsActiveZone(), LOG_DEBUG, LOG_ERROR, ScourgeInvasionData::m_activeInvasions, m_siData, ScourgeInvasionData::InvasionZone::map, ScourgeInvasionData::InvasionZone::mouth, sGameEventMgr, SummonMouth(), and sWorldState.

Referenced by StartNewInvasionIfTime(), and StartZoneEvent().

◆ StartNewInvasionIfTime()

void WorldState::StartNewInvasionIfTime ( uint32  attackTimeVar,
uint32  zoneId 
)
1614{
1615 TimePoint now = std::chrono::steady_clock::now();
1616
1617 // Not yet time
1618 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1619 return;
1620
1621 StartNewInvasion(zoneId);
1622}
void StartNewInvasion(uint32 zoneId)
Definition WorldState.cpp:1638

References GetSITimer(), and StartNewInvasion().

Referenced by HandleActiveZone(), and OnEnable().

◆ StartScourgeInvasion()

void WorldState::StartScourgeInvasion ( bool  sendMail)
1291{
1292 sGameEventMgr->StartEvent(GAME_EVENT_SCOURGE_INVASION, false);
1293
1294 if (sendMail)
1296
1299 {
1300 for (auto& zone : m_siData.m_cityAttacks)
1301 {
1302 if (zone.second.zoneId == AREA_UNDERCITY)
1303 StartNewCityAttackIfTime(SI_TIMER_UNDERCITY, zone.second.zoneId);
1304 else if (zone.second.zoneId == AREA_STORMWIND_CITY)
1305 StartNewCityAttackIfTime(SI_TIMER_STORMWIND, zone.second.zoneId);
1306 }
1307
1308 // randomization of init so that not every invasion starts the same way
1309 std::vector<uint32> randomIds;
1310 randomIds.reserve(m_siData.m_activeInvasions.size());
1311 for (auto const& [zoneId, _] : m_siData.m_activeInvasions)
1312 randomIds.push_back(zoneId);
1314 for (uint32 id : randomIds)
1315 OnEnable(m_siData.m_activeInvasions[id]);
1316
1318 }
1319}
@ AREA_UNDERCITY
Definition AreaDefines.h:80
@ AREA_STORMWIND_CITY
Definition AreaDefines.h:81
@ GAME_EVENT_SCOURGE_INVASION
Definition WorldState.h:67
@ GAME_EVENT_SCOURGE_INVASION_BOSSES
Definition WorldState.h:68
void StartNewCityAttackIfTime(uint32 attackTimeVar, uint32 zoneId)
Definition WorldState.cpp:1624
void SendScourgeInvasionMail()
Definition WorldState.cpp:1262
void BroadcastSIWorldstates()
Definition WorldState.cpp:1524
void OnEnable(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1875
void RandomShuffle(C &container)
Definition Containers.h:230

References AREA_STORMWIND_CITY, AREA_UNDERCITY, BroadcastSIWorldstates(), GAME_EVENT_SCOURGE_INVASION, GAME_EVENT_SCOURGE_INVASION_BOSSES, ScourgeInvasionData::m_activeInvasions, ScourgeInvasionData::m_cityAttacks, m_siData, ScourgeInvasionData::m_state, OnEnable(), Acore::Containers::RandomShuffle(), SendScourgeInvasionMail(), sGameEventMgr, SI_TIMER_STORMWIND, SI_TIMER_UNDERCITY, StartNewCityAttackIfTime(), and STATE_1_ENABLED.

Referenced by Load(), and SetScourgeInvasionState().

◆ StartSunsReachPhase()

void WorldState::StartSunsReachPhase ( bool  initial = false)
private
917{
918 switch (m_sunsReachData.m_phase)
919 {
922 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
923 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
924 break;
928 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
929 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.5f);
930 break;
932 if (initial)
935 // TODO: Should be id 2 0.25f?
936 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
937 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.25f);
938 break;
940 if (initial)
941 {
944 }
946 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
947 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_FINE, 0.0f);
948 break;
949 default: break;
950 }
951}
@ MAP_OUTLAND
Definition AreaDefines.h:216
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY
Definition WorldState.h:94
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT
Definition WorldState.h:91
@ GAME_EVENT_QUEL_DANAS_PHASE_4
Definition WorldState.h:98
@ GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT
Definition WorldState.h:95
@ GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY
Definition WorldState.h:90
@ GAME_EVENT_QUEL_DANAS_PHASE_1
Definition WorldState.h:89
@ WEATHER_STATE_MEDIUM_RAIN
Definition Weather.h:49
@ WEATHER_STATE_FINE
Definition Weather.h:46
@ WEATHER_STATE_LIGHT_RAIN
Definition Weather.h:48

References AREA_ISLE_OF_QUEL_DANAS, GAME_EVENT_QUEL_DANAS_PHASE_1, GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY, GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT, GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY, GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT, GAME_EVENT_QUEL_DANAS_PHASE_4, SunsReachReclamationData::m_phase, m_sunsReachData, MAP_OUTLAND, sGameEventMgr, sMapMgr, SUNS_REACH_PHASE_1_STAGING_AREA, SUNS_REACH_PHASE_2_SANCTUM, SUNS_REACH_PHASE_3_ARMORY, SUNS_REACH_PHASE_4_HARBOR, WEATHER_STATE_FINE, WEATHER_STATE_LIGHT_RAIN, and WEATHER_STATE_MEDIUM_RAIN.

Referenced by HandleSunsReachPhaseTransition(), and Load().

◆ StartSunwellGatePhase()

void WorldState::StartSunwellGatePhase ( )
private
1205{
1206 switch (m_sunsReachData.m_gate)
1207 {
1212 default: break;
1213 }
1214}
@ GAME_EVENT_SWP_GATES_PHASE_1
Definition WorldState.h:106
@ GAME_EVENT_SWP_GATES_PHASE_3
Definition WorldState.h:108
@ GAME_EVENT_SWP_GATES_PHASE_0
Definition WorldState.h:105
@ GAME_EVENT_SWP_GATES_PHASE_2
Definition WorldState.h:107

References GAME_EVENT_SWP_GATES_PHASE_0, GAME_EVENT_SWP_GATES_PHASE_1, GAME_EVENT_SWP_GATES_PHASE_2, GAME_EVENT_SWP_GATES_PHASE_3, SunsReachReclamationData::m_gate, m_sunsReachData, sGameEventMgr, SUNWELL_AGAMATH_GATE1_OPEN, SUNWELL_ALL_GATES_CLOSED, SUNWELL_ARCHONISUS_GATE3_OPEN, and SUNWELL_ROHENDOR_GATE2_OPEN.

Referenced by HandleSunwellGateTransition(), and Load().

◆ StartZoneEvent()

void WorldState::StartZoneEvent ( SIZoneIds  eventId)
1597{
1598 switch (eventId)
1599 {
1608 default:
1609 break;
1610 }
1611}
@ SI_ZONE_EASTERN_PLAGUELANDS
Definition WorldState.h:135
@ SI_ZONE_WINTERSPRING
Definition WorldState.h:137
@ SI_ZONE_UNDERCITY
Definition WorldState.h:139
@ SI_ZONE_AZSHARA
Definition WorldState.h:132
@ SI_ZONE_TANARIS
Definition WorldState.h:136
@ SI_ZONE_BLASTED_LANDS
Definition WorldState.h:133
@ SI_ZONE_BURNING_STEPPES
Definition WorldState.h:134
@ SI_ZONE_STORMWIND
Definition WorldState.h:138

References AREA_AZSHARA, AREA_BLASTED_LANDS, AREA_BURNING_STEPPES, AREA_EASTERN_PLAGUELANDS, AREA_STORMWIND_CITY, AREA_TANARIS, AREA_UNDERCITY, AREA_WINTERSPRING, SI_ZONE_AZSHARA, SI_ZONE_BLASTED_LANDS, SI_ZONE_BURNING_STEPPES, SI_ZONE_EASTERN_PLAGUELANDS, SI_ZONE_STORMWIND, SI_ZONE_TANARIS, SI_ZONE_UNDERCITY, SI_ZONE_WINTERSPRING, StartNewCityAttack(), and StartNewInvasion().

◆ StopScourgeInvasion()

void WorldState::StopScourgeInvasion ( )
1438{
1449 m_siData.Reset();
1450
1451 for (auto& [_, cityData] : m_siData.m_cityAttacks)
1452 OnDisable(cityData);
1453
1454 for (auto& [_, zoneData] : m_siData.m_activeInvasions)
1455 OnDisable(zoneData);
1456}
void OnDisable(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1886

References BroadcastSIWorldstates(), GAME_EVENT_SCOURGE_INVASION, GAME_EVENT_SCOURGE_INVASION_AZSHARA, GAME_EVENT_SCOURGE_INVASION_BLASTED_LANDS, GAME_EVENT_SCOURGE_INVASION_BOSSES, GAME_EVENT_SCOURGE_INVASION_BURNING_STEPPES, GAME_EVENT_SCOURGE_INVASION_EASTERN_PLAGUELANDS, GAME_EVENT_SCOURGE_INVASION_INVASIONS_DONE, GAME_EVENT_SCOURGE_INVASION_TANARIS, GAME_EVENT_SCOURGE_INVASION_WINTERSPRING, ScourgeInvasionData::m_activeInvasions, ScourgeInvasionData::m_cityAttacks, m_siData, OnDisable(), ScourgeInvasionData::Reset(), and sGameEventMgr.

Referenced by SetScourgeInvasionState().

◆ StopSunsReachPhase()

◆ StopSunwellGatePhase()

◆ SummonMouth()

bool WorldState::SummonMouth ( Map map,
ScourgeInvasionData::InvasionZone zone,
Position  position,
bool  newInvasion 
)
1738{
1740 // Remove old mouth if required.
1741 if (Creature* existingMouth = map->GetCreature(zone.mouthGuid))
1742 existingMouth->AddObjectToRemoveList();
1743
1744 if (Creature* mouth = map->SummonCreature(NPC_HERALD_OF_THE_LICH_KING, position))
1745 {
1746 mouth->GetAI()->DoAction(EVENT_HERALD_OF_THE_LICH_KING_ZONE_START);
1747 sWorldState->SetMouthGuid(zone.zoneId, mouth->GetGUID());
1748 if (newInvasion)
1749 sWorldState->SetSIRemaining(SIRemaining(zone.remainingNecropoli), zone.necropolisCount);
1750 }
1751 sWorldState->RemovePendingInvasion(zone.zoneId);
1752
1753 return true;
1754}
@ NPC_HERALD_OF_THE_LICH_KING
Definition WorldState.h:117
@ EVENT_HERALD_OF_THE_LICH_KING_ZONE_START
Definition WorldState.h:113
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, bool visibleBySummonerOnly=false)
Definition Object.cpp:2140
void AddPendingInvasion(uint32 zoneId)
Definition WorldState.cpp:1851
uint32 necropolisCount
Definition WorldState.h:181

References AddPendingInvasion(), EVENT_HERALD_OF_THE_LICH_KING_ZONE_START, Map::GetCreature(), ScourgeInvasionData::InvasionZone::mouthGuid, ScourgeInvasionData::InvasionZone::necropolisCount, NPC_HERALD_OF_THE_LICH_KING, ScourgeInvasionData::InvasionZone::remainingNecropoli, Map::SummonCreature(), sWorldState, and ScourgeInvasionData::InvasionZone::zoneId.

Referenced by ResumeInvasion(), and StartNewInvasion().

◆ SummonPallid()

bool WorldState::SummonPallid ( Map map,
ScourgeInvasionData::CityAttack zone,
const Position position,
uint32  spawnLoc 
)
1765{
1767 // Remove old pallid if required.
1768 uint32 pathID = 0;
1769 if (Creature* existingPallid = map->GetCreature(zone.pallidGuid))
1770 existingPallid->AddObjectToRemoveList();
1771
1772 // if (Creature* pallid = map->SummonCreature(RAND(NPC_PALLID_HORROR, NPC_PATCHWORK_TERROR), position))
1773 if (Creature* pallid = map->SummonCreature(NPC_PALLID_HORROR, position))
1774 {
1775 pallid->GetMotionMaster()->Clear(false);
1776 if (pallid->GetZoneId() == AREA_UNDERCITY)
1778 else
1779 pathID = spawnLoc == 0 ? PATH_STORMWIND_KEEP : PATH_STORMWIND_TRADE_DISTRICT;
1780
1781 pallid->GetMotionMaster()->MovePath(pathID, false);
1782
1783 sWorldState->SetPallidGuid(zone.zoneId, pallid->GetGUID());
1784 }
1785 sWorldState->RemovePendingPallid(zone.zoneId);
1786
1787 return true;
1788}
@ PATH_STORMWIND_TRADE_DISTRICT
Definition WorldState.cpp:1759
@ PATH_UNDERCITY_TRADE_QUARTER
Definition WorldState.cpp:1760
@ PATH_UNDERCITY_ROYAL_QUARTER
Definition WorldState.cpp:1761
@ PATH_STORMWIND_KEEP
Definition WorldState.cpp:1758
@ NPC_PALLID_HORROR
Definition WorldState.h:115
void AddPendingPallid(uint32 zoneId)
Definition WorldState.cpp:1863
uint32 zoneId
Definition WorldState.h:190

References AddPendingPallid(), AREA_UNDERCITY, Map::GetCreature(), NPC_PALLID_HORROR, ScourgeInvasionData::CityAttack::pallidGuid, PATH_STORMWIND_KEEP, PATH_STORMWIND_TRADE_DISTRICT, PATH_UNDERCITY_ROYAL_QUARTER, PATH_UNDERCITY_TRADE_QUARTER, Map::SummonCreature(), sWorldState, and ScourgeInvasionData::CityAttack::zoneId.

Referenced by StartNewCityAttack().

◆ Update()

void WorldState::Update ( uint32  diff)
306{
308 {
309 if (_adalSongOfBattleTimer <= diff)
310 {
313 }
314 else
315 {
317 }
318 }
319
321 {
322 if (m_siData.m_broadcastTimer <= diff)
323 {
326
328 {
329 for (auto& zone : m_siData.m_cityAttacks)
330 {
331 if (zone.second.zoneId == AREA_UNDERCITY)
332 StartNewCityAttackIfTime(SI_TIMER_UNDERCITY, zone.second.zoneId);
333 else if (zone.second.zoneId == AREA_STORMWIND_CITY)
334 StartNewCityAttackIfTime(SI_TIMER_STORMWIND, zone.second.zoneId);
335 }
336
337 TimePoint now = std::chrono::steady_clock::now();
338 for (auto& zone : m_siData.m_activeInvasions)
339 HandleActiveZone(GetTimerIdForZone(zone.second.zoneId), zone.second.zoneId, zone.second.remainingNecropoli, now);
340 }
341 }
342 else
344 }
345}
void DispelAdalsSongOfBattle()
Definition WorldState.cpp:516
void HandleActiveZone(uint32 attackTimeVar, uint32 zoneId, uint32 remainingVar, TimePoint now)
Definition WorldState.cpp:1790
uint64 m_broadcastTimer
Definition WorldState.h:201

References _adalSongOfBattleTimer, AREA_STORMWIND_CITY, AREA_UNDERCITY, BroadcastSIWorldstates(), DispelAdalsSongOfBattle(), GetTimerIdForZone(), HandleActiveZone(), ScourgeInvasionData::m_activeInvasions, ScourgeInvasionData::m_broadcastTimer, ScourgeInvasionData::m_cityAttacks, m_siData, ScourgeInvasionData::m_state, SI_TIMER_STORMWIND, SI_TIMER_UNDERCITY, StartNewCityAttackIfTime(), STATE_0_DISABLED, and STATE_1_ENABLED.

Member Data Documentation

◆ _adalSongOfBattleTimer

uint32 WorldState::_adalSongOfBattleTimer
private

◆ _isMagtheridonHeadSpawnedAlliance

bool WorldState::_isMagtheridonHeadSpawnedAlliance
private

◆ _isMagtheridonHeadSpawnedHorde

bool WorldState::_isMagtheridonHeadSpawnedHorde
private

◆ _mutex

std::mutex WorldState::_mutex
private

◆ _transportStates

std::map<uint32, std::atomic<WorldStateConditionState> > WorldState::_transportStates
private

◆ _worldstates

WorldStatesMap WorldState::_worldstates
private

◆ m_siData

◆ m_sunsReachData


The documentation for this class was generated from the following files: