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, Position const &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 ( )
40{
44}
@ WORLD_STATE_CONDITION_STATE_NONE
Definition WorldState.h:38
@ WORLD_STATE_CONDITION_THE_THUNDERCALLER
Definition WorldState.h:31
@ WORLD_STATE_CONDITION_THE_IRON_EAGLE
Definition WorldState.h:32
@ WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS
Definition WorldState.h:33
std::map< uint32, std::atomic< WorldStateConditionState > > _transportStates
Definition WorldState.h:326
bool _isMagtheridonHeadSpawnedAlliance
Definition WorldState.h:324
bool _isMagtheridonHeadSpawnedHorde
Definition WorldState.h:323

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

◆ ~WorldState()

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

Member Function Documentation

◆ AddBattlesWon()

void WorldState::AddBattlesWon ( int32  count)
1513{
1514 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1515 m_siData.m_battlesWon += count;
1518}
@ SAVE_ID_SCOURGE_INVASION
Definition WorldState.h:60
ScourgeInvasionData m_siData
Definition WorldState.h:374
void Save(WorldStateSaveIds saveId)
Definition WorldState.cpp:196
void HandleDefendedZones()
Definition WorldState.cpp:1576
std::mutex m_siMutex
Definition WorldState.h:202
uint32 m_battlesWon
Definition WorldState.h:198

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

◆ AddPendingInvasion()

void WorldState::AddPendingInvasion ( uint32  zoneId)
1860{
1861 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1862 m_siData.m_pendingInvasions.insert(zoneId);
1863}
std::set< uint32 > m_pendingInvasions
Definition WorldState.h:204

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

Referenced by SummonMouth().

◆ AddPendingPallid()

void WorldState::AddPendingPallid ( uint32  zoneId)
1872{
1873 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1874 m_siData.m_pendingPallids.insert(zoneId);
1875}
std::set< uint32 > m_pendingPallids
Definition WorldState.h:205

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

Referenced by SummonPallid().

◆ AddSunsReachProgress()

