39#include <unordered_map>
460 { 1983.857f, 1287.043f, 145.5596f, 3.0892330f },
461 { 1783.843f, 1267.481f, 139.7800f, 0.2698664f },
462 { 1876.788f, 1305.723f, 146.2474f, 6.0737460f },
464 { 2047.948f, 1287.598f, 142.8568f, 3.176499f },
465 { 2091.994f, 1277.257f, 140.4707f, 1.134464f },
466 { 2074.624f, 1282.958f, 141.6344f },
467 { 2074.805f, 1292.172f, 141.6728f },
468 { 2077.590f, 1284.609f, 141.5710f },
469 { 2078.365f, 1281.254f, 141.5182f },
470 { 2077.737f, 1290.441f, 141.5698f },
471 { 2078.055f, 1293.624f, 141.5544f },
472 { 2113.454f, 1287.986f, 136.3829f, 3.071779f },
474 { 2366.240f, 1195.253f, 132.0441f, 3.159046f },
475 { 2433.154f, 1192.572f, 148.1547f, 5.542059f },
476 { 2432.990f, 1192.760f, 148.1474f, 1.026526f },
477 { 2432.824f, 1191.816f, 148.1556f, 4.927707f },
478 { 2432.711f, 1192.857f, 148.1550f, 6.257423f },
479 { 2433.357f, 1192.168f, 148.1593f, 3.001966f },
480 { 2414.349f, 1136.075f, 148.1592f, 1.345922f },
481 { 2403.961f, 1180.299f, 148.1587f, 5.139339f },
482 { 2414.671f, 1136.262f, 148.1592f, 2.305776f },
483 { 2403.908f, 1179.994f, 148.1586f, 4.654133f },
484 { 2404.311f, 1178.306f, 148.1585f, 1.605703f },
485 { 2414.041f, 1136.068f, 148.1593f, 2.234021f },
486 { 2429.026f, 1102.693f, 148.1499f, 1.952652f },
487 { 2441.173f, 1115.225f, 148.1264f, 2.302970f },
488 { 2430.645f, 1104.685f, 148.1306f, 1.135255f },
489 { 2439.649f, 1113.719f, 148.1298f, 3.111888f },
490 { 2429.296f, 1102.007f, 148.1593f, 6.213372f },
491 { 2440.057f, 1114.226f, 148.1593f, 6.108652f },
492 { 2457.008f, 1113.929f, 150.0776f, 3.272437f },
493 { 2456.058f, 1113.838f, 150.0917f, 1.745329f },
494 { 2425.898f, 1118.842f, 148.0759f, 6.073746f },
496 { 2534.988f, 1126.163f, 130.8621f, 2.844887f },
497 { 2363.440f, 1404.906f, 128.7869f, 2.775074f },
499 { 2296.862f, 1501.015f, 128.4456f, 5.131268f },
500 { 2301.055f, 1478.977f, 128.1299f, 1.758816f },
501 { 2319.560f, 1506.408f, 152.0474f },
508 { 2320.632f, 1507.193f, 152.5081f },
509 { 2319.823f, 1506.605f, 152.5081f },
510 { 2306.770f, 1496.780f, 128.3620f }
560 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::AdvanceToState: advancing to 0x{:X}", newState);
563 TC_LOG_WARN(
"scripts.cos",
"npc_arthas_stratholmeAI::AdvanceToState: advancing to instance state 0x{:X}, but RP is paused. Overriding!", newState);
599 uther->setActive(
true);
604 jaina->setActive(
true);
753 uther->DespawnOrUnsummon();
757 jaina->DespawnOrUnsummon();
768 citizen->SetFacingToObject(
me);
770 resident->SetFacingToObject(
me);
805 std::list<Creature*> infinites;
807 for (
Creature* infinite : infinites)
808 infinite->SetFacingToObject(
me);
928 uint32 talkerEntry = UINT_MAX, talkerLine = 0;
933 jaina->SetFacingToObject(
me);
938 uther->SetFacingToObject(
me);
958 uther->SetFacingToObject(
me);
962 jaina->SetFacingToObject(
me);
968 std::list<Creature*> troops;
975 unit->SetFacingToObject(
me);
1094 std::list<Creature*> nearbyVictims;
1096 if (!nearbyVictims.empty())
1131 std::list<Creature*> troops;
1135 if (unit->IsAlive())
1136 unit->SetFacingToObject(malganis);
1152 malganis->DespawnOrUnsummon();
1178 infinite->SetFacingToObject(
me);
1245 rift->DespawnOrUnsummon(
Seconds(4));
1252 std::list<Creature*> infinites;
1257 if (target->IsAlive())
1258 target->SetFacingToObject(
me);
1286 rift1->DespawnOrUnsummon(
Seconds(5));
1288 rift2->DespawnOrUnsummon(
Seconds(5));
1316 rift1->DespawnOrUnsummon(
Seconds(5));
1318 rift2->DespawnOrUnsummon(
Seconds(5));
1330 epoch->GetMotionMaster()->MoveAlongSplineChain(0,
RP3_CHAIN_EPOCH,
false);
1332 rift->DespawnOrUnsummon(
Seconds(27));
1340 epoch->SetFacingToObject(
me);
1355 epoch->SetImmuneToAll(
false);
1357 epoch->EngageWithTarget(
me);
1409 malganis->SetImmuneToAll(
false);
1411 malganis->EngageWithTarget(
me);
1418 malganis->SetFacingToObject(
me);
1446 malganis->DespawnOrUnsummon();
1474 init.MovebyPath(path, 0);
1495 if (talkerEntry != UINT_MAX)
1510 std::list<Creature*> infinites;
1516 target->SetImmuneToAll(
false);
1518 target->EngageWithTarget(
me);
1536 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::JustEngagedWith: RP in progress? '{}'",
_progressRP ?
"YES" :
"NO");
1544 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::JustEngagedWith: spline chain motion paused");
1546 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::JustEngagedWith: entered combat without pathing, pausing RP regardless");
1566 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::JustReachedHome: Resuming motion");
1571 TC_LOG_TRACE(
"scripts.cos",
"npc_arthas_stratholmeAI::JustReachedHome: Back at leash pos, resuming RP");
1631 return GetCullingOfStratholmeAI<npc_arthas_stratholmeAI>(creature);
1640 return *(itr->second.SnapbackPosition);
1652 ASSERT_NOTNULL(self->GetSummonerCreatureBase())->AI()->MovementInform(type,
id);
std::chrono::seconds Seconds
Seconds shorthand typedef.
#define ASSERT_NOTNULL(pointer)
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_TRACE(filterType__,...)
@ SPLINE_CHAIN_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
uint32 urand(uint32 min, uint32 max)
uint32 urandms(uint32 min, uint32 max)
#define RegisterCreatureAI(ai_name)
#define RegisterSpellScript(spell_script)
uint32 GetGossipActionFor(Player *player, uint32 gossipListId)
@ EMOTE_ONESHOT_POINT_NO_SHEATHE
@ EMOTE_ONESHOT_EXCLAMATION
@ TRIGGERED_IGNORE_SET_FACING
Will not adjust facing to target (if any)
#define SpellEffectFn(F, I, N)
@ UNIT_NPC_FLAG_QUESTGIVER
virtual void JustEngagedWith(Unit *)
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
void SetHomePosition(float x, float y, float z, float o)
void GetHomePosition(float &x, float &y, float &z, float &ori) const
bool HasReactState(ReactStates state) const
bool IsEngaged() const override
void SetReactState(ReactStates st)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetImmuneToAll(bool apply) override
static char const * ToConstant(Enum value)
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
virtual bool SetBossState(uint32 id, EncounterState state)
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)
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
void ResumeSplineChain(SplineChainResumeInfo const &info)
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
static void GetResumeInfo(SplineChainResumeInfo &info, Unit const *owner, Optional< uint32 > id={})
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
virtual bool CanAIAttack(Unit const *) const
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
SpellCastResult DoCast(uint32 spellId)
MotionMaster * GetMotionMaster()
void SetFacingToObject(WorldObject const *object, bool force=true)
void RemoveNpcFlag(NPCFlags flags)
TempSummon * ToTempSummon()
void SetNpcFlag(NPCFlags flags)
void EngageWithTarget(Unit *who)
void NearTeleportTo(Position const &pos, bool casting=false)
void SetFacingTo(float const ori, bool force=true)
bool HasUnitState(const uint32 f) const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
virtual uint32 GetData(uint32) const
virtual void SetData(uint32, uint32)
virtual void SetGuidData(uint32, ObjectGuid)
CreatureAI * GetAI(Creature *creature) const override
void HandleDummy(SpellEffIndex)
@ ACTION_START_RP_EVENT4_2
@ ACTION_START_RP_EVENT4_1
std::vector< Vector3 > PointsArray
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Position const & GetArthasSnapbackFor(COSProgressStates state)
@ SPELL_MALGANIS_KILL_CREDIT
@ SPELL_SHADOWSTEP_VISUAL
@ SPELL_MALGANIS_QUEST_CREDIT
@ SPELL_CHROMIE_3_TRANSFORM
@ RP4_EVENT_GAUNTLET_DONE
@ RP5_EVENT_ARTHAS_LEAVE2
@ RP3_EVENT_RESIDENT_FACE
@ RP2_EVENT_ARTHAS_MOVE_2
@ RP4_EVENT_HIDDEN_PASSAGE
@ RP3_EVENT_INFINITE_LAUGH
@ RP1_EVENT_ARTHAS_LEAVE2
@ RP3_EVENT_ARTHAS_MOVE_1_2
@ RP3_EVENT_ARTHAS_MOVE_3
@ RP5_EVENT_MALGANIS_LEAVE
@ RP4_EVENT_GAUNTLET_REACHED
@ RP4_EVENT_GAUNTLET_RESUME
@ RP5_EVENT_CHROMIE_SPAWN
@ RP3_EVENT_ARTHAS_MOVE_2
@ RP2_EVENT_MALGANIS_LEAVE1
@ RP3_EVENT_ARTHAS_MOVE_1
@ RP5_EVENT_CHROMIE_TRANSFORM
@ RP2_EVENT_ARTHAS_MOVE_3
@ RP2_EVENT_ARTHAS_MOVE_4
@ RP2_EVENT_ARTHAS_MOVE_1
@ RP2_EVENT_ARTHAS_MOVE_5
@ RP5_EVENT_MALGANIS_DONE
@ EVENT_TOWN_HALL_REACHED
@ RP2_EVENT_MALGANIS_LEAVE2
uint32 const chromiePathSize
@ RP3_ACTION_AFTER_SPAWN1
@ RP5_ACTION_AFTER_MALGANIS
@ RP3_ACTION_AFTER_SPAWN2
@ RP3_ACTION_AFTER_SPAWN3
@ RP3_ACTION_AFTER_INITIAL
static std::unordered_map< uint32, SnapbackInfo > const ArthasSnapbackPositions
void AddSC_npc_arthas_stratholme()
static float const ArthasSnapbackDistanceThreshold
static std::array< Position, NUM_POSITIONS > const ArthasPositions
@ ARTHAS_GAUNTLET_END_POS
@ ARTHAS_PURGE_PENDING_POS
@ ARTHAS_TOWN_HALL_END_POS
G3D::Vector3 const ChromieSplinePos[chromiePathSize]
float GetExactDist2d(const float x, const float y) const
float GetExactDist(float x, float y, float z) const
constexpr void GetPosition(float &x, float &y) const
T const & RAID_MODE(T const &normal10, T const &normal25) const
bool HealthBelowPct(uint32 pct) const
ReactStates const ReactState
Position const *const SnapbackPosition
void UpdateAI(uint32 diff) override
bool CanAIAttack(Unit const *who) const override
void KilledUnit(Unit *who) override
bool OnGossipHello(Player *) override
static void MoveInfiniteOnSpawn(Creature *infinite, SplineChains chainId)
void ScheduleActionOOC(Actions action)
void UpdateAICombat(uint32 diff)
bool OnGossipSelect(Player *player, uint32, uint32 listId) override
InstanceScript *const instance
npc_arthas_stratholmeAI(Creature *creature)
void JustDied(Unit *) override
void JustAppeared() override
void DoAction(int32 action) override
void AdvanceDungeon(Player *cause, COSProgressStates from, COSInstanceData command)
void MovementInform(uint32 type, uint32 id) override
void EnterEvadeMode(EvadeReason why) override
void SetGUID(ObjectGuid const &guid, int32 type) override
void AdvanceToState(COSProgressStates newState)
ObjectGuid _eventStarterGuid
void JustReachedHome() override
void JustEngagedWith(Unit *who) override
SplineChainResumeInfo _resumeMovement
COSProgressStates GetCurrentProgress()
void MovementInform(uint32 type, uint32 id) override
npc_stratholme_rp_dummy(Creature *creature)