Skip to content

Commit

Permalink
Merge remote-tracking branch 'sirikfoll/despawnAtEvade' into 3.3.5 (PR
Browse files Browse the repository at this point in the history
…#16528)

(cherry picked from commit c70e3e3)
  • Loading branch information
Treeston authored and Shauren committed Apr 8, 2016
1 parent 302bd9a commit c9b2451
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 27 deletions.
3 changes: 3 additions & 0 deletions sql/updates/world/2016_04_08_04_world_2016_02_14_03_world.sql
@@ -0,0 +1,3 @@
--
DELETE FROM `linked_respawn` WHERE `guid`=150211 AND `linkedGuid`=150211;
DELETE FROM `creature` WHERE `guid`=150212 AND `id`=38995;
13 changes: 11 additions & 2 deletions src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
Expand Up @@ -536,18 +536,27 @@ void BossAI::UpdateAI(uint32 diff)
DoMeleeAttackIfReady();
}

void BossAI::_DespawnAtEvade()
void BossAI::_DespawnAtEvade(uint32 delayToRespawn)
{
if (delayToRespawn < 2)
{
TC_LOG_ERROR("scripts", "_DespawnAtEvade called with delay of %u seconds, defaulting to 2.", delayToRespawn);
delayToRespawn = 2;
}

uint32 corpseDelay = me->GetCorpseDelay();
uint32 respawnDelay = me->GetRespawnDelay();

me->SetCorpseDelay(1);
me->SetRespawnDelay(29);
me->SetRespawnDelay(delayToRespawn - 1);

me->DespawnOrUnsummon();

me->SetCorpseDelay(corpseDelay);
me->SetRespawnDelay(respawnDelay);

if(instance)
instance->SetBossState(_bossId, FAIL);
}

// WorldBossAI - for non-instanced bosses
Expand Down
2 changes: 1 addition & 1 deletion src/server/game/AI/ScriptedAI/ScriptedCreature.h
Expand Up @@ -364,7 +364,7 @@ class TC_GAME_API BossAI : public ScriptedAI
void _EnterCombat();
void _JustDied();
void _JustReachedHome() { me->setActive(false); }
void _DespawnAtEvade();
void _DespawnAtEvade(uint32 delayToRespawn = 30);

void TeleportCheaters();

Expand Down
53 changes: 29 additions & 24 deletions src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
Expand Up @@ -285,6 +285,7 @@ enum Phases
#define PHASE_TWO_THREE (events.IsInPhase(PHASE_TWO) ? PHASE_TWO : PHASE_THREE)

Position const CenterPosition = {503.6282f, -2124.655f, 840.8569f, 0.0f};
Position const TirionSpawn = {505.2118f, -2124.353f, 840.9403f, 3.141593f};
Position const TirionIntro = {489.2970f, -2124.840f, 840.8569f, 0.0f};
Position const TirionCharge = {482.9019f, -2124.479f, 840.8570f, 0.0f};
Position const LichKingIntro[3] =
Expand Down Expand Up @@ -493,13 +494,33 @@ class boss_the_lich_king : public CreatureScript
_vileSpiritExplosions = 0;
}

void Reset() override
void InitializeAI() override
{
SetupEncounter();
}

void JustRespawned() override
{
SetupEncounter();
}

void SetupEncounter()
{
_Reset();
me->SetReactState(REACT_PASSIVE);
events.SetPhase(PHASE_INTRO);
Initialize();
SetEquipmentSlots(true);

// Reset The Frozen Throne gameobjects
FrozenThroneResetWorker reset;
Trinity::GameObjectWorker<FrozenThroneResetWorker> worker(me, reset);
me->VisitNearbyGridObject(333.0f, worker);

// Reset any light override
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);

me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING_LK, TirionSpawn, TEMPSUMMON_MANUAL_DESPAWN);
}

void JustDied(Unit* /*killer*/) override
Expand Down Expand Up @@ -535,40 +556,21 @@ class boss_the_lich_king : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, 0, PHASE_ONE);
}

void JustReachedHome() override
{
_JustReachedHome();
instance->SetBossState(DATA_THE_LICH_KING, NOT_STARTED);

// Reset The Frozen Throne gameobjects
FrozenThroneResetWorker reset;
Trinity::GameObjectWorker<FrozenThroneResetWorker> worker(me, reset);
me->VisitNearbyGridObject(333.0f, worker);

// Restore Tirion's gossip only after The Lich King fully resets to prevent
// restarting the encounter while LK still runs back to spawn point
if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING)))
tirion->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);

// Reset any light override
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);
}

bool CanAIAttack(Unit const* target) const override
{
// The Lich King must not select targets in frostmourne room if he killed everyone outside
return !target->HasAura(SPELL_IN_FROSTMOURNE_ROOM) && BossAI::CanAIAttack(target);
}

void EnterEvadeMode(EvadeReason why) override
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SetBossState(DATA_THE_LICH_KING, FAIL);
BossAI::EnterEvadeMode(why);
if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING)))
tirion->AI()->EnterEvadeMode();
tirion->DespawnOrUnsummon();
DoCastAOE(SPELL_KILL_FROSTMOURNE_PLAYERS);
EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE);
summons.DoAction(ACTION_TELEPORT_BACK, pred);
summons.DespawnAll();
_DespawnAtEvade();
}

void KilledUnit(Unit* victim) override
Expand Down Expand Up @@ -749,6 +751,8 @@ class boss_the_lich_king : public CreatureScript
case NPC_STRANGULATE_VEHICLE:
summons.Summon(summon);
return;
case NPC_HIGHLORD_TIRION_FORDRING_LK:
return;
default:
break;
}
Expand Down Expand Up @@ -1132,6 +1136,7 @@ class npc_tirion_fordring_tft : public CreatureScript
_events.Reset();
if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE)
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->LoadEquipment(1);
}

void MovementInform(uint32 type, uint32 id) override
Expand Down

0 comments on commit c9b2451

Please sign in to comment.