void WorldState::AddSunsReachProgress ( uint32  questId)
576{
577 uint32 counter = 0;
578 int32 otherCounter = -1;
579 int32 worldState = 0;
580 uint32 subPhaseMask = 0;
581 uint32 addedValue = 1;
582 switch (questId)
583 {
585 counter = COUNTER_ERRATIC_BEHAVIOR;
586 otherCounter = COUNTER_SANCTUM_WARDS;
588 break;
590 counter = COUNTER_SANCTUM_WARDS;
591 otherCounter = COUNTER_ERRATIC_BEHAVIOR;
593 break;
598 break;
603 break;
606 subPhaseMask = SUBPHASE_PORTAL;
608 break;
611 otherCounter = COUNTER_TAKING_THE_HARBOR;
613 break;
618 break;
620 counter = COUNTER_MAKING_READY;
621 subPhaseMask = SUBPHASE_ANVIL;
622 worldState = WORLD_STATE_QUEL_DANAS_ANVIL;
623 break;
626 subPhaseMask = SUBPHASE_ALCHEMY_LAB;
628 break;
631 subPhaseMask = SUBPHASE_MONUMENT;
633 break;
636 subPhaseMask = SUBPHASE_MONUMENT;
638 addedValue = 150;
639 break;
640 default:
641 return;
642 }
643
644 uint32 previousValue = 0;
645 uint32 newValue = 0;
646
647 if (!subPhaseMask)
649 else
650 previousValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
651 m_sunsReachData.m_sunsReachReclamationCounters[counter] += addedValue;
652 if (!subPhaseMask)
654 else
655 newValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
656 if (previousValue != newValue)
658
659 bool save = true;
661 uint32 modifier = 1;
662 if (otherCounter != -1)
663 {
664 modifier = 2;
665 counterValue += m_sunsReachData.m_sunsReachReclamationCounters[otherCounter];
666 }
667 if (counterValue >= sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX) * modifier)
668 {
669 save = false;
670 switch (questId)
671 {
674 {
677 break;
678 }
681 {
684 break;
685 }
687 {
690 break;
691 }
694 {
697 break;
698 }
700 {
703 break;
704 }
706 {
709 break;
710 }
713 {
716 break;
717 }
718 }
719 }
720 if (save)
722}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_SUNSREACH_COUNTER_MAX
Definition WorldConfig.h:397
@ 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:561
@ QUEST_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.cpp:565
@ QUEST_SANCTUM_WARDS
Definition WorldState.cpp:562
@ QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.cpp:563
@ QUEST_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.cpp:566
@ QUEST_MAKING_READY
Definition WorldState.cpp:568
@ QUEST_A_MAGNANIMOUS_BENEFACTOR
Definition WorldState.cpp:571
@ QUEST_DISCOVERING_YOUR_ROOTS
Definition WorldState.cpp:569
@ QUEST_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.cpp:564
@ QUEST_TAKING_THE_HARBOR
Definition WorldState.cpp:567
@ QUEST_A_CHARITABLE_DONATION
Definition WorldState.cpp:570
@ SUBPHASE_ALCHEMY_LAB
Definition WorldState.h:227
@ SUBPHASE_ANVIL
Definition WorldState.h:226
@ SUBPHASE_MONUMENT
Definition WorldState.h:228
@ SUBPHASE_PORTAL
Definition WorldState.h:225
@ SUNS_REACH_PHASE_3_ARMORY
Definition WorldState.h:219
@ SUNS_REACH_PHASE_2_SANCTUM
Definition WorldState.h:218
@ SUNS_REACH_PHASE_1_STAGING_AREA
Definition WorldState.h:217
@ SUNS_REACH_PHASE_4_HARBOR
Definition WorldState.h:220
@ COUNTER_ERRATIC_BEHAVIOR
Definition WorldState.h:234
@ COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.h:236
@ COUNTER_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.h:238
@ COUNTER_MAKING_READY
Definition WorldState.h:241
@ COUNTER_TAKING_THE_HARBOR
Definition WorldState.h:240
@ COUNTER_A_CHARITABLE_DONATION
Definition WorldState.h:243
@ COUNTER_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.h:239
@ COUNTER_DISCOVERING_YOUR_ROOTS
Definition WorldState.h:242
@ COUNTER_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.h:237
@ COUNTER_SANCTUM_WARDS
Definition WorldState.h:235
@ SAVE_ID_QUEL_DANAS
Definition WorldState.h:61
void HandleSunsReachPhaseTransition(uint32 newPhase)
Definition WorldState.cpp:724
void SendWorldstateUpdate(std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
Definition WorldState.cpp:551
SunsReachReclamationData m_sunsReachData
Definition WorldState.h:325
void HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool initial=false)
Definition WorldState.cpp:756
#define sWorld
Definition World.h:318
uint32 m_subphaseMask
Definition WorldState.h:265
std::mutex m_sunsReachReclamationMutex
Definition WorldState.h:268
uint32 m_sunsReachReclamationCounters[COUNTERS_MAX]
Definition WorldState.h:266
uint32 GetPhasePercentage(uint32 phase)
Definition WorldState.cpp:1119
uint32 m_phase
Definition WorldState.h:264
GuidVector m_sunsReachReclamationPlayers
Definition WorldState.h:267
uint32 GetSubPhasePercentage(uint32 subPhase)
Definition WorldState.cpp:1130

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)
1152{
1153 uint32 counter = 0;
1154 int32 worldState = 0;
1155 uint32 addedValue = 1;
1156 switch (questId)
1157 {
1161 break;
1162 default: return;
1163 }
1164 switch (m_sunsReachData.m_gate)
1165 {
1169 default: return;
1170 }
1172 uint32 newValue = 0;
1173 m_sunsReachData.m_gateCounters[counter] += addedValue;
1175 if (previousValue != newValue)
1177 bool save = true;
1179 {
1180 save = false;
1181 switch (questId)
1182 {
1184 {
1187 break;
1188 }
1190 {
1193 break;
1194 }
1196 {
1199 break;
1200 }
1201 }
1202 }
1203 if (save)
1205}
@ 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:1145
@ QUEST_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.cpp:1147
@ QUEST_ROHENDOR_THE_SECOND_GATE
Definition WorldState.cpp:1146
@ COUNTER_MAX_VAL_REQ_SWP_GATES
Definition WorldState.cpp:1148
@ SUNWELL_ARCHONISUS_GATE3_OPEN
Definition WorldState.h:252
@ SUNWELL_ALL_GATES_CLOSED
Definition WorldState.h:249
@ SUNWELL_AGAMATH_GATE1_OPEN
Definition WorldState.h:250
@ SUNWELL_ROHENDOR_GATE2_OPEN
Definition WorldState.h:251
@ COUNTER_ROHENDOR_THE_SECOND_GATE
Definition WorldState.h:257
@ COUNTER_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.h:258
@ COUNTER_AGAMATH_THE_FIRST_GATE
Definition WorldState.h:256
void HandleSunwellGateTransition(uint32 newGate)
Definition WorldState.cpp:877
uint32 m_gate
Definition WorldState.h:269
uint32 m_gateCounters[COUNTERS_MAX_GATES]
Definition WorldState.h:270
uint32 GetSunwellGatePercentage(uint32 gate)
Definition WorldState.cpp:1236

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

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
498{
499 sMapMgr->DoForAllMaps([&](Map* map) -> void
500 {
501 switch (map->GetId())
502 {
503 case MAP_OUTLAND:
504 map->DoForAllPlayers([&](Player* player)
505 {
506 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
507 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
508 });
509 break;
513 map->DoForAllPlayers([&](Player* player)
514 {
515 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
516 });
517 break;
518 default:
519 break;
520 }
521 });
522}
@ MAP_TEMPEST_KEEP_THE_BOTANICA
Definition AreaDefines.h:232
@ MAP_TEMPEST_KEEP_THE_ARCATRAZ
Definition AreaDefines.h:231
@ MAP_TEMPEST_KEEP_THE_MECHANAR
Definition AreaDefines.h:233
@ SPELL_ADAL_SONG_OF_BATTLE
Definition WorldState.h:50
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:3315
Definition Player.h:1086
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:1361

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
432{
433 sMapMgr->DoForAllMaps([&](Map* map) -> void
434 {
435 switch (map->GetId())
436 {
437 case MAP_OUTLAND:
438 map->DoForAllPlayers([&](Player* player)
439 {
440 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
441 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
442 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
443 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
444 });
445 break;
450 map->DoForAllPlayers([&](Player* player)
451 {
452 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
453 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
454 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
455 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
456 });
457 break;
458 default:
459 break;
460 }
461 });
462}
@ MAP_HELLFIRE_CITADEL_THE_BLOOD_FURNACE
Definition AreaDefines.h:223
@ MAP_HELLFIRE_CITADEL_RAMPARTS
Definition AreaDefines.h:224
@ MAP_HELLFIRE_CITADEL_THE_SHATTERED_HALLS
Definition AreaDefines.h:222
@ MAP_MAGTHERIDONS_LAIR
Definition AreaDefines.h:225
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ TEAM_HORDE
Definition SharedDefines.h:749
@ SPELL_NAZGRELS_FAVOR
Definition WorldState.h:53
@ SPELL_TROLLBANES_COMMAND
Definition WorldState.h:52
TeamId GetTeamId(bool original=false) const
Definition Player.h:2138

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
525{
526 sMapMgr->DoForAllMaps([&](Map* map) -> void
527 {
528 switch (map->GetId())
529 {
530 case MAP_OUTLAND:
531 map->DoForAllPlayers([&](Player* player)
532 {
533 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
534 player->RemoveAurasDueToSpell(SPELL_ADAL_SONG_OF_BATTLE);
535 });
536 break;
540 map->DoForAllPlayers([&](Player* player)
541 {
543 });
544 break;
545 default:
546 break;
547 }
548 });
549}
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5189

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
465{
466 sMapMgr->DoForAllMaps([&](Map* map) -> void
467 {
468 switch (map->GetId())
469 {
470 case MAP_OUTLAND:
471 map->DoForAllPlayers([&](Player* player)
472 {
473 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
474 player->RemoveAurasDueToSpell(SPELL_TROLLBANES_COMMAND);
475 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
476 player->RemoveAurasDueToSpell(SPELL_NAZGRELS_FAVOR);
477 });
478 break;
483 map->DoForAllPlayers([&](Player* player)
484 {
485 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
487 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
489 });
490 break;
491 default:
492 break;
493 }
494 });
495}

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   
)
1960{
1961 if (m_siData.m_state != STATE_0_DISABLED) // scourge invasion active - need to send all worldstates
1962 {
1963 uint32 victories = GetBattlesWon();
1964
1965 uint32 remainingAzshara = GetSIRemaining(SI_REMAINING_AZSHARA);
1966 uint32 remainingBlastedLands = GetSIRemaining(SI_REMAINING_BLASTED_LANDS);
1967 uint32 remainingBurningSteppes = GetSIRemaining(SI_REMAINING_BURNING_STEPPES);
1968 uint32 remainingEasternPlaguelands = GetSIRemaining(SI_REMAINING_EASTERN_PLAGUELANDS);
1969 uint32 remainingTanaris = GetSIRemaining(SI_REMAINING_TANARIS);
1970 uint32 remainingWinterspring = GetSIRemaining(SI_REMAINING_WINTERSPRING);
1971
1972 packet.Worldstates.reserve(13);
1973 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_AZSHARA, remainingAzshara > 0 ? 1 : 0);
1974 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, remainingBlastedLands > 0 ? 1 : 0);
1975 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, remainingBurningSteppes > 0 ? 1 : 0);
1976 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, remainingEasternPlaguelands > 0 ? 1 : 0);
1977 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_TANARIS, remainingTanaris > 0 ? 1 : 0);
1978 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, remainingWinterspring > 0 ? 1 : 0);
1979 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_VICTORIES, victories);
1980 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA, remainingAzshara);
1981 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS, remainingBlastedLands);
1982 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES, remainingBurningSteppes);
1983 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS, remainingEasternPlaguelands);
1984 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS, remainingTanaris);
1985 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING, remainingWinterspring);
1986 }
1987
1988 switch (zoneId)
1989 {
1994 {
1995 // Sunwell Reclamation
1996 switch (m_sunsReachData.m_phase)
1997 {
2000 break;
2003 break;
2006 break;
2012 break;
2013 }
2019
2020 // Sunwell Gates
2021 switch (m_sunsReachData.m_gate)
2022 {
2025 break;
2028 break;
2031 break;
2032 }
2033 break;
2034 }
2035 default:
2036 break;
2037 }
2038}
@ AREA_ISLE_OF_QUEL_DANAS
Definition AreaDefines.h:140
@ AREA_MAGISTERS_TERRACE
Definition AreaDefines.h:143
@ AREA_SUNWELL_PLATEAU
Definition AreaDefines.h:139
@ AREA_SHATTRATH_CITY
Definition AreaDefines.h:118
@ WORLD_STATE_SCOURGE_INVASION_VICTORIES
Definition WorldStateDefines.h:24
@ WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldStateDefines.h:32
@ WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldStateDefines.h:29
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BURNING_STEPPES
Definition WorldStateDefines.h:37
@ WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldStateDefines.h:30
@ WORLD_STATE_SCOURGE_INVASION_TANARIS
Definition WorldStateDefines.h:31
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_WINTERSPRING
Definition WorldStateDefines.h:40
@ WORLD_STATE_SCOURGE_INVASION_WINTERSPRING
Definition WorldStateDefines.h:27
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_BLASTED_LANDS
Definition WorldStateDefines.h:36
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_TANARIS
Definition WorldStateDefines.h:39
@ WORLD_STATE_QUEL_DANAS_MUSIC
Definition WorldStateDefines.h:49
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_AZSHARA
Definition WorldStateDefines.h:35
@ WORLD_STATE_SCOURGE_INVASION_AZSHARA
Definition WorldStateDefines.h:28
@ WORLD_STATE_SCOURGE_INVASION_NECROPOLIS_EASTERN_PLAGUELANDS
Definition WorldStateDefines.h:38
@ STATE_0_DISABLED
Definition WorldState.h:125
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
SIState m_state
Definition WorldState.h:195

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

