aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2011_09_24_00_world_spell_script_names.sql7
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp97
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp7
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h12
4 files changed, 91 insertions, 32 deletions
diff --git a/sql/updates/world/2011_09_24_00_world_spell_script_names.sql b/sql/updates/world/2011_09_24_00_world_spell_script_names.sql
new file mode 100644
index 00000000000..d0f5b286739
--- /dev/null
+++ b/sql/updates/world/2011_09_24_00_world_spell_script_names.sql
@@ -0,0 +1,7 @@
+-- Remove redundant areatrigger scripts
+DELETE FROM `areatrigger_scripts` WHERE `entry` IN(5369,5423);
+-- Add spellscript for trap spell
+DELETE FROM `spell_script_names` WHERE `spell_id`=62705;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(62705,'spell_auto_repair');
+
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 53d5fe22db6..f3f416bdf1a 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp
@@ -139,7 +139,6 @@ enum Vehicles
#define EMOTE_OVERLOAD "Flame Leviathan's circuits overloaded."
#define EMOTE_REPAIR "Automatic repair sequence initiated."
#define DATA_SHUTOUT 29112912 // 2911, 2912 are achievement IDs
-#define DATA_UNBROKEN 29052906 // 2905, 2906 are achievement IDs
#define DATA_ORBIT_ACHIEVEMENTS 1
#define VEHICLE_SPAWNS 5
#define FREYA_SPAWNS 4
@@ -1296,28 +1295,6 @@ class go_ulduar_tower : public GameObjectScript
}
};
-class at_RX_214_repair_o_matic_station : public AreaTriggerScript
-{
- public:
- at_RX_214_repair_o_matic_station() : AreaTriggerScript("at_RX_214_repair_o_matic_station") { }
-
- bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/)
- {
- InstanceScript* instance = player->GetInstanceScript();
- if (Creature* vehicle = player->GetVehicleCreatureBase())
- {
- if (!vehicle->HasAura(SPELL_AUTO_REPAIR))
- {
- player->MonsterTextEmote(EMOTE_REPAIR, player->GetGUID(), true);
- player->CastSpell(vehicle, SPELL_AUTO_REPAIR, true);
- if (Creature* leviathan = ObjectAccessor::GetCreature(*player, instance ? instance->GetData64(BOSS_LEVIATHAN) : 0))
- leviathan->AI()->SetData(DATA_UNBROKEN, 0); // set bool to false thats checked in leviathan getdata
- }
- }
- return true;
- }
-};
-
class achievement_three_car_garage_demolisher : public AchievementCriteriaScript
{
public:
@@ -1393,9 +1370,8 @@ class achievement_unbroken : public AchievementCriteriaScript
bool OnCheck(Player* /*source*/, Unit* target)
{
if (target)
- if (Creature* leviathan = target->ToCreature())
- if (leviathan->AI()->GetData(DATA_UNBROKEN))
- return true;
+ if (InstanceScript* instance = target->GetInstanceScript())
+ return instance->GetData(DATA_UNBROKEN);
return false;
}
@@ -1518,6 +1494,72 @@ class spell_load_into_catapult : public SpellScriptLoader
}
};
+class spell_auto_repair : public SpellScriptLoader
+{
+ enum Spells
+ {
+ SPELL_AUTO_REPAIR = 62705,
+ };
+
+ public:
+ spell_auto_repair() : SpellScriptLoader("spell_auto_repair") {}
+
+ class spell_auto_repair_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_auto_repair_SpellScript);
+
+ void CheckCooldownForTarget()
+ {
+ if (GetHitUnit()->HasAuraEffect(SPELL_AUTO_REPAIR, EFFECT_2)) // Check presence of dummy aura indicating cooldown
+ {
+ PreventHitEffect(EFFECT_0);
+ PreventHitDefaultEffect(EFFECT_1);
+ PreventHitDefaultEffect(EFFECT_2);
+ //! Currently this doesn't work: if we call PreventHitAura(), the existing aura will be removed
+ //! because of recent aura refreshing changes. Since removing the existing aura negates the idea
+ //! of a cooldown marker, we just let the dummy aura refresh itself without executing the other spelleffects.
+ //! The spelleffects can be executed by letting the dummy aura expire naturally.
+ //! This is a temporary solution only.
+ //PreventHitAura();
+ }
+ }
+
+ void HandleScript(SpellEffIndex /*eff*/)
+ {
+ Vehicle* vehicle = GetHitUnit()->GetVehicleKit();
+ if (!vehicle)
+ return;
+
+ Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : NULL;
+ if (!driver)
+ return;
+
+ driver->MonsterTextEmote(EMOTE_REPAIR, driver->GetGUID(), true);
+
+ InstanceScript* instance = driver->GetInstanceScript();
+ if (!instance)
+ return;
+
+ // Actually should/could use basepoints (100) for this spell effect as percentage of health, but oh well.
+ vehicle->GetBase()->SetFullHealth();
+
+ // For achievement
+ instance->SetData(DATA_UNBROKEN, 0);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_auto_repair_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ BeforeHit += SpellHitFn(spell_auto_repair_SpellScript::CheckCooldownForTarget);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_auto_repair_SpellScript();
+ }
+};
+
void AddSC_boss_flame_leviathan()
{
new boss_flame_leviathan();
@@ -1537,7 +1579,7 @@ void AddSC_boss_flame_leviathan()
new npc_lorekeeper();
// new npc_brann_bronzebeard();
new go_ulduar_tower();
- new at_RX_214_repair_o_matic_station();
+
new achievement_three_car_garage_demolisher();
new achievement_three_car_garage_chopper();
new achievement_three_car_garage_siege();
@@ -1549,4 +1591,5 @@ void AddSC_boss_flame_leviathan()
new achievement_orbit_uary();
new spell_load_into_catapult();
+ new spell_auto_repair();
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index 93a865f6c2e..e1c64499df2 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -80,6 +80,7 @@ class instance_ulduar : public InstanceMapScript
uint32 ColossusData;
uint8 elderCount;
bool conSpeedAtory;
+ bool Unbroken;
std::set<uint64> mRubbleSpawns;
@@ -118,6 +119,7 @@ class instance_ulduar : public InstanceMapScript
ColossusData = 0;
elderCount = 0;
conSpeedAtory = false;
+ Unbroken = true;
memset(Encounter, 0, sizeof(Encounter));
memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs));
@@ -499,6 +501,9 @@ class instance_ulduar : public InstanceMapScript
Hodir->RemoveGameObject(gameObject, false);
}
break;
+ case DATA_UNBROKEN:
+ Unbroken = bool(data);
+ break;
default:
break;
}
@@ -586,6 +591,8 @@ class instance_ulduar : public InstanceMapScript
return ColossusData;
case DATA_HODIR_RARE_CACHE:
return HodirRareCacheData;
+ case DATA_UNBROKEN:
+ return uint32(Unbroken);
default:
break;
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
index 7090f808706..2caee4b600c 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
@@ -167,7 +167,7 @@ enum UlduarData
{
// Collosus (Leviathan)
DATA_COLOSSUS = 20,
-
+
// Razorscale
DATA_EXPEDITION_COMMANDER,
DATA_RAZORSCALE_CONTROL,
@@ -178,14 +178,16 @@ enum UlduarData
DATA_TOY_PILE_2,
DATA_TOY_PILE_3,
- // Kologarn
- DATA_LEFT_ARM,
- DATA_RIGHT_ARM,
-
// Hodir
DATA_HODIR_RARE_CACHE,
};
+enum UlduarAchievementData
+{
+ // FL Achievement boolean
+ DATA_UNBROKEN = 29052906, // 2905, 2906 are achievement IDs,
+};
+
template<class AI>
CreatureAI* GetUlduarAI(Creature* creature)
{