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 ( )
38{
42}
@ 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:325
bool _isMagtheridonHeadSpawnedAlliance
Definition WorldState.h:323
bool _isMagtheridonHeadSpawnedHorde
Definition WorldState.h:322

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
45{
46}

Member Function Documentation

◆ AddBattlesWon()

void WorldState::AddBattlesWon ( int32  count)
1495{
1496 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1497 m_siData.m_battlesWon += count;
1500}
@ SAVE_ID_SCOURGE_INVASION
Definition WorldState.h:60
ScourgeInvasionData m_siData
Definition WorldState.h:373
void Save(WorldStateSaveIds saveId)
Definition WorldState.cpp:187
void HandleDefendedZones()
Definition WorldState.cpp:1558
std::mutex m_siMutex
Definition WorldState.h:201
uint32 m_battlesWon
Definition WorldState.h:197

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

◆ AddPendingInvasion()

void WorldState::AddPendingInvasion ( uint32  zoneId)
1839{
1840 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1841 m_siData.m_pendingInvasions.insert(zoneId);
1842}
std::set< uint32 > m_pendingInvasions
Definition WorldState.h:203

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

Referenced by SummonMouth().

◆ AddPendingPallid()

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

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

Referenced by SummonPallid().

◆ AddSunsReachProgress()