◆ GetActiveZones()

uint32 WorldState::GetActiveZones ( )
1923{
1924 size_t i = m_siData.m_pendingInvasions.size();
1925 for (auto const& [zoneId, invasionData] : m_siData.m_activeInvasions)
1926 {
1927 Map* map = GetMap(invasionData.map, invasionData.mouth[0]);
1928 if (!map)
1929 {
1930 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetActiveZones no map for zone {}.", invasionData.map);
1931 continue;
1932 }
1933
1934 Creature* mouth = map->GetCreature(invasionData.mouthGuid);
1935 if (mouth)
1936 i++;
1937 }
1938 return i;
1939}
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
Definition Creature.h:47
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2414
Map * GetMap(uint32 mapId, Position const &invZone)
Definition WorldState.cpp:260

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

Referenced by HandleActiveZone(), and StartNewInvasion().

◆ GetBattlesWon()

uint32 WorldState::GetBattlesWon ( )
1507{
1508 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1509 return m_siData.m_battlesWon;
1510}

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

Referenced by BroadcastSIWorldstates(), and FillInitialWorldStates().

◆ GetLastAttackZone()

uint32 WorldState::GetLastAttackZone ( )
1521{
1522 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1524}
uint32 m_lastAttackZone
Definition WorldState.h:199

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

◆ GetMap()

Map * WorldState::GetMap ( uint32  mapId,
Position const &  invZone 
)
261{
262 Map* map = sMapMgr->FindBaseMap(mapId);
263 if (!map)
264 LOG_ERROR("scripts",
265 "ScourgeInvasionEvent::GetMap found no map with mapId {} , x: {}, y: {}.",
266 mapId,
267 invZone.GetPositionX(),
268 invZone.GetPositionY());
269 return map;
270}

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

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

◆ GetScourgeInvasionPrintout()

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

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

◆ GetSIRemaining()

uint32 WorldState::GetSIRemaining ( SIRemaining  remaining) const

◆ GetSIRemainingByZone()

uint32 WorldState::GetSIRemainingByZone ( uint32  zoneId) const
1472{
1473 SIRemaining remainingId;
1474 switch (zoneId)
1475 {
1476 case AREA_WINTERSPRING: remainingId = SI_REMAINING_WINTERSPRING; break;
1477 case AREA_AZSHARA: remainingId = SI_REMAINING_AZSHARA; break;
1479 case AREA_BLASTED_LANDS: remainingId = SI_REMAINING_BLASTED_LANDS; break;
1480 case AREA_BURNING_STEPPES: remainingId = SI_REMAINING_BURNING_STEPPES; break;
1481 case AREA_TANARIS: remainingId = SI_REMAINING_TANARIS; break;
1482 default:
1483 LOG_ERROR("WorldState", "GetSIRemainingByZone called with invalid zone ID: {}", zoneId);
1484 return 0;
1485 }
1486 return GetSIRemaining(remainingId);
1487}
@ 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)
1497{
1498 return m_siData.m_timers[timer];
1499}

