aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2025_08_16_00_world.sql17
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp243
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h2
3 files changed, 163 insertions, 99 deletions
diff --git a/sql/updates/world/3.3.5/2025_08_16_00_world.sql b/sql/updates/world/3.3.5/2025_08_16_00_world.sql
new file mode 100644
index 00000000000..997ed954e5f
--- /dev/null
+++ b/sql/updates/world/3.3.5/2025_08_16_00_world.sql
@@ -0,0 +1,17 @@
+--
+DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_kurinnaxx_sand_trap';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(26524, 'spell_kurinnaxx_sand_trap');
+
+-- Should be disturbed instead (activate object action)
+UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 180647;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 180647 AND `source_type` = 1;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(180647,1,0,0,60,0,100,1,4500,4500,0,0,0,11,25656,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sand Trap - On Update - Cast 'Sand Trap' (No Repeat)"),
+(180647,1,1,0,60,0,100,1,4500,4500,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sand Trap - On Update - Despawn (No Repeat)");
+
+DELETE FROM `creature_text` WHERE `CreatureID` = 15348;
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(15348,0,0,"%s goes into a frenzy!",16,0,100,0,0,0,2384,0,"Kurinnaxx EMOTE_FRENZY");
+
+UPDATE `creature_text` SET `TextRange` = 3 WHERE `CreatureID` = 15339 AND `GroupID` = 5;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
index 0d6d854d46e..11577fadaa4 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
@@ -15,133 +15,178 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ * Timers requires to be revisited
+ */
+
#include "ScriptMgr.h"
-#include "CreatureTextMgr.h"
+#include "Containers.h"
#include "InstanceScript.h"
#include "ObjectAccessor.h"
#include "ruins_of_ahnqiraj.h"
#include "ScriptedCreature.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
-enum Spells
+enum KurinnaxxTexts
{
- SPELL_MORTALWOUND = 25646,
- SPELL_SANDTRAP = 25648,
- SPELL_ENRAGE = 26527,
- SPELL_SUMMON_PLAYER = 26446,
- SPELL_TRASH = 3391, // Should perhaps be triggered by an aura? Couldn't find any though
- SPELL_WIDE_SLASH = 25814
+ SAY_KURINAXX_DEATH = 5,
+ EMOTE_FRENZY = 0
};
-enum Events
+enum KurinnaxxSpells
{
- EVENT_MORTAL_WOUND = 1,
- EVENT_SANDTRAP = 2,
- EVENT_TRASH = 3,
- EVENT_WIDE_SLASH = 4
+ SPELL_MORTAL_WOUND = 25646,
+ SPELL_SAND_TRAP_TRIGGER = 26524,
+ SPELL_THRASH = 3391,
+ SPELL_WIDE_SLASH = 25814,
+ SPELL_FRENZY = 26527,
+ SPELL_SUMMON_PLAYER = 26446,
+
+ SPELL_SAND_TRAP_EFFECT = 25648
};
-enum Texts
+enum KurinnaxxEvents
{
- SAY_KURINAXX_DEATH = 5, // Yelled by Ossirian the Unscarred
+ EVENT_MORTAL_WOUND = 1,
+ EVENT_SAND_TRAP,
+ EVENT_THRASH,
+ EVENT_WIDE_SLASH,
+ EVENT_FRENZY,
+ EVENT_SUMMON_PLAYER
};
-class boss_kurinnaxx : public CreatureScript
+// 15348 - Kurinnaxx
+struct boss_kurinnaxx : public BossAI
{
- public:
- boss_kurinnaxx() : CreatureScript("boss_kurinnaxx") { }
-
- struct boss_kurinnaxxAI : public BossAI
+ boss_kurinnaxx(Creature* creature) : BossAI(creature, DATA_KURINNAXX), _frenzied(false) { }
+
+ void Reset() override
+ {
+ _Reset();
+ _frenzied = false;
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, 2s, 8s);
+ events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 10s);
+ events.ScheduleEvent(EVENT_THRASH, 0s, 15s);
+ events.ScheduleEvent(EVENT_WIDE_SLASH, 10s, 15s);
+ events.ScheduleEvent(EVENT_SUMMON_PLAYER, 5s);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ {
+ if (!_frenzied && me->HealthBelowPctDamaged(30, damage))
{
- boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX)
- {
- Initialize();
- }
+ _frenzied = true;
+ events.ScheduleEvent(EVENT_FRENZY, 0s);
+ }
+ }
- void Initialize()
- {
- _enraged = false;
- }
+ void OnSpellCast(SpellInfo const* spell) override
+ {
+ if (spell->Id == SPELL_FRENZY)
+ Talk(EMOTE_FRENZY);
+ }
- void Reset() override
- {
- _Reset();
- Initialize();
- events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s);
- events.ScheduleEvent(EVENT_SANDTRAP, 5s, 15s);
- events.ScheduleEvent(EVENT_TRASH, 1s);
- events.ScheduleEvent(EVENT_WIDE_SLASH, 11s);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ if (Creature* ossirian = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_OSSIRIAN)))
+ ossirian->AI()->Talk(SAY_KURINAXX_DEATH);
+ }
- void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if (!_enraged && HealthBelowPct(30))
- {
- DoCast(me, SPELL_ENRAGE);
- _enraged = true;
- }
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- if (Creature* Ossirian = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_OSSIRIAN)))
- sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE);
- }
+ events.Update(diff);
- void UpdateAI(uint32 diff) override
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_MORTAL_WOUND:
- DoCastVictim(SPELL_MORTALWOUND);
- events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s);
- break;
- case EVENT_SANDTRAP:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
- target->CastSpell(target, SPELL_SANDTRAP, true);
- else if (Unit* victim = me->GetVictim())
- victim->CastSpell(victim, SPELL_SANDTRAP, true);
- events.ScheduleEvent(EVENT_SANDTRAP, 5s, 15s);
- break;
- case EVENT_WIDE_SLASH:
- DoCast(me, SPELL_WIDE_SLASH);
- events.ScheduleEvent(EVENT_WIDE_SLASH, 11s);
- break;
- case EVENT_TRASH:
- DoCast(me, SPELL_TRASH);
- events.ScheduleEvent(EVENT_WIDE_SLASH, 15s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ case EVENT_MORTAL_WOUND:
+ DoCastVictim(SPELL_MORTAL_WOUND);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_SAND_TRAP:
+ DoCastSelf(SPELL_SAND_TRAP_TRIGGER);
+ events.Repeat(5s, 15s);
+ break;
+ case EVENT_THRASH:
+ DoCastSelf(SPELL_THRASH);
+ events.Repeat(10s, 20s);
+ break;
+ case EVENT_WIDE_SLASH:
+ DoCastSelf(SPELL_WIDE_SLASH);
+ events.Repeat(10s, 15s);
+ break;
+ case EVENT_FRENZY:
+ DoCastSelf(SPELL_FRENZY);
+ break;
+ case EVENT_SUMMON_PLAYER:
+ if (me->GetDistance(me->GetVictim()) > 10.0f)
+ DoCastVictim(SPELL_SUMMON_PLAYER);
+ events.Repeat(5s);
+ break;
+ default:
+ break;
}
- private:
- bool _enraged;
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetAQ20AI<boss_kurinnaxxAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ bool _frenzied;
+};
+
+// 26524 - Sand Trap
+class spell_kurinnaxx_sand_trap : public SpellScript
+{
+ PrepareSpellScript(spell_kurinnaxx_sand_trap);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SAND_TRAP_EFFECT });
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SAND_TRAP_EFFECT, true);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kurinnaxx_sand_trap::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_kurinnaxx_sand_trap::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
void AddSC_boss_kurinnaxx()
{
- new boss_kurinnaxx();
+ RegisterAQ20CreatureAI(boss_kurinnaxx);
+ RegisterSpellScript(spell_kurinnaxx_sand_trap);
}
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
index 0d68d290032..3b8591b3808 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
@@ -66,4 +66,6 @@ inline AI* GetAQ20AI(T* obj)
return GetInstanceAI<AI>(obj, AQ20ScriptName);
}
+#define RegisterAQ20CreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAQ20AI)
+
#endif