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 Save (WorldStateSaveIds saveId)
 
void SaveHelper (std::string &stringToSave, WorldStateSaveIds saveId)
 
void HandlePlayerEnterZone (Player *player, WorldStateZoneId zoneId)
 
void HandlePlayerLeaveZone (Player *player, WorldStateZoneId 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 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

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

Detailed Description

Constructor & Destructor Documentation

◆ WorldState()

WorldState::WorldState ( )
33{
37}
@ WORLD_STATE_CONDITION_STATE_NONE
Definition WorldState.h:36
@ WORLD_STATE_CONDITION_THE_THUNDERCALLER
Definition WorldState.h:29
@ WORLD_STATE_CONDITION_THE_IRON_EAGLE
Definition WorldState.h:30
@ WORLD_STATE_CONDITION_THE_PURPLE_PRINCESS
Definition WorldState.h:31
std::map< WorldStateCondition, std::atomic< WorldStateConditionState > > _transportStates
Definition WorldState.h:211
bool _isMagtheridonHeadSpawnedAlliance
Definition WorldState.h:209
bool _isMagtheridonHeadSpawnedHorde
Definition WorldState.h:208

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)
420{
421 uint32 counter = 0;
422 int32 otherCounter = -1;
423 int32 worldState = 0;
424 uint32 subPhaseMask = 0;
425 uint32 addedValue = 1;
426 switch (questId)
427 {
429 counter = COUNTER_ERRATIC_BEHAVIOR;
430 otherCounter = COUNTER_SANCTUM_WARDS;
432 break;
434 counter = COUNTER_SANCTUM_WARDS;
435 otherCounter = COUNTER_ERRATIC_BEHAVIOR;
437 break;
442 break;
447 break;
450 subPhaseMask = SUBPHASE_PORTAL;
452 break;
455 otherCounter = COUNTER_TAKING_THE_HARBOR;
457 break;
462 break;
464 counter = COUNTER_MAKING_READY;
465 subPhaseMask = SUBPHASE_ANVIL;
466 worldState = WORLD_STATE_QUEL_DANAS_ANVIL;
467 break;
470 subPhaseMask = SUBPHASE_ALCHEMY_LAB;
472 break;
475 subPhaseMask = SUBPHASE_MONUMENT;
477 break;
480 subPhaseMask = SUBPHASE_MONUMENT;
482 addedValue = 150;
483 break;
484 default:
485 return;
486 }
487
488 uint32 previousValue = 0;
489 uint32 newValue = 0;
490
491 if (!subPhaseMask)
493 else
494 previousValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
495 m_sunsReachData.m_sunsReachReclamationCounters[counter] += addedValue;
496 if (!subPhaseMask)
498 else
499 newValue = m_sunsReachData.GetSubPhasePercentage(subPhaseMask);
500 if (previousValue != newValue)
502
503 bool save = true;
505 uint32 modifier = 1;
506 if (otherCounter != -1)
507 {
508 modifier = 2;
509 counterValue += m_sunsReachData.m_sunsReachReclamationCounters[otherCounter];
510 }
511 if (counterValue >= sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX) * modifier)
512 {
513 save = false;
514 switch (questId)
515 {
518 {
521 break;
522 }
525 {
528 break;
529 }
531 {
534 break;
535 }
538 {
541 break;
542 }
544 {
547 break;
548 }
550 {
553 break;
554 }
557 {
560 break;
561 }
562 }
563 }
564 if (save)
566}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_SUNSREACH_COUNTER_MAX
Definition IWorld.h:426
@ 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:405
@ QUEST_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.cpp:409
@ QUEST_SANCTUM_WARDS
Definition WorldState.cpp:406
@ QUEST_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.cpp:407
@ QUEST_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.cpp:410
@ QUEST_MAKING_READY
Definition WorldState.cpp:412
@ QUEST_A_MAGNANIMOUS_BENEFACTOR
Definition WorldState.cpp:415
@ QUEST_DISCOVERING_YOUR_ROOTS
Definition WorldState.cpp:413
@ QUEST_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.cpp:408
@ QUEST_TAKING_THE_HARBOR
Definition WorldState.cpp:411
@ QUEST_A_CHARITABLE_DONATION
Definition WorldState.cpp:414
@ SUBPHASE_ALCHEMY_LAB
Definition WorldState.h:117
@ SUBPHASE_ANVIL
Definition WorldState.h:116
@ SUBPHASE_MONUMENT
Definition WorldState.h:118
@ SUBPHASE_PORTAL
Definition WorldState.h:115
@ SUNS_REACH_PHASE_3_ARMORY
Definition WorldState.h:109
@ SUNS_REACH_PHASE_2_SANCTUM
Definition WorldState.h:108
@ SUNS_REACH_PHASE_1_STAGING_AREA
Definition WorldState.h:107
@ SUNS_REACH_PHASE_4_HARBOR
Definition WorldState.h:110
@ COUNTER_ERRATIC_BEHAVIOR
Definition WorldState.h:124
@ COUNTER_BATTLE_FOR_THE_SUNS_REACH_ARMORY
Definition WorldState.h:126
@ COUNTER_INTERCEPTING_THE_MANA_CELLS
Definition WorldState.h:128
@ COUNTER_MAKING_READY
Definition WorldState.h:131
@ COUNTER_TAKING_THE_HARBOR
Definition WorldState.h:130
@ COUNTER_A_CHARITABLE_DONATION
Definition WorldState.h:133
@ COUNTER_INTERCEPT_THE_REINFORCEMENTS
Definition WorldState.h:129
@ COUNTER_DISCOVERING_YOUR_ROOTS
Definition WorldState.h:132
@ COUNTER_DISTRACTION_AT_THE_DEAD_SCAR
Definition WorldState.h:127
@ COUNTER_SANCTUM_WARDS
Definition WorldState.h:125
@ SAVE_ID_QUEL_DANAS
Definition WorldState.h:77
void HandleSunsReachPhaseTransition(uint32 newPhase)
Definition WorldState.cpp:568
void Save(WorldStateSaveIds saveId)
Definition WorldState.cpp:98
void SendWorldstateUpdate(std::mutex &mutex, GuidVector const &guids, uint32 value, uint32 worldStateId)
Definition WorldState.cpp:395
SunsReachReclamationData m_sunsReachData
Definition WorldState.h:210
void HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool initial=false)
Definition WorldState.cpp:600
#define sWorld
Definition World.h:363
uint32 m_subphaseMask
Definition WorldState.h:155
std::mutex m_sunsReachReclamationMutex
Definition WorldState.h:158
uint32 m_sunsReachReclamationCounters[COUNTERS_MAX]
Definition WorldState.h:156
uint32 GetPhasePercentage(uint32 phase)
Definition WorldState.cpp:902
uint32 m_phase
Definition WorldState.h:154
GuidVector m_sunsReachReclamationPlayers
Definition WorldState.h:157
uint32 GetSubPhasePercentage(uint32 subPhase)
Definition WorldState.cpp:913

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)
935{
936 uint32 counter = 0;
937 int32 worldState = 0;
938 uint32 addedValue = 1;
939 switch (questId)
940 {
944 break;
945 default: return;
946 }
947 switch (m_sunsReachData.m_gate)
948 {
952 default: return;
953 }
955 uint32 newValue = 0;
956 m_sunsReachData.m_gateCounters[counter] += addedValue;
958 if (previousValue != newValue)
960 bool save = true;
962 {
963 save = false;
964 switch (questId)
965 {
967 {
970 break;
971 }
973 {
976 break;
977 }
979 {
982 break;
983 }
984 }
985 }
986 if (save)
988}
@ 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:928
@ QUEST_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.cpp:930
@ QUEST_ROHENDOR_THE_SECOND_GATE
Definition WorldState.cpp:929
@ COUNTER_MAX_VAL_REQ_SWP_GATES
Definition WorldState.cpp:931
@ SUNWELL_ARCHONISUS_GATE3_OPEN
Definition WorldState.h:142
@ SUNWELL_ALL_GATES_CLOSED
Definition WorldState.h:139
@ SUNWELL_AGAMATH_GATE1_OPEN
Definition WorldState.h:140
@ SUNWELL_ROHENDOR_GATE2_OPEN
Definition WorldState.h:141
@ COUNTER_ROHENDOR_THE_SECOND_GATE
Definition WorldState.h:147
@ COUNTER_ARCHONISUS_THE_FINAL_GATE
Definition WorldState.h:148
@ COUNTER_AGAMATH_THE_FIRST_GATE
Definition WorldState.h:146
void HandleSunwellGateTransition(uint32 newGate)
Definition WorldState.cpp:721
uint32 m_gate
Definition WorldState.h:159
uint32 m_gateCounters[COUNTERS_MAX_GATES]
Definition WorldState.h:160
uint32 GetSunwellGatePercentage(uint32 gate)
Definition WorldState.cpp:1019

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
342{
343 sMapMgr->DoForAllMaps([&](Map* map) -> void
344 {
345 switch (map->GetId())
346 {
347 case 530: // Outland
348 map->DoForAllPlayers([&](Player* player)
349 {
350 if (player->GetZoneId() == ZONEID_SHATTRATH)
351 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
352 });
353 break;
354 case 552: // Arcatraz
355 case 553: // Botanica
356 case 554: // Mechanar
357 map->DoForAllPlayers([&](Player* player)
358 {
359 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
360 });
361 break;
362 default:
363 break;
364 }
365 });
366}
#define sMapMgr
Definition MapMgr.h:220
@ SPELL_ADAL_SONG_OF_BATTLE
Definition WorldState.h:67
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:1081
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:1178

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