References m_siData, and ScourgeInvasionData::m_timers.

Referenced by StartNewCityAttackIfTime(), and StartNewInvasionIfTime().

◆ GetSunsReachPrintout()

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

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

◆ GetTimerIdForZone()

uint32 WorldState::GetTimerIdForZone ( uint32  zoneId)
1942{
1943 uint32 attackTime = 0;
1944 switch (zoneId)
1945 {
1946 case AREA_TANARIS: attackTime = SI_TIMER_TANARIS; break;
1947 case AREA_BLASTED_LANDS: attackTime = SI_TIMER_BLASTED_LANDS; break;
1949 case AREA_BURNING_STEPPES: attackTime = SI_TIMER_BURNING_STEPPES; break;
1950 case AREA_WINTERSPRING: attackTime = SI_TIMER_WINTERSPRING; break;
1951 case AREA_AZSHARA: attackTime = SI_TIMER_AZSHARA; break;
1952 default:
1953 LOG_ERROR("gameevent", "ScourgeInvasionEvent::GetTimerIdForZone unknown zoneId {}.", zoneId);
1954 return 0;
1955 }
1956 return attackTime;
1957}

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
191{
192 auto const& itr = _worldstates.find(index);
193 return itr != _worldstates.end() ? itr->second : 0;
194}
WorldStatesMap _worldstates
Definition WorldState.h:312

References _worldstates.

◆ HandleActiveZone()

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

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

Referenced by Update().

◆ HandleConditionStateChange()

void WorldState::HandleConditionStateChange ( WorldStateCondition  conditionId,
WorldStateConditionState  state 
)
256{
257 _transportStates[conditionId] = state;
258}

References _transportStates.

◆ HandleDefendedZones()

void WorldState::HandleDefendedZones ( )
1577{
1579 {
1583 }
1589 {
1592 }
1594 {
1595 // The event is enabled via command, so we expect it to be disabled via command as well.
1596 // sGameEventMgr->StopEvent(GAME_EVENT_SCOURGE_INVASION);
1601 }
1602}
#define sGameEventMgr
Definition GameEventMgr.h:201
@ CONFIG_SCOURGEINVASION_COUNTER_THIRD
Definition WorldConfig.h:400
@ CONFIG_SCOURGEINVASION_COUNTER_SECOND
Definition WorldConfig.h:399
@ CONFIG_SCOURGEINVASION_COUNTER_FIRST
Definition WorldConfig.h:398
@ GAME_EVENT_SCOURGE_INVASION_150_INVASIONS
Definition WorldState.h:77
@ GAME_EVENT_SCOURGE_INVASION_INVASIONS_DONE
Definition WorldState.h:78
@ GAME_EVENT_SCOURGE_INVASION_50_INVASIONS
Definition WorldState.h:75
@ GAME_EVENT_SCOURGE_INVASION_100_INVASIONS
Definition WorldState.h:76

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

Referenced by AddBattlesWon(), and Load().

◆ HandleExternalEvent()

void WorldState::HandleExternalEvent ( WorldStateEvent  eventId,
uint32  param 
)
273{
274 std::lock_guard<std::mutex> guard(_mutex);
275 switch (eventId)
276 {
279 {
282 }
283 break;
285 if (param == TEAM_ALLIANCE)
286 {
289 }
290 else
291 {
294 }
295 break;
297 if (param == TEAM_ALLIANCE)
298 {
301 }
302 else
303 {
306 }
307 break;
308 default:
309 break;
310 }
311}
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:497
void DispelMagtheridonTeam(TeamId team)
Definition WorldState.cpp:464
std::mutex _mutex
Definition WorldState.h:327
void BuffMagtheridonTeam(TeamId team)
Definition WorldState.cpp:431
uint32 _adalSongOfBattleTimer
Definition WorldState.h:320

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

◆ HandlePlayerEnterZone()

