Scripts/HoO: scripted Sun-Touched Servants

This commit is contained in:
Ovahlord
2021-01-29 21:27:31 +01:00
parent 3ac05d1b33
commit 1e1ebf16bd
4 changed files with 133 additions and 4 deletions

View File

@@ -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');

View File

@@ -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
//

View File

@@ -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);
}

View File

@@ -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