Referenced by HandleExternalEvent().

◆ BuffMagtheridonTeam()

void WorldState::BuffMagtheridonTeam ( TeamId  team)
private
276{
277 sMapMgr->DoForAllMaps([&](Map* map) -> void
278 {
279 switch (map->GetId())
280 {
281 case 530: // Outland
282 map->DoForAllPlayers([&](Player* player)
283 {
284 if (player->GetZoneId() == ZONEID_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
285 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
286 else if (player->GetZoneId() == ZONEID_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
287 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
288 });
289 break;
290 case 540: // The Shattered Halls
291 case 542: // The Blood Furnace
292 case 543: // Ramparts
293 case 544: // Magtheridon's Lair
294 map->DoForAllPlayers([&](Player* player)
295 {
296 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
297 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
298 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
299 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
300 });
301 break;
302 default:
303 break;
304 }
305 });
306}
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ TEAM_HORDE
Definition SharedDefines.h:761
@ SPELL_NAZGRELS_FAVOR
Definition WorldState.h:70
@ SPELL_TROLLBANES_COMMAND
Definition WorldState.h:69
TeamId GetTeamId(bool original=false) const
Definition Player.h:2116

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

Referenced by HandleExternalEvent().

◆ DispelAdalsSongOfBattle()

void WorldState::DispelAdalsSongOfBattle ( )
private
369{
370 sMapMgr->DoForAllMaps([&](Map* map) -> void
371 {
372 switch (map->GetId())
373 {
374 case 530: // Outland
375 map->DoForAllPlayers([&](Player* player)
376 {
377 if (player->GetZoneId() == ZONEID_SHATTRATH)
378 player->RemoveAurasDueToSpell(SPELL_ADAL_SONG_OF_BATTLE);
379 });
380 break;
381 case 552: // Arcatraz
382 case 553: // Botanica
383 case 554: // Mechanar
384 map->DoForAllPlayers([&](Player* player)
385 {
387 });
388 break;
389 default:
390 break;
391 }
392 });
393}
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4941

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

Referenced by Update().

◆ DispelMagtheridonTeam()

void WorldState::DispelMagtheridonTeam ( TeamId  team)
private
309{
310 sMapMgr->DoForAllMaps([&](Map* map) -> void
311 {
312 switch (map->GetId())
313 {
314 case 530: // Outland
315 map->DoForAllPlayers([&](Player* player)
316 {
317 if (player->GetZoneId() == ZONEID_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
318 player->RemoveAurasDueToSpell(SPELL_TROLLBANES_COMMAND);
319 else if (player->GetZoneId() == ZONEID_HELLFIRE_PENINSULA && player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
320 player->RemoveAurasDueToSpell(SPELL_NAZGRELS_FAVOR);
321 });
322 break;
323 case 540: // The Shattered Halls
324 case 542: // The Blood Furnace
325 case 543: // Ramparts
326 case 544: // Magtheridon's Lair
327 map->DoForAllPlayers([&](Player* player)
328 {
329 if (player->GetTeamId() == TEAM_ALLIANCE && team == TEAM_ALLIANCE)
331 else if (player->GetTeamId() == TEAM_HORDE && team == TEAM_HORDE)
333 });
334 break;
335 default:
336 break;
337 }
338 });
339}

References Map::DoForAllPlayers(), Map::GetId(), Player::GetTeamId(), 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   
)
1040{
1041 switch (zoneId)
1042 {
1046 case ZONEID_SHATTRATH:
1047 {
1048 // Sunwell Reclamation
1049 switch (m_sunsReachData.m_phase)
1050 {
1053 break;
1056 break;
1059 break;
1065 break;
1066 }
1072
1073 // Sunwell Gates
1074 switch (m_sunsReachData.m_gate)
1075 {
1078 break;
1081 break;
1084 break;
1085 }
1086 break;
1087 }
1088 }
1089}
@ WORLD_STATE_QUEL_DANAS_MUSIC
Definition WorldStateDefines.h:49
@ ZONEID_SHATTRATH
Definition WorldState.h:48
@ ZONEID_ISLE_OF_QUEL_DANAS
Definition WorldState.h:60
@ ZONEID_SUNWELL_PLATEAU
Definition WorldState.h:62
@ ZONEID_MAGISTERS_TERRACE
Definition WorldState.h:61
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46

References 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, WorldPackets::WorldState::InitWorldStates::Worldstates, ZONEID_ISLE_OF_QUEL_DANAS, ZONEID_MAGISTERS_TERRACE, ZONEID_SHATTRATH, and ZONEID_SUNWELL_PLATEAU.

◆ GetSunsReachPrintout()

std::string WorldState::GetSunsReachPrintout ( )
806{
807 auto formatPhase = [this]() -> std::string {
808 std::string name;
809 switch (m_sunsReachData.m_phase)
810 {
811 case SUNS_REACH_PHASE_1_STAGING_AREA: name = "Phase 1: Staging Area"; break;
812 case SUNS_REACH_PHASE_2_SANCTUM: name = "Phase 2: Sanctum"; break;
813 case SUNS_REACH_PHASE_3_ARMORY: name = "Phase 3: Armory"; break;
814 case SUNS_REACH_PHASE_4_HARBOR: name = "Phase 4: Harbor"; break;
815 default: name = "Unknown"; break;
816 }
817 return "Phase: " + std::to_string(m_sunsReachData.m_phase) + " (" + name + ") " + std::to_string(m_sunsReachData.GetPhasePercentage(m_sunsReachData.m_phase)) + "%\n";
818 };
819
820 auto formatSubPhase = [this](uint32 subPhase) -> std::string {
821 std::string name;
822 switch (subPhase)
823 {
824 case SUBPHASE_PORTAL: name = "Portal"; break;
825 case SUBPHASE_ANVIL: name = "Anvil"; break;
826 case SUBPHASE_ALCHEMY_LAB: name = "Alchemy Lab"; break;
827 case SUBPHASE_MONUMENT: name = "Monument"; break;
828 default: name = "Unknown"; break;
829 }
830 return name + ": " + (m_sunsReachData.m_subphaseMask & subPhase ? "100%" : std::to_string(m_sunsReachData.GetSubPhasePercentage(subPhase)) + "%");
831 };
832
833 auto formatCounter = [](uint32 counter, uint32 value) -> std::string {
834 switch (counter)
835 {
837 return "Erratic Behavior: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
839 return "Sanctum Wards: " + std::to_string(value) + " (counts towards Phase 2: Sanctum)";
841 return "Battle for the Sun's Reach Armory: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
843 return "Distraction at the Dead Scar: " + std::to_string(value) + " (counts towards Phase 3: Armory)";
845 return "Intercepting the Mana Cells: " + std::to_string(value) + " (counts towards Subphase: Portal)";
847 return "Intercept the Reinforcements: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
849 return "Taking the Harbor: " + std::to_string(value) + " (counts towards Phase 4: Harbor)";
851 return "Making Ready: " + std::to_string(value) + " (counts towards Subphase: Anvil)";
853 return "Discovering Your Roots: " + std::to_string(value) + " (counts towards Subphase: Alchemy Lab)";
855 return "A Charitable Donation: " + std::to_string(value) + " (counts towards Subphase: Monument)";
856 default:
857 return "Unknown: " + std::to_string(value) + " (Unknown goal)";
858 }
859 };
860
861 std::string output = formatPhase();
862 output += "Subphase mask: " + std::to_string(m_sunsReachData.m_subphaseMask) + "\n";
863 for (uint32 i = 0; i < 4; ++i)
864 {
865 uint32 subPhaseMask = 1 << i;
866 output += " " + formatSubPhase(subPhaseMask) + "\n";
867 }
868 output += "Counters:\n";
869 output += " Sunsreach.CounterMax = " + std::to_string(sWorld->getIntConfig(CONFIG_SUNSREACH_COUNTER_MAX)) + "\n";
870 for (uint32 i = 0; i < COUNTERS_MAX; ++i)
871 output += " " + std::to_string(i) + ". " + formatCounter(i, m_sunsReachData.m_sunsReachReclamationCounters[i]) + "\n";
872
873 // Sunwell Gates
874 auto formatGatePhase = [](uint32 gate) -> std::string {
875 switch (gate)
876 {
877 case SUNWELL_ALL_GATES_CLOSED: return "All Gates Closed"; break;
878 case SUNWELL_AGAMATH_GATE1_OPEN: return "Gate 1 Agamath Open"; break;
879 case SUNWELL_ROHENDOR_GATE2_OPEN: return "Gate 2 Rohendar Open"; break;
880 case SUNWELL_ARCHONISUS_GATE3_OPEN: return "Gate 3 Archonisus Open"; break;
881 default: return "Unknown"; break;
882 }
883 };
884 output += "Sunwell Plateau Gate Phase " + std::to_string(m_sunsReachData.m_gate) + " (" + formatGatePhase(m_sunsReachData.m_gate) + ")" + ":\n";
885 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";
886 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";
887 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";
888 return output;
889}
@ COUNTERS_MAX
Definition WorldState.h:134
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.

◆ HandleConditionStateChange()

void WorldState::HandleConditionStateChange ( WorldStateCondition  conditionId,
WorldStateConditionState  state 
)
138{
139 _transportStates[conditionId] = state;
140}

References _transportStates.

◆ HandleExternalEvent()

void WorldState::HandleExternalEvent ( WorldStateEvent  eventId,
uint32  param 
)
143{
144 std::lock_guard<std::mutex> guard(_mutex);
145 switch (eventId)
146 {
149 {
152 }
153 break;
155 if (param == TEAM_ALLIANCE)
156 {
159 }
160 else
161 {
164 }
165 break;
167 if (param == TEAM_ALLIANCE)
168 {
171 }
172 else
173 {
176 }
177 break;
178 default:
179 break;
180 }
181}
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:43
@ WORLD_STATE_CUSTOM_EVENT_ON_ADALS_SONG_OF_BATTLE
Definition WorldState.h:41
@ WORLD_STATE_CUSTOM_EVENT_ON_MAGTHERIDON_HEAD_SPAWN
Definition WorldState.h:42
void BuffAdalsSongOfBattle()
Definition WorldState.cpp:341
void DispelMagtheridonTeam(TeamId team)
Definition WorldState.cpp:308
std::mutex _mutex
Definition WorldState.h:212
void BuffMagtheridonTeam(TeamId team)
Definition WorldState.cpp:275
uint32 _adalSongOfBattleTimer
Definition WorldState.h:205

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,
WorldStateZoneId  zoneId 
)
200{
201 std::lock_guard<std::mutex> guard(_mutex);
202 switch (zoneId)
203 {
204 case ZONEID_SHATTRATH:
205 case ZONEID_BOTANICA:
206 case ZONEID_MECHANAR:
207 case ZONEID_ARCATRAZ:
209 player->CastSpell(player, SPELL_ADAL_SONG_OF_BATTLE, true);
210 break;
218 player->CastSpell(player, SPELL_TROLLBANES_COMMAND, true);
219 else if (_isMagtheridonHeadSpawnedHorde && player->GetTeamId() == TEAM_HORDE)
220 player->CastSpell(player, SPELL_NAZGRELS_FAVOR, true);
221 break;
225 {
226 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
229 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
230 break;
231 }
232 default:
233 break;
234 }
235};
@ ZONEID_HELLFIRE_RAMPARTS
Definition WorldState.h:54
@ ZONEID_BOTANICA
Definition WorldState.h:49
@ ZONEID_HELLFIRE_PENINSULA
Definition WorldState.h:53
@ ZONEID_MAGTHERIDON_LAIR
Definition WorldState.h:58
@ ZONEID_BLOOD_FURNACE
Definition WorldState.h:56
@ ZONEID_SHATTERED_HALLS
Definition WorldState.h:57
@ ZONEID_MECHANAR
Definition WorldState.h:51
@ ZONEID_HELLFIRE_CITADEL
Definition WorldState.h:55
@ ZONEID_ARCATRAZ
Definition WorldState.h:50
@ SUBPHASE_ALL
Definition WorldState.h:119
@ SPELL_KIRU_SONG_OF_VICTORY
Definition WorldState.h:72
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:112

References _adalSongOfBattleTimer, _isMagtheridonHeadSpawnedAlliance, _isMagtheridonHeadSpawnedHorde, _mutex, 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, TEAM_HORDE, ZONEID_ARCATRAZ, ZONEID_BLOOD_FURNACE, ZONEID_BOTANICA, ZONEID_HELLFIRE_CITADEL, ZONEID_HELLFIRE_PENINSULA, ZONEID_HELLFIRE_RAMPARTS, ZONEID_ISLE_OF_QUEL_DANAS, ZONEID_MAGISTERS_TERRACE, ZONEID_MAGTHERIDON_LAIR, ZONEID_MECHANAR, ZONEID_SHATTERED_HALLS, ZONEID_SHATTRATH, and ZONEID_SUNWELL_PLATEAU.

◆ HandlePlayerLeaveZone()

void WorldState::HandlePlayerLeaveZone ( Player player,
WorldStateZoneId  zoneId 
)
237{
238 std::lock_guard<std::mutex> guard(_mutex);
239 switch (zoneId)
240 {
241 case ZONEID_SHATTRATH:
242 case ZONEID_BOTANICA:
243 case ZONEID_MECHANAR:
244 case ZONEID_ARCATRAZ:
247 break;
254 if (player->GetTeamId() == TEAM_ALLIANCE)
256 else if (player->GetTeamId() == TEAM_HORDE)
258 break;
262 {
263 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
268 break;
269 }
270 default:
271 break;
272 }
273};

References _adalSongOfBattleTimer, _mutex, 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, TEAM_HORDE, ZONEID_ARCATRAZ, ZONEID_BLOOD_FURNACE, ZONEID_BOTANICA, ZONEID_HELLFIRE_CITADEL, ZONEID_HELLFIRE_PENINSULA, ZONEID_HELLFIRE_RAMPARTS, ZONEID_ISLE_OF_QUEL_DANAS, ZONEID_MAGISTERS_TERRACE, ZONEID_MAGTHERIDON_LAIR, ZONEID_MECHANAR, ZONEID_SHATTERED_HALLS, ZONEID_SHATTRATH, and ZONEID_SUNWELL_PLATEAU.

◆ HandleSunsReachPhaseTransition()

void WorldState::HandleSunsReachPhaseTransition ( uint32  newPhase)
569{
570 if (newPhase < m_sunsReachData.m_phase)
571 {
572 while (newPhase != m_sunsReachData.m_phase)
573 {
576 }
578 }
579 else
580 {
582 bool moreThanOne = newPhase > m_sunsReachData.m_phase + 1; // custom command case
583 m_sunsReachData.m_phase = newPhase;
584 StartSunsReachPhase(moreThanOne);
585 }
586 switch (m_sunsReachData.m_phase)
587 {
593 break;
594 default: break;
595 }
598}
#define sGameEventMgr
Definition GameEventMgr.h:201
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_ALCHEMY_LAB
Definition WorldState.h:95
@ GAME_EVENT_QUEL_DANAS_PHASE_2_NO_PORTAL
Definition WorldState.h:86
@ GAME_EVENT_QUEL_DANAS_PHASE_3_NO_ANVIL
Definition WorldState.h:90
@ GAME_EVENT_QUEL_DANAS_PHASE_4_NO_MONUMENT
Definition WorldState.h:93
void StopSunsReachPhase(bool forward)
Definition WorldState.cpp:756
void StartSunsReachPhase(bool initial=false)
Definition WorldState.cpp:768

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 
)
601{
602 bool start = true;
603 if (subPhaseMask < 0)
604 {
605 start = false;
606 subPhaseMask = -subPhaseMask;
607 }
608 bool all = false;
609 if (start)
610 {
611 m_sunsReachData.m_subphaseMask |= subPhaseMask;
613 all = true;
614 }
615 else
616 {
618 all = true;
619 m_sunsReachData.m_subphaseMask &= ~subPhaseMask;
620 }
621 if (initial)
622 {
624 if ((subPhaseMask & SUBPHASE_PORTAL) == 0)
627 if ((subPhaseMask & SUBPHASE_ANVIL) == 0)
630 {
631 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB) == 0)
633 if ((subPhaseMask & SUBPHASE_MONUMENT) == 0)
635 }
636 }
637 if ((subPhaseMask & SUBPHASE_PORTAL))
638 {
641 if (start)
642 {
643 sGameEventMgr->StopEvent(first);
644 sGameEventMgr->StartEvent(second);
645 }
646 else
647 {
648 sGameEventMgr->StopEvent(second);
649 sGameEventMgr->StartEvent(first);
650 }
651 }
652 if ((subPhaseMask & SUBPHASE_ANVIL))
653 {
656 if (start)
657 {
658 sGameEventMgr->StopEvent(first);
659 sGameEventMgr->StartEvent(second);
660 }
661 else
662 {
663 sGameEventMgr->StopEvent(second);
664 sGameEventMgr->StartEvent(first);
665 }
666 }
667 if ((subPhaseMask & SUBPHASE_ALCHEMY_LAB))
668 {
671 if (start)
672 {
673 sGameEventMgr->StopEvent(first);
674 sGameEventMgr->StartEvent(second);
675 }
676 else
677 {
678 sGameEventMgr->StopEvent(second);
679 sGameEventMgr->StartEvent(first);
680 }
681 }
682 if ((subPhaseMask & SUBPHASE_MONUMENT))
683 {
686 if (start)
687 {
688 sGameEventMgr->StopEvent(first);
689 sGameEventMgr->StartEvent(second);
690 }
691 else
692 {
693 sGameEventMgr->StopEvent(second);
694 sGameEventMgr->StartEvent(first);
695 }
696 }
697 if (all)
698 {
699 if (start)
701 else
703
704 if (!initial)
705 {
706 std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex);
707 for (ObjectGuid& guid : m_sunsReachData.m_sunsReachReclamationPlayers)
708 if (Player* player = ObjectAccessor::FindPlayer(guid))
709 {
710 if (start)
711 player->CastSpell(player, SPELL_KIRU_SONG_OF_VICTORY, true);
712 else
713 player->RemoveAurasDueToSpell(SPELL_KIRU_SONG_OF_VICTORY);
714 }
715 }
716 }
717 if (!initial)
719}
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PORTAL
Definition WorldState.h:87
@ GAME_EVENT_QUEL_DANAS_PHASE_4_MONUMENT
Definition WorldState.h:94
@ GAME_EVENT_QUEL_DANAS_PHASE_4_KIRU
Definition WorldState.h:97
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ANVIL
Definition WorldState.h:91
@ GAME_EVENT_QUEL_DANAS_PHASE_4_ALCHEMY_LAB
Definition WorldState.h:96
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)
722{
723 if (newGate < m_sunsReachData.m_gate)
724 {
725 while (newGate != m_sunsReachData.m_gate)
726 {
729 }
731 }
732 else
733 {
735 m_sunsReachData.m_gate = newGate;
737 }
738 int32 worldState = 0;
739 switch (newGate)
740 {
744 }
745 if (worldState)
747
749}
void StartSunwellGatePhase()
Definition WorldState.cpp:995
void StopSunwellGatePhase()
Definition WorldState.cpp:1007

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:174
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
120{
121 switch (conditionId)
122 {
130 return _transportStates.at(conditionId) == state;
131 default:
132 LOG_ERROR("scripts", "WorldState::IsConditionFulfilled: Unhandled WorldStateCondition {}", conditionId);
133 return false;
134 }
135}
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
@ WORLD_STATE_CONDITION_NAZGRELS_FAVOR
Definition WorldState.h:27
@ WORLD_STATE_CONDITION_TROLLBANES_COMMAND
Definition WorldState.h:26

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:149
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.