void WorldState::HandlePlayerEnterZone ( Player player,
AreaTableIDs  zoneId 
)
356{
357 std::lock_guard<std::mutex> guard(_mutex);
358 switch (zoneId)
359 {
365 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
366 break;
374 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
375 else if (_isMagtheridonHeadSpawnedHorde && player->GetTeamId() == TEAM_HORDE)
376 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
377 break;
381 {
382 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
385 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
386 break;
387 }
388 default:
389 break;
390 }
391};
@ AREA_THE_MECHANAR
Definition AreaDefines.h:135
@ AREA_THE_BLOOD_FURNACE
Definition AreaDefines.h:121
@ AREA_HELLFIRE_CITADEL
Definition AreaDefines.h:111
@ AREA_THE_ARCATRAZ
Definition AreaDefines.h:134
@ AREA_HELLFIRE_RAMPARTS
Definition AreaDefines.h:110
@ AREA_MAGTHERIDONS_LAIR
Definition AreaDefines.h:132
@ AREA_THE_BOTANICA
Definition AreaDefines.h:133
@ AREA_HELLFIRE_PENINSULA
Definition AreaDefines.h:98
@ AREA_THE_SHATTERED_HALLS
Definition AreaDefines.h:122
@ SUBPHASE_ALL
Definition WorldState.h:229
@ SPELL_KIRU_SONG_OF_VICTORY
Definition WorldState.h:55
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114

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 
)
393{
394 std::lock_guard<std::mutex> guard(_mutex);
395 switch (zoneId)
396 {
403 break;
410 if (player->GetTeamId() == TEAM_ALLIANCE)
412 else if (player->GetTeamId() == TEAM_HORDE)
414 break;
418 {
419 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
424 break;
425 }
426 default:
427 break;
428 }
429};

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)
725{
726 if (newPhase < m_sunsReachData.m_phase)
727 {
728 while (newPhase != m_sunsReachData.m_phase)
729 {
732 }
734 }
735 else
736 {
738 bool moreThanOne = newPhase > m_sunsReachData.m_phase + 1; // custom command case
739 m_sunsReachData.m_phase = newPhase;
740 StartSunsReachPhase(moreThanOne);
741 }
742 switch (m_sunsReachData.m_phase)
743 {
749 break;
750 default: break;
751 }
754}
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB
Definition WorldState.h:101
@ GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL
Definition WorldState.h:92
@ GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL
Definition WorldState.h:96
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT
Definition WorldState.h:99
void StopSunsReachPhase(bool forward)
Definition WorldState.cpp:912
void StartSunsReachPhase(bool initial=false)
Definition WorldState.cpp:924

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 
)
757{
758 bool start = true;
759 if (subPhaseMask < 0)
760 {
761 start = false;
762 subPhaseMask = -subPhaseMask;
763 }
764 bool all = false;
765 if (start)
766 {
767 m_sunsReachData.m_subphaseMask |= subPhaseMask;
769 all = true;
770 }
771 else
772 {
774 all = true;
775 m_sunsReachData.m_subphaseMask &= ~subPhaseMask;
776 }
777 if (initial)
778 {
780 if ((subPhaseMask & SUBPHASE_PORTAL) == 0)
783 if ((subPhaseMask & SUBPHASE_ANVIL) == 0)
786 {
787 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB) == 0)
789 if ((subPhaseMask & SUBPHASE_MONUMENT) == 0)
791 }
792 }
793 if ((subPhaseMask & SUBPHASE_PORTAL))
794 {
797 if (start)
798 {
799 sGameEventMgr->StopEvent(first);
800 sGameEventMgr->StartEvent(second);
801 }
802 else
803 {
804 sGameEventMgr->StopEvent(second);
805 sGameEventMgr->StartEvent(first);
806 }
807 }
808 if ((subPhaseMask & SUBPHASE_ANVIL))
809 {
812 if (start)
813 {
814 sGameEventMgr->StopEvent(first);
815 sGameEventMgr->StartEvent(second);
816 }
817 else
818 {
819 sGameEventMgr->StopEvent(second);
820 sGameEventMgr->StartEvent(first);
821 }
822 }
823 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB))
824 {
827 if (start)
828 {
829 sGameEventMgr->StopEvent(first);
830 sGameEventMgr->StartEvent(second);
831 }
832 else
833 {
834 sGameEventMgr->StopEvent(second);
835 sGameEventMgr->StartEvent(first);
836 }
837 }
838 if ((subPhaseMask & SUBPHASE_MONUMENT))
839 {
842 if (start)
843 {
844 sGameEventMgr->StopEvent(first);
845 sGameEventMgr->StartEvent(second);
846 }
847 else
848 {
849 sGameEventMgr->StopEvent(second);
850 sGameEventMgr->StartEvent(first);
851 }
852 }
853 if (all)
854 {
855 if (start)
857 else
859
860 if (!initial)
861 {
862 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
863 for (ObjectGuid const& guid : m_sunsReachData.m_sunsReachReclamationPlayers)
864 if (Player* player = ObjectAccessor::FindPlayer(guid))
865 {
866 if (start)
867 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
868 else
869 player->RemoveAurasDueToSpell(SPELL_KIRU_SONG_OF_VICTORY);
870 }
871 }
872 }
873 if (!initial)
875}
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL
Definition WorldState.h:93
@ GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT
Definition WorldState.h:100
@ GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU
Definition WorldState.h:103
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL
Definition WorldState.h:97
@ GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB
Definition WorldState.h:102
Definition ObjectAccessor.h:61
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:269

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)
878{
879 if (newGate < m_sunsReachData.m_gate)
880 {
881 while (newGate != m_sunsReachData.m_gate)
882 {
885 }
887 }
888 else
889 {
891 m_sunsReachData.m_gate = newGate;
893 }
894 int32 worldState = 0;
895 switch (newGate)
896 {
900 }
901 if (worldState)
903
905}
void StartSunwellGatePhase()
Definition WorldState.cpp:1212
void StopSunwellGatePhase()
Definition WorldState.cpp:1224

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

References instance().

Referenced by instance().

◆ IsActiveZone()

bool WorldState::IsActiveZone ( uint32  zoneId)
1917{
1918 return false;
1919}

Referenced by StartNewInvasion().

◆ IsConditionFulfilled()

bool WorldState::IsConditionFulfilled ( uint32  conditionId,
uint32  state = WORLD_STATE_CONDITION_STATE_NONE 
) const
226{
227 switch (conditionId)
228 {
236 return _transportStates.at(conditionId) == state;
249 default:
250 LOG_ERROR("scripts", "WorldState::IsConditionFulfilled: Unhandled WorldStateCondition {}", conditionId);
251 return false;
252 }
253}
@ 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 ( )
51{
53 PreparedQueryResult result = CharacterDatabase.Query(stmt);
54
55 if (result)
56 {
57 do
58 {
59 Field* fields = result->Fetch();
60 uint32 id = fields[0].Get<uint32>();
61 std::string data = fields[1].Get<std::string>();
62 std::istringstream loadStream(data);
63
64 switch (id)
65 {
67 {
68 if (data.size())
69 {
70 try
71 {
73 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
75 loadStream >> m_sunsReachData.m_gate;
76 for (uint32 i = 0; i < COUNTERS_MAX_GATES; ++i)
77 loadStream >> m_sunsReachData.m_gateCounters[i];
78 }
79 catch (std::exception& e)
80 {
81 LOG_ERROR("scripts", "WorldState::Load: Exception reading SunsReach data {}", e.what());
87 }
88 }
89 else
90 {
96 }
97 break;
98 }
100 if (data.size())
101 {
102 try
103 {
104 uint32 state;
105 loadStream >> state;
106 m_siData.m_state = SIState(state);
107 for (TimePoint& m_timer : m_siData.m_timers)
108 {
109 uint64 time;
110 loadStream >> time;
111 m_timer = TimePoint(std::chrono::milliseconds(time));
112 }
114 for (unsigned int& i : m_siData.m_remaining)
115 loadStream >> i;
116 }
117 catch (std::exception& e)
118 {
119 LOG_ERROR("scripts", "WorldState::Load: Exception reading ScourgeInvasion data {}", e.what());
120 m_siData.Reset();
121 }
122 }
123 break;
124 }
125 } while (result->NextRow());
126 }
130
132 {
135 }
136}
@ CHAR_SEL_WORLD_STATE
Definition CharacterDatabase.h:545
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ COUNTERS_MAX_GATES
Definition WorldState.h:259
SIState
Definition WorldState.h:124
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
Definition PreparedStatement.h:157
void StartScourgeInvasion(bool sendMail)
Definition WorldState.cpp:1298
void Reset()
Definition WorldState.cpp:1417

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 ( )
139{
140 uint32 oldMSTime = getMSTime();
141
142 QueryResult result = CharacterDatabase.Query("SELECT entry, value FROM worldstates");
143
144 if (!result)
145 {
146 LOG_WARN("server.loading", ">> Loaded 0 world states. DB table `worldstates` is empty!");
147 LOG_INFO("server.loading", " ");
148 return;
149 }
150
151 do
152 {
153 Field* fields = result->Fetch();
154 _worldstates[fields[0].Get<uint32>()] = fields[1].Get<uint32>();
155 } while (result->NextRow());
156
157 LOG_INFO("server.loading", ">> Loaded {} World States in {} ms", _worldstates.size(), GetMSTimeDiffToNow(oldMSTime));
158 LOG_INFO("server.loading", " ");
159}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_WARN(filterType__,...)
Definition Log.h:149
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)
1906{
1907 if (!zone.pallidGuid)
1908 return;
1909
1910 Map* map = GetMap(zone.map, zone.pallid[0]);
1911
1912 if (Creature* pallid = map->GetCreature(zone.pallidGuid))
1913 pallid->DespawnOrUnsummon();
1914}
std::vector< Position > pallid
Definition WorldState.h:191
uint32 map
Definition WorldState.h:189
ObjectGuid pallidGuid
Definition WorldState.h:192

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

