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 (WorldStateCondition conditionId, WorldStateConditionState 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)
 

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)
 

Private Attributes

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

Detailed Description

Member Typedef Documentation

◆ WorldStatesMap

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

Constructor & Destructor Documentation

◆ WorldState()

WorldState::WorldState ( )
33{
37}
@ WORLD_STATE_CONDITION_STATE_NONE
Definition WorldState.h:37
@ WORLD_STATE_CONDITION_THE_THUNDERCALLER
Definition WorldState.h:30
@ WORLD_STATE_CONDITION_THE_IRON_EAGLE
Definition WorldState.h:31
@ WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS
Definition WorldState.h:32
std::map< WorldStateCondition, std::atomic< WorldStateConditionState > > _transportStates
Definition WorldState.h:198
bool _isMagtheridonHeadSpawnedAlliance
Definition WorldState.h:196
bool _isMagtheridonHeadSpawnedHorde
Definition WorldState.h:195

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
40{
41}

Member Function Documentation

◆ AddSunsReachProgress()

void WorldState::AddSunsReachProgress ( uint32  questId)
471{
472 uint32 counter = 0;
473 int32 otherCounter = -1;
474 int32 worldState = 0;
475 uint32 subPhaseMask = 0;
476 uint32 addedValue = 1;
477 switch (questId)
478 {
480 counter = COUNTER_ERRATIC_BEHAVIOR;
481 otherCounter = COUNTER_SANCTUM_WARDS;
483 break;
485 counter = COUNTER_SANCTUM_WARDS;
486 otherCounter = COUNTER_ERRATIC_BEHAVIOR;
488 break;
493 break;
498 break;
501 subPhaseMask = SUBPHASE_PORTAL;
503 break;
506 otherCounter = COUNTER_TAKING_THE_HARBOR;
508 break;
513 break;
515 counter = COUNTER_MAKING_READY;
516 subPhaseMask = SUBPHASE_ANVIL;
517 worldState = WORLD_STATE_QUEL_DANAS_ANVIL;
518 break;
521 subPhaseMask = SUBPHASE_ALCHEMY_LAB;
523 break;
526 subPhaseMask = SUBPHASE_MONUMENT;
528 break;
531 subPhaseMask = SUBPHASE_MONUMENT;
533 addedValue = 150;
534 break;
535 default:
536 return;
537 }
538
539 uint32 previousValue = 0;
540 uint32 newValue = 0;
541
542 if (!subPhaseMask)
544 else
545 previousValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
546 m_sunsReachData.m_sunsReachReclamationCounters[counter] += addedValue;
547 if (!subPhaseMask)
549 else
550 newValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
551 if (previousValue != newValue)
553
554 bool save = true;
556 uint32 modifier = 1;
557 if (otherCounter != -1)
558 {
559 modifier = 2;
560 counterValue += m_sunsReachData.m_sunsReachReclamationCounters[otherCounter];
561 }
562 if (counterValue >= sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX) * modifier)
563 {
564 save = false;
565 switch (questId)
566 {
569 {
572 break;
573 }
576 {
579 break;
580 }
582 {
585 break;
586 }
589 {
592 break;
593 }
595 {
598 break;
599 }
601 {
604 break;
605 }
608 {
611 break;
612 }
613 }
614 }
615 if (save)
617}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_SUNSREACH_COUNTER_MAX
Definition IWorld.h:428
@ 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:456
@ QUEST_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.cpp:460
@ QUEST_SANCTUM_WARDS
Definition WorldState.cpp:457
@ QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.cpp:458
@ QUEST_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.cpp:461
@ QUEST_MAKING_READY
Definition WorldState.cpp:463
@ QUEST_A_MAGNANIMOUS_BENEFACTOR
Definition WorldState.cpp:466
@ QUEST_DISCOVERING_YOUR_ROOTS
Definition WorldState.cpp:464
@ QUEST_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.cpp:459
@ QUEST_TAKING_THE_HARBOR
Definition WorldState.cpp:462
@ QUEST_A_CHARITABLE_DONATION
Definition WorldState.cpp:465
@ SUBPHASE_ALCHEMY_LAB
Definition WorldState.h:99
@ SUBPHASE_ANVIL
Definition WorldState.h:98
@ SUBPHASE_MONUMENT
Definition WorldState.h:100
@ SUBPHASE_PORTAL
Definition WorldState.h:97
@ SUNS_REACH_PHASE_3_ARMORY
Definition WorldState.h:91
@ SUNS_REACH_PHASE_2_SANCTUM
Definition WorldState.h:90
@ SUNS_REACH_PHASE_1_STAGING_AREA
Definition WorldState.h:89
@ SUNS_REACH_PHASE_4_HARBOR
Definition WorldState.h:92
@ COUNTER_ERRATIC_BEHAVIOR
Definition WorldState.h:106
@ COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.h:108
@ COUNTER_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.h:110
@ COUNTER_MAKING_READY
Definition WorldState.h:113
@ COUNTER_TAKING_THE_HARBOR
Definition WorldState.h:112
@ COUNTER_A_CHARITABLE_DONATION
Definition WorldState.h:115
@ COUNTER_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.h:111
@ COUNTER_DISCOVERING_YOUR_ROOTS
Definition WorldState.h:114
@ COUNTER_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.h:109
@ COUNTER_SANCTUM_WARDS
Definition WorldState.h:107
@ SAVE_ID_QUEL_DANAS
Definition WorldState.h:59
void HandleSunsReachPhaseTransition(uint32 newPhase)
Definition WorldState.cpp:619
void Save(WorldStateSaveIds saveId)
Definition WorldState.cpp:149
void SendWorldstateUpdate(std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
Definition WorldState.cpp:446
SunsReachReclamationData m_sunsReachData
Definition WorldState.h:197
void HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool initial=false)
Definition WorldState.cpp:651
#define sWorld
Definition World.h:357
uint32 m_subphaseMask
Definition WorldState.h:137
std::mutex m_sunsReachReclamationMutex
Definition WorldState.h:140
uint32 m_sunsReachReclamationCounters[COUNTERS_MAX]
Definition WorldState.h:138
uint32 GetPhasePercentage(uint32 phase)
Definition WorldState.cpp:953
uint32 m_phase
Definition WorldState.h:136
GuidVector m_sunsReachReclamationPlayers
Definition WorldState.h:139
uint32 GetSubPhasePercentage(uint32 subPhase)
Definition WorldState.cpp:964

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)
986{
987 uint32 counter = 0;
988 int32 worldState = 0;
989 uint32 addedValue = 1;
990 switch (questId)
991 {
995 break;
996 default: return;
997 }
998 switch (m_sunsReachData.m_gate)
999 {
1003 default: return;
1004 }
1006 uint32 newValue = 0;
1007 m_sunsReachData.m_gateCounters[counter] += addedValue;
1009 if (previousValue != newValue)
1011 bool save = true;
1013 {
1014 save = false;
1015 switch (questId)
1016 {
1018 {
1021 break;
1022 }
1024 {
1027 break;
1028 }
1030 {
1033 break;
1034 }
1035 }
1036 }
1037 if (save)
1039}
@ 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:979
@ QUEST_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.cpp:981
@ QUEST_ROHENDOR_THE_SECOND_GATE
Definition WorldState.cpp:980
@ COUNTER_MAX_VAL_REQ_SWP_GATES
Definition WorldState.cpp:982
@ SUNWELL_ARCHONISUS_GATE3_OPEN
Definition WorldState.h:124
@ SUNWELL_ALL_GATES_CLOSED
Definition WorldState.h:121
@ SUNWELL_AGAMATH_GATE1_OPEN
Definition WorldState.h:122
@ SUNWELL_ROHENDOR_GATE2_OPEN
Definition WorldState.h:123
@ COUNTER_ROHENDOR_THE_SECOND_GATE
Definition WorldState.h:129
@ COUNTER_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.h:130
@ COUNTER_AGAMATH_THE_FIRST_GATE
Definition WorldState.h:128
void HandleSunwellGateTransition(uint32 newGate)
Definition WorldState.cpp:772
uint32 m_gate
Definition WorldState.h:141
uint32 m_gateCounters[COUNTERS_MAX_GATES]
Definition WorldState.h:142
uint32 GetSunwellGatePercentage(uint32 gate)
Definition WorldState.cpp:1070

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.