void WorldState::AddSunsReachProgress ( uint32  questId)
567{
568 uint32 counter = 0;
569 int32 otherCounter = -1;
570 int32 worldState = 0;
571 uint32 subPhaseMask = 0;
572 uint32 addedValue = 1;
573 switch (questId)
574 {
576 counter = COUNTER_ERRATIC_BEHAVIOR;
577 otherCounter = COUNTER_SANCTUM_WARDS;
579 break;
581 counter = COUNTER_SANCTUM_WARDS;
582 otherCounter = COUNTER_ERRATIC_BEHAVIOR;
584 break;
589 break;
594 break;
597 subPhaseMask = SUBPHASE_PORTAL;
599 break;
602 otherCounter = COUNTER_TAKING_THE_HARBOR;
604 break;
609 break;
611 counter = COUNTER_MAKING_READY;
612 subPhaseMask = SUBPHASE_ANVIL;
613 worldState = WORLD_STATE_QUEL_DANAS_ANVIL;
614 break;
617 subPhaseMask = SUBPHASE_ALCHEMY_LAB;
619 break;
622 subPhaseMask = SUBPHASE_MONUMENT;
624 break;
627 subPhaseMask = SUBPHASE_MONUMENT;
629 addedValue = 150;
630 break;
631 default:
632 return;
633 }
634
635 uint32 previousValue = 0;
636 uint32 newValue = 0;
637
638 if (!subPhaseMask)
640 else
641 previousValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
642 m_sunsReachData.m_sunsReachReclamationCounters[counter] += addedValue;
643 if (!subPhaseMask)
645 else
646 newValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
647 if (previousValue != newValue)
649
650 bool save = true;
652 uint32 modifier = 1;
653 if (otherCounter != -1)
654 {
655 modifier = 2;
656 counterValue += m_sunsReachData.m_sunsReachReclamationCounters[otherCounter];
657 }
658 if (counterValue >= sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX) * modifier)
659 {
660 save = false;
661 switch (questId)
662 {
665 {
668 break;
669 }
672 {
675 break;
676 }
678 {
681 break;
682 }
685 {
688 break;
689 }
691 {
694 break;
695 }
697 {
700 break;
701 }
704 {
707 break;
708 }
709 }
710 }
711 if (save)
713}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_SUNSREACH_COUNTER_MAX
Definition WorldConfig.h:379
@ 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:552
@ QUEST_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.cpp:556
@ QUEST_SANCTUM_WARDS
Definition WorldState.cpp:553
@ QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.cpp:554
@ QUEST_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.cpp:557
@ QUEST_MAKING_READY
Definition WorldState.cpp:559
@ QUEST_A_MAGNANIMOUS_BENEFACTOR
Definition WorldState.cpp:562
@ QUEST_DISCOVERING_YOUR_ROOTS
Definition WorldState.cpp:560
@ QUEST_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.cpp:555
@ QUEST_TAKING_THE_HARBOR
Definition WorldState.cpp:558
@ QUEST_A_CHARITABLE_DONATION
Definition WorldState.cpp:561
@ SUBPHASE_ALCHEMY_LAB
Definition WorldState.h:226
@ SUBPHASE_ANVIL
Definition WorldState.h:225
@ SUBPHASE_MONUMENT
Definition WorldState.h:227
@ SUBPHASE_PORTAL
Definition WorldState.h:224
@ SUNS_REACH_PHASE_3_ARMORY
Definition WorldState.h:218
@ SUNS_REACH_PHASE_2_SANCTUM
Definition WorldState.h:217
@ SUNS_REACH_PHASE_1_STAGING_AREA
Definition WorldState.h:216
@ SUNS_REACH_PHASE_4_HARBOR
Definition WorldState.h:219
@ COUNTER_ERRATIC_BEHAVIOR
Definition WorldState.h:233
@ COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.h:235
@ COUNTER_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.h:237
@ COUNTER_MAKING_READY
Definition WorldState.h:240
@ COUNTER_TAKING_THE_HARBOR
Definition WorldState.h:239
@ COUNTER_A_CHARITABLE_DONATION
Definition WorldState.h:242
@ COUNTER_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.h:238
@ COUNTER_DISCOVERING_YOUR_ROOTS
Definition WorldState.h:241
@ COUNTER_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.h:236
@ COUNTER_SANCTUM_WARDS
Definition WorldState.h:234
@ SAVE_ID_QUEL_DANAS
Definition WorldState.h:61
void HandleSunsReachPhaseTransition(uint32 newPhase)
Definition WorldState.cpp:715
void SendWorldstateUpdate(std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
Definition WorldState.cpp:542
SunsReachReclamationData m_sunsReachData
Definition WorldState.h:324
void HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool initial=false)
Definition WorldState.cpp:747
#define sWorld
Definition World.h:320
uint32 m_subphaseMask
Definition WorldState.h:264
std::mutex m_sunsReachReclamationMutex
Definition WorldState.h:267
uint32 m_sunsReachReclamationCounters[COUNTERS_MAX]
Definition WorldState.h:265
uint32 GetPhasePercentage(uint32 phase)
Definition WorldState.cpp:1110
uint32 m_phase
Definition WorldState.h:263
GuidVector m_sunsReachReclamationPlayers
Definition WorldState.h:266
uint32 GetSubPhasePercentage(uint32 subPhase)
Definition WorldState.cpp:1121

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)
1143{
1144 uint32 counter = 0;
1145 int32 worldState = 0;
1146 uint32 addedValue = 1;
1147 switch (questId)
1148 {
1152 break;
1153 default: return;
1154 }
1155 switch (m_sunsReachData.m_gate)
1156 {
1160 default: return;
1161 }
1163 uint32 newValue = 0;
1164 m_sunsReachData.m_gateCounters[counter] += addedValue;
1166 if (previousValue != newValue)
1168 bool save = true;
1170 {
1171 save = false;
1172 switch (questId)
1173 {
1175 {
1178 break;
1179 }
1181 {
1184 break;
1185 }
1187 {
1190 break;
1191 }
1192 }
1193 }
1194 if (save)
1196}
@ 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:1136
@ QUEST_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.cpp:1138
@ QUEST_ROHENDOR_THE_SECOND_GATE
Definition WorldState.cpp:1137
@ COUNTER_MAX_VAL_REQ_SWP_GATES
Definition WorldState.cpp:1139
@ SUNWELL_ARCHONISUS_GATE3_OPEN
Definition WorldState.h:251
@ SUNWELL_ALL_GATES_CLOSED
Definition WorldState.h:248
@ SUNWELL_AGAMATH_GATE1_OPEN
Definition WorldState.h:249
@ SUNWELL_ROHENDOR_GATE2_OPEN
Definition WorldState.h:250
@ COUNTER_ROHENDOR_THE_SECOND_GATE
Definition WorldState.h:256
@ COUNTER_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.h:257
@ COUNTER_AGAMATH_THE_FIRST_GATE
Definition WorldState.h:255
void HandleSunwellGateTransition(uint32 newGate)
Definition WorldState.cpp:868
uint32 m_gate
Definition WorldState.h:268
uint32 m_gateCounters[COUNTERS_MAX_GATES]
Definition WorldState.h:269
uint32 GetSunwellGatePercentage(uint32 gate)
Definition WorldState.cpp:1227

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 ( )
1515{
1516 uint32 victories = GetBattlesWon();
1517
1518 uint32 remainingAzshara = GetSIRemaining(SI_REMAINING_AZSHARA);
1519 uint32 remainingBlastedLands = GetSIRemaining(SI_REMAINING_BLASTED_LANDS);
1520 uint32 remainingBurningSteppes = GetSIRemaining(SI_REMAINING_BURNING_STEPPES);
1521 uint32 remainingEasternPlaguelands = GetSIRemaining(SI_REMAINING_EASTERN_PLAGUELANDS);
1522 uint32 remainingTanaris = GetSIRemaining(SI_REMAINING_TANARIS);
1523 uint32 remainingWinterspring = GetSIRemaining(SI_REMAINING_WINTERSPRING);
1524
1525 sMapMgr->DoForAllMaps([&](Map* map) -> void
1526 {
1527 switch (map->GetId())
1528 {
1529 case MAP_EASTERN_KINGDOMS:
1530 case MAP_KALIMDOR:
1531 map->DoForAllPlayers([&](Player* pl)
1532 {
1533 // do not process players which are not in world
1534 if (!pl->IsInWorld())
1535 return;
1536
1537 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_AZSHARA, remainingAzshara > 0 ? 1 : 0);
1538 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, remainingBlastedLands > 0 ? 1 : 0);
1539 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, remainingBurningSteppes > 0 ? 1 : 0);
1540 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, remainingEasternPlaguelands > 0 ? 1 : 0);
1541 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_TANARIS, remainingTanaris > 0 ? 1 : 0);
1542 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, remainingWinterspring > 0 ? 1 : 0);
1543
1544 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_VICTORIES, victories);
1545 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, remainingAzshara);
1546 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, remainingBlastedLands);
1547 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, remainingBurningSteppes);
1548 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, remainingEasternPlaguelands);
1549 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, remainingTanaris);
1550 pl->SendUpdateWorldState(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, remainingWinterspring);
1551 });
1552 default:
1553 break;
1554 }
1555 });
1556}
#define sMapMgr
Definition MapMgr.h:220
@ SI_REMAINING_BURNING_STEPPES
Definition WorldState.h:158
@ SI_REMAINING_EASTERN_PLAGUELANDS
Definition WorldState.h:159
@ SI_REMAINING_TANARIS
Definition WorldState.h:160
@ SI_REMAINING_BLASTED_LANDS
Definition WorldState.h:157
@ SI_REMAINING_AZSHARA
Definition WorldState.h:156
@ SI_REMAINING_WINTERSPRING
Definition WorldState.h:161
Definition Map.h:158
uint32 GetId() const
Definition Map.h:224
uint32 GetBattlesWon()
Definition WorldState.cpp:1488
uint32 GetSIRemaining(SIRemaining remaining) const
Definition WorldState.cpp:1448

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
489{
490 sMapMgr->DoForAllMaps([&](Map* map) -> void
491 {
492 switch (map->GetId())
493 {
494 case MAP_OUTLAND:
495 map->DoForAllPlayers([&](Player* player)
496 {
497 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
498 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
499 });
500 break;
504 map->DoForAllPlayers([&](Player* player)
505 {
506 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
507 });
508 break;
509 default:
510 break;
511 }
512 });
513}
@ 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:2901
Definition Player.h:1083
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:1193

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
423{
424 sMapMgr->DoForAllMaps([&](Map* map) -> void
425 {
426 switch (map->GetId())
427 {
428 case MAP_OUTLAND:
429 map->DoForAllPlayers([&](Player* player)
430 {
431 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
432 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
433 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
434 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
435 });
436 break;
441 map->DoForAllPlayers([&](Player* player)
442 {
443 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
444 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
445 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
446 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
447 });
448 break;
449 default:
450 break;
451 }
452 });
453}
@ 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:760
@ TEAM_HORDE
Definition SharedDefines.h:761
@ SPELL_NAZGRELS_FAVOR
Definition WorldState.h:53
@ SPELL_TROLLBANES_COMMAND
Definition WorldState.h:52
TeamId GetTeamId(bool original=false) const
Definition Player.h:2127

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
516{
517 sMapMgr->DoForAllMaps([&](Map* map) -> void
518 {
519 switch (map->GetId())
520 {
521 case MAP_OUTLAND:
522 map->DoForAllPlayers([&](Player* player)
523 {
524 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
525 player->RemoveAurasDueToSpell(SPELL_ADAL_SONG_OF_BATTLE);
526 });
527 break;
531 map->DoForAllPlayers([&](Player* player)
532 {
534 });
535 break;
536 default:
537 break;
538 }
539 });
540}
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4965

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
456{
457 sMapMgr->DoForAllMaps([&](Map* map) -> void
458 {
459 switch (map->GetId())
460 {
461 case MAP_OUTLAND:
462 map->DoForAllPlayers([&](Player* player)
463 {
464 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
465 player->RemoveAurasDueToSpell(SPELL_TROLLBANES_COMMAND);
466 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
467 player->RemoveAurasDueToSpell(SPELL_NAZGRELS_FAVOR);
468 });
469 break;
474 map->DoForAllPlayers([&](Player* player)
475 {
476 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
478 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
480 });
481 break;
482 default:
483 break;
484 }
485 });
486}

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   
)
1939{
1940 if (m_siData.m_state != STATE_0_DISABLED) // scourge invasion active - need to send all worldstates
1941 {
1942 uint32 victories = GetBattlesWon();
1943
1944 uint32 remainingAzshara = GetSIRemaining(SI_REMAINING_AZSHARA);
1945 uint32 remainingBlastedLands = GetSIRemaining(SI_REMAINING_BLASTED_LANDS);
1946 uint32 remainingBurningSteppes = GetSIRemaining(SI_REMAINING_BURNING_STEPPES);
1947 uint32 remainingEasternPlaguelands = GetSIRemaining(SI_REMAINING_EASTERN_PLAGUELANDS);
1948 uint32 remainingTanaris = GetSIRemaining(SI_REMAINING_TANARIS);
1949 uint32 remainingWinterspring = GetSIRemaining(SI_REMAINING_WINTERSPRING);
1950
1951 packet.Worldstates.reserve(13);
1952 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_AZSHARA, remainingAzshara > 0 ? 1 : 0);
1953 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, remainingBlastedLands > 0 ? 1 : 0);
1954 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, remainingBurningSteppes > 0 ? 1 : 0);
1955 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, remainingEasternPlaguelands > 0 ? 1 : 0);
1956 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_TANARIS, remainingTanaris > 0 ? 1 : 0);
1957 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, remainingWinterspring > 0 ? 1 : 0);
1958 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_VICTORIES, victories);
1959 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, remainingAzshara);
1960 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, remainingBlastedLands);
1961 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, remainingBurningSteppes);
1962 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, remainingEasternPlaguelands);
1963 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, remainingTanaris);
1964 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, remainingWinterspring);
1965 }
1966
1967 switch (zoneId)
1968 {
1973 {
1974 // Sunwell Reclamation
1975 switch (m_sunsReachData.m_phase)
1976 {
1979 break;
1982 break;
1985 break;
1991 break;
1992 }
1998
1999 // Sunwell Gates
2000 switch (m_sunsReachData.m_gate)
2001 {
2004 break;
2007 break;
2010 break;
2011 }
2012 break;
2013 }
2014 default:
2015 break;
2016 }
2017}
@ 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:124
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
SIState m_state
Definition WorldState.h:194

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 ( )
1902{
1903 size_t i = m_siData.m_pendingInvasions.size();
1904 for (auto const& [zoneId, invasionData] : m_siData.m_activeInvasions)
1905 {
1906 Map* map = GetMap(invasionData.map, invasionData.mouth[0]);
1907 if (!map)
1908 {
1909 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetActiveZones no map for zone {}.", invasionData.map);
1910 continue;
1911 }
1912
1913 Creature* mouth = map->GetCreature(invasionData.mouthGuid);
1914 if (mouth)
1915 i++;
1916 }
1917 return i;
1918}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
Definition Creature.h:43
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2389
Map * GetMap(uint32 mapId, Position const &invZone)
Definition WorldState.cpp:251

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