◆ OnDisable() [2/2]

void WorldState::OnDisable ( ScourgeInvasionData::InvasionZone zone)
1895{
1896 if (!zone.mouthGuid)
1897 return;
1898
1899 Map* map = GetMap(zone.map, zone.mouth[0]);
1900
1901 if (Creature* mouth = map->GetCreature(zone.mouthGuid))
1902 mouth->DespawnOrUnsummon();
1903}
std::vector< Position > mouth
Definition WorldState.h:183

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

Referenced by StopScourgeInvasion().

◆ OnEnable()

void WorldState::OnEnable ( ScourgeInvasionData::InvasionZone zone)
1884{
1885 // If there were remaining necropolises in the old zone before shutdown, we
1886 // restore that zone
1887 if (sWorldState->GetSIRemaining(SIRemaining(zone.remainingNecropoli)) > 0)
1888 ResumeInvasion(zone);
1889 // Otherwise we start a new Invasion
1890 else
1892}
uint32 GetTimerIdForZone(uint32 zoneId)
Definition WorldState.cpp:1941
bool ResumeInvasion(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1715
uint32 remainingNecropoli
Definition WorldState.h:182

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

Referenced by StartScourgeInvasion().

◆ RemovePendingInvasion()

void WorldState::RemovePendingInvasion ( uint32  zoneId)
1866{
1867 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1868 m_siData.m_pendingInvasions.erase(zoneId);
1869}

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

◆ RemovePendingPallid()

void WorldState::RemovePendingPallid ( uint32  zoneId)
1878{
1879 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1880 m_siData.m_pendingPallids.erase(zoneId);
1881}

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

◆ ResumeInvasion()

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

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)
197{
198 switch (saveId)
199 {
201 {
202 std::string expansionData = m_sunsReachData.GetData();
203 SaveHelper(expansionData, SAVE_ID_QUEL_DANAS);
204 break;
205 }
207 {
208 std::string siData = m_siData.GetData();
210 break;
211 }
212 default:
213 break;
214 }
215}
void SaveHelper(std::string &stringToSave, WorldStateSaveIds saveId)
Definition WorldState.cpp:217
std::string GetData()
Definition WorldState.cpp:1429
std::string GetData()
Definition WorldState.cpp:1108

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 
)
218{
220 stmt->SetData(0, saveId);
221 stmt->SetData(1, stringToSave);
222 CharacterDatabase.Execute(stmt);
223}
@ CHAR_REP_WORLD_STATE
Definition CharacterDatabase.h:546
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
1271{
1272 QueryResult result = CharacterDatabase.Query("SELECT guid FROM characters WHERE level >= 50");
1273 if (result)
1274 {
1275 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1277 uint32 count = 0;
1278 do
1279 {
1280 Field* fields = result->Fetch();
1281 ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
1282
1283 // Add item manually. SendMailTo does not add items for offline players
1285 {
1286 item->SaveToDB(trans);
1287 draft.AddItem(item);
1288 }
1289
1290 draft.SendMailTo(trans, MailReceiver(playerGUID.GetCounter()), NPC_ARGENT_EMISSARY, MAIL_CHECK_MASK_HAS_BODY);
1291 ++count;
1292 } while (result->NextRow());
1293 CharacterDatabase.CommitTransaction(trans);
1294 LOG_INFO("WorldState", "SendScourgeInvasionMail sent to {} characters", count);
1295 }
1296}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
@ MAIL_CHECK_MASK_HAS_BODY
Definition Mail.h:51
@ MAIL_TEMPLATE_ARGENT_DAWN_NEEDS_YOUR_HELP
Definition WorldState.h:120
@ ITEM_A_LETTER_FROM_THE_KEEPER_OF_THE_ROLLS
Definition WorldState.h:118
@ NPC_ARGENT_EMISSARY
Definition WorldState.h:119
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1094
Definition Mail.h:119
Definition Mail.h:105
LowType GetCounter() const
Definition ObjectGuid.h:149

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
552{
553 std::lock_guard<std::mutex> guard(mutex);
554 for (ObjectGuid const& guid : guids)
555 if (Player* player = ObjectAccessor::FindPlayer(guid))
556 player->SendUpdateWorldState(worldStateId, value);
557}

References ObjectAccessor::FindPlayer().

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

◆ SetLastAttackZone()

void WorldState::SetLastAttackZone ( uint32  zoneId)
1527{
1528 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1529 m_siData.m_lastAttackZone = zoneId;
1530}

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

◆ SetMouthGuid()

void WorldState::SetMouthGuid ( uint32  zoneId,
ObjectGuid  guid 
)
1855{
1856 m_siData.m_activeInvasions[zoneId].mouthGuid = guid;
1857}