◆ BuffAdalsSongOfBattle()

void WorldState::BuffAdalsSongOfBattle ( )
private
393{
394 sMapMgr->DoForAllMaps([&](Map* map) -> void
395 {
396 switch (map->GetId())
397 {
398 case MAP_OUTLAND:
399 map->DoForAllPlayers([&](Player* player)
400 {
401 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
402 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
403 });
404 break;
408 map->DoForAllPlayers([&](Player* player)
409 {
410 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
411 });
412 break;
413 default:
414 break;
415 }
416 });
417}
@ MAP_TEMPEST_KEEP_THE_BOTANICA
Definition AreaDefines.h:230
@ MAP_TEMPEST_KEEP_THE_ARCATRAZ
Definition AreaDefines.h:229
@ MAP_TEMPEST_KEEP_THE_MECHANAR
Definition AreaDefines.h:231
#define sMapMgr
Definition MapMgr.h:220
@ SPELL_ADAL_SONG_OF_BATTLE
Definition WorldState.h:49
Definition Map.h:156
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:3008
uint32 GetId() const
Definition Map.h:229
Definition Player.h:1082
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:1179

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
327{
328 sMapMgr->DoForAllMaps([&](Map* map) -> void
329 {
330 switch (map->GetId())
331 {
332 case MAP_OUTLAND:
333 map->DoForAllPlayers([&](Player* player)
334 {
335 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
336 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
337 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
338 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
339 });
340 break;
345 map->DoForAllPlayers([&](Player* player)
346 {
347 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
348 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
349 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
350 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
351 });
352 break;
353 default:
354 break;
355 }
356 });
357}
@ MAP_HELLFIRE_CITADEL_THE_BLOOD_FURNACE
Definition AreaDefines.h:221
@ MAP_HELLFIRE_CITADEL_RAMPARTS
Definition AreaDefines.h:222
@ MAP_HELLFIRE_CITADEL_THE_SHATTERED_HALLS
Definition AreaDefines.h:220
@ MAP_MAGTHERIDONS_LAIR
Definition AreaDefines.h:223
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ TEAM_HORDE
Definition SharedDefines.h:761
@ SPELL_NAZGRELS_FAVOR
Definition WorldState.h:52
@ SPELL_TROLLBANES_COMMAND
Definition WorldState.h:51
TeamId GetTeamId(bool original=false) const
Definition Player.h:2118

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
420{
421 sMapMgr->DoForAllMaps([&](Map* map) -> void
422 {
423 switch (map->GetId())
424 {
425 case MAP_OUTLAND:
426 map->DoForAllPlayers([&](Player* player)
427 {
428 if (player->GetZoneId() == AREA_SHATTRATH_CITY)
429 player->RemoveAurasDueToSpell(SPELL_ADAL_SONG_OF_BATTLE);
430 });
431 break;
435 map->DoForAllPlayers([&](Player* player)
436 {
438 });
439 break;
440 default:
441 break;
442 }
443 });
444}
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4942

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
360{
361 sMapMgr->DoForAllMaps([&](Map* map) -> void
362 {
363 switch (map->GetId())
364 {
365 case MAP_OUTLAND:
366 map->DoForAllPlayers([&](Player* player)
367 {
368 if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
369 player->RemoveAurasDueToSpell(SPELL_TROLLBANES_COMMAND);
370 else if (player->GetZoneId() == AREA_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
371 player->RemoveAurasDueToSpell(SPELL_NAZGRELS_FAVOR);
372 });
373 break;
378 map->DoForAllPlayers([&](Player* player)
379 {
380 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
382 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
384 });
385 break;
386 default:
387 break;
388 }
389 });
390}

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   
)
1091{
1092 switch (zoneId)
1093 {
1098 {
1099 // Sunwell Reclamation
1100 switch (m_sunsReachData.m_phase)
1101 {
1104 break;
1107 break;
1110 break;
1116 break;
1117 }
1123
1124 // Sunwell Gates
1125 switch (m_sunsReachData.m_gate)
1126 {
1129 break;
1132 break;
1135 break;
1136 }
1137 break;
1138 }
1139 }
1140}
@ AREA_ISLE_OF_QUEL_DANAS
Definition AreaDefines.h:138
@ AREA_MAGISTERS_TERRACE
Definition AreaDefines.h:141
@ AREA_SUNWELL_PLATEAU
Definition AreaDefines.h:137
@ AREA_SHATTRATH_CITY
Definition AreaDefines.h:116
@ WORLD_STATE_QUEL_DANAS_MUSIC
Definition WorldStateDefines.h:49
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46