Referenced by HandleActiveZone(), and StartNewInvasion().

◆ GetBattlesWon()

uint32 WorldState::GetBattlesWon ( )
1489{
1490 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1491 return m_siData.m_battlesWon;
1492}

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

Referenced by BroadcastSIWorldstates(), and FillInitialWorldStates().

◆ GetLastAttackZone()

uint32 WorldState::GetLastAttackZone ( )
1503{
1504 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1506}
uint32 m_lastAttackZone
Definition WorldState.h:198

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

◆ GetMap()

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

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

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

◆ GetScourgeInvasionPrintout()

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

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
1454{
1455 SIRemaining remainingId;
1456 switch (zoneId)
1457 {
1458 case AREA_WINTERSPRING: remainingId = SI_REMAINING_WINTERSPRING; break;
1459 case AREA_AZSHARA: remainingId = SI_REMAINING_AZSHARA; break;
1461 case AREA_BLASTED_LANDS: remainingId = SI_REMAINING_BLASTED_LANDS; break;
1462 case AREA_BURNING_STEPPES: remainingId = SI_REMAINING_BURNING_STEPPES; break;
1463 case AREA_TANARIS: remainingId = SI_REMAINING_TANARIS; break;
1464 default:
1465 LOG_ERROR("WorldState", "GetSIRemainingByZone called with invalid zone ID: {}", zoneId);
1466 return 0;
1467 }
1468 return GetSIRemaining(remainingId);
1469}
@ 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)
1479{
1480 return m_siData.m_timers[timer];
1481}

References m_siData, and ScourgeInvasionData::m_timers.

Referenced by StartNewCityAttackIfTime(), and StartNewInvasionIfTime().

◆ GetSunsReachPrintout()