◆ Save()

void WorldState::Save ( WorldStateSaveIds  saveId)
99{
100 switch (saveId)
101 {
103 {
104 std::string expansionData = m_sunsReachData.GetData();
105 SaveHelper(expansionData, SAVE_ID_QUEL_DANAS);
106 break;
107 }
108 default:
109 break;
110 }
111}
void SaveHelper(std::string &stringToSave, WorldStateSaveIds saveId)
Definition WorldState.cpp:113
std::string GetData()
Definition WorldState.cpp:891

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 
)
114{
115 CharacterDatabase.Execute("DELETE FROM world_state WHERE Id='{}'", saveId);
116 CharacterDatabase.Execute("INSERT INTO world_state(Id,Data) VALUES('{}','{}')", saveId, stringToSave.data());
117}

References CharacterDatabase.

Referenced by Save().

◆ SendWorldstateUpdate()

void WorldState::SendWorldstateUpdate ( std::mutex &  mutex,
GuidVector const &  guids,
uint32  value,
uint32  worldStateId 
)
private
396{
397 std::lock_guard<std::mutex> guard(mutex);
398 for (ObjectGuid const& guid : guids)
399 if (Player* player = ObjectAccessor::FindPlayer(guid))
400 player->SendUpdateWorldState(worldStateId, value);
401}

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 
)

