diff options
5 files changed, 305 insertions, 195 deletions
diff --git a/sql/updates/world/master/2018_02_11_07_world_2016_11_26_02_world.sql b/sql/updates/world/master/2018_02_11_07_world_2016_11_26_02_world.sql new file mode 100644 index 00000000000..b9cdadf6bf7 --- /dev/null +++ b/sql/updates/world/master/2018_02_11_07_world_2016_11_26_02_world.sql @@ -0,0 +1,23 @@ +-- Added aura Acidic Wound on Gurtogg Bloodboil +DELETE FROM `creature_addon` where `guid`=52761; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(52761, 0, 0, 0, 0, 0, 40484); + +-- SpellScripts +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gurtogg_bloodboil_insignificance'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(40618, 'spell_gurtogg_bloodboil_insignificance'); + +-- Added creature script in Fel Geyser creature +UPDATE `creature_template` SET `ScriptName`='npc_fel_geyser' WHERE `entry`=23254; + +-- Conditions for spell Taunt Gurtogg +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=40603; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,3,40603,0,0,31,0,3,22948,0,0,0,0,'','Effect_0 and Effect_1 - Hits Gurtogg Bloodboil'); + +-- Fix Texts +UPDATE `creature_text` SET `text`='I hunger.',`BroadcastTextId`=21744 WHERE `entry`=22948 AND `groupid`=2 AND `id`=1; +DELETE FROM `creature_text` WHERE `entry`=22948 AND `groupid`IN(3,4); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(22948,3,0,'I\'ll rip the meat from your bones!',14,0,100,0,0,11438,21745,0,'bloodboil SAY_ENRAGE'); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 4dbabbfed19..375a954aa68 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -194,7 +194,7 @@ public: { //selects a random target that isn't the current victim and is a mana user (selects mana users) but not pets //it also ignores targets who have the aura. We don't want to place the debuff on the same target twice. - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, [&](Unit* u) { return u && !u->IsPet() && u->getPowerType() == POWER_MANA && !u->HasAura(SPELL_BURNINGADRENALINE); })) + if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, [&](Unit* u) { return u && !u->IsPet() && u->GetPowerType() == POWER_MANA && !u->HasAura(SPELL_BURNINGADRENALINE); })) { me->CastSpell(target, SPELL_BURNINGADRENALINE, true); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp index c06a5a53966..2ed19223186 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2018 TrinityCore <https://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,43 +15,78 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -Name: Boss_Bloodboil -Complete: 80 -Category: Black Temple -EndScriptData */ - #include "ScriptMgr.h" #include "black_temple.h" +#include "GridNotifiers.h" #include "ObjectAccessor.h" +#include "PassiveAI.h" #include "ScriptedCreature.h" #include "SpellScript.h" -enum Bloodboil +enum Says +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_SPECIAL = 2, + SAY_ENRAGE = 3 +}; + +enum Spells { - //Speech'n'Sound - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_SPECIAL = 2, - SAY_ENRAGE = 3, - SAY_DEATH = 4, - - //Spells - SPELL_ACID_GEYSER = 40630, - SPELL_ACIDIC_WOUND = 40481, - SPELL_ARCING_SMASH = 40599, - SPELL_BLOODBOIL = 42005, // This spell is AoE whereas it shouldn't be - SPELL_FEL_ACID = 40508, + //Gurtogg + SPELL_BLOODBOIL = 42005, + SPELL_ARCING_SMASH = 40457, + SPELL_FEL_ACID_BREATH = 40508, + SPELL_EJECT = 40486, + SPELL_BEWILDERING_STRIKE = 40491, SPELL_FEL_RAGE_SELF = 40594, + SPELL_INSIGNIFIGANCE = 40618, SPELL_FEL_RAGE_TARGET = 40604, SPELL_FEL_RAGE_2 = 40616, SPELL_FEL_RAGE_3 = 41625, - SPELL_BEWILDERING_STRIKE = 40491, - SPELL_EJECT1 = 40486, // 1000 Physical damage + knockback + script effect (should handle threat reduction I think) - SPELL_EJECT2 = 40597, // 1000 Physical damage + Stun (used in phase 2?) + SPELL_FEL_RAGE_TARGET_2 = 46787, + SPELL_FEL_GEYSER = 40569, + SPELL_CHARGE = 40602, + SPELL_EJECT_2 = 40597, + SPELL_FEL_ACID_BREATH_2 = 40595, + SPELL_ARCING_SMASH_2 = 40599, + SPELL_BERSERK = 45078, + //Player SPELL_TAUNT_GURTOGG = 40603, - SPELL_INSIGNIFIGANCE = 40618, - SPELL_BERSERK = 45078 + SPELL_FEL_RAGE_P = 40617, + //Fel Geyser + SPELL_FEL_GEYSER_2 = 40593, + SPELL_BIRTH = 40031 +}; + +enum Phases +{ + PHASE_1 = 1, + PHASE_2 = 2, + GROUP_PHASE_1 = 1, + GROUP_PHASE_2 = 2 +}; + +enum Sounds +{ + SOUND_ID_DEATH = 11439, + SOUND_ID_ENRAGE = 11437 +}; + +enum Events +{ + EVENT_BERSERK = 1, + EVENT_BLOODBOIL, + EVENT_ARCING_SMASH, + EVENT_FEL_ACID_BREATH, + EVENT_EJECT, + EVENT_BEWILDERING_STRIKE, + EVENT_CHANGE_PHASE, + EVENT_START_PHASE_2, + EVENT_EJECT_2, + EVENT_FEL_ACID_BREATH_2, + EVENT_ARCING_SMASH_2, + EVENT_CHARGE_PLAYER }; class boss_gurtogg_bloodboil : public CreatureScript @@ -60,11 +94,6 @@ class boss_gurtogg_bloodboil : public CreatureScript public: boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_gurtogg_bloodboilAI>(creature); - } - struct boss_gurtogg_bloodboilAI : public BossAI { boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL) @@ -72,77 +101,78 @@ public: Initialize(); } - void Initialize() + void Reset() override { - TargetGUID.Clear(); - TargetThreat = 0; - - BloodboilTimer = 10000; - BloodboilCount = 0; - AcidGeyserTimer = 1000; - AcidicWoundTimer = 6000; - ArcingSmashTimer = 19000; - EnrageTimer = 600000; - FelAcidTimer = 25000; - EjectTimer = 10000; - BewilderingStrikeTimer = 15000; - PhaseChangeTimer = 60000; - - Phase1 = true; + _Reset(); + Initialize(); + events.SetPhase(PHASE_1); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); } - ObjectGuid TargetGUID; - - float TargetThreat; - - uint32 BloodboilTimer; - uint32 BloodboilCount; - uint32 AcidGeyserTimer; - uint32 AcidicWoundTimer; - uint32 ArcingSmashTimer; - uint32 EnrageTimer; - uint32 FelAcidTimer; - uint32 EjectTimer; - uint32 BewilderingStrikeTimer; - uint32 PhaseChangeTimer; + void Initialize() + { + _oldThreat = 0.0f; + _oldTargetGUID.Clear(); + _targetGUID.Clear(); + } - bool Phase1; + bool CanAIAttack(Unit const* who) const override + { + return BossAI::CanAIAttack(who) && !who->HasAura(SPELL_BEWILDERING_STRIKE); + } - void Reset() override + void AttackStart(Unit* who) override { - _Reset(); - Initialize(); + if (!CanAIAttack(who)) + return; - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + BossAI::AttackStart(who); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); _EnterCombat(); + events.ScheduleEvent(EVENT_BERSERK, Minutes(10)); + events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(60)); + ScheduleEvents(); } - void KilledUnit(Unit* /*victim*/) override + void EnterEvadeMode(EvadeReason /*why*/) override { - Talk(SAY_SLAY); + _DespawnAtEvade(); } - void JustDied(Unit* /*killer*/) override + void ScheduleEvents() { - Talk(SAY_DEATH); - _JustDied(); + if (events.IsInPhase(PHASE_1)) + { + events.ScheduleEvent(EVENT_BLOODBOIL, Seconds(10), GROUP_PHASE_1, PHASE_1); + events.ScheduleEvent(EVENT_ARCING_SMASH, Seconds(10), GROUP_PHASE_1, PHASE_1); + events.ScheduleEvent(EVENT_FEL_ACID_BREATH, Seconds(25), GROUP_PHASE_1, PHASE_1); + events.ScheduleEvent(EVENT_EJECT, Seconds(35), GROUP_PHASE_1, PHASE_1); + events.ScheduleEvent(EVENT_BEWILDERING_STRIKE, Seconds(47), GROUP_PHASE_1, PHASE_1); + } + else if (events.IsInPhase(PHASE_2)) + { + events.ScheduleEvent(EVENT_START_PHASE_2, Milliseconds(100), GROUP_PHASE_2, PHASE_2); + events.ScheduleEvent(EVENT_EJECT_2, Seconds(14), GROUP_PHASE_2, PHASE_2); + events.ScheduleEvent(EVENT_FEL_ACID_BREATH_2, Seconds(16), GROUP_PHASE_2, PHASE_2); + events.ScheduleEvent(EVENT_ARCING_SMASH_2, Seconds(8), GROUP_PHASE_2, PHASE_2); + } } - void RevertThreatOnTarget(ObjectGuid guid) + void KilledUnit(Unit* victim) override { - if (Unit* unit = ObjectAccessor::GetUnit(*me, guid)) - { - if (DoGetThreat(unit)) - DoModifyThreatPercent(unit, -100); - if (TargetThreat) - me->AddThreat(unit, TargetThreat); - } + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + DoPlaySoundToSet(me, SOUND_ID_DEATH); } void UpdateAI(uint32 diff) override @@ -150,135 +180,161 @@ public: if (!UpdateVictim()) return; - if (ArcingSmashTimer <= diff) - { - DoCastVictim(SPELL_ARCING_SMASH); - ArcingSmashTimer = 10000; - } else ArcingSmashTimer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (FelAcidTimer <= diff) - { - DoCastVictim(SPELL_FEL_ACID); - FelAcidTimer = 25000; - } else FelAcidTimer -= diff; + events.Update(diff); - if (!me->HasAura(SPELL_BERSERK)) + while (uint32 eventId = events.ExecuteEvent()) { - if (EnrageTimer <= diff) + switch (eventId) { - DoCast(me, SPELL_BERSERK); - Talk(SAY_ENRAGE); - } else EnrageTimer -= diff; + case EVENT_BLOODBOIL: + DoCast(SPELL_BLOODBOIL); + events.Repeat(Seconds(10)); + break; + case EVENT_ARCING_SMASH: + DoCastVictim(SPELL_ARCING_SMASH); + events.Repeat(Seconds(10)); + break; + case EVENT_FEL_ACID_BREATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, me->GetCombatReach())) + DoCast(target, SPELL_FEL_ACID_BREATH); + events.Repeat(Seconds(25), Seconds(30)); + break; + case EVENT_EJECT: + Talk(SAY_SPECIAL); + DoCastVictim(SPELL_EJECT); + break; + case EVENT_BEWILDERING_STRIKE: + DoCastVictim(SPELL_BEWILDERING_STRIKE); + break; + case EVENT_CHANGE_PHASE: + ChangePhase(); + break; + case EVENT_START_PHASE_2: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + { + if (Unit* oldTarget = me->GetVictim()) + { + _oldTargetGUID = oldTarget->GetGUID(); + _oldThreat = DoGetThreat(oldTarget); + } + _targetGUID = target->GetGUID(); + DoCastSelf(SPELL_FEL_RAGE_SELF, true); + DoCast(target, SPELL_FEL_RAGE_TARGET, true); + DoCast(target, SPELL_FEL_RAGE_2, true); + DoCast(target, SPELL_FEL_RAGE_3, true); + DoCast(target, SPELL_FEL_GEYSER, true); + DoCast(target, SPELL_FEL_RAGE_TARGET_2, true); + target->CastSpell(target, SPELL_FEL_RAGE_P, true); + target->CastSpell(target, SPELL_TAUNT_GURTOGG, true); + DoCastAOE(SPELL_INSIGNIFIGANCE, true); + + events.ScheduleEvent(EVENT_CHARGE_PLAYER, Seconds(2), GROUP_PHASE_2, PHASE_2); + + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); + } + //Solo attempts dont change phase (he reset first phase spells) + else + { + events.SetPhase(PHASE_1); + events.CancelEventGroup(GROUP_PHASE_2); + ScheduleEvents(); + events.RescheduleEvent(EVENT_CHANGE_PHASE, Seconds(60)); + } + break; + case EVENT_CHARGE_PLAYER: + if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID)) + DoCast(target, SPELL_CHARGE); + break; + case EVENT_EJECT_2: + DoCastVictim(SPELL_EJECT_2); + break; + case EVENT_FEL_ACID_BREATH_2: + DoCastVictim(SPELL_FEL_ACID_BREATH_2); + break; + case EVENT_ARCING_SMASH_2: + DoCastVictim(SPELL_ARCING_SMASH_2); + events.Repeat(Seconds(13)); + break; + case EVENT_BERSERK: + DoCast(SPELL_BERSERK); + roll_chance_i(50) ? Talk(SAY_ENRAGE) : DoPlaySoundToSet(me, SOUND_ID_ENRAGE); + break; + default: + break; + } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - if (Phase1) - { - if (BewilderingStrikeTimer <= diff) - { - DoCastVictim(SPELL_BEWILDERING_STRIKE); - float mt_threat = DoGetThreat(me->GetVictim()); - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1)) - me->AddThreat(target, mt_threat); - BewilderingStrikeTimer = 20000; - } else BewilderingStrikeTimer -= diff; - - if (EjectTimer <= diff) - { - DoCastVictim(SPELL_EJECT1); - DoModifyThreatPercent(me->GetVictim(), -40); - EjectTimer = 15000; - } else EjectTimer -= diff; - - if (AcidicWoundTimer <= diff) - { - DoCastVictim(SPELL_ACIDIC_WOUND); - AcidicWoundTimer = 10000; - } else AcidicWoundTimer -= diff; - - if (BloodboilTimer <= diff) - { - if (BloodboilCount < 5) // Only cast it five times. - { - DoCastAOE(SPELL_BLOODBOIL); - ++BloodboilCount; - BloodboilTimer = 10000*BloodboilCount; - } - } else BloodboilTimer -= diff; - } + DoMeleeAttackIfReady(); + } - if (!Phase1) + void ChangePhase() + { + if (events.IsInPhase(PHASE_1)) { - if (AcidGeyserTimer <= diff) - { - DoCastVictim(SPELL_ACID_GEYSER); - AcidGeyserTimer = 30000; - } else AcidGeyserTimer -= diff; - - if (EjectTimer <= diff) - { - DoCastVictim(SPELL_EJECT2); - EjectTimer = 15000; - } else EjectTimer -= diff; + events.SetPhase(PHASE_2); + events.CancelEventGroup(GROUP_PHASE_1); + events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(30)); + ScheduleEvents(); } - - if (PhaseChangeTimer <= diff) + else if (events.IsInPhase(PHASE_2)) { - if (Phase1) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + events.SetPhase(PHASE_1); + events.CancelEventGroup(GROUP_PHASE_2); + events.ScheduleEvent(EVENT_CHANGE_PHASE, Seconds(60)); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + ScheduleEvents(); + //When phase 2 ends, he need attack back the tanker of the first phase + if (Unit* target = ObjectAccessor::GetUnit(*me, _oldTargetGUID)) + if (Unit* phase2tanker = ObjectAccessor::GetUnit(*me, _targetGUID)) { - Phase1 = false; - - TargetThreat = DoGetThreat(target); - TargetGUID = target->GetGUID(); - target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); - if (DoGetThreat(target)) - DoModifyThreatPercent(target, -100); - me->AddThreat(target, 50000000.0f); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); - // If VMaps are disabled, this spell can call the whole instance - DoCast(me, SPELL_INSIGNIFIGANCE, true); - DoCast(target, SPELL_FEL_RAGE_TARGET, true); - DoCast(target, SPELL_FEL_RAGE_2, true); - /* These spells do not work, comment them out for now. - DoCast(target, SPELL_FEL_RAGE_2, true); - DoCast(target, SPELL_FEL_RAGE_3, true);*/ - - //Cast this without triggered so that it appears in combat logs and shows visual. - DoCast(me, SPELL_FEL_RAGE_SELF); + DoModifyThreatPercent(phase2tanker, -100); + AttackStart(target); + me->AddThreat(target, _oldThreat); + Initialize(); + } + } + } + private: + ObjectGuid _targetGUID; + ObjectGuid _oldTargetGUID; + float _oldThreat; + }; - Talk(SAY_SPECIAL); + CreatureAI* GetAI(Creature* creature) const override + { + return GetBlackTempleAI<boss_gurtogg_bloodboilAI>(creature); + } +}; - AcidGeyserTimer = 1000; - PhaseChangeTimer = 30000; - } - } - else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage - { - if (!TargetGUID.IsEmpty()) - RevertThreatOnTarget(TargetGUID); - TargetGUID.Clear(); - Phase1 = true; - BloodboilTimer = 10000; - BloodboilCount = 0; - AcidicWoundTimer += 2000; - ArcingSmashTimer += 2000; - FelAcidTimer += 2000; - EjectTimer += 2000; - PhaseChangeTimer = 60000; - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); - } - } else PhaseChangeTimer -= diff; +class npc_fel_geyser : public CreatureScript +{ +public: + npc_fel_geyser() : CreatureScript("npc_fel_geyser") { } - DoMeleeAttackIfReady(); + struct npc_fel_geyserAI : public PassiveAI + { + npc_fel_geyserAI(Creature* creature) : PassiveAI(creature) { } + + void Reset() override + { + DoCastSelf(SPELL_FEL_GEYSER_2, true); + DoCastSelf(SPELL_BIRTH, true); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_fel_geyserAI(creature); + } }; -// 42005 - Bloodboil class spell_gurtogg_bloodboil_bloodboil : public SpellScriptLoader { public: @@ -311,8 +367,41 @@ class spell_gurtogg_bloodboil_bloodboil : public SpellScriptLoader } }; +class spell_gurtogg_bloodboil_insignificance : public SpellScriptLoader +{ +public: + spell_gurtogg_bloodboil_insignificance() : SpellScriptLoader("spell_gurtogg_bloodboil_insignificance") { } + + class spell_gurtogg_bloodboil_insignificance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gurtogg_bloodboil_insignificance_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_FEL_RAGE_TARGET }); + } + + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_FEL_RAGE_TARGET)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_insignificance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gurtogg_bloodboil_insignificance_SpellScript(); + } +}; + void AddSC_boss_gurtogg_bloodboil() { new boss_gurtogg_bloodboil(); + new npc_fel_geyser(); new spell_gurtogg_bloodboil_bloodboil(); + new spell_gurtogg_bloodboil_insignificance(); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index 71f97358960..255444acfdd 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -123,7 +123,7 @@ public: Unit* CalculateHatefulStrikeTarget() { - uint32 health = 0; + uint64 health = 0; Unit* target = nullptr; ThreatContainer::StorageType threatList = me->getThreatManager().getThreatList(); diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 9f6e60dead0..89249a93406 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -199,9 +199,7 @@ class spell_najentus_needle_spine : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_NEEDLE_SPINE)) - return false; - return true; + return ValidateSpellInfo({ SPELL_NEEDLE_SPINE }); } void FilterTargets(std::list<WorldObject*>& targets) |