References ScourgeInvasionData::m_activeInvasions, and m_siData.

◆ SetPallidGuid()

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

References ScourgeInvasionData::m_cityAttacks, and m_siData.

◆ SetScourgeInvasionState()

void WorldState::SetScourgeInvasionState ( SIState  state)
1257{
1258 SIState oldState = m_siData.m_state;
1259 if (oldState == state)
1260 return;
1261
1262 m_siData.m_state = state;
1263 if (oldState == STATE_0_DISABLED)
1265 else if (state == STATE_0_DISABLED)
1268}
void StopScourgeInvasion()
Definition WorldState.cpp:1445

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 
)
1490{
1491 std::lock_guard<std::mutex> guard(m_siData.m_siMutex);
1492 m_siData.m_remaining[remaining] = value;
1494}

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

◆ SetSITimer()

void WorldState::SetSITimer ( SITimers  timer,
TimePoint  timePoint 
)
1502{
1503 m_siData.m_timers[timer] = timePoint;
1504}

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 
)
163{
164 // Crossrealm nodes must not persist worldstates: their CharacterDatabase is
165 // the routing proxy and the write would land in an arbitrary realm DB. The
166 // in-memory value still has to be updated so read-modify-write users
167 // (e.g. the Wintergrasp clock) keep working.
168 if (!sToCloud9Sidecar->IsCrossrealm())
169 {
170 auto const& it = _worldstates.find(index);
171 if (it != _worldstates.end())
172 {
174 stmt->SetData(0, uint32(timeValue));
175 stmt->SetData(1, index);
176 CharacterDatabase.Execute(stmt);
177 }
178 else
179 {
181 stmt->SetData(0, index);
182 stmt->SetData(1, uint32(timeValue));
183 CharacterDatabase.Execute(stmt);
184 }
185 }
186
187 _worldstates[index] = timeValue;
188}
@ CHAR_INS_WORLDSTATE
Definition CharacterDatabase.h:309
@ CHAR_UPD_WORLDSTATE
Definition CharacterDatabase.h:308
#define sToCloud9Sidecar
Definition TC9Sidecar.h:76

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

◆ StartNewCityAttack()

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

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

Referenced by StartNewCityAttackIfTime(), and StartZoneEvent().

◆ StartNewCityAttackIfTime()

void WorldState::StartNewCityAttackIfTime ( uint32  attackTimeVar,
uint32  zoneId 
)
1633{
1634 TimePoint now = std::chrono::steady_clock::now();
1635
1636 // Not yet time
1637 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1638 return;
1639
1640 StartNewCityAttack(zoneId);
1642 TimePoint next_attack = now + std::chrono::seconds(cityAttackTimer);
1643 sWorldState->SetSITimer(SITimers(attackTimeVar), next_attack);
1644}
@ CITY_ATTACK_TIMER_MAX
Definition WorldState.h:172
@ CITY_ATTACK_TIMER_MIN
Definition WorldState.h:171
TimePoint GetSITimer(SITimers timer)
Definition WorldState.cpp:1496
void StartNewCityAttack(uint32 zoneId)
Definition WorldState.cpp:1688

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)
1647{
1648 if (IsActiveZone(zoneId))
1649 return;
1650
1651 // Don't attack same zone as before.
1652 if (zoneId == sWorldState->GetLastAttackZone())
1653 return;
1654
1655 // If we have at least one victory and more than 1 active zones stop here.
1656 if (GetActiveZones() > 1 && sWorldState->GetBattlesWon() > 0)
1657 return;
1658
1659 LOG_DEBUG("gameevent", "Scourge Invasion Event: Starting new invasion in {}.", zoneId);
1660
1662
1663 Map* map = GetMap(zone.map, zone.mouth[0]);
1664
1665 if (!map)
1666 {
1667 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unable to access required map ({}). Retrying next update.", zone.map);
1668 return;
1669 }
1670
1671 switch (zoneId)
1672 {
1679 default:
1680 LOG_ERROR("gameevent", "ScourgeInvasionEvent::StartNewInvasion unknown zoneId {}.", zoneId);
1681 return;
1682 }
1683
1684 if (map)
1685 SummonMouth(map, zone, zone.mouth[0], true);
1686}
@ GAME_EVENT_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldState.h:72
@ GAME_EVENT_SCOURGE_INVASION_AZSHARA
Definition WorldState.h:71
@ GAME_EVENT_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldState.h:74
@ GAME_EVENT_SCOURGE_INVASION_WINTERSPRING
Definition WorldState.h:69
@ GAME_EVENT_SCOURGE_INVASION_TANARIS
Definition WorldState.h:70
@ GAME_EVENT_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldState.h:73
bool IsActiveZone(uint32 zoneId)
Definition WorldState.cpp:1916

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 
)
1622{
1623 TimePoint now = std::chrono::steady_clock::now();
1624
1625 // Not yet time
1626 if (now < sWorldState->GetSITimer(SITimers(attackTimeVar)))
1627 return;
1628
1629 StartNewInvasion(zoneId);
1630}
void StartNewInvasion(uint32 zoneId)
Definition WorldState.cpp:1646

References GetSITimer(), and StartNewInvasion().

Referenced by HandleActiveZone(), and OnEnable().

◆ StartScourgeInvasion()

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

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

Referenced by Load(), and SetScourgeInvasionState().

◆ StartSunsReachPhase()

void WorldState::StartSunsReachPhase ( bool  initial = false)
private
925{
926 switch (m_sunsReachData.m_phase)
927 {
930 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
931 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
932 break;
936 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
937 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.5f);
938 break;
940 if (initial)
943 // TODO: Should be id 2 0.25f?
944 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
945 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.25f);
946 break;
948 if (initial)
949 {
952 }
954 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
955 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_FINE, 0.0f);
956 break;
957 default: break;
958 }
959}
@ MAP_OUTLAND
Definition AreaDefines.h:217
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY
Definition WorldState.h:94
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT
Definition WorldState.h:91
@ GAME_EVENT_QUEL_DANAS_PHASE_4
Definition WorldState.h:98
@ GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT
Definition WorldState.h:95
@ GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY
Definition WorldState.h:90
@ GAME_EVENT_QUEL_DANAS_PHASE_1
Definition WorldState.h:89
@ WEATHER_STATE_MEDIUM_RAIN
Definition Weather.h:50
@ WEATHER_STATE_FINE
Definition Weather.h:47
@ WEATHER_STATE_LIGHT_RAIN
Definition Weather.h:49

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
1213{
1214 switch (m_sunsReachData.m_gate)
1215 {
1220 default: break;
1221 }
1222}
@ GAME_EVENT_SWP_GATES_PHASE_1
Definition WorldState.h:106
@ GAME_EVENT_SWP_GATES_PHASE_3
Definition WorldState.h:108
@ GAME_EVENT_SWP_GATES_PHASE_0
Definition WorldState.h:105
@ GAME_EVENT_SWP_GATES_PHASE_2
Definition WorldState.h:107

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