std::string WorldState::GetSunsReachPrintout ( )
953{
954 auto formatPhase = [this]() -> std::string {
955 std::string name;
956 switch (m_sunsReachData.m_phase)
957 {
958 case SUNS_REACH_PHASE_1_STAGING_AREA: name = "Phase 1: Staging Area"; break;
959 case SUNS_REACH_PHASE_2_SANCTUM: name = "Phase 2: Sanctum"; break;
960 case SUNS_REACH_PHASE_3_ARMORY: name = "Phase 3: Armory"; break;
961 case SUNS_REACH_PHASE_4_HARBOR: name = "Phase 4: Harbor"; break;
962 default: name = "Unknown"; break;
963 }
964 return "Phase: " + std::to_string(m_sunsReachData.m_phase) + " (" + name + ") " + std::to_string(m_sunsReachData.GetPhasePercentage(m_sunsReachData.m_phase)) + "%\n";
965 };
966
967 auto formatSubPhase = [this](uint32 subPhase) -> std::string {
968 std::string name;
969 switch (subPhase)
970 {
971 case SUBPHASE_PORTAL: name = "Portal"; break;
972 case SUBPHASE_ANVIL: name = "Anvil"; break;
973 case SUBPHASE_ALCHEMY_LAB: name = "Alchemy Lab"; break;
974 case SUBPHASE_MONUMENT: name = "Monument"; break;
975 default: name = "Unknown"; break;
976 }
977 return name + ": " + (m_sunsReachData.m_subphaseMask & subPhase ? "100%" : std::to_string(m_sunsReachData.GetSubPhasePercentage(subPhase)) + "%");
978 };
979
980 auto formatCounter = [](uint32 counter, uint32 value) -> std::string {
981 switch (counter)
982 {
984 return "Erratic Behavior: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
986 return "Sanctum Wards: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
988 return "Battle for the Sun's Reach Armory: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
990 return "Distraction at the Dead Scar: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
992 return "Intercepting the Mana Cells: " + std::to_string(value) + " (counts towards Subphase: Portal)";
994 return "Intercept the Reinforcements: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
996 return "Taking the Harbor: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
998 return "Making Ready: " + std::to_string(value) + " (counts towards Subphase: Anvil)";
1000 return "Discovering Your Roots: " + std::to_string(value) + " (counts towards Subphase: Alchemy Lab)";
1002 return "A Charitable Donation: " + std::to_string(value) + " (counts towards Subphase: Monument)";
1003 default:
1004 return "Unknown: " + std::to_string(value) + " (Unknown goal)";
1005 }
1006 };
1007
1008 std::string output = formatPhase();
1009 output += "Subphase mask: " + std::to_string(m_sunsReachData.m_subphaseMask) + "\n";
1010 for (uint32 i = 0; i < 4; ++i)
1011 {
1012 uint32 subPhaseMask = 1 << i;
1013 output += " " + formatSubPhase(subPhaseMask) + "\n";
1014 }
1015 output += "Counters:\n";
1016 output += " Sunsreach.CounterMax = " + std::to_string(sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX)) + "\n";
1017 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
1018 output += " " + std::to_string(i) + ". " + formatCounter(i, m_sunsReachData.m_sunsReachReclamationCounters[i]) + "\n";
1019
1020 // Sunwell Gates
1021 auto formatGatePhase = [](uint32 gate) -> std::string {
1022 switch (gate)
1023 {
1024 case SUNWELL_ALL_GATES_CLOSED: return "All Gates Closed"; break;
1025 case SUNWELL_AGAMATH_GATE1_OPEN: return "Gate 1 Agamath Open"; break;
1026 case SUNWELL_ROHENDOR_GATE2_OPEN: return "Gate 2 Rohendar Open"; break;
1027 case SUNWELL_ARCHONISUS_GATE3_OPEN: return "Gate 3 Archonisus Open"; break;
1028 default: return "Unknown"; break;
1029 }
1030 };
1031 output += "Sunwell Plateau Gate Phase " + std::to_string(m_sunsReachData.m_gate) + " (" + formatGatePhase(m_sunsReachData.m_gate) + ")" + ":\n";
1032 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";
1033 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";
1034 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";
1035 return output;
1036}
@ COUNTERS_MAX
Definition WorldState.h:243
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)
1921{
1922 uint32 attackTime = 0;
1923 switch (zoneId)
1924 {
1925 case AREA_TANARIS: attackTime = SI_TIMER_TANARIS; break;
1926 case AREA_BLASTED_LANDS: attackTime = SI_TIMER_BLASTED_LANDS; break;
1928 case AREA_BURNING_STEPPES: attackTime = SI_TIMER_BURNING_STEPPES; break;
1929 case AREA_WINTERSPRING: attackTime = SI_TIMER_WINTERSPRING; break;
1930 case AREA_AZSHARA: attackTime = SI_TIMER_AZSHARA; break;
1931 default:
1932 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetTimerIdForZone unknown zoneId {}.", zoneId);
1933 return 0;
1934 }
1935 return attackTime;
1936}

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
182{
183 auto const& itr = _worldstates.find(index);
184 return itr != _worldstates.end() ? itr->second : 0;
185}
WorldStatesMap _worldstates
Definition WorldState.h:311

References _worldstates.

◆ HandleActiveZone()

void WorldState::HandleActiveZone ( uint32  attackTimeVar,
uint32  zoneId,
uint32  remainingVar,
TimePoint  now 
)
1778{
1779 TimePoint timePoint = sWorldState->GetSITimer(SITimers(attackTimeVar));
1780
1782
1783 Map* map = sMapMgr->FindMap(zone.map, 0);
1784
1785 if (zone.zoneId != zoneId)
1786 return;
1787
1788 uint32 remaining = GetSIRemaining(SIRemaining(remainingVar));
1789
1790 // Calculate the next possible attack between ZONE_ATTACK_TIMER_MIN and ZONE_ATTACK_TIMER_MAX.
1792 TimePoint next_attack = now + std::chrono::seconds(zoneAttackTimer);
1793 uint64 timeToNextAttack = std::chrono::duration_cast<std::chrono::minutes>(next_attack-now).count();
1794
1795 if (zone.mouthGuid)
1796 {
1797 // Handles the inactive zone, without a Mouth of Kel'Thuzad summoned (which spawns the whole zone event).
1798 Creature* mouth = map->GetCreature(zone.mouthGuid);
1799 if (!mouth)
1800 sWorldState->SetMouthGuid(zone.zoneId, ObjectGuid()); // delays spawning until next tick
1801 // Handles the active zone that has no necropolis left.
1802 else if (timePoint < now && remaining == 0)
1803 {
1804 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1805 sWorldState->AddBattlesWon(1);
1806 sWorldState->SetLastAttackZone(zoneId);
1807
1808 LOG_INFO("gameevent", "[Scourge Invasion Event] The Scourge has been defeated in {}, next attack starting in {} minutes.", zoneId, timeToNextAttack);
1809 LOG_DEBUG("gameevent", "[Scourge Invasion Event] {} victories", sWorldState->GetBattlesWon());
1810
1811 if (mouth)
1813 else
1814 LOG_ERROR("gameevent", "ScourgeInvasionEvent::HandleActiveZone ObjectGuid {} not found.", zone.mouthGuid.ToString());
1815 }
1816 }
1817 else
1818 {
1819 // If more than one zones are alreay being attacked, set the timer again to ZONE_ATTACK_TIMER.
1820 if (GetActiveZones() > 1)
1821 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1822
1823 // Try to start the zone if attackTimeVar is 0.
1824 StartNewInvasionIfTime(attackTimeVar, zoneId);
1825 }
1826}
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:376
@ EVENT_HERALD_OF_THE_LICH_KING_ZONE_STOP
Definition WorldState.h:113
@ ZONE_ATTACK_TIMER_MIN
Definition WorldState.h:168
@ ZONE_ATTACK_TIMER_MAX
Definition WorldState.h:169
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:1901
void StartNewInvasionIfTime(uint32 attackTimeVar, uint32 zoneId)
Definition WorldState.cpp:1600
Definition WorldState.h:177
ObjectGuid mouthGuid
Definition WorldState.h:183
uint32 map
Definition WorldState.h:178
uint32 zoneId
Definition WorldState.h:179
std::map< uint32, InvasionZone > m_activeInvasions
Definition WorldState.h:205

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 
)
247{
248 _transportStates[conditionId] = state;
249}

References _transportStates.

◆ HandleDefendedZones()