References AREA_ISLE_OF_QUEL_DANAS, AREA_MAGISTERS_TERRACE, AREA_SHATTRATH_CITY, AREA_SUNWELL_PLATEAU, SunsReachReclamationData::GetPhasePercentage(), SunsReachReclamationData::GetSubPhasePercentage(), SunsReachReclamationData::GetSunwellGatePercentage(), SunsReachReclamationData::m_gate, SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, 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, and WorldPackets::WorldState::InitWorldStates::Worldstates.

◆ GetSunsReachPrintout()

std::string WorldState::GetSunsReachPrintout ( )
857{
858 auto formatPhase = [this]() -> std::string {
859 std::string name;
860 switch (m_sunsReachData.m_phase)
861 {
862 case SUNS_REACH_PHASE_1_STAGING_AREA: name = "Phase 1: Staging Area"; break;
863 case SUNS_REACH_PHASE_2_SANCTUM: name = "Phase 2: Sanctum"; break;
864 case SUNS_REACH_PHASE_3_ARMORY: name = "Phase 3: Armory"; break;
865 case SUNS_REACH_PHASE_4_HARBOR: name = "Phase 4: Harbor"; break;
866 default: name = "Unknown"; break;
867 }
868 return "Phase: " + std::to_string(m_sunsReachData.m_phase) + " (" + name + ") " + std::to_string(m_sunsReachData.GetPhasePercentage(m_sunsReachData.m_phase)) + "%\n";
869 };
870
871 auto formatSubPhase = [this](uint32 subPhase) -> std::string {
872 std::string name;
873 switch (subPhase)
874 {
875 case SUBPHASE_PORTAL: name = "Portal"; break;
876 case SUBPHASE_ANVIL: name = "Anvil"; break;
877 case SUBPHASE_ALCHEMY_LAB: name = "Alchemy Lab"; break;
878 case SUBPHASE_MONUMENT: name = "Monument"; break;
879 default: name = "Unknown"; break;
880 }
881 return name + ": " + (m_sunsReachData.m_subphaseMask & subPhase ? "100%" : std::to_string(m_sunsReachData.GetSubPhasePercentage(subPhase)) + "%");
882 };
883
884 auto formatCounter = [](uint32 counter, uint32 value) -> std::string {
885 switch (counter)
886 {
888 return "Erratic Behavior: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
890 return "Sanctum Wards: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
892 return "Battle for the Sun's Reach Armory: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
894 return "Distraction at the Dead Scar: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
896 return "Intercepting the Mana Cells: " + std::to_string(value) + " (counts towards Subphase: Portal)";
898 return "Intercept the Reinforcements: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
900 return "Taking the Harbor: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
902 return "Making Ready: " + std::to_string(value) + " (counts towards Subphase: Anvil)";
904 return "Discovering Your Roots: " + std::to_string(value) + " (counts towards Subphase: Alchemy Lab)";
906 return "A Charitable Donation: " + std::to_string(value) + " (counts towards Subphase: Monument)";
907 default:
908 return "Unknown: " + std::to_string(value) + " (Unknown goal)";
909 }
910 };
911
912 std::string output = formatPhase();
913 output += "Subphase mask: " + std::to_string(m_sunsReachData.m_subphaseMask) + "\n";
914 for (uint32 i = 0; i < 4; ++i)
915 {
916 uint32 subPhaseMask = 1 << i;
917 output += " " + formatSubPhase(subPhaseMask) + "\n";
918 }
919 output += "Counters:\n";
920 output += " Sunsreach.CounterMax = " + std::to_string(sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX)) + "\n";
921 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
922 output += " " + std::to_string(i) + ". " + formatCounter(i, m_sunsReachData.m_sunsReachReclamationCounters[i]) + "\n";
923
924 // Sunwell Gates
925 auto formatGatePhase = [](uint32 gate) -> std::string {
926 switch (gate)
927 {
928 case SUNWELL_ALL_GATES_CLOSED: return "All Gates Closed"; break;
929 case SUNWELL_AGAMATH_GATE1_OPEN: return "Gate 1 Agamath Open"; break;
930 case SUNWELL_ROHENDOR_GATE2_OPEN: return "Gate 2 Rohendar Open"; break;
931 case SUNWELL_ARCHONISUS_GATE3_OPEN: return "Gate 3 Archonisus Open"; break;
932 default: return "Unknown"; break;
933 }
934 };
935 output += "Sunwell Plateau Gate Phase " + std::to_string(m_sunsReachData.m_gate) + " (" + formatGatePhase(m_sunsReachData.m_gate) + ")" + ":\n";
936 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";
937 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";
938 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";
939 return output;
940}
@ COUNTERS_MAX
Definition WorldState.h:116
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.

