mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-30 21:57:01 +01:00
Scripts/BWD: scripted Lava Parasites and apply a hotfix change to Pillar of Flame
This commit is contained in:
@@ -12,11 +12,15 @@ UPDATE `creature_template` SET `speed_run`= 0.3571, `speed_walk`= 1 WHERE `entry
|
||||
UPDATE `creature_template` SET `ScriptName`= '' WHERE `entry`= 42347;
|
||||
-- Nefarian
|
||||
UPDATE `creature_template` SET `speed_run`= 1.7142, `unit_flags`= 33587264 WHERE `entry`= 49427;
|
||||
-- Lava Parasite
|
||||
UPDATE `creature_template` SET `ScriptName`= 'npc_magmaw_lava_parasite' WHERE `entry` IN (41806, 42321);
|
||||
UPDATE `creature_template` SET `speed_run`= 0.4286 WHERE `entry` IN (41806, 42321);
|
||||
|
||||
-- Addons
|
||||
DELETE FROM `creature_template_addon` WHERE `entry` IN (41806, 49427);
|
||||
DELETE FROM `creature_template_addon` WHERE `entry` IN (41806, 42321, 49427);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `bytes1`, `bytes2`, `auras`) VALUES
|
||||
(41806, 0, 1, '78019'),
|
||||
(42321, 0, 1, '78019'),
|
||||
(49427, 50331648, 1, '');
|
||||
|
||||
-- Vehicle accessory
|
||||
@@ -48,6 +52,12 @@ INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Fligh
|
||||
-- Nefarian
|
||||
(49427, 0, 0, 2, 0);
|
||||
|
||||
-- Serverside Spells
|
||||
UPDATE `spell_dbc` SET `DurationIndex`= 3 WHERE `Id`= 77994;
|
||||
DELETE FROM `spelleffect_dbc` WHERE `Id`= 160093;
|
||||
INSERT INTO `spelleffect_dbc` (`Id`, `Effect`, `EffectApplyAuraName`, `EffectMiscValue`, `EffectRadiusIndex`, `EffectImplicitTargetA`, `EffectImplicitTargetB`, `EffectIndex`, `EffectSpellId`, `Comment`) VALUES
|
||||
(160093, 6, 296, 843, 28, 22, 15, 0, 77994, 'Pillar of Flame');
|
||||
|
||||
-- Spells
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
|
||||
('spell_magmaw_magma_spit',
|
||||
@@ -57,7 +67,8 @@ DELETE FROM `spell_script_names` WHERE `ScriptName` IN
|
||||
'spell_magmaw_ride_vehicle',
|
||||
'spell_magmaw_launch_hook',
|
||||
'spell_magmaw_eject_passenger_1',
|
||||
'spell_magmaw_eject_passenger_3');
|
||||
'spell_magmaw_eject_passenger_3',
|
||||
'spell_magmaw_lava_parasite');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_gen_eject_passenger' AND `spell_id` IN (77946, 95204);
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_gen_eject_passenger_1' AND `spell_id`= 77946;
|
||||
@@ -72,7 +83,8 @@ INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(77946, 'spell_magmaw_eject_passenger_1'),
|
||||
(95204, 'spell_magmaw_eject_passenger_3'),
|
||||
(77917, 'spell_magmaw_launch_hook'),
|
||||
(77941, 'spell_magmaw_launch_hook');
|
||||
(77941, 'spell_magmaw_launch_hook'),
|
||||
(78019, 'spell_magmaw_lava_parasite');
|
||||
|
||||
|
||||
-- Conditions
|
||||
|
||||
@@ -60,7 +60,8 @@ enum BWDCreatureIds
|
||||
NPC_EXPOSED_HEAD_OF_MAGMAW = 42347,
|
||||
NPC_EXPOSED_HEAD_OF_MAGMAW_2 = 48270,
|
||||
NPC_PILLAR_OF_FLAME = 41843,
|
||||
NPC_LAVA_PARASITE = 41806,
|
||||
NPC_LAVA_PARASITE_1 = 41806,
|
||||
NPC_LAVA_PARASITE_2 = 42321,
|
||||
NPC_MASSIVE_CRASH = 47330,
|
||||
NPC_ROOM_STALKER = 47196,
|
||||
NPC_MAGMAW_SPIKE_STALKER = 41767,
|
||||
|
||||
@@ -39,6 +39,7 @@ enum Spells
|
||||
SPELL_SWELTERING_ARMOR = 78199,
|
||||
SPELL_PILLAR_OF_FLAME = 77998,
|
||||
SPELL_PILLAR_OF_FLAME_MISSILE_PERIODIC = 78006,
|
||||
SPELL_PILLAR_OF_FLAME_SET_VEHICLE_ID = 77994,
|
||||
SPELL_MASSIVE_CRASH = 88253,
|
||||
SPELL_IMPALE_SELF = 77907,
|
||||
SPELL_EJECT_PASSENGER_3 = 95204,
|
||||
@@ -62,6 +63,12 @@ enum Spells
|
||||
// Magmaw Spike Stalker
|
||||
SPELL_CHAIN_VISUAL_1 = 77940,
|
||||
SPELL_CHAIN_VISUAL_2 = 77929,
|
||||
|
||||
// Lava Parasite
|
||||
SPELL_LAVA_PARASITE_PROC_AURA = 78019,
|
||||
SPELL_LAVA_PARASITE_RIDE_VEHICLE = 78020,
|
||||
SPELL_PARASITIC_INFECTION_VOMIT = 78097,
|
||||
SPELL_PARASITIC_INFECTION_DAMAGE = 78941
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -78,12 +85,17 @@ enum Events
|
||||
EVENT_EJECT_PASSENGER_1,
|
||||
EVENT_EXPOSE_HEAD,
|
||||
EVENT_HIDE_HEAD,
|
||||
EVENT_FINISH_IMPALE_SELF
|
||||
EVENT_FINISH_IMPALE_SELF,
|
||||
|
||||
// Lava Parasite
|
||||
EVENT_PREPARE_PARASITE,
|
||||
EVENT_ENGAGE_PLAYERS
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_IMPALE_MAGMAW = 0
|
||||
ACTION_IMPALE_MAGMAW = 0,
|
||||
ACTION_FAIL_ACHIEVEMT = 1
|
||||
};
|
||||
|
||||
enum Texts
|
||||
@@ -115,7 +127,8 @@ enum VehicleSeats
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_FREE_PINCER = 0
|
||||
DATA_FREE_PINCER = 0,
|
||||
DATA_ACHIEVEMENT_STATE = 1
|
||||
};
|
||||
|
||||
enum MovePoints
|
||||
@@ -144,6 +157,7 @@ struct boss_magmaw : public BossAI
|
||||
_pincer2 = nullptr;
|
||||
_hasExposedHead = false;
|
||||
_headEngaged = false;
|
||||
_achievementEnligible = true;
|
||||
_lowHealthTextTriggered = !IsHeroic();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
@@ -261,6 +275,14 @@ struct boss_magmaw : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const override
|
||||
{
|
||||
if (type == DATA_ACHIEVEMENT_STATE)
|
||||
return uint8(_achievementEnligible);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ObjectGuid GetGUID(int32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
@@ -316,6 +338,9 @@ struct boss_magmaw : public BossAI
|
||||
events.ScheduleEvent(EVENT_EXPOSE_HEAD, 4s + 700ms);
|
||||
_hasExposedHead = true;
|
||||
break;
|
||||
case ACTION_FAIL_ACHIEVEMT:
|
||||
_achievementEnligible = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -345,6 +370,7 @@ struct boss_magmaw : public BossAI
|
||||
else
|
||||
{
|
||||
DoCastAOE(SPELL_PILLAR_OF_FLAME);
|
||||
DoCastAOE(SPELL_PILLAR_OF_FLAME_SET_VEHICLE_ID);
|
||||
_magmaProjectileCount = 0;
|
||||
events.Repeat(8s);
|
||||
}
|
||||
@@ -474,11 +500,78 @@ private:
|
||||
Creature* _pincer1;
|
||||
Creature* _pincer2;
|
||||
uint8 _magmaProjectileCount;
|
||||
bool _achievementEnligible;
|
||||
bool _hasExposedHead;
|
||||
bool _headEngaged;
|
||||
bool _lowHealthTextTriggered;
|
||||
};
|
||||
|
||||
struct npc_magmaw_lava_parasite : public ScriptedAI
|
||||
{
|
||||
npc_magmaw_lava_parasite(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript())
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
// I have no idea why Blizzard is delaying it but they do so we comply here as well
|
||||
_events.ScheduleEvent(EVENT_PREPARE_PARASITE, 1s + 700ms);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
me->DespawnOrUnsummon(2s + 500ms);
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_LAVA_PARASITE_RIDE_VEHICLE)
|
||||
{
|
||||
me->AttackStop();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->DespawnOrUnsummon(4s);
|
||||
if (Creature* magmaw = _instance->GetCreature(DATA_MAGMAW))
|
||||
magmaw->AI()->DoAction(ACTION_FAIL_ACHIEVEMT);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
UpdateVictim();
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PREPARE_PARASITE:
|
||||
DoCastSelf(SPELL_LAVA_PARASITE_PROC_AURA);
|
||||
_events.ScheduleEvent(EVENT_ENGAGE_PLAYERS, 2s);
|
||||
break;
|
||||
case EVENT_ENGAGE_PLAYERS:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoZoneInCombat();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
class IsOnVehicleCheck
|
||||
{
|
||||
public:
|
||||
@@ -608,6 +701,19 @@ class spell_magmaw_pillar_of_flame_dummy : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
class DistanceCheck
|
||||
{
|
||||
public:
|
||||
DistanceCheck(Unit* caster) : _caster(caster) { }
|
||||
|
||||
bool operator()(WorldObject* object)
|
||||
{
|
||||
return (object->GetExactDist2d(_caster) >= 15.0f);
|
||||
}
|
||||
private:
|
||||
Unit* _caster;
|
||||
};
|
||||
|
||||
class spell_magmaw_pillar_of_flame_forcecast : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_magmaw_pillar_of_flame_forcecast);
|
||||
@@ -622,6 +728,12 @@ class spell_magmaw_pillar_of_flame_forcecast : public SpellScript
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
// Hotfix (2010-12-21): Magmaw's Pillar of Flame now prefers targets further than 15 yards away
|
||||
std::list<WorldObject*> targetsCopy = targets;
|
||||
targetsCopy.remove_if(DistanceCheck(GetCaster()));
|
||||
if (!targetsCopy.empty())
|
||||
targets = targetsCopy;
|
||||
|
||||
Trinity::Containers::RandomResize(targets, 1);
|
||||
}
|
||||
|
||||
@@ -730,9 +842,47 @@ class spell_magmaw_eject_passenger_3 : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
class spell_magmaw_lava_parasite : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_magmaw_lava_parasite);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo(
|
||||
{
|
||||
SPELL_PARASITIC_INFECTION_DAMAGE,
|
||||
SPELL_PARASITIC_INFECTION_VOMIT,
|
||||
});
|
||||
}
|
||||
|
||||
void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
|
||||
{
|
||||
// Hotfix (2010-12-21): Lava Parasites are functioning normally and cannot infest a player with more than 3 Parasite debuffs active
|
||||
PreventDefaultAction();
|
||||
|
||||
Unit* caster = GetTarget();
|
||||
Unit* target = eventInfo.GetProcTarget();
|
||||
if (Vehicle* vehicle = target->GetVehicleKit())
|
||||
{
|
||||
if (vehicle->GetAvailableSeatCount())
|
||||
{
|
||||
caster->CastSpell(target, GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
|
||||
caster->CastSpell(target, SPELL_PARASITIC_INFECTION_DAMAGE, true);
|
||||
caster->CastSpell(target, SPELL_PARASITIC_INFECTION_VOMIT, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectProc += AuraEffectProcFn(spell_magmaw_lava_parasite::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_magmaw()
|
||||
{
|
||||
RegisterBlackwingDescentCreatureAI(boss_magmaw);
|
||||
RegisterBlackwingDescentCreatureAI(npc_magmaw_lava_parasite);
|
||||
RegisterSpellScript(spell_magmaw_magma_spit);
|
||||
RegisterSpellScript(spell_magmaw_mangle);
|
||||
RegisterSpellScript(spell_magmaw_pillar_of_flame_dummy);
|
||||
@@ -741,4 +891,5 @@ void AddSC_boss_magmaw()
|
||||
RegisterAuraScript(spell_magmaw_launch_hook);
|
||||
RegisterSpellScript(spell_magmaw_eject_passenger_1);
|
||||
RegisterSpellScript(spell_magmaw_eject_passenger_3);
|
||||
RegisterAuraScript(spell_magmaw_lava_parasite);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,8 @@ class instance_blackwing_descent : public InstanceMapScript
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_PILLAR_OF_FLAME:
|
||||
case NPC_LAVA_PARASITE:
|
||||
case NPC_LAVA_PARASITE_1:
|
||||
case NPC_LAVA_PARASITE_2:
|
||||
if (Creature* magmaw = GetCreature(DATA_MAGMAW))
|
||||
magmaw->AI()->JustSummoned(creature);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user