refactor(Scripts/RuinsOfAhnQiraj): Buru eggs (#12822)

This commit is contained in:
Angelo Venturini
2022-08-23 08:01:28 -03:00
committed by GitHub
parent ca9c19ffd4
commit 119a2356a0
5 changed files with 58 additions and 36 deletions
@@ -0,0 +1,6 @@
--
UPDATE `creature` SET `spawntimesecs` = 120 WHERE `id1` = 15514;
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 29) AND (`SourceEntry` = 15514) AND (`SourceId` = 0) AND (`ConditionTypeOrReference` = 13);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(29, 0, 15514, 0, 0, 13, 0, 16, 2, 0, 1, 0, 0, '', 'Buru Egg spawn only if Buru is in egg phase.');
@@ -4354,6 +4354,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_1].Effect = 0; spellInfo->Effects[EFFECT_1].Effect = 0;
}); });
// Explosion
ApplySpellFix({ 5255 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;
spellInfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{ {
SpellInfo* spellInfo = mSpellInfoMap[i]; SpellInfo* spellInfo = mSpellInfoMap[i];
@@ -45,14 +45,13 @@ enum Events
{ {
EVENT_DISMEMBER = 1, EVENT_DISMEMBER = 1,
EVENT_GATHERING_SPEED = 2, EVENT_GATHERING_SPEED = 2,
EVENT_CREEPING_PLAGUE = 3, EVENT_CREEPING_PLAGUE = 3
EVENT_RESPAWN_EGG = 4,
}; };
enum Phases enum Phases
{ {
PHASE_EGG = 0, PHASE_EGG = 1,
PHASE_TRANSFORM = 1 PHASE_TRANSFORM = 2
}; };
struct boss_buru : public BossAI struct boss_buru : public BossAI
@@ -65,8 +64,10 @@ struct boss_buru : public BossAI
DoCastSelf(SPELL_FULL_SPEED, true); DoCastSelf(SPELL_FULL_SPEED, true);
_phase = PHASE_EGG;
instance->SetData(DATA_BURU_PHASE, _phase);
ManipulateEggs(true); ManipulateEggs(true);
_eggs.clear();
} }
void ManipulateEggs(bool respawn) void ManipulateEggs(bool respawn)
@@ -83,11 +84,12 @@ struct boss_buru : public BossAI
me->AddThreat(who, 1000000.f); me->AddThreat(who, 1000000.f);
Talk(EMOTE_TARGET, who); Talk(EMOTE_TARGET, who);
DoCastSelf(SPELL_THORNS); DoCastSelf(SPELL_THORNS);
_phase = PHASE_EGG;
instance->SetData(DATA_BURU_PHASE, _phase);
ManipulateEggs(true); ManipulateEggs(true);
me->RemoveAurasDueToSpell(SPELL_FULL_SPEED); me->RemoveAurasDueToSpell(SPELL_FULL_SPEED);
events.ScheduleEvent(EVENT_DISMEMBER, 5s); events.ScheduleEvent(EVENT_DISMEMBER, 5s);
events.ScheduleEvent(EVENT_GATHERING_SPEED, 2s); events.ScheduleEvent(EVENT_GATHERING_SPEED, 2s);
_phase = PHASE_EGG;
} }
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
@@ -125,19 +127,9 @@ struct boss_buru : public BossAI
} }
} }
void SetGUID(ObjectGuid const guid, int32 /*type*/) override
{
_eggs.push_back(guid);
events.ScheduleEvent(EVENT_RESPAWN_EGG, 120s);
}
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override
{ {
if (attacker->GetEntry() != NPC_BURU_EGG && _phase == PHASE_EGG) if (attacker->GetEntry() == NPC_BURU_EGG)
{
damage = damage * 0.01f; // 99% dmg resist
}
else if (attacker->GetEntry() == NPC_BURU_EGG)
{ {
me->LowerPlayerDamageReq(damage); me->LowerPlayerDamageReq(damage);
} }
@@ -150,6 +142,7 @@ struct boss_buru : public BossAI
me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED);
events.Reset(); events.Reset();
_phase = PHASE_TRANSFORM; _phase = PHASE_TRANSFORM;
instance->SetData(DATA_BURU_PHASE, _phase);
DoResetThreat(); DoResetThreat();
events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 2s); events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 2s);
DoCastSelf(SPELL_BURU_TRANSFORM); DoCastSelf(SPELL_BURU_TRANSFORM);
@@ -179,12 +172,6 @@ struct boss_buru : public BossAI
DoCastAOE(SPELL_CREEPING_PLAGUE); DoCastAOE(SPELL_CREEPING_PLAGUE);
events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 6s); events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 6s);
break; break;
case EVENT_RESPAWN_EGG:
if (Creature* egg = me->GetMap()->GetCreature(*_eggs.begin()))
egg->Respawn();
_eggs.pop_front();
break;
default: default:
break; break;
} }
@@ -194,7 +181,6 @@ struct boss_buru : public BossAI
} }
private: private:
uint8 _phase; uint8 _phase;
GuidList _eggs;
}; };
struct npc_buru_egg : public ScriptedAI struct npc_buru_egg : public ScriptedAI
@@ -204,6 +190,7 @@ struct npc_buru_egg : public ScriptedAI
_instance = me->GetInstanceScript(); _instance = me->GetInstanceScript();
SetCombatMovement(false); SetCombatMovement(false);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetControlled(true, UNIT_STATE_STUNNED);
} }
void EnterCombat(Unit* attacker) override void EnterCombat(Unit* attacker) override
@@ -238,14 +225,17 @@ struct npc_buru_egg : public ScriptedAI
{ {
if (Creature* buru = _instance->GetCreature(DATA_BURU)) if (Creature* buru = _instance->GetCreature(DATA_BURU))
{ {
DoCastSelf(SPELL_EXPLODE); DoCastSelf(SPELL_EXPLODE, true);
DoCastSelf(SPELL_BURU_EGG_TRIGGER, true); DoCastSelf(SPELL_BURU_EGG_TRIGGER, true);
buru->CastSpell(buru, SPELL_CREATURE_SPECIAL, true); buru->CastSpell(buru, SPELL_CREATURE_SPECIAL, true);
if (buru->GetAI())
buru->AI()->SetGUID(me->GetGUID());
} }
} }
me->DespawnOrUnsummon(5000);
} }
void UpdateAI(uint32 /*diff*/) override { }
private: private:
InstanceScript* _instance; InstanceScript* _instance;
}; };
@@ -75,6 +75,7 @@ public:
SetBossNumber(NUM_ENCOUNTER); SetBossNumber(NUM_ENCOUNTER);
LoadObjectData(creatureData, nullptr); LoadObjectData(creatureData, nullptr);
_rajaxWaveCounter = 0; _rajaxWaveCounter = 0;
_buruPhase = 1;
} }
void OnPlayerEnter(Player* player) override void OnPlayerEnter(Player* player) override
@@ -150,20 +151,35 @@ public:
} }
} }
void SetData(uint32 type, uint32 /*data*/) override void SetData(uint32 type, uint32 data) override
{ {
if (type == DATA_RAJAXX_WAVE_ENGAGED) switch (type)
{ {
_scheduler.CancelGroup(GROUP_RAJAXX_WAVE_TIMER); case DATA_RAJAXX_WAVE_ENGAGED:
_scheduler.Schedule(2min, [this](TaskContext context) _scheduler.CancelGroup(GROUP_RAJAXX_WAVE_TIMER);
{ _scheduler.Schedule(2min, [this](TaskContext context)
CallNextRajaxxLeader(); {
context.SetGroup(GROUP_RAJAXX_WAVE_TIMER); CallNextRajaxxLeader();
context.Repeat(); context.SetGroup(GROUP_RAJAXX_WAVE_TIMER);
}); context.Repeat();
});
break;
case DATA_BURU_PHASE:
_buruPhase = data;
break;
default:
break;
} }
} }
uint32 GetData(uint32 type) const override
{
if (type == DATA_BURU_PHASE)
return _buruPhase;
return 0;
}
void OnUnitDeath(Unit* unit) override void OnUnitDeath(Unit* unit) override
{ {
if (Creature* creature = unit->ToCreature()) if (Creature* creature = unit->ToCreature())
@@ -362,6 +378,7 @@ public:
ObjectGuid _andorovGUID; ObjectGuid _andorovGUID;
GuidVector _sandVortexes; GuidVector _sandVortexes;
uint32 _rajaxWaveCounter; uint32 _rajaxWaveCounter;
uint8 _buruPhase;
TaskScheduler _scheduler; TaskScheduler _scheduler;
}; };
@@ -43,6 +43,8 @@ enum DataTypes
DATA_ZERRAN = 14, DATA_ZERRAN = 14,
DATA_ANDOROV = 15, DATA_ANDOROV = 15,
DATA_BURU_PHASE = 16,
DATA_ENGAGED_FORMATION = 1 DATA_ENGAGED_FORMATION = 1
}; };