diff options
author | QAston <qaston@gmail.com> | 2011-06-26 19:32:41 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-06-26 19:32:41 +0200 |
commit | e5db97a28ef14bbb7c503da636badbcb5e190184 (patch) | |
tree | c2bf57ed8188f600c82c808388b1492b107a9b5e /src | |
parent | faaba1aa65c17ca48f4f8d25612e4ff5f4afcd5e (diff) | |
parent | e7778c72314cd697814d6a16c3e69c2e4737c3ec (diff) |
Merge branch 'master' of https://github.com/TrinityCore/TrinityCore
Diffstat (limited to 'src')
6 files changed, 622 insertions, 641 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 422639c603d..042950a6ddd 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -805,10 +805,10 @@ namespace Trinity float i_range; }; - class AnyUnfriendlyVisibleUnitInObjectRangeCheck + class AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck { public: - AnyUnfriendlyVisibleUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) + AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} bool operator()(Unit* u) @@ -816,6 +816,8 @@ namespace Trinity return u->isAlive() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) + && i_funit->canAttack(u) + && u->GetCreatureType() != CREATURE_TYPE_CRITTER && i_funit->canSeeOrDetect(u); } private: diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index cb60408363d..27a34bb8740 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5655,11 +5655,11 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const Cell cell(p); cell.data.Part.reserved = ALL_DISTRICT; - Trinity::AnyUnfriendlyVisibleUnitInObjectRangeCheck u_check(target, target, radius); - Trinity::UnitListSearcher<Trinity::AnyUnfriendlyVisibleUnitInObjectRangeCheck> checker(target, targets, u_check); + Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck u_check(target, target, radius); + Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck> checker(target, targets, u_check); - TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker); - TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker); + TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker); + TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker); cell.Visit(p, grid_object_checker, *GetBase()->GetOwner()->GetMap(), *target, radius); cell.Visit(p, world_object_checker, *GetBase()->GetOwner()->GetMap(), *target, radius); diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp index 209e3ce2ece..17b5147e082 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp @@ -332,7 +332,8 @@ class boss_flame_leviathan : public CreatureScript case DATA_UNBROKEN: return Unbroken ? 1 : 0; case DATA_ORBIT_ACHIEVEMENTS: - return ActiveTowersCount; + if (ActiveTowers) // Only on HardMode + return ActiveTowersCount; default: break; } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp index b3dea49203b..44f024b3096 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp @@ -220,8 +220,7 @@ enum FreyaEvents #define WAVE_TIME 60000 // Normal wave is one minute #define TIME_DIFFERENCE 10000 // If difference between waveTime and WAVE_TIME is bigger then TIME_DIFFERENCE, schedule EVENT_WAVE in 10 seconds -#define DATA_KNOCK_ON_WOOD 1 -#define DATA_GETTING_BACK_TO_NATURE 2 +#define DATA_GETTING_BACK_TO_NATURE 1 class npc_iron_roots : public CreatureScript { @@ -382,6 +381,8 @@ class boss_freya : public CreatureScript } } + instance->SetData(DATA_KNOCK_ON_WOOD_ACHIEVEMENTS, elderCount); + if (Elder[0]->isAlive()) { Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true); @@ -415,8 +416,6 @@ class boss_freya : public CreatureScript { switch (type) { - case DATA_KNOCK_ON_WOOD: - return elderCount; case DATA_GETTING_BACK_TO_NATURE: return attunedToNature; } @@ -1611,66 +1610,6 @@ class spell_freya_iron_roots : public SpellScriptLoader } }; -class achievement_knock_on_wood : public AchievementCriteriaScript -{ - public: - achievement_knock_on_wood() : AchievementCriteriaScript("achievement_knock_on_wood") - { - } - - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; - - if (Creature* Freya = target->ToCreature()) - if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 1) - return true; - - return false; - } -}; - -class achievement_knock_knock_on_wood : public AchievementCriteriaScript -{ - public: - achievement_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_on_wood") - { - } - - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; - - if (Creature* Freya = target->ToCreature()) - if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 2) - return true; - - return false; - } -}; - -class achievement_knock_knock_knock_on_wood : public AchievementCriteriaScript -{ - public: - achievement_knock_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_knock_on_wood") - { - } - - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; - - if (Creature* Freya = target->ToCreature()) - if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) == 3) - return true; - - return false; - } -}; - class achievement_getting_back_to_nature : public AchievementCriteriaScript { public: @@ -1710,8 +1649,5 @@ void AddSC_boss_freya() new npc_iron_roots(); new spell_freya_attuned_to_nature_dose_reduction(); new spell_freya_iron_roots(); - new achievement_knock_on_wood(); - new achievement_knock_knock_on_wood(); - new achievement_knock_knock_knock_on_wood(); new achievement_getting_back_to_nature(); } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp index 6d75b76fd7d..b91b0f350a3 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp @@ -18,10 +18,9 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "InstanceScript.h" -#include "ObjectMgr.h" #include "ulduar.h" -static const DoorData doorData[] = +static DoorData const doorData[] = { { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S }, { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }, @@ -29,616 +28,641 @@ static const DoorData doorData[] = class instance_ulduar : public InstanceMapScript { -public: - instance_ulduar() : InstanceMapScript("instance_ulduar", 603) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_ulduar_InstanceMapScript(map); - } - - struct instance_ulduar_InstanceMapScript : public InstanceScript - { - instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { } - - uint32 Encounter[MAX_ENCOUNTER]; - std::string m_strInstData; - - uint64 LeviathanGUID; - uint64 IgnisGUID; - uint64 RazorscaleGUID; - uint64 RazorscaleController; - uint64 RazorHarpoonGUIDs[4]; - uint64 ExpeditionCommanderGUID; - uint64 XT002GUID; - uint64 XTToyPileGUIDs[4]; - uint64 AssemblyGUIDs[3]; - uint64 KologarnGUID; - uint64 LeftArmGUID; - uint64 RightArmGUID; - uint64 AuriayaGUID; - uint64 MimironGUID; - uint64 HodirGUID; - uint64 ThorimGUID; - uint64 FreyaGUID; - uint64 KeeperGUIDs[3]; - uint64 VezaxGUID; - uint64 YoggSaronGUID; - uint64 AlgalonGUID; - uint64 LeviathanGateGUID; - uint64 VezaxDoorGUID; - - uint64 KologarnChestGUID; - uint64 KologarnBridgeGUID; - uint64 KologarnDoorGUID; - uint64 ThorimChestGUID; - uint64 HodirRareCacheGUID; - uint64 HodirChestGUID; - uint64 FreyaChestGUID; - uint64 HodirDoorGUID; - uint64 HodirIceDoorGUID; - uint64 ArchivumDoorGUID; - - uint32 TeamInInstance; - uint32 HodirRareCacheData; - - std::set<uint64> mRubbleSpawns; - - void Initialize() - { - SetBossNumber(MAX_ENCOUNTER); - LoadDoorData(doorData); - IgnisGUID = 0; - RazorscaleGUID = 0; - RazorscaleController = 0; - ExpeditionCommanderGUID = 0; - XT002GUID = 0; - KologarnGUID = 0; - LeftArmGUID = 0; - RightArmGUID = 0; - AuriayaGUID = 0; - MimironGUID = 0; - HodirGUID = 0; - ThorimGUID = 0; - FreyaGUID = 0; - VezaxGUID = 0; - YoggSaronGUID = 0; - AlgalonGUID = 0; - KologarnChestGUID = 0; - KologarnBridgeGUID = 0; - KologarnChestGUID = 0; - ThorimChestGUID = 0; - HodirRareCacheGUID = 0; - HodirChestGUID = 0; - FreyaChestGUID = 0; - LeviathanGateGUID = 0; - VezaxDoorGUID = 0; - HodirDoorGUID = 0; - HodirIceDoorGUID = 0; - ArchivumDoorGUID = 0; - TeamInInstance = 0; - HodirRareCacheData = 0; - - memset(Encounter, 0, sizeof(Encounter)); - memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs)); - memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs)); - memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs)); - memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs)); - } + public: + instance_ulduar() : InstanceMapScript("instance_ulduar", 603) { } - bool IsEncounterInProgress() const + struct instance_ulduar_InstanceMapScript : public InstanceScript { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { } + + uint32 Encounter[MAX_ENCOUNTER]; + std::string m_strInstData; + + // Creatures + uint64 LeviathanGUID; + uint64 IgnisGUID; + uint64 RazorscaleGUID; + uint64 RazorscaleController; + uint64 RazorHarpoonGUIDs[4]; + uint64 ExpeditionCommanderGUID; + uint64 XT002GUID; + uint64 XTToyPileGUIDs[4]; + uint64 AssemblyGUIDs[3]; + uint64 KologarnGUID; + uint64 LeftArmGUID; + uint64 RightArmGUID; + uint64 AuriayaGUID; + uint64 MimironGUID; + uint64 HodirGUID; + uint64 ThorimGUID; + uint64 FreyaGUID; + uint64 KeeperGUIDs[3]; + uint64 VezaxGUID; + uint64 YoggSaronGUID; + uint64 AlgalonGUID; + uint64 LeviathanGateGUID; + uint64 VezaxDoorGUID; + + // GameObjects + uint64 KologarnChestGUID; + uint64 KologarnBridgeGUID; + uint64 KologarnDoorGUID; + uint64 ThorimChestGUID; + uint64 HodirRareCacheGUID; + uint64 HodirChestGUID; + uint64 FreyaChestGUID; + uint64 HodirDoorGUID; + uint64 HodirIceDoorGUID; + uint64 ArchivumDoorGUID; + + // Miscellaneous + uint32 TeamInInstance; + uint32 HodirRareCacheData; + uint8 elderCount; + + std::set<uint64> mRubbleSpawns; + + void Initialize() { - if (Encounter[i] == IN_PROGRESS) - return true; + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); + IgnisGUID = 0; + RazorscaleGUID = 0; + RazorscaleController = 0; + ExpeditionCommanderGUID = 0; + XT002GUID = 0; + KologarnGUID = 0; + LeftArmGUID = 0; + RightArmGUID = 0; + AuriayaGUID = 0; + MimironGUID = 0; + HodirGUID = 0; + ThorimGUID = 0; + FreyaGUID = 0; + VezaxGUID = 0; + YoggSaronGUID = 0; + AlgalonGUID = 0; + KologarnChestGUID = 0; + KologarnBridgeGUID = 0; + KologarnChestGUID = 0; + ThorimChestGUID = 0; + HodirRareCacheGUID = 0; + HodirChestGUID = 0; + FreyaChestGUID = 0; + LeviathanGateGUID = 0; + VezaxDoorGUID = 0; + HodirDoorGUID = 0; + HodirIceDoorGUID = 0; + ArchivumDoorGUID = 0; + TeamInInstance = 0; + HodirRareCacheData = 0; + elderCount = 0; + + memset(Encounter, 0, sizeof(Encounter)); + memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs)); + memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs)); + memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs)); + memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs)); } - return false; - } + bool IsEncounterInProgress() const + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + if (Encounter[i] == IN_PROGRESS) + return true; + } - void OnPlayerEnter(Player* player) - { - if (!TeamInInstance) - TeamInInstance = player->GetTeam(); - } + return false; + } - void OnCreatureCreate(Creature* creature) - { - if (!TeamInInstance) + void OnPlayerEnter(Player* player) { - Map::PlayerList const& Players = instance->GetPlayers(); - if (!Players.isEmpty()) - if (Player* player = Players.begin()->getSource()) - TeamInInstance = player->GetTeam(); + if (!TeamInInstance) + TeamInInstance = player->GetTeam(); } - switch (creature->GetEntry()) + void OnCreatureCreate(Creature* creature) { - case NPC_LEVIATHAN: - LeviathanGUID = creature->GetGUID(); - break; - case NPC_IGNIS: - IgnisGUID = creature->GetGUID(); - break; - case NPC_RAZORSCALE: - RazorscaleGUID = creature->GetGUID(); - break; - case NPC_RAZORSCALE_CONTROLLER: - RazorscaleController = creature->GetGUID(); - break; - case NPC_EXPEDITION_COMMANDER: - ExpeditionCommanderGUID = creature->GetGUID(); - break; - case NPC_XT002: - XT002GUID = creature->GetGUID(); - break; - case NPC_XT_TOY_PILE: - for (uint8 i = 0; i < 4; ++i) - if (!XTToyPileGUIDs[i]) - XTToyPileGUIDs[i] = creature->GetGUID(); - break; - - // Assembly of Iron - case NPC_STEELBREAKER: - AssemblyGUIDs[0] = creature->GetGUID(); - break; - case NPC_MOLGEIM: - AssemblyGUIDs[1] = creature->GetGUID(); - break; - case NPC_BRUNDIR: - AssemblyGUIDs[2] = creature->GetGUID(); - break; - - // Freya's Keeper - case NPC_IRONBRANCH: - KeeperGUIDs[0] = creature->GetGUID(); - if (GetBossState(BOSS_FREYA) == DONE) - creature->DespawnOrUnsummon(); - break; - case NPC_BRIGHTLEAF: - KeeperGUIDs[1] = creature->GetGUID(); - if (GetBossState(BOSS_FREYA) == DONE) - creature->DespawnOrUnsummon(); - break; - case NPC_STONEBARK: - KeeperGUIDs[2] = creature->GetGUID(); - if (GetBossState(BOSS_FREYA) == DONE) - creature->DespawnOrUnsummon(); - break; - - // Kologarn - case NPC_KOLOGARN: - KologarnGUID = creature->GetGUID(); - break; - case NPC_KOLOGARN_BRIDGE: - // The below hacks are courtesy of the grid/visibilitysystem - if (GetBossState(BOSS_KOLOGARN) == DONE) - { - creature->SetDeadByDefault(true); - creature->setDeathState(CORPSE); - creature->DestroyForNearbyPlayers(); - creature->UpdateObjectVisibility(true); - } - else - { - creature->SetDeadByDefault(false); - creature->setDeathState(CORPSE); - creature->RemoveCorpse(true); - } - break; - - case NPC_AURIAYA: - AuriayaGUID = creature->GetGUID(); - break; - case NPC_MIMIRON: - MimironGUID = creature->GetGUID(); - break; - case NPC_HODIR: - HodirGUID = creature->GetGUID(); - break; - case NPC_THORIM: - ThorimGUID = creature->GetGUID(); - break; - case NPC_FREYA: - FreyaGUID = creature->GetGUID(); - break; - case NPC_VEZAX: - VezaxGUID = creature->GetGUID(); - break; - case NPC_YOGGSARON: - YoggSaronGUID = creature->GetGUID(); - break; - case NPC_ALGALON: - AlgalonGUID = creature->GetGUID(); - break; - - // Hodir's Helper NPCs - case NPC_EIVI_NIGHTFEATHER: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_TOR_GREYCLOUD, HORDE); - break; - case NPC_ELLIE_NIGHTFEATHER: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_KAR_GREYCLOUD, HORDE); - break; - case NPC_ELEMENTALIST_MAHFUUN: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_SPIRITWALKER_TARA, HORDE); - break; - case NPC_ELEMENTALIST_AVUUN: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_SPIRITWALKER_YONA, HORDE); - break; - case NPC_MISSY_FLAMECUFFS: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_AMIRA_BLAZEWEAVER, HORDE); - break; - case NPC_SISSY_FLAMECUFFS: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_VEESHA_BLAZEWEAVER, HORDE); - break; - case NPC_FIELD_MEDIC_PENNY: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_BATTLE_PRIEST_ELIZA, HORDE); - break; - case NPC_FIELD_MEDIC_JESSI: - if (TeamInInstance == HORDE) - creature->UpdateEntry(NPC_BATTLE_PRIEST_GINA, HORDE); - break; - } + if (!TeamInInstance) + { + Map::PlayerList const& Players = instance->GetPlayers(); + if (!Players.isEmpty()) + if (Player* player = Players.begin()->getSource()) + TeamInInstance = player->GetTeam(); + } - } + switch (creature->GetEntry()) + { + case NPC_LEVIATHAN: + LeviathanGUID = creature->GetGUID(); + break; + case NPC_IGNIS: + IgnisGUID = creature->GetGUID(); + break; + case NPC_RAZORSCALE: + RazorscaleGUID = creature->GetGUID(); + break; + case NPC_RAZORSCALE_CONTROLLER: + RazorscaleController = creature->GetGUID(); + break; + case NPC_EXPEDITION_COMMANDER: + ExpeditionCommanderGUID = creature->GetGUID(); + break; + case NPC_XT002: + XT002GUID = creature->GetGUID(); + break; + case NPC_XT_TOY_PILE: + for (uint8 i = 0; i < 4; ++i) + if (!XTToyPileGUIDs[i]) + XTToyPileGUIDs[i] = creature->GetGUID(); + break; - void OnGameObjectCreate(GameObject* gameObject) - { - switch (gameObject->GetEntry()) - { - case GO_KOLOGARN_CHEST_HERO: - case GO_KOLOGARN_CHEST: - KologarnChestGUID = gameObject->GetGUID(); - break; - case GO_KOLOGARN_BRIDGE: - KologarnBridgeGUID = gameObject->GetGUID(); - if (GetBossState(BOSS_KOLOGARN) == DONE) - HandleGameObject(0, false, gameObject); - break; - case GO_KOLOGARN_DOOR: - KologarnDoorGUID = gameObject->GetGUID(); - break; - case GO_THORIM_CHEST_HERO: - case GO_THORIM_CHEST: - ThorimChestGUID = gameObject->GetGUID(); - break; - case GO_HODIR_RARE_CACHE_OF_WINTER_HERO: - case GO_HODIR_RARE_CACHE_OF_WINTER: - HodirRareCacheGUID = gameObject->GetGUID(); - break; - case GO_HODIR_CHEST_HERO: - case GO_HODIR_CHEST: - HodirChestGUID = gameObject->GetGUID(); - break; - case GO_FREYA_CHEST_HERO: - case GO_FREYA_CHEST: - FreyaChestGUID = gameObject->GetGUID(); - break; - case GO_LEVIATHAN_DOOR: - AddDoor(gameObject, true); - break; - case GO_LEVIATHAN_GATE: - LeviathanGateGUID = gameObject->GetGUID(); - if (GetBossState(BOSS_LEVIATHAN) == DONE) - gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - break; - case GO_VEZAX_DOOR: - VezaxDoorGUID = gameObject->GetGUID(); - HandleGameObject(0, false, gameObject); - break; - case GO_RAZOR_HARPOON_1: - RazorHarpoonGUIDs[0] = gameObject->GetGUID(); - break; - case GO_RAZOR_HARPOON_2: - RazorHarpoonGUIDs[1] = gameObject->GetGUID(); - break; - case GO_RAZOR_HARPOON_3: - RazorHarpoonGUIDs[2] = gameObject->GetGUID(); - break; - case GO_RAZOR_HARPOON_4: - RazorHarpoonGUIDs[3] = gameObject->GetGUID(); - break; - case GO_MOLE_MACHINE: - if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS) - gameObject->SetGoState(GO_STATE_ACTIVE); - case GO_HODIR_DOOR: - HodirDoorGUID = gameObject->GetGUID(); - break; - case GO_HODIR_ICE_DOOR: - HodirIceDoorGUID = gameObject->GetGUID(); - break; - case GO_ARCHIVUM_DOOR: - ArchivumDoorGUID = gameObject->GetGUID(); - if (GetBossState(BOSS_ASSEMBLY_OF_IRON) != DONE) - HandleGameObject(ArchivumDoorGUID, false); - break; - } - } + // Assembly of Iron + case NPC_STEELBREAKER: + AssemblyGUIDs[0] = creature->GetGUID(); + break; + case NPC_MOLGEIM: + AssemblyGUIDs[1] = creature->GetGUID(); + break; + case NPC_BRUNDIR: + AssemblyGUIDs[2] = creature->GetGUID(); + break; - void OnGameObjectRemove(GameObject* gameObject) - { - switch (gameObject->GetEntry()) - { - case GO_LEVIATHAN_DOOR: - AddDoor(gameObject, false); - break; - default: - break; - } - } + // Freya's Keeper + case NPC_IRONBRANCH: + KeeperGUIDs[0] = creature->GetGUID(); + if (GetBossState(BOSS_FREYA) == DONE) + creature->DespawnOrUnsummon(); + break; + case NPC_BRIGHTLEAF: + KeeperGUIDs[1] = creature->GetGUID(); + if (GetBossState(BOSS_FREYA) == DONE) + creature->DespawnOrUnsummon(); + break; + case NPC_STONEBARK: + KeeperGUIDs[2] = creature->GetGUID(); + if (GetBossState(BOSS_FREYA) == DONE) + creature->DespawnOrUnsummon(); + break; + + // Kologarn + case NPC_KOLOGARN: + KologarnGUID = creature->GetGUID(); + break; + case NPC_KOLOGARN_BRIDGE: + // The below hacks are courtesy of the grid/visibilitysystem + if (GetBossState(BOSS_KOLOGARN) == DONE) + { + creature->SetDeadByDefault(true); + creature->setDeathState(CORPSE); + creature->DestroyForNearbyPlayers(); + creature->UpdateObjectVisibility(true); + } + else + { + creature->SetDeadByDefault(false); + creature->setDeathState(CORPSE); + creature->RemoveCorpse(true); + } + break; - void ProcessEvent(GameObject* /*go*/, uint32 eventId) - { - // Flame Leviathan's Tower Event triggers - Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID); + case NPC_AURIAYA: + AuriayaGUID = creature->GetGUID(); + break; + case NPC_MIMIRON: + MimironGUID = creature->GetGUID(); + break; + case NPC_HODIR: + HodirGUID = creature->GetGUID(); + break; + case NPC_THORIM: + ThorimGUID = creature->GetGUID(); + break; + case NPC_FREYA: + FreyaGUID = creature->GetGUID(); + break; + case NPC_VEZAX: + VezaxGUID = creature->GetGUID(); + break; + case NPC_YOGGSARON: + YoggSaronGUID = creature->GetGUID(); + break; + case NPC_ALGALON: + AlgalonGUID = creature->GetGUID(); + break; - if (FlameLeviathan && FlameLeviathan->isAlive()) //No leviathan, no event triggering ;) - switch (eventId) - { - case EVENT_TOWER_OF_STORM_DESTROYED: - FlameLeviathan->AI()->DoAction(1); + // Hodir's Helper NPCs + case NPC_EIVI_NIGHTFEATHER: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_TOR_GREYCLOUD, HORDE); + break; + case NPC_ELLIE_NIGHTFEATHER: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_KAR_GREYCLOUD, HORDE); + break; + case NPC_ELEMENTALIST_MAHFUUN: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_SPIRITWALKER_TARA, HORDE); + break; + case NPC_ELEMENTALIST_AVUUN: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_SPIRITWALKER_YONA, HORDE); break; - case EVENT_TOWER_OF_FROST_DESTROYED: - FlameLeviathan->AI()->DoAction(2); + case NPC_MISSY_FLAMECUFFS: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_AMIRA_BLAZEWEAVER, HORDE); break; - case EVENT_TOWER_OF_FLAMES_DESTROYED: - FlameLeviathan->AI()->DoAction(3); + case NPC_SISSY_FLAMECUFFS: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_VEESHA_BLAZEWEAVER, HORDE); break; - case EVENT_TOWER_OF_LIFE_DESTROYED: - FlameLeviathan->AI()->DoAction(4); + case NPC_FIELD_MEDIC_PENNY: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_BATTLE_PRIEST_ELIZA, HORDE); + break; + case NPC_FIELD_MEDIC_JESSI: + if (TeamInInstance == HORDE) + creature->UpdateEntry(NPC_BATTLE_PRIEST_GINA, HORDE); break; } - } - - void ProcessEvent(Unit* /*unit*/, uint32 /*eventId*/) - { - } - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; + } - switch (type) + void OnGameObjectCreate(GameObject* gameObject) { - case BOSS_LEVIATHAN: - case BOSS_IGNIS: - case BOSS_RAZORSCALE: - case BOSS_XT002: - case BOSS_AURIAYA: - case BOSS_MIMIRON: - break; - case BOSS_ASSEMBLY_OF_IRON: - if (state == DONE) - HandleGameObject(ArchivumDoorGUID, true); - break; - case BOSS_VEZAX: - if (state == DONE) - HandleGameObject(VezaxDoorGUID, true); - break; - case BOSS_YOGGSARON: - break; - case BOSS_KOLOGARN: - if (state == DONE) - { - if (GameObject* gameObject = instance->GetGameObject(KologarnChestGUID)) - gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); - HandleGameObject(KologarnBridgeGUID, false); - } - if (state == IN_PROGRESS) - HandleGameObject(KologarnDoorGUID, false); - else - HandleGameObject(KologarnDoorGUID, true); - break; - case BOSS_HODIR: - if (state == DONE) - { - if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID)) - if (GetData(DATA_HODIR_RARE_CACHE) == 1) - HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); - if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID)) - HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay()); - HandleGameObject(HodirDoorGUID, true); - HandleGameObject(HodirIceDoorGUID, true); - } - break; - case BOSS_THORIM: - if (state == DONE) - if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID)) - gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); - break; - case BOSS_FREYA: - if (state == DONE) - if (GameObject* gameObject = instance->GetGameObject(FreyaChestGUID)) - gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); - break; + switch (gameObject->GetEntry()) + { + case GO_KOLOGARN_CHEST_HERO: + case GO_KOLOGARN_CHEST: + KologarnChestGUID = gameObject->GetGUID(); + break; + case GO_KOLOGARN_BRIDGE: + KologarnBridgeGUID = gameObject->GetGUID(); + if (GetBossState(BOSS_KOLOGARN) == DONE) + HandleGameObject(0, false, gameObject); + break; + case GO_KOLOGARN_DOOR: + KologarnDoorGUID = gameObject->GetGUID(); + break; + case GO_THORIM_CHEST_HERO: + case GO_THORIM_CHEST: + ThorimChestGUID = gameObject->GetGUID(); + break; + case GO_HODIR_RARE_CACHE_OF_WINTER_HERO: + case GO_HODIR_RARE_CACHE_OF_WINTER: + HodirRareCacheGUID = gameObject->GetGUID(); + break; + case GO_HODIR_CHEST_HERO: + case GO_HODIR_CHEST: + HodirChestGUID = gameObject->GetGUID(); + break; + case GO_FREYA_CHEST_HERO: + case GO_FREYA_CHEST: + FreyaChestGUID = gameObject->GetGUID(); + break; + case GO_LEVIATHAN_DOOR: + AddDoor(gameObject, true); + break; + case GO_LEVIATHAN_GATE: + LeviathanGateGUID = gameObject->GetGUID(); + if (GetBossState(BOSS_LEVIATHAN) == DONE) + gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + break; + case GO_VEZAX_DOOR: + VezaxDoorGUID = gameObject->GetGUID(); + HandleGameObject(0, false, gameObject); + break; + case GO_RAZOR_HARPOON_1: + RazorHarpoonGUIDs[0] = gameObject->GetGUID(); + break; + case GO_RAZOR_HARPOON_2: + RazorHarpoonGUIDs[1] = gameObject->GetGUID(); + break; + case GO_RAZOR_HARPOON_3: + RazorHarpoonGUIDs[2] = gameObject->GetGUID(); + break; + case GO_RAZOR_HARPOON_4: + RazorHarpoonGUIDs[3] = gameObject->GetGUID(); + break; + case GO_MOLE_MACHINE: + if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS) + gameObject->SetGoState(GO_STATE_ACTIVE); + case GO_HODIR_DOOR: + HodirDoorGUID = gameObject->GetGUID(); + break; + case GO_HODIR_ICE_DOOR: + HodirIceDoorGUID = gameObject->GetGUID(); + break; + case GO_ARCHIVUM_DOOR: + ArchivumDoorGUID = gameObject->GetGUID(); + if (GetBossState(BOSS_ASSEMBLY_OF_IRON) != DONE) + HandleGameObject(ArchivumDoorGUID, false); + break; + } } - return true; - } + void OnGameObjectRemove(GameObject* gameObject) + { + switch (gameObject->GetEntry()) + { + case GO_LEVIATHAN_DOOR: + AddDoor(gameObject, false); + break; + default: + break; + } + } - void SetData(uint32 type, uint32 data) - { - switch (type) + void ProcessEvent(GameObject* /*gameObject*/, uint32 eventId) { - case TYPE_COLOSSUS: - Encounter[TYPE_COLOSSUS] = data; - if (data == 2) + // Flame Leviathan's Tower Event triggers + Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID); + if (FlameLeviathan && FlameLeviathan->isAlive()) // No leviathan, no event triggering ;) + switch (eventId) { - if (Creature* Leviathan = instance->GetCreature(LeviathanGUID)) - Leviathan->AI()->DoAction(10); - if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID)) - gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - SaveToDB(); + case EVENT_TOWER_OF_STORM_DESTROYED: + FlameLeviathan->AI()->DoAction(1); + break; + case EVENT_TOWER_OF_FROST_DESTROYED: + FlameLeviathan->AI()->DoAction(2); + break; + case EVENT_TOWER_OF_FLAMES_DESTROYED: + FlameLeviathan->AI()->DoAction(3); + break; + case EVENT_TOWER_OF_LIFE_DESTROYED: + FlameLeviathan->AI()->DoAction(4); + break; } - break; - case DATA_HODIR_RARE_CACHE: - HodirRareCacheData = data; - break; - default: - break; } - } - void SetData64(uint32 type, uint64 data) - { - switch (type) + void ProcessEvent(Unit* /*unit*/, uint32 /*eventId*/) { - case DATA_LEFT_ARM: - LeftArmGUID = data; - break; - case DATA_RIGHT_ARM: - RightArmGUID = data; - break; } - } - uint64 GetData64(uint32 data) - { - switch (data) + bool SetBossState(uint32 type, EncounterState state) { - case BOSS_LEVIATHAN: - return LeviathanGUID; - case BOSS_IGNIS: - return IgnisGUID; - case BOSS_RAZORSCALE: - return RazorscaleGUID; - case DATA_RAZORSCALE_CONTROL: - return RazorscaleController; - case BOSS_XT002: - return XT002GUID; - case DATA_TOY_PILE_0: - case DATA_TOY_PILE_1: - case DATA_TOY_PILE_2: - case DATA_TOY_PILE_3: - return XTToyPileGUIDs[data - DATA_TOY_PILE_0]; - case BOSS_KOLOGARN: - return KologarnGUID; - case DATA_LEFT_ARM: - return LeftArmGUID; - case DATA_RIGHT_ARM: - return RightArmGUID; - case BOSS_AURIAYA: - return AuriayaGUID; - case BOSS_MIMIRON: - return MimironGUID; - case BOSS_HODIR: - return HodirGUID; - case BOSS_THORIM: - return ThorimGUID; - case BOSS_FREYA: - return FreyaGUID; - case BOSS_VEZAX: - return VezaxGUID; - case BOSS_YOGGSARON: - return YoggSaronGUID; - case BOSS_ALGALON: - return AlgalonGUID; - - // Razorscale expedition commander - case DATA_EXPEDITION_COMMANDER: - return ExpeditionCommanderGUID; - case GO_RAZOR_HARPOON_1: - return RazorHarpoonGUIDs[0]; - case GO_RAZOR_HARPOON_2: - return RazorHarpoonGUIDs[1]; - case GO_RAZOR_HARPOON_3: - return RazorHarpoonGUIDs[2]; - case GO_RAZOR_HARPOON_4: - return RazorHarpoonGUIDs[3]; - - // Assembly of Iron - case BOSS_STEELBREAKER: - return AssemblyGUIDs[0]; - case BOSS_MOLGEIM: - return AssemblyGUIDs[1]; - case BOSS_BRUNDIR: - return AssemblyGUIDs[2]; - - // Freya's Keepers - case BOSS_BRIGHTLEAF: - return KeeperGUIDs[0]; - case BOSS_IRONBRANCH: - return KeeperGUIDs[1]; - case BOSS_STONEBARK: - return KeeperGUIDs[2]; + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case BOSS_LEVIATHAN: + case BOSS_IGNIS: + case BOSS_RAZORSCALE: + case BOSS_XT002: + case BOSS_AURIAYA: + case BOSS_MIMIRON: + break; + case BOSS_ASSEMBLY_OF_IRON: + if (state == DONE) + HandleGameObject(ArchivumDoorGUID, true); + break; + case BOSS_VEZAX: + if (state == DONE) + HandleGameObject(VezaxDoorGUID, true); + break; + case BOSS_YOGGSARON: + break; + case BOSS_KOLOGARN: + if (state == DONE) + { + if (GameObject* gameObject = instance->GetGameObject(KologarnChestGUID)) + gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); + HandleGameObject(KologarnBridgeGUID, false); + } + if (state == IN_PROGRESS) + HandleGameObject(KologarnDoorGUID, false); + else + HandleGameObject(KologarnDoorGUID, true); + break; + case BOSS_HODIR: + if (state == DONE) + { + if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID)) + if (GetData(DATA_HODIR_RARE_CACHE) == 1) + HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); + if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID)) + HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay()); + HandleGameObject(HodirDoorGUID, true); + HandleGameObject(HodirIceDoorGUID, true); + } + break; + case BOSS_THORIM: + if (state == DONE) + if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID)) + gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); + break; + case BOSS_FREYA: + if (state == DONE) + if (GameObject* gameObject = instance->GetGameObject(FreyaChestGUID)) + gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); + break; + } + + return true; } - return 0; - } + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_COLOSSUS: + Encounter[TYPE_COLOSSUS] = data; + if (data == 2) + { + if (Creature* Leviathan = instance->GetCreature(LeviathanGUID)) + Leviathan->AI()->DoAction(10); + if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID)) + gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + SaveToDB(); + } + break; + case DATA_HODIR_RARE_CACHE: + HodirRareCacheData = data; + break; + case DATA_KNOCK_ON_WOOD_ACHIEVEMENTS: + elderCount = data; + break; + default: + break; + } + } - uint32 GetData(uint32 type) - { - switch (type) + void SetData64(uint32 type, uint64 data) { - case TYPE_COLOSSUS: - return Encounter[type]; - break; - case DATA_HODIR_RARE_CACHE: - return HodirRareCacheData; - break; + switch (type) + { + case DATA_LEFT_ARM: + LeftArmGUID = data; + break; + case DATA_RIGHT_ARM: + RightArmGUID = data; + break; + } } - return 0; - } + uint64 GetData64(uint32 data) + { + switch (data) + { + case BOSS_LEVIATHAN: + return LeviathanGUID; + case BOSS_IGNIS: + return IgnisGUID; + case BOSS_RAZORSCALE: + return RazorscaleGUID; + case DATA_RAZORSCALE_CONTROL: + return RazorscaleController; + case BOSS_XT002: + return XT002GUID; + case DATA_TOY_PILE_0: + case DATA_TOY_PILE_1: + case DATA_TOY_PILE_2: + case DATA_TOY_PILE_3: + return XTToyPileGUIDs[data - DATA_TOY_PILE_0]; + case BOSS_KOLOGARN: + return KologarnGUID; + case DATA_LEFT_ARM: + return LeftArmGUID; + case DATA_RIGHT_ARM: + return RightArmGUID; + case BOSS_AURIAYA: + return AuriayaGUID; + case BOSS_MIMIRON: + return MimironGUID; + case BOSS_HODIR: + return HodirGUID; + case BOSS_THORIM: + return ThorimGUID; + case BOSS_FREYA: + return FreyaGUID; + case BOSS_VEZAX: + return VezaxGUID; + case BOSS_YOGGSARON: + return YoggSaronGUID; + case BOSS_ALGALON: + return AlgalonGUID; + + // Razorscale expedition commander + case DATA_EXPEDITION_COMMANDER: + return ExpeditionCommanderGUID; + case GO_RAZOR_HARPOON_1: + return RazorHarpoonGUIDs[0]; + case GO_RAZOR_HARPOON_2: + return RazorHarpoonGUIDs[1]; + case GO_RAZOR_HARPOON_3: + return RazorHarpoonGUIDs[2]; + case GO_RAZOR_HARPOON_4: + return RazorHarpoonGUIDs[3]; + + // Assembly of Iron + case BOSS_STEELBREAKER: + return AssemblyGUIDs[0]; + case BOSS_MOLGEIM: + return AssemblyGUIDs[1]; + case BOSS_BRUNDIR: + return AssemblyGUIDs[2]; + + // Freya's Keepers + case BOSS_BRIGHTLEAF: + return KeeperGUIDs[0]; + case BOSS_IRONBRANCH: + return KeeperGUIDs[1]; + case BOSS_STONEBARK: + return KeeperGUIDs[2]; + } - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; + return 0; + } - std::ostringstream saveStream; - saveStream << "U U " << GetBossSaveData() << GetData(TYPE_COLOSSUS); + uint32 GetData(uint32 type) + { + switch (type) + { + case TYPE_COLOSSUS: + return Encounter[type]; + break; + case DATA_HODIR_RARE_CACHE: + return HodirRareCacheData; + break; + } - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + return 0; + } - void Load(const char* strIn) - { - if (!strIn) + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*player*/, Unit const* /*target*/, uint32 /*miscvalue1*/) { - OUT_LOAD_INST_DATA_FAIL; - return; + switch (criteriaId) + { + case CRITERIA_KNOCK_ON_WOOD_10: + case CRITERIA_KNOCK_ON_WOOD_25: + return elderCount >= 1; + case CRITERIA_KNOCK_KNOCK_ON_WOOD_10: + case CRITERIA_KNOCK_KNOCK_ON_WOOD_25: + return elderCount >= 2; + case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10: + case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25: + return elderCount == 3; + default: + break; + } + + return false; } - OUT_LOAD_INST_DATA(strIn); + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; - char dataHead1, dataHead2; + std::ostringstream saveStream; + saveStream << "U U " << GetBossSaveData() << GetData(TYPE_COLOSSUS); - std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2; + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - if (dataHead1 == 'U' && dataHead2 == 'U') + void Load(char const* strIn) { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (!strIn) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(strIn); + + char dataHead1, dataHead2; + + std::istringstream loadStream(strIn); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'U' && dataHead2 == 'U') { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - - if (i == TYPE_COLOSSUS) - SetData(i, tmpState); - else - SetBossState(i, EncounterState(tmpState)); + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + if (i == TYPE_COLOSSUS) + SetData(i, tmpState); + else + SetBossState(i, EncounterState(tmpState)); + } } + + OUT_LOAD_INST_DATA_COMPLETE; } + }; - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_ulduar_InstanceMapScript(map); } - }; - }; - void AddSC_instance_ulduar() { new instance_ulduar(); diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h index ed78d02f40d..f902c33f938 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h @@ -157,22 +157,40 @@ enum UlduarTowerEvents EVENT_TOWER_OF_LIFE_DESTROYED = 21030, }; -enum UlduarAchievementCriteria +enum UlduarAchievementCriteriaIds { - ACHIEVEMENT_UNBROKEN_10 = 10044, // Leviathan - ACHIEVEMENT_UNBROKEN_25 = 10045, - ACHIEVEMENT_CRITERIA_SHUTOUT_10 = 10054, - ACHIEVEMENT_CRITERIA_SHUTOUT_25 = 10055, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050, - ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051, - ACHIEVEMENT_CRITERIA_HOT_POCKET_10 = 10430, // Ignis - ACHIEVEMENT_CRITERIA_HOT_POCKET_25 = 10431, - ACHIEVEMENT_CRITERIA_QUICK_SHAVE_10 = 10062, // Razorscale - ACHIEVEMENT_CRITERIA_QUICK_SHAVE_25 = 10063, + // Flame Leviathan + CRITERIA_UNBROKEN_10 = 10044, + CRITERIA_UNBROKEN_25 = 10045, + CRITERIA_SHUTOUT_10 = 10054, + CRITERIA_SHUTOUT_25 = 10055, + CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046, + CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047, + CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048, + CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049, + CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050, + CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051, + + // Ignis + CRITERIA_HOT_POCKET_10 = 10430, + CRITERIA_HOT_POCKET_25 = 10431, + + // Razorscale + CRITERIA_QUICK_SHAVE_10 = 10062, + CRITERIA_QUICK_SHAVE_25 = 10063, + + // Freya + CRITERIA_KNOCK_ON_WOOD_10 = 10447, + CRITERIA_KNOCK_ON_WOOD_25 = 10459, + CRITERIA_KNOCK_KNOCK_ON_WOOD_10 = 10448, + CRITERIA_KNOCK_KNOCK_ON_WOOD_25 = 10460, + CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10 = 10449, + CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25 = 10461, +}; + +enum UlduarAchievementData +{ + DATA_KNOCK_ON_WOOD_ACHIEVEMENTS = 1, }; template<class AI> |