From 1e1ebf16bd53a2960ec5099283b1fdb1f027bf1f Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Fri, 29 Jan 2021 21:27:31 +0100 Subject: [PATCH] Scripts/HoO: scripted Sun-Touched Servants --- .../world/4.3.4/2021_01_29_00_world.sql | 13 ++ src/server/game/Spells/SpellMgr.cpp | 8 ++ .../halls_of_origination.cpp | 114 +++++++++++++++++- .../HallsOfOrigination/halls_of_origination.h | 2 + 4 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/4.3.4/2021_01_29_00_world.sql diff --git a/sql/updates/world/4.3.4/2021_01_29_00_world.sql b/sql/updates/world/4.3.4/2021_01_29_00_world.sql new file mode 100644 index 00000000000..118d984f6d7 --- /dev/null +++ b/sql/updates/world/4.3.4/2021_01_29_00_world.sql @@ -0,0 +1,13 @@ +UPDATE `creature_template` SET `ScriptName`= 'npc_sun_touched_servant' WHERE `entry` IN (39366, 39369, 39370); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_hoo_disperse'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(88097, 'spell_hoo_disperse'), +(88100, 'spell_hoo_disperse'); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (39366, 39369); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +(39366, 0, 0, '%s disperses!', 16, 0, 100, 0, 0, 0, 42481, 'Sun-Touched Servant'), +(39369, 0, 0, '%s disperses!', 16, 0, 100, 0, 0, 0, 42481, 'Sun-Touched Sprite'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 9d40e8b3f1d..d8f084c35da 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4718,6 +4718,14 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].RadiusEntry = nullptr; }); + ApplySpellFix({ + 73847, // Summon Sun-Touched Sprite + 73848 // Summon Sun-Touched Spriteling + }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(7); // 10yd + }); + // END OF HALLS OF ORIGINATION SPELLS // diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.cpp index 2926ffc5a33..d78f5985404 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.cpp @@ -33,6 +33,90 @@ #include "Transport.h" #include "halls_of_origination.h" +enum SunTouchedServant +{ + // Texts + SAY_EMOTE_DISPERSE = 0, + + // Spells + SPELL_SEARING_FLAMES = 74101, + SPELL_DISPERSE_SERVANT = 88097, + SPELL_DISPERSE_SPRITE = 88100, + SPELL_FLAME_DISPERSION = 76160, + SPELL_PYROGENICS_SPRITE = 76158, + SPELL_PYROGENICS_SPRITELING = 76159, + + // Events + EVENT_SEARING_FLAMES = 1 +}; + +struct npc_sun_touched_servant : public ScriptedAI +{ + npc_sun_touched_servant(Creature* creature) : ScriptedAI(creature), _dispersed(false) { } + + void JustAppeared() override + { + if (me->GetEntry() == NPC_SUN_TOUCHED_SERVANT) + return; + + DoCastSelf(me->GetEntry() == NPC_SUN_TOUCHED_SPRITE ? SPELL_PYROGENICS_SPRITE : SPELL_PYROGENICS_SPRITELING); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SEARING_FLAMES, 5s, 7s); + } + + void EnterEvadeMode(EvadeReason why) override + { + ScriptedAI::EnterEvadeMode(why); + _events.Reset(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->GetEntry() == NPC_SUN_TOUCHED_SPRITELING) + return; + + if (!_dispersed && me->HealthBelowPctDamaged(1, damage)) + { + _dispersed = true; + DoCastSelf(me->GetEntry() == NPC_SUN_TOUCHED_SERVANT ? SPELL_DISPERSE_SERVANT : SPELL_DISPERSE_SPRITE); + Talk(SAY_EMOTE_DISPERSE); + } + + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SEARING_FLAMES: + DoCastVictim(SPELL_SEARING_FLAMES); + _events.Repeat(8s, 14s); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; + bool _dispersed; +}; + // The Maker's Lift enum ElevatorMisc { @@ -102,10 +186,10 @@ class spell_hoo_flame_ring_visual : public SpellScript return; targets.remove_if([](WorldObject const* target)->bool - { - Unit const* unit = target->ToUnit(); - return !unit || unit->GetEntry() != NPC_SUN_TOUCHED_SERVANT; - }); + { + Unit const* unit = target->ToUnit(); + return !unit || unit->GetEntry() != NPC_SUN_TOUCHED_SERVANT; + }); if (targets.empty()) return; @@ -126,8 +210,30 @@ class spell_hoo_flame_ring_visual : public SpellScript } }; +class spell_hoo_disperse : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FLAME_DISPERSION }); + } + + void HandleDeath(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_FLAME_DISPERSION); + target->KillSelf(); // There is no suicide spell being shown in sniffs + } + + void Register() override + { + AfterEffectRemove.Register(&spell_hoo_disperse::HandleDeath, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_halls_of_origination() { + RegisterHallsOfOriginationCreatureAI(npc_sun_touched_servant); RegisterGameObjectAI(go_hoo_the_makers_lift_controller); RegisterSpellScript(spell_hoo_flame_ring_visual); + RegisterSpellScript(spell_hoo_disperse); } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 6cbf36aec41..8c6819e7068 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -140,6 +140,8 @@ enum HOOCreatures NPC_INFERNO_LEAP = 47040, NPC_BLAZING_INFERNO = 40927, NPC_SUN_TOUCHED_SERVANT = 39366, + NPC_SUN_TOUCHED_SPRITE = 39369, + NPC_SUN_TOUCHED_SPRITELING = 39370 }; enum HOOGameObjects