Files
2025-10-13 13:23:31 -04:00

1792 lines
59 KiB
C#

// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the Gnu General Public License. See License file in the project root for full license information.
using Framework.Constants;
using Framework.Dynamic;
using Game.AI;
using Game.Entities;
using Game.Movement;
using Game.Scripting;
using Game.Spells;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Scripts.Spells.Quest;
struct SpellIds
{
// ThaumaturgyChannel
public const uint ThaumaturgyChannel = 21029;
// Quest11396_11399Data
public const uint ForceShieldArcanePurpleX3 = 43874;
public const uint ScourgingCrystalController = 43878;
// Quest11730Data
public const uint SummonScavengebot004A8 = 46063;
public const uint SummonSentrybot57K = 46068;
public const uint SummonDefendotank66D = 46058;
public const uint SummonScavengebot005B6 = 46066;
public const uint Summon55DCollectatron = 46034;
public const uint RobotKillCredit = 46027;
// Quest12634Data
public const uint BananasFallToGround = 51836;
public const uint OrangeFallsToGround = 51837;
public const uint PapayaFallsToGround = 51839;
public const uint SummonAdventurousDwarf = 52070;
// Quest12851Data
public const uint FrostgiantCredit = 58184;
public const uint FrostworgCredit = 58183;
public const uint Immolation = 54690;
public const uint Ablaze = 54683;
// BattleStandard
public const uint PlantHordeBattleStandard = 59643;
public const uint HordeBattleStandardState = 59642;
public const uint AllianceBattleStandardState = 4339;
public const uint JumpRocketBlast = 4340;
// FocusOnTheBeach
public const uint BunnyCreditBeam = 47390;
// DefendingWyrmrestTemple
public const uint SummonWyrmrestDefender = 49207;
// Quest11010_11102_11023Data
public const uint FlakCannonTrigger = 40110;
public const uint ChooseLoc = 40056;
public const uint AggroCheck = 40112;
// SpellZuldrakRat
public const uint SummonGorgedLurkingBasilisk = 50928;
// QuenchingMist
public const uint FlickeringFlames = 53504;
// Quest13291_13292_13239_13261Data
public const uint Ride = 59319;
// BurstAtTheSeams
public const uint BloatedAbominationFeignDeath = 52593;
public const uint BurstAtTheSeamsBone = 52516;
public const uint ExplodeAbominationMeat = 52520;
public const uint ExplodeAbominationBloodyMeat = 52523;
public const uint TrollExplosion = 52565;
public const uint ExplodeTrollMeat = 52578;
public const uint ExplodeTrollBloodyMeat = 52580;
public const uint BurstAtTheSeams59576 = 59576; //script/knockback; That's Abominable
public const uint BurstAtTheSeams59579 = 59579; //dummy
public const uint BurstAtTheSeams52510 = 52510; //script/knockback; Fuel for the Fire
public const uint BurstAtTheSeams52508 = 52508; //damage 20000
public const uint BurstAtTheSeams59580 = 59580; //damage 50000
public const uint AssignGhoulKillCreditToMaster = 59590;
public const uint AssignGeistKillCreditToMaster = 60041;
public const uint AssignSkeletonKillCreditToMaster = 60039;
public const uint DrakkariSkullcrusherCredit = 52590;
public const uint SummonDrakkariChieftain = 52616;
public const uint DrakkariChieftainkKillCredit = 52620;
// EscapeFromSilverbrook
public const uint SummonWorgen = 48681;
// DeathComesFromOnHigh
public const uint ForgeCredit = 51974;
public const uint TownHallCredit = 51977;
public const uint ScarletHoldCredit = 51980;
public const uint ChapelCredit = 51982;
// QuestTheStormKing
public const uint RideGymer = 43671;
public const uint Grabbed = 55424;
// QuestTheStormKingThrow
public const uint VargulExplosion = 55569;
// QuestTheHunterAndThePrince
public const uint IllidanKillCredit = 61748;
// RelicOfTheEarthenRing
public const uint TotemOfTheEarthenRing = 66747;
// Fumping
public const uint SummonSandGnome = 39240;
public const uint SummonBoneSlicer = 39241;
// FearNoEvil
public const uint RenewedLife = 93097;
// ApplyHeatAndStir
public const uint SpurtsAndSmoke = 38594;
public const uint ErrorMix1 = 43376;
public const uint ErrorMix2 = 43378;
public const uint ErrorMix3 = 43970;
public const uint SuccessfulMix = 43377;
// TamingTheBeast
public const uint TameIceClawBear = 19548;
public const uint TameLargeCragBoar = 19674;
public const uint TameSnowLeopard = 19687;
public const uint TameAdultPlainstrider = 19688;
public const uint TamePrairieStalker = 19689;
public const uint TameSwoop = 19692;
public const uint TameWebwoodLurker = 19693;
public const uint TameDireMottledBoar = 19694;
public const uint TameSurfCrawler = 19696;
public const uint TameArmoredScorpid = 19697;
public const uint TameNightsaberStalker = 19699;
public const uint TameStrigidScreecher = 19700;
public const uint TameBarbedCrawler = 30646;
public const uint TameGreaterTimberstrider = 30653;
public const uint TameNightstalker = 30654;
public const uint TameCrazedDragonhawk = 30099;
public const uint TameElderSpringpaw = 30102;
public const uint TameMistbat = 30105;
public const uint TameIceClawBear1 = 19597;
public const uint TameLargeCragBoar1 = 19677;
public const uint TameSnowLeopard1 = 19676;
public const uint TameAdultPlainstrider1 = 19678;
public const uint TamePrairieStalker1 = 19679;
public const uint TameSwoop1 = 19680;
public const uint TameWebwoodLurker1 = 19684;
public const uint TameDireMottledBoar1 = 19681;
public const uint TameSurfCrawler1 = 19682;
public const uint TameArmoredScorpid1 = 19683;
public const uint TameNightsaberStalker1 = 19685;
public const uint TameStrigidScreecher1 = 19686;
public const uint TameBarbedCrawler1 = 30647;
public const uint TameGreaterTimberstrider1 = 30648;
public const uint TameNightstalker1 = 30652;
public const uint TameCrazedDragonhawk1 = 30100;
public const uint TameElderSpringpaw1 = 30103;
public const uint TameMistbat1 = 30104;
// TributeSpells
public const uint GromsTrollTribute = 24101;
public const uint GromsTaurenTribute = 24102;
public const uint GromsUndeadTribute = 24103;
public const uint GromsOrcTribute = 24104;
public const uint GromsBloodelfTribute = 69530;
public const uint UthersHumanTribute = 24105;
public const uint UthersGnomeTribute = 24106;
public const uint UthersDwarfTribute = 24107;
public const uint UthersNightelfTribute = 24108;
public const uint UthersDraeneiTribute = 69533;
}
struct CreatureIds
{
// Quest55Data
public const uint Morbent = 1200;
public const uint WeakenedMorbent = 24782;
// Quests6124_6129Data
public const uint SicklyGazelle = 12296;
public const uint CuredGazelle = 12297;
public const uint SicklyDeer = 12298;
public const uint CuredDeer = 12299;
// Quest10255Data
public const uint Helboar = 16880;
public const uint Dreadtusk = 16992;
// Quest11515Data
public const uint FelbloodInitiate = 24918;
public const uint EmaciatedFelblood = 24955;
// Quest11730Data
public const uint Scavengebot004A8 = 25752;
public const uint Sentrybot57K = 25753;
public const uint Defendotank66D = 25758;
public const uint Scavengebot005B6 = 25792;
public const uint Collectatron55D = 25793;
// Quest12459Data
public const uint ReanimatedFrostwyrm = 26841;
public const uint WeakReanimatedFrostwyrm = 27821;
public const uint Turgid = 27808;
public const uint WeakTurgid = 27809;
public const uint Deathgaze = 27122;
public const uint WeakDeathgaze = 27807;
// Quest12851Data
public const uint Frostgiant = 29351;
public const uint Frostworg = 29358;
// Quest12659Data
public const uint ScalpsKcBunny = 28622;
// SalvagingLifesStength
public const uint ShardKillCredit = 29303;
// BattleStandard
public const uint KingOfTheMountaintKc = 31766;
// Quest12372Data
public const uint WyrmrestTempleCredit = 27698;
// Quest11010_11102_11023Data
public const uint FelCannon2 = 23082;
// Quest13291_13292_13239_13261Data
public const uint Skytalon = 31583;
public const uint Decoy = 31578;
// BurstAtTheSeams
public const uint DrakkariChieftaink = 29099;
public const uint IcyGhoul = 31142;
public const uint ViciousGeist = 31147;
public const uint RisenAllianceSoldiers = 31205;
public const uint RenimatedAbomination = 31692;
// DeathComesFromOnHigh
public const uint NewAvalonForge = 28525;
public const uint NewAvalonTownHall = 28543;
public const uint ScarletHold = 28542;
public const uint ChapelOfTheCrimsonFlame = 28544;
// FearNoEvil
public const uint InjuredStormwindInfantry = 50047;
// CallAttackMastiffs
public const uint AttackMastiff = 36405;
}
struct MiscConst
{
// BurstAtTheSeams
public const uint AreaTheBrokenFront = 4507;
public const uint AreaMordRetharTheDeathGate = 4508;
public const uint QuestFuelForTheFire = 12690;
// Recall_Eye_of_Acherus
public const uint TheEyeOfAcherus = 51852;
// ApplyHeatAndStir
public const uint CreatureGenericTriggerLab = 24042;
public const uint Talk0 = 0;
public const uint Talk1 = 1;
}
[Script("spell_q55_sacred_cleansing", SpellEffectName.Dummy, 1, CreatureIds.Morbent, CreatureIds.WeakenedMorbent, true)] // 8913 - Sacred Cleansing
[Script("spell_q10255_administer_antidote", SpellEffectName.Dummy, 0, CreatureIds.Helboar, CreatureIds.Dreadtusk, true)] // 34665 - Administer Antidote
[Script("spell_q11515_fel_siphon_dummy", SpellEffectName.Dummy, 0, CreatureIds.FelbloodInitiate, CreatureIds.EmaciatedFelblood, true)] // 44936 - Quest - Fel Siphon Dummy
class spell_generic_quest_update_entry : SpellScript
{
SpellEffectName _spellEffect;
uint _effIndex;
uint _originalEntry;
uint _newEntry;
bool _shouldAttack;
TimeSpan _despawnTime;
public spell_generic_quest_update_entry(SpellEffectName spellEffect, uint effIndex, uint originalEntry, uint newEntry, bool shouldAttack, TimeSpan despawnTime)
{
_spellEffect = spellEffect;
_effIndex = effIndex;
_originalEntry = originalEntry;
_newEntry = newEntry;
_shouldAttack = shouldAttack;
_despawnTime = despawnTime;
}
public spell_generic_quest_update_entry(SpellEffectName spellEffect, uint effIndex, uint originalEntry, uint newEntry, bool shouldAttack)
{
_spellEffect = spellEffect;
_effIndex = effIndex;
_originalEntry = originalEntry;
_newEntry = newEntry;
_shouldAttack = shouldAttack;
_despawnTime = TimeSpan.Zero;
}
void HandleDummy(uint effIndex)
{
Creature creatureTarget = GetHitCreature();
if (creatureTarget != null && !creatureTarget.IsPet() && creatureTarget.GetEntry() == _originalEntry)
{
creatureTarget.UpdateEntry(_newEntry);
if (_shouldAttack)
creatureTarget.EngageWithTarget(GetCaster());
if (_despawnTime != TimeSpan.FromSeconds(0))
creatureTarget.DespawnOrUnsummon(_despawnTime);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, _effIndex, _spellEffect));
}
}
[Script] // 9712 - Thaumaturgy Channel
class spell_q2203_thaumaturgy_channel : AuraScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.ThaumaturgyChannel);
}
void HandleEffectPeriodic(AuraEffect aurEff)
{
PreventDefaultAction();
Unit caster = GetCaster();
if (caster != null)
caster.CastSpell(caster, SpellIds.ThaumaturgyChannel, false);
}
public override void Register()
{
OnEffectPeriodic.Add(new(HandleEffectPeriodic, 0, AuraType.PeriodicTriggerSpell));
}
}
[Script] // 19512 - Apply Salve
class spell_q6124_6129_apply_salve : SpellScript
{
TimeSpan despawnTime = TimeSpan.FromSeconds(30);
public override bool Load()
{
return GetCaster().IsPlayer();
}
void HandleDummy(uint effIndex)
{
Player caster = GetCaster().ToPlayer();
if (GetCastItem() != null)
{
Creature creatureTarget = GetHitCreature();
if (creatureTarget != null)
{
uint newEntry = 0;
switch (caster.GetTeam())
{
case Team.Horde:
if (creatureTarget.GetEntry() == CreatureIds.SicklyGazelle)
newEntry = CreatureIds.CuredGazelle;
break;
case Team.Alliance:
if (creatureTarget.GetEntry() == CreatureIds.SicklyDeer)
newEntry = CreatureIds.CuredDeer;
break;
default:
break;
}
if (newEntry != 0)
{
creatureTarget.UpdateEntry(newEntry);
creatureTarget.DespawnOrUnsummon(despawnTime);
caster.KilledMonsterCredit(newEntry);
}
}
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 43874 - Scourge Mur'gul Camp: Force Shield Arcane Purple x3
class spell_q11396_11399_force_shield_arcane_purple_x3 : AuraScript
{
void HandleEffectApply(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit target = GetTarget();
target.SetImmuneToPC(true);
target.AddUnitState(UnitState.Root);
}
void HandleEffectRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
{
GetTarget().SetImmuneToPC(false);
}
public override void Register()
{
OnEffectApply.Add(new(HandleEffectApply, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
OnEffectRemove.Add(new(HandleEffectRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
}
}
[Script] // 50133 - Scourging Crystal Controller
class spell_q11396_11399_scourging_crystal_controller : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.ForceShieldArcanePurpleX3, SpellIds.ScourgingCrystalController);
}
void HandleDummy(uint effIndex)
{
Unit target = GetHitUnit();
if (target != null)
if (target.IsUnit() && target.HasAura(SpellIds.ForceShieldArcanePurpleX3))
// Make sure nobody else is channeling the same target
if (!target.HasAura(SpellIds.ScourgingCrystalController))
GetCaster().CastSpell(target, SpellIds.ScourgingCrystalController, GetCastItem());
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 43882 - Scourging Crystal Controller Dummy
class spell_q11396_11399_scourging_crystal_controller_dummy : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.ForceShieldArcanePurpleX3);
}
void HandleDummy(uint effIndex)
{
Unit target = GetHitUnit();
if (target != null)
if (target.IsUnit())
target.RemoveAurasDueToSpell(SpellIds.ForceShieldArcanePurpleX3);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 46023 - The Ultrasonic Screwdriver
class spell_q11730_ultrasonic_screwdriver : SpellScript
{
public override bool Load()
{
return GetCaster().IsPlayer() && GetCastItem() != null;
}
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.SummonScavengebot004A8, SpellIds.SummonSentrybot57K, SpellIds.SummonDefendotank66D, SpellIds.SummonScavengebot005B6, SpellIds.Summon55DCollectatron, SpellIds.RobotKillCredit);
}
void HandleDummy(uint effIndex)
{
Item castItem = GetCastItem();
Unit caster = GetCaster();
Creature target = GetHitCreature();
if (target != null)
{
uint spellId = 0;
switch (target.GetEntry())
{
case CreatureIds.Scavengebot004A8: spellId = SpellIds.SummonScavengebot004A8; break;
case CreatureIds.Sentrybot57K: spellId = SpellIds.SummonSentrybot57K; break;
case CreatureIds.Defendotank66D: spellId = SpellIds.SummonDefendotank66D; break;
case CreatureIds.Scavengebot005B6: spellId = SpellIds.SummonScavengebot005B6; break;
case CreatureIds.Collectatron55D: spellId = SpellIds.Summon55DCollectatron; break;
default:
return;
}
caster.CastSpell(caster, spellId, castItem);
caster.CastSpell(caster, SpellIds.RobotKillCredit, true);
target.DespawnOrUnsummon();
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 49587 - Seeds of Nature's Wrath
class spell_q12459_seeds_of_natures_wrath : SpellScript
{
void HandleDummy(uint effIndex)
{
Creature creatureTarget = GetHitCreature();
if (creatureTarget != null)
{
uint uiNewEntry = 0;
switch (creatureTarget.GetEntry())
{
case CreatureIds.ReanimatedFrostwyrm:
uiNewEntry = CreatureIds.WeakReanimatedFrostwyrm;
break;
case CreatureIds.Turgid:
uiNewEntry = CreatureIds.WeakTurgid;
break;
case CreatureIds.Deathgaze:
uiNewEntry = CreatureIds.WeakDeathgaze;
break;
}
if (uiNewEntry != 0)
creatureTarget.UpdateEntry(uiNewEntry);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 51840 - Despawn Fruit Tosser
class spell_q12634_despawn_fruit_tosser : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.BananasFallToGround, SpellIds.OrangeFallsToGround, SpellIds.PapayaFallsToGround, SpellIds.SummonAdventurousDwarf);
}
void HandleDummy(uint effIndex)
{
uint spellId = SpellIds.BananasFallToGround;
switch (RandomHelper.URand(0, 3))
{
case 1: spellId = SpellIds.OrangeFallsToGround; break;
case 2: spellId = SpellIds.PapayaFallsToGround; break;
}
// sometimes, if you're lucky, you get a dwarf
if (RandomHelper.randChance(5))
spellId = SpellIds.SummonAdventurousDwarf;
GetCaster().CastSpell(GetCaster(), spellId, true);
}
public override void Register()
{
OnEffectHit.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 54798 - Flaming Arrow Triggered Effect
class spell_q12851_going_bearback : AuraScript
{
void HandleEffectApply(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit caster = GetCaster();
if (caster != null)
{
Unit target = GetTarget();
// Already in fire
if (target.HasAura(SpellIds.Ablaze))
return;
Player player = caster.GetCharmerOrOwnerPlayerOrPlayerItself();
if (player != null)
{
switch (target.GetEntry())
{
case CreatureIds.Frostworg:
target.CastSpell(player, SpellIds.FrostworgCredit, true);
target.CastSpell(target, SpellIds.Immolation, true);
target.CastSpell(target, SpellIds.Ablaze, true);
break;
case CreatureIds.Frostgiant:
target.CastSpell(player, SpellIds.FrostgiantCredit, true);
target.CastSpell(target, SpellIds.Immolation, true);
target.CastSpell(target, SpellIds.Ablaze, true);
break;
}
}
}
}
public override void Register()
{
AfterEffectApply.Add(new(HandleEffectApply, 0, AuraType.PeriodicDummy, AuraEffectHandleModes.RealOrReapplyMask));
}
}
[Script] // 52090 - Ahunae's Knife
class spell_q12659_ahunaes_knife : SpellScript
{
public override bool Load()
{
return GetCaster().IsPlayer();
}
void HandleDummy(uint effIndex)
{
Player caster = GetCaster().ToPlayer();
Creature target = GetHitCreature();
if (target != null)
{
target.DespawnOrUnsummon();
caster.KilledMonsterCredit(CreatureIds.ScalpsKcBunny);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 54190 - Lifeblood Dummy
class spell_q12805_lifeblood_dummy : SpellScript
{
public override bool Load()
{
return GetCaster().IsPlayer();
}
void HandleScript(uint effIndex)
{
Player caster = GetCaster().ToPlayer();
Creature target = GetHitCreature();
if (target != null)
{
caster.KilledMonsterCredit(CreatureIds.ShardKillCredit);
target.CastSpell(target, (uint)GetEffectValue(), true);
target.DespawnOrUnsummon(TimeSpan.FromSeconds(2));
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
// 4338 - Plant Alliance Battle Standard
[Script] // 59643 - Plant Horde Battle Standard
class spell_q13280_13283_plant_battle_standard : SpellScript
{
void HandleDummy(uint effIndex)
{
Unit caster = GetCaster();
Unit target = GetHitUnit();
uint triggeredSpellId = SpellIds.AllianceBattleStandardState;
caster.HandleEmoteCommand(Emote.OneshotRoar);
if (caster.IsVehicle())
{
Unit player = caster.GetVehicleKit().GetPassenger(0);
if (player != null)
player.ToPlayer().KilledMonsterCredit(CreatureIds.KingOfTheMountaintKc);
}
if (GetSpellInfo().Id == SpellIds.PlantHordeBattleStandard)
triggeredSpellId = SpellIds.HordeBattleStandardState;
target.RemoveAllAuras();
target.CastSpell(target, triggeredSpellId, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 4336 - Jump Jets
class spell_q13280_13283_jump_jets : SpellScript
{
void HandleCast()
{
Unit caster = GetCaster();
if (caster.IsVehicle())
{
Unit rocketBunny = caster.GetVehicleKit().GetPassenger(1);
if (rocketBunny != null)
rocketBunny.CastSpell(rocketBunny, SpellIds.JumpRocketBlast, true);
}
}
public override void Register()
{
OnCast.Add(new(HandleCast));
}
}
[Script] // 50546 - The Focus on the Beach: Ley Line Focus Control Ring Effect
class spell_q12066_bunny_kill_credit : SpellScript
{
void HandleDummy(uint effIndex)
{
Creature target = GetHitCreature();
if (target != null)
target.CastSpell(GetCaster(), SpellIds.BunnyCreditBeam, false);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 49213 - Defending Wyrmrest Temple: Character Script Cast From Gossip
class spell_q12372_cast_from_gossip_trigger : SpellScript
{
void HandleScript(uint effIndex)
{
GetCaster().CastSpell(GetCaster(), SpellIds.SummonWyrmrestDefender, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 49370 - Wyrmrest Defender: Destabilize Azure Dragonshrine Effect
class spell_q12372_destabilize_azure_dragonshrine_dummy : SpellScript
{
void HandleDummy(uint effIndex)
{
if (GetHitCreature() != null)
{
Unit caster = GetOriginalCaster();
if (caster != null)
{
Vehicle vehicle = caster.GetVehicleKit();
if (vehicle != null)
{
Unit passenger = vehicle.GetPassenger(0);
if (passenger != null)
{
Player player = passenger.ToPlayer();
if (player != null)
player.KilledMonsterCredit(CreatureIds.WyrmrestTempleCredit);
}
}
}
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 40113 - Knockdown Fel Cannon: The Aggro Check Aura
class spell_q11010_q11102_q11023_aggro_check_aura : AuraScript
{
void HandleTriggerSpell(AuraEffect aurEff)
{
Unit target = GetTarget();
if (target != null)
// On trigger proccing
target.CastSpell(target, SpellIds.AggroCheck);
}
public override void Register()
{
OnEffectPeriodic.Add(new(HandleTriggerSpell, 0, AuraType.PeriodicTriggerSpell));
}
}
[Script] // 40112 - Knockdown Fel Cannon: The Aggro Check
class spell_q11010_q11102_q11023_aggro_check : SpellScript
{
void HandleDummy(uint effIndex)
{
Player playerTarget = GetHitPlayer();
// Check if found player target is on fly mount or using flying form
if (playerTarget != null && playerTarget.HasAuraType(AuraType.Fly) || playerTarget.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed))
playerTarget.CastSpell(playerTarget, SpellIds.FlakCannonTrigger, new CastSpellExtraArgs(TriggerCastFlags.IgnoreCasterMountedOrOnVehicle));
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 40119 - Knockdown Fel Cannon: The Aggro Burst
class spell_q11010_q11102_q11023_aggro_burst : AuraScript
{
void HandleEffectPeriodic(AuraEffect aurEff)
{
Unit target = GetTarget();
if (target != null)
// On each tick cast Choose Loc to trigger summon
target.CastSpell(target, SpellIds.ChooseLoc);
}
public override void Register()
{
OnEffectPeriodic.Add(new(HandleEffectPeriodic, 0, AuraType.PeriodicDummy));
}
}
[Script] // 40056 - Knockdown Fel Cannon: Choose Loc
class spell_q11010_q11102_q11023_choose_loc : SpellScript
{
void HandleDummy(uint effIndex)
{
Unit caster = GetCaster();
// Check for player that is in 65 y range
List<Player> playerList = caster.GetPlayerListInGrid(65.0f);
foreach (Player player in playerList)
{
// Check if found player target is on fly mount or using flying form
if (player.HasAuraType(AuraType.Fly) || player.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed))
// Summom Fel Cannon (bunny version) at found player
caster.SummonCreature(CreatureIds.FelCannon2, player.GetPositionX(), player.GetPositionY(), player.GetPositionZ());
}
}
public override void Register()
{
OnEffectHit.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
// 39844 - Skyguard Blasting Charge
[Script] // 40160 - Throw Bomb
class spell_q11010_q11102_q11023_q11008_check_fly_mount : SpellScript
{
SpellCastResult CheckRequirement()
{
Unit caster = GetCaster();
// This spell will be cast only if caster has one of these auras
if (!(caster.HasAuraType(AuraType.Fly) || caster.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed)))
return SpellCastResult.CantDoThatRightNow;
return SpellCastResult.SpellCastOk;
}
public override void Register()
{
OnCheckCast.Add(new(CheckRequirement));
}
}
[Script] // 50894 - Zul'Drak Rat
class spell_q12527_zuldrak_rat : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.SummonGorgedLurkingBasilisk);
}
void HandleScriptEffect(uint effIndex)
{
if (GetHitAura() != null && GetHitAura().GetStackAmount() >= GetSpellInfo().StackAmount)
{
GetHitUnit().CastSpell(null, SpellIds.SummonGorgedLurkingBasilisk, true);
Creature basilisk = GetHitUnit().ToCreature();
if (basilisk != null)
basilisk.DespawnOrUnsummon();
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScriptEffect, 1, SpellEffectName.ScriptEffect));
}
}
[Script] // 55368 - Summon Stefan
class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan : SpellScript
{
void SetDest(ref SpellDestination dest)
{
// Adjust effect summon position
Position offset = new(0.0f, 0.0f, 20.0f, 0.0f);
dest.RelocateOffset(offset);
}
public override void Register()
{
OnDestinationTargetSelect.Add(new(SetDest, 0, Targets.DestCasterBack));
}
}
[Script] // 53350 - Quenching Mist
class spell_q12730_quenching_mist : AuraScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.FlickeringFlames);
}
void HandleEffectPeriodic(AuraEffect aurEff)
{
GetTarget().RemoveAurasDueToSpell(SpellIds.FlickeringFlames);
}
public override void Register()
{
OnEffectPeriodic.Add(new(HandleEffectPeriodic, 0, AuraType.PeriodicHeal));
}
}
[Script] // 59318 - Grab Fake Soldier
class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.Ride);
}
void HandleDummy(uint effIndex)
{
if (GetHitCreature() == null)
return;
// To Do: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements.
// Beside that the decoy won't keep it's freeze animation state when enter.
GetHitCreature().CastSpell(GetCaster(), SpellIds.Ride, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 59303 - Summon Frost Wyrm
class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : SpellScript
{
void SetDest(ref SpellDestination dest)
{
// Adjust effect summon position
Position offset = new(0.0f, 0.0f, 20.0f, 0.0f);
dest.RelocateOffset(offset);
}
public override void Register()
{
OnDestinationTargetSelect.Add(new(SetDest, 0, Targets.DestCasterBack));
}
}
[Script] // 12601 - Second Chances: Summon Landgren's Soul Moveto Target Bunny
class spell_q12847_summon_soul_moveto_bunny : SpellScript
{
void SetDest(ref SpellDestination dest)
{
// Adjust effect summon position
Position offset = new(0.0f, 0.0f, 2.5f, 0.0f);
dest.RelocateOffset(offset);
}
public override void Register()
{
OnDestinationTargetSelect.Add(new(SetDest, 0, Targets.DestCaster));
}
}
// 57385 - Argent Cannon
[Script] // 57412 - Reckoning Bomb
class spell_q13086_cannons_target : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellEffect((spellInfo.Id, 0))
&& ValidateSpellInfo((uint)spellInfo.GetEffect(0).CalcValue());
}
void HandleEffectDummy(uint effIndex)
{
WorldLocation pos = GetExplTargetDest();
if (pos != null)
GetCaster().CastSpell(pos.GetPosition(), (uint)GetEffectValue(), true);
}
public override void Register()
{
OnEffectHit.Add(new(HandleEffectDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 59576 - Burst at the Seams
class spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59576 : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.BurstAtTheSeams59576, SpellIds.BloatedAbominationFeignDeath, SpellIds.BurstAtTheSeams59579, SpellIds.BurstAtTheSeamsBone, SpellIds.ExplodeAbominationMeat, SpellIds.ExplodeAbominationBloodyMeat);
}
void HandleScript(uint effIndex)
{
Creature creature = GetCaster().ToCreature();
if (creature != null)
{
creature.CastSpell(creature, SpellIds.BloatedAbominationFeignDeath, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeams59579, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeamsBone, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeamsBone, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeamsBone, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationMeat, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationBloodyMeat, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationBloodyMeat, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationBloodyMeat, true);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 59579 - Burst at the Seams
class spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59579 : AuraScript
{
void HandleApply(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit target = GetTarget();
target.CastSpell(target, SpellIds.TrollExplosion, true);
target.CastSpell(target, SpellIds.ExplodeAbominationMeat, true);
target.CastSpell(target, SpellIds.ExplodeTrollMeat, true);
target.CastSpell(target, SpellIds.ExplodeTrollMeat, true);
target.CastSpell(target, SpellIds.ExplodeTrollBloodyMeat, true);
target.CastSpell(target, SpellIds.BurstAtTheSeamsBone, true);
}
void HandleRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit target = GetTarget();
Unit caster = GetCaster();
if (caster != null)
{
switch (target.GetEntry())
{
case CreatureIds.IcyGhoul:
target.CastSpell(caster, SpellIds.AssignGhoulKillCreditToMaster, true);
break;
case CreatureIds.ViciousGeist:
target.CastSpell(caster, SpellIds.AssignGeistKillCreditToMaster, true);
break;
case CreatureIds.RisenAllianceSoldiers:
target.CastSpell(caster, SpellIds.AssignSkeletonKillCreditToMaster, true);
break;
}
}
target.CastSpell(target, SpellIds.BurstAtTheSeams59580, true);
}
public override void Register()
{
AfterEffectApply.Add(new(HandleApply, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
AfterEffectRemove.Add(new(HandleRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
}
}
[Script] // 52593 - Bloated Abomination Feign Death
class spell_q13264_q13276_q13288_q13289_bloated_abom_feign_death : AuraScript
{
void HandleApply(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit target = GetTarget();
target.SetUnitFlag3(UnitFlags3.FakeDead);
target.SetUnitFlag2(UnitFlags2.FeignDeath);
Creature creature = target.ToCreature();
if (target != null)
creature.SetReactState(ReactStates.Passive);
}
void HandleRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
{
Unit target = GetTarget();
Creature creature = target.ToCreature();
if (target != null)
creature.DespawnOrUnsummon();
}
public override void Register()
{
AfterEffectApply.Add(new(HandleApply, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
AfterEffectRemove.Add(new(HandleRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
}
}
[Script] // 76245 - Area Restrict Abom
class spell_q13264_q13276_q13288_q13289_area_restrict_abom : SpellScript
{
void HandleScript(uint effIndex)
{
Creature creature = GetHitCreature();
if (creature != null)
{
uint area = creature.GetAreaId();
if (area != MiscConst.AreaTheBrokenFront && area != MiscConst.AreaMordRetharTheDeathGate)
creature.DespawnOrUnsummon();
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
// 59590 - Assign Ghoul Kill Credit to Master
// 60039 - Assign Skeleton Kill Credit to Master
[Script] // 60041 - Assign Geist Kill Credit to Master
class spell_q13264_q13276_q13288_q13289_assign_credit_to_master : SpellScript
{
void HandleScript(uint effIndex)
{
Unit target = GetHitUnit();
if (target != null)
{
Unit owner = target.GetOwner();
if (owner != null)
owner.CastSpell(owner, (uint)GetEffectValue(), true);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 52510 - Burst at the Seams
class spell_q12690_burst_at_the_seams_52510 : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.BurstAtTheSeams52510, SpellIds.BurstAtTheSeams52508, SpellIds.BurstAtTheSeams59580, SpellIds.BurstAtTheSeamsBone, SpellIds.ExplodeAbominationMeat, SpellIds.ExplodeAbominationBloodyMeat);
}
public override bool Load()
{
return GetCaster().IsUnit();
}
void HandleKnockBack(uint effIndex)
{
Unit creature = GetCaster();
if (creature != null)
{
Unit charmer = GetCaster().GetCharmerOrOwner();
if (charmer != null)
{
Player player = charmer.ToPlayer();
if (player != null && player.GetQuestStatus(MiscConst.QuestFuelForTheFire) == QuestStatus.Incomplete)
{
creature.CastSpell(creature, SpellIds.BurstAtTheSeamsBone, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationMeat, true);
creature.CastSpell(creature, SpellIds.ExplodeAbominationBloodyMeat, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeams52508, true);
creature.CastSpell(creature, SpellIds.BurstAtTheSeams59580, true);
player.CastSpell(player, SpellIds.DrakkariSkullcrusherCredit, true);
ushort count = player.GetReqKillOrCastCurrentCount(MiscConst.QuestFuelForTheFire, (int)CreatureIds.DrakkariChieftaink);
if ((count % 20) == 0)
player.CastSpell(player, SpellIds.SummonDrakkariChieftain, true);
}
}
}
}
void HandleScript(uint effIndex)
{
GetCaster().ToCreature().DespawnOrUnsummon(TimeSpan.FromSeconds(2));
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleKnockBack, 1, SpellEffectName.KnockBack));
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 48682 - Escape from Silverbrook - Periodic Dummy
class spell_q12308_escape_from_silverbrook : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.SummonWorgen);
}
void HandleDummy(uint effIndex)
{
GetCaster().CastSpell(GetCaster(), SpellIds.SummonWorgen, true);
}
public override void Register()
{
OnEffectHit.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 48681 - Summon Silverbrook Worgen
class spell_q12308_escape_from_silverbrook_summon_worgen : SpellScript
{
void ModDest(ref SpellDestination dest)
{
float dist = GetEffectInfo(0).CalcRadius(GetCaster());
float angle = RandomHelper.FRand(0.75f, 1.25f) * MathF.PI;
Position pos = GetCaster().GetNearPosition(dist, angle);
dest.Relocate(pos);
}
public override void Register()
{
OnDestinationTargetSelect.Add(new(ModDest, 0, Targets.DestCasterSummon));
}
}
[Script] // 51858 - Siphon of Acherus
class spell_q12641_death_comes_from_on_high : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.ForgeCredit, SpellIds.TownHallCredit, SpellIds.ScarletHoldCredit, SpellIds.ChapelCredit);
}
void HandleDummy(uint effIndex)
{
uint spellId = 0;
switch (GetHitCreature().GetEntry())
{
case CreatureIds.NewAvalonForge:
spellId = SpellIds.ForgeCredit;
break;
case CreatureIds.NewAvalonTownHall:
spellId = SpellIds.TownHallCredit;
break;
case CreatureIds.ScarletHold:
spellId = SpellIds.ScarletHoldCredit;
break;
case CreatureIds.ChapelOfTheCrimsonFlame:
spellId = SpellIds.ChapelCredit;
break;
default:
return;
}
GetCaster().CastSpell(null, spellId, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 52694 - Recall Eye of Acherus
class spell_q12641_recall_eye_of_acherus : SpellScript
{
void HandleDummy(uint effIndex)
{
Player player = GetCaster().GetCharmerOrOwner().ToPlayer();
if (player != null)
{
player.StopCastingCharm();
player.StopCastingBindSight();
player.RemoveAura(MiscConst.TheEyeOfAcherus);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 51769 - Emblazon Runeblade
class spell_q12619_emblazon_runeblade : AuraScript
{
void HandleEffectPeriodic(AuraEffect aurEff)
{
PreventDefaultAction();
Unit caster = GetCaster();
if (caster != null)
caster.CastSpell(caster, aurEff.GetSpellEffectInfo().TriggerSpell, aurEff);
}
public override void Register()
{
OnEffectPeriodic.Add(new(HandleEffectPeriodic, 0, AuraType.PeriodicTriggerSpell));
}
}
[Script] // 51770 - Emblazon Runeblade
class spell_q12619_emblazon_runeblade_effect : SpellScript
{
void HandleScript(uint effIndex)
{
GetCaster().CastSpell(GetCaster(), (uint)GetEffectValue(), false);
}
public override void Register()
{
OnEffectHit.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 55516 - Gymer's Grab
class spell_q12919_gymers_grab : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.RideGymer);
}
void HandleScript(uint effIndex)
{
if (GetHitCreature() == null)
return;
CastSpellExtraArgs args = new(TriggerCastFlags.FullMask);
args.AddSpellMod(SpellValueMod.BasePoint0, 2);
GetHitCreature().CastSpell(GetCaster(), SpellIds.RideGymer, args);
GetHitCreature().CastSpell(GetHitCreature(), SpellIds.Grabbed, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 55421 - Gymer's Throw
class spell_q12919_gymers_throw : SpellScript
{
void HandleScript(uint effIndex)
{
Unit caster = GetCaster();
if (caster.IsVehicle())
{
Unit passenger = caster.GetVehicleKit().GetPassenger(1);
if (passenger != null)
{
passenger.ExitVehicle();
caster.CastSpell(passenger, SpellIds.VargulExplosion, true);
}
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 61752 - Illidan Kill Credit Master
class spell_q13400_illidan_kill_master : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.IllidanKillCredit);
}
void HandleDummy(uint effIndex)
{
Unit caster = GetCaster();
if (caster.IsVehicle())
{
Unit passenger = caster.GetVehicleKit().GetPassenger(0);
if (passenger != null)
passenger.CastSpell(passenger, SpellIds.IllidanKillCredit, true);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 0, SpellEffectName.Dummy));
}
}
[Script] // 66744 - Make Player Destroy Totems
class spell_q14100_q14111_make_player_destroy_totems : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.TotemOfTheEarthenRing);
}
void HandleScriptEffect(uint effIndex)
{
Player player = GetHitPlayer();
if (player != null)
player.CastSpell(player, SpellIds.TotemOfTheEarthenRing, new CastSpellExtraArgs(TriggerCastFlags.FullMask)); // ignore reagent cost, consumed by quest
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScriptEffect, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 39238 - Fumping
class spell_q10929_fumping : AuraScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.SummonSandGnome, SpellIds.SummonBoneSlicer);
}
void HandleEffectRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
{
if (GetTargetApplication().GetRemoveMode() != AuraRemoveMode.Expire)
return;
Unit caster = GetCaster();
if (caster != null)
caster.CastSpell(caster, RandomHelper.URand(SpellIds.SummonSandGnome, SpellIds.SummonBoneSlicer), true);
}
public override void Register()
{
OnEffectRemove.Add(new(HandleEffectRemove, 0, AuraType.Dummy, AuraEffectHandleModes.Real));
}
}
[Script] // 93072 - Get Our Boys Back Dummy
class spell_q28813_get_our_boys_back_dummy : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.RenewedLife);
}
void HandleDummyEffect()
{
Unit caster = GetCaster();
Creature injuredStormwindInfantry = caster.FindNearestCreature(CreatureIds.InjuredStormwindInfantry, 5.0f, true);
if (injuredStormwindInfantry != null)
{
injuredStormwindInfantry.SetCreatorGUID(caster.GetGUID());
injuredStormwindInfantry.CastSpell(injuredStormwindInfantry, SpellIds.RenewedLife, true);
}
}
public override void Register()
{
OnCast.Add(new(HandleDummyEffect));
}
}
[Script] // 53034 - Set Health Random
class spell_q28813_set_health_random : SpellScript
{
void HandleDummyEffect()
{
Unit caster = GetCaster();
caster.SetHealth(caster.CountPctFromMaxHealth(RandomHelper.IRand(3, 5) * 10));
}
public override void Register()
{
OnCast.Add(new(HandleDummyEffect));
}
}
[Script] // 49285 - Hand Over Reins
class spell_q12414_hand_over_reins : SpellScript
{
void HandleScript(uint effIndex)
{
Creature caster = GetCaster().ToCreature();
GetHitUnit().ExitVehicle();
if (caster != null)
caster.DespawnOrUnsummon();
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 1, SpellEffectName.ScriptEffect));
}
}
// 13790 13793 13811 13814 - Among the Champions
[Script] // 13665 13745 13750 13756 13761 13767 13772 13777 13782 13787 - The Grand Melee
class spell_q13665_q13790_bested_trigger : SpellScript
{
void HandleScript(uint effIndex)
{
Unit target = GetHitUnit().GetCharmerOrOwnerOrSelf();
target.CastSpell(target, (uint)GetEffectValue(), true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 43972 - Mixing Blood
class spell_q11306_mixing_blood : SpellScript
{
void HandleEffect(uint effIndex)
{
Unit caster = GetCaster();
if (caster != null)
{
Creature trigger = caster.FindNearestCreature(MiscConst.CreatureGenericTriggerLab, 100.0f);
if (trigger != null)
trigger.GetAI().DoCastSelf(SpellIds.SpurtsAndSmoke);
}
}
public override void Register()
{
OnEffectHit.Add(new(HandleEffect, 1, SpellEffectName.SendEvent));
}
}
[Script] // 43375 - Mixing Vrykul Blood
class spell_q11306_mixing_vrykul_blood : SpellScript
{
void HandleDummy(uint effIndex)
{
Unit caster = GetCaster();
if (caster != null)
{
uint chance = RandomHelper.URand(0, 99);
uint spellId = 0;
// 90% chance of getting one out of three failure effects
if (chance < 30)
spellId = SpellIds.ErrorMix1;
else if (chance < 60)
spellId = SpellIds.ErrorMix2;
else if (chance < 90)
spellId = SpellIds.ErrorMix3;
else // 10% chance of successful cast
spellId = SpellIds.SuccessfulMix;
caster.CastSpell(caster, spellId, true);
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleDummy, 1, SpellEffectName.Dummy));
}
}
[Script] // 43376 - Failed Mix
class spell_q11306_failed_mix_43376 : SpellScript
{
void HandleEffect(uint effIndex)
{
Unit caster = GetCaster();
if (caster != null)
{
Creature trigger = caster.FindNearestCreature(MiscConst.CreatureGenericTriggerLab, 100.0f);
if (trigger != null)
trigger.GetAI().Talk(MiscConst.Talk0, caster);
}
}
public override void Register()
{
OnEffectHit.Add(new(HandleEffect, 1, SpellEffectName.SendEvent));
}
}
[Script] // 43378 - Failed Mix
class spell_q11306_failed_mix_43378 : SpellScript
{
void HandleEffect(uint effIndex)
{
Unit caster = GetCaster();
if (caster != null)
{
Creature trigger = caster.FindNearestCreature(MiscConst.CreatureGenericTriggerLab, 100.0f);
if (trigger != null)
trigger.GetAI().Talk(MiscConst.Talk1, caster);
}
}
public override void Register()
{
OnEffectHit.Add(new(HandleEffect, 2, SpellEffectName.SendEvent));
}
}
[Script] // 46444 - Weakness to Lightning: Cast on Master Script Effect
class spell_q11896_weakness_to_lightning_46444 : SpellScript
{
void HandleScript(uint effIndex)
{
Unit target = GetHitUnit();
if (target != null)
{
Unit owner = GetCaster();
if (owner != null)
{
target.CastSpell(owner, (uint)GetEffectValue(), true);
}
}
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script]
class spell_quest_taming_the_beast : AuraScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.TameIceClawBear1, SpellIds.TameLargeCragBoar1, SpellIds.TameSnowLeopard1, SpellIds.TameAdultPlainstrider1, SpellIds.TamePrairieStalker1, SpellIds.TameSwoop1,
SpellIds.TameWebwoodLurker1, SpellIds.TameDireMottledBoar1, SpellIds.TameSurfCrawler1, SpellIds.TameArmoredScorpid1, SpellIds.TameNightsaberStalker1, SpellIds.TameStrigidScreecher1,
SpellIds.TameBarbedCrawler1, SpellIds.TameGreaterTimberstrider1, SpellIds.TameNightstalker1, SpellIds.TameCrazedDragonhawk1, SpellIds.TameElderSpringpaw1, SpellIds.TameMistbat1);
}
void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
{
if (GetCaster() == null || !GetCaster().IsAlive() || !GetTarget().IsAlive())
return;
if (GetTargetApplication().GetRemoveMode() != AuraRemoveMode.Expire)
return;
uint finalSpellId = 0;
switch (GetId())
{
case SpellIds.TameIceClawBear: finalSpellId = SpellIds.TameIceClawBear1; break;
case SpellIds.TameLargeCragBoar: finalSpellId = SpellIds.TameLargeCragBoar1; break;
case SpellIds.TameSnowLeopard: finalSpellId = SpellIds.TameSnowLeopard1; break;
case SpellIds.TameAdultPlainstrider: finalSpellId = SpellIds.TameAdultPlainstrider1; break;
case SpellIds.TamePrairieStalker: finalSpellId = SpellIds.TamePrairieStalker1; break;
case SpellIds.TameSwoop: finalSpellId = SpellIds.TameSwoop1; break;
case SpellIds.TameWebwoodLurker: finalSpellId = SpellIds.TameWebwoodLurker1; break;
case SpellIds.TameDireMottledBoar: finalSpellId = SpellIds.TameDireMottledBoar1; break;
case SpellIds.TameSurfCrawler: finalSpellId = SpellIds.TameSurfCrawler1; break;
case SpellIds.TameArmoredScorpid: finalSpellId = SpellIds.TameArmoredScorpid1; break;
case SpellIds.TameNightsaberStalker: finalSpellId = SpellIds.TameNightsaberStalker1; break;
case SpellIds.TameStrigidScreecher: finalSpellId = SpellIds.TameStrigidScreecher1; break;
case SpellIds.TameBarbedCrawler: finalSpellId = SpellIds.TameBarbedCrawler1; break;
case SpellIds.TameGreaterTimberstrider: finalSpellId = SpellIds.TameGreaterTimberstrider1; break;
case SpellIds.TameNightstalker: finalSpellId = SpellIds.TameNightstalker1; break;
case SpellIds.TameCrazedDragonhawk: finalSpellId = SpellIds.TameCrazedDragonhawk1; break;
case SpellIds.TameElderSpringpaw: finalSpellId = SpellIds.TameElderSpringpaw1; break;
case SpellIds.TameMistbat: finalSpellId = SpellIds.TameMistbat1; break;
}
if (finalSpellId != 0)
GetCaster().CastSpell(GetTarget(), finalSpellId, true);
}
public override void Register()
{
AfterEffectRemove.Add(new(OnRemove, 1, AuraType.Dummy, AuraEffectHandleModes.Real));
}
}
[Script] // 53099, 57896, 58418, 58420, 59064, 59065, 59439, 60900, 60940
class spell_quest_portal_with_condition : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellEffect((spellInfo.Id, 1))
&& ValidateSpellInfo((uint)spellInfo.GetEffect(0).CalcValue())
&& Global.ObjectMgr.GetQuestTemplate((uint)spellInfo.GetEffect(1).CalcValue()) != null;
}
void HandleScriptEffect(uint effIndex)
{
Player target = GetHitPlayer();
if (target == null)
return;
uint spellId = (uint)GetEffectInfo().CalcValue();
uint questId = (uint)GetEffectInfo(1).CalcValue();
// This probably should be a way to throw error in SpellCastResult
if (target.IsActiveQuest(questId))
target.CastSpell(target, spellId, true);
}
public override void Register()
{
OnEffectHitTarget.Add(new(HandleScriptEffect, 0, SpellEffectName.ScriptEffect));
}
}
// 24194 - Uther's Tribute
[Script] // 24195 - Grom's Tribute
class spell_quest_uther_grom_tribute : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.GromsTrollTribute, SpellIds.UthersHumanTribute, SpellIds.GromsTaurenTribute, SpellIds.UthersGnomeTribute, SpellIds.GromsUndeadTribute, SpellIds.UthersDwarfTribute,
SpellIds.GromsOrcTribute, SpellIds.UthersNightelfTribute, SpellIds.GromsBloodelfTribute, SpellIds.UthersDraeneiTribute);
}
void HandleScript(uint effIndex)
{
Player caster = GetCaster().ToPlayer();
if (caster == null)
return;
uint spell = 0;
switch (caster.GetRace())
{
case Race.Troll:
spell = SpellIds.GromsTrollTribute;
break;
case Race.Tauren:
spell = SpellIds.GromsTaurenTribute;
break;
case Race.Undead:
spell = SpellIds.GromsUndeadTribute;
break;
case Race.Orc:
spell = SpellIds.GromsOrcTribute;
break;
case Race.BloodElf:
spell = SpellIds.GromsBloodelfTribute;
break;
case Race.Human:
spell = SpellIds.UthersHumanTribute;
break;
case Race.Gnome:
spell = SpellIds.UthersGnomeTribute;
break;
case Race.Dwarf:
spell = SpellIds.UthersDwarfTribute;
break;
case Race.NightElf:
spell = SpellIds.UthersNightelfTribute;
break;
case Race.Draenei:
spell = SpellIds.UthersDraeneiTribute;
break;
default: break;
}
if (spell != 0)
caster.CastSpell(caster, spell);
}
public override void Register()
{
OnEffectHit.Add(new(HandleScript, 0, SpellEffectName.ScriptEffect));
}
}
[Script] // 68682 Call Attack Mastiffs
class spell_q14386_call_attack_mastiffs : SpellScript
{
void HandleEffect(uint effIndex)
{
Unit caster = GetCaster();
caster.SummonCreature(CreatureIds.AttackMastiff, -1944.573f, 2657.402f, 0.994939f, 1.691919f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -2005.65f, 2663.526f, -2.086935f, 0.5942355f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1996.506f, 2651.347f, -1.011707f, 0.8185352f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1972.352f, 2640.07f, 1.080288f, 1.217854f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1949.322f, 2642.76f, 1.242482f, 1.58074f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1993.94f, 2672.535f, -2.322549f, 0.5766209f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1982.724f, 2662.8f, -1.773986f, 0.8628055f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1973.301f, 2655.475f, -0.7831049f, 1.098415f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
caster.SummonCreature(CreatureIds.AttackMastiff, -1956.509f, 2650.655f, 1.350571f, 1.441473f, TempSummonType.TimedDespawnOutOfCombat, TimeSpan.FromSeconds(1));
}
public override void Register()
{
OnEffectHit.Add(new(HandleEffect, 1, SpellEffectName.SendEvent));
}
}