void WorldState::HandleDefendedZones ( )
1559{
1560 if (m_siData.m_battlesWon < 50)
1561 {
1565 }
1566 else if (m_siData.m_battlesWon >= 50 && m_siData.m_battlesWon < 100)
1568 else if (m_siData.m_battlesWon >= 100 && m_siData.m_battlesWon < 150)
1569 {
1572 }
1573 else if (m_siData.m_battlesWon >= 150)
1574 {
1580 }
1581}
#define sGameEventMgr
Definition GameEventMgr.h:201
@ GAME_EVENT_SCOURGE_INVASION
Definition WorldState.h:67
@ GAME_EVENT_SCOURGE_INVASION_150_INVASIONS
Definition WorldState.h:76
@ GAME_EVENT_SCOURGE_INVASION_INVASIONS_DONE
Definition WorldState.h:77
@ GAME_EVENT_SCOURGE_INVASION_50_INVASIONS
Definition WorldState.h:74
@ GAME_EVENT_SCOURGE_INVASION_100_INVASIONS
Definition WorldState.h:75

References GAME_EVENT_SCOURGE_INVASION, 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, and sGameEventMgr.

Referenced by AddBattlesWon(), and Load().

◆ HandleExternalEvent()

void WorldState::HandleExternalEvent ( WorldStateEvent  eventId,
uint32  param 
)
264{
265 std::lock_guard<std::mutex> guard(_mutex);
266 switch (eventId)
267 {
270 {
273 }
274 break;
276 if (param == TEAM_ALLIANCE)
277 {
280 }
281 else
282 {
285 }
286 break;
288 if (param == TEAM_ALLIANCE)
289 {
292 }
293 else
294 {
297 }
298 break;
299 default:
300 break;
301 }
302}
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:488
void DispelMagtheridonTeam(TeamId team)
Definition WorldState.cpp:455
std::mutex _mutex
Definition WorldState.h:326
void BuffMagtheridonTeam(TeamId team)
Definition WorldState.cpp:422
uint32 _adalSongOfBattleTimer
Definition WorldState.h:319

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 
)
347{
348 std::lock_guard<std::mutex> guard(_mutex);
349 switch (zoneId)
350 {
356 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
357 break;
365 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
366 else if (_isMagtheridonHeadSpawnedHorde && player->GetTeamId() == TEAM_HORDE)
367 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
368 break;
372 {
373 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
376 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
377 break;
378 }
379 default:
380 break;
381 }
382};
@ 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:228
@ 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 
)
384{
385 std::lock_guard<std::mutex> guard(_mutex);
386 switch (zoneId)
387 {
394 break;
401 if (player->GetTeamId() == TEAM_ALLIANCE)
403 else if (player->GetTeamId() == TEAM_HORDE)
405 break;
409 {
410 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
415 break;
416 }
417 default:
418 break;
419 }
420};

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)
716{
717 if (newPhase < m_sunsReachData.m_phase)
718 {
719 while (newPhase != m_sunsReachData.m_phase)
720 {
723 }
725 }
726 else
727 {
729 bool moreThanOne = newPhase > m_sunsReachData.m_phase + 1; // custom command case
730 m_sunsReachData.m_phase = newPhase;
731 StartSunsReachPhase(moreThanOne);
732 }
733 switch (m_sunsReachData.m_phase)
734 {
740 break;
741 default: break;
742 }
745}
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB
Definition WorldState.h:100
@ GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL
Definition WorldState.h:91
@ GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL
Definition WorldState.h:95
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT
Definition WorldState.h:98
void StopSunsReachPhase(bool forward)
Definition WorldState.cpp:903
void StartSunsReachPhase(bool initial=false)
Definition WorldState.cpp:915

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 
)
748{
749 bool start = true;
750 if (subPhaseMask < 0)
751 {
752 start = false;
753 subPhaseMask = -subPhaseMask;
754 }
755 bool all = false;
756 if (start)
757 {
758 m_sunsReachData.m_subphaseMask |= subPhaseMask;
760 all = true;
761 }
762 else
763 {
765 all = true;
766 m_sunsReachData.m_subphaseMask &= ~subPhaseMask;
767 }
768 if (initial)
769 {
771 if ((subPhaseMask & SUBPHASE_PORTAL) == 0)
774 if ((subPhaseMask & SUBPHASE_ANVIL) == 0)
777 {
778 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB) == 0)
780 if ((subPhaseMask & SUBPHASE_MONUMENT) == 0)
782 }
783 }
784 if ((subPhaseMask & SUBPHASE_PORTAL))
785 {
788 if (start)
789 {
790 sGameEventMgr->StopEvent(first);
791 sGameEventMgr->StartEvent(second);
792 }
793 else
794 {
795 sGameEventMgr->StopEvent(second);
796 sGameEventMgr->StartEvent(first);
797 }
798 }
799 if ((subPhaseMask & SUBPHASE_ANVIL))
800 {
803 if (start)
804 {
805 sGameEventMgr->StopEvent(first);
806 sGameEventMgr->StartEvent(second);
807 }
808 else
809 {
810 sGameEventMgr->StopEvent(second);
811 sGameEventMgr->StartEvent(first);
812 }
813 }
814 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB))
815 {
818 if (start)
819 {
820 sGameEventMgr->StopEvent(first);
821 sGameEventMgr->StartEvent(second);
822 }
823 else
824 {
825 sGameEventMgr->StopEvent(second);
826 sGameEventMgr->StartEvent(first);
827 }
828 }
829 if ((subPhaseMask & SUBPHASE_MONUMENT))
830 {
833 if (start)
834 {
835 sGameEventMgr->StopEvent(first);
836 sGameEventMgr->StartEvent(second);
837 }
838 else
839 {
840 sGameEventMgr->StopEvent(second);
841 sGameEventMgr->StartEvent(first);
842 }
843 }
844 if (all)
845 {
846 if (start)
848 else
850
851 if (!initial)
852 {
853 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
854 for (ObjectGuid& guid : m_sunsReachData.m_sunsReachReclamationPlayers)
855 if (Player* player = ObjectAccessor::FindPlayer(guid))
856 {
857 if (start)
858 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
859 else
860 player->RemoveAurasDueToSpell(SPELL_KIRU_SONG_OF_VICTORY);
861 }
862 }
863 }
864 if (!initial)
866}
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL
Definition WorldState.h:92
@ GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT
Definition WorldState.h:99
@ GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU
Definition WorldState.h:102
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL
Definition WorldState.h:96
@ GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB
Definition WorldState.h:101
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)
869{
870 if (newGate < m_sunsReachData.m_gate)
871 {
872 while (newGate != m_sunsReachData.m_gate)
873 {
876 }
878 }
879 else
880 {
882 m_sunsReachData.m_gate = newGate;
884 }
885 int32 worldState = 0;
886 switch (newGate)
887 {
891 }
892 if (worldState)
894
896}
void StartSunwellGatePhase()
Definition WorldState.cpp:1203
void StopSunwellGatePhase()
Definition WorldState.cpp:1215

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
32{
33 static WorldState instance;
34 return &instance;
35}
Definition WorldState.h:283
static WorldState * instance()
Definition WorldState.cpp:31

