32#include <unordered_map>
33#include <unordered_set>
205 { 2131.474f, 1352.615f, 131.372f, 6.10960f },
206 { 2131.463f, 1357.127f, 131.587f, 5.95173f },
207 { 2129.795f, 1345.093f, 131.194f, 0.17905f },
208 { 2136.235f, 1347.894f, 131.628f, 0.20262f },
209 { 2138.219f, 1356.240f, 132.169f, 5.95173f },
210 { 2140.584f, 1351.624f, 132.142f, 6.08525f }
218 { 2226.364f, 1331.808f, 127.0193f, 3.298672f },
219 { 2229.934f, 1329.146f, 127.057f, 3.24605f },
220 { 2225.028f, 1327.269f, 127.791f, 3.03792f },
221 { 2223.844f, 1335.282f, 127.749f, 3.47774f },
222 { 2222.192f, 1330.859f, 127.526f, 3.18793f },
223 { 2225.865f, 1331.029f, 127.007f, 3.18793f }
231 { 2183.596f, 1238.823f, 136.551f, 2.16377f },
232 { 2181.420f, 1237.357f, 136.565f, 2.16377f },
233 { 2178.692f, 1237.446f, 136.694f, 1.99098f },
234 { 2184.980f, 1242.458f, 136.772f, 2.59181f },
235 { 2176.873f, 1240.463f, 136.420f, 2.10094f },
236 { 2181.523f, 1244.298f, 136.338f, 2.38997f }
244 { 2267.003f, 1168.055f, 137.821f, 2.79050f },
245 { 2264.392f, 1162.145f, 137.910f, 2.39937f },
246 { 2262.785f, 1166.648f, 138.053f, 2.71353f },
247 { 2265.214f, 1170.771f, 137.972f, 2.80385f },
248 { 2259.745f, 1159.360f, 138.198f, 2.34047f },
249 { 2264.222f, 1171.708f, 138.047f, 2.82742f }
257 { 2351.656f, 1218.682f, 130.062f, 4.63383f },
258 { 2354.921f, 1218.425f, 130.280f, 4.63383f },
259 { 2347.516f, 1216.976f, 130.491f, 5.02496f },
260 { 2356.508f, 1216.656f, 130.445f, 4.29061f },
261 { 2346.674f, 1216.739f, 130.576f, 5.32341f },
262 { 2351.728f, 1214.561f, 130.255f, 4.61891f }
303 TC_LOG_DEBUG(
"scripts.cos",
"instance_culling_of_stratholme::ReadSaveDataMore: Loaded with state {} and guardian timeout at {} minutes {} seconds from now", (
uint32)loadState, timediff /
MINUTE, timediff %
MINUTE);
404 if (
Player* player = itr->GetSource())
405 if (player->GetGUID() == guid || !player->IsGameMaster())
407 player->CombatStop(
true);
408 constexpr float offsetDist = 10.0f;
409 float myAngle =
rand_norm() *
static_cast<float>(2.0f *
M_PI);
411 player->NearTeleportTo(myTarget);
475 if (secondsToGuardianDeath <= 0)
491 time_t minutes = (secondsToGuardianDeath - 1) /
MINUTE;
492 time_t seconds = ((secondsToGuardianDeath - 1) %
MINUTE) + 1;
495 if (minutes == 24 && seconds >= 45)
498 if (minutes == 4 && seconds < 45)
508 if (minutes == 4 && seconds > 30)
516 TC_LOG_DEBUG(
"scripts.cos",
"instance_culling_of_stratholme::Update: Spawning new Arthas for instance...");
558 for (
uint32 i = 0; i <= 1; ++i)
608 TC_LOG_DEBUG(
"scripts.cos",
"instance_culling_of_stratholme::OnCreatureCreate: Arthas spawned at {}", creature->
GetPosition().ToString());
627 object->setActive(
true);
641 arthas->AI()->SetGUID(starterGUID, -startAction);
646 TC_LOG_DEBUG(
"scripts.cos",
"instance_culling_of_stratholme::SetInstanceProgress: Instance progress is now 0x{:X}", (
uint32)state);
676 arthas->DespawnOrUnsummon();
731 std::vector<Creature*> toDespawn;
733 for (std::unordered_map<ObjectGuid, Creature*>::const_iterator itr = objects.cbegin(); itr != objects.cend(); ++itr)
735 if (itr->second && (itr->second->isDead() || !itr->second->GetSpawnId() || itr->second->GetOriginalEntry() != itr->second->GetEntry()))
737 if (itr->second->getDeathState() ==
DEAD)
738 itr->second->SetRespawnTime(1);
740 toDespawn.push_back(itr->second);
744 for (
Creature* creature : toDespawn)
746 if (creature->GetSpawnId())
747 creature->SetRespawnTime(1);
748 creature->DespawnOrUnsummon(0s, 1s);
std::chrono::seconds Seconds
Seconds shorthand typedef.
#define TC_LOG_DEBUG(filterType__,...)
uint32 urand(uint32 min, uint32 max)
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
uint32 const EncounterCount
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Repeat(Milliseconds time)
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
void CancelEvent(uint32 eventId)
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void LoadDungeonEncounterData(T const &encounters)
void DoUpdateWorldState(int32 worldStateId, int32 value)
EncounterState GetBossState(uint32 id) const
void LoadDoorData(DoorData const *data)
void SetHeaders(std::string const &dataHeaders)
void SetSpawnGroupInactive(uint32 groupId)
MapStoredObjectTypesContainer & GetObjectsStore()
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
void DeleteRespawnTimes()
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, Milliseconds duration=0ms, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty, SmoothPhasingInfo const *smoothPhasingInfo=nullptr)
GameObject * GetGameObject(ObjectGuid const &guid)
bool SpawnGroupDespawn(uint32 groupId, bool deleteRespawnTimes=false, size_t *count=nullptr)
PlayerList const & GetPlayers() const
Creature * GetCreature(ObjectGuid const &guid)
static ObjectGuid const Empty
static ObjectGuid GetGUID(Object const *o)
ContainerUnorderedMap< OBJECT_TYPES, KEY_TYPE > & GetElements()
virtual void DoAction(int32)
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
void setActive(bool isActiveObject)
instance_culling_of_stratholme()
InstanceScript * GetInstanceScript(InstanceMap *map) const override
Position const & GetArthasSnapbackFor(COSProgressStates state)
@ DATA_INFINITE_CORRUPTOR
@ ACTION_START_RP_EVENT4_2
@ ACTION_START_RP_EVENT4_1
@ SPAWNGRP_GAUNTLET_TRASH
@ EVENT_CRIER_CALL_TO_GATES
@ EVENT_CRIER_ANNOUNCE_WAVE
static Position const GuardianPos
static std::array< std::array< uint32, MAX_SPAWNS_PER_WAVE >, NUM_SCOURGE_WAVES > const HeroicWaves
DoorData const doorData[]
@ CRIER_SAY_FESTIVAL_LANE
@ CRIER_SAY_ELDERS_SQUARE
@ CHROMIE_WHISPER_GUARDIAN_2
@ CRIER_SAY_CALL_TO_GATES
@ CHROMIE_WHISPER_GUARDIAN_1
@ CHROMIE_WHISPER_GUARDIAN_3
static const std::array< WaveLocation, WAVE_LOC_MAX - WAVE_LOC_MIN+1 > WaveLocations
static Position const CorruptorPos
COSProgressStates GetStableStateFor(COSProgressStates const state)
@ WORLDSTATE_WAVE_MARKER_TH
@ WORLDSTATE_WAVE_MARKER_ES
@ WORLDSTATE_WAVE_MARKER_KS
@ WORLDSTATE_CRATES_REVEALED
@ WORLDSTATE_WAVE_MARKER_MR
@ WORLDSTATE_WAVE_MARKER_FL
@ WORLDSTATE_TIME_GUARDIAN
@ WORLDSTATE_TIME_GUARDIAN_SHOW
void AddSC_instance_culling_of_stratholme()
@ SPELL_CRATES_KILL_CREDIT
DungeonEncounterData const encounters[]
static Position const CorruptorRiftPos
std::unordered_map< KEY_TYPE, OBJECT * > _element
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr void GetPosition(float &x, float &y) const
constexpr float GetPositionZ() const
COSWorldStates const WorldState
std::array< Position, MAX_SPAWNS_PER_WAVE > SpawnPoints
ObjectGuid _corruptorGUID
void SetData(uint32 type, uint32 data) override
std::unordered_map< uint32, uint32 > _currentWorldStates
void OnCreatureCreate(Creature *creature) override
std::unordered_set< ObjectGuid > _waveSpawns
std::vector< ObjectGuid > _plagueCrates
PersistentInstanceScriptValue< COSProgressStates > _currentState
void SpawnInfiniteCorruptor()
void SetSpawnGroupState(COSInstanceEntries group, bool state, bool force)
PersistentInstanceScriptValue< time_t > _infiniteGuardianTimeout
ObjectGuid _genericBunnyGUID
void InitiateArthasEvent(COSProgressStates fromState, COSProgressStates toState, COSInstanceActions startAction, ObjectGuid starterGUID)
void AfterDataLoad() override
uint32 MissingPlagueCrates() const
void SetInstanceProgress(COSProgressStates state, bool force)
instance_culling_of_stratholme_InstanceMapScript(InstanceMap *map)
void Update(uint32 diff) override
uint32 GetData(uint32 type) const override
void OnUnitDeath(Unit *unit) override
bool SetBossState(uint32 type, EncounterState state) override
void OnGameObjectCreate(GameObject *object) override
void SetGuidData(uint32 type, ObjectGuid guid) override