mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-26 20:02:25 +01:00
Scripts/HoO: scripted Sun-Touched Servants
This commit is contained in:
13
sql/updates/world/4.3.4/2021_01_29_00_world.sql
Normal file
13
sql/updates/world/4.3.4/2021_01_29_00_world.sql
Normal 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');
|
||||
@@ -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
|
||||
|
||||
//
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user