References instance().

Referenced by instance().

◆ IsActiveZone()

bool WorldState::IsActiveZone ( uint32  zoneId)
1896{
1897 return false;
1898}

Referenced by StartNewInvasion().

◆ IsConditionFulfilled()

bool WorldState::IsConditionFulfilled ( uint32  conditionId,
uint32  state = WORLD_STATE_CONDITION_STATE_NONE 
) const
217{
218 switch (conditionId)
219 {
227 return _transportStates.at(conditionId) == state;
240 default:
241 LOG_ERROR("scripts", "WorldState::IsConditionFulfilled: Unhandled WorldStateCondition {}", conditionId);
242 return false;
243 }
244}
@ 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 ( )
49{
51 PreparedQueryResult result = CharacterDatabase.Query(stmt);
52
53 if (result)
54 {
55 do
56 {
57 Field* fields = result->Fetch();
58 uint32 id = fields[0].Get<uint32>();
59 std::string data = fields[1].Get<std::string>();
60 std::istringstream loadStream(data);
61
62 switch (id)
63 {
65 {
66 if (data.size())
67 {
68 try
69 {
71 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
73 loadStream >> m_sunsReachData.m_gate;
74 for (uint32 i = 0; i < COUNTERS_MAX_GATES; ++i)
75 loadStream >> m_sunsReachData.m_gateCounters[i];
76 }
77 catch (std::exception& e)
78 {
79 LOG_ERROR("scripts", "WorldState::Load: Exception reading SunsReach data {}", e.what());
85 }
86 }
87 else
88 {
94 }
95 break;
96 }
98 if (data.size())
99 {
100 try
101 {
102 uint32 state;
103 loadStream >> state;
104 m_siData.m_state = SIState(state);
105 for (TimePoint& m_timer : m_siData.m_timers)
106 {
107 uint64 time;
108 loadStream >> time;
109 m_timer = TimePoint(std::chrono::milliseconds(time));
110 }
112 for (unsigned int& i : m_siData.m_remaining)
113 loadStream >> i;
114 }
115 catch (std::exception& e)
116 {
117 LOG_ERROR("scripts", "WorldState::Load: Exception reading ScourgeInvasion data {}", e.what());
118 m_siData.Reset();
119 }
120 }
121 break;
122 }
123 } while (result->NextRow());
124 }
128
130 {
133 }
134}
@ 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:258
SIState
Definition WorldState.h:123
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:1289
void Reset()
Definition WorldState.cpp:1406

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 ( )
137{
138 uint32 oldMSTime = getMSTime();
139
140 QueryResult result = CharacterDatabase.Query("SELECT entry, value FROM worldstates");
141
142 if (!result)
143 {
144 LOG_WARN("server.loading", ">> Loaded 0 world states. DB table `worldstates` is empty!");
145 LOG_INFO("server.loading", " ");
146 return;
147 }
148
149 do
150 {
151 Field* fields = result->Fetch();
152 _worldstates[fields[0].Get<uint32>()] = fields[1].Get<uint32>();
153 } while (result->NextRow());
154
155 LOG_INFO("server.loading", ">> Loaded {} World States in {} ms", _worldstates.size(), GetMSTimeDiffToNow(oldMSTime));
156 LOG_INFO("server.loading", " ");
157}
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)
1885{
1886 if (!zone.pallidGuid)
1887 return;
1888
1889 Map* map = GetMap(zone.map, zone.pallid[0]);
1890
1891 if (Creature* pallid = map->GetCreature(zone.pallidGuid))
1892 pallid->DespawnOrUnsummon();
1893}
std::vector< Position > pallid
Definition WorldState.h:190
uint32 map
Definition WorldState.h:188
ObjectGuid pallidGuid
Definition WorldState.h:191

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

◆ OnDisable() [2/2]

void WorldState::OnDisable ( ScourgeInvasionData::InvasionZone zone)
1874{
1875 if (!zone.mouthGuid)
1876 return;
1877
1878 Map* map = GetMap(zone.map, zone.mouth[0]);
1879
1880 if (Creature* mouth = map->GetCreature(zone.mouthGuid))
1881 mouth->DespawnOrUnsummon();
1882}
std::vector< Position > mouth
Definition WorldState.h:182

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

Referenced by StopScourgeInvasion().

◆ OnEnable()

void WorldState::OnEnable ( ScourgeInvasionData::InvasionZone zone)
1863{
1864 // If there were remaining necropolises in the old zone before shutdown, we
1865 // restore that zone
1866 if (sWorldState->GetSIRemaining(SIRemaining(zone.remainingNecropoli)) > 0)
1867 ResumeInvasion(zone);
1868 // Otherwise we start a new Invasion
1869 else
1871}
uint32 GetTimerIdForZone(uint32 zoneId)
Definition WorldState.cpp:1920
bool ResumeInvasion(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1694
uint32 remainingNecropoli
Definition WorldState.h:181

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

Referenced by StartScourgeInvasion().

◆ RemovePendingInvasion()

void WorldState::RemovePendingInvasion ( uint32  zoneId)
1845{
1846 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1847 m_siData.m_pendingInvasions.erase(zoneId);
1848}

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

◆ RemovePendingPallid()

void WorldState::RemovePendingPallid ( uint32  zoneId)
1857{
1858 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1859 m_siData.m_pendingPallids.erase(zoneId);
1860}

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

◆ ResumeInvasion()

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

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)
188{
189 switch (saveId)
190 {
192 {
193 std::string expansionData = m_sunsReachData.GetData();
194 SaveHelper(expansionData, SAVE_ID_QUEL_DANAS);
195 break;
196 }
198 {
199 std::string siData = m_siData.GetData();
201 break;
202 }
203 default:
204 break;
205 }
206}
void SaveHelper(std::string &stringToSave, WorldStateSaveIds saveId)
Definition WorldState.cpp:208
std::string GetData()
Definition WorldState.cpp:1418
std::string GetData()
Definition WorldState.cpp:1099

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 
)
209{
211 stmt->SetData(0, saveId);
212 stmt->SetData(1, stringToSave);
213 CharacterDatabase.Execute(stmt);
214}
@ 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
1262{
1263 QueryResult result = CharacterDatabase.Query("SELECT guid FROM characters WHERE level >= 50");
1264 if (result)
1265 {
1266 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1268 uint32 count = 0;
1269 do
1270 {
1271 Field* fields = result->Fetch();
1272 ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
1273
1274 // Add item manually. SendMailTo does not add items for offline players
1276 {
1277 item->SaveToDB(trans);
1278 draft.AddItem(item);
1279 }
1280
1281 draft.SendMailTo(trans, MailReceiver(playerGUID.GetCounter()), NPC_ARGENT_EMISSARY, MAIL_CHECK_MASK_HAS_BODY);
1282 ++count;
1283 } while (result->NextRow());
1284 CharacterDatabase.CommitTransaction(trans);
1285 LOG_INFO("WorldState", "SendScourgeInvasionMail sent to {} characters", count);
1286 }
1287}
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:119
@ ITEM_A_LETTER_FROM_THE_KEEPER_OF_THE_ROLLS
Definition WorldState.h:117
@ NPC_ARGENT_EMISSARY
Definition WorldState.h:118
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
543{
544 std::lock_guard<std::mutex> guard(mutex);
545 for (ObjectGuid const& guid : guids)
546 if (Player* player = ObjectAccessor::FindPlayer(guid))
547 player->SendUpdateWorldState(worldStateId, value);
548}

