diff --git a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs index e4af16b84..d079a988b 100644 --- a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs +++ b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs @@ -21,22 +21,113 @@ using Game.Entities; using Game.Maps; using Game.Scripting; using Game.Spells; +using System; namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { - public struct Beasts + struct TextIds { // Gormok public const uint EmoteSnobolled = 0; // Acidmaw & Dreadscale public const uint EmoteEnrage = 0; + public const uint SaySpecial = 1; // Icehowl public const uint EmoteTrampleStart = 0; public const uint EmoteTrampleCrash = 1; public const uint EmoteTrampleFail = 2; + } + struct SpellIds + { + //Gormok + public const uint Impale = 66331; + public const uint StaggeringStomp = 67648; + + //Snobold + public const uint RisingAnger = 66636; + public const uint Snobolled = 66406; + public const uint Batter = 66408; + public const uint FireBomb = 66313; + public const uint FireBomb1 = 66317; + public const uint FireBombDot = 66318; + public const uint HeadCrack = 66407; + public const uint JumpToHand = 66342; + public const uint RidePlayer = 66245; + + //Acidmaw & Dreadscale + public const uint Sweep = 66794; + public const uint SummonSlimepool = 66883; + public const uint Emerge = 66947; + public const uint Submerge = 66948; + public const uint Enrage = 68335; + public const uint SlimePoolEffect = 66882; //In 60s It Diameter Grows From 10y To 40y (R=R+0.25 Per Second) + public const uint GroundVisual0 = 66969; + public const uint GroundVisual1 = 68302; + public const uint HateToZero = 63984; + //Acidmaw + public const uint AcidSpit = 66880; + public const uint ParalyticSpray = 66901; + public const uint ParalyticBite = 66824; + public const uint AcidSpew = 66819; + public const uint Paralysis = 66830; + public const uint ParalyticToxin = 66823; + //Dreadscale + public const uint BurningBite = 66879; + public const uint MoltenSpew = 66821; + public const uint FireSpit = 66796; + public const uint BurningSpray = 66902; + public const uint BurningBile = 66869; + + //Icehowl + public const uint FerociousButt = 66770; + public const uint MassiveCrash = 66683; + public const uint Whirl = 67345; + public const uint ArcticBreath = 66689; + public const uint Trample = 66734; + public const uint FrothingRage = 66759; + public const uint StaggeredDaze = 66758; + } + + struct Actions + { + public const int EnableFireBomb = 1; + public const int DisableFireBomb = 2; + public const int ActiveSnobold = 3; + } + + struct Events + { + // Snobold + public const uint FireBomb = 1; + public const uint Batter = 2; + public const uint HeadCrack = 3; + public const uint Snobolled = 4; + public const uint CheckMount = 5; + + // Acidmaw & Dreadscale + public const uint Bite = 6; + public const uint Spew = 7; + public const uint SlimePool = 8; + public const uint Spit = 9; + public const uint Spray = 10; + public const uint Sweep = 11; + public const uint Submerge = 12; + public const uint Emerge = 13; + public const uint SummonAcidmaw = 14; + + // Icehowl + public const uint FerociousButt = 15; + public const uint MassiveCrash = 16; + public const uint Whirl = 17; + public const uint ArcticBreath = 18; + public const uint Trample = 19; + } + + public struct Misc + { public const uint EquipMain = 50760; public const uint EquipOffhand = 48040; public const uint EquipRanged = 47267; @@ -47,83 +138,19 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public const uint ModelDreadscaleStationary = 26935; public const uint ModelDreadscaleMobile = 24564; - public const uint NpcSnoboldVassal = 34800; - public const uint NpcFireBomb = 34854; - public const uint NpcSlimePool = 35176; public const uint MaxSnobolds = 4; - //Gormok - public const uint SpellImpale = 66331; - public const uint SpellStaggeringStomp = 67648; - public const uint SpellRisingAnger = 66636; - //Snobold - public const uint SpellSnobolled = 66406; - public const uint SpellBatter = 66408; - public const uint SpellFireBomb = 66313; - public const uint SpellFireBomb1 = 66317; - public const uint SpellFireBombDot = 66318; - public const uint SpellHeadCrack = 66407; - - //Acidmaw & Dreadscale - public const uint SpellAcidSpit = 66880; - public const uint SpellParalyticSpray = 66901; - public const uint SpellAcidSpew = 66819; - public const uint SpellParalyticBite = 66824; - public const uint SpellSweep0 = 66794; - public const uint SpellSummonSlimepool = 66883; - public const uint SpellFireSpit = 66796; - public const uint SpellMoltenSpew = 66821; - public const uint SpellBurningBite = 66879; - public const uint SpellBurningSpray = 66902; - public const uint SpellSweep1 = 67646; - public const uint SpellEmerge0 = 66947; - public const uint SpellSubmerge0 = 66948; - public const uint SpellEnrage = 68335; - public const uint SpellSlimePoolEffect = 66882; //In 60s It Diameter Grows From 10y To 40y (R=R+0.25 Per Second) - - //Icehowl - public const uint SpellFerociousButt = 66770; - public const uint SpellMassiveCrash = 66683; - public const uint SpellWhirl = 67345; - public const uint SpellArcticBreath = 66689; - public const uint SpellTrample = 66734; - public const uint SpellFrothingRage = 66759; - public const uint SpellStaggeredDaze = 66758; - - public const int ActionEnableFireBomb = 1; - public const int ActionDisableFireBomb = 2; - - // Gormok - public const uint EventImpale = 1; - public const uint EventStaggeringStomp = 2; - public const uint EventThrow = 3; - - // Snobold - public const uint EventFireBomb = 4; - public const uint EventBatter = 5; - public const uint EventHeadCrack = 6; - - // Acidmaw & Dreadscale - public const uint EventBite = 7; - public const uint EventSpew = 8; - public const uint EventSlimePool = 9; - public const uint EventSpit = 10; - public const uint EventSpray = 11; - public const uint EventSweep = 12; - public const uint EventSubmerge = 13; - public const uint EventEmerge = 14; - public const uint EventSummonAcidmaw = 15; - - // Icehowl - public const uint EventFerociousButt = 16; - public const uint EventMassiveCrash = 17; - public const uint EventWhirl = 18; - public const uint EventArcticBreath = 19; - public const uint EventTrample = 20; - public const byte PhaseMobile = 1; public const byte PhaseStationary = 2; public const byte PhaseSubmerged = 3; + + public const int DataNewTarget = 1; + public const uint GormokHandSeat = 4; + public const uint PlayerVehicleId = 444; + + public const uint NpcSnoboldVassal = 34800; + public const uint NpcFireBomb = 34854; + public const uint NpcSlimePool = 35176; } [Script] @@ -133,9 +160,36 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - _events.ScheduleEvent(Beasts.EventImpale, RandomHelper.URand(8 * Time.InMilliseconds, 10 * Time.InMilliseconds)); - _events.ScheduleEvent(Beasts.EventStaggeringStomp, 15 * Time.InMilliseconds); - _events.ScheduleEvent(Beasts.EventThrow, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); + _scheduler.SetValidator(() => !me.HasUnitState(UnitState.Casting)); + + _scheduler.Schedule(TimeSpan.FromSeconds(8), TimeSpan.FromSeconds(10), task => + { + DoCastVictim(SpellIds.Impale); + task.Repeat(TimeSpan.FromSeconds(8), TimeSpan.FromSeconds(10)); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(15), task => + { + DoCastVictim(SpellIds.StaggeringStomp); + task.Repeat(TimeSpan.FromSeconds(15)); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), task => + { + for (sbyte i = 0; i < Misc.MaxSnobolds; ++i) + { + Unit snobold = me.GetVehicleKit().GetPassenger(i); + if (snobold) + { + snobold.ExitVehicle(); + snobold.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + snobold.ToCreature().GetAI().DoAction(Actions.DisableFireBomb); + snobold.CastSpell(me, SpellIds.JumpToHand, true); + break; + } + } + task.Repeat(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30)); + }); summons.DespawnAll(); } @@ -166,13 +220,13 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void JustDied(Unit killer) { - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.GormokDone); + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.GormokDone); } public override void JustReachedHome() { instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor)); - instance.SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.Fail); + instance.SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.Fail); me.DespawnOrUnsummon(); } @@ -180,19 +234,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void EnterCombat(Unit who) { _EnterCombat(); - me.SetInCombatWithZone(); - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.GormokInProgress); - - for (sbyte i = 0; i < Beasts.MaxSnobolds; i++) - { - Creature pSnobold = DoSpawnCreature(Beasts.NpcSnoboldVassal, 0, 0, 0, 0, TempSummonType.CorpseDespawn, 0); - if (pSnobold) - { - pSnobold.EnterVehicle(me, i); - pSnobold.SetInCombatWithZone(); - pSnobold.GetAI().DoAction(Beasts.ActionEnableFireBomb); - } - } + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.GormokInProgress); } public override void DamageTaken(Unit who, ref uint damage) @@ -200,120 +242,75 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader // despawn the remaining passengers on death if (damage >= me.GetHealth()) { - for (sbyte i = 0; i < Beasts.MaxSnobolds; ++i) + for (sbyte i = 0; i < Misc.MaxSnobolds; ++i) { - Unit pSnobold = me.GetVehicleKit().GetPassenger(i); - if (pSnobold) - pSnobold.ToCreature().DespawnOrUnsummon(); + Unit snobold = me.GetVehicleKit().GetPassenger(i); + if (snobold) + snobold.ToCreature().DespawnOrUnsummon(); } } } + public override void PassengerBoarded(Unit passenger, sbyte seatId, bool apply) + { + if (apply && seatId == Misc.GormokHandSeat) + passenger.CastSpell(me, SpellIds.RisingAnger, true); + } + public override void UpdateAI(uint diff) { if (!UpdateVictim()) return; - _events.Update(diff); + _scheduler.Update(diff); if (me.HasUnitState(UnitState.Casting)) return; - _events.ExecuteEvents(eventId => - { - switch (eventId) - { - case Beasts.EventImpale: - DoCastVictim(Beasts.SpellImpale); - _events.ScheduleEvent(Beasts.EventImpale, RandomHelper.URand(8 * Time.InMilliseconds, 10 * Time.InMilliseconds)); - return; - case Beasts.EventStaggeringStomp: - DoCastVictim(Beasts.SpellStaggeringStomp); - _events.ScheduleEvent(Beasts.EventStaggeringStomp, 15 * Time.InMilliseconds); - return; - case Beasts.EventThrow: - for (sbyte i = 0; i < Beasts.MaxSnobolds; ++i) - { - Unit pSnobold = me.GetVehicleKit().GetPassenger(i); - if (pSnobold) - { - pSnobold.ExitVehicle(); - pSnobold.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - pSnobold.ToCreature().SetReactState(ReactStates.Aggressive); - pSnobold.ToCreature().GetAI().DoAction(Beasts.ActionDisableFireBomb); - pSnobold.CastSpell(me, Beasts.SpellRisingAnger, true); - Talk(Beasts.EmoteSnobolled); - break; - } - } - _events.ScheduleEvent(Beasts.EventThrow, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); - return; - default: - return; - } - }); - DoMeleeAttackIfReady(); } } + class SnobolledTargetSelector : ISelector + { + public SnobolledTargetSelector(Unit unit) { } + + public bool Check(Unit unit) + { + if (unit.GetTypeId() != TypeId.Player) + return false; + + if (unit.HasAura(SpellIds.RidePlayer) || unit.HasAura(SpellIds.Snobolled)) + return false; + + return true; + } + } + [Script] class npc_snobold_vassal : ScriptedAI { public npc_snobold_vassal(Creature creature) : base(creature) { - _targetDied = false; _instance = creature.GetInstanceScript(); + _isActive = false; _instance.SetData(DataTypes.SnoboldCount, DataTypes.Increase); + SetCombatMovement(false); } public override void Reset() { - _events.ScheduleEvent(Beasts.EventBatter, 5 * Time.InMilliseconds); - _events.ScheduleEvent(Beasts.EventHeadCrack, 25 * Time.InMilliseconds); - - _targetGUID.Clear(); - _targetDied = false; - - //Workaround for Snobold me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - } - - public override void EnterCombat(Unit who) - { - _targetGUID = who.GetGUID(); - me.TauntApply(who); - DoCast(who, Beasts.SpellSnobolled); - } - - public override void DamageTaken(Unit pDoneBy, ref uint uiDamage) - { - if (pDoneBy.GetGUID() == _targetGUID) - uiDamage = 0; - } - - public override void MovementInform(MovementGeneratorType type, uint id) - { - if (type != MovementGeneratorType.Point) - return; - - switch (id) - { - case 0: - if (_targetDied) - me.DespawnOrUnsummon(); - break; - default: - break; - } + me.SetInCombatWithZone(); + _events.ScheduleEvent(Events.CheckMount, TimeSpan.FromSeconds(1)); + _events.ScheduleEvent(Events.FireBomb, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30)); } public override void JustDied(Unit killer) { Unit target = Global.ObjAccessor.GetPlayer(me, _targetGUID); if (target) - if (target.IsAlive()) - target.RemoveAurasDueToSpell(Beasts.SpellSnobolled); + target.RemoveAurasDueToSpell(SpellIds.Snobolled); _instance.SetData(DataTypes.SnoboldCount, DataTypes.Decrease); } @@ -321,52 +318,77 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (action) { - case Beasts.ActionEnableFireBomb: - _events.ScheduleEvent(Beasts.EventFireBomb, RandomHelper.URand(5 * Time.InMilliseconds, 30 * Time.InMilliseconds)); + case Actions.EnableFireBomb: + _events.ScheduleEvent(Events.FireBomb, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30)); break; - case Beasts.ActionDisableFireBomb: - _events.CancelEvent(Beasts.EventFireBomb); + case Actions.DisableFireBomb: + _events.CancelEvent(Events.FireBomb); + break; + case Actions.ActiveSnobold: + _isActive = true; break; default: break; } } - public override void UpdateAI(uint diff) + public override void SetGUID(ObjectGuid guid, int id = 0) { - if (!UpdateVictim() || _targetDied) + if (id == Misc.DataNewTarget) + { + Unit target = Global.ObjAccessor.GetPlayer(me, guid); + if (target) + { + _targetGUID = guid; + AttackStart(target); + _events.ScheduleEvent(Events.Batter, TimeSpan.FromSeconds(5)); + _events.ScheduleEvent(Events.HeadCrack, TimeSpan.FromSeconds(25)); + _events.ScheduleEvent(Events.Snobolled, TimeSpan.FromMilliseconds(500)); + } + } + } + + public override void AttackStart(Unit target) + { + //Snobold only melee attack players that is your vehicle + if (!_isActive || target.GetGUID() != _targetGUID) return; - Unit target = Global.ObjAccessor.GetPlayer(me, _targetGUID); - if (target) - { - if (!target.IsAlive()) - { - Unit gormok = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Gormok)); - if (gormok && gormok.IsAlive()) - { - SetCombatMovement(false); - _targetDied = true; + base.AttackStart(target); + } - // looping through Gormoks seats - for (sbyte i = 0; i < Beasts.MaxSnobolds; i++) - { - if (!gormok.GetVehicleKit().GetPassenger(i)) - { - me.EnterVehicle(gormok, i); - DoAction(Beasts.ActionEnableFireBomb); - break; - } - } - } - else if (target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true)) + void MountOnBoss() + { + Unit gormok = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Gormok)); + if (gormok && gormok.IsAlive()) + { + me.AttackStop(); + _targetGUID.Clear(); + _isActive = false; + _events.CancelEvent(Events.Batter); + _events.CancelEvent(Events.HeadCrack); + + for (sbyte i = 0; i < Misc.MaxSnobolds; i++) + { + if (!gormok.GetVehicleKit().GetPassenger(i)) { - _targetGUID = target.GetGUID(); - me.GetMotionMaster().MoveJump(target, 15.0f, 15.0f); + me.EnterVehicle(gormok, i); + DoAction(Actions.EnableFireBomb); + break; } } } + //Without Boss, snobolds should jump in another players + else + { + Unit target = SelectTarget(SelectAggroTarget.Random, 0, new SnobolledTargetSelector(me)); + if (target) + me.CastSpell(target, SpellIds.RidePlayer, true); + } + } + public override void UpdateAI(uint diff) + { _events.Update(diff); if (me.HasUnitState(UnitState.Casting)) @@ -376,42 +398,48 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (eventId) { - case Beasts.EventFireBomb: - { - if (me.GetVehicleBase()) - { - Unit fireTarget = SelectTarget(SelectAggroTarget.Random, 0, -me.GetVehicleBase().GetCombatReach(), true); - if (fireTarget) - me.CastSpell(fireTarget.GetPositionX(), fireTarget.GetPositionY(), fireTarget.GetPositionZ(), Beasts.SpellFireBomb, true); - } - _events.ScheduleEvent(Beasts.EventFireBomb, 20 * Time.InMilliseconds); - return; - } - case Beasts.EventHeadCrack: - // commented out while SPELL_SNOBOLLED gets fixed - //if (Unit target = Global.ObjAccessor.GetPlayer(me, m_uiTargetGUID)) - DoCastVictim(Beasts.SpellHeadCrack); - _events.ScheduleEvent(Beasts.EventHeadCrack, 30 * Time.InMilliseconds); - return; - case Beasts.EventBatter: - // commented out while SPELL_SNOBOLLED gets fixed - //if (Unit target = Global.ObjAccessor.GetPlayer(me, m_uiTargetGUID)) - DoCastVictim(Beasts.SpellBatter); - _events.ScheduleEvent(Beasts.EventBatter, 10 * Time.InMilliseconds); - return; + case Events.FireBomb: + Unit target = SelectTarget(SelectAggroTarget.Random, 0, -me.GetVehicleBase().GetCombatReach(), true); + if (target) + me.CastSpell(target, SpellIds.FireBomb); + _events.Repeat(TimeSpan.FromSeconds(20)); + break; + case Events.HeadCrack: + DoCast(me.GetVehicleBase(), SpellIds.HeadCrack); + _events.Repeat(TimeSpan.FromSeconds(30)); + break; + case Events.Batter: + DoCast(me.GetVehicleBase(), SpellIds.Batter); + _events.Repeat(TimeSpan.FromSeconds(10)); + break; + case Events.Snobolled: + DoCastAOE(SpellIds.Snobolled); + break; + case Events.CheckMount: + if (!me.GetVehicleBase()) + MountOnBoss(); + _events.Repeat(TimeSpan.FromSeconds(1)); + break; default: - return; + break; } + + if (me.HasUnitState(UnitState.Casting)) + return; }); + + if (!UpdateVictim()) + return; + // do melee attack only when not on Gormoks back - if (!me.GetVehicleBase()) + if (_isActive) DoMeleeAttackIfReady(); } InstanceScript _instance; ObjectGuid _targetGUID; - bool _targetDied; + bool _isActive; } [Script] @@ -424,7 +452,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - DoCast(me, Beasts.SpellFireBombDot, true); + DoCast(me, SpellIds.FireBombDot, true); SetCombatMovement(false); me.SetReactState(ReactStates.Passive); me.SetDisplayId(me.GetCreatureTemplate().ModelId2); @@ -432,27 +460,215 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void UpdateAI(uint diff) { - if (_instance.GetData(DataTypes.TypeNorthrendBeasts) != NorthrendBeasts.GormokInProgress) + if (_instance.GetData(DataTypes.NorthrendBeasts) != NorthrendBeasts.GormokInProgress) me.DespawnOrUnsummon(); } InstanceScript _instance; } + class boss_jormungarAI : BossAI + { + public boss_jormungarAI(Creature creature) : base(creature, DataTypes.BossBeasts) + { + Phase = Misc.PhaseMobile; + } + + public override void Reset() + { + Enraged = false; + + _events.ScheduleEvent(Events.Spit, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Spray, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Sweep, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Bite, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + _events.ScheduleEvent(Events.Spew, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + _events.ScheduleEvent(Events.SlimePool, TimeSpan.FromSeconds(15), 0, Misc.PhaseMobile); + } + + public override void JustDied(Unit killer) + { + Creature otherWorm = ObjectAccessor.GetCreature(me, instance.GetGuidData(OtherWormEntry)); + if (otherWorm) + { + if (!otherWorm.IsAlive()) + { + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.SnakesDone); + + me.DespawnOrUnsummon(); + otherWorm.DespawnOrUnsummon(); + } + else + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.SnakesSpecial); + } + } + + public override void JustReachedHome() + { + // prevent losing 2 attempts at once on heroics + if (instance.GetData(DataTypes.NorthrendBeasts) != (uint)EncounterState.Fail) + instance.SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.Fail); + + me.DespawnOrUnsummon(); + } + + public override void EnterCombat(Unit who) + { + _EnterCombat(); + me.SetInCombatWithZone(); + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.SnakesInProgress); + } + + public override void UpdateAI(uint diff) + { + if (!UpdateVictim()) + return; + + if (!Enraged && instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesSpecial) + { + me.RemoveAurasDueToSpell(SpellIds.Submerge); + me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + DoCast(SpellIds.Enrage); + Enraged = true; + Talk(TextIds.EmoteEnrage); + } + + _events.Update(diff); + + if (me.HasUnitState(UnitState.Casting)) + return; + + _events.ExecuteEvents(eventId => + { + switch (eventId) + { + case Events.Emerge: + Emerge(); + return; + case Events.Submerge: + Submerge(); + return; + case Events.Bite: + DoCastVictim(BiteSpell); + _events.ScheduleEvent(Events.Bite, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + return; + case Events.Spew: + DoCastAOE(SpewSpell); + _events.ScheduleEvent(Events.Spew, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + return; + case Events.SlimePool: + DoCast(me, SpellIds.SummonSlimepool); + _events.ScheduleEvent(Events.SlimePool, TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + return; + case Events.SummonAcidmaw: + Creature acidmaw = me.SummonCreature(CreatureIds.Acidmaw, MiscData.ToCCommonLoc[9].GetPositionX(), MiscData.ToCCommonLoc[9].GetPositionY(), MiscData.ToCCommonLoc[9].GetPositionZ(), 5, TempSummonType.ManualDespawn); + if (acidmaw) + { + acidmaw.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + acidmaw.SetReactState(ReactStates.Aggressive); + acidmaw.SetInCombatWithZone(); + acidmaw.CastSpell(acidmaw, SpellIds.Emerge); + acidmaw.CastSpell(acidmaw, SpellIds.GroundVisual1, true); + } + return; + case Events.Spray: + Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true); + if (target) + DoCast(target, SpraySpell); + _events.ScheduleEvent(Events.Spray, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + return; + case Events.Sweep: + DoCastAOE(SpellIds.Sweep); + _events.ScheduleEvent(Events.Sweep, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + return; + default: + return; + } + }); + + if (_events.IsInPhase(Misc.PhaseMobile)) + DoMeleeAttackIfReady(); + if (_events.IsInPhase(Misc.PhaseStationary)) + DoCastVictim(SpitSpell); + } + + void Submerge() + { + DoCast(me, SpellIds.Submerge); + DoCast(me, SpellIds.GroundVisual0, true); + me.RemoveAurasDueToSpell(SpellIds.Emerge); + me.SetInCombatWithZone(); + _events.SetPhase(Misc.PhaseSubmerged); + _events.ScheduleEvent(Events.Emerge, TimeSpan.FromSeconds(5), 0, Misc.PhaseSubmerged); + me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[1].GetPositionX() + RandomHelper.FRand(-40.0f, 40.0f), MiscData.ToCCommonLoc[1].GetPositionY() + RandomHelper.FRand(-40.0f, 40.0f), MiscData.ToCCommonLoc[1].GetPositionZ()); + WasMobile = !WasMobile; + } + + public void Emerge() + { + DoCast(me, SpellIds.Emerge); + DoCastAOE(SpellIds.HateToZero, true); + me.SetDisplayId(ModelMobile); + me.RemoveAurasDueToSpell(SpellIds.Submerge); + me.RemoveAurasDueToSpell(SpellIds.GroundVisual0); + me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + + // if the worm was mobile before submerging, make him stationary now + if (WasMobile) + { + me.SetControlled(true, UnitState.Root); + SetCombatMovement(false); + me.SetDisplayId(ModelStationary); + me.CastSpell(me, SpellIds.GroundVisual1, true); + _events.SetPhase(Misc.PhaseStationary); + _events.ScheduleEvent(Events.Submerge, TimeSpan.FromSeconds(45), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Spit, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Spray, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + _events.ScheduleEvent(Events.Sweep, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseStationary); + } + else + { + me.SetControlled(false, UnitState.Root); + SetCombatMovement(true); + me.GetMotionMaster().MoveChase(me.GetVictim()); + me.SetDisplayId(ModelMobile); + _events.SetPhase(Misc.PhaseMobile); + _events.ScheduleEvent(Events.Submerge, TimeSpan.FromSeconds(45), 0, Misc.PhaseMobile); + _events.ScheduleEvent(Events.Bite, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + _events.ScheduleEvent(Events.Spew, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30), 0, Misc.PhaseMobile); + _events.ScheduleEvent(Events.SlimePool, TimeSpan.FromSeconds(15), 0, Misc.PhaseMobile); + } + } + + protected uint OtherWormEntry; + protected uint ModelStationary; + protected uint ModelMobile; + + protected uint BiteSpell; + protected uint SpewSpell; + protected uint SpitSpell; + protected uint SpraySpell; + + protected uint Phase; + protected bool Enraged; + protected bool WasMobile; + } + [Script] - public class boss_acidmaw : boss_jormungarAI + class boss_acidmaw : boss_jormungarAI { public boss_acidmaw(Creature creature) : base(creature) { } public override void Reset() { base.Reset(); - BiteSpell = Beasts.SpellParalyticBite; - SpewSpell = Beasts.SpellAcidSpew; - SpitSpell = Beasts.SpellAcidSpit; - SpraySpell = Beasts.SpellParalyticSpray; - ModelStationary = Beasts.ModelAcidmawStationary; - ModelMobile = Beasts.ModelAcidmawMobile; + BiteSpell = SpellIds.ParalyticBite; + SpewSpell = SpellIds.AcidSpew; + SpitSpell = SpellIds.AcidSpit; + SpraySpell = SpellIds.ParalyticSpray; + ModelStationary = Misc.ModelAcidmawStationary; + ModelMobile = Misc.ModelAcidmawMobile; OtherWormEntry = CreatureIds.Dreadscale; WasMobile = true; @@ -461,26 +677,24 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } [Script] - public class boss_dreadscale : boss_jormungarAI + class boss_dreadscale : boss_jormungarAI { - public boss_dreadscale(Creature creature) : base(creature) - { - } + public boss_dreadscale(Creature creature) : base(creature) { } public override void Reset() { base.Reset(); - BiteSpell = Beasts.SpellBurningBite; - SpewSpell = Beasts.SpellMoltenSpew; - SpitSpell = Beasts.SpellFireSpit; - SpraySpell = Beasts.SpellBurningSpray; - ModelStationary = Beasts.ModelDreadscaleStationary; - ModelMobile = Beasts.ModelDreadscaleMobile; + BiteSpell = SpellIds.BurningBite; + SpewSpell = SpellIds.MoltenSpew; + SpitSpell = SpellIds.FireSpit; + SpraySpell = SpellIds.BurningSpray; + ModelStationary = Misc.ModelDreadscaleStationary; + ModelMobile = Misc.ModelDreadscaleMobile; OtherWormEntry = CreatureIds.Acidmaw; - _events.SetPhase(Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSummonAcidmaw, 3 * Time.InMilliseconds); - _events.ScheduleEvent(Beasts.EventSubmerge, 45 * Time.InMilliseconds, 0, Beasts.PhaseMobile); + _events.SetPhase(Misc.PhaseMobile); + _events.ScheduleEvent(Events.SummonAcidmaw, TimeSpan.FromSeconds(3)); + _events.ScheduleEvent(Events.Submerge, TimeSpan.FromSeconds(45), 0, Misc.PhaseMobile); WasMobile = false; } @@ -535,10 +749,10 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (!_cast) { _cast = true; - DoCast(me, Beasts.SpellSlimePoolEffect); + DoCast(me, SpellIds.SlimePoolEffect); } - if (_instance.GetData(DataTypes.TypeNorthrendBeasts) != NorthrendBeasts.SnakesInProgress && _instance.GetData(DataTypes.TypeNorthrendBeasts) != NorthrendBeasts.SnakesSpecial) + if (_instance.GetData(DataTypes.NorthrendBeasts) != NorthrendBeasts.SnakesInProgress && _instance.GetData(DataTypes.NorthrendBeasts) != NorthrendBeasts.SnakesSpecial) me.DespawnOrUnsummon(); } @@ -557,7 +771,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { Unit caster = GetCaster(); if (caster) - caster.SummonCreature(Beasts.NpcFireBomb, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 0, TempSummonType.TimedDespawn, 30 * Time.InMilliseconds); + caster.SummonCreature(Misc.NpcFireBomb, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 0, TempSummonType.TimedDespawn, 30 * Time.InMilliseconds); } } @@ -574,10 +788,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - _events.ScheduleEvent(Beasts.EventFerociousButt, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); - _events.ScheduleEvent(Beasts.EventArcticBreath, RandomHelper.URand(15 * Time.InMilliseconds, 25 * Time.InMilliseconds)); - _events.ScheduleEvent(Beasts.EventWhirl, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); - _events.ScheduleEvent(Beasts.EventMassiveCrash, 30 * Time.InMilliseconds); + _movementStarted = false; _movementFinish = false; _trampleCast = false; _trampleTargetGUID.Clear(); @@ -585,12 +796,17 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader _trampleTargetY = 0; _trampleTargetZ = 0; _stage = 0; + + _events.ScheduleEvent(Events.FerociousButt, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30)); + _events.ScheduleEvent(Events.ArcticBreath, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25)); + _events.ScheduleEvent(Events.Whirl, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(30)); + _events.ScheduleEvent(Events.MassiveCrash, TimeSpan.FromSeconds(30)); } public override void JustDied(Unit killer) { _JustDied(); - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.IcehowlDone); + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.IcehowlDone); } public override void MovementInform(MovementGeneratorType type, uint id) @@ -639,29 +855,23 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void JustReachedHome() { instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor)); - instance.SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.Fail); + instance.SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.Fail); me.DespawnOrUnsummon(); } - public override void KilledUnit(Unit who) - { - if (who.IsTypeId(TypeId.Player)) - instance.SetData(DataTypes.TributeToImmortalityEligible, 0); - } - public override void EnterCombat(Unit who) { _EnterCombat(); - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.IcehowlInProgress); + instance.SetData(DataTypes.NorthrendBeasts, NorthrendBeasts.IcehowlInProgress); } public override void SpellHitTarget(Unit target, SpellInfo spell) { - if (spell.Id == Beasts.SpellTrample && target.IsTypeId(TypeId.Player)) + if (spell.Id == SpellIds.Trample && target.IsTypeId(TypeId.Player)) { if (!_trampleCast) { - DoCast(me, Beasts.SpellFrothingRage, true); + DoCast(me, SpellIds.FrothingRage, true); _trampleCast = true; } } @@ -685,20 +895,20 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (eventId) { - case Beasts.EventFerociousButt: - DoCastVictim(Beasts.SpellFerociousButt); - _events.ScheduleEvent(Beasts.EventFerociousButt, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); + case Events.FerociousButt: + DoCastVictim(SpellIds.FerociousButt); + _events.ScheduleEvent(Events.FerociousButt, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); return; - case Beasts.EventArcticBreath: + case Events.ArcticBreath: Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true); if (target) - DoCast(target, Beasts.SpellArcticBreath); + DoCast(target, SpellIds.ArcticBreath); return; - case Beasts.EventWhirl: - DoCastAOE(Beasts.SpellWhirl); - _events.ScheduleEvent(Beasts.EventWhirl, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); + case Events.Whirl: + DoCastAOE(SpellIds.Whirl); + _events.ScheduleEvent(Events.Whirl, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds)); return; - case Beasts.EventMassiveCrash: + case Events.MassiveCrash: me.GetMotionMaster().MoveJump(MiscData.ToCCommonLoc[1], 20.0f, 20.0f, 0); // 1: Middle of the room SetCombatMovement(false); me.AttackStop(); @@ -707,12 +917,15 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader default: break; } + + if (me.HasUnitState(UnitState.Casting)) + return; }); DoMeleeAttackIfReady(); break; } case 1: - DoCastAOE(Beasts.SpellMassiveCrash); + DoCastAOE(SpellIds.MassiveCrash); me.StopMoving(); me.AttackStop(); _stage = 2; @@ -732,7 +945,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader me.SetControlled(true, UnitState.Root); me.GetMotionMaster().Clear(); me.GetMotionMaster().MoveIdle(); - _events.ScheduleEvent(Beasts.EventTrample, 4 * Time.InMilliseconds); + _events.ScheduleEvent(Events.Trample, TimeSpan.FromSeconds(4)); _stage = 3; } else @@ -744,7 +957,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (eventId) { - case Beasts.EventTrample: + case Events.Trample: { Unit target = Global.ObjAccessor.GetPlayer(me, _trampleTargetGUID); if (target) @@ -776,7 +989,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Player target = Global.ObjAccessor.GetPlayer(me, _trampleTargetGUID); if (target) - Talk(Beasts.EmoteTrampleStart, target); + Talk(TextIds.EmoteTrampleStart, target); me.GetMotionMaster().MoveCharge(_trampleTargetX, _trampleTargetY, _trampleTargetZ, 42, 1); me.SetTarget(ObjectGuid.Empty); @@ -786,20 +999,20 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader case 5: if (_movementFinish) { - DoCastAOE(Beasts.SpellTrample); + DoCastAOE(SpellIds.Trample); _movementFinish = false; _stage = 6; return; } - if (_events.ExecuteEvent() == Beasts.EventTrample) + if (_events.ExecuteEvent() == Events.Trample) { var lPlayers = me.GetMap().GetPlayers(); foreach (var player in lPlayers) { if (player.IsAlive() && player.IsWithinDistInMap(me, 6.0f)) { - DoCastAOE(Beasts.SpellTrample); - _events.ScheduleEvent(Beasts.EventTrample, 4 * Time.InMilliseconds); + DoCastAOE(SpellIds.Trample); + _events.ScheduleEvent(Events.Trample, TimeSpan.FromSeconds(4)); break; } } @@ -808,22 +1021,23 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader case 6: if (!_trampleCast) { - DoCast(me, Beasts.SpellStaggeredDaze); - Talk(Beasts.EmoteTrampleCrash); + DoCast(me, SpellIds.StaggeredDaze); + Talk(TextIds.EmoteTrampleCrash); } else { - DoCast(me, Beasts.SpellFrothingRage, true); - Talk(Beasts.EmoteTrampleFail); + DoCast(me, SpellIds.FrothingRage, true); + Talk(TextIds.EmoteTrampleFail); } + _movementStarted = false; me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); SetCombatMovement(true); me.GetMotionMaster().MovementExpired(); me.GetMotionMaster().Clear(); me.GetMotionMaster().MoveChase(me.GetVictim()); AttackStart(me.GetVictim()); - _events.ScheduleEvent(Beasts.EventMassiveCrash, 40 * Time.InMilliseconds); - _events.ScheduleEvent(Beasts.EventArcticBreath, RandomHelper.URand(15 * Time.InMilliseconds, 25 * Time.InMilliseconds)); + _events.ScheduleEvent(Events.MassiveCrash, TimeSpan.FromSeconds(40)); + _events.ScheduleEvent(Events.ArcticBreath, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25)); _stage = 0; break; default: @@ -833,194 +1047,213 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader float _trampleTargetX, _trampleTargetY, _trampleTargetZ; ObjectGuid _trampleTargetGUID; + bool _movementStarted; bool _movementFinish; bool _trampleCast; byte _stage; } - public class boss_jormungarAI : BossAI + [Script] + class spell_gormok_jump_to_hand : AuraScript { - public boss_jormungarAI(Creature creature) : base(creature, DataTypes.BossBeasts) { } - - public override void Reset() + public override bool Validate(SpellInfo spellInfo) { - Enraged = false; - - _events.ScheduleEvent(Beasts.EventSpit, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSpray, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSweep, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventBite, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSpew, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSlimePool, 15 * Time.InMilliseconds, 0, Beasts.PhaseMobile); + return ValidateSpellInfo(SpellIds.RidePlayer); } - public override void JustDied(Unit killer) + public override bool Load() { - Creature otherWorm = ObjectAccessor.GetCreature(me, instance.GetGuidData(OtherWormEntry)); - if (otherWorm) - { - if (!otherWorm.IsAlive()) - { - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.SnakesDone); + if (GetCaster() && GetCaster().GetEntry() == Misc.NpcSnoboldVassal) + return true; + return false; + } - me.DespawnOrUnsummon(); - otherWorm.DespawnOrUnsummon(); + void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode) + { + Unit caster = GetCaster(); + if (caster) + { + CreatureAI gormokAI = GetTarget().ToCreature().GetAI(); + if (gormokAI != null) + { + Unit target = gormokAI.SelectTarget(SelectAggroTarget.Random, 0, new SnobolledTargetSelector(GetTarget())); + if (target) + { + gormokAI.Talk(TextIds.EmoteSnobolled); + caster.GetAI().DoAction(Actions.ActiveSnobold); + caster.CastSpell(target, SpellIds.RidePlayer, true); + } } - else - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.SnakesSpecial); } } - public override void JustReachedHome() + public override void Register() { - // prevent losing 2 attempts at once on heroics - if (instance.GetData(DataTypes.TypeNorthrendBeasts) != (uint)EncounterState.Fail) - instance.SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.Fail); + AfterEffectRemove.Add(new EffectApplyHandler(OnRemove, 0, AuraType.ControlVehicle, AuraEffectHandleModes.Real)); + } + } - me.DespawnOrUnsummon(); + [Script] + class spell_gormok_ride_player : AuraScript + { + public override bool Load() + { + if (GetCaster() && GetCaster().GetEntry() == Misc.NpcSnoboldVassal) + return true; + return false; } - public override void KilledUnit(Unit who) + void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode) { - if (who.IsTypeId(TypeId.Player)) - instance.SetData(DataTypes.TributeToImmortalityEligible, 0); - } - - public override void EnterCombat(Unit who) - { - _EnterCombat(); - me.SetInCombatWithZone(); - instance.SetData(DataTypes.TypeNorthrendBeasts, NorthrendBeasts.SnakesInProgress); - } - - public override void UpdateAI(uint diff) - { - if (!UpdateVictim()) + Unit target = GetTarget(); + if (target.GetTypeId() != TypeId.Player || !target.IsInWorld) return; - if (!Enraged && instance.GetData(DataTypes.TypeNorthrendBeasts) == NorthrendBeasts.SnakesSpecial) - { - me.RemoveAurasDueToSpell(Beasts.SpellSubmerge0); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - DoCast(Beasts.SpellEnrage); - Enraged = true; - Talk(Beasts.EmoteEnrage); - } - - _events.Update(diff); - - if (me.HasUnitState(UnitState.Casting)) + if (!target.CreateVehicleKit(Misc.PlayerVehicleId, 0)) return; - _events.ExecuteEvents(eventId => - { - switch (eventId) - { - case Beasts.EventEmerge: - Emerge(); - return; - case Beasts.EventSubmerge: - Submerge(); - return; - case Beasts.EventBite: - DoCastVictim(BiteSpell); - _events.ScheduleEvent(Beasts.EventBite, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - return; - case Beasts.EventSpew: - DoCastAOE(SpewSpell); - _events.ScheduleEvent(Beasts.EventSpew, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - return; - case Beasts.EventSlimePool: - DoCast(me, Beasts.SpellSummonSlimepool); - _events.ScheduleEvent(Beasts.EventSlimePool, 30 * Time.InMilliseconds, 0, Beasts.PhaseMobile); - return; - case Beasts.EventSummonAcidmaw: - Creature acidmaw = me.SummonCreature(CreatureIds.Acidmaw, MiscData.ToCCommonLoc[9].GetPositionX(), MiscData.ToCCommonLoc[9].GetPositionY(), MiscData.ToCCommonLoc[9].GetPositionZ(), 5, TempSummonType.ManualDespawn); - if (acidmaw) - { - acidmaw.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - acidmaw.SetReactState(ReactStates.Aggressive); - acidmaw.SetInCombatWithZone(); - acidmaw.CastSpell(acidmaw, Beasts.SpellEmerge0); - } - return; - case Beasts.EventSpray: - Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true); - if (target) - DoCast(target, SpraySpell); - _events.ScheduleEvent(Beasts.EventSpray, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - return; - case Beasts.EventSweep: - DoCastAOE(Beasts.SpellSweep0); - _events.ScheduleEvent(Beasts.EventSweep, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - return; - default: - return; - } - }); - if (_events.IsInPhase(Beasts.PhaseMobile)) - DoMeleeAttackIfReady(); - if (_events.IsInPhase(Beasts.PhaseStationary)) - DoSpellAttackIfReady(SpitSpell); + Unit caster = GetCaster(); + if (caster) + caster.GetAI().SetGUID(target.GetGUID(), Misc.DataNewTarget); } - void Submerge() + void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { - DoCast(me, Beasts.SpellSubmerge0); - me.RemoveAurasDueToSpell(Beasts.SpellEmerge0); - me.SetInCombatWithZone(); - _events.SetPhase(Beasts.PhaseSubmerged); - _events.ScheduleEvent(Beasts.EventEmerge, 5 * Time.InMilliseconds, 0, Beasts.PhaseSubmerged); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - me.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[1].GetPositionX() + RandomHelper.FRand(-40.0f, 40.0f), MiscData.ToCCommonLoc[1].GetPositionY() + RandomHelper.FRand(-40.0f, 40.0f), MiscData.ToCCommonLoc[1].GetPositionZ()); - WasMobile = !WasMobile; + GetTarget().RemoveVehicleKit(); } - public void Emerge() + public override void Register() { - DoCast(me, Beasts.SpellEmerge0); - me.SetDisplayId(ModelMobile); - me.RemoveAurasDueToSpell(Beasts.SpellSubmerge0); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - me.GetMotionMaster().Clear(); + OnEffectApply.Add(new EffectApplyHandler(OnApply, 0, AuraType.ControlVehicle, AuraEffectHandleModes.Real)); + AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.ControlVehicle, AuraEffectHandleModes.Real)); + } + } - // if the worm was mobile before submerging, make him stationary now - if (WasMobile) + [Script] + class spell_gormok_snobolled : AuraScript + { + public override bool Validate(SpellInfo spellInfo) + { + return ValidateSpellInfo(SpellIds.RidePlayer); + } + + void OnPeriodic(AuraEffect aurEff) + { + if (!GetTarget().HasAura(SpellIds.RidePlayer)) + Remove(); + } + + public override void Register() + { + OnEffectPeriodic.Add(new EffectPeriodicHandler(OnPeriodic, 0, AuraType.PeriodicDummy)); + } + } + + [Script] + class spell_jormungars_paralytic_toxin : AuraScript + { + public override bool Validate(SpellInfo spell) + { + return ValidateSpellInfo(SpellIds.Paralysis); + } + + void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode) + { + Unit caster = GetCaster(); + if (caster && caster.GetEntry() == CreatureIds.Acidmaw) { - me.SetControlled(true, UnitState.Root); - SetCombatMovement(false); - me.SetDisplayId(ModelStationary); - _events.SetPhase(Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSubmerge, 45 * Time.InMilliseconds, 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSpit, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSpray, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - _events.ScheduleEvent(Beasts.EventSweep, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseStationary); - } - else - { - me.SetControlled(false, UnitState.Root); - SetCombatMovement(true); - me.GetMotionMaster().MoveChase(me.GetVictim()); - me.SetDisplayId(ModelMobile); - _events.SetPhase(Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSubmerge, 45 * Time.InMilliseconds, 0, Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventBite, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSpew, RandomHelper.URand(15 * Time.InMilliseconds, 30 * Time.InMilliseconds), 0, Beasts.PhaseMobile); - _events.ScheduleEvent(Beasts.EventSlimePool, 15 * Time.InMilliseconds, 0, Beasts.PhaseMobile); + Creature acidMaw = caster.ToCreature(); + if (acidMaw) + acidMaw.GetAI().Talk(TextIds.SaySpecial, GetTarget()); } } - protected uint OtherWormEntry; - protected uint ModelStationary; - protected uint ModelMobile; + void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode) + { + GetTarget().RemoveAurasDueToSpell(SpellIds.Paralysis); + } - protected uint BiteSpell; - protected uint SpewSpell; - protected uint SpitSpell; - protected uint SpraySpell; + void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated) + { + if (!canBeRecalculated) + amount = aurEff.GetAmount(); - //protected uint Phase; - protected bool Enraged; - protected bool WasMobile; + canBeRecalculated = false; + } + + void HandleDummy(AuraEffect aurEff) + { + AuraEffect slowEff = GetEffect(0); + if (slowEff != null) + { + int newAmount = slowEff.GetAmount() - 10; + if (newAmount < -100) + newAmount = -100; + slowEff.ChangeAmount(newAmount); + + if (newAmount <= -100 && !GetTarget().HasAura(SpellIds.Paralysis)) + GetTarget().CastSpell(GetTarget(), SpellIds.Paralysis, true, null, slowEff, GetCasterGUID()); + } + } + + public override void Register() + { + AfterEffectApply.Add(new EffectApplyHandler(OnApply, 0, AuraType.ModDecreaseSpeed, AuraEffectHandleModes.Real)); + AfterEffectRemove.Add(new EffectApplyHandler(OnRemove, 0, AuraType.ModDecreaseSpeed, AuraEffectHandleModes.Real)); + DoEffectCalcAmount.Add(new EffectCalcAmountHandler(CalculateAmount, 0, AuraType.ModDecreaseSpeed)); + OnEffectPeriodic.Add(new EffectPeriodicHandler(HandleDummy, 2, AuraType.PeriodicDummy)); + } + } + + [Script("spell_jormungars_burning_spray", SpellIds.BurningBile)] + [Script("spell_jormungars_paralytic_spray", SpellIds.ParalyticToxin)] + class spell_jormungars_snakes_spray : SpellScript + { + public spell_jormungars_snakes_spray(uint spellId) + { + _spellId = spellId; + } + + public override bool Validate(SpellInfo spell) + { + return ValidateSpellInfo(_spellId); + } + + void HandleScript(uint effIndex) + { + Player target = GetHitPlayer(); + if (target) + GetCaster().CastSpell(target, _spellId, true); + } + + public override void Register() + { + OnEffectHitTarget.Add(new EffectHandler(HandleScript, 0, SpellEffectName.SchoolDamage)); + } + + uint _spellId; + } + + [Script] + class spell_jormungars_paralysis : AuraScript + { + void OnApply(AuraEffect aurEff, AuraEffectHandleModes mode) + { + Unit caster = GetCaster(); + if (caster) + { + InstanceScript instance = caster.GetInstanceScript(); + if (instance != null) + if (instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesInProgress || instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesSpecial) + return; + } + + Remove(); + } + + public override void Register() + { + AfterEffectApply.Add(new EffectApplyHandler(OnApply, 0, AuraType.ModStun, AuraEffectHandleModes.Real)); + } } } diff --git a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs index c7b7ac62f..9cac6f984 100644 --- a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs +++ b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs @@ -67,7 +67,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (instance.IsHeroic()) { player.SendUpdateWorldState(WorldStateIds.Show, 1); - player.SendUpdateWorldState(WorldStateIds.Count, GetData(DataTypes.TypeCounter)); + player.SendUpdateWorldState(WorldStateIds.Count, GetData(DataTypes.Counter)); } else player.SendUpdateWorldState(WorldStateIds.Show, 0); @@ -409,25 +409,25 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (type) { - case DataTypes.TypeCounter: + case DataTypes.Counter: TrialCounter = data; data = (uint)EncounterState.Done; break; - case DataTypes.TypeEvent: + case DataTypes.Event: EventStage = data; data = (uint)EncounterState.NotStarted; break; - case DataTypes.TypeEventTimer: + case DataTypes.EventTimer: EventTimer = data; data = (uint)EncounterState.NotStarted; break; - case DataTypes.TypeNorthrendBeasts: + case DataTypes.NorthrendBeasts: northrendBeasts = (EncounterState)data; switch (data) { case NorthrendBeasts.GormokDone: EventStage = 200; - SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.InProgress); + SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.InProgress); break; case NorthrendBeasts.SnakesInProgress: NotOneButTwoJormungarsTimer = 0; @@ -439,11 +439,11 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (NotOneButTwoJormungarsTimer > 0) DoUpdateCriteria(CriteriaTypes.BeSpellTarget, AchievementData.SpellWormsKilledIn10Seconds); EventStage = 300; - SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.InProgress); + SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.InProgress); break; case NorthrendBeasts.IcehowlDone: EventStage = 400; - SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.Done); + SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.Done); SetBossState(DataTypes.BossBeasts, EncounterState.Done); break; case (uint)EncounterState.Fail: @@ -527,15 +527,15 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { switch (type) { - case DataTypes.TypeCounter: + case DataTypes.Counter: return TrialCounter; - case DataTypes.TypeEvent: + case DataTypes.Event: return EventStage; - case DataTypes.TypeNorthrendBeasts: + case DataTypes.NorthrendBeasts: return (uint)northrendBeasts; - case DataTypes.TypeEventTimer: + case DataTypes.EventTimer: return EventTimer; - case DataTypes.TypeEventNpc: + case DataTypes.EventNpc: switch (EventStage) { case 110: @@ -625,7 +625,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Update(uint diff) { - if (GetData(DataTypes.TypeNorthrendBeasts) == NorthrendBeasts.SnakesSpecial && NotOneButTwoJormungarsTimer != 0) + if (GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesSpecial && NotOneButTwoJormungarsTimer != 0) { if (NotOneButTwoJormungarsTimer <= diff) NotOneButTwoJormungarsTimer = 0; @@ -810,7 +810,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader string _message = "We are ready!"; - if (player.IsInCombat() || instance.IsEncounterInProgress() || instance.GetData(DataTypes.TypeEvent) != 0) + if (player.IsInCombat() || instance.IsEncounterInProgress() || instance.GetData(DataTypes.Event) != 0) return true; byte i = 0; @@ -841,8 +841,8 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { - instance.SetData(DataTypes.TypeEvent, 110); - instance.SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.NotStarted); + instance.SetData(DataTypes.Event, 110); + instance.SetData(DataTypes.NorthrendBeasts, (uint)EncounterState.NotStarted); instance.SetBossState(DataTypes.BossBeasts, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossJaraxxus) != EncounterState.Done) @@ -858,21 +858,21 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } else { - instance.SetData(DataTypes.TypeEvent, 1010); + instance.SetData(DataTypes.Event, 1010); instance.SetBossState(DataTypes.BossJaraxxus, EncounterState.NotStarted); } } else if (instance.GetBossState(DataTypes.BossCrusaders) != EncounterState.Done) { if (player.GetTeam() == Team.Alliance) - instance.SetData(DataTypes.TypeEvent, 3000); + instance.SetData(DataTypes.Event, 3000); else - instance.SetData(DataTypes.TypeEvent, 3001); + instance.SetData(DataTypes.Event, 3001); instance.SetBossState(DataTypes.BossCrusaders, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossValkiries) != EncounterState.Done) { - instance.SetData(DataTypes.TypeEvent, 4000); + instance.SetData(DataTypes.Event, 4000); instance.SetBossState(DataTypes.BossValkiries, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossLichKing) != EncounterState.Done) @@ -934,10 +934,10 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader switch (id) { case 0: - _instance.SetData(DataTypes.TypeEvent, 5030); + _instance.SetData(DataTypes.Event, 5030); break; case 1: - _instance.SetData(DataTypes.TypeEvent, 5050); + _instance.SetData(DataTypes.Event, 5050); break; default: break; @@ -949,47 +949,47 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (_instance == null) return; - if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.LichKing) + if (_instance.GetData(DataTypes.EventNpc) != CreatureIds.LichKing) return; - _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); + _updateTimer = _instance.GetData(DataTypes.EventTimer); if (_updateTimer <= uiDiff) { - switch (_instance.GetData(DataTypes.TypeEvent)) + switch (_instance.GetData(DataTypes.Event)) { case 5010: Talk(Texts.Stage_4_02); _updateTimer = 3 * Time.InMilliseconds; me.GetMotionMaster().MovePoint(0, MiscData.LichKingLoc[0]); - _instance.SetData(DataTypes.TypeEvent, 5020); + _instance.SetData(DataTypes.Event, 5020); break; case 5030: Talk(Texts.Stage_4_04); me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.StateTalk); _updateTimer = 10 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 5040); + _instance.SetData(DataTypes.Event, 5040); break; case 5040: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); me.GetMotionMaster().MovePoint(1, MiscData.LichKingLoc[1]); _updateTimer = 1 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 5050: me.HandleEmoteCommand(Emote.OneshotExclamation); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 5060); + _instance.SetData(DataTypes.Event, 5060); break; case 5060: Talk(Texts.Stage_4_05); me.HandleEmoteCommand(Emote.OneshotKneel); _updateTimer = (uint)(2.5 * Time.InMilliseconds); - _instance.SetData(DataTypes.TypeEvent, 5070); + _instance.SetData(DataTypes.Event, 5070); break; case 5070: me.CastSpell(me, 68198, false); _updateTimer = (uint)(1.5 * Time.InMilliseconds); - _instance.SetData(DataTypes.TypeEvent, 5080); + _instance.SetData(DataTypes.Event, 5080); break; case 5080: { @@ -1009,7 +1009,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (!temp || !temp.IsAlive()) temp = me.SummonCreature(CreatureIds.Anubarak, MiscData.AnubarakLoc[0].GetPositionX(), MiscData.AnubarakLoc[0].GetPositionY(), MiscData.AnubarakLoc[0].GetPositionZ(), 3, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); me.DespawnOrUnsummon(); _updateTimer = 20 * Time.InMilliseconds; @@ -1022,7 +1022,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader else _updateTimer -= uiDiff; - _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); + _instance.SetData(DataTypes.EventTimer, _updateTimer); } InstanceScript _instance; @@ -1041,7 +1041,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void JustDied(Unit killer) { Talk(Texts.Stage_1_06, killer); - _instance.SetData(DataTypes.TypeEvent, 1180); + _instance.SetData(DataTypes.Event, 1180); Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) { @@ -1068,8 +1068,8 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader case 1: me.SetWalk(false); _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); - _instance.SetData(DataTypes.TypeEvent, 1120); - _instance.SetData(DataTypes.TypeEventTimer, 1 * Time.InMilliseconds); + _instance.SetData(DataTypes.Event, 1120); + _instance.SetData(DataTypes.EventTimer, 1 * Time.InMilliseconds); break; default: break; @@ -1086,21 +1086,21 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (_instance == null) return; - if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Fizzlebang) + if (_instance.GetData(DataTypes.EventNpc) != CreatureIds.Fizzlebang) return; - _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); + _updateTimer = _instance.GetData(DataTypes.EventTimer); if (_updateTimer <= uiDiff) { - switch (_instance.GetData(DataTypes.TypeEvent)) + switch (_instance.GetData(DataTypes.Event)) { case 1110: - _instance.SetData(DataTypes.TypeEvent, 1120); + _instance.SetData(DataTypes.Event, 1120); _updateTimer = 4 * Time.InMilliseconds; break; case 1120: Talk(Texts.Stage_1_02); - _instance.SetData(DataTypes.TypeEvent, 1130); + _instance.SetData(DataTypes.Event, 1130); _updateTimer = 12 * Time.InMilliseconds; break; case 1130: @@ -1116,13 +1116,13 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader pTrigger.SetDisplayId(pTrigger.ToCreature().GetCreatureTemplate().ModelId1); pTrigger.CastSpell(pTrigger, Spells.WilfredPortal, false); } - _instance.SetData(DataTypes.TypeEvent, 1132); + _instance.SetData(DataTypes.Event, 1132); _updateTimer = 4 * Time.InMilliseconds; break; } case 1132: me.GetMotionMaster().MovementExpired(); - _instance.SetData(DataTypes.TypeEvent, 1134); + _instance.SetData(DataTypes.Event, 1134); _updateTimer = 4 * Time.InMilliseconds; break; case 1134: @@ -1137,11 +1137,11 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader _portalGUID = pPortal.GetGUID(); } _updateTimer = 4 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 1135); + _instance.SetData(DataTypes.Event, 1135); break; } case 1135: - _instance.SetData(DataTypes.TypeEvent, 1140); + _instance.SetData(DataTypes.Event, 1140); _updateTimer = 3 * Time.InMilliseconds; break; case 1140: @@ -1154,7 +1154,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader temp.SetReactState(ReactStates.Passive); temp.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY() - 10, MiscData.ToCCommonLoc[1].GetPositionZ()); } - _instance.SetData(DataTypes.TypeEvent, 1142); + _instance.SetData(DataTypes.Event, 1142); _updateTimer = 5 * Time.InMilliseconds; break; } @@ -1171,7 +1171,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Creature pPortal = ObjectAccessor.GetCreature(me, _portalGUID); if (pPortal) pPortal.DespawnOrUnsummon(); - _instance.SetData(DataTypes.TypeEvent, 1144); + _instance.SetData(DataTypes.Event, 1144); _updateTimer = 10 * Time.InMilliseconds; break; } @@ -1180,7 +1180,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) temp.GetAI().Talk(Texts.Stage_1_05); - _instance.SetData(DataTypes.TypeEvent, 1150); + _instance.SetData(DataTypes.Event, 1150); _updateTimer = 5 * Time.InMilliseconds; break; } @@ -1195,7 +1195,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader temp.AddThreat(me, 1000.0f); temp.GetAI().AttackStart(me); } - _instance.SetData(DataTypes.TypeEvent, 1160); + _instance.SetData(DataTypes.Event, 1160); _updateTimer = 3 * Time.InMilliseconds; break; } @@ -1203,7 +1203,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } else _updateTimer -= uiDiff; - _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); + _instance.SetData(DataTypes.EventTimer, _updateTimer); } InstanceScript _instance; @@ -1230,25 +1230,25 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (_instance == null) return; - if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Tirion) + if (_instance.GetData(DataTypes.EventNpc) != CreatureIds.Tirion) return; - _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); + _updateTimer = _instance.GetData(DataTypes.EventTimer); if (_updateTimer <= uiDiff) { - switch (_instance.GetData(DataTypes.TypeEvent)) + switch (_instance.GetData(DataTypes.Event)) { case 110: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_01); _updateTimer = 22 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 120); + _instance.SetData(DataTypes.Event, 120); break; case 140: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_02); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 150); + _instance.SetData(DataTypes.Event, 150); break; case 150: { @@ -1266,14 +1266,14 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } } _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 155); + _instance.SetData(DataTypes.Event, 155); break; } case 155: // keep the raid in combat for the whole encounter, pauses included me.SetInCombatWithZone(); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 160); + _instance.SetData(DataTypes.Event, 160); break; case 200: { @@ -1290,11 +1290,11 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } } _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 220); + _instance.SetData(DataTypes.Event, 220); break; } case 220: - _instance.SetData(DataTypes.TypeEvent, 230); + _instance.SetData(DataTypes.Event, 230); break; case 300: { @@ -1311,64 +1311,64 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } } _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 315); + _instance.SetData(DataTypes.Event, 315); break; } case 315: - _instance.SetData(DataTypes.TypeEvent, 320); + _instance.SetData(DataTypes.Event, 320); break; case 400: Talk(Texts.Stage_0_06); me.GetThreatManager().clearReferences(); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 666: Talk(Texts.Stage_0_Wipe); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 1010: Talk(Texts.Stage_1_01); _updateTimer = 7 * Time.InMilliseconds; _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); me.SummonCreature(CreatureIds.Fizzlebang, MiscData.ToCSpawnLoc[0].GetPositionX(), MiscData.ToCSpawnLoc[0].GetPositionY(), MiscData.ToCSpawnLoc[0].GetPositionZ(), 2, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 1180: Talk(Texts.Stage_1_07); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 2000: Talk(Texts.Stage_1_08); _updateTimer = 18 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 2010); + _instance.SetData(DataTypes.Event, 2010); break; case 2030: Talk(Texts.Stage_1_11); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 3000: Talk(Texts.Stage_2_01); _updateTimer = 12 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3050); + _instance.SetData(DataTypes.Event, 3050); break; case 3001: Talk(Texts.Stage_2_01); _updateTimer = 10 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3051); + _instance.SetData(DataTypes.Event, 3051); break; case 3060: Talk(Texts.Stage_2_03); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3070); + _instance.SetData(DataTypes.Event, 3070); break; case 3061: Talk(Texts.Stage_2_03); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3071); + _instance.SetData(DataTypes.Event, 3071); break; //Summoning crusaders case 3091: @@ -1377,7 +1377,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (pChampionController) pChampionController.GetAI().SetData(0, (uint)Team.Horde); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3092); + _instance.SetData(DataTypes.Event, 3092); break; } //Summoning crusaders @@ -1387,7 +1387,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (pChampionController) pChampionController.GetAI().SetData(0, (uint)Team.Alliance); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3092); + _instance.SetData(DataTypes.Event, 3092); break; } case 3092: @@ -1395,19 +1395,19 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Creature pChampionController = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.ChampionsController)); if (pChampionController) pChampionController.GetAI().SetData(1, (uint)EncounterState.NotStarted); - _instance.SetData(DataTypes.TypeEvent, 3095); + _instance.SetData(DataTypes.Event, 3095); break; } //Crusaders battle end case 3100: Talk(Texts.Stage_2_06); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 4000: Talk(Texts.Stage_3_01); _updateTimer = 13 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 4010); + _instance.SetData(DataTypes.Event, 4010); break; case 4010: { @@ -1430,7 +1430,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader temp.SummonCreature(CreatureIds.DarkEssence, MiscData.TwinValkyrsLoc[3].GetPositionX(), MiscData.TwinValkyrsLoc[3].GetPositionY(), MiscData.TwinValkyrsLoc[3].GetPositionZ()); } _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 4015); + _instance.SetData(DataTypes.Event, 4015); break; } case 4015: @@ -1450,38 +1450,38 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader temp.SetVisible(true); } _updateTimer = 10 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 4016); + _instance.SetData(DataTypes.Event, 4016); break; } case 4016: _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); - _instance.SetData(DataTypes.TypeEvent, 4017); + _instance.SetData(DataTypes.Event, 4017); break; case 4040: _updateTimer = 1 * Time.Minute * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 5000); + _instance.SetData(DataTypes.Event, 5000); break; case 5000: Talk(Texts.Stage_4_01); _updateTimer = 10 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 5005); + _instance.SetData(DataTypes.Event, 5005); break; case 5005: _updateTimer = 8 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 5010); + _instance.SetData(DataTypes.Event, 5010); me.SummonCreature(CreatureIds.LichKing, MiscData.ToCCommonLoc[2].GetPositionX(), MiscData.ToCCommonLoc[2].GetPositionY(), MiscData.ToCCommonLoc[2].GetPositionZ(), 5); break; case 5020: Talk(Texts.Stage_4_03); _updateTimer = 1 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 0); + _instance.SetData(DataTypes.Event, 0); break; case 6000: me.SummonCreature(CreatureIds.TirionFordring, MiscData.EndSpawnLoc[0]); me.SummonCreature(CreatureIds.ArgentMage, MiscData.EndSpawnLoc[1]); me.SummonGameObject(GameObjectIds.PortalToDalaran, MiscData.EndSpawnLoc[2], Quaternion.WAxis, 0); _updateTimer = 20 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 6005); + _instance.SetData(DataTypes.Event, 6005); break; case 6005: { @@ -1489,7 +1489,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (tirionFordring) tirionFordring.GetAI().Talk(Texts.Stage_4_06); _updateTimer = 20 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 6010); + _instance.SetData(DataTypes.Event, 6010); break; } case 6010: @@ -1500,15 +1500,15 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader tirionFordring.GetAI().Talk(Texts.Stage_4_07); _updateTimer = 1 * Time.Minute * Time.InMilliseconds; _instance.SetBossState(DataTypes.BossAnubarak, EncounterState.Special); - _instance.SetData(DataTypes.TypeEvent, 6020); + _instance.SetData(DataTypes.Event, 6020); } else - _instance.SetData(DataTypes.TypeEvent, 6030); + _instance.SetData(DataTypes.Event, 6030); break; case 6020: me.DespawnOrUnsummon(); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 6030); + _instance.SetData(DataTypes.Event, 6030); break; default: break; @@ -1516,7 +1516,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } else _updateTimer -= uiDiff; - _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); + _instance.SetData(DataTypes.EventTimer, _updateTimer); } InstanceScript _instance; @@ -1540,49 +1540,49 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (_instance == null) return; - if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Garrosh) + if (_instance.GetData(DataTypes.EventNpc) != CreatureIds.Garrosh) return; - _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); + _updateTimer = _instance.GetData(DataTypes.EventTimer); if (_updateTimer <= uiDiff) { - switch (_instance.GetData(DataTypes.TypeEvent)) + switch (_instance.GetData(DataTypes.Event)) { case 130: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_03h); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 132); + _instance.SetData(DataTypes.Event, 132); break; case 132: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 140); + _instance.SetData(DataTypes.Event, 140); break; case 2010: Talk(Texts.Stage_1_09); _updateTimer = 9 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 2020); + _instance.SetData(DataTypes.Event, 2020); break; case 3050: Talk(Texts.Stage_2_02h); _updateTimer = 15 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3060); + _instance.SetData(DataTypes.Event, 3060); break; case 3070: Talk(Texts.Stage_2_04h); _updateTimer = 6 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3080); + _instance.SetData(DataTypes.Event, 3080); break; case 3081: Talk(Texts.Stage_2_05h); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3091); + _instance.SetData(DataTypes.Event, 3091); break; case 4030: Talk(Texts.Stage_3_03h); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 4040); + _instance.SetData(DataTypes.Event, 4040); break; default: break; @@ -1590,7 +1590,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } else _updateTimer -= uiDiff; - _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); + _instance.SetData(DataTypes.EventTimer, _updateTimer); } InstanceScript _instance; @@ -1614,49 +1614,49 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (_instance == null) return; - if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Varian) + if (_instance.GetData(DataTypes.EventNpc) != CreatureIds.Varian) return; - _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); + _updateTimer = _instance.GetData(DataTypes.EventTimer); if (_updateTimer <= uiDiff) { - switch (_instance.GetData(DataTypes.TypeEvent)) + switch (_instance.GetData(DataTypes.Event)) { case 120: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_03a); _updateTimer = 2 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 122); + _instance.SetData(DataTypes.Event, 122); break; case 122: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 130); + _instance.SetData(DataTypes.Event, 130); break; case 2020: Talk(Texts.Stage_1_10); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 2030); + _instance.SetData(DataTypes.Event, 2030); break; case 3051: Talk(Texts.Stage_2_02a); _updateTimer = 17 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3061); + _instance.SetData(DataTypes.Event, 3061); break; case 3071: Talk(Texts.Stage_2_04a); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3081); + _instance.SetData(DataTypes.Event, 3081); break; case 3080: Talk(Texts.Stage_2_05a); _updateTimer = 3 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 3090); + _instance.SetData(DataTypes.Event, 3090); break; case 4020: Talk(Texts.Stage_3_03a); _updateTimer = 5 * Time.InMilliseconds; - _instance.SetData(DataTypes.TypeEvent, 4040); + _instance.SetData(DataTypes.Event, 4040); break; default: break; @@ -1664,7 +1664,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader } else _updateTimer -= uiDiff; - _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); + _instance.SetData(DataTypes.EventTimer, _updateTimer); } InstanceScript _instance; diff --git a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusaderConst.cs b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusaderConst.cs index 0dc981600..4d80ea1d7 100644 --- a/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusaderConst.cs +++ b/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusaderConst.cs @@ -31,12 +31,12 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public const uint BossAnubarak = 5; public const uint MaxEncounters = 6; - public const uint TypeCounter = 8; - public const uint TypeEvent = 9; + public const uint Counter = 8; + public const uint Event = 9; - public const uint TypeEventTimer = 101; - public const uint TypeEventNpc = 102; - public const uint TypeNorthrendBeasts = 103; + public const uint EventTimer = 101; + public const uint EventNpc = 102; + public const uint NorthrendBeasts = 103; public const uint SnoboldCount = 301; public const uint MistressOfPainCount = 302; @@ -70,7 +70,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Anubarak = 724006 } - struct CreatureIds + public struct CreatureIds { public const uint Barrent = 34816; public const uint Tirion = 34996; @@ -132,7 +132,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public const uint LightEssence = 34568; public const uint Anubarak = 34564; - }; + } struct GameObjectIds {