◆ getWorldState()

uint64 WorldState::getWorldState ( uint32  index) const
144{
145 auto const& itr = _worldstates.find(index);
146 return itr != _worldstates.end() ? itr->second : 0;
147}
WorldStatesMap _worldstates
Definition WorldState.h:184

References _worldstates.

◆ HandleConditionStateChange()

void WorldState::HandleConditionStateChange ( WorldStateCondition  conditionId,
WorldStateConditionState  state 
)
189{
190 _transportStates[conditionId] = state;
191}

References _transportStates.

◆ HandleExternalEvent()

void WorldState::HandleExternalEvent ( WorldStateEvent  eventId,
uint32  param 
)
194{
195 std::lock_guard<std::mutex> guard(_mutex);
196 switch (eventId)
197 {
200 {
203 }
204 break;
206 if (param == TEAM_ALLIANCE)
207 {
210 }
211 else
212 {
215 }
216 break;
218 if (param == TEAM_ALLIANCE)
219 {
222 }
223 else
224 {
227 }
228 break;
229 default:
230 break;
231 }
232}
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:44
@ WORLD_STATE_CUSTOM_EVENT_ON_ADALS_SONG_OF_BATTLE
Definition WorldState.h:42
@ WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_SPAWN
Definition WorldState.h:43
void BuffAdalsSongOfBattle()
Definition WorldState.cpp:392
void DispelMagtheridonTeam(TeamId team)
Definition WorldState.cpp:359
std::mutex _mutex
Definition WorldState.h:199
void BuffMagtheridonTeam(TeamId team)
Definition WorldState.cpp:326
uint32 _adalSongOfBattleTimer
Definition WorldState.h:192

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 
)
251{
252 std::lock_guard<std::mutex> guard(_mutex);
253 switch (zoneId)
254 {
260 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
261 break;
269 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
270 else if (_isMagtheridonHeadSpawnedHorde && player->GetTeamId() == TEAM_HORDE)
271 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
272 break;
276 {
277 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
280 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
281 break;
282 }
283 default:
284 break;
285 }
286};
@ AREA_THE_MECHANAR
Definition AreaDefines.h:133
@ AREA_THE_BLOOD_FURNACE
Definition AreaDefines.h:119
@ AREA_HELLFIRE_CITADEL
Definition AreaDefines.h:109
@ AREA_THE_ARCATRAZ
Definition AreaDefines.h:132
@ AREA_HELLFIRE_RAMPARTS
Definition AreaDefines.h:108
@ AREA_MAGTHERIDONS_LAIR
Definition AreaDefines.h:130
@ AREA_THE_BOTANICA
Definition AreaDefines.h:131
@ AREA_HELLFIRE_PENINSULA
Definition AreaDefines.h:97
@ AREA_THE_SHATTERED_HALLS
Definition AreaDefines.h:120
@ SUBPHASE_ALL
Definition WorldState.h:101
@ SPELL_KIRU_SONG_OF_VICTORY
Definition WorldState.h:54
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113

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