References ObjectAccessor::FindPlayer().

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

◆ SetLastAttackZone()

void WorldState::SetLastAttackZone ( uint32  zoneId)
1509{
1510 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1511 m_siData.m_lastAttackZone = zoneId;
1512}

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

◆ SetMouthGuid()

void WorldState::SetMouthGuid ( uint32  zoneId,
ObjectGuid  guid 
)
1834{
1835 m_siData.m_activeInvasions[zoneId].mouthGuid = guid;
1836}

References ScourgeInvasionData::m_activeInvasions, and m_siData.

◆ SetPallidGuid()

void WorldState::SetPallidGuid ( uint32  zoneId,
ObjectGuid  guid 
)
1829{
1830 m_siData.m_cityAttacks[zoneId].pallidGuid = guid;
1831}
std::map< uint32, CityAttack > m_cityAttacks
Definition WorldState.h:206

References ScourgeInvasionData::m_cityAttacks, and m_siData.

◆ SetScourgeInvasionState()

void WorldState::SetScourgeInvasionState ( SIState  state)
1248{
1249 SIState oldState = m_siData.m_state;
1250 if (oldState == state)
1251 return;
1252
1253 m_siData.m_state = state;
1254 if (oldState == STATE_0_DISABLED)
1256 else if (state == STATE_0_DISABLED)
1259}
void StopScourgeInvasion()
Definition WorldState.cpp:1429

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 
)
1472{
1473 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1474 m_siData.m_remaining[remaining] = value;
1476}

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

◆ SetSITimer()

void WorldState::SetSITimer ( SITimers  timer,
TimePoint  timePoint 
)
1484{
1485 m_siData.m_timers[timer] = timePoint;
1486}

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 
)
161{
162 auto const& it = _worldstates.find(index);
163 if (it != _worldstates.end())
164 {
166 stmt->SetData(0, uint32(timeValue));
167 stmt->SetData(1, index);
168 CharacterDatabase.Execute(stmt);
169 }
170 else
171 {
173 stmt->SetData(0, index);
174 stmt->SetData(1, uint32(timeValue));
175 CharacterDatabase.Execute(stmt);
176 }
177
178 _worldstates[index] = timeValue;
179}
@ 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)
1668{
1669 LOG_DEBUG("gameevent", "Scourge Invasion Event: Starting new City attack in zone {}.", zoneId);
1670
1672
1673 uint32 SpawnLocationID = urand(0, static_cast<uint32>(zone.pallid.size() - 1));
1674
1675 Map* map = GetMap(zone.map, zone.pallid[SpawnLocationID]);
1676
1677 // If any of the required maps are not available we return. Will cause the invasion to be started
1678 // on next update instead
1679 if (!map)
1680 {
1681 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime unable to access required map (%{}). Retrying next update.", zone.map);
1682 return;
1683 }
1684
1685 if (m_siData.m_pendingPallids.find(zoneId) != m_siData.m_pendingPallids.end())
1686 return;
1687
1688 if (map && SummonPallid(map, zone, zone.pallid[SpawnLocationID], SpawnLocationID))
1689 LOG_DEBUG("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime pallid spawned in {}.", zone.map);
1690 else
1691 LOG_DEBUG("gameevent", "ScourgeInvasionEvent::StartNewCityAttackIfTime unable to spawn pallid in {}.", zone.map);
1692}
bool SummonPallid(Map *map, ScourgeInvasionData::CityAttack &zone, const Position &position, uint32 spawnLoc)
Definition WorldState.cpp:1751
Definition WorldState.h:187

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 
)
1612{
1613 TimePoint now = std::chrono::steady_clock::now();
1614
1615 // Not yet time
1616 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1617 return;
1618
1619 StartNewCityAttack(zoneId);
1621 TimePoint next_attack = now + std::chrono::seconds(cityAttackTimer);
1622 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1623}
@ CITY_ATTACK_TIMER_MAX
Definition WorldState.h:171
@ CITY_ATTACK_TIMER_MIN
Definition WorldState.h:170
TimePoint GetSITimer(SITimers timer)
Definition WorldState.cpp:1478
void StartNewCityAttack(uint32 zoneId)
Definition WorldState.cpp:1667

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)
1626{
1627 if (IsActiveZone(zoneId))
1628 return;
1629
1630 // Don't attack same zone as before.
1631 if (zoneId == sWorldState->GetLastAttackZone())
1632 return;
1633
1634 // If we have at least one victory and more than 1 active zones stop here.
1635 if (GetActiveZones() > 1 && sWorldState->GetBattlesWon() > 0)
1636 return;
1637
1638 LOG_DEBUG("gameevent", "Scourge Invasion Event: Starting new invasion in {}.", zoneId);
1639
1641
1642 Map* map = GetMap(zone.map, zone.mouth[0]);
1643
1644 if (!map)
1645 {
1646 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unable to access required map ({}). Retrying next update.", zone.map);
1647 return;
1648 }
1649
1650 switch (zoneId)
1651 {
1658 default:
1659 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unknown zoneId {}.", zoneId);
1660 return;
1661 }
1662
1663 if (map)
1664 SummonMouth(map, zone, zone.mouth[0], true);
1665}
@ GAME_EVENT_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldState.h:71
@ GAME_EVENT_SCOURGE_INVASION_AZSHARA
Definition WorldState.h:70
@ GAME_EVENT_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldState.h:73
@ GAME_EVENT_SCOURGE_INVASION_WINTERSPRING
Definition WorldState.h:68
@ GAME_EVENT_SCOURGE_INVASION_TANARIS
Definition WorldState.h:69
@ GAME_EVENT_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldState.h:72
bool IsActiveZone(uint32 zoneId)
Definition WorldState.cpp:1895

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 
)
1601{
1602 TimePoint now = std::chrono::steady_clock::now();
1603
1604 // Not yet time
1605 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1606 return;
1607
1608 StartNewInvasion(zoneId);
1609}
void StartNewInvasion(uint32 zoneId)
Definition WorldState.cpp:1625

