/* * Copyright (C) 2012-2017 CypherCore * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Framework.Constants; using Framework.GameMath; using Framework.IO; using Game.AI; using Game.Entities; using Game.Maps; using Game.Scripting; namespace Scripts.Northrend.CrusadersColiseum.TrialOfTheCrusader { [Script] class instance_trial_of_the_crusader : InstanceMapScript { public instance_trial_of_the_crusader() : base("instance_trial_of_the_crusader", 649) { } class instance_trial_of_the_crusader_InstanceMapScript : InstanceScript { public instance_trial_of_the_crusader_InstanceMapScript(Map map) : base(map) { SetHeaders("TCR"); SetBossNumber(DataTypes.MaxEncounters); LoadBossBoundaries(MiscData.boundaries); TrialCounter = 50; EventStage = 0; northrendBeasts = EncounterState.NotStarted; EventTimer = 1000; NotOneButTwoJormungarsTimer = 0; ResilienceWillFixItTimer = 0; SnoboldCount = 0; MistressOfPainCount = 0; TributeToImmortalityEligible = true; NeedSave = false; } public override bool IsEncounterInProgress() { for (byte i = 0; i < DataTypes.MaxEncounters; ++i) if (GetBossState(i) == EncounterState.InProgress) return true; // Special state is set at Faction Champions after first champ dead, encounter is still in combat if (GetBossState(DataTypes.BossCrusaders) == EncounterState.Special) return true; return false; } public override void OnPlayerEnter(Player player) { if (instance.IsHeroic()) { player.SendUpdateWorldState(WorldStateIds.Show, 1); player.SendUpdateWorldState(WorldStateIds.Count, GetData(DataTypes.TypeCounter)); } else player.SendUpdateWorldState(WorldStateIds.Show, 0); // make sure Anub'arak isnt missing and floor is destroyed after a crash if (GetBossState(DataTypes.BossLichKing) == EncounterState.Done && TrialCounter != 0 && GetBossState(DataTypes.BossAnubarak) != EncounterState.Done) { Creature anubArak = ObjectAccessor.GetCreature(player, GetGuidData(CreatureIds.Anubarak)); if (!anubArak) anubArak = player.SummonCreature(CreatureIds.Anubarak, MiscData.AnubarakLoc[0].GetPositionX(), MiscData.AnubarakLoc[0].GetPositionY(), MiscData.AnubarakLoc[0].GetPositionZ(), 3, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); GameObject floor = ObjectAccessor.GetGameObject(player, GetGuidData(GameObjectIds.ArgentColiseumFloor)); if (floor) floor.SetDestructibleState(GameObjectDestructibleState.Damaged); } } void OpenDoor(ObjectGuid guid) { if (guid.IsEmpty()) return; GameObject go = instance.GetGameObject(guid); if (go) go.SetGoState(GameObjectState.ActiveAlternative); } void CloseDoor(ObjectGuid guid) { if (guid.IsEmpty()) return; GameObject go = instance.GetGameObject(guid); if (go) go.SetGoState(GameObjectState.Ready); } public override void OnCreatureCreate(Creature creature) { switch (creature.GetEntry()) { case CreatureIds.Barrent: BarrentGUID = creature.GetGUID(); if (TrialCounter == 0) creature.DespawnOrUnsummon(); break; case CreatureIds.Tirion: TirionGUID = creature.GetGUID(); break; case CreatureIds.TirionFordring: TirionFordringGUID = creature.GetGUID(); break; case CreatureIds.Fizzlebang: FizzlebangGUID = creature.GetGUID(); break; case CreatureIds.Garrosh: GarroshGUID = creature.GetGUID(); break; case CreatureIds.Varian: VarianGUID = creature.GetGUID(); break; case CreatureIds.Gormok: GormokGUID = creature.GetGUID(); break; case CreatureIds.Acidmaw: AcidmawGUID = creature.GetGUID(); break; case CreatureIds.Dreadscale: DreadscaleGUID = creature.GetGUID(); break; case CreatureIds.Icehowl: IcehowlGUID = creature.GetGUID(); break; case CreatureIds.Jaraxxus: JaraxxusGUID = creature.GetGUID(); break; case CreatureIds.ChampionsController: ChampionsControllerGUID = creature.GetGUID(); break; case CreatureIds.Darkbane: DarkbaneGUID = creature.GetGUID(); break; case CreatureIds.Lightbane: LightbaneGUID = creature.GetGUID(); break; case CreatureIds.Anubarak: AnubarakGUID = creature.GetGUID(); break; default: break; } } public override void OnGameObjectCreate(GameObject go) { switch (go.GetEntry()) { case GameObjectIds.CrusadersCache10: if (instance.GetSpawnMode() == Difficulty.Raid10N) CrusadersCacheGUID = go.GetGUID(); break; case GameObjectIds.CrusadersCache25: if (instance.GetSpawnMode() == Difficulty.Raid25N) CrusadersCacheGUID = go.GetGUID(); break; case GameObjectIds.CrusadersCache10H: if (instance.GetSpawnMode() == Difficulty.Raid10HC) CrusadersCacheGUID = go.GetGUID(); break; case GameObjectIds.CrusadersCache25H: if (instance.GetSpawnMode() == Difficulty.Raid25HC) CrusadersCacheGUID = go.GetGUID(); break; case GameObjectIds.ArgentColiseumFloor: FloorGUID = go.GetGUID(); break; case GameObjectIds.MainGateDoor: MainGateDoorGUID = go.GetGUID(); break; case GameObjectIds.EastPortcullis: EastPortcullisGUID = go.GetGUID(); break; case GameObjectIds.WebDoor: WebDoorGUID = go.GetGUID(); break; case GameObjectIds.TributeChest10h25: case GameObjectIds.TributeChest10h45: case GameObjectIds.TributeChest10h50: case GameObjectIds.TributeChest10h99: case GameObjectIds.TributeChest25h25: case GameObjectIds.TributeChest25h45: case GameObjectIds.TributeChest25h50: case GameObjectIds.TributeChest25h99: TributeChestGUID = go.GetGUID(); break; default: break; } } public override bool SetBossState(uint type, EncounterState state) { if (!base.SetBossState(type, state)) return false; switch (type) { case DataTypes.BossBeasts: break; case DataTypes.BossJaraxxus: // Cleanup Icehowl Creature icehowl = instance.GetCreature(IcehowlGUID); if (icehowl) icehowl.DespawnOrUnsummon(); if (state == EncounterState.Done) EventStage = 2000; break; case DataTypes.BossCrusaders: { // Cleanup Jaraxxus Creature jaraxxus = instance.GetCreature(JaraxxusGUID); if (jaraxxus) jaraxxus.DespawnOrUnsummon(); Creature fizzlebang = instance.GetCreature(FizzlebangGUID); if (fizzlebang) fizzlebang.DespawnOrUnsummon(); switch (state) { case EncounterState.InProgress: ResilienceWillFixItTimer = 0; break; case EncounterState.Special: //Means the first blood ResilienceWillFixItTimer = 60 * Time.InMilliseconds; state = EncounterState.InProgress; break; case EncounterState.Done: DoUpdateCriteria(CriteriaTypes.BeSpellTarget, AchievementData.SpellDefeatFactionChampions); if (ResilienceWillFixItTimer > 0) DoUpdateCriteria(CriteriaTypes.BeSpellTarget, AchievementData.SpellChampionsKilledInMinute); DoRespawnGameObject(CrusadersCacheGUID, 7 * Time.Day); GameObject cache = instance.GetGameObject(CrusadersCacheGUID); if (cache) cache.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); EventStage = 3100; break; default: break; } break; } case DataTypes.BossValkiries: { // Cleanup chest GameObject cache = instance.GetGameObject(CrusadersCacheGUID); if (cache) cache.Delete(); switch (state) { case EncounterState.Fail: if (GetBossState(DataTypes.BossValkiries) == EncounterState.NotStarted) state = EncounterState.NotStarted; break; case EncounterState.Special: if (GetBossState(DataTypes.BossValkiries) == EncounterState.Special) state = EncounterState.Done; break; case EncounterState.Done: if (instance.GetPlayers()[0].GetTeam() == Team.Alliance) EventStage = 4020; else EventStage = 4030; break; default: break; } break; } case DataTypes.BossLichKing: break; case DataTypes.BossAnubarak: switch (state) { case EncounterState.Done: { EventStage = 6000; uint tributeChest = 0; if (instance.GetSpawnMode() == Difficulty.Raid10HC) { if (TrialCounter >= 50) tributeChest = GameObjectIds.TributeChest10h99; else { if (TrialCounter >= 45) tributeChest = GameObjectIds.TributeChest10h50; else { if (TrialCounter >= 25) tributeChest = GameObjectIds.TributeChest10h45; else tributeChest = GameObjectIds.TributeChest10h25; } } } else if (instance.GetSpawnMode() == Difficulty.Raid25HC) { if (TrialCounter >= 50) tributeChest = GameObjectIds.TributeChest25h99; else { if (TrialCounter >= 45) tributeChest = GameObjectIds.TributeChest25h50; else { if (TrialCounter >= 25) tributeChest = GameObjectIds.TributeChest25h45; else tributeChest = GameObjectIds.TributeChest25h25; } } } if (tributeChest != 0) { Creature tirion = instance.GetCreature(TirionGUID); if (tirion) { GameObject chest = tirion.SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, Quaternion.WAxis, Time.Week); if (chest) chest.SetRespawnTime((int)chest.GetRespawnDelay()); } } break; } default: break; } break; default: break; } if (IsEncounterInProgress()) { CloseDoor(GetGuidData(GameObjectIds.EastPortcullis)); CloseDoor(GetGuidData(GameObjectIds.WebDoor)); } else { OpenDoor(GetGuidData(GameObjectIds.EastPortcullis)); OpenDoor(GetGuidData(GameObjectIds.WebDoor)); } if (type < DataTypes.MaxEncounters) { Log.outInfo(LogFilter.Scripts, "[ToCr] BossState(type {0}) {1} = state {2};", type, GetBossState(type), state); if (state == EncounterState.Fail) { if (instance.IsHeroic()) { --TrialCounter; // decrease attempt counter at wipe var PlayerList = instance.GetPlayers(); foreach (var player in PlayerList) player.SendUpdateWorldState(WorldStateIds.Count, TrialCounter); // if theres no more attemps allowed if (TrialCounter == 0) { Unit announcer = instance.GetCreature(GetGuidData(CreatureIds.Barrent)); if (announcer) announcer.ToCreature().DespawnOrUnsummon(); Creature anubArak = instance.GetCreature(GetGuidData(CreatureIds.Anubarak)); if (anubArak) anubArak.DespawnOrUnsummon(); } } NeedSave = true; EventStage = (uint)(type == DataTypes.BossBeasts ? 666 : 0); state = EncounterState.NotStarted; } if (state == EncounterState.Done || NeedSave) { Unit announcer = instance.GetCreature(GetGuidData(CreatureIds.Barrent)); if (announcer) announcer.SetFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); Save(); } } return true; } public override void SetData(uint type, uint data) { switch (type) { case DataTypes.TypeCounter: TrialCounter = data; data = (uint)EncounterState.Done; break; case DataTypes.TypeEvent: EventStage = data; data = (uint)EncounterState.NotStarted; break; case DataTypes.TypeEventTimer: EventTimer = data; data = (uint)EncounterState.NotStarted; break; case DataTypes.TypeNorthrendBeasts: northrendBeasts = (EncounterState)data; switch (data) { case NorthrendBeasts.GormokDone: EventStage = 200; SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.InProgress); break; case NorthrendBeasts.SnakesInProgress: NotOneButTwoJormungarsTimer = 0; break; case NorthrendBeasts.SnakesSpecial: NotOneButTwoJormungarsTimer = 10 * Time.InMilliseconds; break; case NorthrendBeasts.SnakesDone: if (NotOneButTwoJormungarsTimer > 0) DoUpdateCriteria(CriteriaTypes.BeSpellTarget, AchievementData.SpellWormsKilledIn10Seconds); EventStage = 300; SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.InProgress); break; case NorthrendBeasts.IcehowlDone: EventStage = 400; SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.Done); SetBossState(DataTypes.BossBeasts, EncounterState.Done); break; case (uint)EncounterState.Fail: SetBossState(DataTypes.BossBeasts, EncounterState.Fail); break; default: break; } break; //Achievements case DataTypes.SnoboldCount: if (data == DataTypes.Increase) ++SnoboldCount; else if (data == DataTypes.Decrease) --SnoboldCount; break; case DataTypes.MistressOfPainCount: if (data == DataTypes.Increase) ++MistressOfPainCount; else if (data == DataTypes.Decrease) --MistressOfPainCount; break; case DataTypes.TributeToImmortalityEligible: TributeToImmortalityEligible = false; break; default: break; } } public override ObjectGuid GetGuidData(uint type) { switch (type) { case CreatureIds.Barrent: return BarrentGUID; case CreatureIds.Tirion: return TirionGUID; case CreatureIds.TirionFordring: return TirionFordringGUID; case CreatureIds.Fizzlebang: return FizzlebangGUID; case CreatureIds.Garrosh: return GarroshGUID; case CreatureIds.Varian: return VarianGUID; case CreatureIds.Gormok: return GormokGUID; case CreatureIds.Acidmaw: return AcidmawGUID; case CreatureIds.Dreadscale: return DreadscaleGUID; case CreatureIds.Icehowl: return IcehowlGUID; case CreatureIds.Jaraxxus: return JaraxxusGUID; case CreatureIds.ChampionsController: return ChampionsControllerGUID; case CreatureIds.Darkbane: return DarkbaneGUID; case CreatureIds.Lightbane: return LightbaneGUID; case CreatureIds.Anubarak: return AnubarakGUID; case GameObjectIds.ArgentColiseumFloor: return FloorGUID; case GameObjectIds.MainGateDoor: return MainGateDoorGUID; case GameObjectIds.EastPortcullis: return EastPortcullisGUID; case GameObjectIds.WebDoor: return WebDoorGUID; default: break; } return ObjectGuid.Empty; } public override uint GetData(uint type) { switch (type) { case DataTypes.TypeCounter: return TrialCounter; case DataTypes.TypeEvent: return EventStage; case DataTypes.TypeNorthrendBeasts: return (uint)northrendBeasts; case DataTypes.TypeEventTimer: return EventTimer; case DataTypes.TypeEventNpc: switch (EventStage) { case 110: case 140: case 150: case 155: case 200: case 205: case 210: case 220: case 300: case 305: case 310: case 315: case 400: case 666: case 1010: case 1180: case 2000: case 2030: case 3000: case 3001: case 3060: case 3061: case 3090: case 3091: case 3092: case 3100: case 3110: case 4000: case 4010: case 4015: case 4016: case 4040: case 4050: case 5000: case 5005: case 5020: case 6000: case 6005: case 6010: return CreatureIds.Tirion; case 5010: case 5030: case 5040: case 5050: case 5060: case 5070: case 5080: return CreatureIds.LichKing; case 120: case 122: case 2020: case 3080: case 3051: case 3071: case 4020: return CreatureIds.Varian; case 130: case 132: case 2010: case 3050: case 3070: case 3081: case 4030: return CreatureIds.Garrosh; case 1110: case 1120: case 1130: case 1132: case 1134: case 1135: case 1140: case 1142: case 1144: case 1150: return CreatureIds.Fizzlebang; default: return CreatureIds.Tirion; }; default: break; } return 0; } public override void Update(uint diff) { if (GetData(DataTypes.TypeNorthrendBeasts) == NorthrendBeasts.SnakesSpecial && NotOneButTwoJormungarsTimer != 0) { if (NotOneButTwoJormungarsTimer <= diff) NotOneButTwoJormungarsTimer = 0; else NotOneButTwoJormungarsTimer -= diff; } if (GetBossState(DataTypes.BossCrusaders) == EncounterState.Special && ResilienceWillFixItTimer != 0) { if (ResilienceWillFixItTimer <= diff) ResilienceWillFixItTimer = 0; else ResilienceWillFixItTimer -= diff; } } void Save() { OUT_SAVE_INST_DATA(); string saveStream = ""; for (byte i = 0; i < DataTypes.MaxEncounters; ++i) saveStream += GetBossState(i) + ' '; saveStream += TrialCounter; SaveDataBuffer = saveStream; SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE(); NeedSave = false; } public override string GetSaveData() { return SaveDataBuffer; } public override void Load(string strIn) { if (string.IsNullOrEmpty(strIn)) { OUT_LOAD_INST_DATA_FAIL(); return; } OUT_LOAD_INST_DATA(strIn); StringArguments loadStream = new StringArguments(strIn); for (byte i = 0; i < DataTypes.MaxEncounters; ++i) { EncounterState tmpState = (EncounterState)loadStream.NextUInt32(); if (tmpState == EncounterState.InProgress || tmpState > EncounterState.Special) tmpState = EncounterState.NotStarted; SetBossState(i, tmpState); } TrialCounter = loadStream.NextUInt32(); EventStage = 0; OUT_LOAD_INST_DATA_COMPLETE(); } public override bool CheckAchievementCriteriaMeet(uint criteria_id, Player source, Unit target, uint miscvalue1) { switch (criteria_id) { case AchievementData.UpperBackPain10Player: case AchievementData.UpperBackPain10PlayerHeroic: return SnoboldCount >= 2; case AchievementData.UpperBackPain25Player: case AchievementData.UpperBackPain25PlayerHeroic: return SnoboldCount >= 4; case AchievementData.ThreeSixtyPainSpike10Player: case AchievementData.ThreeSixtyPainSpike10PlayerHeroic: case AchievementData.ThreeSixtyPainSpike25Player: case AchievementData.ThreeSixtyPainSpike25PlayerHeroic: return MistressOfPainCount >= 2; case AchievementData.ATributeToSkill10Player: case AchievementData.ATributeToSkill25Player: return TrialCounter >= 25; case AchievementData.ATributeToMadSkill10Player: case AchievementData.ATributeToMadSkill25Player: return TrialCounter >= 45; case AchievementData.ATributeToInsanity10Player: case AchievementData.ATributeToInsanity25Player: case AchievementData.RealmFirstGrandCrusader: return TrialCounter == 50; case AchievementData.ATributeToImmortalityAlliance: case AchievementData.ATributeToImmortalityHorde: return TrialCounter == 50 && TributeToImmortalityEligible; case AchievementData.ATributeToDedicatedInsanity: return false/*uiGrandCrusaderAttemptsLeft == 50 && !bHasAtAnyStagePlayerEquippedTooGoodItem*/; default: break; } return false; } uint TrialCounter; uint EventStage; uint EventTimer; EncounterState northrendBeasts; bool NeedSave; string SaveDataBuffer; ObjectGuid BarrentGUID; ObjectGuid TirionGUID; ObjectGuid TirionFordringGUID; ObjectGuid FizzlebangGUID; ObjectGuid GarroshGUID; ObjectGuid VarianGUID; ObjectGuid GormokGUID; ObjectGuid AcidmawGUID; ObjectGuid DreadscaleGUID; ObjectGuid IcehowlGUID; ObjectGuid JaraxxusGUID; ObjectGuid ChampionsControllerGUID; ObjectGuid DarkbaneGUID; ObjectGuid LightbaneGUID; ObjectGuid AnubarakGUID; ObjectGuid CrusadersCacheGUID; ObjectGuid FloorGUID; ObjectGuid TributeChestGUID; ObjectGuid MainGateDoorGUID; ObjectGuid EastPortcullisGUID; ObjectGuid WebDoorGUID; // Achievement stuff uint NotOneButTwoJormungarsTimer; uint ResilienceWillFixItTimer; byte SnoboldCount; byte MistressOfPainCount; bool TributeToImmortalityEligible; } public override InstanceScript GetInstanceScript(InstanceMap map) { return new instance_trial_of_the_crusader_InstanceMapScript(map); } public static T GetTrialOfTheCrusaderAI(Creature creature) where T : CreatureAI { return GetInstanceAI(creature, "instance_trial_of_the_crusader"); } } [Script] class npc_announcer_toc10 : CreatureScript { public npc_announcer_toc10() : base("npc_announcer_toc10") { } class npc_announcer_toc10AI : ScriptedAI { public npc_announcer_toc10AI(Creature creature) : base(creature) { } public override void Reset() { me.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); Creature pAlly = GetClosestCreatureWithEntry(me, CreatureIds.Thrall, 300.0f); if (pAlly) pAlly.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); pAlly = GetClosestCreatureWithEntry(me, CreatureIds.Proudmoore, 300.0f); if (pAlly) pAlly.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); } public override void AttackStart(Unit who) { } } public override bool OnGossipHello(Player player, Creature creature) { InstanceScript instance = creature.GetInstanceScript(); if (instance == null) return true; string _message = "We are ready!"; if (player.IsInCombat() || instance.IsEncounterInProgress() || instance.GetData(DataTypes.TypeEvent) != 0) return true; byte i = 0; for (; i < MiscData._GossipMessage.Length; ++i) { if ((!MiscData._GossipMessage[i].state && instance.GetBossState(MiscData._GossipMessage[i].encounter) != EncounterState.Done) || (MiscData._GossipMessage[i].state && instance.GetBossState(MiscData._GossipMessage[i].encounter) == EncounterState.Done)) { player.ADD_GOSSIP_ITEM(GossipOptionIcon.Chat, _message, eTradeskill.GossipSenderMain, MiscData._GossipMessage[i].id); break; } } if (i >= MiscData._GossipMessage.Length) return false; player.SEND_GOSSIP_MENU((uint)MiscData._GossipMessage[i].msgnum, creature.GetGUID()); return true; } public override bool OnGossipSelect(Player player, Creature creature, uint sender, uint action) { player.PlayerTalkClass.ClearMenus(); player.CLOSE_GOSSIP_MENU(); InstanceScript instance = creature.GetInstanceScript(); if (instance == null) return true; if (instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { instance.SetData(DataTypes.TypeEvent, 110); instance.SetData(DataTypes.TypeNorthrendBeasts, (uint)EncounterState.NotStarted); instance.SetBossState(DataTypes.BossBeasts, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossJaraxxus) != EncounterState.Done) { // if Jaraxxus is spawned, but the raid wiped Creature jaraxxus = ObjectAccessor.GetCreature(player, instance.GetGuidData(CreatureIds.Jaraxxus)); if (jaraxxus) { jaraxxus.RemoveAurasDueToSpell(Spells.JaraxxusChains); jaraxxus.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); jaraxxus.SetReactState(ReactStates.Defensive); jaraxxus.SetInCombatWithZone(); } else { instance.SetData(DataTypes.TypeEvent, 1010); instance.SetBossState(DataTypes.BossJaraxxus, EncounterState.NotStarted); } } else if (instance.GetBossState(DataTypes.BossCrusaders) != EncounterState.Done) { if (player.GetTeam() == Team.Alliance) instance.SetData(DataTypes.TypeEvent, 3000); else instance.SetData(DataTypes.TypeEvent, 3001); instance.SetBossState(DataTypes.BossCrusaders, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossValkiries) != EncounterState.Done) { instance.SetData(DataTypes.TypeEvent, 4000); instance.SetBossState(DataTypes.BossValkiries, EncounterState.NotStarted); } else if (instance.GetBossState(DataTypes.BossLichKing) != EncounterState.Done) { GameObject floor = ObjectAccessor.GetGameObject(player, instance.GetGuidData(GameObjectIds.ArgentColiseumFloor)); if (floor) floor.SetDestructibleState(GameObjectDestructibleState.Damaged); creature.CastSpell(creature, Spells.CorpseTeleport, false); creature.CastSpell(creature, Spells.DestroyFloorKnockup, false); Creature anubArak = ObjectAccessor.GetCreature(creature, instance.GetGuidData(CreatureIds.Anubarak)); if (!anubArak || !anubArak.IsAlive()) anubArak = creature.SummonCreature(CreatureIds.Anubarak, MiscData.AnubarakLoc[0].GetPositionX(), MiscData.AnubarakLoc[0].GetPositionY(), MiscData.AnubarakLoc[0].GetPositionZ(), 3, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); instance.SetBossState(DataTypes.BossAnubarak, EncounterState.NotStarted); if (creature.IsVisible()) creature.SetVisible(false); } creature.RemoveFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); return true; } public override CreatureAI GetAI(Creature creature) { return instance_trial_of_the_crusader.GetTrialOfTheCrusaderAI(creature); } } [Script] class boss_lich_king_toc : ScriptedAI { public boss_lich_king_toc(Creature creature) : base(creature) { _instance = creature.GetInstanceScript(); } public override void Reset() { _updateTimer = 0; me.SetReactState(ReactStates.Passive); Creature summoned = me.SummonCreature(CreatureIds.Trigger, MiscData.ToCCommonLoc[2].GetPositionX(), MiscData.ToCCommonLoc[2].GetPositionY(), MiscData.ToCCommonLoc[2].GetPositionZ(), 5, TempSummonType.TimedDespawn, 1 * Time.Minute * Time.InMilliseconds); if (summoned) { summoned.CastSpell(summoned, 51807, false); summoned.SetDisplayId(summoned.GetCreatureTemplate().ModelId2); } _instance.SetBossState(DataTypes.BossLichKing, EncounterState.InProgress); me.SetWalk(true); } public override void MovementInform(MovementGeneratorType type, uint id) { if (type != MovementGeneratorType.Point || _instance == null) return; switch (id) { case 0: _instance.SetData(DataTypes.TypeEvent, 5030); break; case 1: _instance.SetData(DataTypes.TypeEvent, 5050); break; default: break; } } public override void UpdateAI(uint uiDiff) { if (_instance == null) return; if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.LichKing) return; _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); if (_updateTimer <= uiDiff) { switch (_instance.GetData(DataTypes.TypeEvent)) { case 5010: Talk(Texts.Stage_4_02); _updateTimer = 3 * Time.InMilliseconds; me.GetMotionMaster().MovePoint(0, MiscData.LichKingLoc[0]); _instance.SetData(DataTypes.TypeEvent, 5020); break; case 5030: Talk(Texts.Stage_4_04); me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.StateTalk); _updateTimer = 10 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 5040); break; case 5040: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); me.GetMotionMaster().MovePoint(1, MiscData.LichKingLoc[1]); _updateTimer = 1 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 5050: me.HandleEmoteCommand(Emote.OneshotExclamation); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 5060); break; case 5060: Talk(Texts.Stage_4_05); me.HandleEmoteCommand(Emote.OneshotKneel); _updateTimer = (uint)(2.5 * Time.InMilliseconds); _instance.SetData(DataTypes.TypeEvent, 5070); break; case 5070: me.CastSpell(me, 68198, false); _updateTimer = (uint)(1.5 * Time.InMilliseconds); _instance.SetData(DataTypes.TypeEvent, 5080); break; case 5080: { GameObject go = ObjectAccessor.GetGameObject(me, _instance.GetGuidData(GameObjectIds.ArgentColiseumFloor)); if (go) { go.SetDisplayId(MiscData.DisplayIdDestroyedFloor); go.SetFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.NoDespawn); go.SetGoState(GameObjectState.Active); } me.CastSpell(me, Spells.CorpseTeleport, false); me.CastSpell(me, Spells.DestroyFloorKnockup, false); _instance.SetBossState(DataTypes.BossLichKing, EncounterState.Done); Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Anubarak)); if (!temp || !temp.IsAlive()) temp = me.SummonCreature(CreatureIds.Anubarak, MiscData.AnubarakLoc[0].GetPositionX(), MiscData.AnubarakLoc[0].GetPositionY(), MiscData.AnubarakLoc[0].GetPositionZ(), 3, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); _instance.SetData(DataTypes.TypeEvent, 0); me.DespawnOrUnsummon(); _updateTimer = 20 * Time.InMilliseconds; break; } default: break; } } else _updateTimer -= uiDiff; _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); } InstanceScript _instance; uint _updateTimer; } [Script] class npc_fizzlebang_toc : ScriptedAI { public npc_fizzlebang_toc(Creature creature) : base(creature) { _summons = new SummonList(me); _instance = me.GetInstanceScript(); } public override void JustDied(Unit killer) { Talk(Texts.Stage_1_06, killer); _instance.SetData(DataTypes.TypeEvent, 1180); Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) { temp.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); temp.SetReactState(ReactStates.Aggressive); temp.SetInCombatWithZone(); } } public override void Reset() { me.SetWalk(true); _portalGUID.Clear(); me.GetMotionMaster().MovePoint(1, MiscData.ToCCommonLoc[10].GetPositionX(), MiscData.ToCCommonLoc[10].GetPositionY() - 60, MiscData.ToCCommonLoc[10].GetPositionZ()); } public override void MovementInform(MovementGeneratorType type, uint id) { if (type != MovementGeneratorType.Point) return; switch (id) { case 1: me.SetWalk(false); _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); _instance.SetData(DataTypes.TypeEvent, 1120); _instance.SetData(DataTypes.TypeEventTimer, 1 * Time.InMilliseconds); break; default: break; } } public override void JustSummoned(Creature summoned) { _summons.Summon(summoned); } public override void UpdateAI(uint uiDiff) { if (_instance == null) return; if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Fizzlebang) return; _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); if (_updateTimer <= uiDiff) { switch (_instance.GetData(DataTypes.TypeEvent)) { case 1110: _instance.SetData(DataTypes.TypeEvent, 1120); _updateTimer = 4 * Time.InMilliseconds; break; case 1120: Talk(Texts.Stage_1_02); _instance.SetData(DataTypes.TypeEvent, 1130); _updateTimer = 12 * Time.InMilliseconds; break; case 1130: { me.GetMotionMaster().MovementExpired(); Talk(Texts.Stage_1_03); me.HandleEmoteCommand(Emote.OneshotSpellCastOmni); Unit pTrigger = me.SummonCreature(CreatureIds.Trigger, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY(), MiscData.ToCCommonLoc[1].GetPositionZ(), 4.69494f, TempSummonType.ManualDespawn); if (pTrigger) { _triggerGUID = pTrigger.GetGUID(); pTrigger.SetObjectScale(2.0f); pTrigger.SetDisplayId(pTrigger.ToCreature().GetCreatureTemplate().ModelId1); pTrigger.CastSpell(pTrigger, Spells.WilfredPortal, false); } _instance.SetData(DataTypes.TypeEvent, 1132); _updateTimer = 4 * Time.InMilliseconds; break; } case 1132: me.GetMotionMaster().MovementExpired(); _instance.SetData(DataTypes.TypeEvent, 1134); _updateTimer = 4 * Time.InMilliseconds; break; case 1134: { me.HandleEmoteCommand(Emote.OneshotSpellCastOmni); Creature pPortal = me.SummonCreature(CreatureIds.WilfredPortal, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY(), MiscData.ToCCommonLoc[1].GetPositionZ(), 4.71239f, TempSummonType.ManualDespawn); if (pPortal) { pPortal.SetReactState(ReactStates.Passive); pPortal.SetObjectScale(2.0f); pPortal.CastSpell(pPortal, Spells.WilfredPortal, false); _portalGUID = pPortal.GetGUID(); } _updateTimer = 4 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 1135); break; } case 1135: _instance.SetData(DataTypes.TypeEvent, 1140); _updateTimer = 3 * Time.InMilliseconds; break; case 1140: { Talk(Texts.Stage_1_04); 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.SetReactState(ReactStates.Passive); temp.GetMotionMaster().MovePoint(0, MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY() - 10, MiscData.ToCCommonLoc[1].GetPositionZ()); } _instance.SetData(DataTypes.TypeEvent, 1142); _updateTimer = 5 * Time.InMilliseconds; break; } case 1142: { Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) temp.SetTarget(me.GetGUID()); Creature pTrigger = ObjectAccessor.GetCreature(me, _triggerGUID); if (pTrigger) pTrigger.DespawnOrUnsummon(); Creature pPortal = ObjectAccessor.GetCreature(me, _portalGUID); if (pPortal) pPortal.DespawnOrUnsummon(); _instance.SetData(DataTypes.TypeEvent, 1144); _updateTimer = 10 * Time.InMilliseconds; break; } case 1144: { Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) temp.GetAI().Talk(Texts.Stage_1_05); _instance.SetData(DataTypes.TypeEvent, 1150); _updateTimer = 5 * Time.InMilliseconds; break; } case 1150: { Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Jaraxxus)); if (temp) { //1-shot Fizzlebang temp.CastSpell(me, 67888, false); me.SetInCombatWith(temp); temp.AddThreat(me, 1000.0f); temp.GetAI().AttackStart(me); } _instance.SetData(DataTypes.TypeEvent, 1160); _updateTimer = 3 * Time.InMilliseconds; break; } } } else _updateTimer -= uiDiff; _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); } InstanceScript _instance; SummonList _summons; uint _updateTimer; ObjectGuid _portalGUID; ObjectGuid _triggerGUID; } [Script] class npc_tirion_toc : ScriptedAI { public npc_tirion_toc(Creature creature) : base(creature) { _instance = me.GetInstanceScript(); } public override void Reset() { } public override void AttackStart(Unit who) { } public override void UpdateAI(uint uiDiff) { if (_instance == null) return; if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Tirion) return; _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); if (_updateTimer <= uiDiff) { switch (_instance.GetData(DataTypes.TypeEvent)) { case 110: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_01); _updateTimer = 22 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 120); break; case 140: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_02); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 150); break; case 150: { me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); if (_instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); Creature temp = me.SummonCreature(CreatureIds.Gormok, MiscData.ToCSpawnLoc[0].GetPositionX(), MiscData.ToCSpawnLoc[0].GetPositionY(), MiscData.ToCSpawnLoc[0].GetPositionZ(), 5, TempSummonType.CorpseTimedDespawn, 30 * Time.InMilliseconds); 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.SetReactState(ReactStates.Passive); } } _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 155); break; } case 155: // keep the raid in combat for the whole encounter, pauses included me.SetInCombatWithZone(); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 160); break; case 200: { Talk(Texts.Stage_0_04); if (_instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); Creature temp = me.SummonCreature(CreatureIds.Dreadscale, MiscData.ToCSpawnLoc[1].GetPositionX(), MiscData.ToCSpawnLoc[1].GetPositionY(), MiscData.ToCSpawnLoc[1].GetPositionZ(), 5, TempSummonType.ManualDespawn); 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.SetReactState(ReactStates.Passive); } } _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 220); break; } case 220: _instance.SetData(DataTypes.TypeEvent, 230); break; case 300: { Talk(Texts.Stage_0_05); if (_instance.GetBossState(DataTypes.BossBeasts) != EncounterState.Done) { _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); Creature temp = me.SummonCreature(CreatureIds.Icehowl, MiscData.ToCSpawnLoc[0].GetPositionX(), MiscData.ToCSpawnLoc[0].GetPositionY(), MiscData.ToCSpawnLoc[0].GetPositionZ(), 5, TempSummonType.DeadDespawn); 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.SetReactState(ReactStates.Passive); } } _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 315); break; } case 315: _instance.SetData(DataTypes.TypeEvent, 320); break; case 400: Talk(Texts.Stage_0_06); me.GetThreatManager().clearReferences(); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 666: Talk(Texts.Stage_0_Wipe); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 1010: Talk(Texts.Stage_1_01); _updateTimer = 7 * Time.InMilliseconds; _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); me.SummonCreature(CreatureIds.Fizzlebang, MiscData.ToCSpawnLoc[0].GetPositionX(), MiscData.ToCSpawnLoc[0].GetPositionY(), MiscData.ToCSpawnLoc[0].GetPositionZ(), 2, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); _instance.SetData(DataTypes.TypeEvent, 0); break; case 1180: Talk(Texts.Stage_1_07); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 2000: Talk(Texts.Stage_1_08); _updateTimer = 18 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 2010); break; case 2030: Talk(Texts.Stage_1_11); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 3000: Talk(Texts.Stage_2_01); _updateTimer = 12 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3050); break; case 3001: Talk(Texts.Stage_2_01); _updateTimer = 10 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3051); break; case 3060: Talk(Texts.Stage_2_03); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3070); break; case 3061: Talk(Texts.Stage_2_03); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3071); break; //Summoning crusaders case 3091: { Creature pChampionController = me.SummonCreature(CreatureIds.ChampionsController, MiscData.ToCCommonLoc[1]); if (pChampionController) pChampionController.GetAI().SetData(0, (uint)Team.Horde); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3092); break; } //Summoning crusaders case 3090: { Creature pChampionController = me.SummonCreature(CreatureIds.ChampionsController, MiscData.ToCCommonLoc[1]); if (pChampionController) pChampionController.GetAI().SetData(0, (uint)Team.Alliance); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3092); break; } case 3092: { Creature pChampionController = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.ChampionsController)); if (pChampionController) pChampionController.GetAI().SetData(1, (uint)EncounterState.NotStarted); _instance.SetData(DataTypes.TypeEvent, 3095); break; } //Crusaders battle end case 3100: Talk(Texts.Stage_2_06); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 4000: Talk(Texts.Stage_3_01); _updateTimer = 13 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 4010); break; case 4010: { Talk(Texts.Stage_3_02); Creature temp = me.SummonCreature(CreatureIds.Lightbane, MiscData.ToCSpawnLoc[1].GetPositionX(), MiscData.ToCSpawnLoc[1].GetPositionY(), MiscData.ToCSpawnLoc[1].GetPositionZ(), 5, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); if (temp) { temp.SetVisible(false); temp.SetReactState(ReactStates.Passive); temp.SummonCreature(CreatureIds.LightEssence, MiscData.TwinValkyrsLoc[0].GetPositionX(), MiscData.TwinValkyrsLoc[0].GetPositionY(), MiscData.TwinValkyrsLoc[0].GetPositionZ()); temp.SummonCreature(CreatureIds.LightEssence, MiscData.TwinValkyrsLoc[1].GetPositionX(), MiscData.TwinValkyrsLoc[1].GetPositionY(), MiscData.TwinValkyrsLoc[1].GetPositionZ()); } temp = me.SummonCreature(CreatureIds.Darkbane, MiscData.ToCSpawnLoc[2].GetPositionX(), MiscData.ToCSpawnLoc[2].GetPositionY(), MiscData.ToCSpawnLoc[2].GetPositionZ(), 5, TempSummonType.CorpseTimedDespawn, MiscData.DespawnTime); if (temp) { temp.SetVisible(false); temp.SetReactState(ReactStates.Passive); temp.SummonCreature(CreatureIds.DarkEssence, MiscData.TwinValkyrsLoc[2].GetPositionX(), MiscData.TwinValkyrsLoc[2].GetPositionY(), MiscData.TwinValkyrsLoc[2].GetPositionZ()); temp.SummonCreature(CreatureIds.DarkEssence, MiscData.TwinValkyrsLoc[3].GetPositionX(), MiscData.TwinValkyrsLoc[3].GetPositionY(), MiscData.TwinValkyrsLoc[3].GetPositionZ()); } _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 4015); break; } case 4015: { _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); Creature temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Lightbane)); if (temp) { temp.GetMotionMaster().MovePoint(1, MiscData.ToCCommonLoc[8].GetPositionX(), MiscData.ToCCommonLoc[8].GetPositionY(), MiscData.ToCCommonLoc[8].GetPositionZ()); temp.SetVisible(true); } temp = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.Darkbane)); if (temp) { temp.GetMotionMaster().MovePoint(1, MiscData.ToCCommonLoc[9].GetPositionX(), MiscData.ToCCommonLoc[9].GetPositionY(), MiscData.ToCCommonLoc[9].GetPositionZ()); temp.SetVisible(true); } _updateTimer = 10 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 4016); break; } case 4016: _instance.DoUseDoorOrButton(_instance.GetGuidData(GameObjectIds.MainGateDoor)); _instance.SetData(DataTypes.TypeEvent, 4017); break; case 4040: _updateTimer = 1 * Time.Minute * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 5000); break; case 5000: Talk(Texts.Stage_4_01); _updateTimer = 10 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 5005); break; case 5005: _updateTimer = 8 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 5010); me.SummonCreature(CreatureIds.LichKing, MiscData.ToCCommonLoc[2].GetPositionX(), MiscData.ToCCommonLoc[2].GetPositionY(), MiscData.ToCCommonLoc[2].GetPositionZ(), 5); break; case 5020: Talk(Texts.Stage_4_03); _updateTimer = 1 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 0); break; case 6000: me.SummonCreature(CreatureIds.TirionFordring, MiscData.EndSpawnLoc[0]); me.SummonCreature(CreatureIds.ArgentMage, MiscData.EndSpawnLoc[1]); me.SummonGameObject(GameObjectIds.PortalToDalaran, MiscData.EndSpawnLoc[2], Quaternion.WAxis, 0); _updateTimer = 20 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 6005); break; case 6005: { Creature tirionFordring = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.TirionFordring)); if (tirionFordring) tirionFordring.GetAI().Talk(Texts.Stage_4_06); _updateTimer = 20 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 6010); break; } case 6010: if (IsHeroic()) { Creature tirionFordring = ObjectAccessor.GetCreature(me, _instance.GetGuidData(CreatureIds.TirionFordring)); if (tirionFordring) tirionFordring.GetAI().Talk(Texts.Stage_4_07); _updateTimer = 1 * Time.Minute * Time.InMilliseconds; _instance.SetBossState(DataTypes.BossAnubarak, EncounterState.Special); _instance.SetData(DataTypes.TypeEvent, 6020); } else _instance.SetData(DataTypes.TypeEvent, 6030); break; case 6020: me.DespawnOrUnsummon(); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 6030); break; default: break; } } else _updateTimer -= uiDiff; _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); } InstanceScript _instance; uint _updateTimer; } [Script] class npc_garrosh_toc : ScriptedAI { public npc_garrosh_toc(Creature creature) : base(creature) { _instance = me.GetInstanceScript(); } public override void Reset() { } public override void AttackStart(Unit who) { } public override void UpdateAI(uint uiDiff) { if (_instance == null) return; if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Garrosh) return; _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); if (_updateTimer <= uiDiff) { switch (_instance.GetData(DataTypes.TypeEvent)) { case 130: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_03h); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 132); break; case 132: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 140); break; case 2010: Talk(Texts.Stage_1_09); _updateTimer = 9 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 2020); break; case 3050: Talk(Texts.Stage_2_02h); _updateTimer = 15 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3060); break; case 3070: Talk(Texts.Stage_2_04h); _updateTimer = 6 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3080); break; case 3081: Talk(Texts.Stage_2_05h); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3091); break; case 4030: Talk(Texts.Stage_3_03h); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 4040); break; default: break; } } else _updateTimer -= uiDiff; _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); } InstanceScript _instance; uint _updateTimer; } [Script] class npc_varian_toc : ScriptedAI { public npc_varian_toc(Creature creature) : base(creature) { _instance = me.GetInstanceScript(); } public override void Reset() { } public override void AttackStart(Unit who) { } public override void UpdateAI(uint uiDiff) { if (_instance == null) return; if (_instance.GetData(DataTypes.TypeEventNpc) != CreatureIds.Varian) return; _updateTimer = _instance.GetData(DataTypes.TypeEventTimer); if (_updateTimer <= uiDiff) { switch (_instance.GetData(DataTypes.TypeEvent)) { case 120: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotTalk); Talk(Texts.Stage_0_03a); _updateTimer = 2 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 122); break; case 122: me.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 130); break; case 2020: Talk(Texts.Stage_1_10); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 2030); break; case 3051: Talk(Texts.Stage_2_02a); _updateTimer = 17 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3061); break; case 3071: Talk(Texts.Stage_2_04a); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3081); break; case 3080: Talk(Texts.Stage_2_05a); _updateTimer = 3 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 3090); break; case 4020: Talk(Texts.Stage_3_03a); _updateTimer = 5 * Time.InMilliseconds; _instance.SetData(DataTypes.TypeEvent, 4040); break; default: break; } } else _updateTimer -= uiDiff; _instance.SetData(DataTypes.TypeEventTimer, _updateTimer); } InstanceScript _instance; uint _updateTimer; } }