◆ HandlePlayerLeaveZone()

void WorldState::HandlePlayerLeaveZone ( Player player,
AreaTableIDs  zoneId 
)
288{
289 std::lock_guard<std::mutex> guard(_mutex);
290 switch (zoneId)
291 {
298 break;
305 if (player->GetTeamId() == TEAM_ALLIANCE)
307 else if (player->GetTeamId() == TEAM_HORDE)
309 break;
313 {
314 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
319 break;
320 }
321 default:
322 break;
323 }
324};

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)
620{
621 if (newPhase < m_sunsReachData.m_phase)
622 {
623 while (newPhase != m_sunsReachData.m_phase)
624 {
627 }
629 }
630 else
631 {
633 bool moreThanOne = newPhase > m_sunsReachData.m_phase + 1; // custom command case
634 m_sunsReachData.m_phase = newPhase;
635 StartSunsReachPhase(moreThanOne);
636 }
637 switch (m_sunsReachData.m_phase)
638 {
644 break;
645 default: break;
646 }
649}
#define sGameEventMgr
Definition GameEventMgr.h:201
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB
Definition WorldState.h:77
@ GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL
Definition WorldState.h:68
@ GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL
Definition WorldState.h:72
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT
Definition WorldState.h:75
void StopSunsReachPhase(bool forward)
Definition WorldState.cpp:807
void StartSunsReachPhase(bool initial=false)
Definition WorldState.cpp:819

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 
)
652{
653 bool start = true;
654 if (subPhaseMask < 0)
655 {
656 start = false;
657 subPhaseMask = -subPhaseMask;
658 }
659 bool all = false;
660 if (start)
661 {
662 m_sunsReachData.m_subphaseMask |= subPhaseMask;
664 all = true;
665 }
666 else
667 {
669 all = true;
670 m_sunsReachData.m_subphaseMask &= ~subPhaseMask;
671 }
672 if (initial)
673 {
675 if ((subPhaseMask & SUBPHASE_PORTAL) == 0)
678 if ((subPhaseMask & SUBPHASE_ANVIL) == 0)
681 {
682 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB) == 0)
684 if ((subPhaseMask & SUBPHASE_MONUMENT) == 0)
686 }
687 }
688 if ((subPhaseMask & SUBPHASE_PORTAL))
689 {
692 if (start)
693 {
694 sGameEventMgr->StopEvent(first);
695 sGameEventMgr->StartEvent(second);
696 }
697 else
698 {
699 sGameEventMgr->StopEvent(second);
700 sGameEventMgr->StartEvent(first);
701 }
702 }
703 if ((subPhaseMask & SUBPHASE_ANVIL))
704 {
707 if (start)
708 {
709 sGameEventMgr->StopEvent(first);
710 sGameEventMgr->StartEvent(second);
711 }
712 else
713 {
714 sGameEventMgr->StopEvent(second);
715 sGameEventMgr->StartEvent(first);
716 }
717 }
718 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB))
719 {
722 if (start)
723 {
724 sGameEventMgr->StopEvent(first);
725 sGameEventMgr->StartEvent(second);
726 }
727 else
728 {
729 sGameEventMgr->StopEvent(second);
730 sGameEventMgr->StartEvent(first);
731 }
732 }
733 if ((subPhaseMask & SUBPHASE_MONUMENT))
734 {
737 if (start)
738 {
739 sGameEventMgr->StopEvent(first);
740 sGameEventMgr->StartEvent(second);
741 }
742 else
743 {
744 sGameEventMgr->StopEvent(second);
745 sGameEventMgr->StartEvent(first);
746 }
747 }
748 if (all)
749 {
750 if (start)
752 else
754
755 if (!initial)
756 {
757 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
758 for (ObjectGuid& guid : m_sunsReachData.m_sunsReachReclamationPlayers)
759 if (Player* player = ObjectAccessor::FindPlayer(guid))
760 {
761 if (start)
762 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
763 else
764 player->RemoveAurasDueToSpell(SPELL_KIRU_SONG_OF_VICTORY);
765 }
766 }
767 }
768 if (!initial)
770}
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL
Definition WorldState.h:69
@ GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT
Definition WorldState.h:76
@ GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU
Definition WorldState.h:79
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL
Definition WorldState.h:73
@ GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB
Definition WorldState.h:78
Definition ObjectGuid.h:118
Definition ObjectAccessor.h:61
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

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

