feat(Scripts/SAI): Ported Riding the Red Rocket Quest script from TCO (#3704)

* feat(CORE/Script): Ported Riding the Red Rocket Quest script from TCO

Taken from 20b3feb559
This commit is contained in:
Petric
2021-10-18 20:10:26 +01:00
committed by GitHub
parent d9449c7a99
commit e8a6c4fa75
2 changed files with 320 additions and 60 deletions

View File

@@ -0,0 +1,45 @@
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1605451531356936900');
UPDATE `creature_template` SET `speed_walk` = 5, `speed_run` = 5, `ScriptName` = 'npc_rocket_propelled_warhead' WHERE `entry` =27593;
UPDATE `creature` SET `spawntimesecs` = 1 WHERE `id` =27593;
UPDATE `creature` SET `position_z` = -0.20 WHERE `id` = 27593;
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_z_check', 'spell_vehicle_warhead_fuse', 'spell_warhead_detonate','spell_warhead_fuse');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(61678, 'spell_z_check'),
(49107, 'spell_vehicle_warhead_fuse'),
(49250, 'spell_warhead_detonate'),
(49181, 'spell_warhead_fuse');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=49332;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13,1,49332,0,1,31,0,3,27702,0,0,0,0,'',"Spell 'Warhead Seeking Mine' can hit 'Horde Lumberboat'"),
(13,1,49332,0,2,31,0,3,27688,0,0,0,0,'',"Spell 'Warhead Seeking Mine' can hit 'Alliance Lumberboat'");
-- Warhead Explosion Bunny SAI
UPDATE `creature_template` SET `InhabitType`=4, `AIName`='SmartAI' WHERE `entry`=27663;
DELETE FROM `smart_scripts` WHERE `entryorguid`=27663 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(27663,0,0,0,54,0,100,0,0,0,0,0,11,49290,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warhead Explosion Bunny - Just Summoned - Cast \'Torpedo Explosion\'');
-- Alliance Lumberboat Explosions SAI
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=27689;
DELETE FROM `smart_scripts` WHERE `entryorguid`=27689 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=2768900 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(27689,0,0,0,8,0,100,0,49290,0,0,0,80,2768900,0,0,0,0,0,1,0,0,0,0,0,0,0,'Alliance Lumberboat Explosions - On SpellHit \'Warhead Seeking Mine\' - Cast \'Horde Boat to Torpedo\''),
(2768900,9,0,0,0,0,100,0,0,0,0,0,11,42344,0,0,0,0,0,1,0,0,0,0,0,0,0,'Alliance Lumberboat Explosions - ActionList - Cast \'Cosmetic - Flame Patch 0.5\''),
(2768900,9,1,0,0,0,50,0,11000,11000,0,0,11,42345,0,0,0,0,0,1,0,0,0,0,0,0,0,'Alliance Lumberboat Explosions - ActionList - Cast \'Cosmetic - Flame Patch\''),
(2768900,9,2,0,0,0,50,0,11000,11000,0,0,11,42346,0,0,0,0,0,1,0,0,0,0,0,0,0,'Alliance Lumberboat Explosions - ActionList - Cast \'Cosmetic - Flame Patch 2.0\'');
-- Horde Lumberboat SAI
UPDATE `creature_template` SET `InhabitType`=4, `AIName`='SmartAI' WHERE `entry`=27702;
DELETE FROM `smart_scripts` WHERE `entryorguid`=27702 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(27702,0,0,0,8,0,100,0,49332,0,0,0,11,49372,0,0,0,0,0,9,27593,0,100,0,0,0,0,'Horde Lumberboat - On SpellHit \'Warhead Seeking Mine\' - Cast \'Horde Boat to Torpedo\'');
-- Alliance Lumberboat SAI
UPDATE `creature_template` SET `InhabitType`=4, `AIName`='SmartAI' WHERE `entry`=27688;
DELETE FROM `smart_scripts` WHERE `entryorguid`=27688 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(27688,0,0,0,8,0,100,0,49332,0,0,0,11,49257,0,0,0,0,0,9,27593,0,100,0,0,0,0,'Alliance Lumberboat - On SpellHit \'Warhead Seeking Mine\' - Cast \'Alliance Boat to Torpedo\'');

View File