◆ StartSunsReachPhase()

void WorldState::StartSunsReachPhase ( bool  initial = false)
private
769{
770 switch (m_sunsReachData.m_phase)
771 {
774 if (Map* map = sMapMgr->FindBaseNonInstanceMap(530))
775 map->SetZoneWeather(ZONEID_ISLE_OF_QUEL_DANAS, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
776 break;
780 if (Map* map = sMapMgr->FindBaseNonInstanceMap(530))
781 map->SetZoneWeather(ZONEID_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.5f);
782 break;
784 if (initial)
787 // TODO: Should be id 2 0.25f?
788 if (Map* map = sMapMgr->FindBaseNonInstanceMap(530))
789 map->SetZoneWeather(ZONEID_ISLE_OF_QUEL_DANAS, WEATHER_STATE_LIGHT_RAIN, 0.25f);
790 break;
792 if (initial)
793 {
796 }
798 if (Map* map = sMapMgr->FindBaseNonInstanceMap(530))
799 map->SetZoneWeather(ZONEID_ISLE_OF_QUEL_DANAS, WEATHER_STATE_FINE, 0.0f);
800 break;
801 default: break;
802 }
803}
@ GAME_EVENT_QUEL_DANAS_PHASE_3_ONLY
Definition WorldState.h:88
@ GAME_EVENT_QUEL_DANAS_PHASE_2_PERMANENT
Definition WorldState.h:85
@ GAME_EVENT_QUEL_DANAS_PHASE_4
Definition WorldState.h:92
@ GAME_EVENT_QUEL_DANAS_PHASE_3_PERMANENT
Definition WorldState.h:89
@ GAME_EVENT_QUEL_DANAS_PHASE_2_ONLY
Definition WorldState.h:84
@ GAME_EVENT_QUEL_DANAS_PHASE_1
Definition WorldState.h:83
@ WEATHER_STATE_MEDIUM_RAIN
Definition Weather.h:49
@ WEATHER_STATE_FINE
Definition Weather.h:46
@ WEATHER_STATE_LIGHT_RAIN
Definition Weather.h:48

References 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, 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, WEATHER_STATE_MEDIUM_RAIN, and ZONEID_ISLE_OF_QUEL_DANAS.

Referenced by HandleSunsReachPhaseTransition(), and Load().

◆ StartSunwellGatePhase()

void WorldState::StartSunwellGatePhase ( )
private
996{
997 switch (m_sunsReachData.m_gate)
998 {
1003 default: break;
1004 }
1005}
@ GAME_EVENT_SWP_GATES_PHASE_1
Definition WorldState.h:100
@ GAME_EVENT_SWP_GATES_PHASE_3
Definition WorldState.h:102
@ GAME_EVENT_SWP_GATES_PHASE_0
Definition WorldState.h:99
@ GAME_EVENT_SWP_GATES_PHASE_2
Definition WorldState.h:101

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)
184{
186 {
187 if (_adalSongOfBattleTimer <= diff)
188 {
191 }
192 else
193 {
195 }
196 }
197}
void DispelAdalsSongOfBattle()
Definition WorldState.cpp:368

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

◆ m_sunsReachData


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