Referenced by AddSunsReachProgress(), and Load().

◆ HandleSunwellGateTransition()

void WorldState::HandleSunwellGateTransition ( uint32  newGate)
773{
774 if (newGate < m_sunsReachData.m_gate)
775 {
776 while (newGate != m_sunsReachData.m_gate)
777 {
780 }
782 }
783 else
784 {
786 m_sunsReachData.m_gate = newGate;
788 }
789 int32 worldState = 0;
790 switch (newGate)
791 {
795 }
796 if (worldState)
798
800}
void StartSunwellGatePhase()
Definition WorldState.cpp:1046
void StopSunwellGatePhase()
Definition WorldState.cpp:1058

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
27{
28 static WorldState instance;
29 return &instance;
30}
Definition WorldState.h:156
static WorldState * instance()
Definition WorldState.cpp:26

References instance().

Referenced by instance().

◆ IsConditionFulfilled()

bool WorldState::IsConditionFulfilled ( WorldStateCondition  conditionId,
WorldStateConditionState  state = WORLD_STATE_CONDITION_STATE_NONE 
) const
171{
172 switch (conditionId)
173 {
181 return _transportStates.at(conditionId) == state;
182 default:
183 LOG_ERROR("scripts", "WorldState::IsConditionFulfilled: Unhandled WorldStateCondition {}", conditionId);
184 return false;
185 }
186}
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
@ WORLD_STATE_CONDITION_NAZGRELS_FAVOR
Definition WorldState.h:28
@ WORLD_STATE_CONDITION_TROLLBANES_COMMAND
Definition WorldState.h:27