@@ -24,63 +24,7 @@
#include "ScriptMgr.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "Vehicle.h"
// Ours
enum qRedRocket
{
SPELL_TORPEDO_EXPLODE = 49290,
SPELL_ALLIANCE_TORPEDO_KILL_CREDIT = 49510,
SPELL_HORDE_TORPEDO_KILL_CREDIT = 49340,
};
class npc_riding_the_red_rocket : public CreatureScript
{
public:
npc_riding_the_red_rocket() : CreatureScript("npc_riding_the_red_rocket") { }
struct npc_riding_the_red_rocketAI : public VehicleAI
{
npc_riding_the_red_rocketAI(Creature* creature) : VehicleAI(creature) {}
void AttackStart(Unit* /*who*/) override {}
void EnterCombat(Unit* /*who*/) override {}
void EnterEvadeMode() override {}
void UpdateAI(uint32 /*diff*/) override
{
if (me->GetDistance(2763, -1596, 0) < 20.0f) // Horde ship
{
me->CastSpell(me, SPELL_ALLIANCE_TORPEDO_KILL_CREDIT, true);
if (Unit* owner = me->GetCharmerOrOwner())
{
Position pos(me->GetHomePosition());
owner->ExitVehicle();
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), false);
owner->CastSpell(owner, SPELL_TORPEDO_EXPLODE, true);
owner->KnockbackFrom(owner->GetPositionX(), owner->GetPositionY(), 5.0f, 50.0f);
}
}
else if (me->GetDistance(2545, -2242, 0) < 20.0f) // Alliance ship
{
me->CastSpell(me, SPELL_HORDE_TORPEDO_KILL_CREDIT, true);
if (Unit* owner = me->GetCharmerOrOwner())
{
Position pos(me->GetHomePosition());
owner->ExitVehicle();
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), false);
owner->CastSpell(owner, SPELL_TORPEDO_EXPLODE, true);
owner->KnockbackFrom(owner->GetPositionX(), owner->GetPositionY(), 5.0f, 50.0f);
}
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_riding_the_red_rocketAI(creature);
}
};
#include "CombatAI.h"
// Theirs
@@ -942,11 +886,277 @@ public:
}
};
/*######
## Quest: Riding the Red Rocket
######*/
enum RedRocket
{
SPELL_VEHICLE_WARHEAD_FUSE = 49107,
SPELL_ALLIANCE_KILL_CREDIT_TORPEDO = 49510,
SPELL_HORDE_KILL_CREDIT_TORPEDO = 49340,
NPC_HORDE_LUMBERBOAT = 27702,
NPC_ALLIANCE_LUMBERBOAT = 27688,
SPELL_DETONATE = 49250
};
class npc_rocket_propelled_warhead : public CreatureScript
{
public:
npc_rocket_propelled_warhead() : CreatureScript("npc_rocket_propelled_warhead") { }
struct npc_rocket_propelled_warheadAI : public VehicleAI
{
npc_rocket_propelled_warheadAI(Creature* creature) : VehicleAI(creature), _faction(ALLIANCE), _finished(false)
{
}
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
{
if (apply && who && who->ToPlayer())
{
DoCast(me, SPELL_VEHICLE_WARHEAD_FUSE);
_faction = who->ToPlayer()->GetTeamId();
}
}
void JustReachedHome() override
{
_finished = false;
me->SetVisible(true);
me->GetMotionMaster()->Clear(true);
}
void DoAction(int32 /*action*/) override
{
FinishQuest(false, _faction);
}
void SpellHit(Unit* caster, SpellInfo const* /*spellInfo*/) override
{
if (caster && (caster->GetEntry() == NPC_HORDE_LUMBERBOAT || caster->GetEntry() == NPC_ALLIANCE_LUMBERBOAT))
{
FinishQuest(true, _faction);
}
}
void FinishQuest(bool success, uint32 faction)
{
if (_finished)
{
return;
}
_finished = true;
if (success)
{
DoCast(me, faction == ALLIANCE ? SPELL_ALLIANCE_KILL_CREDIT_TORPEDO : SPELL_HORDE_KILL_CREDIT_TORPEDO, true);
}
DoCast(me, SPELL_DETONATE, true);
me->RemoveAllAuras();
me->SetVisible(false);
me->GetMotionMaster()->MoveTargetedHome();
}
private:
uint32 _faction;
bool _finished;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_rocket_propelled_warheadAI(creature);
}
};
enum WarheadSpells
{
SPELL_WARHEAD_Z_CHECK = 61678,
SPELL_WARHEAD_SEEKING_LUMBERSHIP = 49331,
SPELL_WARHEAD_FUSE = 49181
};
// 49107 - Vehicle: Warhead Fuse
class spell_vehicle_warhead_fuse : public SpellScriptLoader
{
public:
spell_vehicle_warhead_fuse() : SpellScriptLoader("spell_vehicle_warhead_fuse") { }
class spell_vehicle_warhead_fuse_SpellScript : public SpellScript
{
PrepareSpellScript(spell_vehicle_warhead_fuse_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return sSpellMgr->GetSpellInfo(SPELL_WARHEAD_Z_CHECK)
&& sSpellMgr->GetSpellInfo(SPELL_WARHEAD_SEEKING_LUMBERSHIP)
&& sSpellMgr->GetSpellInfo(SPELL_WARHEAD_FUSE);
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (!caster)
{
return;
}
caster->CastSpell(caster, SPELL_WARHEAD_Z_CHECK, true);
caster->CastSpell(caster, SPELL_WARHEAD_SEEKING_LUMBERSHIP, true);
caster->CastSpell(caster, SPELL_WARHEAD_FUSE, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_vehicle_warhead_fuse_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_vehicle_warhead_fuse_SpellScript();
}
};
enum WarheadDenonate
{
SPELL_PARACHUTE = 66154,
SPELL_TORPEDO_EXPLOSION = 49290,
NPC_ALLIANCE_LUMBERBOAT_EXPLOSIONS = 27689
};
// 49250 - Detonate
class spell_warhead_detonate : public SpellScriptLoader
{
public:
spell_warhead_detonate() : SpellScriptLoader("spell_warhead_detonate") { }
class spell_warhead_detonate_SpellScript : public SpellScript
{
PrepareSpellScript(spell_warhead_detonate_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) && sSpellMgr->GetSpellInfo(SPELL_TORPEDO_EXPLOSION);
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
Player* player = GetHitPlayer();
if (!player || !caster)
{
return;
}
player->ExitVehicle();
float horizontalSpeed = 3.0f;
float verticalSpeed = 40.0f;
player->KnockbackFrom(caster->GetPositionX(), caster->GetPositionY(), horizontalSpeed, verticalSpeed);
player->RemoveAurasDueToSpell(SPELL_WARHEAD_FUSE);
std::list<Creature*> explosionBunnys;
caster->GetCreatureListWithEntryInGrid(explosionBunnys, NPC_ALLIANCE_LUMBERBOAT_EXPLOSIONS, 90.0f);
for (auto itr = explosionBunnys.begin(); itr != explosionBunnys.end(); ++itr)
{
(*itr)->CastSpell((*itr), SPELL_TORPEDO_EXPLOSION, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_warhead_detonate_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_warhead_detonate_SpellScript();
}
};
// 61678 - Z Check
class spell_z_check : public SpellScriptLoader
{
public:
spell_z_check() : SpellScriptLoader("spell_z_check") { }
class spell_z_check_AuraScript : public AuraScript
{
public:
spell_z_check_AuraScript() : AuraScript(), _posZ(0) {}
PrepareAuraScript(spell_z_check_AuraScript);
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
_posZ = GetTarget()->GetPositionZ();
}
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
if (_posZ != GetTarget()->GetPositionZ())
{
if (Creature* target = GetTarget()->ToCreature())
{
target->AI()->DoAction(0);
}
}
}
private:
float _posZ;
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_z_check_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_z_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_z_check_AuraScript();
}
};
// 49181 - Warhead Fuse
class spell_warhead_fuse : public SpellScriptLoader
{
public:
spell_warhead_fuse() : SpellScriptLoader("spell_warhead_fuse") { }
class spell_warhead_fuse_AuraScript : public AuraScript
{
PrepareAuraScript(spell_warhead_fuse_AuraScript);
void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* rocketUnit = GetTarget()->GetVehicleBase())
{
if (Creature* rocketCrea = rocketUnit->ToCreature())
{
rocketCrea->AI()->DoAction(0);
}
}
}
void Register() override
{
OnEffectRemove += AuraEffectRemoveFn(spell_warhead_fuse_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_warhead_fuse_AuraScript();
}
};
void AddSC_grizzly_hills()
{
// Ours
new npc_riding_the_red_rocket();
// Theirs
new npc_emily();
new npc_mrfloppy();
@@ -959,4 +1169,9 @@ void AddSC_grizzly_hills()
new npc_lake_frog();
new spell_shredder_delivery();
new spell_infected_worgen_bite();
new npc_rocket_propelled_warhead();
new spell_z_check();
new spell_warhead_detonate();
new spell_vehicle_warhead_fuse();
new spell_warhead_fuse();
}