References GetSITimer(), and StartNewInvasion().

Referenced by HandleActiveZone(), and OnEnable().

◆ StartScourgeInvasion()

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

References AREA_STORMWIND_CITY, AREA_UNDERCITY, BroadcastSIWorldstates(), GAME_EVENT_SCOURGE_INVASION, 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
916{
917 switch (m_sunsReachData.m_phase)
918 {
921 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
922 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
923 break;
927 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
928 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.5f);
929 break;
931 if (initial)
934 // TODO: Should be id 2 0.25f?
935 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
936 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.25f);
937 break;
939 if (initial)
940 {
943 }
945 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
946 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_FINE, 0.0f);
947 break;
948 default: break;
949 }
950}
@ MAP_OUTLAND
Definition AreaDefines.h:216
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY
Definition WorldState.h:93
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT
Definition WorldState.h:90
@ GAME_EVENT_QUEL_DANAS_PHASE_4
Definition WorldState.h:97
@ GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT
Definition WorldState.h:94
@ GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY
Definition WorldState.h:89
@ GAME_EVENT_QUEL_DANAS_PHASE_1
Definition WorldState.h:88
@ 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
1204{
1205 switch (m_sunsReachData.m_gate)
1206 {
1211 default: break;
1212 }
1213}
@ GAME_EVENT_SWP_GATES_PHASE_1
Definition WorldState.h:105
@ GAME_EVENT_SWP_GATES_PHASE_3
Definition WorldState.h:107
@ GAME_EVENT_SWP_GATES_PHASE_0
Definition WorldState.h:104
@ GAME_EVENT_SWP_GATES_PHASE_2
Definition WorldState.h:106

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)
1584{
1585 switch (eventId)
1586 {
1595 default:
1596 break;
1597 }
1598}
@ SI_ZONE_EASTERN_PLAGUELANDS
Definition WorldState.h:134
@ SI_ZONE_WINTERSPRING
Definition WorldState.h:136
@ SI_ZONE_UNDERCITY
Definition WorldState.h:138
@ SI_ZONE_AZSHARA
Definition WorldState.h:131
@ SI_ZONE_TANARIS
Definition WorldState.h:135
@ SI_ZONE_BLASTED_LANDS
Definition WorldState.h:132
@ SI_ZONE_BURNING_STEPPES
Definition WorldState.h:133
@ SI_ZONE_STORMWIND
Definition WorldState.h:137

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()

◆ StopSunsReachPhase()

◆ StopSunwellGatePhase()

◆ SummonMouth()

bool WorldState::SummonMouth ( Map map,
ScourgeInvasionData::InvasionZone zone,
Position  position,
bool  newInvasion 
)
1725{
1727 // Remove old mouth if required.
1728 if (Creature* existingMouth = map->GetCreature(zone.mouthGuid))
1729 existingMouth->AddObjectToRemoveList();
1730
1731 if (Creature* mouth = map->SummonCreature(NPC_HERALD_OF_THE_LICH_KING, position))
1732 {
1733 mouth->GetAI()->DoAction(EVENT_HERALD_OF_THE_LICH_KING_ZONE_START);
1734 sWorldState->SetMouthGuid(zone.zoneId, mouth->GetGUID());
1735 if (newInvasion)
1736 sWorldState->SetSIRemaining(SIRemaining(zone.remainingNecropoli), zone.necropolisCount);
1737 }
1738 sWorldState->RemovePendingInvasion(zone.zoneId);
1739
1740 return true;
1741}
@ NPC_HERALD_OF_THE_LICH_KING
Definition WorldState.h:116
@ EVENT_HERALD_OF_THE_LICH_KING_ZONE_START
Definition WorldState.h:112
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:2156
void AddPendingInvasion(uint32 zoneId)
Definition WorldState.cpp:1838
uint32 necropolisCount
Definition WorldState.h:180

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 
)
1752{
1754 // Remove old pallid if required.
1755 uint32 pathID = 0;
1756 if (Creature* existingPallid = map->GetCreature(zone.pallidGuid))
1757 existingPallid->AddObjectToRemoveList();
1758
1759 // if (Creature* pallid = map->SummonCreature(RAND(NPC_PALLID_HORROR, NPC_PATCHWORK_TERROR), position))
1760 if (Creature* pallid = map->SummonCreature(NPC_PALLID_HORROR, position))
1761 {
1762 pallid->GetMotionMaster()->Clear(false);
1763 if (pallid->GetZoneId() == AREA_UNDERCITY)
1765 else
1766 pathID = spawnLoc == 0 ? PATH_STORMWIND_KEEP : PATH_STORMWIND_TRADE_DISTRICT;
1767
1768 pallid->GetMotionMaster()->MovePath(pathID, false);
1769
1770 sWorldState->SetPallidGuid(zone.zoneId, pallid->GetGUID());
1771 }
1772 sWorldState->RemovePendingPallid(zone.zoneId);
1773
1774 return true;
1775}
@ PATH_STORMWIND_TRADE_DISTRICT
Definition WorldState.cpp:1746
@ PATH_UNDERCITY_TRADE_QUARTER
Definition WorldState.cpp:1747
@ PATH_UNDERCITY_ROYAL_QUARTER
Definition WorldState.cpp:1748
@ PATH_STORMWIND_KEEP
Definition WorldState.cpp:1745
@ NPC_PALLID_HORROR
Definition WorldState.h:114
void AddPendingPallid(uint32 zoneId)
Definition WorldState.cpp:1850
uint32 zoneId
Definition WorldState.h:189

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)
305{
307 {
308 if (_adalSongOfBattleTimer <= diff)
309 {
312 }
313 else
314 {
316 }
317 }
318
320 {
321 if (m_siData.m_broadcastTimer <= diff)
322 {
325
327 {
328 for (auto& zone : m_siData.m_cityAttacks)
329 {
330 if (zone.second.zoneId == AREA_UNDERCITY)
331 StartNewCityAttackIfTime(SI_TIMER_UNDERCITY, zone.second.zoneId);
332 else if (zone.second.zoneId == AREA_STORMWIND_CITY)
333 StartNewCityAttackIfTime(SI_TIMER_STORMWIND, zone.second.zoneId);
334 }
335
336 TimePoint now = std::chrono::steady_clock::now();
337 for (auto& zone : m_siData.m_activeInvasions)
338 HandleActiveZone(GetTimerIdForZone(zone.second.zoneId), zone.second.zoneId, zone.second.remainingNecropoli, now);
339 }
340 }
341 else
343 }
344}
void DispelAdalsSongOfBattle()
Definition WorldState.cpp:515
void HandleActiveZone(uint32 attackTimeVar, uint32 zoneId, uint32 remainingVar, TimePoint now)
Definition WorldState.cpp:1777
uint64 m_broadcastTimer
Definition WorldState.h:200

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: