mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
Core/Scripts: Thrusting Hodir's Spear
- Everything is sniffed, enjoy this hell of a quest! Closes #12808
This commit is contained in:
63
sql/updates/world/3.3.5/2017_02_25_00_world.sql
Normal file
63
sql/updates/world/3.3.5/2017_02_25_00_world.sql
Normal file
@@ -0,0 +1,63 @@
|
||||
-- Quest: Thrusting Hodir's Spear - 13003
|
||||
SET @ENTRY := 30275;
|
||||
SET @PATH := @ENTRY * 10;
|
||||
|
||||
UPDATE `creature_template` SET `HoverHeight`=5.2, `unit_flags`=32768, `ScriptName`='npc_wild_wyrm' WHERE `entry`=@ENTRY;
|
||||
|
||||
-- Condition for source Spell implicit target condition type Object entry guid
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry` IN (56673,60863,60713,60810) AND `SourceId`=0;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 56673, 0, 0, 31, 0, 3, 30275, 0, 0, 0, 0, '', 'Spell Fight Wyrm (effect 0) will hit the potential target of the spell if target is unit Wild Wyrm.'),
|
||||
(13, 1, 60863, 0, 0, 31, 0, 3, 30275, 0, 0, 0, 0, '', 'Spell Fight Wyrm (effect 0) will hit the potential target of the spell if target is unit Wild Wyrm.'),
|
||||
(13, 1, 60713, 0, 0, 31, 0, 3, 30275, 0, 0, 0, 0, '', 'Spell Visual: Grab On (effect 0) will hit the potential target of the spell if target is unit Wild Wyrm.'),
|
||||
(13, 1, 60810, 0, 0, 31, 0, 3, 30275, 0, 0, 0, 0, '', 'Spell Visual: Thrust Spear (effect 0) will hit the potential target of the spell if target is unit Wild Wyrm.');
|
||||
|
||||
-- Condition for source Spell condition type Object entry guid
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=56671 AND `SourceId`=0;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(17, 0, 56671, 0, 0, 31, 1, 3, 30275, 0, 0, 0, 0, '', 'Spell Spear of Hodir will hit the explicit target of the spell if target is unit Wild Wyrm.');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_eject_passenger_wild_wyrm','spell_grip','spell_grab_on','spell_thrust_spear','spell_mighty_spear_thrust','spell_low_health_trigger','spell_jaws_of_death_claw_swipe_pct_damage','spell_claw_swipe_check','spell_fatal_strike','spell_falling_dragon_feign_death','spell_player_mount_wyrm');
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(60603, 'spell_eject_passenger_wild_wyrm'),
|
||||
(56689, 'spell_grip'),
|
||||
(60533, 'spell_grab_on'),
|
||||
(56690, 'spell_thrust_spear'),
|
||||
(60586, 'spell_mighty_spear_thrust'),
|
||||
(60596, 'spell_low_health_trigger'),
|
||||
(60864, 'spell_jaws_of_death_claw_swipe_pct_damage'),
|
||||
(60776, 'spell_jaws_of_death_claw_swipe_pct_damage'),
|
||||
(56705, 'spell_claw_swipe_check'),
|
||||
(60587, 'spell_fatal_strike'),
|
||||
(55795, 'spell_falling_dragon_feign_death'),
|
||||
(56672, 'spell_player_mount_wyrm');
|
||||
|
||||
DELETE FROM `spell_custom_attr` WHERE `entry` IN (56690,60586,60776,60881,60864);
|
||||
INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES
|
||||
(56690, 0x8000),
|
||||
(60586, 0x8000),
|
||||
(60776, 0x8000),
|
||||
(60881, 0x8000),
|
||||
(60864, 0x8000);
|
||||
|
||||
DELETE FROM `creature_text` WHERE `entry` =@ENTRY;
|
||||
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
|
||||
(@ENTRY, 0, 0, '%s swipes at you with his claws!', 42, 0, 100, 0, 0, 0, 'Wild Wyrm - SAY_SWIPE', 32763),
|
||||
(@ENTRY, 1, 0, 'DODGED!', 42, 0, 100, 0, 0, 0, 'Wild Wyrm - SAY_DODGED', 32794),
|
||||
(@ENTRY, 2, 0, '%s shrieks in pain and twists around, grabbing you with his mouth!', 42, 0, 100, 0, 0, 0, 'Wild Wyrm - SAY_PHASE_2', 32813),
|
||||
(@ENTRY, 3, 0, 'Your Grip is Failing!', 42, 0, 100, 0, 0, 0, 'Wild Wyrm - SAY_GRIP_WARN', 32784),
|
||||
(@ENTRY, 4, 0, 'FATAL STRIKE MISSED! KEEP PRYING!', 42, 0, 100, 0, 0, 0, 'Wild Wyrm - SAY_STRIKE_MISS', 32795);
|
||||
|
||||
-- Pathing for Wild Wyrm Entry: 30275 'TDB FORMAT'
|
||||
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,7323.32,-2434.555,785.0732,0,0,0,0,100,0), -- 02:32:47
|
||||
(@PATH,2,7323.309,-2434.542,785.0561,0,0,0,0,100,0), -- 02:32:47
|
||||
(@PATH,3,7323.297,-2434.528,785.038,0,0,0,0,100,0), -- 02:32:47
|
||||
(@PATH,4,7335.602,-2376.98,812.4385,0,0,0,0,100,0), -- 02:32:48
|
||||
(@PATH,5,7325.237,-2359.835,825.4155,0,0,0,0,100,0), -- 02:32:51
|
||||
(@PATH,6,7325.253,-2359.815,825.4035,0,0,0,0,100,0), -- 02:32:51
|
||||
(@PATH,7,7238.397,-2307.871,926.4048,0,0,0,0,100,0), -- 02:32:52
|
||||
(@PATH,8,7441.65,-1691.336,1315.965,0,0,0,0,100,0), -- 02:33:52
|
||||
(@PATH,9,7441.65,-1691.336,1315.965,0,0,0,0,100,0), -- 02:33:56
|
||||
(@PATH,10,7441.65,-1691.336,1315.965,4.5961,0,0,0,100,0); -- 02:33:59
|
||||
@@ -2816,6 +2816,13 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);
|
||||
spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo();
|
||||
break;
|
||||
case 56690: // Thrust Spear
|
||||
case 60586: // Mighty Spear Thrust
|
||||
case 60776: // Claw Swipe
|
||||
case 60881: // Fatal Strike
|
||||
case 60864: // Jaws of Death
|
||||
spellInfo->AttributesEx4 |= SPELL_ATTR4_FIXED_DAMAGE;
|
||||
break;
|
||||
case 31344: // Howl of Azgalor
|
||||
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yards instead of 50000?!
|
||||
break;
|
||||
|
||||
@@ -604,6 +604,311 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/*#####
|
||||
# Quest 13003 Thrusting Hodir's Spear
|
||||
#####*/
|
||||
|
||||
enum WildWyrm
|
||||
{
|
||||
PATH_WILD_WYRM = 30275 * 10,
|
||||
|
||||
// Phase 1
|
||||
SPELL_PLAYER_MOUNT_WYRM = 56672,
|
||||
SPELL_FIGHT_WYRM = 56673,
|
||||
SPELL_SPEAR_OF_HODIR = 56671,
|
||||
SPELL_GRIP = 56689,
|
||||
SPELL_GRAB_ON = 60533,
|
||||
SPELL_DODGE_CLAWS = 56704,
|
||||
SPELL_THRUST_SPEAR = 56690,
|
||||
SPELL_MIGHTY_SPEAR_THRUST = 60586,
|
||||
SPELL_CLAW_SWIPE_PERIODIC = 60689,
|
||||
SPELL_CLAW_SWIPE_DAMAGE = 60776,
|
||||
SPELL_FULL_HEAL_MANA = 32432,
|
||||
SPELL_LOW_HEALTH_TRIGGER = 60596,
|
||||
|
||||
// Phase 2
|
||||
SPELL_EJECT_PASSENGER_1 = 60603,
|
||||
SPELL_PRY_JAWS_OPEN = 56706,
|
||||
SPELL_FATAL_STRIKE = 60587,
|
||||
SPELL_FATAL_STRIKE_DAMAGE = 60881,
|
||||
SPELL_JAWS_OF_DEATH_PERIODIC = 56692,
|
||||
SPELL_FLY_STATE_VISUAL = 60865,
|
||||
|
||||
// Dead phase
|
||||
SPELL_WYRM_KILL_CREDIT = 56703,
|
||||
SPELL_FALLING_DRAGON_FEIGN_DEATH = 55795,
|
||||
SPELL_EJECT_ALL_PASSENGERS = 50630,
|
||||
|
||||
SAY_SWIPE = 0,
|
||||
SAY_DODGED = 1,
|
||||
SAY_PHASE_2 = 2,
|
||||
SAY_GRIP_WARN = 3,
|
||||
SAY_STRIKE_MISS = 4,
|
||||
|
||||
ACTION_CLAW_SWIPE_WARN = 1,
|
||||
ACTION_CLAW_SWIPE_DODGE = 2,
|
||||
ACTION_GRIP_FAILING = 3,
|
||||
ACTION_GRIP_LOST = 4,
|
||||
ACTION_FATAL_STRIKE_MISS = 5,
|
||||
|
||||
POINT_START_FIGHT = 1,
|
||||
POINT_FALL = 2,
|
||||
|
||||
SEAT_INITIAL = 0,
|
||||
SEAT_MOUTH = 1,
|
||||
|
||||
PHASE_INITIAL = 0,
|
||||
PHASE_MOUTH = 1,
|
||||
PHASE_DEAD = 2,
|
||||
PHASE_MAX = 3
|
||||
};
|
||||
|
||||
uint8 const ControllableSpellsCount = 4;
|
||||
uint32 const WyrmControlSpells[PHASE_MAX][ControllableSpellsCount] =
|
||||
{
|
||||
{ SPELL_GRAB_ON, SPELL_DODGE_CLAWS, SPELL_THRUST_SPEAR, SPELL_MIGHTY_SPEAR_THRUST },
|
||||
{ SPELL_PRY_JAWS_OPEN, 0, SPELL_FATAL_STRIKE, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
class npc_wild_wyrm : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_wild_wyrm() : CreatureScript("npc_wild_wyrm") { }
|
||||
|
||||
struct npc_wild_wyrmAI : public VehicleAI
|
||||
{
|
||||
npc_wild_wyrmAI(Creature* creature) : VehicleAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_phase = PHASE_INITIAL;
|
||||
_playerCheckTimer = 1 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
void InitSpellsForPhase()
|
||||
{
|
||||
ASSERT(_phase < PHASE_MAX);
|
||||
for (uint8 i = 0; i < ControllableSpellsCount; ++i)
|
||||
me->m_spells[i] = WyrmControlSpells[_phase][i];
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
_playerGuid.Clear();
|
||||
_scheduler.CancelAll();
|
||||
|
||||
InitSpellsForPhase();
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid);
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_CLAW_SWIPE_WARN:
|
||||
Talk(SAY_SWIPE, player);
|
||||
break;
|
||||
case ACTION_CLAW_SWIPE_DODGE:
|
||||
Talk(SAY_DODGED, player);
|
||||
break;
|
||||
case ACTION_GRIP_FAILING:
|
||||
Talk(SAY_GRIP_WARN, player);
|
||||
break;
|
||||
case ACTION_GRIP_LOST:
|
||||
DoCastAOE(SPELL_EJECT_PASSENGER_1, true);
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
case ACTION_FATAL_STRIKE_MISS:
|
||||
Talk(SAY_STRIKE_MISS, player);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (_playerGuid || spellInfo->Id != SPELL_SPEAR_OF_HODIR)
|
||||
return;
|
||||
|
||||
_playerGuid = caster->GetGUID();
|
||||
DoCastAOE(SPELL_FULL_HEAL_MANA, true);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
|
||||
me->GetMotionMaster()->MovePoint(POINT_START_FIGHT, *caster);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
switch (id)
|
||||
{
|
||||
case POINT_START_FIGHT:
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid);
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
DoCast(player, SPELL_PLAYER_MOUNT_WYRM);
|
||||
me->GetMotionMaster()->Clear();
|
||||
break;
|
||||
}
|
||||
case POINT_FALL:
|
||||
DoCastAOE(SPELL_EJECT_ALL_PASSENGERS);
|
||||
me->KillSelf();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (damage >= me->GetHealth())
|
||||
{
|
||||
damage = me->GetHealth() - 1;
|
||||
|
||||
if (_phase == PHASE_DEAD)
|
||||
return;
|
||||
|
||||
_phase = PHASE_DEAD;
|
||||
_scheduler.CancelAll()
|
||||
.Async([this]
|
||||
{
|
||||
InitSpellsForPhase();
|
||||
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid))
|
||||
player->VehicleSpellInitialize();
|
||||
|
||||
DoCastAOE(SPELL_WYRM_KILL_CREDIT);
|
||||
DoCastAOE(SPELL_FALLING_DRAGON_FEIGN_DEATH);
|
||||
|
||||
me->RemoveAurasDueToSpell(SPELL_JAWS_OF_DEATH_PERIODIC);
|
||||
me->RemoveAurasDueToSpell(SPELL_PRY_JAWS_OPEN);
|
||||
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->SetUInt32Value(UNIT_NPC_FLAGS, 0);
|
||||
|
||||
me->GetMotionMaster()->MoveFall(POINT_FALL);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override
|
||||
{
|
||||
if (!apply || passenger->GetGUID() != _playerGuid)
|
||||
return;
|
||||
|
||||
if (seatId != SEAT_INITIAL)
|
||||
return;
|
||||
|
||||
me->CastCustomSpell(SPELL_GRIP, SPELLVALUE_AURA_STACK, 50);
|
||||
DoCastAOE(SPELL_CLAW_SWIPE_PERIODIC);
|
||||
|
||||
_scheduler.Async([this]
|
||||
{
|
||||
me->GetMotionMaster()->MovePath(PATH_WILD_WYRM, true);
|
||||
})
|
||||
.Schedule(Milliseconds(500), [this](TaskContext context)
|
||||
{
|
||||
if (_phase == PHASE_MOUTH)
|
||||
return;
|
||||
|
||||
if (me->HealthBelowPct(25))
|
||||
{
|
||||
_phase = PHASE_MOUTH;
|
||||
context.Async([this]
|
||||
{
|
||||
InitSpellsForPhase();
|
||||
DoCastAOE(SPELL_LOW_HEALTH_TRIGGER, true);
|
||||
me->RemoveAurasDueToSpell(SPELL_CLAW_SWIPE_PERIODIC);
|
||||
me->RemoveAurasDueToSpell(SPELL_GRIP);
|
||||
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid))
|
||||
Talk(SAY_PHASE_2, player);
|
||||
|
||||
DoCastAOE(SPELL_EJECT_PASSENGER_1, true);
|
||||
DoCastAOE(SPELL_JAWS_OF_DEATH_PERIODIC);
|
||||
DoCastAOE(SPELL_FLY_STATE_VISUAL);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
context.Repeat();
|
||||
});
|
||||
}
|
||||
|
||||
bool EvadeCheck() const
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid);
|
||||
if (!player)
|
||||
return false;
|
||||
|
||||
switch (_phase)
|
||||
{
|
||||
case PHASE_INITIAL:
|
||||
case PHASE_MOUTH:
|
||||
if (!player->IsAlive())
|
||||
return false;
|
||||
break;
|
||||
case PHASE_DEAD:
|
||||
break;
|
||||
default:
|
||||
ABORT();
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!_playerGuid)
|
||||
{
|
||||
if (UpdateVictim())
|
||||
DoMeleeAttackIfReady();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_playerCheckTimer <= diff)
|
||||
{
|
||||
if (!EvadeCheck())
|
||||
EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
|
||||
|
||||
_playerCheckTimer = 1 * IN_MILLISECONDS;
|
||||
}
|
||||
else
|
||||
_playerCheckTimer -= diff;
|
||||
|
||||
_scheduler.Update(diff);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _phase;
|
||||
uint32 _playerCheckTimer;
|
||||
ObjectGuid _playerGuid;
|
||||
TaskScheduler _scheduler;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_wild_wyrmAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*#####
|
||||
# Quest 13010 Krolmir, Hammer of Storms
|
||||
#####*/
|
||||
@@ -629,7 +934,6 @@ enum JokkumScriptcast
|
||||
SAY_THORIM_4 = 3,
|
||||
SPELL_JOKKUM_SUMMON = 56541,
|
||||
SPELL_JOKKUM_KILL_CREDIT = 56545,
|
||||
SPELL_EJECT_ALL_PASSENGERS = 50630,
|
||||
SPELL_PLAYER_CAST_VERANUS_SUMMON = 56650,
|
||||
SPELL_SUMMON_VERANUS_AND_THORIM = 56649,
|
||||
EVENT_KROLMIR_1 = 16,
|
||||
@@ -757,6 +1061,388 @@ class spell_close_rift : public SpellScriptLoader
|
||||
}
|
||||
};
|
||||
|
||||
// 60603 - Eject Passenger 1
|
||||
class spell_eject_passenger_wild_wyrm : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_eject_passenger_wild_wyrm() : SpellScriptLoader("spell_eject_passenger_wild_wyrm") { }
|
||||
|
||||
class spell_eject_passenger_wild_wyrm_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_eject_passenger_wild_wyrm_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_FIGHT_WYRM))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetHitUnit()->RemoveAurasDueToSpell(SPELL_FIGHT_WYRM);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_eject_passenger_wild_wyrm_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_eject_passenger_wild_wyrm_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 56689 - Grip
|
||||
class spell_grip : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_grip() : SpellScriptLoader("spell_grip") { }
|
||||
|
||||
class spell_grip_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_grip_AuraScript);
|
||||
|
||||
void DummyTick(AuraEffect const* aurEff)
|
||||
{
|
||||
++_tickNumber;
|
||||
|
||||
// each 15 ticks stack reduction increases by 2 (increases by 1 at each 7th and 15th tick)
|
||||
// except for the first 15 ticks that remove 1 stack each
|
||||
uint32 const period = ((_tickNumber - 1) % 15) + 1;
|
||||
uint32 const sequence = (_tickNumber - 1) / 15;
|
||||
|
||||
uint32 stacksToRemove;
|
||||
if (sequence == 0)
|
||||
stacksToRemove = 1;
|
||||
else
|
||||
{
|
||||
stacksToRemove = sequence * 2;
|
||||
if (period > 7)
|
||||
++stacksToRemove;
|
||||
}
|
||||
|
||||
// while we could do ModStackAmount(-stacksToRemove), this is how it's done in sniffs :)
|
||||
for (uint32 i = 0; i < stacksToRemove; ++i)
|
||||
ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE);
|
||||
|
||||
if (GetStackAmount() < 15 && !_warning)
|
||||
{
|
||||
_warning = true;
|
||||
GetTarget()->GetAI()->DoAction(ACTION_GRIP_FAILING);
|
||||
}
|
||||
else if (GetStackAmount() > 30)
|
||||
_warning = false;
|
||||
}
|
||||
|
||||
void HandleDrop(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
GetTarget()->GetAI()->DoAction(ACTION_GRIP_LOST);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_grip_AuraScript::DummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_grip_AuraScript::HandleDrop, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
|
||||
// tick number in the AuraEffect gets reset each time we stack the aura, so keep track of it locally
|
||||
uint32 _tickNumber = 0;
|
||||
|
||||
bool _warning = false;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_grip_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 60533 - Grab On
|
||||
class spell_grab_on : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_grab_on() : SpellScriptLoader("spell_grab_on") { }
|
||||
|
||||
class spell_grab_on_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_grab_on_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP, GetCaster()->GetGUID()))
|
||||
grip->ModStackAmount(GetEffectValue(), AURA_REMOVE_BY_DEFAULT, false);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_grab_on_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_grab_on_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 56690 - Thrust Spear
|
||||
// 60586 - Mighty Spear Thrust
|
||||
template <int8 StacksToLose>
|
||||
class spell_loosen_grip : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_loosen_grip(char const* ScriptName) : SpellScriptLoader(ScriptName) { }
|
||||
|
||||
template <int8 StacksLost>
|
||||
class spell_loosen_grip_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_loosen_grip_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP))
|
||||
grip->ModStackAmount(-StacksLost, AURA_REMOVE_BY_EXPIRE);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_loosen_grip_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_loosen_grip_SpellScript<StacksToLose>();
|
||||
}
|
||||
};
|
||||
|
||||
// 60596 - Low Health Trigger
|
||||
class spell_low_health_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_low_health_trigger() : SpellScriptLoader("spell_low_health_trigger") { }
|
||||
|
||||
class spell_low_health_trigger_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_low_health_trigger_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetHitUnit()->CastSpell((Unit*)nullptr, GetEffectValue(), true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_low_health_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_low_health_trigger_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 60776 - Claw Swipe
|
||||
// 60864 - Jaws of Death
|
||||
class spell_jaws_of_death_claw_swipe_pct_damage : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_jaws_of_death_claw_swipe_pct_damage() : SpellScriptLoader("spell_jaws_of_death_claw_swipe_pct_damage") { }
|
||||
|
||||
class spell_jaws_of_death_claw_swipe_pct_damage_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_jaws_of_death_claw_swipe_pct_damage_SpellScript);
|
||||
|
||||
void HandleDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
SetEffectValue(static_cast<int32>(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue())));
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectLaunchTarget += SpellEffectFn(spell_jaws_of_death_claw_swipe_pct_damage_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_jaws_of_death_claw_swipe_pct_damage_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 56705 - Claw Swipe
|
||||
class spell_claw_swipe_check : public SpellScriptLoader
|
||||
{
|
||||
public: spell_claw_swipe_check() : SpellScriptLoader("spell_claw_swipe_check") { }
|
||||
|
||||
class spell_claw_swipe_check_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_claw_swipe_check_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_WARN);
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Vehicle* vehicle = GetTarget()->GetVehicleKit())
|
||||
{
|
||||
if (Unit* player = vehicle->GetPassenger(SEAT_INITIAL))
|
||||
{
|
||||
if (player->HasAura(SPELL_DODGE_CLAWS))
|
||||
{
|
||||
GetTarget()->GetAI()->DoAction(ACTION_CLAW_SWIPE_DODGE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GetTarget()->CastSpell((Unit*)nullptr, aurEff->GetAmount(), false);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_claw_swipe_check_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectApplyFn(spell_claw_swipe_check_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_claw_swipe_check_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 60587 - Fatal Strike
|
||||
class spell_fatal_strike : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_fatal_strike() : SpellScriptLoader("spell_fatal_strike") { }
|
||||
|
||||
class spell_fatal_strike_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_fatal_strike_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_FATAL_STRIKE_DAMAGE))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
int32 chance = 0;
|
||||
if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_PRY_JAWS_OPEN, EFFECT_0))
|
||||
chance = aurEff->GetAmount();
|
||||
|
||||
if (!roll_chance_i(chance))
|
||||
{
|
||||
GetCaster()->GetAI()->DoAction(ACTION_FATAL_STRIKE_MISS);
|
||||
return;
|
||||
}
|
||||
|
||||
GetCaster()->CastSpell((Unit*)nullptr, SPELL_FATAL_STRIKE_DAMAGE, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_fatal_strike_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_fatal_strike_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 55795 - Falling Dragon Feign Death
|
||||
class spell_falling_dragon_feign_death : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_falling_dragon_feign_death() : SpellScriptLoader("spell_falling_dragon_feign_death") { }
|
||||
|
||||
class spell_falling_dragon_feign_death_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_falling_dragon_feign_death_AuraScript);
|
||||
|
||||
void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
GetTarget()->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
}
|
||||
|
||||
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_falling_dragon_feign_death_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectApplyFn(spell_falling_dragon_feign_death_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_falling_dragon_feign_death_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 56672 - Player Mount Wyrm
|
||||
class spell_player_mount_wyrm : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_player_mount_wyrm() : SpellScriptLoader("spell_player_mount_wyrm") { }
|
||||
|
||||
class spell_player_mount_wyrm_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_player_mount_wyrm_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_FIGHT_WYRM))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleDummy(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->CastSpell((Unit*)nullptr, SPELL_FIGHT_WYRM, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectRemove += AuraEffectApplyFn(spell_player_mount_wyrm_AuraScript::HandleDummy, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_player_mount_wyrm_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_storm_peaks()
|
||||
{
|
||||
new npc_injured_goblin();
|
||||
@@ -766,7 +1452,20 @@ void AddSC_storm_peaks()
|
||||
new npc_icefang();
|
||||
new npc_hyldsmeet_protodrake();
|
||||
new npc_brann_bronzebeard_keystone();
|
||||
new npc_wild_wyrm();
|
||||
|
||||
new spell_jokkum_scriptcast();
|
||||
new spell_veranus_summon();
|
||||
new spell_close_rift();
|
||||
new spell_eject_passenger_wild_wyrm();
|
||||
new spell_grip();
|
||||
new spell_grab_on();
|
||||
new spell_loosen_grip<5>("spell_thrust_spear");
|
||||
new spell_loosen_grip<15>("spell_mighty_spear_thrust");
|
||||
new spell_low_health_trigger();
|
||||
new spell_jaws_of_death_claw_swipe_pct_damage();
|
||||
new spell_claw_swipe_check();
|
||||
new spell_fatal_strike();
|
||||
new spell_falling_dragon_feign_death();
|
||||
new spell_player_mount_wyrm();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user