References _isMagtheridonHeadSpawnedAlliance, _isMagtheridonHeadSpawnedHorde, _transportStates, LOG_ERROR, WORLD_STATE_CONDITION_NAZGRELS_FAVOR, WORLD_STATE_CONDITION_THE_IRON_EAGLE, WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS, WORLD_STATE_CONDITION_THE_THUNDERCALLER, and WORLD_STATE_CONDITION_TROLLBANES_COMMAND.

◆ Load()

void WorldState::Load ( )
44{
45 QueryResult result = CharacterDatabase.Query("SELECT Id, Data FROM world_state");
46 if (result)
47 {
48 do
49 {
50 Field* fields = result->Fetch();
51 uint32 id = fields[0].Get<uint32>();
52 std::string data = fields[1].Get<std::string>();
53 std::istringstream loadStream(data);
54
55 switch (id)
56 {
58 {
59 if (data.size())
60 {
61 try
62 {
64 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
66 loadStream >> m_sunsReachData.m_gate;
67 for (uint32 i = 0; i < COUNTERS_MAX_GATES; ++i)
68 loadStream >> m_sunsReachData.m_gateCounters[i];
69 }
70 catch (std::exception& e)
71 {
72 LOG_ERROR("scripts", "WorldState::Load: Exception reading SunsReach data {}", e.what());
78 }
79 }
80 else
81 {
87 }
88 break;
89 }
90 }
91 } while (result->NextRow());
92 }
96}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ COUNTERS_MAX_GATES
Definition WorldState.h:131
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

References CharacterDatabase, COUNTERS_MAX, COUNTERS_MAX_GATES, Field::Get(), HandleSunsReachSubPhaseTransition(), LOG_ERROR, SunsReachReclamationData::m_gate, SunsReachReclamationData::m_gateCounters, SunsReachReclamationData::m_phase, SunsReachReclamationData::m_subphaseMask, m_sunsReachData, SunsReachReclamationData::m_sunsReachReclamationCounters, SAVE_ID_QUEL_DANAS, StartSunsReachPhase(), StartSunwellGatePhase(), and SUNWELL_ALL_GATES_CLOSED.

◆ LoadWorldStates()

void WorldState::LoadWorldStates ( )
99{
100 uint32 oldMSTime = getMSTime();
101
102 QueryResult result = CharacterDatabase.Query("SELECT entry, value FROM worldstates");
103
104 if (!result)
105 {
106 LOG_WARN("server.loading", ">> Loaded 0 world states. DB table `worldstates` is empty!");
107 LOG_INFO("server.loading", " ");
108 return;
109 }
110
111 do
112 {
113 Field* fields = result->Fetch();
114 _worldstates[fields[0].Get<uint32>()] = fields[1].Get<uint32>();
115 } while (result->NextRow());
116
117 LOG_INFO("server.loading", ">> Loaded {} World States in {} ms", _worldstates.size(), GetMSTimeDiffToNow(oldMSTime));
118 LOG_INFO("server.loading", " ");
119}
#define LOG_INFO(filterType__,...)
Definition Log.h:165
#define LOG_WARN(filterType__,...)
Definition Log.h:161
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.

◆ Save()

void WorldState::Save ( WorldStateSaveIds  saveId)
150{
151 switch (saveId)
152 {
154 {
155 std::string expansionData = m_sunsReachData.GetData();
156 SaveHelper(expansionData, SAVE_ID_QUEL_DANAS);
157 break;
158 }
159 default:
160 break;
161 }
162}
void SaveHelper(std::string &stringToSave, WorldStateSaveIds saveId)
Definition WorldState.cpp:164
std::string GetData()
Definition WorldState.cpp:942

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

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

◆ SaveHelper()

