From b3faf9685aea0ce8813feec032d24b21589981d1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 18 Aug 2019 23:23:18 -0400 Subject: [PATCH] Fix build. (scripts are fixed but most need updated tho) --- Source/Framework/Dynamic/TaskScheduler.cs | 2 +- Source/Game/AI/CoreAI/UnitAI.cs | 2 +- .../Game/Network/Packets/CombatLogPackets.cs | 2 +- .../Karazhan/AttumenMidnight.cs | 458 ++++---- .../EasternKingdoms/Karazhan/Curator.cs | 187 ++-- .../Karazhan/InstanceKarazhan.cs | 410 ++++---- .../EasternKingdoms/Karazhan/Moroes.cs | 12 +- .../EasternKingdoms/Karazhan/OperaEvent.cs | 320 +++--- .../ScarletEnclave/Chapter1.cs | 20 +- Source/Scripts/Kalimdor/ZoneAshenvale.cs | 4 +- .../AzjolNerub/Ahnkahet/BossHeraldVolazj.cs | 8 +- .../Ahnkahet/BossJedogaShadowseeker.cs | 14 +- .../AzjolNerub/Ahnkahet/BossPrinceTaldaram.cs | 4 +- .../AzjolNerub/Ahnkahet/InstanceAhnahet.cs | 8 +- .../AzjolNerub/AzjolNerub/BossAnubarak.cs | 6 +- .../AzjolNerub/AzjolNerub/BossNadronox.cs | 4 +- .../TrialOfTheChampion/GrandChampions.cs | 4 +- .../InstanceTrialOfTheChampion.cs | 8 +- .../TrialOfTheChampion/TrialOfTheChampion.cs | 10 +- .../TrialOfTheCrusader/LordJaraxxus.cs | 12 +- .../TrialOfTheCrusader/NorthrendBeasts.cs | 22 +- .../TrialOfTheCrusader/TrialOfTheCrusader.cs | 44 +- Source/Scripts/Northrend/Dalaran.cs | 2 +- .../Northrend/DraktharonKeep/BossKingDred.cs | 2 +- .../Northrend/DraktharonKeep/BossNovos.cs | 8 +- .../Northrend/DraktharonKeep/BossTrollgore.cs | 2 +- .../ForgeOfSouls/InstanceForgeOfSouls.cs | 8 +- .../FrozenHalls/PitOfSaron/BossKrickAndIck.cs | 2 +- .../Northrend/Gundrak/BossDrakkariColossus.cs | 8 +- Source/Scripts/Northrend/Gundrak/BossEck.cs | 2 +- .../Northrend/Gundrak/InstanceGundrak.cs | 14 +- .../IcecrownCitadel/GunshipBattle.cs | 4 +- .../IcecrownCitadel/IcecrownCitadel.cs | 16 +- .../IcecrownCitadel/IcecrownCitadelConst.cs | 1 + .../InstanceIcecrownCitadel.cs | 10 +- .../IcecrownCitadel/LadyDeathwhisper.cs | 993 +++++++++--------- .../Nexus/EyeOfEternity/EyeOfEternity.cs | 4 +- .../Northrend/Nexus/Nexus/BossKeristrasza.cs | 12 +- .../Nexus/Nexus/BossMagusTelestra.cs | 8 +- .../Northrend/Nexus/Nexus/InstanceNexus.cs | 12 +- .../Northrend/Nexus/Oculus/InstanceOculus.cs | 6 +- .../Northrend/Ulduar/FlameLeviathan.cs | 40 +- Source/Scripts/Northrend/Ulduar/Mimiron.cs | 52 +- Source/Scripts/Northrend/Ulduar/Razorscale.cs | 28 +- .../Northrend/Ulduar/UlduarInstance.cs | 10 +- Source/Scripts/Northrend/Ulduar/Xt002.cs | 35 +- Source/Scripts/Outlands/HellfirePeninsula.cs | 4 +- Source/Scripts/Outlands/Zangarmarsh.cs | 4 +- Source/Scripts/Pets/DeathKinght.cs | 2 +- Source/Scripts/Pets/Hunter.cs | 2 +- Source/Scripts/Spells/Generic.cs | 12 +- Source/Scripts/Spells/Hunter.cs | 2 +- Source/Scripts/Spells/Items.cs | 107 ++ Source/Scripts/Spells/Priest.cs | 2 +- Source/Scripts/Spells/Quest.cs | 8 +- Source/Scripts/Spells/Warlock.cs | 2 +- Source/Scripts/Spells/Warrior.cs | 2 +- Source/Scripts/World/BossEmeraldDragons.cs | 6 +- Source/Scripts/World/GameObjects.cs | 2 +- Source/Scripts/World/ItemScripts.cs | 6 +- Source/Scripts/World/NpcSpecial.cs | 52 +- 61 files changed, 1611 insertions(+), 1442 deletions(-) diff --git a/Source/Framework/Dynamic/TaskScheduler.cs b/Source/Framework/Dynamic/TaskScheduler.cs index b008b4cd7..26fdaed72 100644 --- a/Source/Framework/Dynamic/TaskScheduler.cs +++ b/Source/Framework/Dynamic/TaskScheduler.cs @@ -569,7 +569,7 @@ namespace Framework.Dynamic /// Returns the repeat counter which increases every time the task is repeated. /// /// - uint GetRepeatCounter() + public uint GetRepeatCounter() { return _task._repeated; } diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs index 5b7327e97..e0064e5cc 100644 --- a/Source/Game/AI/CoreAI/UnitAI.cs +++ b/Source/Game/AI/CoreAI/UnitAI.cs @@ -365,7 +365,7 @@ namespace Game.AI public virtual void OnCharmed(bool apply) { } - public virtual void DoAction(int param) { } + public virtual void DoAction(int action) { } public virtual uint GetData(uint id = 0) { return 0; } public virtual void SetData(uint id, uint value) { } public virtual void SetGUID(ObjectGuid guid, int id = 0) { } diff --git a/Source/Game/Network/Packets/CombatLogPackets.cs b/Source/Game/Network/Packets/CombatLogPackets.cs index 8c932761c..ee3bab444 100644 --- a/Source/Game/Network/Packets/CombatLogPackets.cs +++ b/Source/Game/Network/Packets/CombatLogPackets.cs @@ -402,7 +402,7 @@ namespace Game.Network.Packets public int OverEnergize; } - class SpellInstakillLog : ServerPacket + public class SpellInstakillLog : ServerPacket { public SpellInstakillLog() : base(ServerOpcodes.SpellInstakillLog, ConnectionType.Instance) { } diff --git a/Source/Scripts/EasternKingdoms/Karazhan/AttumenMidnight.cs b/Source/Scripts/EasternKingdoms/Karazhan/AttumenMidnight.cs index d704e102f..43792dce2 100644 --- a/Source/Scripts/EasternKingdoms/Karazhan/AttumenMidnight.cs +++ b/Source/Scripts/EasternKingdoms/Karazhan/AttumenMidnight.cs @@ -35,271 +35,339 @@ namespace Scripts.EasternKingdoms.Karazhan.Midnight struct TextIds { - public const uint SayMidnightKill = 0; - public const uint SayAppear = 1; - public const uint SayMount = 2; - public const uint SayKill = 0; - public const uint SayDisarmed = 1; - public const uint SayDeath = 2; - public const uint SayRandom = 3; + public const uint SayRandom = 1; + public const uint SayDisarmed = 2; + public const uint SayMidnightKill = 3; + public const uint SayAppear = 4; + public const uint SayMount = 5; + + public const uint SayDeath = 3; + + // Midnight + public const uint EmoteCallAttumen = 0; + public const uint EmoteMountUp = 1; } struct SpellIds { public const uint Shadowcleave = 29832; public const uint IntangiblePresence = 29833; - public const uint BerserkerCharge = 26561; //Only When Mounted + public const uint SpawnSmoke = 10389; + public const uint Charge = 29847; + + // Midnight + public const uint Knockdown = 29711; + public const uint SummonAttumen = 29714; + public const uint Mount = 29770; + public const uint SummonAttumenMounted = 29799; + } + + enum Phases + { + None, + AttumenEngages, + Mounted } [Script] - public class boss_attumen : ScriptedAI + public class boss_attumen : BossAI { - public boss_attumen(Creature creature) : base(creature) + public boss_attumen(Creature creature) : base(creature, DataTypes.Attumen) { - CleaveTimer = RandomHelper.URand(10000, 15000); - CurseTimer = 30000; - RandomYellTimer = RandomHelper.URand(30000, 60000); //Occasionally yell - ChargeTimer = 20000; - ResetTimer = 0; + Initialize(); + } + + void Initialize() + { + _midnightGUID.Clear(); + _phase = Phases.None; } public override void Reset() { - ResetTimer = 0; - Midnight.Clear(); + Initialize(); + base.Reset(); } public override void EnterEvadeMode(EvadeReason why) { - base.EnterEvadeMode(why); - ResetTimer = 2000; + Creature midnight = ObjectAccessor.GetCreature(me, _midnightGUID); + if (midnight != null) + _DespawnAtEvade(10, midnight); + + me.DespawnOrUnsummon(); } - public override void EnterCombat(Unit who) { } + public override void ScheduleTasks() + { + _scheduler.Schedule(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25), task => + { + DoCastVictim(SpellIds.Shadowcleave); + task.Repeat(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25)); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(25), TimeSpan.FromSeconds(45), task => + { + Unit target = SelectTarget(SelectAggroTarget.Random, 0); + if (target != null) + DoCast(target, SpellIds.IntangiblePresence); + + task.Repeat(TimeSpan.FromSeconds(25), TimeSpan.FromSeconds(45)); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(60), task => + { + Talk(TextIds.SayRandom); + task.Repeat(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(60)); + }); + } + + public override void DamageTaken(Unit attacker, ref uint damage) + { + // Attumen does not die until he mounts Midnight, let health fall to 1 and prevent further damage. + if (damage >= me.GetHealth() && _phase != Phases.Mounted) + damage = (uint)(me.GetHealth() - 1); + + if (_phase == Phases.AttumenEngages && me.HealthBelowPctDamaged(25, damage)) + { + _phase = Phases.None; + + Creature midnight = ObjectAccessor.GetCreature(me, _midnightGUID); + if (midnight != null) + midnight.GetAI().DoCastAOE(SpellIds.Mount, true); + } + } public override void KilledUnit(Unit victim) { Talk(TextIds.SayKill); } + public override void JustSummoned(Creature summon) + { + if (summon.GetEntry() == CreatureIds.AttumenMounted) + { + Creature midnight = ObjectAccessor.GetCreature(me, _midnightGUID); + if (midnight != null) + { + if (midnight.GetHealth() > me.GetHealth()) + summon.SetHealth(midnight.GetHealth()); + else + summon.SetHealth(me.GetHealth()); + + summon.GetAI().DoZoneInCombat(); + summon.GetAI().SetGUID(_midnightGUID, (int)CreatureIds.Midnight); + } + } + + base.JustSummoned(summon); + } + + public override void IsSummonedBy(Unit summoner) + { + if (summoner.GetEntry() == CreatureIds.Midnight) + _phase = Phases.AttumenEngages; + + if (summoner.GetEntry() == CreatureIds.AttumenUnmounted) + { + _phase = Phases.Mounted; + DoCastSelf(SpellIds.SpawnSmoke); + + _scheduler.Schedule(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(25), task => + { + Unit target = null; + var t_list = me.GetThreatManager().getThreatList(); + List target_list = new List(); + + foreach (var itr in t_list) + { + target = Global.ObjAccessor.GetUnit(me, itr.getUnitGuid()); + if (target && !target.IsWithinDist(me, 8.00f, false) && target.IsWithinDist(me, 25.0f, false)) + target_list.Add(target); + + target = null; + } + + if (!target_list.Empty()) + target = target_list.SelectRandom(); + + DoCast(target, SpellIds.Charge); + task.Repeat(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(25)); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(25), TimeSpan.FromSeconds(35), task => + { + DoCastVictim(SpellIds.Knockdown); + task.Repeat(TimeSpan.FromSeconds(25), TimeSpan.FromSeconds(35)); + }); + } + } + public override void JustDied(Unit killer) { Talk(TextIds.SayDeath); - Unit midnight = Global.ObjAccessor.GetUnit(me, Midnight); + Unit midnight = Global.ObjAccessor.GetUnit(me, _midnightGUID); if (midnight) midnight.KillSelf(); + + base.JustDied(killer); + } + + public override void SetGUID(ObjectGuid guid, int id = 0) + { + if (id == CreatureIds.Midnight) + _midnightGUID = guid; } public override void UpdateAI(uint diff) { - if (ResetTimer != 0) - { - if (ResetTimer <= diff) - { - ResetTimer = 0; - Unit pMidnight = Global.ObjAccessor.GetUnit(me, Midnight); - if (pMidnight) - { - pMidnight.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); - pMidnight.SetVisible(true); - } - Midnight.Clear(); - me.SetVisible(false); - me.KillSelf(); - } - else ResetTimer -= diff; - } - - //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() && _phase != Phases.None) return; - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable)) - return; - - if (CleaveTimer <= diff) - { - DoCastVictim(SpellIds.Shadowcleave); - CleaveTimer = RandomHelper.URand(10000, 15000); - } - else CleaveTimer -= diff; - - if (CurseTimer <= diff) - { - DoCastVictim(SpellIds.IntangiblePresence); - CurseTimer = 30000; - } - else CurseTimer -= diff; - - if (RandomYellTimer <= diff) - { - Talk(TextIds.SayRandom); - RandomYellTimer = RandomHelper.URand(30000, 60000); - } - else RandomYellTimer -= diff; - - if (me.GetUInt32Value(UnitFields.DisplayId) == Misc.MountedDisplayid) - { - if (ChargeTimer <= diff) - { - var t_list = me.GetThreatManager().getThreatList(); - List target_list = new List(); - foreach (var hostileRefe in t_list) - { - var unit = Global.ObjAccessor.GetUnit(me, hostileRefe.getUnitGuid()); - if (unit && !unit.IsWithinDist(me, SharedConst.AttackDistance, false)) - target_list.Add(unit); - unit = null; - } - Unit target = null; - if (!target_list.Empty()) - target = target_list.SelectRandom(); - - DoCast(target, SpellIds.BerserkerCharge); - ChargeTimer = 20000; - } - else ChargeTimer -= diff; - } - else - { - if (HealthBelowPct(25)) - { - Creature pMidnight = ObjectAccessor.GetCreature(me, Midnight); - if (pMidnight && pMidnight.IsTypeId(TypeId.Unit)) - { - ((boss_midnight)pMidnight.GetAI()).Mount(me); - me.SetHealth(pMidnight.GetHealth()); - DoResetThreat(); - } - } - } - - DoMeleeAttackIfReady(); + _scheduler.Update(diff, DoMeleeAttackIfReady); } public override void SpellHit(Unit source, SpellInfo spell) { if (spell.Mechanic == Mechanics.Disarm) Talk(TextIds.SayDisarmed); + + if (spell.Id == SpellIds.Mount) + { + Creature midnight = ObjectAccessor.GetCreature(me, _midnightGUID); + if (midnight != null) + { + _phase = Phases.None; + _scheduler.CancelAll(); + + midnight.AttackStop(); + midnight.RemoveAllAttackers(); + midnight.SetReactState(ReactStates.Passive); + midnight.GetMotionMaster().MoveChase(me); + midnight.GetAI().Talk(TextIds.EmoteMountUp); + + me.AttackStop(); + me.RemoveAllAttackers(); + me.SetReactState(ReactStates.Passive); + me.GetMotionMaster().MoveChase(midnight); + Talk(TextIds.SayMount); + + _scheduler.Schedule(TimeSpan.FromSeconds(3), task => + { + Creature midnight1 = ObjectAccessor.GetCreature(me, _midnightGUID); + if (midnight1 != null) + { + if (me.IsWithinMeleeRange(midnight1)) + { + DoCastAOE(SpellIds.SummonAttumenMounted); + me.SetVisible(false); + midnight1.SetVisible(false); + } + else + { + midnight1.GetMotionMaster().MoveChase(me); + me.GetMotionMaster().MoveChase(midnight1); + task.Repeat(TimeSpan.FromSeconds(3)); + } + } + }); + } + } } - public ObjectGuid Midnight; - uint CleaveTimer; - uint CurseTimer; - uint RandomYellTimer; - uint ChargeTimer; //only when mounted - uint ResetTimer; + ObjectGuid _midnightGUID; + Phases _phase; } [Script] - public class boss_midnight : ScriptedAI + public class boss_midnight : BossAI { - public boss_midnight(Creature creature) : base(creature) { } + public boss_midnight(Creature creature) : base(creature, DataTypes.Attumen) + { + Initialize(); + } + + void Initialize() + { + _phase = Phases.None; + } public override void Reset() { - Phase = 1; - Attumen.Clear(); - mountTimer = 0; - - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + Initialize(); + base.Reset(); me.SetVisible(true); + me.SetReactState(ReactStates.Defensive); } - public override void EnterCombat(Unit who) { } + public override void DamageTaken(Unit attacker, ref uint damage) + { + // Midnight never dies, let health fall to 1 and prevent further damage. + if (damage >= me.GetHealth()) + damage = (uint)(me.GetHealth() - 1); + + if (_phase == Phases.None && me.HealthBelowPctDamaged(95, damage)) + { + _phase = Phases.AttumenEngages; + Talk(TextIds.EmoteCallAttumen); + DoCastAOE(SpellIds.SummonAttumen); + } + else if (_phase == Phases.AttumenEngages && me.HealthBelowPctDamaged(25, damage)) + { + _phase = Phases.Mounted; + DoCastAOE(SpellIds.Mount, true); + } + } + + public override void JustSummoned(Creature summon) + { + if (summon.GetEntry() == CreatureIds.AttumenUnmounted) + { + _attumenGUID = summon.GetGUID(); + summon.GetAI().SetGUID(me.GetGUID(), (int)CreatureIds.Midnight); + summon.GetAI().AttackStart(me.GetVictim()); + summon.GetAI().Talk(TextIds.SayAppear); + } + + base.JustSummoned(summon); + } + + public override void EnterCombat(Unit who) + { + base.EnterCombat(who); + + _scheduler.Schedule(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25), task => + { + DoCastVictim(SpellIds.Knockdown); + task.Repeat(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(25)); + }); + } + + public override void EnterEvadeMode(EvadeReason why = EvadeReason.Other) + { + base._DespawnAtEvade(10); + } public override void KilledUnit(Unit victim) { - if (Phase == 2) + if (_phase == Phases.AttumenEngages) { - Unit unit = Global.ObjAccessor.GetUnit(me, Attumen); - if (unit) + Unit unit = Global.ObjAccessor.GetUnit(me, _attumenGUID); + if (unit != null) Talk(TextIds.SayMidnightKill, unit); } } public override void UpdateAI(uint diff) { - if (!UpdateVictim()) + if (!UpdateVictim() || _phase == Phases.Mounted) return; - if (Phase == 1 && HealthBelowPct(95)) - { - Phase = 2; - Creature attumen = me.SummonCreature(Misc.SummonAttumen, 0.0f, 0.0f, 0.0f, 0.0f, TempSummonType.TimedOrDeadDespawn, 30000); - if (attumen) - { - Attumen = attumen.GetGUID(); - attumen.GetAI().AttackStart(me.GetVictim()); - SetMidnight(attumen, me.GetGUID()); - Talk(TextIds.SayAppear, attumen); - } - } - else if (Phase == 2 && HealthBelowPct(25)) - { - Unit pAttumen = Global.ObjAccessor.GetUnit(me, Attumen); - if (pAttumen) - Mount(pAttumen); - } - else if (Phase == 3) - { - if (mountTimer != 0) - { - if (mountTimer <= diff) - { - mountTimer = 0; - me.SetVisible(false); - me.GetMotionMaster().MoveIdle(); - Unit pAttumen = Global.ObjAccessor.GetUnit(me, Attumen); - if (pAttumen) - { - pAttumen.SetDisplayId(Misc.MountedDisplayid); - pAttumen.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); - if (pAttumen.GetVictim()) - { - pAttumen.GetMotionMaster().MoveChase(pAttumen.GetVictim()); - pAttumen.SetTarget(pAttumen.GetVictim().GetGUID()); - } - pAttumen.SetObjectScale(1); - } - } - else mountTimer -= diff; - } - } - - if (Phase != 3) - DoMeleeAttackIfReady(); + _scheduler.Update(diff, DoMeleeAttackIfReady); } - public void Mount(Unit pAttumen) - { - Talk(TextIds.SayMount, pAttumen); - Phase = 3; - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); - pAttumen.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); - float angle = me.GetAngle(pAttumen); - float distance = me.GetDistance2d(pAttumen); - float newX = me.GetPositionX() + (float)Math.Cos(angle) * (distance / 2); - float newY = me.GetPositionY() + (float)Math.Sin(angle) * (distance / 2); - float newZ = 50; - me.GetMotionMaster().Clear(); - me.GetMotionMaster().MovePoint(0, newX, newY, newZ); - distance += 10; - newX = me.GetPositionX() + (float)Math.Cos(angle) * (distance / 2); - newY = me.GetPositionY() + (float)Math.Sin(angle) * (distance / 2); - pAttumen.GetMotionMaster().Clear(); - pAttumen.GetMotionMaster().MovePoint(0, newX, newY, newZ); - mountTimer = 1000; - } - - void SetMidnight(Creature pAttumen, ObjectGuid value) - { - ((boss_attumen)pAttumen.GetAI()).Midnight = value; - } - - ObjectGuid Attumen; - byte Phase; - uint mountTimer; + ObjectGuid _attumenGUID; + Phases _phase; } } diff --git a/Source/Scripts/EasternKingdoms/Karazhan/Curator.cs b/Source/Scripts/EasternKingdoms/Karazhan/Curator.cs index e54d7c723..abc46fa89 100644 --- a/Source/Scripts/EasternKingdoms/Karazhan/Curator.cs +++ b/Source/Scripts/EasternKingdoms/Karazhan/Curator.cs @@ -35,124 +35,135 @@ namespace Scripts.EasternKingdoms.Karazhan.Curator struct SpellIds { - //Flare spell info - public const uint AstralFlarePassive = 30234; //Visual effect + Flare damage - - //Curator spell info public const uint HatefulBolt = 30383; public const uint Evocation = 30254; - public const uint Enrage = 30403; //Arcane Infusion: Transforms Curator and adds damage. + public const uint ArcaneInfusion = 30403; public const uint Berserk = 26662; + public const uint SummonAstralFlareNE = 30236; + public const uint SummonAstralFlareNW = 30239; + public const uint SummonAstralFlareSE = 30240; + public const uint SummonAstralFlareSW = 30241; + } + + struct EventIds + { + public const uint HatefulBolt = 1; + public const uint SummonAstralFlare = 2; + public const uint ArcaneInfusion = 3; + public const uint Berserk = 4; } [Script] - class boss_curator : ScriptedAI + class boss_curator : BossAI { - public boss_curator(Creature creature) : base(creature) - { - Initialize(); - } - - void Initialize() - { - _scheduler.Schedule(TimeSpan.FromSeconds(10), task => - { - //Summon Astral Flare - Creature AstralFlare = DoSpawnCreature(17096, RandomHelper.Rand32() % 37, RandomHelper.Rand32() % 37, 0, 0, TempSummonType.TimedDespawnOOC, 5000); - Unit target = SelectTarget(SelectAggroTarget.Random, 0); - - if (AstralFlare && target) - { - AstralFlare.CastSpell(AstralFlare, SpellIds.AstralFlarePassive, false); - AstralFlare.GetAI().AttackStart(target); - } - - //Reduce Mana by 10% of max health - int mana = me.GetMaxPower(PowerType.Mana); - if (mana != 0) - { - mana /= 10; - me.ModifyPower(PowerType.Mana, -mana); - - //if this get's us below 10%, then we evocate (the 10th should be summoned now) - if (me.GetPower(PowerType.Mana) * 100 / me.GetMaxPower(PowerType.Mana) < 10) - { - Talk(TextIds.SayEvocate); - me.InterruptNonMeleeSpells(false); - DoCast(me, SpellIds.Evocation); - _scheduler.DelayAll(TimeSpan.FromSeconds(20)); - //Evocating = true; - //no AddTimer cooldown, this will make first flare appear instantly after evocate end, like expected - return; - } - else - { - if (RandomHelper.URand(0, 1) == 0) - { - Talk(TextIds.SaySummon); - } - } - } - - task.Repeat(); - }); - - _scheduler.Schedule(TimeSpan.FromSeconds(15), task => - { - if (Enraged) - task.Repeat(TimeSpan.FromSeconds(7)); - else - task.Repeat(); - - Unit target = SelectTarget(SelectAggroTarget.TopAggro, 1); - if (target) - DoCast(target, SpellIds.HatefulBolt); - }); - - Enraged = false; - } + public boss_curator(Creature creature) : base(creature, DataTypes.Curator) { } public override void Reset() { - Initialize(); - + _Reset(); + _infused = false; me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Arcane, true); } public override void KilledUnit(Unit victim) { - Talk(TextIds.SayKill); + if (victim.GetTypeId() == TypeId.Player) + Talk(TextIds.SayKill); } public override void JustDied(Unit killer) { + _JustDied(); Talk(TextIds.SayDeath); } public override void EnterCombat(Unit victim) { + _EnterCombat(); Talk(TextIds.SayAggro); + + _events.ScheduleEvent(EventIds.HatefulBolt, TimeSpan.FromSeconds(12)); + _events.ScheduleEvent(EventIds.SummonAstralFlare, TimeSpan.FromSeconds(10)); + _events.ScheduleEvent(EventIds.Berserk, TimeSpan.FromMinutes(12)); + } + + public override void DamageTaken(Unit attacker, ref uint damage) + { + if (!HealthAbovePct(15) && !_infused) + { + _infused = true; + _events.ScheduleEvent(EventIds.ArcaneInfusion, TimeSpan.FromMilliseconds(1)); + _events.CancelEvent(EventIds.SummonAstralFlare); + } + } + + public override void ExecuteEvent(uint eventId) + { + switch (eventId) + { + case EventIds.HatefulBolt: + Unit target = SelectTarget(SelectAggroTarget.TopAggro, 1); + if (target != null) + DoCast(target, SpellIds.HatefulBolt); + _events.Repeat(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(15)); + break; + case EventIds.ArcaneInfusion: + DoCastSelf(SpellIds.ArcaneInfusion, true); + break; + case EventIds.SummonAstralFlare: + if (RandomHelper.randChance(50)) + Talk(TextIds.SaySummon); + + + DoCastSelf(RandomHelper.RAND(SpellIds.SummonAstralFlareNE, SpellIds.SummonAstralFlareNW, SpellIds.SummonAstralFlareSE, SpellIds.SummonAstralFlareSW), true); + + int mana = me.GetMaxPower(PowerType.Mana) / 10; + if (mana != 0) + { + me.ModifyPower(PowerType.Mana, -mana); + + if (me.GetPower(PowerType.Mana) * 100 / me.GetMaxPower(PowerType.Mana) < 10) + { + Talk(TextIds.SayEvocate); + me.InterruptNonMeleeSpells(false); + DoCastSelf(SpellIds.Evocation); + } + } + _events.Repeat(TimeSpan.FromSeconds(10)); + break; + case EventIds.Berserk: + Talk(TextIds.SayEnrage); + DoCastSelf(SpellIds.Berserk, true); + break; + default: + break; + } + } + + bool _infused; + } + + [Script] + class npc_curator_astral_flareAI : ScriptedAI + { + public npc_curator_astral_flareAI(Creature creature) : base(creature) + { + me.SetReactState(ReactStates.Passive); + } + + public override void Reset() + { + _scheduler.Schedule(TimeSpan.FromSeconds(2), task => + { + me.SetReactState(ReactStates.Aggressive); + me.RemoveUnitFlag(UnitFlags.NotSelectable); + DoZoneInCombat(); + }); } public override void UpdateAI(uint diff) { - if (!UpdateVictim()) - return; - _scheduler.Update(diff); - - if (!Enraged) - { - if (!HealthAbovePct(15)) - { - Enraged = true; - DoCast(me, SpellIds.Enrage); - Talk(TextIds.SayEnrage); - } - } - } - - bool Enraged; } } diff --git a/Source/Scripts/EasternKingdoms/Karazhan/InstanceKarazhan.cs b/Source/Scripts/EasternKingdoms/Karazhan/InstanceKarazhan.cs index d8cb9692f..6f233f8df 100644 --- a/Source/Scripts/EasternKingdoms/Karazhan/InstanceKarazhan.cs +++ b/Source/Scripts/EasternKingdoms/Karazhan/InstanceKarazhan.cs @@ -28,19 +28,6 @@ namespace Scripts.EasternKingdoms.Karazhan { public const uint MaxEncounter = 12; - public const uint BossAttumen = 1; - public const uint BossMoroes = 2; - public const uint BossMaiden = 3; - public const uint OptionalBoss = 4; - public const uint BossOpera = 5; - public const uint Curator = 6; - public const uint Aran = 7; - public const uint Terestian = 8; - public const uint Netherspite = 9; - public const uint Chess = 10; - public const uint Malchezzar = 11; - public const uint Nightbane = 12; - public static Dialogue[] OzDialogue = { new Dialogue(0, 6000), @@ -108,6 +95,15 @@ namespace Scripts.EasternKingdoms.Karazhan public const uint NpcArcanagos = 17652; public const uint NpcSpotlight = 19525; + + public static Position[] OptionalSpawn = + { + new Position(-10960.981445f, -1940.138428f, 46.178097f, 4.12f), // Hyakiss the Lurker + new Position(-10945.769531f, -2040.153320f, 49.474438f, 0.077f), // Shadikith the Glider + new Position(-10899.903320f, -2085.573730f, 49.474449f, 1.38f) // Rokad the Ravager + }; + + public const uint OptionalBossRequiredDeathCount = 50; } struct Dialogue @@ -124,12 +120,22 @@ namespace Scripts.EasternKingdoms.Karazhan struct DataTypes { - public const uint OperaPerformance = 13; + public const uint Attumen = 1; + public const uint Moroes = 2; + public const uint MaidenOfVirtue = 3; + public const uint OptionalBoss = 4; + public const uint OperaPerformance = 5; + public const uint Curator = 6; + public const uint Aran = 7; + public const uint Terestian = 8; + public const uint Netherspite = 9; + public const uint Chess = 10; + public const uint Malchezzar = 11; + public const uint Nightbane = 12; + public const uint OperaOzDeathcount = 14; public const uint Kilrek = 15; - public const uint Terestian = 16; - public const uint Moroes = 17; public const uint GoCurtains = 18; public const uint GoStagedoorleft = 19; public const uint GoStagedoorright = 20; @@ -143,6 +149,7 @@ namespace Scripts.EasternKingdoms.Karazhan public const uint MastersTerraceDoor1 = 27; public const uint MastersTerraceDoor2 = 28; public const uint GoSideEntranceDoor = 29; + public const uint GoBlackenedUrn = 30; } struct OperaEvents @@ -152,6 +159,47 @@ namespace Scripts.EasternKingdoms.Karazhan public const uint RAJ = 3; } + struct CreatureIds + { + public const uint HyakissTheLurker = 16179; + public const uint RokadTheRavager = 16181; + public const uint ShadikithTheGlider = 16180; + public const uint TerestianIllhoof = 15688; + public const uint Moroes = 15687; + public const uint Nightbane = 17225; + public const uint AttumenUnmounted = 15550; + public const uint AttumenMounted = 16152; + public const uint Midnight = 16151; + + // Trash + public const uint ColdmistWidow = 16171; + public const uint ColdmistStalker = 16170; + public const uint Shadowbat = 16173; + public const uint VampiricShadowbat = 16175; + public const uint GreaterShadowbat = 16174; + public const uint PhaseHound = 16178; + public const uint Dreadbeast = 16177; + public const uint Shadowbeast = 16176; + public const uint Kilrek = 17229; + } + + struct GameObjectIds + { + public const uint StageCurtain = 183932; + public const uint StageDoorLeft = 184278; + public const uint StageDoorRight = 184279; + public const uint PrivateLibraryDoor = 184517; + public const uint MassiveDoor = 185521; + public const uint GamesmanHallDoor = 184276; + public const uint GamesmanHallExitDoor = 184277; + public const uint NetherspaceDoor = 185134; + public const uint MastersTerraceDoor = 184274; + public const uint MastersTerraceDoor2 = 184280; + public const uint SideEntranceDoor = 184275; + public const uint DustCoveredChest = 185119; + public const uint BlackenedUrn = 194092; + } + [Script] public class instance_karazhan : InstanceMapScript { @@ -162,33 +210,70 @@ namespace Scripts.EasternKingdoms.Karazhan public instance_karazhan_InstanceMapScript(InstanceMap map) : base(map) { SetHeaders("KZ"); + SetBossNumber(karazhanConst.MaxEncounter); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered. - m_uiOperaEvent = RandomHelper.URand(1, 3); - m_uiOzDeathCount = 0; - } - - public override bool IsEncounterInProgress() - { - for (byte i = 0; i < karazhanConst.MaxEncounter; ++i) - if (m_auiEncounter[i] == (uint)EncounterState.InProgress) - return true; - - return false; + OperaEvent = RandomHelper.URand(1, 3); + OzDeathCount = 0; + OptionalBossCount = 0; } public override void OnCreatureCreate(Creature creature) { switch (creature.GetEntry()) { - case 17229: - m_uiKilrekGUID = creature.GetGUID(); + case CreatureIds.Kilrek: + KilrekGUID = creature.GetGUID(); break; - case 15688: - m_uiTerestianGUID = creature.GetGUID(); + case CreatureIds.TerestianIllhoof: + TerestianGUID = creature.GetGUID(); break; - case 15687: - m_uiMoroesGUID = creature.GetGUID(); + case CreatureIds.Moroes: + MoroesGUID = creature.GetGUID(); + break; + case CreatureIds.Nightbane: + NightbaneGUID = creature.GetGUID(); + break; + } + } + + public override void OnUnitDeath(Unit unit) + { + Creature creature = unit.ToCreature(); + if (creature == null) + return; + + switch (creature.GetEntry()) + { + case CreatureIds.ColdmistWidow: + case CreatureIds.ColdmistStalker: + case CreatureIds.Shadowbat: + case CreatureIds.VampiricShadowbat: + case CreatureIds.GreaterShadowbat: + case CreatureIds.PhaseHound: + case CreatureIds.Dreadbeast: + case CreatureIds.Shadowbeast: + if (GetBossState(DataTypes.OptionalBoss) == EncounterState.ToBeDecided) + { + ++OptionalBossCount; + if (OptionalBossCount == karazhanConst.OptionalBossRequiredDeathCount) + { + switch (RandomHelper.URand(CreatureIds.HyakissTheLurker, CreatureIds.RokadTheRavager)) + { + case CreatureIds.HyakissTheLurker: + instance.SummonCreature(CreatureIds.HyakissTheLurker, karazhanConst.OptionalSpawn[0]); + break; + case CreatureIds.ShadikithTheGlider: + instance.SummonCreature(CreatureIds.ShadikithTheGlider, karazhanConst.OptionalSpawn[1]); + break; + case CreatureIds.RokadTheRavager: + instance.SummonCreature(CreatureIds.RokadTheRavager, karazhanConst.OptionalSpawn[2]); + break; + } + } + } + break; + default: break; } } @@ -197,67 +282,42 @@ namespace Scripts.EasternKingdoms.Karazhan { switch (type) { - case karazhanConst.BossAttumen: - m_auiEncounter[0] = uiData; - break; - case karazhanConst.BossMoroes: - if (m_auiEncounter[1] == (uint)EncounterState.Done) - break; - m_auiEncounter[1] = uiData; - break; - case karazhanConst.BossMaiden: - m_auiEncounter[2] = uiData; - break; - case karazhanConst.OptionalBoss: - m_auiEncounter[3] = uiData; - break; - case karazhanConst.BossOpera: - m_auiEncounter[4] = uiData; - if (uiData == (uint)EncounterState.Done) - UpdateEncounterStateForKilledCreature(16812, null); - break; - case karazhanConst.Curator: - m_auiEncounter[5] = uiData; - break; - case karazhanConst.Aran: - m_auiEncounter[6] = uiData; - break; - case karazhanConst.Terestian: - m_auiEncounter[7] = uiData; - break; - case karazhanConst.Netherspite: - m_auiEncounter[8] = uiData; - break; - case karazhanConst.Chess: - if (uiData == (uint)EncounterState.Done) - DoRespawnGameObject(DustCoveredChest, Time.Day); - m_auiEncounter[9] = uiData; - break; - case karazhanConst.Malchezzar: - m_auiEncounter[10] = uiData; - break; - case karazhanConst.Nightbane: - if (m_auiEncounter[11] != (uint)EncounterState.Done) - m_auiEncounter[11] = uiData; - break; case DataTypes.OperaOzDeathcount: if (uiData == (uint)EncounterState.Special) - ++m_uiOzDeathCount; + ++OzDeathCount; else if (uiData == (uint)EncounterState.InProgress) - m_uiOzDeathCount = 0; + OzDeathCount = 0; + break; + } + } + + public override bool SetBossState(uint id, EncounterState state) + { + if (!base.SetBossState(id, state)) + return false; + + switch (id) + { + case DataTypes.OperaPerformance: + if (state == EncounterState.Done) + { + HandleGameObject(StageDoorLeftGUID, true); + HandleGameObject(StageDoorRightGUID, true); + GameObject sideEntrance = instance.GetGameObject(SideEntranceDoor); + if (sideEntrance != null) + sideEntrance.RemoveFlag(GameObjectFlags.Locked); + UpdateEncounterStateForKilledCreature(16812, null); + } + break; + case DataTypes.Chess: + if (state == EncounterState.Done) + DoRespawnGameObject(DustCoveredChest, Time.Day); + break; + default: break; } - if (uiData == (uint)EncounterState.Done) - { - OUT_SAVE_INST_DATA(); - - strSaveData = - $"{m_auiEncounter[0]} {m_auiEncounter[1]} {m_auiEncounter[2]} {m_auiEncounter[3]} {m_auiEncounter[4]} {m_auiEncounter[5]} {m_auiEncounter[6]} {m_auiEncounter[7]} {m_auiEncounter[8]} {m_auiEncounter[9]} {m_auiEncounter[10]} {m_auiEncounter[11]}"; - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE(); - } + return true; } public override void SetGuidData(uint identifier, ObjectGuid data) @@ -270,53 +330,56 @@ namespace Scripts.EasternKingdoms.Karazhan { switch (go.GetEntry()) { - case 183932: - m_uiCurtainGUID = go.GetGUID(); + case GameObjectIds.StageCurtain: + CurtainGUID = go.GetGUID(); break; - case 184278: - m_uiStageDoorLeftGUID = go.GetGUID(); - if (m_auiEncounter[4] == (uint)EncounterState.Done) + case GameObjectIds.StageDoorLeft: + StageDoorLeftGUID = go.GetGUID(); + if (GetBossState(DataTypes.OperaPerformance) == EncounterState.Done) go.SetGoState(GameObjectState.Active); break; - case 184279: - m_uiStageDoorRightGUID = go.GetGUID(); - if (m_auiEncounter[4] == (uint)EncounterState.Done) + case GameObjectIds.StageDoorRight: + StageDoorRightGUID = go.GetGUID(); + if (GetBossState(DataTypes.OperaPerformance) == EncounterState.Done) go.SetGoState(GameObjectState.Active); break; - case 184517: - m_uiLibraryDoor = go.GetGUID(); + case GameObjectIds.PrivateLibraryDoor: + LibraryDoor = go.GetGUID(); break; - case 185521: - m_uiMassiveDoor = go.GetGUID(); + case GameObjectIds.MassiveDoor: + MassiveDoor = go.GetGUID(); break; - case 184276: - m_uiGamesmansDoor = go.GetGUID(); + case GameObjectIds.GamesmanHallDoor: + GamesmansDoor = go.GetGUID(); break; - case 184277: - m_uiGamesmansExitDoor = go.GetGUID(); + case GameObjectIds.GamesmanHallExitDoor: + GamesmansExitDoor = go.GetGUID(); break; - case 185134: - m_uiNetherspaceDoor = go.GetGUID(); + case GameObjectIds.NetherspaceDoor: + NetherspaceDoor = go.GetGUID(); break; - case 184274: + case GameObjectIds.MastersTerraceDoor: MastersTerraceDoor[0] = go.GetGUID(); break; - case 184280: + case GameObjectIds.MastersTerraceDoor2: MastersTerraceDoor[1] = go.GetGUID(); break; - case 184275: - m_uiSideEntranceDoor = go.GetGUID(); - if (m_auiEncounter[4] == (uint)EncounterState.Done) - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + case GameObjectIds.SideEntranceDoor: + SideEntranceDoor = go.GetGUID(); + if (GetBossState(DataTypes.OperaPerformance) == EncounterState.Done) + go.AddFlag(GameObjectFlags.Locked); else - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + go.RemoveFlag(GameObjectFlags.Locked); break; - case 185119: + case GameObjectIds.DustCoveredChest: DustCoveredChest = go.GetGUID(); break; + case GameObjectIds.BlackenedUrn: + BlackenedUrnGUID = go.GetGUID(); + break; } - switch (m_uiOperaEvent) + switch (OperaEvent) { // @todo Set Object visibilities for Opera based on performance case OperaEvents.Oz: @@ -330,43 +393,14 @@ namespace Scripts.EasternKingdoms.Karazhan } } - public override string GetSaveData() - { - return strSaveData; - } - public override uint GetData(uint uiData) { switch (uiData) { - case karazhanConst.BossAttumen: - return m_auiEncounter[0]; - case karazhanConst.BossMoroes: - return m_auiEncounter[1]; - case karazhanConst.BossMaiden: - return m_auiEncounter[2]; - case karazhanConst.OptionalBoss: - return m_auiEncounter[3]; - case karazhanConst.BossOpera: - return m_auiEncounter[4]; - case karazhanConst.Curator: - return m_auiEncounter[5]; - case karazhanConst.Aran: - return m_auiEncounter[6]; - case karazhanConst.Terestian: - return m_auiEncounter[7]; - case karazhanConst.Netherspite: - return m_auiEncounter[8]; - case karazhanConst.Chess: - return m_auiEncounter[9]; - case karazhanConst.Malchezzar: - return m_auiEncounter[10]; - case karazhanConst.Nightbane: - return m_auiEncounter[11]; case DataTypes.OperaPerformance: - return m_uiOperaEvent; + return OperaEvent; case DataTypes.OperaOzDeathcount: - return m_uiOzDeathCount; + return OzDeathCount; } return 0; @@ -377,82 +411,64 @@ namespace Scripts.EasternKingdoms.Karazhan switch (uiData) { case DataTypes.Kilrek: - return m_uiKilrekGUID; + return KilrekGUID; case DataTypes.Terestian: - return m_uiTerestianGUID; + return TerestianGUID; case DataTypes.Moroes: - return m_uiMoroesGUID; + return MoroesGUID; + case DataTypes.Nightbane: + return NightbaneGUID; case DataTypes.GoStagedoorleft: - return m_uiStageDoorLeftGUID; + return StageDoorLeftGUID; case DataTypes.GoStagedoorright: - return m_uiStageDoorRightGUID; + return StageDoorRightGUID; case DataTypes.GoCurtains: - return m_uiCurtainGUID; + return CurtainGUID; case DataTypes.GoLibraryDoor: - return m_uiLibraryDoor; + return LibraryDoor; case DataTypes.GoMassiveDoor: - return m_uiMassiveDoor; + return MassiveDoor; case DataTypes.GoSideEntranceDoor: - return m_uiSideEntranceDoor; + return SideEntranceDoor; case DataTypes.GoGameDoor: - return m_uiGamesmansDoor; + return GamesmansDoor; case DataTypes.GoGameExitDoor: - return m_uiGamesmansExitDoor; + return GamesmansExitDoor; case DataTypes.GoNetherDoor: - return m_uiNetherspaceDoor; + return NetherspaceDoor; case DataTypes.MastersTerraceDoor1: return MastersTerraceDoor[0]; case DataTypes.MastersTerraceDoor2: return MastersTerraceDoor[1]; case DataTypes.ImageOfMedivh: return ImageGUID; + case DataTypes.GoBlackenedUrn: + return BlackenedUrnGUID; } return ObjectGuid.Empty; } - public override void Load(string str) - { - if (string.IsNullOrEmpty(str)) - { - OUT_LOAD_INST_DATA_FAIL(); - return; - } - - OUT_LOAD_INST_DATA(str); - StringArguments loadStream = new StringArguments(str); - - for (byte i = 0; i < karazhanConst.MaxEncounter; ++i) - { - var state = (EncounterState)loadStream.NextUInt32(); - // Do not load an encounter as "In Progress" - reset it instead. - m_auiEncounter[i] = (uint)(state == EncounterState.InProgress ? EncounterState.NotStarted : state); - } - - OUT_LOAD_INST_DATA_COMPLETE(); - } - - uint[] m_auiEncounter = new uint[karazhanConst.MaxEncounter]; - string strSaveData; - - uint m_uiOperaEvent; - uint m_uiOzDeathCount; - - ObjectGuid m_uiCurtainGUID; - ObjectGuid m_uiStageDoorLeftGUID; - ObjectGuid m_uiStageDoorRightGUID; - ObjectGuid m_uiKilrekGUID; - ObjectGuid m_uiTerestianGUID; - ObjectGuid m_uiMoroesGUID; - ObjectGuid m_uiLibraryDoor; // Door at Shade of Aran - ObjectGuid m_uiMassiveDoor; // Door at Netherspite - ObjectGuid m_uiSideEntranceDoor; // Side Entrance - ObjectGuid m_uiGamesmansDoor; // Door before Chess - ObjectGuid m_uiGamesmansExitDoor; // Door after Chess - ObjectGuid m_uiNetherspaceDoor; // Door at Malchezaar + uint OperaEvent; + uint OzDeathCount; + uint OptionalBossCount; + ObjectGuid CurtainGUID; + ObjectGuid StageDoorLeftGUID; + ObjectGuid StageDoorRightGUID; + ObjectGuid KilrekGUID; + ObjectGuid TerestianGUID; + ObjectGuid MoroesGUID; + ObjectGuid NightbaneGUID; + ObjectGuid LibraryDoor; // Door at Shade of Aran + ObjectGuid MassiveDoor; // Door at Netherspite + ObjectGuid SideEntranceDoor; // Side Entrance + ObjectGuid GamesmansDoor; // Door before Chess + ObjectGuid GamesmansExitDoor; // Door after Chess + ObjectGuid NetherspaceDoor; // Door at Malchezaar ObjectGuid[] MastersTerraceDoor = new ObjectGuid[2]; ObjectGuid ImageGUID; ObjectGuid DustCoveredChest; + ObjectGuid BlackenedUrnGUID; } public override InstanceScript GetInstanceScript(InstanceMap map) diff --git a/Source/Scripts/EasternKingdoms/Karazhan/Moroes.cs b/Source/Scripts/EasternKingdoms/Karazhan/Moroes.cs index cfa59728c..a8cafa6a0 100644 --- a/Source/Scripts/EasternKingdoms/Karazhan/Moroes.cs +++ b/Source/Scripts/EasternKingdoms/Karazhan/Moroes.cs @@ -112,12 +112,12 @@ namespace Scripts.EasternKingdoms.Karazhan.Moroes if (me.IsAlive()) SpawnAdds(); - instance.SetData(karazhanConst.BossMoroes, (uint)EncounterState.NotStarted); + instance.SetBossState(DataTypes.Moroes, EncounterState.NotStarted); } void StartEvent() { - instance.SetData(karazhanConst.BossMoroes, (uint)EncounterState.InProgress); + instance.SetBossState(DataTypes.Moroes, EncounterState.InProgress); DoZoneInCombat(); } @@ -140,7 +140,7 @@ namespace Scripts.EasternKingdoms.Karazhan.Moroes { Talk(TextIds.Death); - instance.SetData(karazhanConst.BossMoroes, (uint)EncounterState.Done); + instance.SetBossState(DataTypes.Moroes, EncounterState.Done); DeSpawnAdds(); @@ -229,7 +229,7 @@ namespace Scripts.EasternKingdoms.Karazhan.Moroes if (!UpdateVictim()) return; - if (instance.GetData(karazhanConst.BossMoroes) == 0) + if (instance.GetData(DataTypes.Moroes) == 0) { EnterEvadeMode(); return; @@ -338,7 +338,7 @@ namespace Scripts.EasternKingdoms.Karazhan.Moroes public override void Reset() { - instance.SetData(karazhanConst.BossMoroes, (uint)EncounterState.NotStarted); + instance.SetBossState(DataTypes.Moroes, EncounterState.NotStarted); } public void AcquireGUID() @@ -371,7 +371,7 @@ namespace Scripts.EasternKingdoms.Karazhan.Moroes public override void UpdateAI(uint diff) { - if (instance.GetData(karazhanConst.BossMoroes) == 0) + if (instance.GetData(DataTypes.Moroes) == 0) EnterEvadeMode(); DoMeleeAttackIfReady(); diff --git a/Source/Scripts/EasternKingdoms/Karazhan/OperaEvent.cs b/Source/Scripts/EasternKingdoms/Karazhan/OperaEvent.cs index 731d30761..3f05b6922 100644 --- a/Source/Scripts/EasternKingdoms/Karazhan/OperaEvent.cs +++ b/Source/Scripts/EasternKingdoms/Karazhan/OperaEvent.cs @@ -25,8 +25,7 @@ using System.Collections.Generic; namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { - #region Wizard of Oz - struct WizardOfOz + struct TextIds { public const uint SayDorotheeDeath = 0; public const uint SayDorotheeSummon = 1; @@ -49,52 +48,70 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public const uint SayCroneAggro = 0; public const uint SayCroneDeath = 1; public const uint SayCroneSlay = 2; - - // Dorothee - public const uint SpellWaterbolt = 31012; - public const uint SpellScream = 31013; - public const uint SpellSummontito = 31014; - - // Tito - public const uint SpellYipping = 31015; - - // Strawman - public const uint SpellBrainBash = 31046; - public const uint SpellBrainWipe = 31069; - public const uint SpellBurningStraw = 31075; - - // Tinhead - public const uint SpellCleave = 31043; - public const uint SpellRust = 31086; - - // Roar - public const uint SpellMangle = 31041; - public const uint SpellShred = 31042; - public const uint SpellFrightenedScream = 31013; - - // Crone - public const uint SpellChainLightning = 32337; - - // Cyclone - public const uint SpellKnockback = 32334; - public const uint SpellCycloneVisual = 32332; - - public const uint NpcTito = 17548; - public const uint NpcCyclone = 18412; - public const uint NpcCrone = 18168; } - public class WizardofOzBase : ScriptedAI + struct SpellIds { - public WizardofOzBase(Creature creature) : base(creature) { } + // Dorothee + public const uint Waterbolt = 31012; + public const uint Scream = 31013; + public const uint Summontito = 31014; + + // Tito + public const uint Yipping = 31015; + + // Strawman + public const uint BrainBash = 31046; + public const uint BrainWipe = 31069; + public const uint BurningStraw = 31075; + + // Tinhead + public const uint Cleave = 31043; + public const uint Rust = 31086; + + // Roar + public const uint Mangle = 31041; + public const uint Shred = 31042; + public const uint FrightenedScream = 31013; + + // Crone + public const uint ChainLightning = 32337; + + // Cyclone + public const uint Knockback = 32334; + public const uint CycloneVisual = 32332; + } + + struct CreatureIds + { + public const uint Tito = 17548; + public const uint Cyclone = 18412; + public const uint Crone = 18168; + } + + #region Wizard of Oz + public abstract class WizardofOzBase : ScriptedAI + { + public WizardofOzBase(Creature creature) : base(creature) + { + Initialize(); + instance = creature.GetInstanceScript(); + } + + public abstract void Initialize(); + + public override void Reset() + { + Initialize(); + } public void SummonCroneIfReady(InstanceScript instance, Creature creature) { - instance.SetData(DataTypes.OperaOzDeathcount, (uint)EncounterState.Special); // Increment DeathCount + instance.SetBossState(DataTypes.OperaOzDeathcount, EncounterState.Special); // Increment DeathCount if (instance.GetData(DataTypes.OperaOzDeathcount) == 4) { - Creature pCrone = creature.SummonCreature(WizardOfOz.NpcCrone, -10891.96f, -1755.95f, creature.GetPositionZ(), 4.64f, TempSummonType.TimedOrDeadDespawn, Time.Hour * 2 * Time.InMilliseconds); + Creature pCrone = creature.SummonCreature(CreatureIds.Crone, -10891.96f, -1755.95f, creature.GetPositionZ(), 4.64f, TempSummonType.TimedOrDeadDespawn, Time.Hour * 2 * Time.InMilliseconds); if (pCrone) { if (creature.GetVictim()) @@ -106,17 +123,16 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public bool TitoDied; public ObjectGuid DorotheeGUID; public uint AggroTimer; + + public InstanceScript instance; } [Script] public class boss_dorothee : WizardofOzBase { - public boss_dorothee(Creature creature) : base(creature) - { - instance = creature.GetInstanceScript(); - } + public boss_dorothee(Creature creature) : base(creature) { } - public override void Reset() + public override void Initialize() { AggroTimer = 500; @@ -130,7 +146,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void EnterCombat(Unit who) { - Talk(WizardOfOz.SayDorotheeAggro); + Talk(TextIds.SayDorotheeAggro); } public override void JustReachedHome() @@ -140,14 +156,14 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { - Talk(WizardOfOz.SayDorotheeDeath); + Talk(TextIds.SayDorotheeDeath); SummonCroneIfReady(instance, me); } public override void AttackStart(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.AttackStart(who); @@ -155,7 +171,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void MoveInLineOfSight(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.MoveInLineOfSight(who); @@ -167,7 +183,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { if (AggroTimer <= diff) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); AggroTimer = 0; } else AggroTimer -= diff; @@ -178,14 +194,14 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (WaterBoltTimer <= diff) { - DoCast(SelectTarget(SelectAggroTarget.Random, 0), WizardOfOz.SpellWaterbolt); + DoCast(SelectTarget(SelectAggroTarget.Random, 0), SpellIds.Waterbolt); WaterBoltTimer = (uint)(TitoDied ? 1500 : 5000); } else WaterBoltTimer -= diff; if (FearTimer <= diff) { - DoCastVictim(WizardOfOz.SpellScream); + DoCastVictim(SpellIds.Scream); FearTimer = 30000; } else FearTimer -= diff; @@ -202,10 +218,10 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent void SummonTito() { - Creature pTito = me.SummonCreature(WizardOfOz.NpcTito, 0.0f, 0.0f, 0.0f, 0.0f, TempSummonType.TimedDespawnOOC, 30000); + Creature pTito = me.SummonCreature(CreatureIds.Tito, 0.0f, 0.0f, 0.0f, 0.0f, TempSummonType.TimedDespawnOOC, 30000); if (pTito) { - Talk(WizardOfOz.SayDorotheeSummon); + Talk(TextIds.SayDorotheeSummon); DorotheeGUID = me.GetGUID(); pTito.GetAI().AttackStart(me.GetVictim()); SummonedTito = true; @@ -213,8 +229,6 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent } } - InstanceScript instance; - uint WaterBoltTimer; uint FearTimer; uint SummonTitoTimer; @@ -225,9 +239,12 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent [Script] public class npc_tito : WizardofOzBase { - public npc_tito(Creature creature) : base(creature) { } + public npc_tito(Creature creature) : base(creature) + { + Initialize(); + } - public override void Reset() + public override void Initialize() { DorotheeGUID.Clear(); YipTimer = 10000; @@ -243,7 +260,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (Dorothee && Dorothee.IsAlive()) { TitoDied = true; - Talk(WizardOfOz.SayDorotheeTitoDeath, Dorothee); + Talk(TextIds.SayDorotheeTitoDeath, Dorothee); } } } @@ -255,7 +272,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (YipTimer <= diff) { - DoCastVictim(WizardOfOz.SpellYipping); + DoCastVictim(SpellIds.Yipping); YipTimer = 10000; } else YipTimer -= diff; @@ -271,10 +288,11 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { public boss_strawman(Creature creature) : base(creature) { + Initialize(); instance = creature.GetInstanceScript(); } - public override void Reset() + public override void Initialize() { AggroTimer = 13000; BrainBashTimer = 5000; @@ -283,7 +301,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void AttackStart(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.AttackStart(who); @@ -291,7 +309,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void MoveInLineOfSight(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.MoveInLineOfSight(who); @@ -299,27 +317,27 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void EnterCombat(Unit who) { - Talk(WizardOfOz.SayStrawmanAggro); + Talk(TextIds.SayStrawmanAggro); } public override void SpellHit(Unit caster, SpellInfo Spell) { if ((Spell.SchoolMask == SpellSchoolMask.Fire) && ((RandomHelper.randChance() % 10) == 0)) { - DoCast(me, WizardOfOz.SpellBurningStraw, true); + DoCast(me, SpellIds.BurningStraw, true); } } public override void JustDied(Unit killer) { - Talk(WizardOfOz.SayStrawmanDeath); + Talk(TextIds.SayStrawmanDeath); SummonCroneIfReady(instance, me); } public override void KilledUnit(Unit victim) { - Talk(WizardOfOz.SayStrawmanSlay); + Talk(TextIds.SayStrawmanSlay); } public override void UpdateAI(uint diff) @@ -328,7 +346,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { if (AggroTimer <= diff) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); AggroTimer = 0; } else AggroTimer -= diff; @@ -339,7 +357,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (BrainBashTimer <= diff) { - DoCastVictim(WizardOfOz.SpellBrainBash); + DoCastVictim(SpellIds.BrainBash); BrainBashTimer = 15000; } else BrainBashTimer -= diff; @@ -348,7 +366,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { Unit target = SelectTarget(SelectAggroTarget.Random, 0, 100, true); if (target) - DoCast(target, WizardOfOz.SpellBrainWipe); + DoCast(target, SpellIds.BrainWipe); BrainWipeTimer = 20000; } else BrainWipeTimer -= diff; @@ -356,8 +374,6 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent DoMeleeAttackIfReady(); } - InstanceScript instance; - uint BrainBashTimer; uint BrainWipeTimer; } @@ -365,12 +381,9 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent [Script] class boss_tinhead : WizardofOzBase { - public boss_tinhead(Creature creature) : base(creature) - { - instance = creature.GetInstanceScript(); - } + public boss_tinhead(Creature creature) : base(creature) { } - public override void Reset() + public override void Initialize() { AggroTimer = 15000; CleaveTimer = 5000; @@ -381,7 +394,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void EnterCombat(Unit who) { - Talk(WizardOfOz.SayTinheadAggro); + Talk(TextIds.SayTinheadAggro); } public override void JustReachedHome() @@ -391,7 +404,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void AttackStart(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.AttackStart(who); @@ -399,7 +412,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void MoveInLineOfSight(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.MoveInLineOfSight(who); @@ -407,14 +420,14 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { - Talk(WizardOfOz.SayTinheadDeath); + Talk(TextIds.SayTinheadDeath); SummonCroneIfReady(instance, me); } public override void KilledUnit(Unit victim) { - Talk(WizardOfOz.SayTinheadSlay); + Talk(TextIds.SayTinheadSlay); } public override void UpdateAI(uint diff) @@ -423,7 +436,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { if (AggroTimer <= diff) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); AggroTimer = 0; } else AggroTimer -= diff; @@ -434,7 +447,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (CleaveTimer <= diff) { - DoCastVictim(WizardOfOz.SpellCleave); + DoCastVictim(SpellIds.Cleave); CleaveTimer = 5000; } else CleaveTimer -= diff; @@ -444,8 +457,8 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (RustTimer <= diff) { ++RustCount; - Talk(WizardOfOz.EmoteRust); - DoCast(me, WizardOfOz.SpellRust); + Talk(TextIds.EmoteRust); + DoCast(me, SpellIds.Rust); RustTimer = 6000; } else RustTimer -= diff; @@ -454,8 +467,6 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent DoMeleeAttackIfReady(); } - InstanceScript instance; - uint CleaveTimer; uint RustTimer; @@ -465,12 +476,9 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent [Script] class boss_roar : WizardofOzBase { - public boss_roar(Creature creature) : base(creature) - { - instance = creature.GetInstanceScript(); - } + public boss_roar(Creature creature) : base(creature) { } - public override void Reset() + public override void Initialize() { AggroTimer = 20000; MangleTimer = 5000; @@ -478,25 +486,25 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent ScreamTimer = 15000; } - public override void MoveInLineOfSight(Unit who) - { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) - return; - - base.MoveInLineOfSight(who); - } - public override void AttackStart(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.AttackStart(who); } + public override void MoveInLineOfSight(Unit who) + { + if (me.HasUnitFlag(UnitFlags.NonAttackable)) + return; + + base.MoveInLineOfSight(who); + } + public override void EnterCombat(Unit who) { - Talk(WizardOfOz.SayRoarAggro); + Talk(TextIds.SayRoarAggro); } public override void JustReachedHome() @@ -506,14 +514,14 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { - Talk(WizardOfOz.SayRoarDeath); + Talk(TextIds.SayRoarDeath); SummonCroneIfReady(instance, me); } public override void KilledUnit(Unit victim) { - Talk(WizardOfOz.SayRoarSlay); + Talk(TextIds.SayRoarSlay); } public override void UpdateAI(uint diff) @@ -522,7 +530,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent { if (AggroTimer <= diff) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); AggroTimer = 0; } else AggroTimer -= diff; @@ -533,21 +541,21 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (MangleTimer <= diff) { - DoCastVictim(WizardOfOz.SpellMangle); + DoCastVictim(SpellIds.Mangle); MangleTimer = RandomHelper.URand(5000, 8000); } else MangleTimer -= diff; if (ShredTimer <= diff) { - DoCastVictim(WizardOfOz.SpellShred); + DoCastVictim(SpellIds.Shred); ShredTimer = RandomHelper.URand(10000, 15000); } else ShredTimer -= diff; if (ScreamTimer <= diff) { - DoCastVictim(WizardOfOz.SpellFrightenedScream); + DoCastVictim(SpellIds.FrightenedScream); ScreamTimer = RandomHelper.URand(20000, 30000); } else ScreamTimer -= diff; @@ -555,8 +563,6 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent DoMeleeAttackIfReady(); } - InstanceScript instance; - uint MangleTimer; uint ShredTimer; uint ScreamTimer; @@ -570,8 +576,9 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent instance = creature.GetInstanceScript(); } - public override void Reset() + public override void Initialize() { + me.RemoveUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.NonAttackable); CycloneTimer = 30000; ChainLightningTimer = 10000; } @@ -583,27 +590,21 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void KilledUnit(Unit victim) { - Talk(WizardOfOz.SayCroneSlay); + Talk(TextIds.SayCroneSlay); } public override void EnterCombat(Unit who) { - Talk(WizardOfOz.SayCroneAggro); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + Talk(TextIds.SayCroneAggro); + me.RemoveUnitFlag(UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc); } public override void JustDied(Unit killer) { - Talk(WizardOfOz.SayCroneDeath); + Talk(TextIds.SayCroneDeath); - instance.SetData(karazhanConst.BossOpera, (uint)EncounterState.Done); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorleft), true); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorright), true); - - GameObject pSideEntrance = instance.instance.GetGameObject(instance.GetGuidData(DataTypes.GoSideEntranceDoor)); - if (pSideEntrance) - pSideEntrance.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + instance.SetBossState(DataTypes.OperaPerformance, EncounterState.Done); } public override void UpdateAI(uint diff) @@ -611,21 +612,21 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (!UpdateVictim()) return; - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + if (me.HasUnitFlag(UnitFlags.NonAttackable)) + me.RemoveUnitFlag(UnitFlags.NonAttackable); if (CycloneTimer <= diff) { - Creature Cyclone = DoSpawnCreature(WizardOfOz.NpcCyclone, RandomHelper.FRand(0, 9), RandomHelper.FRand(0, 9), 0, 0, TempSummonType.TimedDespawn, 15000); + Creature Cyclone = DoSpawnCreature(CreatureIds.Cyclone, RandomHelper.FRand(0, 9), RandomHelper.FRand(0, 9), 0, 0, TempSummonType.TimedDespawn, 15000); if (Cyclone) - Cyclone.CastSpell(Cyclone, WizardOfOz.SpellCycloneVisual, true); + Cyclone.CastSpell(Cyclone, SpellIds.CycloneVisual, true); CycloneTimer = 30000; } else CycloneTimer -= diff; if (ChainLightningTimer <= diff) { - DoCastVictim(WizardOfOz.SpellChainLightning); + DoCastVictim(SpellIds.ChainLightning); ChainLightningTimer = 15000; } else ChainLightningTimer -= diff; @@ -633,8 +634,6 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent DoMeleeAttackIfReady(); } - InstanceScript instance; - uint CycloneTimer; uint ChainLightningTimer; } @@ -655,8 +654,8 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void UpdateAI(uint diff) { - if (!me.HasAura(WizardOfOz.SpellKnockback)) - DoCast(me, WizardOfOz.SpellKnockback, true); + if (!me.HasAura(SpellIds.Knockback)) + DoCast(me, SpellIds.Knockback, true); if (MoveTimer <= diff) { @@ -746,14 +745,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { DoPlaySoundToSet(me, RedRidingHood.SoundWolfDeath); - - instance.SetData(karazhanConst.BossOpera, (uint)EncounterState.Done); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorleft), true); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorright), true); - - GameObject pSideEntrance = instance.instance.GetGameObject(instance.GetGuidData(DataTypes.GoSideEntranceDoor)); - if (pSideEntrance) - pSideEntrance.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + instance.SetBossState(DataTypes.OperaPerformance, EncounterState.Done); } public override void UpdateAI(uint diff) @@ -884,7 +876,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void MoveInLineOfSight(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.MoveInLineOfSight(who); @@ -895,7 +887,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent me.InterruptNonMeleeSpells(true); me.RemoveAllAuras(); me.SetHealth(0); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); me.GetMotionMaster().MovementExpired(false); me.GetMotionMaster().MoveIdle(); me.SetStandState(UnitStandStateType.Dead); @@ -903,7 +895,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public void Resurrect(Creature target) { - target.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + target.RemoveUnitFlag(UnitFlags.NotSelectable); target.SetFullHealth(); target.SetStandState(UnitStandStateType.Stand); target.CastSpell(target, JulianneRomulo.SpellResVisual, true); @@ -972,7 +964,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void AttackStart(Unit who) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; base.AttackStart(who); @@ -1026,12 +1018,12 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent Romulo = ObjectAccessor.GetCreature(me, RomuloGUID); if (Romulo) { - Romulo.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + Romulo.RemoveUnitFlag(UnitFlags.NotSelectable); Romulo.GetMotionMaster().Clear(); Romulo.setDeathState(DeathState.JustDied); Romulo.CombatStop(true); Romulo.DeleteThreatList(); - Romulo.SetUInt32Value(ObjectFields.DynamicFlags, (uint)UnitDynFlags.Lootable); + Romulo.SetDynamicFlags(UnitDynFlags.Lootable); } return; @@ -1055,14 +1047,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { Talk(JulianneRomulo.SayJulianneDeath02); - - instance.SetData(karazhanConst.BossOpera, (uint)EncounterState.Done); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorleft), true); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorright), true); - - GameObject pSideEntrance = instance.instance.GetGameObject(instance.GetGuidData(DataTypes.GoSideEntranceDoor)); - if (pSideEntrance) - pSideEntrance.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + instance.SetBossState(DataTypes.OperaPerformance, EncounterState.Done); } public override void KilledUnit(Unit victim) @@ -1087,7 +1072,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (AggroYellTimer <= diff) { Talk(JulianneRomulo.SayJulianneAggro); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); me.SetFaction(16); AggroYellTimer = 0; } @@ -1271,12 +1256,12 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent Julianne = ObjectAccessor.GetCreature(me, JulianneGUID); if (Julianne) { - Julianne.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + Julianne.RemoveUnitFlag(UnitFlags.NotSelectable); Julianne.GetMotionMaster().Clear(); Julianne.setDeathState(DeathState.JustDied); Julianne.CombatStop(true); Julianne.DeleteThreatList(); - Julianne.SetUInt32Value(ObjectFields.DynamicFlags, (uint)UnitDynFlags.Lootable); + Julianne.SetDynamicFlags(UnitDynFlags.Lootable); } return; } @@ -1313,14 +1298,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public override void JustDied(Unit killer) { Talk(JulianneRomulo.SayRomuloDeath); - - instance.SetData(karazhanConst.BossOpera, (uint)EncounterState.Done); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorleft), true); - instance.HandleGameObject(instance.GetGuidData(DataTypes.GoStagedoorright), true); - - GameObject pSideEntrance = instance.instance.GetGameObject(instance.GetGuidData(DataTypes.GoSideEntranceDoor)); - if (pSideEntrance) - pSideEntrance.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked); + instance.SetBossState(DataTypes.OperaPerformance, EncounterState.Done); } public override void KilledUnit(Unit victim) @@ -1428,7 +1406,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent public void StartEvent() { - instance.SetData(karazhanConst.BossOpera, (uint)EncounterState.InProgress); + instance.SetBossState(DataTypes.OperaPerformance, EncounterState.InProgress); //resets count for this event, in case earlier failed if (m_uiEventId == OperaEvents.Oz) @@ -1454,7 +1432,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent Creature spotlight = me.SummonCreature(karazhanConst.NpcSpotlight, me.GetPositionX(), me.GetPositionY(), me.GetPositionZ(), 0.0f, TempSummonType.TimedOrDeadDespawn, 60000); if (spotlight) { - spotlight.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + spotlight.AddUnitFlag(UnitFlags.NotSelectable); spotlight.CastSpell(spotlight, karazhanConst.SpellSpotlight, false); m_uiSpotlightGUID = spotlight.GetGUID(); } @@ -1530,11 +1508,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent Creature creature = me.SummonCreature(entry, PosX, karazhanConst.SPAWN_Y, karazhanConst.SPAWN_Z, karazhanConst.SPAWN_O, TempSummonType.TimedOrDeadDespawn, Time.Hour * 2 * Time.InMilliseconds); if (creature) - { - // In case database has bad flags - creature.SetUInt32Value(UnitFields.Flags, 0); - creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); - } + creature.AddUnitFlag(UnitFlags.NonAttackable); } RaidWiped = false; @@ -1654,7 +1628,7 @@ namespace Scripts.EasternKingdoms.Karazhan.OperaEvent if (instance != null) { // Check for death of Moroes and if opera event is not done already - if (instance.GetData(karazhanConst.BossMoroes) == (uint)EncounterState.Done && instance.GetData(karazhanConst.BossOpera) != (uint)EncounterState.Done) + if (instance.GetBossState(DataTypes.Moroes) == EncounterState.Done && instance.GetBossState(DataTypes.OperaPerformance) != EncounterState.Done) { player.ADD_GOSSIP_ITEM(GossipOptionIcon.Chat, karazhanConst.OZ_GOSSIP1, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 1); diff --git a/Source/Scripts/EasternKingdoms/ScarletEnclave/Chapter1.cs b/Source/Scripts/EasternKingdoms/ScarletEnclave/Chapter1.cs index e8102923a..86ebe25d1 100644 --- a/Source/Scripts/EasternKingdoms/ScarletEnclave/Chapter1.cs +++ b/Source/Scripts/EasternKingdoms/ScarletEnclave/Chapter1.cs @@ -153,7 +153,7 @@ namespace Scripts.EasternKingdoms Initialize(); _events.Reset(); me.SetFaction(7); - me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + me.AddUnitFlag(UnitFlags.ImmuneToPc); me.SetStandState(UnitStandStateType.Kneel); me.LoadEquipment(0, true); } @@ -261,7 +261,7 @@ namespace Scripts.EasternKingdoms else { me.SetFaction(14); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc); phase = UnworthyInitiatePhase.Attacking; Player target = Global.ObjAccessor.GetPlayer(me, playerGUID); @@ -468,7 +468,7 @@ namespace Scripts.EasternKingdoms me.RestoreFaction(); base.Reset(); - me.SetFlag(UnitFields.Flags, UnitFlags.Unk15); + me.AddUnitFlag(UnitFlags.Unk15); } public override void SpellHit(Unit pCaster, SpellInfo pSpell) @@ -569,8 +569,8 @@ namespace Scripts.EasternKingdoms return true; } - creature.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); - creature.RemoveFlag(UnitFields.Flags, UnitFlags.Unk15); + creature.RemoveUnitFlag(UnitFlags.ImmuneToPc); + creature.RemoveUnitFlag(UnitFlags.Unk15); player.CastSpell(creature, SpellIds.Duel, false); player.CastSpell(player, SpellIds.DuelFlag, true); @@ -703,7 +703,7 @@ namespace Scripts.EasternKingdoms if (charmer.HasAura(SpellIds.EffectStolenHorse)) { charmer.RemoveAurasDueToSpell(SpellIds.EffectStolenHorse); - caster.RemoveFlag(UnitFields.NpcFlags, NPCFlags.SpellClick); + caster.RemoveNpcFlag(NPCFlags.SpellClick); caster.SetFaction(35); DoCast(caster, SpellIds.CallDarkRider, true); Creature Dark_Rider = me.FindNearestCreature(CreatureIds.DarkRiderOfAcherus, 15); @@ -765,8 +765,8 @@ namespace Scripts.EasternKingdoms return; deathcharger.RestoreFaction(); - deathcharger.RemoveFlag(UnitFields.NpcFlags, NPCFlags.SpellClick); - deathcharger.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + deathcharger.RemoveNpcFlag(NPCFlags.SpellClick); + deathcharger.AddUnitFlag(UnitFlags.NotSelectable); if (!me.GetVehicle() && deathcharger.IsVehicle() && deathcharger.GetVehicleKit().HasEmptySeat(0)) me.EnterVehicle(deathcharger); } @@ -779,8 +779,8 @@ namespace Scripts.EasternKingdoms if (killer.IsTypeId(TypeId.Player) && deathcharger.IsTypeId(TypeId.Unit) && deathcharger.IsVehicle()) { - deathcharger.SetFlag(UnitFields.NpcFlags, NPCFlags.SpellClick); - deathcharger.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + deathcharger.AddNpcFlag(NPCFlags.SpellClick); + deathcharger.RemoveUnitFlag(UnitFlags.NotSelectable); deathcharger.SetFaction(2096); } } diff --git a/Source/Scripts/Kalimdor/ZoneAshenvale.cs b/Source/Scripts/Kalimdor/ZoneAshenvale.cs index 9bc0ee043..ab87fbba8 100644 --- a/Source/Scripts/Kalimdor/ZoneAshenvale.cs +++ b/Source/Scripts/Kalimdor/ZoneAshenvale.cs @@ -147,7 +147,7 @@ namespace Scripts.Kalimdor.ZoneAshenvale switch (waypointId) { case 0: - me.SetUInt32Value(UnitFields.Bytes1, 0); + me.SetStandState(UnitStandStateType.Stand); GameObject cage = me.FindNearestGameObject(GameObjectIds.Cage, 20); if (cage) cage.SetGoState(GameObjectState.Active); @@ -244,7 +244,7 @@ namespace Scripts.Kalimdor.ZoneAshenvale GameObject go = GetClosestGameObjectWithEntry(me, GameObjectIds.NagaBrazier, SharedConst.InteractionDistance * 2); if (go) { - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); SetEscortPaused(true); } break; diff --git a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossHeraldVolazj.cs b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossHeraldVolazj.cs index c9ce95db6..bda04360a 100644 --- a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossHeraldVolazj.cs +++ b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossHeraldVolazj.cs @@ -86,7 +86,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.HeraldVolazj public override void DamageTaken(Unit pAttacker, ref uint damage) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NotSelectable)) + if (me.HasUnitFlag(UnitFlags.NotSelectable)) damage = 0; if ((GetHealthPct(0) >= 66 && GetHealthPct(damage) < 66) || @@ -110,7 +110,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.HeraldVolazj // Channel visual DoCast(me, SpellIds.InsanityVisual, true); // Unattackable - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); me.SetControlled(true, UnitState.Stunned); } @@ -167,7 +167,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.HeraldVolazj // Cleanup Summons.DespawnAll(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetControlled(false, UnitState.Stunned); } @@ -231,7 +231,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.HeraldVolazj return; insanityHandled = 0; - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetControlled(false, UnitState.Stunned); me.RemoveAurasDueToSpell(SpellIds.InsanityVisual); } diff --git a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossJedogaShadowseeker.cs b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossJedogaShadowseeker.cs index 1706a9cd7..9b40899e4 100644 --- a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossJedogaShadowseeker.cs +++ b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossJedogaShadowseeker.cs @@ -184,7 +184,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.JedogaShadowseeker me.GetMotionMaster().MovePoint(1, Misc.JedogaPosition[1]); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, false); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); me.RemoveAurasDueToSpell(SpellIds.SphereVisual); @@ -214,7 +214,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.JedogaShadowseeker { me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, true); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, true); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); me.AttackStop(); me.RemoveAllAuras(); @@ -350,14 +350,14 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.JedogaShadowseeker me.RemoveAurasDueToSpell(SpellIds.SphereVisual); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, false); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); } else { DoCast(me, SpellIds.SphereVisual, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, true); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, true); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); } } @@ -434,7 +434,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.JedogaShadowseeker me.RemoveAurasDueToSpell(SpellIds.SphereVisual); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, false); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); float distance = me.GetDistance(Misc.JedogaPosition[1]); @@ -456,14 +456,14 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.JedogaShadowseeker me.RemoveAurasDueToSpell(SpellIds.SphereVisual); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, false); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); } if (instance.GetBossState(DataTypes.JedogaShadowseeker) == EncounterState.InProgress && !me.HasAura(SpellIds.SphereVisual)) { DoCast(me, SpellIds.SphereVisual, false); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Normal, true); me.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, true); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); } } bCheckTimer = 2 * Time.InMilliseconds; diff --git a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossPrinceTaldaram.cs b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossPrinceTaldaram.cs index 66ceb3873..c3a3ec2b4 100644 --- a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossPrinceTaldaram.cs +++ b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/BossPrinceTaldaram.cs @@ -262,7 +262,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.PrinceTaldaram void RemovePrison() { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.RemoveAurasDueToSpell(SpellIds.BeamVisual); me.SetHomePosition(me.GetPositionX(), me.GetPositionY(), Misc.DataGroundPositionZ, me.GetOrientation()); DoCast(SpellIds.HoverFall); @@ -373,7 +373,7 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet.PrinceTaldaram Creature PrinceTaldaram = ObjectAccessor.GetCreature(go, instance.GetGuidData(DataTypes.PrinceTaldaram)); if (PrinceTaldaram && PrinceTaldaram.IsAlive()) { - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); go.SetGoState(GameObjectState.Active); switch (go.GetEntry()) diff --git a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/InstanceAhnahet.cs b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/InstanceAhnahet.cs index 73babb838..f9d5b86ad 100644 --- a/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/InstanceAhnahet.cs +++ b/Source/Scripts/Northrend/AzjolNerub/Ahnkahet/InstanceAhnahet.cs @@ -135,19 +135,19 @@ namespace Scripts.Northrend.AzjolNerub.Ahnkahet if (SpheresState[0] != 0) { go.SetGoState(GameObjectState.Active); - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); } else - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); break; case GameObjectIds.Sphere2: if (SpheresState[1] != 0) { go.SetGoState(GameObjectState.Active); - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); } else - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); break; case GameObjectIds.PrinceTaldaramGate: AddDoor(go, true); diff --git a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossAnubarak.cs b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossAnubarak.cs index 2a0505569..060b44dba 100644 --- a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossAnubarak.cs +++ b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossAnubarak.cs @@ -105,7 +105,7 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.Anubarak public override void Reset() { base.Reset(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); instance.DoStopCriteriaTimer(CriteriaTimedTypes.Event, Misc.AchievGottaGoStartEvent); _nextSubmerge = 75; _petCount = 0; @@ -332,7 +332,7 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.Anubarak { me.RemoveAurasDueToSpell(SpellIds.Submerge); me.RemoveAurasDueToSpell(SpellIds.ImpaleAura); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); DoCastSelf(SpellIds.Emerge); _events.SetPhase(Misc.PhaseEmerge); _events.ScheduleEvent(EventIds.Pound, TimeSpan.FromSeconds(13), TimeSpan.FromSeconds(18), 0, Misc.PhaseEmerge); @@ -363,7 +363,7 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.Anubarak { if (spell.Id == SpellIds.Submerge) { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.RemoveAurasDueToSpell(SpellIds.LeechingSwarm); DoCastSelf(SpellIds.ImpaleAura, true); diff --git a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossNadronox.cs b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossNadronox.cs index 01adf0ae5..7d632fc91 100644 --- a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossNadronox.cs +++ b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossNadronox.cs @@ -356,8 +356,8 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.Nadronox public void Initialize() { - me.SetFloatValue(UnitFields.BoundingRadius, 9.0f); - me.SetFloatValue(UnitFields.CombatReach, 9.0f); + me.SetBoundingRadius(9.0f); + me.SetCombatReach(9.0f); _enteredCombat = false; _doorsWebbed = false; _lastPlayerCombatState = false; diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/GrandChampions.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/GrandChampions.cs index 813819a5e..416327a28 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/GrandChampions.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/GrandChampions.cs @@ -242,7 +242,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion me.SetReactState(ReactStates.Passive); // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.ImmuneToPc); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.ImmuneToPc); } public abstract void Initialize(); @@ -320,7 +320,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (player.IsAlive()) { - temp.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.ImmuneToPc); + temp.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.ImmuneToPc); temp.SetReactState(ReactStates.Aggressive); temp.SetInCombatWith(player); player.SetInCombatWith(temp); diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/InstanceTrialOfTheChampion.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/InstanceTrialOfTheChampion.cs index d756038d1..ef40cfbe7 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/InstanceTrialOfTheChampion.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/InstanceTrialOfTheChampion.cs @@ -155,7 +155,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (pAnnouncer) { pAnnouncer.GetMotionMaster().MovePoint(0, 748.309f, 619.487f, 411.171f); - pAnnouncer.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + pAnnouncer.AddNpcFlag(NPCFlags.Gossip); pAnnouncer.SummonGameObject(instance.IsHeroic() ? GameObjectIds.CHAMPIONS_LOOT_H : GameObjectIds.CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, Quaternion.fromEulerAnglesZYX(1.42f, 0.0f, 0.0f), 90000); } } @@ -169,7 +169,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (pBoss) { pBoss.GetMotionMaster().MovePoint(0, 746.88f, 618.74f, 411.06f); - pBoss.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + pBoss.RemoveUnitFlag(UnitFlags.NonAttackable); pBoss.SetReactState(ReactStates.Aggressive); } } @@ -181,7 +181,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (pAnnouncer) { pAnnouncer.GetMotionMaster().MovePoint(0, 748.309f, 619.487f, 411.171f); - pAnnouncer.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + pAnnouncer.AddNpcFlag(NPCFlags.Gossip); pAnnouncer.SummonGameObject(instance.IsHeroic() ? GameObjectIds.EADRIC_LOOT_H : GameObjectIds.EADRIC_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, Quaternion.fromEulerAnglesZYX(1.42f, 0.0f, 0.0f), 90000); } } @@ -193,7 +193,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (pAnnouncer) { pAnnouncer.GetMotionMaster().MovePoint(0, 748.309f, 619.487f, 411.171f); - pAnnouncer.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + pAnnouncer.AddNpcFlag(NPCFlags.Gossip); pAnnouncer.SummonGameObject(instance.IsHeroic() ? GameObjectIds.PALETRESS_LOOT_H : GameObjectIds.PALETRESS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, Quaternion.fromEulerAnglesZYX(1.42f, 0.0f, 0.0f), 90000); } } diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/TrialOfTheChampion.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/TrialOfTheChampion.cs index d4aa8b2ac..20512e684 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/TrialOfTheChampion.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/TrialOfTheChampion.cs @@ -170,8 +170,8 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion uiTimer = 0; me.SetReactState(ReactStates.Passive); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.AddUnitFlag(UnitFlags.NonAttackable); + me.AddNpcFlag(NPCFlags.Gossip); SetGrandChampionsForEncounter(); SetArgentChampion(); @@ -409,7 +409,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion public void StartEncounter() { - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); if (instance.GetData((uint)Data.BOSS_BLACK_KNIGHT) == (uint)EncounterState.NotStarted) { @@ -444,7 +444,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion if (player.IsAlive()) { temp.SetHomePosition(me.GetPositionX(), me.GetPositionY(), me.GetPositionZ(), me.GetOrientation()); - temp.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + temp.RemoveUnitFlag(UnitFlags.NonAttackable); temp.SetReactState(ReactStates.Aggressive); temp.SetInCombatWith(player); player.SetInCombatWith(temp); @@ -494,7 +494,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheChampion { if (instance.GetData((uint)Data.BOSS_GRAND_CHAMPIONS) == (uint)EncounterState.NotStarted) { - summon.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + summon.AddUnitFlag(UnitFlags.NonAttackable); summon.SetReactState(ReactStates.Passive); } } diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/LordJaraxxus.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/LordJaraxxus.cs index ee4bd182c..0c6ee6486 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/LordJaraxxus.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/LordJaraxxus.cs @@ -106,7 +106,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader _JustReachedHome(); instance.SetBossState(DataTypes.BossJaraxxus, EncounterState.Fail); DoCast(me, Spells.JaraxxusChains); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); } public override void KilledUnit(Unit who) @@ -218,7 +218,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetInCombatWithZone(); DoCast(Jaraxxus.SpellLegionFlameEffect); } @@ -247,9 +247,9 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader me.SetReactState(ReactStates.Passive); if (!IsHeroic()) - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); else - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); _summons.DespawnAll(); } @@ -332,9 +332,9 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader me.SetReactState(ReactStates.Passive); if (!IsHeroic()) - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); else - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Pacified); _summons.DespawnAll(); } diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs index 0b13577bd..629a0daae 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/NorthrendBeasts.cs @@ -182,7 +182,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (snobold) { snobold.ExitVehicle(); - snobold.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + snobold.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); snobold.ToCreature().GetAI().DoAction(Actions.DisableFireBomb); snobold.CastSpell(me, SpellIds.JumpToHand, true); break; @@ -209,7 +209,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { case 0: instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor)); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); me.SetInCombatWithZone(); break; @@ -300,7 +300,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetInCombatWithZone(); _events.ScheduleEvent(Events.CheckMount, TimeSpan.FromSeconds(1)); _events.ScheduleEvent(Events.FireBomb, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30)); @@ -530,7 +530,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (!Enraged && instance.GetData(DataTypes.NorthrendBeasts) == NorthrendBeasts.SnakesSpecial) { me.RemoveAurasDueToSpell(SpellIds.Submerge); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); DoCast(SpellIds.Enrage); Enraged = true; Talk(TextIds.EmoteEnrage); @@ -567,7 +567,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader 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.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); acidmaw.SetReactState(ReactStates.Aggressive); acidmaw.SetInCombatWithZone(); acidmaw.CastSpell(acidmaw, SpellIds.Emerge); @@ -603,7 +603,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader 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.AddUnitFlag(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; } @@ -615,7 +615,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader me.SetDisplayId(ModelMobile); me.RemoveAurasDueToSpell(SpellIds.Submerge); me.RemoveAurasDueToSpell(SpellIds.GroundVisual0); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); // if the worm was mobile before submerging, make him stationary now if (WasMobile) @@ -710,7 +710,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { case 0: instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor)); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); me.SetInCombatWithZone(); break; @@ -840,7 +840,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader break; case 2: instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor)); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); me.SetInCombatWithZone(); break; @@ -944,7 +944,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader me.SetTarget(_trampleTargetGUID); _trampleCast = false; SetCombatMovement(false); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); me.SetControlled(true, UnitState.Root); me.GetMotionMaster().Clear(); me.GetMotionMaster().MoveIdle(); @@ -1033,7 +1033,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Talk(TextIds.EmoteTrampleFail); } _movementStarted = false; - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); SetCombatMovement(true); me.GetMotionMaster().MovementExpired(); me.GetMotionMaster().Clear(); diff --git a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs index 0be68baaa..e6d98e579 100644 --- a/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs +++ b/Source/Scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/TrialOfTheCrusader.cs @@ -254,7 +254,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader GameObject cache = instance.GetGameObject(CrusadersCacheGUID); if (cache) - cache.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + cache.RemoveFlag(GameObjectFlags.NotSelectable); EventStage = 3100; break; default: @@ -398,7 +398,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { Unit announcer = instance.GetCreature(GetGuidData(CreatureIds.Barrent)); if (announcer) - announcer.SetFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); + announcer.AddNpcFlag(NPCFlags.Gossip); Save(); } } @@ -783,14 +783,14 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader public override void Reset() { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); Creature pAlly = GetClosestCreatureWithEntry(me, CreatureIds.Thrall, 300.0f); if (pAlly) - pAlly.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + pAlly.AddUnitFlag(UnitFlags.NonAttackable); pAlly = GetClosestCreatureWithEntry(me, CreatureIds.Proudmoore, 300.0f); if (pAlly) - pAlly.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + pAlly.AddUnitFlag(UnitFlags.NonAttackable); } public override void AttackStart(Unit who) { } @@ -846,7 +846,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (jaraxxus) { jaraxxus.RemoveAurasDueToSpell(Spells.JaraxxusChains); - jaraxxus.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + jaraxxus.RemoveUnitFlag(UnitFlags.NonAttackable); jaraxxus.SetReactState(ReactStates.Defensive); jaraxxus.SetInCombatWithZone(); } @@ -887,7 +887,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (creature.IsVisible()) creature.SetVisible(false); } - creature.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); + creature.RemoveNpcFlag(NPCFlags.Gossip); return true; } @@ -959,12 +959,12 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader break; case 5030: Talk(Texts.Stage_4_04); - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.StateTalk); + me.SetEmoteState(Emote.StateTalk); _updateTimer = 10 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 5040); break; case 5040: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + me.SetEmoteState(Emote.OneshotNone); me.GetMotionMaster().MovePoint(1, MiscData.LichKingLoc[1]); _updateTimer = 1 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 0); @@ -991,7 +991,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (go) { go.SetDisplayId(MiscData.DisplayIdDestroyedFloor); - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.NoDespawn); + go.AddFlag(GameObjectFlags.Damaged | GameObjectFlags.NoDespawn); go.SetGoState(GameObjectState.Active); } @@ -1039,7 +1039,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) { - temp.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + temp.RemoveUnitFlag(UnitFlags.NonAttackable); temp.SetReactState(ReactStates.Aggressive); temp.SetInCombatWithZone(); } @@ -1144,7 +1144,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader Creature temp = me.SummonCreature(CreatureIds.Jaraxxus, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY(), MiscData.ToCCommonLoc[1].GetPositionZ(), 5.0f, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); if (temp) { - temp.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + temp.AddUnitFlag(UnitFlags.NonAttackable); temp.SetReactState(ReactStates.Passive); temp.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY() - 10, MiscData.ToCCommonLoc[1].GetPositionZ()); } @@ -1233,20 +1233,20 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader switch (_instance.GetData(DataTypes.Event)) { case 110: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); + me.SetEmoteState(Emote.OneshotTalk); Talk(Texts.Stage_0_01); _updateTimer = 22 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 120); break; case 140: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); + me.SetEmoteState(Emote.OneshotTalk); Talk(Texts.Stage_0_02); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 150); break; case 150: { - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + me.SetEmoteState(Emote.OneshotNone); if (_instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); @@ -1255,7 +1255,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (temp) { temp.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[5].GetPositionX(), MiscData.ToCCommonLoc[5].GetPositionY(), MiscData.ToCCommonLoc[5].GetPositionZ()); - temp.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + temp.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); temp.SetReactState(ReactStates.Passive); } } @@ -1279,7 +1279,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (temp) { temp.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[5].GetPositionX(), MiscData.ToCCommonLoc[5].GetPositionY(), MiscData.ToCCommonLoc[5].GetPositionZ()); - temp.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + temp.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); temp.SetReactState(ReactStates.Passive); } } @@ -1300,7 +1300,7 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader if (temp) { temp.GetMotionMaster().MovePoint(2, MiscData.ToCCommonLoc[5].GetPositionX(), MiscData.ToCCommonLoc[5].GetPositionY(), MiscData.ToCCommonLoc[5].GetPositionZ()); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Passive); } } @@ -1543,13 +1543,13 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader switch (_instance.GetData(DataTypes.Event)) { case 130: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); + me.SetEmoteState(Emote.OneshotTalk); Talk(Texts.Stage_0_03h); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 132); break; case 132: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + me.SetEmoteState(Emote.OneshotNone); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 140); break; @@ -1617,13 +1617,13 @@ namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader switch (_instance.GetData(DataTypes.Event)) { case 120: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); + me.SetEmoteState(Emote.OneshotTalk); Talk(Texts.Stage_0_03a); _updateTimer = 2 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 122); break; case 122: - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + me.SetEmoteState(Emote.OneshotNone); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.Event, 130); break; diff --git a/Source/Scripts/Northrend/Dalaran.cs b/Source/Scripts/Northrend/Dalaran.cs index ad27f2330..4a4afdce6 100644 --- a/Source/Scripts/Northrend/Dalaran.cs +++ b/Source/Scripts/Northrend/Dalaran.cs @@ -59,7 +59,7 @@ namespace Scripts.Northrend { public npc_mageguard_dalaran(Creature creature) : base(creature) { - creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + creature.AddUnitFlag(UnitFlags.NonAttackable); creature.ApplySpellImmune(0, SpellImmunity.Damage, (uint)SpellSchools.Normal, true); creature.ApplySpellImmune(0, SpellImmunity.Damage, SpellSchoolMask.Magic, true); } diff --git a/Source/Scripts/Northrend/DraktharonKeep/BossKingDred.cs b/Source/Scripts/Northrend/DraktharonKeep/BossKingDred.cs index 45fceb4b2..73d4a08e7 100644 --- a/Source/Scripts/Northrend/DraktharonKeep/BossKingDred.cs +++ b/Source/Scripts/Northrend/DraktharonKeep/BossKingDred.cs @@ -30,7 +30,7 @@ namespace Scripts.Northrend.DraktharonKeep.KingDred public const uint GrievousBite = 48920; public const uint ManglingSlash = 48873; // Cast On The Current Tank; Adds Debuf public const uint FearsomeRoar = 48849; - public const uint PiercingSlash = 48878; // Debuff --> Armor Reduced By 75% + public const uint PiercingSlash = 48878; // Debuff -. Armor Reduced By 75% public const uint RaptorCall = 59416; // Dummy public const uint GutRip = 49710; public const uint Rend = 13738; diff --git a/Source/Scripts/Northrend/DraktharonKeep/BossNovos.cs b/Source/Scripts/Northrend/DraktharonKeep/BossNovos.cs index 3e8cd404e..fe1a26df4 100644 --- a/Source/Scripts/Northrend/DraktharonKeep/BossNovos.cs +++ b/Source/Scripts/Northrend/DraktharonKeep/BossNovos.cs @@ -229,15 +229,15 @@ namespace Scripts.Northrend.DraktharonKeep.Novos _bubbled = state; if (!state) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + if (me.HasUnitFlag(UnitFlags.NonAttackable)) + me.RemoveUnitFlag(UnitFlags.NonAttackable); if (me.HasUnitState(UnitState.Casting)) me.CastStop(); } else { - if (!me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + if (!me.HasUnitFlag(UnitFlags.NonAttackable)) + me.AddUnitFlag(UnitFlags.NonAttackable); DoCast(SpellIds.ArcaneField); } } diff --git a/Source/Scripts/Northrend/DraktharonKeep/BossTrollgore.cs b/Source/Scripts/Northrend/DraktharonKeep/BossTrollgore.cs index bca23916c..3d72c3780 100644 --- a/Source/Scripts/Northrend/DraktharonKeep/BossTrollgore.cs +++ b/Source/Scripts/Northrend/DraktharonKeep/BossTrollgore.cs @@ -182,7 +182,7 @@ namespace Scripts.Northrend.DraktharonKeep.Trollgore if (type == MovementGeneratorType.Point && pointId == Misc.PointLanding) { me.Dismount(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); DoCastAOE(SpellIds.InvaderTaunt); } } diff --git a/Source/Scripts/Northrend/FrozenHalls/ForgeOfSouls/InstanceForgeOfSouls.cs b/Source/Scripts/Northrend/FrozenHalls/ForgeOfSouls/InstanceForgeOfSouls.cs index 3d27ad43b..b6a785b17 100644 --- a/Source/Scripts/Northrend/FrozenHalls/ForgeOfSouls/InstanceForgeOfSouls.cs +++ b/Source/Scripts/Northrend/FrozenHalls/ForgeOfSouls/InstanceForgeOfSouls.cs @@ -206,7 +206,7 @@ namespace Scripts.Northrend.FrozenHalls.ForgeOfSouls public npc_sylvanas_fos(Creature creature) : base(creature) { Initialize(); - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.AddNpcFlag(NPCFlags.Gossip); } void Initialize() @@ -226,7 +226,7 @@ namespace Scripts.Northrend.FrozenHalls.ForgeOfSouls { player.CLOSE_GOSSIP_MENU(); phase = Phase.Intro; - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); _events.Reset(); _events.ScheduleEvent(EventIds.Intro1, 1000); @@ -290,7 +290,7 @@ namespace Scripts.Northrend.FrozenHalls.ForgeOfSouls public npc_jaina_fos(Creature creature) : base(creature) { Initialize(); - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.AddNpcFlag(NPCFlags.Gossip); } void Initialize() @@ -310,7 +310,7 @@ namespace Scripts.Northrend.FrozenHalls.ForgeOfSouls { player.CLOSE_GOSSIP_MENU(); phase = Phase.Intro; - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); _events.Reset(); _events.ScheduleEvent(EventIds.Intro1, 1000); } diff --git a/Source/Scripts/Northrend/FrozenHalls/PitOfSaron/BossKrickAndIck.cs b/Source/Scripts/Northrend/FrozenHalls/PitOfSaron/BossKrickAndIck.cs index 41d6c5587..524429815 100644 --- a/Source/Scripts/Northrend/FrozenHalls/PitOfSaron/BossKrickAndIck.cs +++ b/Source/Scripts/Northrend/FrozenHalls/PitOfSaron/BossKrickAndIck.cs @@ -299,7 +299,7 @@ namespace Scripts.Northrend.FrozenHalls.PitOfSaron.BossKrickAndIck Initialize(); me.SetReactState(ReactStates.Passive); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); } Creature GetIck() diff --git a/Source/Scripts/Northrend/Gundrak/BossDrakkariColossus.cs b/Source/Scripts/Northrend/Gundrak/BossDrakkariColossus.cs index b1706fad4..4b26eb8c0 100644 --- a/Source/Scripts/Northrend/Gundrak/BossDrakkariColossus.cs +++ b/Source/Scripts/Northrend/Gundrak/BossDrakkariColossus.cs @@ -87,7 +87,7 @@ namespace Scripts.Northrend.Gundrak.DrakkariColossus if (GetData(Misc.DataIntroDone) != 0) { me.SetReactState(ReactStates.Aggressive); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc); me.RemoveAura(SpellIds.FreezeAnim); } @@ -125,7 +125,7 @@ namespace Scripts.Northrend.Gundrak.DrakkariColossus me.GetMotionMaster().MoveIdle(); me.SetReactState(ReactStates.Passive); - me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + me.AddUnitFlag(UnitFlags.ImmuneToPc); DoCast(me, SpellIds.FreezeAnim); break; case Misc.ActionUnfreezeColossus: @@ -133,7 +133,7 @@ namespace Scripts.Northrend.Gundrak.DrakkariColossus return; me.SetReactState(ReactStates.Aggressive); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc); me.RemoveAura(SpellIds.FreezeAnim); me.SetInCombatWithZone(); @@ -146,7 +146,7 @@ namespace Scripts.Northrend.Gundrak.DrakkariColossus public override void DamageTaken(Unit attacker, ref uint damage) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc)) + if (me.HasUnitFlag(UnitFlags.ImmuneToPc)) damage = 0; if (phase == Misc.ColossusPhaseNormal || diff --git a/Source/Scripts/Northrend/Gundrak/BossEck.cs b/Source/Scripts/Northrend/Gundrak/BossEck.cs index 25f1e006d..9a6ec3612 100644 --- a/Source/Scripts/Northrend/Gundrak/BossEck.cs +++ b/Source/Scripts/Northrend/Gundrak/BossEck.cs @@ -33,7 +33,7 @@ namespace Scripts.Northrend.Gundrak.EckTheFerocious public const uint Berserk = 55816; // Eck goes berserk, increasing his attack speed by 150% and all damage he deals by 500%. public const uint Bite = 55813; // Eck bites down hard, inflicting 150% of his normal damage to an enemy. public const uint Spit = 55814; // Eck spits toxic bile at enemies in a cone in front of him, inflicting 2970 Nature damage and draining 220 mana every 1 sec for 3 sec. - public const uint Spring1 = 55815; // Eck leaps at a distant target. --> Drops aggro and charges a random player. Tank can simply taunt him back. + public const uint Spring1 = 55815; // Eck leaps at a distant target. -. Drops aggro and charges a random player. Tank can simply taunt him back. public const uint Spring2 = 55837; // Eck leaps at a distant target. } diff --git a/Source/Scripts/Northrend/Gundrak/InstanceGundrak.cs b/Source/Scripts/Northrend/Gundrak/InstanceGundrak.cs index 6d1e47831..457bc977c 100644 --- a/Source/Scripts/Northrend/Gundrak/InstanceGundrak.cs +++ b/Source/Scripts/Northrend/Gundrak/InstanceGundrak.cs @@ -163,7 +163,7 @@ namespace Scripts.Northrend.Gundrak if (GetBossState(GDDataTypes.SladRan) == EncounterState.Done) { if (SladRanStatueState == GameObjectState.Active) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); else go.SetGoState(GameObjectState.Active); } @@ -172,7 +172,7 @@ namespace Scripts.Northrend.Gundrak if (GetBossState(GDDataTypes.Moorabi) == EncounterState.Done) { if (MoorabiStatueState == GameObjectState.Active) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); else go.SetGoState(GameObjectState.Active); } @@ -181,7 +181,7 @@ namespace Scripts.Northrend.Gundrak if (GetBossState(GDDataTypes.DrakkariColossus) == EncounterState.Done) { if (DrakkariColossusStatueState == GameObjectState.Active) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); else go.SetGoState(GameObjectState.Active); } @@ -239,7 +239,7 @@ namespace Scripts.Northrend.Gundrak { GameObject go = GetGameObject(GDDataTypes.SladRanAltar); if (go) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); } break; case GDDataTypes.DrakkariColossus: @@ -247,7 +247,7 @@ namespace Scripts.Northrend.Gundrak { GameObject go = GetGameObject(GDDataTypes.DrakkariColossusAltar); if (go) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); } break; case GDDataTypes.Moorabi: @@ -255,7 +255,7 @@ namespace Scripts.Northrend.Gundrak { GameObject go = GetGameObject(GDDataTypes.MoorabiAltar); if (go) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); } break; default: @@ -423,7 +423,7 @@ namespace Scripts.Northrend.Gundrak public override bool OnGossipHello(Player player, GameObject go) { - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); go.SetGoState(GameObjectState.Active); InstanceScript instance = go.GetInstanceScript(); diff --git a/Source/Scripts/Northrend/IcecrownCitadel/GunshipBattle.cs b/Source/Scripts/Northrend/IcecrownCitadel/GunshipBattle.cs index 1d331bbd8..20a024b15 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/GunshipBattle.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/GunshipBattle.cs @@ -957,7 +957,7 @@ namespace Scripts.Northrend.IcecrownCitadel public override void sGossipSelect(Player player, uint menuId, uint gossipListId) { - me.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); me.GetTransport().EnableMovement(true); _events.SetPhase(GunshipMiscData.PhaseIntro); _events.ScheduleEvent(GunshipEvents.IntroH1, 5000, 0, GunshipMiscData.PhaseIntro); @@ -1202,7 +1202,7 @@ namespace Scripts.Northrend.IcecrownCitadel public override void sGossipSelect(Player player, uint menuId, uint gossipListId) { - me.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); me.GetTransport().EnableMovement(true); _events.SetPhase(GunshipMiscData.PhaseIntro); _events.ScheduleEvent(GunshipEvents.IntroA1, 5000); diff --git a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs index 012d3ef26..149c14cc2 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs @@ -502,6 +502,7 @@ namespace Scripts.Northrend.IcecrownCitadel Creature crok = ObjectAccessor.GetCreature(me, instance.GetGuidData(DataTypes.CrokScourgebane)); if (crok) crok.GetAI().Talk(Texts.SayCrokCombatSvalna); + DoCastSelf(InstanceSpells.DivineSurge, true); _events.ScheduleEvent(EventTypes.SvalnaCombat, 9000); _events.ScheduleEvent(EventTypes.ImpalingSpear, RandomHelper.URand(40000, 50000)); _events.ScheduleEvent(EventTypes.AetherShield, RandomHelper.URand(100000, 110000)); @@ -550,7 +551,7 @@ namespace Scripts.Northrend.IcecrownCitadel case Actions.StartGauntlet: me.setActive(true); _isEventInProgress = true; - me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); + me.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); _events.ScheduleEvent(EventTypes.SvalnaStart, 25000); break; case Actions.ResurrectCaptains: @@ -584,7 +585,7 @@ namespace Scripts.Northrend.IcecrownCitadel _isEventInProgress = false; me.setActive(false); - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); me.SetDisableGravity(false); me.SetHover(false); } @@ -602,7 +603,7 @@ namespace Scripts.Northrend.IcecrownCitadel { Talk(Texts.EmoteSvalnaImpale, target); summon.CastCustomSpell(SharedConst.VehicleSpellRideHardcoded, SpellValueMod.BasePoint0, 1, target, false); - summon.SetFlag(UnitFields.Flags2, UnitFlags2.Unk1 | UnitFlags2.AllowEnemyInteract); + summon.AddUnitFlag2(UnitFlags2.Unk1 | UnitFlags2.AllowEnemyInteract); } break; default: @@ -744,6 +745,7 @@ namespace Scripts.Northrend.IcecrownCitadel { // pause pathing until trash pack is cleared case 0: + me.RemoveUnitFlag(UnitFlags.ImmuneToNpc); Talk(Texts.SayCrokCombatWp0); if (!_aliveTrash.Empty()) SetEscortPaused(true); @@ -1392,8 +1394,8 @@ namespace Scripts.Northrend.IcecrownCitadel if (target) { target.SetReactState(ReactStates.Passive); - target.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.ImmuneToPc); - target.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotCustomSpell02); + target.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.ImmuneToPc); + target.SetEmoteState(Emote.OneshotCustomSpell02); } } @@ -1403,8 +1405,8 @@ namespace Scripts.Northrend.IcecrownCitadel if (target) { target.SetReactState(ReactStates.Aggressive); - target.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.ImmuneToPc); - target.SetUInt32Value(UnitFields.NpcEmotestate, 0); + target.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.ImmuneToPc); + target.SetEmoteState(Emote.StateCustomSpell02); } } diff --git a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadelConst.cs b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadelConst.cs index f9df0c0b1..8da88b8a2 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadelConst.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadelConst.cs @@ -136,6 +136,7 @@ namespace Scripts.Northrend.IcecrownCitadel public const uint ImpalingSpear = 71443; public const uint AetherShield = 71463; public const uint HurlSpear = 71466; + public const uint DivineSurge = 71465; // Captain Arnath public const uint DominateMind = 14515; diff --git a/Source/Scripts/Northrend/IcecrownCitadel/InstanceIcecrownCitadel.cs b/Source/Scripts/Northrend/IcecrownCitadel/InstanceIcecrownCitadel.cs index 4f415999e..5e06d4f42 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/InstanceIcecrownCitadel.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/InstanceIcecrownCitadel.cs @@ -159,12 +159,12 @@ namespace Scripts.Northrend.IcecrownCitadel { if (usable) { - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); go.SetGoState(GameObjectState.Active); } else { - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); go.SetGoState(GameObjectState.Ready); } } @@ -639,7 +639,7 @@ namespace Scripts.Northrend.IcecrownCitadel Creature valithria = instance.GetCreature(ValithriaDreamwalkerGUID); if (valithria) go.SetLootRecipient(valithria.GetLootRecipient(), valithria.GetLootRecipientGroup()); - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); + go.RemoveFlag(GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); break; case GameObjectIds.ArthasPlatform: ArthasPlatformGUID = go.GetGUID(); @@ -851,7 +851,7 @@ namespace Scripts.Northrend.IcecrownCitadel GameObject loot = instance.GetGameObject(GunshipArmoryGUID); if (loot) - loot.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); + loot.RemoveFlag(GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); } else if (state == EncounterState.Fail) _events.ScheduleEvent(TimedEvents.RespawnGunship, 30000); @@ -867,7 +867,7 @@ namespace Scripts.Northrend.IcecrownCitadel Creature deathbringer = instance.GetCreature(DeathbringerSaurfangGUID); if (deathbringer) loot.SetLootRecipient(deathbringer.GetLootRecipient(), deathbringer.GetLootRecipientGroup()); - loot.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); + loot.RemoveFlag(GameObjectFlags.Locked | GameObjectFlags.NotSelectable | GameObjectFlags.NoDespawn); } GameObject teleporter = instance.GetGameObject(TeleporterUpperSpireGUID); diff --git a/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs b/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs index 9d3805510..6fccd74ba 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs @@ -27,131 +27,101 @@ using Game.Scripting; using Game.Spells; using System.Collections.Generic; using System.Linq; +using System; namespace Scripts.Northrend.IcecrownCitadel { - struct LadyTexts + struct TextIds { // Lady Deathwhisper - public const uint SAY_INTRO_1 = 0; - public const uint SAY_INTRO_2 = 1; - public const uint SAY_INTRO_3 = 2; - public const uint SAY_INTRO_4 = 3; - public const uint SAY_INTRO_5 = 4; - public const uint SAY_INTRO_6 = 5; - public const uint SAY_INTRO_7 = 6; - public const uint SAY_AGGRO = 7; - public const uint SAY_PHASE_2 = 8; - public const uint EMOTE_PHASE_2 = 9; - public const uint SAY_DOMINATE_MIND = 10; - public const uint SAY_DARK_EMPOWERMENT = 11; - public const uint SAY_DARK_TRANSFORMATION = 12; - public const uint SAY_ANIMATE_DEAD = 13; - public const uint SAY_KILL = 14; - public const uint SAY_BERSERK = 15; - public const uint SAY_DEATH = 16; + public const uint SayIntro1 = 0; + public const uint SayIntro2 = 1; + public const uint SayIntro3 = 2; + public const uint SayIntro4 = 3; + public const uint SayIntro5 = 4; + public const uint SayIntro6 = 5; + public const uint SayIntro7 = 6; + public const uint SayAggro = 7; + public const uint SayPhase2 = 8; + public const uint EmotePhase2 = 9; + public const uint SayDominateMind = 10; + public const uint SayDarkEmpowerment = 11; + public const uint SayDarkTransformation = 12; + public const uint SayAnimateDead = 13; + public const uint SayKill = 14; + public const uint SayBerserk = 15; + public const uint SayDeath = 16; // Darnavan - public const uint SAY_DARNAVAN_AGGRO = 0; - public const uint SAY_DARNAVAN_RESCUED = 1; + public const uint SayDarnavanAggro = 0; + public const uint SayDarnavanRescued = 1; } - struct LadySpells + struct SpellIds { + public const uint Berserk = 26662; + // Lady Deathwhisper - public const uint MANA_BARRIER = 70842; - public const uint SHADOW_BOLT = 71254; - public const uint DEATH_AND_DECAY = 71001; - public const uint DOMINATE_MIND_H = 71289; - public const uint FROSTBOLT = 71420; - public const uint FROSTBOLT_VOLLEY = 72905; - public const uint TOUCH_OF_INSIGNIFICANCE = 71204; - public const uint SUMMON_SHADE = 71363; - public const uint SHADOW_CHANNELING = 43897; // Prefight; during intro - public const uint DARK_TRANSFORMATION_T = 70895; - public const uint DARK_EMPOWERMENT_T = 70896; - public const uint DARK_MARTYRDOM_T = 70897; + public const uint ManaBarrier = 70842; + public const uint ShadowBolt = 71254; + public const uint DeathAndDecay = 71001; + public const uint DominateMind = 71289; + public const uint DominateMindScale = 71290; + public const uint Frostbolt = 71420; + public const uint FrostboltVolley = 72905; + public const uint TouchOfInsignificance = 71204; + public const uint SummonShade = 71363; + public const uint ShadowChanneling = 43897; + public const uint DarkTransformationT = 70895; + public const uint DarkEmpowermentT = 70896; + public const uint DarkMartyrdomT = 70897; + public const uint SummonSpirits = 72478; // Achievement - public const uint FULL_HOUSE = 72827; // does not exist in dbc but still can be used for criteria check + public const uint FullHouse = 72827; // Does Not Exist In Dbc But Still Can Be Used For Criteria Check // Both Adds - public const uint TELEPORT_VISUAL = 41236; + public const uint TeleportVisual = 41236; + public const uint ClearAllDebuffs = 34098; + public const uint FullHeal = 17683; + public const uint PermanentFeighDeath = 70628; // Fanatics - public const uint DARK_TRANSFORMATION = 70900; - public const uint NECROTIC_STRIKE = 70659; - public const uint SHADOW_CLEAVE = 70670; - public const uint VAMPIRIC_MIGHT = 70674; - public const uint FANATIC_S_DETERMINATION = 71235; - public const uint DARK_MARTYRDOM_FANATIC = 71236; + public const uint DarkTransformation = 70900; + public const uint NecroticStrike = 70659; + public const uint ShadowCleave = 70670; + public const uint VampiricMight = 70674; + public const uint FanaticSDetermination = 71235; + public const uint DarkMartyrdomFanatic = 71236; // Adherents - public const uint DARK_EMPOWERMENT = 70901; - public const uint FROST_FEVER = 67767; - public const uint DEATHCHILL_BOLT = 70594; - public const uint DEATHCHILL_BLAST = 70906; - public const uint CURSE_OF_TORPOR = 71237; - public const uint SHORUD_OF_THE_OCCULT = 70768; - public const uint ADHERENT_S_DETERMINATION = 71234; - public const uint DARK_MARTYRDOM_ADHERENT = 70903; + public const uint DarkEmpowerment = 70901; + public const uint FrostFever = 67767; + public const uint DeathchillBolt = 70594; + public const uint DeathchillBlast = 70906; + public const uint CurseOfTorpor = 71237; + public const uint ShorudOfTheOccult = 70768; + public const uint AdherentSDetermination = 71234; + public const uint DarkMartyrdomAdherent = 70903; // Vengeful Shade - public const uint VENGEFUL_BLAST = 71544; - public const uint VENGEFUL_BLAST_PASSIVE = 71494; - public const uint VENGEFUL_BLAST_25N = 72010; - public const uint VENGEFUL_BLAST_10H = 72011; - public const uint VENGEFUL_BLAST_25H = 72012; + public const uint VengefulBlast = 71544; + public const uint VengefulBlastPassive = 71494; + public const uint VengefulBlast25N = 72010; + public const uint VengefulBlast10H = 72011; + public const uint VengefulBlast25H = 72012; // Darnavan - public const uint BLADESTORM = 65947; - public const uint CHARGE = 65927; - public const uint INTIMIDATING_SHOUT = 65930; - public const uint MORTAL_STRIKE = 65926; - public const uint SHATTERING_THROW = 65940; - public const uint SUNDER_ARMOR = 65936; + public const uint Bladestorm = 65947; + public const uint Charge = 65927; + public const uint IntimidatingShout = 65930; + public const uint MortalStrike = 65926; + public const uint ShatteringThrow = 65940; + public const uint SunderArmor = 65936; } struct LadyEventTypes { - // Lady Deathwhisper - public const uint INTRO_2 = 1; - public const uint INTRO_3 = 2; - public const uint INTRO_4 = 3; - public const uint INTRO_5 = 4; - public const uint INTRO_6 = 5; - public const uint INTRO_7 = 6; - public const uint BERSERK = 7; - public const uint DEATH_AND_DECAY = 8; - public const uint DOMINATE_MIND_H = 9; - - // Phase 1 only - public const uint P1_SUMMON_WAVE = 10; - public const uint P1_SHADOW_BOLT = 11; - public const uint P1_EMPOWER_CULTIST = 12; - public const uint P1_REANIMATE_CULTIST = 13; - - // Phase 2 only - public const uint P2_SUMMON_WAVE = 14; - public const uint P2_FROSTBOLT = 15; - public const uint P2_FROSTBOLT_VOLLEY = 16; - public const uint P2_TOUCH_OF_INSIGNIFICANCE = 17; - public const uint P2_SUMMON_SHADE = 18; - - // Shared adds events - public const uint CULTIST_DARK_MARTYRDOM = 19; - - // Cult Fanatic - public const uint FANATIC_NECROTIC_STRIKE = 20; - public const uint FANATIC_SHADOW_CLEAVE = 21; - public const uint FANATIC_VAMPIRIC_MIGHT = 22; - - // Cult Adherent - public const uint ADHERENT_FROST_FEVER = 23; - public const uint ADHERENT_DEATHCHILL = 24; - public const uint ADHERENT_CURSE_OF_TORPOR = 25; - public const uint ADHERENT_SHORUD_OF_THE_OCCULT = 26; - // Darnavan public const uint DARNAVAN_BLADESTORM = 27; public const uint DARNAVAN_CHARGE = 28; @@ -161,12 +131,27 @@ namespace Scripts.Northrend.IcecrownCitadel public const uint DARNAVAN_SUNDER_ARMOR = 32; } + enum Phases + { + All, + Intro, + One, + Two + } + + struct GroupIds + { + public const uint Intro = 0; + public const uint One = 1; + public const uint Two = 2; + } + struct DeprogrammingData { - public const uint NPC_DARNAVAN_10 = 38472; - public const uint NPC_DARNAVAN_25 = 38485; - public const uint NPC_DARNAVAN_CREDIT_10 = 39091; - public const uint NPC_DARNAVAN_CREDIT_25 = 39092; + public const uint NpcDarnavan10 = 38472; + public const uint NpcDarnavan25 = 38485; + public const uint NpcDarnavanCredit10 = 39091; + public const uint NpcDarnavanCredit25 = 39092; public const int ACTION_COMPLETE_QUEST = -384720; public const uint POINT_DESPAWN = 384721; @@ -174,11 +159,6 @@ namespace Scripts.Northrend.IcecrownCitadel struct LadyConst { - public const byte PhaseAll = 0; - public const byte PhaseIntro = 1; - public const byte PhaseOne = 2; - public const byte PhaseTwo = 3; - public const uint GUIDCultist = 1; public static uint[] SummonEntries = { CreatureIds.CultFanatic, CreatureIds.CultAdherent }; @@ -214,51 +194,87 @@ namespace Scripts.Northrend.IcecrownCitadel [Script] public class boss_lady_deathwhisper : BossAI { - public boss_lady_deathwhisper(Creature creature) - : base(creature, Bosses.LadyDeathwhisper) + public boss_lady_deathwhisper(Creature creature) : base(creature, Bosses.LadyDeathwhisper) { _dominateMindCount = RaidMode(0, 1, 1, 3); _introDone = false; + Initialize(); + } + void Initialize() + { + _waveCounter = 0; + _nextVengefulShadeTargetGUID.Clear(); + _cultistQueue.Clear(); + _darnavanGUID.Clear(); + _phase = Phases.All; + _scheduler.SetValidator(() => + { + return !(me.HasUnitState(UnitState.Casting) && _phase != Phases.Intro); + }); } public override void Reset() { _Reset(); + Initialize(); + _phase = Phases.One; + DoCast(me, SpellIds.ShadowChanneling); me.SetFullPower(PowerType.Mana); - _events.SetPhase(LadyConst.PhaseOne); - _waveCounter = 0; - _nextVengefulShadeTargetGUID.Clear(); - _darnavanGUID.Clear(); - DoCast(me, LadySpells.SHADOW_CHANNELING); - me.RemoveAurasDueToSpell(InstanceSpells.Berserk); - me.RemoveAurasDueToSpell(LadySpells.MANA_BARRIER); me.ApplySpellImmune(0, SpellImmunity.State, AuraType.ModTaunt, false); me.ApplySpellImmune(0, SpellImmunity.Effect, SpellEffectName.AttackMe, false); } - public override void MoveInLineOfSight(Unit who) + public override void DoAction(int action) { - if (!_introDone && me.IsWithinDistInMap(who, 110.0f)) + if (action != 0) + return; + + if (!_introDone) { _introDone = true; - Talk(LadyTexts.SAY_INTRO_1); - _events.SetPhase(LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_2, 11000, 0, LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_3, 21000, 0, LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_4, 31500, 0, LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_5, 39500, 0, LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_6, 48500, 0, LadyConst.PhaseIntro); - _events.ScheduleEvent(LadyEventTypes.INTRO_7, 58000, 0, LadyConst.PhaseIntro); + Talk(TextIds.SayIntro1); + _phase = Phases.Intro; + _scheduler.Schedule(TimeSpan.FromSeconds(10), GroupIds.Intro, task => + { + switch (task.GetRepeatCounter()) + { + case 0: + Talk(TextIds.SayIntro2); + task.Repeat(TimeSpan.FromSeconds(21)); + break; + case 1: + Talk(TextIds.SayIntro3); + task.Repeat(TimeSpan.FromSeconds(11)); + break; + case 2: + Talk(TextIds.SayIntro4); + task.Repeat(TimeSpan.FromSeconds(9)); + break; + case 3: + Talk(TextIds.SayIntro5); + task.Repeat(TimeSpan.FromSeconds(21)); + break; + case 4: + Talk(TextIds.SayIntro6); + task.Repeat(TimeSpan.FromSeconds(10)); + break; + case 5: + Talk(TextIds.SayIntro7); + return; + default: + break; + } + }); } } public override void AttackStart(Unit victim) { - if (me.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable)) + if (me.HasUnitFlag(UnitFlags.NonAttackable)) return; - if (victim && me.Attack(victim, true) && !_events.IsInPhase(LadyConst.PhaseOne)) + if (victim && me.Attack(victim, true) && _phase != Phases.One) me.GetMotionMaster().MoveChase(victim); } @@ -266,38 +282,73 @@ namespace Scripts.Northrend.IcecrownCitadel { if (!instance.CheckRequiredBosses(Bosses.LadyDeathwhisper, who.ToPlayer())) { - EnterEvadeMode(); + EnterEvadeMode(EvadeReason.SequenceBreak); instance.DoCastSpellOnPlayers(TeleporterSpells.LIGHT_S_HAMMER_TELEPORT); return; } + me.SetCombatPulseDelay(5); me.setActive(true); DoZoneInCombat(); + _phase = Phases.One; + _scheduler.CancelGroup(GroupIds.Intro); - _events.Reset(); - _events.SetPhase(LadyConst.PhaseOne); // phase-independent events - _events.ScheduleEvent(LadyEventTypes.BERSERK, 600000); - _events.ScheduleEvent(LadyEventTypes.DEATH_AND_DECAY, 10000); - // phase one only - _events.ScheduleEvent(LadyEventTypes.P1_SUMMON_WAVE, 5000, 0, LadyConst.PhaseOne); - _events.ScheduleEvent(LadyEventTypes.P1_SHADOW_BOLT, RandomHelper.URand(5500, 6000), 0, LadyConst.PhaseOne); - _events.ScheduleEvent(LadyEventTypes.P1_EMPOWER_CULTIST, RandomHelper.URand(20000, 30000), 0, LadyConst.PhaseOne); - _events.ScheduleEvent(LadyEventTypes.P1_REANIMATE_CULTIST, RandomHelper.URand(10000, 20000), 0, LadyConst.PhaseOne); + _scheduler.Schedule(TimeSpan.FromMinutes(10), context => + { + DoCastSelf(SpellIds.Berserk); + Talk(TextIds.SayBerserk); + }).Schedule(TimeSpan.FromSeconds(17), death_and_decay => + { + Unit target = SelectTarget(SelectAggroTarget.Random); + if (target) + DoCast(target, SpellIds.DeathAndDecay); + death_and_decay.Repeat(TimeSpan.FromSeconds(22), TimeSpan.FromSeconds(30)); + }); + if (GetDifficulty() != Difficulty.Raid10N) - _events.ScheduleEvent(LadyEventTypes.DOMINATE_MIND_H, 27000); + { + _scheduler.Schedule(TimeSpan.FromSeconds(27), dominate_mind => + { + Talk(TextIds.SayDominateMind); + for (byte i = 0; i < _dominateMindCount; i++) + { + Unit target = SelectTarget(SelectAggroTarget.Random, 1, 0.0f, true, -(int)SpellIds.DominateMind); + if (target != null) + DoCast(target, SpellIds.DominateMind); + } + dominate_mind.Repeat(TimeSpan.FromSeconds(40), TimeSpan.FromSeconds(45)); + }); + } - Talk(LadyTexts.SAY_AGGRO); + // phase one only + _scheduler.Schedule(TimeSpan.FromSeconds(5), GroupIds.One, wave => + { + SummonWaveP1(); + wave.Repeat(TimeSpan.FromSeconds(IsHeroic() ? 45 : 60)); + }).Schedule(TimeSpan.FromSeconds(2), GroupIds.One, shadow_bolt => + { + Unit target = SelectTarget(SelectAggroTarget.Random); + if (target != null) + DoCast(target, SpellIds.ShadowBolt); + shadow_bolt.Repeat(TimeSpan.FromMilliseconds(2450), TimeSpan.FromMilliseconds(3600)); + }).Schedule(TimeSpan.FromSeconds(15), GroupIds.One, context => + { + DoImproveCultist(); + context.Repeat(TimeSpan.FromSeconds(25)); + }); + + + Talk(TextIds.SayAggro); DoStartNoMovement(who); - me.RemoveAurasDueToSpell(LadySpells.SHADOW_CHANNELING); - DoCast(me, LadySpells.MANA_BARRIER, true); - + me.RemoveAurasDueToSpell(SpellIds.ShadowChanneling); + DoCast(me, SpellIds.ManaBarrier, true); instance.SetBossState(Bosses.LadyDeathwhisper, EncounterState.InProgress); } public override void JustDied(Unit killer) { - Talk(LadyTexts.SAY_DEATH); + Talk(TextIds.SayDeath); List livingAddEntries = new List(); // Full House achievement @@ -310,7 +361,7 @@ namespace Scripts.Northrend.IcecrownCitadel } if (livingAddEntries.Count >= 5) - instance.DoUpdateCriteria(CriteriaTypes.BeSpellTarget, LadySpells.FULL_HOUSE, 0, me); + instance.DoUpdateCriteria(CriteriaTypes.BeSpellTarget, SpellIds.FullHouse, 0, me); Creature darnavan = ObjectAccessor.GetCreature(me, _darnavanGUID); if (darnavan) @@ -322,7 +373,7 @@ namespace Scripts.Northrend.IcecrownCitadel darnavan.GetMotionMaster().MoveIdle(); darnavan.SetReactState(ReactStates.Passive); darnavan.m_Events.AddEvent(new DaranavanMoveEvent(darnavan), darnavan.m_Events.CalculateTime(10000)); - darnavan.GetAI().Talk(LadyTexts.SAY_DARNAVAN_RESCUED); + darnavan.GetAI().Talk(TextIds.SayDarnavanRescued); Player owner = killer.GetCharmerOrOwnerPlayerOrPlayerItself(); if (owner) { @@ -345,177 +396,116 @@ namespace Scripts.Northrend.IcecrownCitadel _JustDied(); } - public override void JustReachedHome() + public override void EnterEvadeMode(EvadeReason why = EvadeReason.Other) { - _JustReachedHome(); - instance.SetBossState(Bosses.LadyDeathwhisper, EncounterState.Fail); - + _scheduler.CancelAll(); summons.DespawnAll(); + Creature darnavan = ObjectAccessor.GetCreature(me, _darnavanGUID); - if (darnavan) - { + if (darnavan != null) darnavan.DespawnOrUnsummon(); - _darnavanGUID.Clear(); - } + + _DespawnAtEvade(); } public override void KilledUnit(Unit victim) { if (victim.IsTypeId(TypeId.Player)) - Talk(LadyTexts.SAY_KILL); + Talk(TextIds.SayKill); } public override void DamageTaken(Unit damageDealer, ref uint damage) { // phase transition - if (_events.IsInPhase(LadyConst.PhaseOne) && damage > (uint)me.GetPower(PowerType.Mana)) + if (_phase == Phases.One && damage > (uint)me.GetPower(PowerType.Mana)) { - Talk(LadyTexts.SAY_PHASE_2); - Talk(LadyTexts.EMOTE_PHASE_2); + _phase = Phases.Two; + Talk(TextIds.SayPhase2); + Talk(TextIds.EmotePhase2); DoStartMovement(me.GetVictim()); + DoResetThreat(); + damage -= (uint)me.GetPower(PowerType.Mana); me.SetPower(PowerType.Mana, 0); - me.RemoveAurasDueToSpell(LadySpells.MANA_BARRIER); - _events.SetPhase(LadyConst.PhaseTwo); - _events.ScheduleEvent(LadyEventTypes.P2_FROSTBOLT, RandomHelper.URand(10000, 12000), 0, LadyConst.PhaseTwo); - _events.ScheduleEvent(LadyEventTypes.P2_FROSTBOLT_VOLLEY, RandomHelper.URand(19000, 21000), 0, LadyConst.PhaseTwo); - _events.ScheduleEvent(LadyEventTypes.P2_TOUCH_OF_INSIGNIFICANCE, RandomHelper.URand(6000, 9000), 0, LadyConst.PhaseTwo); - _events.ScheduleEvent(LadyEventTypes.P2_SUMMON_SHADE, RandomHelper.URand(12000, 15000), 0, LadyConst.PhaseTwo); + me.RemoveAurasDueToSpell(SpellIds.ManaBarrier); + _scheduler.CancelGroup(GroupIds.One); + + _scheduler.Schedule(TimeSpan.FromSeconds(12), GroupIds.Two, frostbolt => + { + DoCastVictim(SpellIds.Frostbolt); + frostbolt.Repeat(); + }).Schedule(TimeSpan.FromSeconds(20), GroupIds.Two, frostboldVolley => + { + DoCastAOE(SpellIds.FrostboltVolley); + frostboldVolley.Repeat(); + }).Schedule(TimeSpan.FromSeconds(6), TimeSpan.FromSeconds(9), GroupIds.Two, touch => + { + if (me.GetVictim()) + me.AddAura(SpellIds.TouchOfInsignificance, me.GetVictim()); + touch.Repeat(); + }).Schedule(TimeSpan.FromSeconds(12), GroupIds.Two, summonShade => + { + me.CastCustomSpell(SpellIds.SummonSpirits, SpellValueMod.MaxTargets, Is25ManRaid() ? 2 : 1); + summonShade.Repeat(); + }); + // on heroic mode Lady Deathwhisper is immune to taunt effects in phase 2 and continues summoning adds if (IsHeroic()) { me.ApplySpellImmune(0, SpellImmunity.State, AuraType.ModTaunt, true); me.ApplySpellImmune(0, SpellImmunity.Effect, SpellEffectName.AttackMe, true); - _events.ScheduleEvent(LadyEventTypes.P2_SUMMON_WAVE, 45000, 0, LadyConst.PhaseTwo); + _scheduler.Schedule(TimeSpan.FromSeconds(0), GroupIds.Two, context => + { + SummonWaveP2(); + context.Repeat(TimeSpan.FromSeconds(45)); + }); } } } + public override void SpellHitTarget(Unit target, SpellInfo spell) + { + if (spell.Id == SpellIds.SummonSpirits) + _nextVengefulShadeTargetGUID.Add(target.GetGUID()); + } + public override void JustSummoned(Creature summon) { - if (summon.GetEntry() == NPC_DARNAVAN) - _darnavanGUID = summon.GetGUID(); - else - summons.Summon(summon); - - Unit target = null; - if (summon.GetEntry() == CreatureIds.VengefulShade) + switch (summon.GetEntry()) { - target = Global.ObjAccessor.GetUnit(me, _nextVengefulShadeTargetGUID); // Vengeful Shade - _nextVengefulShadeTargetGUID.Clear(); + case DeprogrammingData.NpcDarnavan10: + case DeprogrammingData.NpcDarnavan25: + _darnavanGUID = summon.GetGUID(); + summon.GetAI().AttackStart(SelectTarget(SelectAggroTarget.Random)); + return; + case CreatureIds.VengefulShade: + if (_nextVengefulShadeTargetGUID.Empty()) + break; + summon.GetAI().SetGUID(_nextVengefulShadeTargetGUID.First()); + _nextVengefulShadeTargetGUID.RemoveAt(0); + break; + case CreatureIds.CultAdherent: + case CreatureIds.CultFanatic: + _cultistQueue.Add(summon.GetGUID()); + summon.GetAI().AttackStart(SelectTarget(SelectAggroTarget.Random)); + break; + default: + break; } - else - target = SelectTarget(SelectAggroTarget.Random); // Wave adds - - summon.GetAI().AttackStart(target); // CAN be NULL + summons.Summon(summon); } public override void UpdateAI(uint diff) { - if ((!UpdateVictim() && !_events.IsInPhase(LadyConst.PhaseIntro))) + if (!UpdateVictim() && _phase != Phases.Intro) return; - _events.Update(diff); - - if (me.HasUnitState(UnitState.Casting) && !_events.IsInPhase(LadyConst.PhaseIntro)) - return; - - Unit target; - - _events.ExecuteEvents(eventId => + _scheduler.Update(diff, () => { - - switch (eventId) - { - case LadyEventTypes.INTRO_2: - Talk(LadyTexts.SAY_INTRO_2); - break; - case LadyEventTypes.INTRO_3: - Talk(LadyTexts.SAY_INTRO_3); - break; - case LadyEventTypes.INTRO_4: - Talk(LadyTexts.SAY_INTRO_4); - break; - case LadyEventTypes.INTRO_5: - Talk(LadyTexts.SAY_INTRO_5); - break; - case LadyEventTypes.INTRO_6: - Talk(LadyTexts.SAY_INTRO_6); - break; - case LadyEventTypes.INTRO_7: - Talk(LadyTexts.SAY_INTRO_7); - break; - case LadyEventTypes.DEATH_AND_DECAY: - target = SelectTarget(SelectAggroTarget.Random); - if (target) - DoCast(target, LadySpells.DEATH_AND_DECAY); - _events.ScheduleEvent(LadyEventTypes.DEATH_AND_DECAY, RandomHelper.URand(22000, 30000)); - break; - case LadyEventTypes.DOMINATE_MIND_H: - Talk(LadyTexts.SAY_DOMINATE_MIND); - for (byte i = 0; i < _dominateMindCount; i++) - { - target = SelectTarget(SelectAggroTarget.Random, 1, 0.0f, true, -(int)LadySpells.DOMINATE_MIND_H); - if (target) - DoCast(target, LadySpells.DOMINATE_MIND_H); - } - _events.ScheduleEvent(LadyEventTypes.DOMINATE_MIND_H, RandomHelper.URand(40000, 45000)); - break; - case LadyEventTypes.P1_SUMMON_WAVE: - SummonWaveP1(); - _events.ScheduleEvent(LadyEventTypes.P1_SUMMON_WAVE, (uint)(IsHeroic() ? 45000 : 60000), 0, LadyConst.PhaseOne); - break; - case LadyEventTypes.P1_SHADOW_BOLT: - target = SelectTarget(SelectAggroTarget.Random); - if (target) - DoCast(target, LadySpells.SHADOW_BOLT); - _events.ScheduleEvent(LadyEventTypes.P1_SHADOW_BOLT, RandomHelper.URand(5000, 8000), 0, LadyConst.PhaseOne); - break; - case LadyEventTypes.P1_REANIMATE_CULTIST: - ReanimateCultist(); - _events.ScheduleEvent(LadyEventTypes.P1_REANIMATE_CULTIST, RandomHelper.URand(6000, 25000), 0, LadyConst.PhaseOne); - break; - case LadyEventTypes.P1_EMPOWER_CULTIST: - EmpowerCultist(); - _events.ScheduleEvent(LadyEventTypes.P1_EMPOWER_CULTIST, RandomHelper.URand(18000, 25000), 0, LadyConst.PhaseOne); - break; - case LadyEventTypes.P2_FROSTBOLT: - DoCastVictim(LadySpells.FROSTBOLT); - _events.ScheduleEvent(LadyEventTypes.P2_FROSTBOLT, RandomHelper.URand(10000, 11000), 0, LadyConst.PhaseTwo); - break; - case LadyEventTypes.P2_FROSTBOLT_VOLLEY: - DoCastAOE(LadySpells.FROSTBOLT_VOLLEY); - _events.ScheduleEvent(LadyEventTypes.P2_FROSTBOLT_VOLLEY, RandomHelper.URand(13000, 15000), 0, LadyConst.PhaseTwo); - break; - case LadyEventTypes.P2_TOUCH_OF_INSIGNIFICANCE: - DoCastVictim(LadySpells.TOUCH_OF_INSIGNIFICANCE); - _events.ScheduleEvent(LadyEventTypes.P2_TOUCH_OF_INSIGNIFICANCE, RandomHelper.URand(9000, 13000), 0, LadyConst.PhaseTwo); - break; - case LadyEventTypes.P2_SUMMON_SHADE: - Unit shadeTarget = SelectTarget(SelectAggroTarget.Random, 1); - if (shadeTarget) - { - _nextVengefulShadeTargetGUID = shadeTarget.GetGUID(); - DoCast(shadeTarget, LadySpells.SUMMON_SHADE); - } - _events.ScheduleEvent(LadyEventTypes.P2_SUMMON_SHADE, RandomHelper.URand(18000, 23000), 0, LadyConst.PhaseTwo); - break; - case LadyEventTypes.P2_SUMMON_WAVE: - SummonWaveP2(); - _events.ScheduleEvent(LadyEventTypes.P2_SUMMON_WAVE, 45000, 0, LadyConst.PhaseTwo); - break; - case LadyEventTypes.BERSERK: - DoCast(me, InstanceSpells.Berserk); - Talk(LadyTexts.SAY_BERSERK); - break; - } + // We should not melee attack when barrier is up + if (!me.HasAura(SpellIds.ManaBarrier)) + DoMeleeAttackIfReady(); }); - - // We should not melee attack when barrier is up - if (me.HasAura(LadySpells.MANA_BARRIER)) - return; - - DoMeleeAttackIfReady(); } // summoning function for first phase @@ -564,105 +554,118 @@ namespace Scripts.Northrend.IcecrownCitadel { TempSummon summon = me.SummonCreature(entry, pos, TempSummonType.CorpseTimedDespawn, 10000); if (summon) - summon.GetAI().DoCast(summon, LadySpells.TELEPORT_VISUAL); + summon.CastSpell(summon, SpellIds.TeleportVisual); } - void ReanimateCultist() + public override void SummonedCreatureDies(Creature summon, Unit killer) { - if (summons.Empty()) - return; - - List temp = new List(); - foreach (var guid in summons) - { - Creature cre = ObjectAccessor.GetCreature(me, guid); - if (cre) - if (cre.IsAlive() && (cre.GetEntry() == CreatureIds.CultFanatic || cre.GetEntry() == CreatureIds.CultAdherent)) - temp.Add(cre); - } - - if (temp.Empty()) - return; - - Creature cultist = temp.SelectRandom(); - DoCast(cultist, LadySpells.DARK_MARTYRDOM_T, true); + if (summon.GetEntry() == CreatureIds.CultAdherent || summon.GetEntry() == CreatureIds.CultFanatic) + _cultistQueue.Remove(summon.GetGUID()); } - void EmpowerCultist() + void DoImproveCultist() { - if (summons.Empty()) + if (_cultistQueue.Empty()) return; - List temp = new List(); - foreach (var guid in summons) + _cultistGUID = _cultistQueue.SelectRandom(); + _cultistQueue.Remove(_cultistGUID); + Creature cultist = ObjectAccessor.GetCreature(me, _cultistGUID); + if (!cultist) + return; + + if (RandomHelper.RAND(0, 1) != 0) + me.CastSpell(cultist, SpellIds.DarkMartyrdomT); + else { - Creature cre = ObjectAccessor.GetCreature(me, guid); - if (cre) - if (cre.IsAlive() && (cre.GetEntry() == CreatureIds.CultFanatic || cre.GetEntry() == CreatureIds.CultAdherent)) - temp.Add(cre); + me.CastSpell(cultist, cultist.GetEntry() == CreatureIds.CultFanatic ? SpellIds.DarkTransformationT : SpellIds.DarkEmpowermentT, true); + Talk(cultist.GetEntry() == CreatureIds.CultFanatic ? TextIds.SayDarkTransformation : TextIds.SayDarkEmpowerment); } - - // noone to empower - if (temp.Empty()) - return; - - // select random cultist - Creature cultist = temp.SelectRandom(); - DoCast(cultist, cultist.GetEntry() == CreatureIds.CultFanatic ? LadySpells.DARK_TRANSFORMATION_T : LadySpells.DARK_EMPOWERMENT_T, true); - Talk(cultist.GetEntry() == CreatureIds.CultFanatic ? LadyTexts.SAY_DARK_TRANSFORMATION : LadyTexts.SAY_DARK_EMPOWERMENT); } - ObjectGuid _nextVengefulShadeTargetGUID; ObjectGuid _darnavanGUID; + ObjectGuid _cultistGUID; + List _cultistQueue = new List(); + List _nextVengefulShadeTargetGUID = new List(); + uint _waveCounter; byte _dominateMindCount; + Phases _phase; bool _introDone; - uint NPC_DARNAVAN { get { return RaidMode(DeprogrammingData.NPC_DARNAVAN_10, DeprogrammingData.NPC_DARNAVAN_25, DeprogrammingData.NPC_DARNAVAN_10, DeprogrammingData.NPC_DARNAVAN_25); } } - uint NPC_DARNAVAN_CREDIT { get { return RaidMode(DeprogrammingData.NPC_DARNAVAN_CREDIT_10, DeprogrammingData.NPC_DARNAVAN_CREDIT_25, DeprogrammingData.NPC_DARNAVAN_CREDIT_10, DeprogrammingData.NPC_DARNAVAN_CREDIT_25); } } - uint QUEST_DEPROGRAMMING { get { return RaidMode(WeeklyQuestIds.Deprogramming10, WeeklyQuestIds.Deprogramming25, WeeklyQuestIds.Deprogramming10, WeeklyQuestIds.Deprogramming25); } } + uint NPC_DARNAVAN { get { return RaidMode(DeprogrammingData.NpcDarnavan10, DeprogrammingData.NpcDarnavan25, DeprogrammingData.NpcDarnavan10, DeprogrammingData.NpcDarnavan25); } } + uint NPC_DARNAVAN_CREDIT { get { return RaidMode(DeprogrammingData.NpcDarnavanCredit10, DeprogrammingData.NpcDarnavanCredit25, DeprogrammingData.NpcDarnavanCredit10, DeprogrammingData.NpcDarnavanCredit25); } } + uint QUEST_DEPROGRAMMING { get { return RaidMode(WeeklyQuestIds.Deprogramming10, WeeklyQuestIds.Deprogramming25, WeeklyQuestIds.Deprogramming10, WeeklyQuestIds.Deprogramming25); } } } [Script] class npc_cult_fanatic : ScriptedAI { - public npc_cult_fanatic(Creature creature) : base(creature) { } + public npc_cult_fanatic(Creature creature) : base(creature) + { + _instance = creature.GetInstanceScript(); + } public override void Reset() { - _events.Reset(); - _events.ScheduleEvent(LadyEventTypes.FANATIC_NECROTIC_STRIKE, RandomHelper.URand(10000, 12000)); - _events.ScheduleEvent(LadyEventTypes.FANATIC_SHADOW_CLEAVE, RandomHelper.URand(14000, 16000)); - _events.ScheduleEvent(LadyEventTypes.FANATIC_VAMPIRIC_MIGHT, RandomHelper.URand(20000, 27000)); + _scheduler.CancelAll(); + _scheduler.SetValidator(() => + { + return !me.HasUnitState(UnitState.Casting); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(17), vampiric_might => + { + DoCastSelf(SpellIds.VampiricMight); + vampiric_might.Repeat(TimeSpan.FromSeconds(25)); + }).Schedule(TimeSpan.FromSeconds(12), shadow_cleave => + { + DoCastVictim(SpellIds.ShadowCleave); + shadow_cleave.Repeat(TimeSpan.FromSeconds(14)); + }).Schedule(TimeSpan.FromSeconds(10), necrotic_strike => + { + DoCastVictim(SpellIds.NecroticStrike); + necrotic_strike.Repeat(TimeSpan.FromSeconds(17)); + }); } public override void SpellHit(Unit caster, SpellInfo spell) { switch (spell.Id) { - case LadySpells.DARK_TRANSFORMATION: + case SpellIds.DarkTransformationT: + me.InterruptNonMeleeSpells(true); + DoCastSelf(SpellIds.DarkTransformation); + break; + case SpellIds.DarkTransformation: + DoCastSelf(SpellIds.FullHeal); me.UpdateEntry(CreatureIds.DeformedFanatic); break; - case LadySpells.DARK_TRANSFORMATION_T: - if (me.HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead)) - break; - me.InterruptNonMeleeSpells(true); - DoCast(me, LadySpells.DARK_TRANSFORMATION); - break; - case LadySpells.DARK_MARTYRDOM_T: - me.InterruptNonMeleeSpells(true); - DoCast(me, LadySpells.DARK_MARTYRDOM_FANATIC); - break; - case LadySpells.DARK_MARTYRDOM_FANATIC: // 10nm - case 72495: // 25nm - case 72496: // 10hc - case 72497: // 25hc - me.SetFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.Pacified | UnitFlags.NonAttackable | UnitFlags.Unk29); - me.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - me.SetFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); + case SpellIds.DarkMartyrdomT: me.SetReactState(ReactStates.Passive); + me.InterruptNonMeleeSpells(true); me.AttackStop(); - _events.ScheduleEvent(LadyEventTypes.CULTIST_DARK_MARTYRDOM, 4000); + DoCastSelf(SpellIds.DarkMartyrdomFanatic); + break; + case SpellIds.DarkMartyrdomFanatic: + _scheduler.Schedule(TimeSpan.FromSeconds(2), context => + { + me.UpdateEntry(CreatureIds.ReanimatedFanatic); + DoCastSelf(SpellIds.PermanentFeighDeath); + DoCastSelf(SpellIds.ClearAllDebuffs); + DoCastSelf(SpellIds.FullHeal, true); + me.AddUnitFlag(UnitFlags.Stunned | UnitFlags.Unk29 | UnitFlags.NotSelectable); + }).Schedule(TimeSpan.FromSeconds(6), context => + { + me.RemoveAurasDueToSpell(SpellIds.PermanentFeighDeath); + me.RemoveUnitFlag(UnitFlags.Stunned | UnitFlags.Unk29 | UnitFlags.NotSelectable); + me.SetReactState(ReactStates.Aggressive); + DoZoneInCombat(me); + + Creature ladyDeathwhisper = ObjectAccessor.GetCreature(me, _instance.GetGuidData(Bosses.LadyDeathwhisper)); + if (ladyDeathwhisper != null) + ladyDeathwhisper.GetAI().Talk(TextIds.SayAnimateDead); + }); break; default: break; @@ -672,94 +675,87 @@ namespace Scripts.Northrend.IcecrownCitadel public override void UpdateAI(uint diff) { - if (!UpdateVictim()) + if (!UpdateVictim() && !me.HasAura(SpellIds.PermanentFeighDeath)) return; - _events.Update(diff); - - if (me.HasUnitState(UnitState.Casting)) - return; - - _events.ExecuteEvents(eventId => + _scheduler.Update(diff, () => { - switch (eventId) - { - case LadyEventTypes.FANATIC_NECROTIC_STRIKE: - DoCastVictim(LadySpells.NECROTIC_STRIKE); - _events.ScheduleEvent(LadyEventTypes.FANATIC_NECROTIC_STRIKE, RandomHelper.URand(11000, 13000)); - break; - case LadyEventTypes.FANATIC_SHADOW_CLEAVE: - DoCastVictim(LadySpells.SHADOW_CLEAVE); - _events.ScheduleEvent(LadyEventTypes.FANATIC_SHADOW_CLEAVE, RandomHelper.URand(9500, 11000)); - break; - case LadyEventTypes.FANATIC_VAMPIRIC_MIGHT: - DoCast(me, LadySpells.VAMPIRIC_MIGHT); - _events.ScheduleEvent(LadyEventTypes.FANATIC_VAMPIRIC_MIGHT, RandomHelper.URand(20000, 27000)); - break; - case LadyEventTypes.CULTIST_DARK_MARTYRDOM: - if (me.IsSummon()) - { - Unit owner = me.ToTempSummon().GetSummoner(); - if (owner) - if (owner.ToCreature()) - owner.ToCreature().GetAI().Talk(LadyTexts.SAY_ANIMATE_DEAD); - } - me.UpdateEntry(CreatureIds.ReanimatedFanatic); - me.RemoveFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.Pacified | UnitFlags.NonAttackable | UnitFlags.Unk29); - me.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - me.RemoveFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); - DoCast(me, LadySpells.FANATIC_S_DETERMINATION); - me.SetReactState(ReactStates.Aggressive); - AttackStart(SelectTarget(SelectAggroTarget.Random)); - break; - } + DoMeleeAttackIfReady(); }); - - DoMeleeAttackIfReady(); } + + InstanceScript _instance; } [Script] class npc_cult_adherent : ScriptedAI { - public npc_cult_adherent(Creature creature) : base(creature) { } + public npc_cult_adherent(Creature creature) : base(creature) + { + _instance = creature.GetInstanceScript(); + } public override void Reset() { - _events.Reset(); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_FROST_FEVER, RandomHelper.URand(10000, 12000)); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_DEATHCHILL, RandomHelper.URand(14000, 16000)); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_CURSE_OF_TORPOR, RandomHelper.URand(14000, 16000)); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_SHORUD_OF_THE_OCCULT, RandomHelper.URand(32000, 39000)); + _scheduler.CancelAll(); + _scheduler.SetValidator(() => + { + return !me.HasUnitState(UnitState.Casting); + }); + + _scheduler.Schedule(TimeSpan.FromSeconds(5), deathchill => + { + if (me.GetEntry() == CreatureIds.EmpoweredAdherent) + DoCastVictim(SpellIds.DeathchillBlast); + else + DoCastVictim(SpellIds.DeathchillBolt); + deathchill.Repeat(TimeSpan.FromMilliseconds(2500)); + }).Schedule(TimeSpan.FromSeconds(15), shroud_of_the_occult => + { + DoCastSelf(SpellIds.ShorudOfTheOccult); + shroud_of_the_occult.Repeat(TimeSpan.FromSeconds(10)); + }).Schedule(TimeSpan.FromSeconds(15), curse_of_torpor => + { + Unit target = SelectTarget(SelectAggroTarget.Random, 1); + if (target != null) + DoCast(target, SpellIds.CurseOfTorpor); + curse_of_torpor.Repeat(TimeSpan.FromSeconds(18)); + }); } public override void SpellHit(Unit caster, SpellInfo spell) { switch (spell.Id) { - case LadySpells.DARK_EMPOWERMENT: + case SpellIds.DarkEmpowermentT: me.UpdateEntry(CreatureIds.EmpoweredAdherent); break; - case LadySpells.DARK_EMPOWERMENT_T: - if (me.HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead)) - break; - me.InterruptNonMeleeSpells(true); - DoCast(me, LadySpells.DARK_EMPOWERMENT); - break; - case LadySpells.DARK_MARTYRDOM_T: - me.InterruptNonMeleeSpells(true); - DoCast(me, LadySpells.DARK_MARTYRDOM_ADHERENT); - break; - case LadySpells.DARK_MARTYRDOM_ADHERENT: // 10nm - case 72498: // 25nm - case 72499: // 10hc - case 72500: // 25hc - me.SetFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.Pacified | UnitFlags.NonAttackable | UnitFlags.Unk29); - me.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - me.SetFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); + case SpellIds.DarkMartyrdomT: me.SetReactState(ReactStates.Passive); + me.InterruptNonMeleeSpells(true); me.AttackStop(); - _events.ScheduleEvent(LadyEventTypes.CULTIST_DARK_MARTYRDOM, 4000); + DoCastSelf(SpellIds.DarkMartyrdomAdherent); + break; + case SpellIds.DarkMartyrdomAdherent: + _scheduler.Schedule(TimeSpan.FromSeconds(2), context => + { + me.UpdateEntry(CreatureIds.ReanimatedAdherent); + DoCastSelf(SpellIds.PermanentFeighDeath); + DoCastSelf(SpellIds.ClearAllDebuffs); + DoCastSelf(SpellIds.FullHeal, true); + me.AddUnitFlag(UnitFlags.Stunned | UnitFlags.Unk29 | UnitFlags.NotSelectable); + }).Schedule(TimeSpan.FromSeconds(6), context => + { + me.RemoveAurasDueToSpell(SpellIds.PermanentFeighDeath); + me.RemoveUnitFlag(UnitFlags.Stunned | UnitFlags.Unk29 | UnitFlags.NotSelectable); + me.SetReactState(ReactStates.Aggressive); + DoCastSelf(SpellIds.ShorudOfTheOccult); + DoZoneInCombat(me); + + Creature ladyDeathwhisper = ObjectAccessor.GetCreature(me, _instance.GetGuidData(Bosses.LadyDeathwhisper)); + if (ladyDeathwhisper != null) + ladyDeathwhisper.GetAI().Talk(TextIds.SayAnimateDead); + }); break; default: break; @@ -768,97 +764,78 @@ namespace Scripts.Northrend.IcecrownCitadel public override void UpdateAI(uint diff) { - if (!UpdateVictim()) + if (!UpdateVictim() && !me.HasAura(SpellIds.PermanentFeighDeath)) return; - _events.Update(diff); - - if (me.HasUnitState(UnitState.Casting)) - return; - - _events.ExecuteEvents(eventId => - { - switch (eventId) - { - case LadyEventTypes.ADHERENT_FROST_FEVER: - DoCastVictim(LadySpells.FROST_FEVER); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_FROST_FEVER, RandomHelper.URand(9000, 13000)); - break; - case LadyEventTypes.ADHERENT_DEATHCHILL: - if (me.GetEntry() == CreatureIds.EmpoweredAdherent) - DoCastVictim(LadySpells.DEATHCHILL_BLAST); - else - DoCastVictim(LadySpells.DEATHCHILL_BOLT); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_DEATHCHILL, RandomHelper.URand(9000, 13000)); - break; - case LadyEventTypes.ADHERENT_CURSE_OF_TORPOR: - Unit target = SelectTarget(SelectAggroTarget.Random, 1); - if (target) - DoCast(target, LadySpells.CURSE_OF_TORPOR); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_CURSE_OF_TORPOR, RandomHelper.URand(9000, 13000)); - break; - case LadyEventTypes.ADHERENT_SHORUD_OF_THE_OCCULT: - DoCast(me, LadySpells.SHORUD_OF_THE_OCCULT); - _events.ScheduleEvent(LadyEventTypes.ADHERENT_SHORUD_OF_THE_OCCULT, RandomHelper.URand(27000, 32000)); - break; - case LadyEventTypes.CULTIST_DARK_MARTYRDOM: - if (me.IsSummon()) - { - Unit owner = me.ToTempSummon().GetSummoner(); - if (owner) - if (owner.ToCreature()) - owner.ToCreature().GetAI().Talk(LadyTexts.SAY_ANIMATE_DEAD); - } - me.UpdateEntry(CreatureIds.ReanimatedAdherent); - me.RemoveFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.Pacified | UnitFlags.NonAttackable | UnitFlags.Unk29); - me.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - me.RemoveFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); - DoCast(me, LadySpells.FANATIC_S_DETERMINATION); - me.SetReactState(ReactStates.Aggressive); - AttackStart(SelectTarget(SelectAggroTarget.Random)); - break; - } - }); - - DoMeleeAttackIfReady(); + _scheduler.Update(diff); } + + InstanceScript _instance; } [Script] class npc_vengeful_shade : ScriptedAI { - public npc_vengeful_shade(Creature creature) : base(creature) - { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); - } + public npc_vengeful_shade(Creature creature) : base(creature) { } public override void Reset() { - me.AddAura(LadySpells.VENGEFUL_BLAST_PASSIVE, me); + me.SetReactState(ReactStates.Passive); + me.AddAura(SpellIds.VengefulBlastPassive, me); + + _scheduler.Schedule(TimeSpan.FromSeconds(2), context => + { + me.SetReactState(ReactStates.Aggressive); + me.GetAI().AttackStart(Global.ObjAccessor.GetUnit(me, _targetGUID)); + }).Schedule(TimeSpan.FromSeconds(7), context => + { + me.KillSelf(); + }); + } + + public override void SetGUID(ObjectGuid guid, int id = 0) + { + _targetGUID = guid; } public override void SpellHitTarget(Unit target, SpellInfo spell) { switch (spell.Id) { - case LadySpells.VENGEFUL_BLAST: - case LadySpells.VENGEFUL_BLAST_25N: - case LadySpells.VENGEFUL_BLAST_10H: - case LadySpells.VENGEFUL_BLAST_25H: + case SpellIds.VengefulBlast: + case SpellIds.VengefulBlast25N: + case SpellIds.VengefulBlast10H: + case SpellIds.VengefulBlast25H: me.KillSelf(); break; default: break; } } + + public override void UpdateAI(uint diff) + { + _scheduler.Update(diff, () => + { + DoMeleeAttackIfReady(); + }); + } + + ObjectGuid _targetGUID; } [Script] class npc_darnavan : ScriptedAI { - public npc_darnavan(Creature creature) - : base(creature) + public npc_darnavan(Creature creature) : base(creature) { + Initialize(); + } + + void Initialize() + { + _canCharge = true; + _canShatter = true; } public override void Reset() @@ -868,8 +845,7 @@ namespace Scripts.Northrend.IcecrownCitadel _events.ScheduleEvent(LadyEventTypes.DARNAVAN_INTIMIDATING_SHOUT, RandomHelper.URand(20000, 25000)); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_MORTAL_STRIKE, RandomHelper.URand(25000, 30000)); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_SUNDER_ARMOR, RandomHelper.URand(5000, 8000)); - _canCharge = true; - _canShatter = true; + Initialize(); } public override void JustDied(Unit killer) @@ -903,7 +879,7 @@ namespace Scripts.Northrend.IcecrownCitadel public override void EnterCombat(Unit victim) { - Talk(LadyTexts.SAY_DARNAVAN_AGGRO); + Talk(TextIds.SayDarnavanAggro); } public override void UpdateAI(uint diff) @@ -918,7 +894,7 @@ namespace Scripts.Northrend.IcecrownCitadel if (_canShatter && me.GetVictim() && me.GetVictim().IsImmunedToDamage(SpellSchoolMask.Normal)) { - DoCastVictim(LadySpells.SHATTERING_THROW); + DoCastVictim(SpellIds.ShatteringThrow); _canShatter = false; _events.ScheduleEvent(LadyEventTypes.DARNAVAN_SHATTERING_THROW, 30000); return; @@ -926,7 +902,7 @@ namespace Scripts.Northrend.IcecrownCitadel if (_canCharge && !me.IsWithinMeleeRange(me.GetVictim())) { - DoCastVictim(LadySpells.CHARGE); + DoCastVictim(SpellIds.Charge); _canCharge = false; _events.ScheduleEvent(LadyEventTypes.DARNAVAN_CHARGE, 20000); return; @@ -937,25 +913,25 @@ namespace Scripts.Northrend.IcecrownCitadel switch (eventId) { case LadyEventTypes.DARNAVAN_BLADESTORM: - DoCast(LadySpells.BLADESTORM); + DoCast(SpellIds.Bladestorm); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_BLADESTORM, RandomHelper.URand(90000, 100000)); break; case LadyEventTypes.DARNAVAN_CHARGE: _canCharge = true; break; case LadyEventTypes.DARNAVAN_INTIMIDATING_SHOUT: - DoCast(LadySpells.INTIMIDATING_SHOUT); + DoCast(SpellIds.IntimidatingShout); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_INTIMIDATING_SHOUT, RandomHelper.URand(90000, 120000)); break; case LadyEventTypes.DARNAVAN_MORTAL_STRIKE: - DoCastVictim(LadySpells.MORTAL_STRIKE); + DoCastVictim(SpellIds.MortalStrike); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_MORTAL_STRIKE, RandomHelper.URand(15000, 30000)); break; case LadyEventTypes.DARNAVAN_SHATTERING_THROW: _canShatter = true; break; case LadyEventTypes.DARNAVAN_SUNDER_ARMOR: - DoCastVictim(LadySpells.SUNDER_ARMOR); + DoCastVictim(SpellIds.SunderArmor); _events.ScheduleEvent(LadyEventTypes.DARNAVAN_SUNDER_ARMOR, RandomHelper.URand(3000, 7000)); break; } @@ -991,28 +967,6 @@ namespace Scripts.Northrend.IcecrownCitadel } } - [Script] - class spell_cultist_dark_martyrdom : SpellScript - { - void HandleEffect(uint effIndex) - { - if (GetCaster().IsSummon()) - { - Unit owner = GetCaster().ToTempSummon().GetSummoner(); - if (owner) - owner.GetAI().SetGUID(GetCaster().GetGUID(), (int)LadyConst.GUIDCultist); - } - - GetCaster().KillSelf(); - GetCaster().SetDisplayId(GetCaster().GetEntry() == CreatureIds.CultFanatic ? 38009 : 38010u); - } - - public override void Register() - { - OnEffectHitTarget.Add(new EffectHandler(HandleEffect, 2, SpellEffectName.ForceDeselect)); - } - } - [Script] class at_lady_deathwhisper_entrance : AreaTriggerScript { @@ -1034,4 +988,43 @@ namespace Scripts.Northrend.IcecrownCitadel return true; } } + + [Script] + class spell_deathwhisper_dominated_mind : AuraScript + { + public override bool Validate(SpellInfo spellInfo) + { + return ValidateSpellInfo(SpellIds.DominateMindScale); + } + + void HandleApply(AuraEffect aurEff, AuraEffectHandleModes mode) + { + Unit target = GetTarget(); + target.CastSpell(target, SpellIds.DominateMindScale, true); + } + + public override void Register() + { + AfterEffectApply.Add(new EffectApplyHandler(HandleApply, 0, AuraType.AoeCharm, AuraEffectHandleModes.Real)); + } + } + + [Script] + class spell_deathwhisper_summon_spirits : SpellScript + { + public override bool Validate(SpellInfo spellInfo) + { + return ValidateSpellInfo(SpellIds.SummonShade); + } + + void HandleScriptEffect(uint effIndex) + { + GetCaster().CastSpell(GetHitUnit(), SpellIds.SummonShade, true); + } + + public override void Register() + { + OnEffectHitTarget.Add(new EffectHandler(HandleScriptEffect, 0, SpellEffectName.Dummy)); + } + } } diff --git a/Source/Scripts/Northrend/Nexus/EyeOfEternity/EyeOfEternity.cs b/Source/Scripts/Northrend/Nexus/EyeOfEternity/EyeOfEternity.cs index c8a3a425f..cb0f96cb4 100644 --- a/Source/Scripts/Northrend/Nexus/EyeOfEternity/EyeOfEternity.cs +++ b/Source/Scripts/Northrend/Nexus/EyeOfEternity/EyeOfEternity.cs @@ -131,7 +131,7 @@ namespace Scripts.Northrend.Nexus.EyeOfEternity GameObject platform = instance.GetGameObject(platformGUID); if (platform) - platform.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed); + platform.RemoveFlag(GameObjectFlags.Destroyed); } else if (state == EncounterState.Done) SpawnGameObject(InstanceGameObjects.ExitPortal, exitPortalPosition); @@ -218,7 +218,7 @@ namespace Scripts.Northrend.Nexus.EyeOfEternity GameObject iris = instance.GetGameObject(irisGUID); if (iris) - iris.SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + iris.AddFlag(GameObjectFlags.InUse); Creature malygos = instance.GetCreature(malygosGUID); if (malygos) diff --git a/Source/Scripts/Northrend/Nexus/Nexus/BossKeristrasza.cs b/Source/Scripts/Northrend/Nexus/Nexus/BossKeristrasza.cs index 8c03dcd6b..f772e8abf 100644 --- a/Source/Scripts/Northrend/Nexus/Nexus/BossKeristrasza.cs +++ b/Source/Scripts/Northrend/Nexus/Nexus/BossKeristrasza.cs @@ -99,7 +99,7 @@ namespace Scripts.Northrend.Nexus.Nexus Initialize(); _intenseColdList.Clear(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + me.RemoveUnitFlag(UnitFlags.Stunned); RemovePrison(CheckContainmentSpheres()); _Reset(); @@ -141,15 +141,15 @@ namespace Scripts.Northrend.Nexus.Nexus { if (remove) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.ImmuneToPc); + me.RemoveUnitFlag(UnitFlags.NonAttackable); if (me.HasAura(KeristraszaConst.SpellFrozenPrison)) me.RemoveAurasDueToSpell(KeristraszaConst.SpellFrozenPrison); } else { - me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.ImmuneToPc); + me.AddUnitFlag(UnitFlags.NonAttackable); DoCast(me, KeristraszaConst.SpellFrozenPrison, false); } } @@ -202,7 +202,7 @@ namespace Scripts.Northrend.Nexus.Nexus if (pKeristrasza && pKeristrasza.IsAlive()) { // maybe these are hacks :( - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); go.SetGoState(GameObjectState.Active); ((boss_keristrasza)pKeristrasza.GetAI()).CheckContainmentSpheres(true); diff --git a/Source/Scripts/Northrend/Nexus/Nexus/BossMagusTelestra.cs b/Source/Scripts/Northrend/Nexus/Nexus/BossMagusTelestra.cs index 721f06dda..a5f81847e 100644 --- a/Source/Scripts/Northrend/Nexus/Nexus/BossMagusTelestra.cs +++ b/Source/Scripts/Northrend/Nexus/Nexus/BossMagusTelestra.cs @@ -86,7 +86,7 @@ namespace Scripts.Northrend.Nexus.Nexus { Initialize(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); instance.SetBossState(DataTypes.MagusTelestra, EncounterState.NotStarted); @@ -135,7 +135,7 @@ namespace Scripts.Northrend.Nexus.Nexus if (uiIsWaitingToAppearTimer <= diff) { me.CastSpell(me, 47714, true); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); bIsWaitingToAppear = false; InVanish = false; me.SendAIReaction(AiReaction.Hostile); @@ -174,7 +174,7 @@ namespace Scripts.Northrend.Nexus.Nexus me.CastStop(); me.RemoveAllAuras(); me.CastSpell(me, 47710, false); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); bFireMagusDead = false; bFrostMagusDead = false; bArcaneMagusDead = false; @@ -188,7 +188,7 @@ namespace Scripts.Northrend.Nexus.Nexus Phase = 3; me.CastStop(); me.RemoveAllAuras(); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); bFireMagusDead = false; bFrostMagusDead = false; bArcaneMagusDead = false; diff --git a/Source/Scripts/Northrend/Nexus/Nexus/InstanceNexus.cs b/Source/Scripts/Northrend/Nexus/Nexus/InstanceNexus.cs index dd9a4330c..36746a3e2 100644 --- a/Source/Scripts/Northrend/Nexus/Nexus/InstanceNexus.cs +++ b/Source/Scripts/Northrend/Nexus/Nexus/InstanceNexus.cs @@ -135,17 +135,17 @@ namespace Scripts.Northrend.Nexus.Nexus case GameObjectIds.AnomalusContainmetSphere: AnomalusContainmentSphere = go.GetGUID(); if (GetBossState(DataTypes.Anomalus) == EncounterState.Done) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); break; case GameObjectIds.OrmoroksContainmetSphere: OrmoroksContainmentSphere = go.GetGUID(); if (GetBossState(DataTypes.Ormorok) == EncounterState.Done) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); break; case GameObjectIds.TelestrasContainmetSphere: TelestrasContainmentSphere = go.GetGUID(); if (GetBossState(DataTypes.MagusTelestra) == EncounterState.Done) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); break; default: break; @@ -164,7 +164,7 @@ namespace Scripts.Northrend.Nexus.Nexus { GameObject sphere = instance.GetGameObject(TelestrasContainmentSphere); if (sphere) - sphere.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + sphere.RemoveFlag(GameObjectFlags.NotSelectable); } break; case DataTypes.Anomalus: @@ -172,7 +172,7 @@ namespace Scripts.Northrend.Nexus.Nexus { GameObject sphere = instance.GetGameObject(AnomalusContainmentSphere); if (sphere) - sphere.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + sphere.RemoveFlag(GameObjectFlags.NotSelectable); } break; case DataTypes.Ormorok: @@ -180,7 +180,7 @@ namespace Scripts.Northrend.Nexus.Nexus { GameObject sphere = instance.GetGameObject(OrmoroksContainmentSphere); if (sphere) - sphere.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + sphere.RemoveFlag(GameObjectFlags.NotSelectable); } break; default: diff --git a/Source/Scripts/Northrend/Nexus/Oculus/InstanceOculus.cs b/Source/Scripts/Northrend/Nexus/Oculus/InstanceOculus.cs index 39b64f81f..b4d252243 100644 --- a/Source/Scripts/Northrend/Nexus/Oculus/InstanceOculus.cs +++ b/Source/Scripts/Northrend/Nexus/Oculus/InstanceOculus.cs @@ -75,7 +75,7 @@ namespace Scripts.Northrend.Nexus.Oculus BelgaristraszGUID = creature.GetGUID(); if (GetBossState(DATA_DRAKOS) == EncounterState.Done) { - creature.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + creature.AddNpcFlag(NPCFlags.Gossip); creature.Relocate(BelgaristraszMove); } break; @@ -83,7 +83,7 @@ namespace Scripts.Northrend.Nexus.Oculus EternosGUID = creature.GetGUID(); if (GetBossState(DATA_DRAKOS) == EncounterState.Done) { - creature.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + creature.AddNpcFlag(NPCFlags.Gossip); creature.Relocate(EternosMove); } break; @@ -91,7 +91,7 @@ namespace Scripts.Northrend.Nexus.Oculus VerdisaGUID = creature.GetGUID(); if (GetBossState(DATA_DRAKOS) == EncounterState.Done) { - creature.SetFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + creature.AddNpcFlag(NPCFlags.Gossip); creature.Relocate(VerdisaMove); } break; diff --git a/Source/Scripts/Northrend/Ulduar/FlameLeviathan.cs b/Source/Scripts/Northrend/Ulduar/FlameLeviathan.cs index 858442313..f4015b78b 100644 --- a/Source/Scripts/Northrend/Ulduar/FlameLeviathan.cs +++ b/Source/Scripts/Northrend/Ulduar/FlameLeviathan.cs @@ -232,7 +232,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan DoCast(Spells.InvisAndStealthDetect); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Stunned); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Stunned); me.SetReactState(ReactStates.Passive); } @@ -513,7 +513,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan me.SetHomePosition(Leviathan.Center); me.GetMotionMaster().MoveCharge(Leviathan.Center.GetPositionX(), Leviathan.Center.GetPositionY(), Leviathan.Center.GetPositionZ()); // position center me.SetReactState(ReactStates.Aggressive); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Stunned); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.Stunned); return; } break; @@ -585,8 +585,8 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan Creature turret = turretPassenger.ToCreature(); if (turret) { - turret.SetFaction(me.GetVehicleBase().getFaction()); - turret.SetUInt32Value(UnitFields.Flags, 0); // unselectable + turret.SetFaction(me.GetVehicleBase().GetFaction()); + turret.SetUnitFlags(0); turret.GetAI().AttackStart(who); } } @@ -596,12 +596,12 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan Creature device = devicePassenger.ToCreature(); if (device) { - device.SetFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick); - device.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + device.AddNpcFlag(NPCFlags.SpellClick); + device.RemoveUnitFlag(UnitFlags.NotSelectable); } } - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); } else if (seatId == Seats.Turret) { @@ -611,8 +611,8 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan Unit device = vehicle.GetPassenger(Seats.Device); if (device) { - device.SetFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick); - device.SetUInt32Value(UnitFields.Flags, 0); // unselectable + device.AddNpcFlag(NPCFlags.SpellClick); + device.SetUnitFlags(0); // unselectable } } } @@ -694,8 +694,8 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan if (me.GetVehicle()) { - me.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveNpcFlag(NPCFlags.SpellClick); + me.AddUnitFlag(UnitFlags.NotSelectable); Unit player = me.GetVehicle().GetPassenger(Seats.Player); if (player) @@ -792,7 +792,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan public npc_pool_of_tar(Creature creature) : base(creature) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetReactState(ReactStates.Passive); me.CastSpell(me, Spells.TarPassive, true); } @@ -843,7 +843,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan public npc_thorims_hammer(Creature creature) : base(creature) { - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); me.CastSpell(me, Spells.DummyBlue, true); } @@ -872,7 +872,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan public npc_mimirons_inferno(Creature creature) : base(creature) { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.CastSpell(me, Spells.DummyYellow, true); me.SetReactState(ReactStates.Passive); } @@ -921,7 +921,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan public npc_hodirs_fury(Creature creature) : base(creature) { - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); me.CastSpell(me, Spells.DummyGreen, true); } @@ -1038,7 +1038,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan { if (menuId == GossipIds.MenuLoreKeeper && gossipListId == GossipIds.OptionLoreKeeper) { - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + me.RemoveNpcFlag(NPCFlags.Gossip); player.PlayerTalkClass.SendCloseGossip(); me.GetMap().LoadGrid(364, -16); // make sure leviathan is loaded @@ -1055,9 +1055,9 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan Creature brann = _instance.GetCreature(InstanceData.BrannBronzebeardIntro); if (brann) { - brann.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Gossip); + brann.RemoveNpcFlag(NPCFlags.Gossip); delorah.GetMotionMaster().MovePoint(0, brann.GetPositionX() - 4, brann.GetPositionY(), brann.GetPositionZ()); - // @todo delorah->AI()->Talk(xxxx, brann->GetGUID()); when reached at branz + // @todo delorah.AI().Talk(xxxx, brann.GetGUID()); when reached at branz } } } @@ -1356,7 +1356,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan //! This could probably in the SPELL_EFFECT_SEND_EVENT handler too: owner.AddUnitState(UnitState.Stunned | UnitState.Root); - owner.SetFlag(UnitFields.Flags, UnitFlags.Stunned); + owner.AddUnitFlag(UnitFlags.Stunned); owner.RemoveAurasDueToSpell(Spells.GatheringSpeed); } @@ -1366,7 +1366,7 @@ namespace Scripts.Northrend.Ulduar.FlameLeviathan if (!owner) return; - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + owner.RemoveUnitFlag(UnitFlags.Stunned); } public override void Register() diff --git a/Source/Scripts/Northrend/Ulduar/Mimiron.cs b/Source/Scripts/Northrend/Ulduar/Mimiron.cs index 277c65a75..32dbc18d4 100644 --- a/Source/Scripts/Northrend/Ulduar/Mimiron.cs +++ b/Source/Scripts/Northrend/Ulduar/Mimiron.cs @@ -389,7 +389,7 @@ namespace Scripts.Northrend.Ulduar { _Reset(); me.SetReactState(ReactStates.Passive); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NonAttackable); GameObject elevator = ObjectAccessor.GetGameObject(me, instance.GetGuidData(InstanceData.MimironElevator)); if (elevator) @@ -406,7 +406,7 @@ namespace Scripts.Northrend.Ulduar if (button) { button.SetGoState(GameObjectState.Ready); - button.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + button.RemoveFlag(GameObjectFlags.NotSelectable); } _fireFighter = false; @@ -457,13 +457,13 @@ namespace Scripts.Northrend.Ulduar //PLay Sound number 15612 _EnterCombat(); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); me.RemoveAurasDueToSpell(Spells.Weld); DoCast(me.GetVehicleBase(), Spells.Seat6); GameObject button = ObjectAccessor.GetGameObject(me, instance.GetGuidData(InstanceData.MimironButton)); if (button) - button.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + button.AddFlag(GameObjectFlags.NotSelectable); if (_fireFighter) _events.ScheduleEvent(Events.SummonFlames, 3000); @@ -528,7 +528,7 @@ namespace Scripts.Northrend.Ulduar { DoCast(mkii, Spells.Seat7); mkii.RemoveAurasDueToSpell(Spells.FreezeAnim); - mkii.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + mkii.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); } _events.ScheduleEvent(Events.Intro3, 2000); } @@ -676,7 +676,7 @@ namespace Scripts.Northrend.Ulduar if (aerial) { aerial.GetMotionMaster().MoveLand(0, new Position(aerial.GetPositionX(), aerial.GetPositionY(), aerial.GetPositionZMinusOffset())); - aerial.SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, 0); + aerial.SetAnimTier(UnitBytes1Flags.None, false); aerial.CastSpell(vx001, Spells.MountVx001); aerial.CastSpell(aerial, Spells.HalfHeal); } @@ -725,7 +725,7 @@ namespace Scripts.Northrend.Ulduar break; case Events.Outtro3: DoCast(me, Spells.TeleportVisual); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); me.DespawnOrUnsummon(1000); // sniffs say 6 sec after, but it doesnt matter. break; default: @@ -756,7 +756,7 @@ namespace Scripts.Northrend.Ulduar void SetupEncounter() { _Reset(); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Passive); _fireFighter = false; _setupMine = true; @@ -770,7 +770,7 @@ namespace Scripts.Northrend.Ulduar if (damage >= me.GetHealth()) { damage = (uint)(me.GetHealth() - 1); // Let creature fall to 1 hp, but do not let it die or damage itself with SetHealth(). - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); DoCast(me, Spells.VehicleDamaged, true); me.AttackStop(); me.SetReactState(ReactStates.Passive); @@ -821,7 +821,7 @@ namespace Scripts.Northrend.Ulduar break; case Actions.AssembledCombat: me.SetStandState(UnitStandStateType.Stand); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); _events.SetPhase(Phases.Vol7ron); @@ -874,7 +874,7 @@ namespace Scripts.Northrend.Ulduar { case Waypoints.MkiiP1Idle: { - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); DoCast(me, Spells.HalfHeal); Creature mimiron = ObjectAccessor.GetCreature(me, instance.GetGuidData(BossIds.Mimiron)); @@ -999,7 +999,7 @@ namespace Scripts.Northrend.Ulduar public boss_vx_001(Creature creature) : base(creature, BossIds.Mimiron) { me.SetDisableGravity(true); // This is the unfold visual state of VX-001, it has to be set on create as it requires an objectupdate if set later. - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.StateSpecialUnarmed); // This is a hack to force the yet to be unfolded visual state. + me.SetEmoteState(Emote.StateSpecialUnarmed); // This is a hack to force the yet to be unfolded visual state. me.SetReactState(ReactStates.Passive); _fireFighter = false; } @@ -1017,7 +1017,7 @@ namespace Scripts.Northrend.Ulduar if (_events.IsInPhase(Phases.Vx001)) { me.CastStop(); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); DoCast(me, Spells.HalfHeal); // has no effect, wat DoCast(me, Spells.TorsoDisabled); Creature mimiron = ObjectAccessor.GetCreature(me, instance.GetGuidData(BossIds.Mimiron)); @@ -1027,7 +1027,7 @@ namespace Scripts.Northrend.Ulduar else if (_events.IsInPhase(Phases.Vol7ron)) { me.SetStandState(UnitStandStateType.Dead); - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); if (MimironConst.IsEncounterFinished(who)) return; @@ -1050,9 +1050,9 @@ namespace Scripts.Northrend.Ulduar _events.ScheduleEvent(Events.FlameSuppressantVx, 6000); goto case Actions.StartVx001; case Actions.StartVx001: - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.RemoveAurasDueToSpell(Spells.FreezeAnim); - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); // Remove emotestate. + me.SetEmoteState(Emote.OneshotNone); // Remove emotestate. //me.SetuintValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, UnitBytes1Flags.AlwaysStand | UnitBytes1Flags.Hover); Blizzard handles hover animation like this it seems. DoCast(me, Spells.HeatWaveAura); @@ -1063,7 +1063,7 @@ namespace Scripts.Northrend.Ulduar break; case Actions.AssembledCombat: me.SetStandState(UnitStandStateType.Stand); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); _events.SetPhase(Phases.Vol7ron); _events.ScheduleEvent(Events.RocketStrike, 20000); @@ -1115,7 +1115,7 @@ namespace Scripts.Northrend.Ulduar // Handle rotation during SPELL_SPINNING_UP, SPELL_P3WX2_LASER_BARRAGE, SPELL_RAPID_BURST, and SPELL_HAND_PULSE_LEFT/RIGHT if (me.HasUnitState(UnitState.Casting)) { - List channelObjects = me.GetChannelObjects(); + List channelObjects = me.m_unitData.ChannelObjects; Unit channelTarget = (channelObjects.Count == 1 ? Global.ObjAccessor.GetUnit(me, channelObjects[0]) : null); if (channelTarget) me.SetFacingToObject(channelTarget); @@ -1191,7 +1191,7 @@ namespace Scripts.Northrend.Ulduar if (damage >= me.GetHealth()) { damage = (uint)(me.GetHealth() - 1); // Let creature fall to 1 hp, but do not let it die or damage itself with SetHealth(). - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); me.AttackStop(); me.SetReactState(ReactStates.Passive); DoCast(me, Spells.VehicleDamaged, true); @@ -1226,7 +1226,7 @@ namespace Scripts.Northrend.Ulduar _events.ScheduleEvent(Events.SummonFireBots, 1000, 0, Phases.AerialCommandUnit); goto case Actions.StartAerial; case Actions.StartAerial: - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); _events.SetPhase(Phases.AerialCommandUnit); @@ -1245,7 +1245,7 @@ namespace Scripts.Northrend.Ulduar me.SetReactState(ReactStates.Aggressive); break; case Actions.AssembledCombat: - me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); me.SetStandState(UnitStandStateType.Stand); _events.SetPhase(Phases.Vol7ron); @@ -1281,7 +1281,7 @@ namespace Scripts.Northrend.Ulduar { if (type == MovementGeneratorType.Point && point == Waypoints.AerialP4Pos) { - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); Creature mimiron = ObjectAccessor.GetCreature(me, instance.GetGuidData(BossIds.Mimiron)); if (mimiron) @@ -1596,7 +1596,7 @@ namespace Scripts.Northrend.Ulduar public override bool OnGossipHello(Player player, GameObject go) { - if (go.HasFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable)) + if (go.HasFlag(GameObjectFlags.NotSelectable)) return true; InstanceScript instance = go.GetInstanceScript(); @@ -1607,7 +1607,7 @@ namespace Scripts.Northrend.Ulduar if (computer) computer.GetAI().DoAction(Actions.ActivateComputer); go.SetGoState(GameObjectState.Active); - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); return true; } } @@ -1634,7 +1634,7 @@ namespace Scripts.Northrend.Ulduar Creature target = GetHitCreature(); if (target) { - target.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.Pacified); + target.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.Pacified); target.DespawnOrUnsummon(1000); } } @@ -1741,7 +1741,7 @@ namespace Scripts.Northrend.Ulduar { void FilterTargets(List targets) { - targets.RemoveAll(obj => obj.ToUnit() && (obj.ToUnit().GetVehicleBase() || obj.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable))); + targets.RemoveAll(obj => obj.IsUnit() && (obj.ToUnit().GetVehicleBase() || obj.ToUnit().HasUnitFlag(UnitFlags.NonAttackable))); } public override void Register() diff --git a/Source/Scripts/Northrend/Ulduar/Razorscale.cs b/Source/Scripts/Northrend/Ulduar/Razorscale.cs index 1e6d66912..bc68ac89f 100644 --- a/Source/Scripts/Northrend/Ulduar/Razorscale.cs +++ b/Source/Scripts/Northrend/Ulduar/Razorscale.cs @@ -77,12 +77,12 @@ namespace Scripts.Northrend.Ulduar { case ACTION_HARPOON_BUILD: events.ScheduleEvent(EVENT_BUILD_HARPOON_1, 50000); - if (me->GetMap()->GetSpawnMode() == DIFFICULTY_25_N) + if (me.GetMap().GetSpawnMode() == DIFFICULTY_25_N) events.ScheduleEvent(EVENT_BUILD_HARPOON_3, 90000); break; case ACTION_PLACE_BROKEN_HARPOON: for (uint8 n = 0; n < RAID_MODE(2, 4); n++) - me->SummonGameObject(GO_RAZOR_BROKEN_HARPOON, PosHarpoon[n].GetPositionX(), PosHarpoon[n].GetPositionY(), PosHarpoon[n].GetPositionZ(), 2.286f, 0, 0, 0, 0, 180); + me.SummonGameObject(GO_RAZOR_BROKEN_HARPOON, PosHarpoon[n].GetPositionX(), PosHarpoon[n].GetPositionY(), PosHarpoon[n].GetPositionZ(), 2.286f, 0, 0, 0, 0, 180); break; } } @@ -97,39 +97,39 @@ namespace Scripts.Northrend.Ulduar { case EVENT_BUILD_HARPOON_1: Talk(EMOTE_HARPOON); - if (GameObject * Harpoon = me->SummonGameObject(GO_RAZOR_HARPOON_1, PosHarpoon[0].GetPositionX(), PosHarpoon[0].GetPositionY(), PosHarpoon[0].GetPositionZ(), 4.790f, 0.0f, 0.0f, 0.0f, 0.0f, uint32(me->GetRespawnTime()))) + if (GameObject * Harpoon = me.SummonGameObject(GO_RAZOR_HARPOON_1, PosHarpoon[0].GetPositionX(), PosHarpoon[0].GetPositionY(), PosHarpoon[0].GetPositionZ(), 4.790f, 0.0f, 0.0f, 0.0f, 0.0f, uint32(me.GetRespawnTime()))) { - if (GameObject * BrokenHarpoon = Harpoon->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) //only nearest broken harpoon - BrokenHarpoon->RemoveFromWorld(); + if (GameObject * BrokenHarpoon = Harpoon.FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) //only nearest broken harpoon + BrokenHarpoon.RemoveFromWorld(); events.ScheduleEvent(EVENT_BUILD_HARPOON_2, 20000); events.CancelEvent(EVENT_BUILD_HARPOON_1); } return; case EVENT_BUILD_HARPOON_2: Talk(EMOTE_HARPOON); - if (GameObject * Harpoon = me->SummonGameObject(GO_RAZOR_HARPOON_2, PosHarpoon[1].GetPositionX(), PosHarpoon[1].GetPositionY(), PosHarpoon[1].GetPositionZ(), 4.659f, 0, 0, 0, 0, uint32(me->GetRespawnTime()))) + if (GameObject * Harpoon = me.SummonGameObject(GO_RAZOR_HARPOON_2, PosHarpoon[1].GetPositionX(), PosHarpoon[1].GetPositionY(), PosHarpoon[1].GetPositionZ(), 4.659f, 0, 0, 0, 0, uint32(me.GetRespawnTime()))) { - if (GameObject * BrokenHarpoon = Harpoon->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) - BrokenHarpoon->RemoveFromWorld(); + if (GameObject * BrokenHarpoon = Harpoon.FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) + BrokenHarpoon.RemoveFromWorld(); events.CancelEvent(EVENT_BUILD_HARPOON_2); } return; case EVENT_BUILD_HARPOON_3: Talk(EMOTE_HARPOON); - if (GameObject * Harpoon = me->SummonGameObject(GO_RAZOR_HARPOON_3, PosHarpoon[2].GetPositionX(), PosHarpoon[2].GetPositionY(), PosHarpoon[2].GetPositionZ(), 5.382f, 0, 0, 0, 0, uint32(me->GetRespawnTime()))) + if (GameObject * Harpoon = me.SummonGameObject(GO_RAZOR_HARPOON_3, PosHarpoon[2].GetPositionX(), PosHarpoon[2].GetPositionY(), PosHarpoon[2].GetPositionZ(), 5.382f, 0, 0, 0, 0, uint32(me.GetRespawnTime()))) { - if (GameObject * BrokenHarpoon = Harpoon->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) - BrokenHarpoon->RemoveFromWorld(); + if (GameObject * BrokenHarpoon = Harpoon.FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) + BrokenHarpoon.RemoveFromWorld(); events.ScheduleEvent(EVENT_BUILD_HARPOON_4, 20000); events.CancelEvent(EVENT_BUILD_HARPOON_3); } return; case EVENT_BUILD_HARPOON_4: Talk(EMOTE_HARPOON); - if (GameObject * Harpoon = me->SummonGameObject(GO_RAZOR_HARPOON_4, PosHarpoon[3].GetPositionX(), PosHarpoon[3].GetPositionY(), PosHarpoon[3].GetPositionZ(), 4.266f, 0, 0, 0, 0, uint32(me->GetRespawnTime()))) + if (GameObject * Harpoon = me.SummonGameObject(GO_RAZOR_HARPOON_4, PosHarpoon[3].GetPositionX(), PosHarpoon[3].GetPositionY(), PosHarpoon[3].GetPositionZ(), 4.266f, 0, 0, 0, 0, uint32(me.GetRespawnTime()))) { - if (GameObject * BrokenHarpoon = Harpoon->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) - BrokenHarpoon->RemoveFromWorld(); + if (GameObject * BrokenHarpoon = Harpoon.FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) + BrokenHarpoon.RemoveFromWorld(); events.CancelEvent(EVENT_BUILD_HARPOON_4); } return; diff --git a/Source/Scripts/Northrend/Ulduar/UlduarInstance.cs b/Source/Scripts/Northrend/Ulduar/UlduarInstance.cs index 0ce8f2782..4fafc4d99 100644 --- a/Source/Scripts/Northrend/Ulduar/UlduarInstance.cs +++ b/Source/Scripts/Northrend/Ulduar/UlduarInstance.cs @@ -68,7 +68,7 @@ namespace Scripts.Northrend.Ulduar if (_algalonTimer != 0 && _algalonTimer <= 60) algalon.GetAI().DoAction((int)InstanceEvents.ActionInitAlgalon); else - algalon.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + algalon.RemoveUnitFlag(UnitFlags.ImmuneToPc); } // Keepers at Observation Ring @@ -435,7 +435,7 @@ namespace Scripts.Northrend.Ulduar case InstanceGameObjectIds.CelestialPlanetariumAccess10: case InstanceGameObjectIds.CelestialPlanetariumAccess25: if (_algalonSummoned) - gameObject.SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + gameObject.AddFlag(GameObjectFlags.InUse); break; case InstanceGameObjectIds.DoodadUlSigildoor01: AlgalonSigilDoorGUID[0] = gameObject.GetGUID(); @@ -610,7 +610,7 @@ namespace Scripts.Northrend.Ulduar if (vehicle != null) { vehicle.RemoveAllPassengers(); - vehicleCreature.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + vehicleCreature.AddUnitFlag(UnitFlags.NotSelectable); vehicleCreature.DespawnOrUnsummon(5 * Time.Minute * Time.InMilliseconds); } } @@ -640,7 +640,7 @@ namespace Scripts.Northrend.Ulduar if (gameObject) { gameObject.SetRespawnTime((int)gameObject.GetRespawnDelay()); - gameObject.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + gameObject.RemoveFlag(GameObjectFlags.NotSelectable); } HandleGameObject(KologarnBridgeGUID, false); } @@ -651,7 +651,7 @@ namespace Scripts.Northrend.Ulduar GameObject HodirRareCache = instance.GetGameObject(HodirRareCacheGUID); if (HodirRareCache) if (GetData(InstanceData.HodirRareCache) != 0) - HodirRareCache.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + HodirRareCache.RemoveFlag(GameObjectFlags.NotSelectable); GameObject HodirChest = instance.GetGameObject(HodirChestGUID); if (HodirChest) HodirChest.SetRespawnTime((int)HodirChest.GetRespawnDelay()); diff --git a/Source/Scripts/Northrend/Ulduar/Xt002.cs b/Source/Scripts/Northrend/Ulduar/Xt002.cs index a35f9a2c1..d2dc21a1f 100644 --- a/Source/Scripts/Northrend/Ulduar/Xt002.cs +++ b/Source/Scripts/Northrend/Ulduar/Xt002.cs @@ -24,6 +24,7 @@ using Game.Scripting; using Game.Spells; using System; using System.Collections.Generic; +using Game.Network.Packets; namespace Scripts.Northrend.Ulduar.Xt002 { @@ -143,7 +144,7 @@ namespace Scripts.Northrend.Ulduar.Xt002 { _Reset(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); DoCastSelf(SpellIds.Stand); @@ -225,7 +226,7 @@ namespace Scripts.Northrend.Ulduar.Xt002 { Talk(Texts.Death); _JustDied(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); } public override void DamageTaken(Unit attacker, ref uint damage) @@ -306,8 +307,8 @@ namespace Scripts.Northrend.Ulduar.Xt002 heart.CastSpell(me, SpellIds.HeartLightningTether); heart.CastSpell(heart, SpellIds.HeartHealToFull, true); heart.CastSpell(me, SpellIds.RideVehicleExposed, true); - heart.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); - heart.SetFlag(UnitFields.Flags, UnitFlags.Unk29); + heart.RemoveUnitFlag(UnitFlags.NotSelectable); + heart.AddUnitFlag(UnitFlags.Unk29); } _scheduler.DelayGroup(Misc.PhaseOneGroup, TimeSpan.FromSeconds(30)); @@ -330,7 +331,7 @@ namespace Scripts.Northrend.Ulduar.Xt002 Talk(Texts.HeartClosed); Talk(Texts.EmoteHeartClosed); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetReactState(ReactStates.Aggressive); DoCastSelf(SpellIds.Stand); @@ -343,8 +344,8 @@ namespace Scripts.Northrend.Ulduar.Xt002 return; heart.CastSpell(me, SpellIds.HeartRideVehicle, true); - heart.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); - heart.RemoveFlag(UnitFields.Flags, UnitFlags.Unk29); + heart.AddUnitFlag(UnitFlags.NotSelectable); + heart.RemoveUnitFlag(UnitFlags.Unk29); heart.RemoveAurasDueToSpell(SpellIds.ExposedHeart); if (!_hardMode) @@ -529,12 +530,6 @@ namespace Scripts.Northrend.Ulduar.Xt002 DoCast(SpellIds.AuraBoombot); // For achievement - // HACK/workaround: - // these values aren't confirmed - lack of data - and the values in DB are incorrect - // these values are needed for correct damage of Boom spell - me.SetFloatValue(UnitFields.MinDamage, 15000.0f); - me.SetFloatValue(UnitFields.MaxDamage, 18000.0f); - // @todo proper waypoints? Creature pXT002 = ObjectAccessor.GetCreature(me, _instance.GetGuidData(BossIds.Xt002)); if (pXT002) @@ -547,20 +542,22 @@ namespace Scripts.Northrend.Ulduar.Xt002 { _boomed = true; // Prevent recursive calls - //me.SendSpellInstakillLog(Spells.Boom, me); + SpellInstakillLog instakill = new SpellInstakillLog(); + instakill.Caster = me.GetGUID(); + instakill.Target = me.GetGUID(); + instakill.SpellID = SpellIds.Boom; + me.SendMessageToSet(instakill, false); - //me.DealDamage(me, me.GetHealth(), null, DamageEffectType.NoDamage, SpellSchoolMask.Normal, null, false); + me.DealDamage(me, (uint)me.GetHealth(), null, DamageEffectType.NoDamage, SpellSchoolMask.Normal, null, false); damage = 0; - me.CastSpell(me, SpellIds.Boom, false); - // Visual only seems to work if the instant kill event is delayed or the spell itself is delayed // Casting done from player and caster source has the same targetinfo flags, // so that can't be the issue // See BoomEvent class // Schedule 1s delayed - //me.m_Events.AddEvent(new BoomEvent(me), me.m_Events.CalculateTime(1 * Time.InMilliseconds)); + me.m_Events.AddEvent(new BoomEvent(me), me.m_Events.CalculateTime(1 * Time.InMilliseconds)); } } @@ -801,7 +798,7 @@ namespace Scripts.Northrend.Ulduar.Xt002 if (!target) return; - target.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + target.AddUnitFlag(UnitFlags.NotSelectable); target.SetStandState(UnitStandStateType.Submerged); } diff --git a/Source/Scripts/Outlands/HellfirePeninsula.cs b/Source/Scripts/Outlands/HellfirePeninsula.cs index 3dd18d0c6..40f4915e3 100644 --- a/Source/Scripts/Outlands/HellfirePeninsula.cs +++ b/Source/Scripts/Outlands/HellfirePeninsula.cs @@ -47,7 +47,7 @@ namespace Scripts.Outlands envelopingWinds_Timer = 9000; shock_Timer = 5000; - me.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.QuestGiver); + me.RemoveNpcFlag(NPCFlags.QuestGiver); me.SetFaction(Aeranas.FactionFriendly); Talk(Aeranas.SaySummon); @@ -72,7 +72,7 @@ namespace Scripts.Outlands if (HealthBelowPct(30)) { me.SetFaction(Aeranas.FactionFriendly); - me.SetFlag64(UnitFields.NpcFlags, NPCFlags.QuestGiver); + me.AddNpcFlag(NPCFlags.QuestGiver); me.RemoveAllAuras(); me.DeleteThreatList(); me.CombatStop(true); diff --git a/Source/Scripts/Outlands/Zangarmarsh.cs b/Source/Scripts/Outlands/Zangarmarsh.cs index 665cbd48e..9037047ef 100644 --- a/Source/Scripts/Outlands/Zangarmarsh.cs +++ b/Source/Scripts/Outlands/Zangarmarsh.cs @@ -142,7 +142,7 @@ namespace Scripts.Outlands { public npc_cooshcooshAI(Creature creature) : base(creature) { - m_uiNormFaction = creature.getFaction(); + m_uiNormFaction = creature.GetFaction(); } uint m_uiNormFaction; @@ -150,7 +150,7 @@ namespace Scripts.Outlands public override void Reset() { _events.ScheduleEvent(Event_LightningBolt, 2000); - if (me.getFaction() != m_uiNormFaction) + if (me.GetFaction() != m_uiNormFaction) me.SetFaction(m_uiNormFaction); } diff --git a/Source/Scripts/Pets/DeathKinght.cs b/Source/Scripts/Pets/DeathKinght.cs index 092bbf2e3..2f95f3b23 100644 --- a/Source/Scripts/Pets/DeathKinght.cs +++ b/Source/Scripts/Pets/DeathKinght.cs @@ -72,7 +72,7 @@ namespace Scripts.Pets return; // Stop Fighting - me.ApplyModFlag(UnitFields.Flags, UnitFlags.NonAttackable, true); + me.AddUnitFlag(UnitFlags.NonAttackable); // Sanctuary me.CastSpell(me, SpellSanctuary, true); diff --git a/Source/Scripts/Pets/Hunter.cs b/Source/Scripts/Pets/Hunter.cs index 039642279..8a966c799 100644 --- a/Source/Scripts/Pets/Hunter.cs +++ b/Source/Scripts/Pets/Hunter.cs @@ -40,7 +40,7 @@ namespace Scripts.Pets me.SetMaxHealth((uint)(107 * (me.getLevel() - 40) * 0.025f)); // Add delta to make them not all hit the same time uint delta = (RandomHelper.Rand32() % 7) * 100; - me.SetStatFloatValue(UnitFields.BaseAttackTime, Info.BaseAttackTime + delta); + me.SetBaseAttackTime(WeaponAttackType.BaseAttack, Info.BaseAttackTime + delta); //me.SetStatFloatValue(UnitFields.RangedAttackPower, (float)Info.AttackPower); // Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target diff --git a/Source/Scripts/Spells/Generic.cs b/Source/Scripts/Spells/Generic.cs index 360e328e0..712b2b6ca 100644 --- a/Source/Scripts/Spells/Generic.cs +++ b/Source/Scripts/Spells/Generic.cs @@ -1058,8 +1058,8 @@ namespace Scripts.Spells.Generic void HandleEffectApply(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); - target.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - target.SetFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); + target.AddDynamicFlag(UnitDynFlags.Dead); + target.AddUnitFlag2(UnitFlags2.FeignDeath); if (target.IsTypeId(TypeId.Unit)) target.ToCreature().SetReactState(ReactStates.Passive); @@ -1068,8 +1068,8 @@ namespace Scripts.Spells.Generic void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); - target.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); + target.RemoveDynamicFlag(UnitDynFlags.Dead); + target.RemoveUnitFlag2(UnitFlags2.FeignDeath); } public override void Register() @@ -2873,7 +2873,7 @@ namespace Scripts.Spells.Generic player.CombatStop(); if (player.IsNonMeleeSpellCast(true)) player.InterruptNonMeleeSpells(true); - player.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + player.AddUnitFlag(UnitFlags.NonAttackable); // if player class = hunter || warlock remove pet if alive if ((player.GetClass() == Class.Hunter) || (player.GetClass() == Class.Warlock)) @@ -2898,7 +2898,7 @@ namespace Scripts.Spells.Generic { // Reset player faction + allow combat + allow duels player.setFactionForRace(player.GetRace()); - player.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + player.RemoveUnitFlag(UnitFlags.NonAttackable); // save player player.SaveToDB(); } diff --git a/Source/Scripts/Spells/Hunter.cs b/Source/Scripts/Spells/Hunter.cs index de8143e3d..ad962eba4 100644 --- a/Source/Scripts/Spells/Hunter.cs +++ b/Source/Scripts/Spells/Hunter.cs @@ -246,7 +246,7 @@ namespace Scripts.Spells.Hunter // Do a mini Spell::CheckCasterAuras on the pet, no other way of doing this SpellCastResult result = SpellCastResult.SpellCastOk; - UnitFlags unitflag = (UnitFlags)pet.GetUInt32Value(UnitFields.Flags); + UnitFlags unitflag = (UnitFlags)(uint)pet.m_unitData.Flags; if (!pet.GetCharmerGUID().IsEmpty()) result = SpellCastResult.Charmed; else if (unitflag.HasAnyFlag(UnitFlags.Stunned)) diff --git a/Source/Scripts/Spells/Items.cs b/Source/Scripts/Spells/Items.cs index cc527db16..24bb98c09 100644 --- a/Source/Scripts/Spells/Items.cs +++ b/Source/Scripts/Spells/Items.cs @@ -3350,4 +3350,111 @@ namespace Scripts.Spells.Items OnEffectRemove.Add(new EffectApplyHandler(OnRemove, 0, AuraType.ProcTriggerSpell, AuraEffectHandleModes.Real)); } } + + [Script]// 45051 - Mad Alchemist's Potion (34440) + class mad_alchemists_potion_SpellScript : SpellScript + { + void SecondaryEffect() + { + List availableElixirs = new List() + { + // Battle Elixirs + 33720, // Onslaught Elixir (28102) + 54452, // Adept's Elixir (28103) + 33726, // Elixir of Mastery (28104) + 28490, // Elixir of Major Strength (22824) + 28491, // Elixir of Healing Power (22825) + 28493, // Elixir of Major Frost Power (22827) + 54494, // Elixir of Major Agility (22831) + 28501, // Elixir of Major Firepower (22833) + 28503,// Elixir of Major Shadow Power (22835) + 38954, // Fel Strength Elixir (31679) + // Guardian Elixirs + 39625, // Elixir of Major Fortitude (32062) + 39626, // Earthen Elixir (32063) + 39627, // Elixir of Draenic Wisdom (32067) + 39628, // Elixir of Ironskin (32068) + 28502, // Elixir of Major Defense (22834) + 28514, // Elixir of Empowerment (22848) + // Other + 28489, // Elixir of Camouflage (22823) + 28496 // Elixir of the Searching Eye (22830) + }; + + Unit target = GetCaster(); + + if (target.GetPowerType() == PowerType.Mana) + availableElixirs.Add(28509); // Elixir of Major Mageblood (22840) + + uint chosenElixir = availableElixirs.SelectRandom(); + + bool useElixir = true; + + SpellGroup chosenSpellGroup = SpellGroup.None; + if (Global.SpellMgr.IsSpellMemberOfSpellGroup(chosenElixir, SpellGroup.ElixirBattle)) + chosenSpellGroup = SpellGroup.ElixirBattle; + if (Global.SpellMgr.IsSpellMemberOfSpellGroup(chosenElixir, SpellGroup.ElixirGuardian)) + chosenSpellGroup = SpellGroup.ElixirGuardian; + // If another spell of the same group is already active the elixir should not be cast + if (chosenSpellGroup != 0) + { + var Auras = target.GetAppliedAuras(); + foreach (var pair in Auras) + { + uint spell_id = pair.Value.GetBase().GetId(); + if (Global.SpellMgr.IsSpellMemberOfSpellGroup(spell_id, chosenSpellGroup) && spell_id != chosenElixir) + { + useElixir = false; + break; + } + } + } + + if (useElixir) + target.CastSpell(target, chosenElixir, true, GetCastItem()); + } + + public override void Register() + { + AfterCast.Add(new CastHandler(SecondaryEffect)); + } + } + + [Script]// 53750 - Crazy Alchemist's Potion (40077) + class crazy_alchemists_potion_SpellScript : SpellScript + { + void SecondaryEffect() + { + List availableElixirs = new List() + { + 43185, // Runic Healing Potion (33447) + 53750, // Crazy Alchemist's Potion (40077) + 53761, // Powerful Rejuvenation Potion (40087) + 53762, // Indestructible Potion (40093) + 53908, // Potion of Speed (40211) + 53909, // Potion of Wild Magic (40212) + 53910, // Mighty Arcane Protection Potion (40213) + 53911, // Mighty Fire Protection Potion (40214) + 53913, // Mighty Frost Protection Potion (40215) + 53914, // Mighty Nature Protection Potion (40216) + 53915 // Mighty Shadow Protection Potion (40217) + }; + + Unit target = GetCaster(); + + if (!target.IsInCombat()) + availableElixirs.Add(53753); // Potion of Nightmares (40081) + if (target.GetPowerType() == PowerType.Mana) + availableElixirs.Add(43186); // Runic Mana Potion(33448) + + uint chosenElixir = availableElixirs.SelectRandom(); + + target.CastSpell(target, chosenElixir, true, GetCastItem()); + } + + public override void Register() + { + AfterCast.Add(new CastHandler(SecondaryEffect)); + } + } } diff --git a/Source/Scripts/Spells/Priest.cs b/Source/Scripts/Spells/Priest.cs index f82e6d80a..aeaecde03 100644 --- a/Source/Scripts/Spells/Priest.cs +++ b/Source/Scripts/Spells/Priest.cs @@ -783,7 +783,7 @@ namespace Scripts.Spells.Priest void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); - GetTarget().RemoveMovementImpairingAuras(); + GetTarget().RemoveMovementImpairingAuras(true); } public override void Register() diff --git a/Source/Scripts/Spells/Quest.cs b/Source/Scripts/Spells/Quest.cs index 094246552..b5029d9b6 100644 --- a/Source/Scripts/Spells/Quest.cs +++ b/Source/Scripts/Spells/Quest.cs @@ -435,13 +435,13 @@ namespace Scripts.Spells.Quest void HandleEffectApply(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); - target.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + target.AddUnitFlag(UnitFlags.ImmuneToPc); target.AddUnitState(UnitState.Root); } void HandleEffectRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { - GetTarget().RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + GetTarget().RemoveUnitFlag(UnitFlags.ImmuneToPc); } public override void Register() @@ -789,8 +789,8 @@ namespace Scripts.Spells.Quest if (target.HasAura(SpellIds.PermanentFeignDeath)) { target.RemoveAurasDueToSpell(SpellIds.PermanentFeignDeath); - target.SetUInt32Value(ObjectFields.DynamicFlags, 0); - target.SetUInt32Value(UnitFields.Flags2, 0); + target.SetDynamicFlags(0); + target.SetUnitFlags2(0); target.SetHealth(target.GetMaxHealth() / 2); target.SetPower(PowerType.Mana, (int)(target.GetMaxPower(PowerType.Mana) * 0.75f)); } diff --git a/Source/Scripts/Spells/Warlock.cs b/Source/Scripts/Spells/Warlock.cs index 00c01e783..58c884492 100644 --- a/Source/Scripts/Spells/Warlock.cs +++ b/Source/Scripts/Spells/Warlock.cs @@ -257,7 +257,7 @@ namespace Scripts.Spells.Warlock if (circle) { player.NearTeleportTo(circle.GetPositionX(), circle.GetPositionY(), circle.GetPositionZ(), circle.GetOrientation()); - player.RemoveMovementImpairingAuras(); + player.RemoveMovementImpairingAuras(false); } } } diff --git a/Source/Scripts/Spells/Warrior.cs b/Source/Scripts/Spells/Warrior.cs index 92adccf11..9cb418df0 100644 --- a/Source/Scripts/Spells/Warrior.cs +++ b/Source/Scripts/Spells/Warrior.cs @@ -865,7 +865,7 @@ namespace Scripts.Spells.Warrior void HandleOnProc(AuraEffect aurEff, ProcEventInfo procInfo) { - if (procInfo.GetActor().GetTypeId() == TypeId.Player && procInfo.GetActor().GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.WarriorFury) + if (procInfo.GetActor().GetTypeId() == TypeId.Player && procInfo.GetActor().ToPlayer().GetPrimarySpecialization() == (uint)TalentSpecialization.WarriorFury) PreventDefaultAction(); procInfo.GetActor().GetSpellHistory().ResetCooldown(SpellIds.ImpendingVictory, true); diff --git a/Source/Scripts/World/BossEmeraldDragons.cs b/Source/Scripts/World/BossEmeraldDragons.cs index 9a14a5939..c4461b7bd 100644 --- a/Source/Scripts/World/BossEmeraldDragons.cs +++ b/Source/Scripts/World/BossEmeraldDragons.cs @@ -101,7 +101,7 @@ namespace Scripts.World.BossEmeraldDragons public override void Reset() { base.Reset(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); me.SetReactState(ReactStates.Aggressive); DoCast(me, Spells.MarkOfNatureAura, true); @@ -478,7 +478,7 @@ namespace Scripts.World.BossEmeraldDragons _shades += (byte)Spells.TaerarShadeSpells.Length; DoCast(Spells.Shade); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); me.SetReactState(ReactStates.Passive); ++_stage; @@ -497,7 +497,7 @@ namespace Scripts.World.BossEmeraldDragons { _banished = false; - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable | UnitFlags.NonAttackable); + me.RemoveUnitFlag(UnitFlags.NotSelectable | UnitFlags.NonAttackable); me.RemoveAurasDueToSpell(Spells.Shade); me.SetReactState(ReactStates.Aggressive); } diff --git a/Source/Scripts/World/GameObjects.cs b/Source/Scripts/World/GameObjects.cs index 618a388d0..8946e564a 100644 --- a/Source/Scripts/World/GameObjects.cs +++ b/Source/Scripts/World/GameObjects.cs @@ -363,7 +363,7 @@ namespace Scripts.World if (Spell != 0) creature.CastSpell(player, Spell, false); else - Log.outError(LogFilter.Scripts, "go_ethereum_prison summoned Creature (entry {0}) but faction ({1}) are not expected by script.", creature.GetEntry(), creature.getFaction()); + Log.outError(LogFilter.Scripts, "go_ethereum_prison summoned Creature (entry {0}) but faction ({1}) are not expected by script.", creature.GetEntry(), creature.GetFaction()); } } } diff --git a/Source/Scripts/World/ItemScripts.cs b/Source/Scripts/World/ItemScripts.cs index a5e4c032a..93dbcbf2a 100644 --- a/Source/Scripts/World/ItemScripts.cs +++ b/Source/Scripts/World/ItemScripts.cs @@ -206,7 +206,7 @@ namespace Scripts.World List dest = new List(); InventoryResult msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, 39883, 1); // Cracked Egg if (msg == InventoryResult.Ok) - player.StoreNewItem(dest, 39883, true, ItemEnchantment.GenerateItemRandomPropertyId(39883)); + player.StoreNewItem(dest, 39883, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(39883)); return true; } @@ -222,7 +222,7 @@ namespace Scripts.World List dest = new List(); InventoryResult msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, 44718, 1); // Ripe Disgusting Jar if (msg == InventoryResult.Ok) - player.StoreNewItem(dest, 44718, true, ItemEnchantment.GenerateItemRandomPropertyId(44718)); + player.StoreNewItem(dest, 44718, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(44718)); return true; } @@ -257,7 +257,7 @@ namespace Scripts.World { summon.SetVisible(false); summon.SetReactState(ReactStates.Passive); - summon.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc); + summon.AddUnitFlag(UnitFlags.ImmuneToPc); } return false; } diff --git a/Source/Scripts/World/NpcSpecial.cs b/Source/Scripts/World/NpcSpecial.cs index 8589f7273..1af76cd09 100644 --- a/Source/Scripts/World/NpcSpecial.cs +++ b/Source/Scripts/World/NpcSpecial.cs @@ -584,7 +584,7 @@ namespace Scripts.World.NpcSpecial { Initialize(); me.SetFaction(NpcSpecialConst.FactionChicken); - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.QuestGiver); + me.RemoveNpcFlag(NPCFlags.QuestGiver); } public override void EnterCombat(Unit who) { } @@ -592,7 +592,7 @@ namespace Scripts.World.NpcSpecial public override void UpdateAI(uint diff) { // Reset flags after a certain time has passed so that the next player has to start the 'event' again - if (me.HasFlag(UnitFields.NpcFlags, NPCFlags.QuestGiver)) + if (me.HasNpcFlag(NPCFlags.QuestGiver)) { if (ResetFlagTimer <= diff) { @@ -614,7 +614,7 @@ namespace Scripts.World.NpcSpecial case TextEmotes.Chicken: if (player.GetQuestStatus(QuestConst.Cluck) == QuestStatus.None && RandomHelper.Rand32() % 30 == 1) { - me.SetFlag(UnitFields.NpcFlags, NPCFlags.QuestGiver); + me.AddNpcFlag(NPCFlags.QuestGiver); me.SetFaction(NpcSpecialConst.FactionFriendly); Talk(player.GetTeam() == Team.Horde ? Texts.EmoteHelloH : Texts.EmoteHelloA); } @@ -622,7 +622,7 @@ namespace Scripts.World.NpcSpecial case TextEmotes.Cheer: if (player.GetQuestStatus(QuestConst.Cluck) == QuestStatus.Complete) { - me.SetFlag(UnitFields.NpcFlags, NPCFlags.QuestGiver); + me.AddNpcFlag(NPCFlags.QuestGiver); me.SetFaction(NpcSpecialConst.FactionFriendly); Talk(Texts.EmoteCluck); } @@ -881,7 +881,7 @@ namespace Scripts.World.NpcSpecial public override void Reset() { Initialize(); - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); } public void BeginEvent(Player player) @@ -906,7 +906,7 @@ namespace Scripts.World.NpcSpecial } Event = true; - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); } public void PatientDied(Position point) @@ -1004,7 +1004,7 @@ namespace Scripts.World.NpcSpecial if (Patient) { //303, this flag appear to be required for client side item.spell to work (TARGET_SINGLE_FRIEND) - Patient.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + Patient.AddUnitFlag(UnitFlags.PvpAttackable); Patients.Add(Patient.GetGUID()); ((npc_injured_patient)Patient.GetAI()).DoctorGUID = me.GetGUID(); @@ -1072,13 +1072,13 @@ namespace Scripts.World.NpcSpecial Initialize(); //no select - me.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.NotSelectable); //no regen health - me.SetFlag(UnitFields.Flags, UnitFlags.InCombat); + me.AddUnitFlag(UnitFlags.InCombat); //to make them lay with face down - me.SetUInt32Value(UnitFields.Bytes1, (uint)UnitStandStateType.Dead); + me.SetStandState(UnitStandStateType.Dead); uint mobId = me.GetEntry(); @@ -1118,13 +1118,13 @@ namespace Scripts.World.NpcSpecial } //make not selectable - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.AddUnitFlag(UnitFlags.NotSelectable); //regen health - me.RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); + me.RemoveUnitFlag(UnitFlags.InCombat); //stand up - me.SetUInt32Value(UnitFields.Bytes1, (uint)UnitStandStateType.Stand); + me.SetStandState(UnitStandStateType.Stand); Talk(Texts.SayDoc); @@ -1154,10 +1154,10 @@ namespace Scripts.World.NpcSpecial if (me.IsAlive() && me.GetHealth() <= 6) { - me.RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); - me.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + me.RemoveUnitFlag(UnitFlags.InCombat); + me.AddUnitFlag(UnitFlags.NotSelectable); me.setDeathState(DeathState.JustDied); - me.SetFlag(ObjectFields.DynamicFlags, 32); + me.AddDynamicFlag(UnitDynFlags.Dead); if (!DoctorGUID.IsEmpty()) { @@ -1308,7 +1308,7 @@ namespace Scripts.World.NpcSpecial public override void Reset() { - me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + me.AddUnitFlag(UnitFlags.NonAttackable); } public override void EnterCombat(Unit who) @@ -1706,7 +1706,7 @@ namespace Scripts.World.NpcSpecial public override bool OnGossipHello(Player player, Creature creature) { - if (player.HasFlag(PlayerFields.Flags, PlayerFlags.NoXPGain)) // not gaining XP + if (player.HasPlayerFlag(PlayerFlags.NoXPGain)) // not gaining XP { player.ADD_GOSSIP_ITEM_DB(GossipMenus.MenuIdXpOnOff, GossipMenus.OptionIdXpOn, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 1); player.SEND_GOSSIP_MENU(Texts.XpOnOff, creature.GetGUID()); @@ -1726,10 +1726,10 @@ namespace Scripts.World.NpcSpecial switch (action) { case eTradeskill.GossipActionInfoDef + 1:// XP ON selected - player.RemoveFlag(PlayerFields.Flags, PlayerFlags.NoXPGain); // turn on XP gain + player.RemovePlayerFlag(PlayerFlags.NoXPGain); // turn on XP gain break; case eTradeskill.GossipActionInfoDef + 2:// XP OFF selected - player.SetFlag(PlayerFields.Flags, PlayerFlags.NoXPGain); // turn off XP gain + player.AddPlayerFlag(PlayerFlags.NoXPGain); // turn off XP gain break; } @@ -2170,7 +2170,7 @@ namespace Scripts.World.NpcSpecial break; } me.UpdateEntry(CreatureIds.ExultingWindUpTrainWrecker); - me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotDance); + me.SetEmoteState(Emote.OneshotDance); me.DespawnOrUnsummon(5 * Time.InMilliseconds); _nextAction = 0; break; @@ -2216,8 +2216,8 @@ namespace Scripts.World.NpcSpecial }); _scheduler.Schedule(TimeSpan.FromSeconds(1), task => { - if ((me.HasAura(Spells.AuraTiredS) || me.HasAura(Spells.AuraTiredG)) && me.HasFlag(UnitFields.NpcFlags, NPCFlags.Banker | NPCFlags.Mailbox | NPCFlags.Vendor)) - me.RemoveFlag(UnitFields.NpcFlags, NPCFlags.Banker | NPCFlags.Mailbox | NPCFlags.Vendor); + if ((me.HasAura(Spells.AuraTiredS) || me.HasAura(Spells.AuraTiredG)) && me.HasNpcFlag(NPCFlags.Banker | NPCFlags.Mailbox | NPCFlags.Vendor)) + me.RemoveNpcFlag(NPCFlags.Banker | NPCFlags.Mailbox | NPCFlags.Vendor); task.Repeat(); }); } @@ -2228,7 +2228,7 @@ namespace Scripts.World.NpcSpecial { case GossipMenus.OptionIdBank: { - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Banker); + me.AddNpcFlag(NPCFlags.Banker); uint _bankAura = IsArgentSquire() ? Spells.AuraBankS : Spells.AuraBankG; if (!me.HasAura(_bankAura)) DoCastSelf(_bankAura); @@ -2239,7 +2239,7 @@ namespace Scripts.World.NpcSpecial } case GossipMenus.OptionIdShop: { - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Vendor); + me.AddNpcFlag(NPCFlags.Vendor); uint _shopAura = IsArgentSquire() ? Spells.AuraShopS : Spells.AuraShopG; if (!me.HasAura(_shopAura)) DoCastSelf(_shopAura); @@ -2250,7 +2250,7 @@ namespace Scripts.World.NpcSpecial } case GossipMenus.OptionIdMail: { - me.SetFlag(UnitFields.NpcFlags, NPCFlags.Mailbox); + me.AddNpcFlag(NPCFlags.Mailbox); player.GetSession().SendShowMailBox(me.GetGUID()); uint _mailAura = IsArgentSquire() ? Spells.AuraPostmanS : Spells.AuraPostmanG;