Referenced by HandleSunwellGateTransition(), and Load().

◆ StartZoneEvent()

void WorldState::StartZoneEvent ( SIZoneIds  eventId)
1605{
1606 switch (eventId)
1607 {
1616 default:
1617 break;
1618 }
1619}
@ SI_ZONE_EASTERN_PLAGUELANDS
Definition WorldState.h:135
@ SI_ZONE_WINTERSPRING
Definition WorldState.h:137
@ SI_ZONE_UNDERCITY
Definition WorldState.h:139
@ SI_ZONE_AZSHARA
Definition WorldState.h:132
@ SI_ZONE_TANARIS
Definition WorldState.h:136
@ SI_ZONE_BLASTED_LANDS
Definition WorldState.h:133
@ SI_ZONE_BURNING_STEPPES
Definition WorldState.h:134
@ SI_ZONE_STORMWIND
Definition WorldState.h:138

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

◆ StopScourgeInvasion()

void WorldState::StopScourgeInvasion ( )
1446{
1457 m_siData.Reset();
1458
1459 for (auto& [_, cityData] : m_siData.m_cityAttacks)
1460 OnDisable(cityData);
1461
1462 for (auto& [_, zoneData] : m_siData.m_activeInvasions)
1463 OnDisable(zoneData);
1464}
void OnDisable(ScourgeInvasionData::InvasionZone &zone)
Definition WorldState.cpp:1894

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

Referenced by SetScourgeInvasionState().

◆ StopSunsReachPhase()

◆ StopSunwellGatePhase()

◆ SummonMouth()

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

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

Referenced by ResumeInvasion(), and StartNewInvasion().

◆ SummonPallid()

bool WorldState::SummonPallid ( Map map,
ScourgeInvasionData::CityAttack zone,
Position const &  position,
uint32  spawnLoc 
)
1773{
1775 // Remove old pallid if required.
1776 uint32 pathID = 0;
1777 if (Creature* existingPallid = map->GetCreature(zone.pallidGuid))
1778 existingPallid->AddObjectToRemoveList();
1779
1780 // if (Creature* pallid = map->SummonCreature(RAND(NPC_PALLID_HORROR, NPC_PATCHWORK_TERROR), position))
1781 if (Creature* pallid = map->SummonCreature(NPC_PALLID_HORROR, position))
1782 {
1783 pallid->GetMotionMaster()->Clear(false);
1784 if (pallid->GetZoneId() == AREA_UNDERCITY)
1786 else
1787 pathID = spawnLoc == 0 ? PATH_STORMWIND_KEEP : PATH_STORMWIND_TRADE_DISTRICT;
1788
1789 pallid->GetMotionMaster()->MoveWaypoint(pathID, false);
1790
1791 sWorldState->SetPallidGuid(zone.zoneId, pallid->GetGUID());
1792 }
1793 sWorldState->RemovePendingPallid(zone.zoneId);
1794
1795 return true;
1796}
@ PATH_STORMWIND_TRADE_DISTRICT
Definition WorldState.cpp:1767
@ PATH_UNDERCITY_TRADE_QUARTER
Definition WorldState.cpp:1768
@ PATH_UNDERCITY_ROYAL_QUARTER
Definition WorldState.cpp:1769
@ PATH_STORMWIND_KEEP
Definition WorldState.cpp:1766
@ NPC_PALLID_HORROR
Definition WorldState.h:115
void AddPendingPallid(uint32 zoneId)
Definition WorldState.cpp:1871
uint32 zoneId
Definition WorldState.h:190

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

Referenced by StartNewCityAttack().

◆ Update()

void WorldState::Update ( uint32  diff)
314{
316 {
317 if (_adalSongOfBattleTimer <= diff)
318 {
321 }
322 else
323 {
325 }
326 }
327
329 {
330 if (m_siData.m_broadcastTimer <= diff)
331 {
334
336 {
337 for (auto& zone : m_siData.m_cityAttacks)
338 {
339 if (zone.second.zoneId == AREA_UNDERCITY)
340 StartNewCityAttackIfTime(SI_TIMER_UNDERCITY, zone.second.zoneId);
341 else if (zone.second.zoneId == AREA_STORMWIND_CITY)
342 StartNewCityAttackIfTime(SI_TIMER_STORMWIND, zone.second.zoneId);
343 }
344
345 TimePoint now = std::chrono::steady_clock::now();
346 for (auto& zone : m_siData.m_activeInvasions)
347 HandleActiveZone(GetTimerIdForZone(zone.second.zoneId), zone.second.zoneId, zone.second.remainingNecropoli, now);
348 }
349 }
350 else
352 }
353}
void DispelAdalsSongOfBattle()
Definition WorldState.cpp:524
void HandleActiveZone(uint32 attackTimeVar, uint32 zoneId, uint32 remainingVar, TimePoint now)
Definition WorldState.cpp:1798
uint64 m_broadcastTimer
Definition WorldState.h:201

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

Member Data Documentation

◆ _adalSongOfBattleTimer

uint32 WorldState::_adalSongOfBattleTimer
private

◆ _isMagtheridonHeadSpawnedAlliance

bool WorldState::_isMagtheridonHeadSpawnedAlliance
private

◆ _isMagtheridonHeadSpawnedHorde

bool WorldState::_isMagtheridonHeadSpawnedHorde
private

◆ _mutex

std::mutex WorldState::_mutex
private

◆ _transportStates

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

◆ _worldstates

WorldStatesMap WorldState::_worldstates
private

◆ m_siData

◆ m_sunsReachData


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