Scripts/Ulduar: Move handling of Freya's "Knock" achievements to instance script + clean up

This commit is contained in:
Lopin
2011-06-26 16:35:51 +02:00
parent e05f608919
commit e7778c7231
4 changed files with 664 additions and 677 deletions
@@ -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,'');
@@ -220,8 +220,7 @@ enum FreyaEvents
#define WAVE_TIME 60000 // Normal wave is one minute #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 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 1
#define DATA_GETTING_BACK_TO_NATURE 2
class npc_iron_roots : public CreatureScript 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()) if (Elder[0]->isAlive())
{ {
Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true); Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true);
@@ -415,8 +416,6 @@ class boss_freya : public CreatureScript
{ {
switch (type) switch (type)
{ {
case DATA_KNOCK_ON_WOOD:
return elderCount;
case DATA_GETTING_BACK_TO_NATURE: case DATA_GETTING_BACK_TO_NATURE:
return attunedToNature; 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 class achievement_getting_back_to_nature : public AchievementCriteriaScript
{ {
public: public:
@@ -1710,8 +1649,5 @@ void AddSC_boss_freya()
new npc_iron_roots(); new npc_iron_roots();
new spell_freya_attuned_to_nature_dose_reduction(); new spell_freya_attuned_to_nature_dose_reduction();
new spell_freya_iron_roots(); 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(); new achievement_getting_back_to_nature();
} }
@@ -18,10 +18,9 @@
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "InstanceScript.h" #include "InstanceScript.h"
#include "ObjectMgr.h"
#include "ulduar.h" #include "ulduar.h"
static const DoorData doorData[] = static DoorData const doorData[] =
{ {
{ GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S }, { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S },
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }, { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE },
@@ -32,11 +31,6 @@ class instance_ulduar : public InstanceMapScript
public: public:
instance_ulduar() : InstanceMapScript("instance_ulduar", 603) { } instance_ulduar() : InstanceMapScript("instance_ulduar", 603) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_ulduar_InstanceMapScript(map);
}
struct instance_ulduar_InstanceMapScript : public InstanceScript struct instance_ulduar_InstanceMapScript : public InstanceScript
{ {
instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { } instance_ulduar_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { }
@@ -44,6 +38,7 @@ public:
uint32 Encounter[MAX_ENCOUNTER]; uint32 Encounter[MAX_ENCOUNTER];
std::string m_strInstData; std::string m_strInstData;
// Creatures
uint64 LeviathanGUID; uint64 LeviathanGUID;
uint64 IgnisGUID; uint64 IgnisGUID;
uint64 RazorscaleGUID; uint64 RazorscaleGUID;
@@ -68,6 +63,7 @@ public:
uint64 LeviathanGateGUID; uint64 LeviathanGateGUID;
uint64 VezaxDoorGUID; uint64 VezaxDoorGUID;
// GameObjects
uint64 KologarnChestGUID; uint64 KologarnChestGUID;
uint64 KologarnBridgeGUID; uint64 KologarnBridgeGUID;
uint64 KologarnDoorGUID; uint64 KologarnDoorGUID;
@@ -79,8 +75,10 @@ public:
uint64 HodirIceDoorGUID; uint64 HodirIceDoorGUID;
uint64 ArchivumDoorGUID; uint64 ArchivumDoorGUID;
// Miscellaneous
uint32 TeamInInstance; uint32 TeamInInstance;
uint32 HodirRareCacheData; uint32 HodirRareCacheData;
uint8 elderCount;
std::set<uint64> mRubbleSpawns; std::set<uint64> mRubbleSpawns;
@@ -118,6 +116,7 @@ public:
ArchivumDoorGUID = 0; ArchivumDoorGUID = 0;
TeamInInstance = 0; TeamInInstance = 0;
HodirRareCacheData = 0; HodirRareCacheData = 0;
elderCount = 0;
memset(Encounter, 0, sizeof(Encounter)); memset(Encounter, 0, sizeof(Encounter));
memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs)); memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs));
@@ -375,11 +374,10 @@ public:
} }
} }
void ProcessEvent(GameObject* /*go*/, uint32 eventId) void ProcessEvent(GameObject* /*gameObject*/, uint32 eventId)
{ {
// Flame Leviathan's Tower Event triggers // Flame Leviathan's Tower Event triggers
Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID); Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID);
if (FlameLeviathan && FlameLeviathan->isAlive()) // No leviathan, no event triggering ;) if (FlameLeviathan && FlameLeviathan->isAlive()) // No leviathan, no event triggering ;)
switch (eventId) switch (eventId)
{ {
@@ -483,6 +481,9 @@ public:
case DATA_HODIR_RARE_CACHE: case DATA_HODIR_RARE_CACHE:
HodirRareCacheData = data; HodirRareCacheData = data;
break; break;
case DATA_KNOCK_ON_WOOD_ACHIEVEMENTS:
elderCount = data;
break;
default: default:
break; break;
} }
@@ -590,6 +591,26 @@ public:
return 0; return 0;
} }
bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*player*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
{
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;
}
std::string GetSaveData() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
@@ -601,7 +622,7 @@ public:
return saveStream.str(); return saveStream.str();
} }
void Load(const char* strIn) void Load(char const* strIn)
{ {
if (!strIn) if (!strIn)
{ {
@@ -636,9 +657,12 @@ public:
} }
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_ulduar_InstanceMapScript(map);
}
}; };
void AddSC_instance_ulduar() void AddSC_instance_ulduar()
{ {
new instance_ulduar(); new instance_ulduar();
@@ -157,22 +157,40 @@ enum UlduarTowerEvents
EVENT_TOWER_OF_LIFE_DESTROYED = 21030, EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
}; };
enum UlduarAchievementCriteria enum UlduarAchievementCriteriaIds
{ {
ACHIEVEMENT_UNBROKEN_10 = 10044, // Leviathan // Flame Leviathan
ACHIEVEMENT_UNBROKEN_25 = 10045, CRITERIA_UNBROKEN_10 = 10044,
ACHIEVEMENT_CRITERIA_SHUTOUT_10 = 10054, CRITERIA_UNBROKEN_25 = 10045,
ACHIEVEMENT_CRITERIA_SHUTOUT_25 = 10055, CRITERIA_SHUTOUT_10 = 10054,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046, CRITERIA_SHUTOUT_25 = 10055,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047, CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048, CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049, CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050, CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049,
ACHIEVEMENT_CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051, CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050,
ACHIEVEMENT_CRITERIA_HOT_POCKET_10 = 10430, // Ignis CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051,
ACHIEVEMENT_CRITERIA_HOT_POCKET_25 = 10431,
ACHIEVEMENT_CRITERIA_QUICK_SHAVE_10 = 10062, // Razorscale // Ignis
ACHIEVEMENT_CRITERIA_QUICK_SHAVE_25 = 10063, 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> template<class AI>