aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLopin <davca.hr@seznam.cz>2011-06-26 16:35:51 +0200
committerLopin <davca.hr@seznam.cz>2011-06-26 16:35:51 +0200
commite7778c72314cd697814d6a16c3e69c2e4737c3ec (patch)
tree46740e014ff06d74e7ecfc2b7ada5ee0a149636d
parente05f608919e13a28c67887b2ed269843892cf225 (diff)
Scripts/Ulduar: Move handling of Freya's "Knock" achievements to instance script + clean up
-rw-r--r--sql/updates/world/2011_06_26_06_world_achievement_criteria_data.sql9
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp70
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp1128
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h48
4 files changed, 621 insertions, 634 deletions
diff --git a/sql/updates/world/2011_06_26_06_world_achievement_criteria_data.sql b/sql/updates/world/2011_06_26_06_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..b9cd7b9f7a0
--- /dev/null
+++ b/sql/updates/world/2011_06_26_06_world_achievement_criteria_data.sql
@@ -0,0 +1,9 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (10447,10448,10449,10459,10460,10461) AND `type` IN (11,18);
+INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
+VALUES
+(10447,18,0,0,''),
+(10448,18,0,0,''),
+(10449,18,0,0,''),
+(10459,18,0,0,''),
+(10460,18,0,0,''),
+(10461,18,0,0,'');
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>