Scripts/BWD: scripted Lava Parasites and apply a hotfix change to Pillar of Flame

This commit is contained in:
Ovahlord
2019-05-07 02:49:36 +02:00
parent 7b848f7ea3
commit 0b795aa5bf
4 changed files with 173 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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