void WorldState::SaveHelper ( std::string &  stringToSave,
WorldStateSaveIds  saveId 
)
165{
166 CharacterDatabase.Execute("DELETE FROM world_state WHERE Id='{}'", saveId);
167 CharacterDatabase.Execute("INSERT INTO world_state(Id,Data) VALUES('{}','{}')", saveId, stringToSave.data());
168}

References CharacterDatabase.

Referenced by Save().

◆ SendWorldstateUpdate()

void WorldState::SendWorldstateUpdate ( std::mutex &  mutex,
GuidVector const &  guids,
uint32  value,
uint32  worldStateId 
)
private
447{
448 std::lock_guard<std::mutex> guard(mutex);
449 for (ObjectGuid const& guid : guids)
450 if (Player* player = ObjectAccessor::FindPlayer(guid))
451 player->SendUpdateWorldState(worldStateId, value);
452}

References ObjectAccessor::FindPlayer().

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

◆ SetSunsReachCounter()

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

◆ SetSunwellGateCounter()

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

◆ setWorldState()

void WorldState::setWorldState ( uint32  index,
uint64  value 
)
123{
124 auto const& it = _worldstates.find(index);
125 if (it != _worldstates.end())
126 {
128 stmt->SetData(0, uint32(timeValue));
129 stmt->SetData(1, index);
130 CharacterDatabase.Execute(stmt);
131 }
132 else
133 {
135 stmt->SetData(0, index);
136 stmt->SetData(1, uint32(timeValue));
137 CharacterDatabase.Execute(stmt);
138 }
139
140 _worldstates[index] = timeValue;
141}
@ CHAR_INS_WORLDSTATE
Definition CharacterDatabase.h:307
@ CHAR_UPD_WORLDSTATE
Definition CharacterDatabase.h:306
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

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

◆ StartSunsReachPhase()

void WorldState::StartSunsReachPhase ( bool  initial = false)
private
820{
821 switch (m_sunsReachData.m_phase)
822 {
825 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
826 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
827 break;
831 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
832 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.5f);
833 break;
835 if (initial)
838 // TODO: Should be id 2 0.25f?
839 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
840 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.25f);
841 break;
843 if (initial)
844 {
847 }
849 if (Map* map = sMapMgr->FindBaseNonInstanceMap(MAP_OUTLAND))
850 map->SetZoneWeather(AREA_ISLE_OF_QUEL_DANAS, WEATHER_STATE_FINE, 0.0f);
851 break;
852 default: break;
853 }
854}
@ MAP_OUTLAND
Definition AreaDefines.h:215
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY
Definition WorldState.h:70
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT
Definition WorldState.h:67
@ GAME_EVENT_QUEL_DANAS_PHASE_4
Definition WorldState.h:74
@ GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT
Definition WorldState.h:71
@ GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY
Definition WorldState.h:66
@ GAME_EVENT_QUEL_DANAS_PHASE_1
Definition WorldState.h:65
@ WEATHER_STATE_MEDIUM_RAIN
Definition Weather.h:49
@ WEATHER_STATE_FINE
Definition Weather.h:46
@ WEATHER_STATE_LIGHT_RAIN
Definition Weather.h:48

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

Referenced by HandleSunsReachPhaseTransition(), and Load().

◆ StartSunwellGatePhase()

void WorldState::StartSunwellGatePhase ( )
private
1047{
1048 switch (m_sunsReachData.m_gate)
1049 {
1054 default: break;
1055 }
1056}
@ GAME_EVENT_SWP_GATES_PHASE_1
Definition WorldState.h:82
@ GAME_EVENT_SWP_GATES_PHASE_3
Definition WorldState.h:84
@ GAME_EVENT_SWP_GATES_PHASE_0
Definition WorldState.h:81
@ GAME_EVENT_SWP_GATES_PHASE_2
Definition WorldState.h:83

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

◆ StopSunsReachPhase()

◆ StopSunwellGatePhase()

◆ Update()

void WorldState::Update ( uint32  diff)
235{
237 {
238 if (_adalSongOfBattleTimer <= diff)
239 {
242 }
243 else
244 {
246 }
247 }
248}
void DispelAdalsSongOfBattle()
Definition WorldState.cpp:419

References _adalSongOfBattleTimer, and DispelAdalsSongOfBattle().

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<WorldStateCondition, std::atomic<WorldStateConditionState> > WorldState::_transportStates
private

◆ _worldstates

WorldStatesMap WorldState::_worldstates
private

◆ m_sunsReachData


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