diff options
Diffstat (limited to 'src')
28 files changed, 839 insertions, 340 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 7f2eb678cfe..d5af023a5f0 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1422,7 +1422,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE || e.GetTargetType() == SMART_TARGET_CLOSEST_CREATURE || e.GetTargetType() == SMART_TARGET_CLOSEST_GAMEOBJECT || - e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER) + e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER || + e.GetTargetType() == SMART_TARGET_CLOSEST_ENEMY) { ObjectList* targets = GetTargets(e, unit); if (!targets) @@ -2485,6 +2486,14 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /* } break; } + case SMART_TARGET_CLOSEST_ENEMY: + { + if (me) + if (Unit* target = me->SelectNearestTarget(e.target.closestAttackable.maxDist)) + l->push_back(target); + + break; + } case SMART_TARGET_POSITION: default: break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index b0d5b3c1ff0..eeeacb36032 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -300,6 +300,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) case SMART_TARGET_THREAT_LIST: case SMART_TARGET_CLOSEST_GAMEOBJECT: case SMART_TARGET_CLOSEST_CREATURE: + case SMART_TARGET_CLOSEST_ENEMY: case SMART_TARGET_STORED: break; default: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index b4b4fa6ea9b..724a0684ab9 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -992,7 +992,8 @@ enum SMARTAI_TARGETS SMART_TARGET_ACTION_INVOKER_VEHICLE = 22, // Unit's vehicle who caused this Event to occur SMART_TARGET_OWNER_OR_SUMMONER = 23, // Unit's owner or summoner SMART_TARGET_THREAT_LIST = 24, // All units on creature's threat list - SMART_TARGET_END = 25 + SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist + SMART_TARGET_END = 26 }; struct SmartTarget @@ -1076,6 +1077,11 @@ struct SmartTarget struct { + uint32 maxDist; + } closestAttackable; + + struct + { uint32 param1; uint32 param2; uint32 param3; diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index b0ada0fe24f..1f180542016 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -27,6 +27,7 @@ class Creature; class GameObject; class Group; class Player; +class Unit; class WorldPacket; class BattlegroundMap; diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 73bdc84b963..8e2fc2953c9 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -535,6 +535,7 @@ void AddSC_boss_nexusprince_shaffar(); //Auchindoun Mana Tombs void AddSC_boss_pandemonius(); void AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls void AddSC_boss_talon_king_ikiss(); +void AddSC_boss_anzu(); void AddSC_instance_sethekk_halls(); void AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth void AddSC_boss_ambassador_hellmaw(); @@ -1027,6 +1028,7 @@ void AddOutlandScripts() AddSC_boss_pandemonius(); AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls AddSC_boss_talon_king_ikiss(); + AddSC_boss_anzu(); AddSC_instance_sethekk_halls(); AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth AddSC_boss_ambassador_hellmaw(); diff --git a/src/server/scripts/Examples/example_spell.cpp b/src/server/scripts/Examples/example_spell.cpp index 30206ec555c..8e22c4b66c8 100644 --- a/src/server/scripts/Examples/example_spell.cpp +++ b/src/server/scripts/Examples/example_spell.cpp @@ -50,7 +50,7 @@ class spell_ex_5581 : public SpellScriptLoader // function called on server startup // checks if script has data required for it to work - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { // check if spellid 70522 exists in dbc, we will trigger it later if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGERED)) @@ -208,7 +208,7 @@ class spell_ex_66244 : public SpellScriptLoader PrepareAuraScript(spell_ex_66244AuraScript); // function called on server startup // checks if script has data required for it to work - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { // check if spellid exists in dbc, we will trigger it later if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGERED)) diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index 63309c0502d..1eec2c826ea 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -448,7 +448,8 @@ class spell_mount_check : public SpellScriptLoader class spell_mount_check_AuraScript : public AuraScript { PrepareAuraScript(spell_mount_check_AuraScript) - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK)) return false; @@ -495,7 +496,8 @@ class spell_voljin_war_drums : public SpellScriptLoader class spell_voljin_war_drums_SpellScript : public SpellScript { PrepareSpellScript(spell_voljin_war_drums_SpellScript) - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1)) return false; @@ -552,7 +554,7 @@ class spell_voodoo : public SpellScriptLoader { PrepareSpellScript(spell_voodoo_SpellScript) - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) || !sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) || diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index b9d3c6f1cc6..33cce095abf 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -612,7 +612,7 @@ class spell_ooze_zap : public SpellScriptLoader { PrepareSpellScript(spell_ooze_zap_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP)) return false; @@ -659,7 +659,7 @@ class spell_ooze_zap_channel_end : public SpellScriptLoader { PrepareSpellScript(spell_ooze_zap_channel_end_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP_CHANNEL_END)) return false; @@ -695,7 +695,7 @@ class spell_energize_aoe : public SpellScriptLoader { PrepareSpellScript(spell_energize_aoe_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_ENERGIZED)) return false; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 3dc537b4c23..ce0f8e4778c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -2312,7 +2312,7 @@ class spell_toc_bloodlust : public SpellScriptLoader { PrepareSpellScript(spell_toc_bloodlust_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(AURA_SATED)) return false; @@ -2353,7 +2353,7 @@ class spell_toc_heroism : public SpellScriptLoader { PrepareSpellScript(spell_toc_heroism_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(AURA_EXHAUSTION)) return false; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 785038137d9..0160359f0f2 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -20,21 +20,14 @@ #include "ScriptedCreature.h" #include "drak_tharon_keep.h" -enum Misc -{ - ACTION_RESET_CRYSTALS, - ACTION_ACTIVATE_CRYSTAL, - ACTION_DEACTIVATE, - EVENT_ATTACK, - EVENT_SUMMON_MINIONS, - DATA_NOVOS_ACHIEV -}; - -enum Creatures +enum Yells { - NPC_FETID_TROLL_CORPSE = 27598, - NPC_RISEN_SHADOWCASTER = 27600, - NPC_HULKING_CORPSE = 27597 + SAY_AGGRO = 0, + SAY_KILL = 1, + SAY_DEATH = 2, + SAY_SUMMONING_ADDS = 3, // unused + SAY_ARCANE_FIELD = 4, + EMOTE_SUMMONING_ADDS = 5 // unused }; enum Spells @@ -46,6 +39,7 @@ enum Spells SPELL_SUMMON_FETID_TROLL_CORPSE = 49103, SPELL_SUMMON_HULKING_CORPSE = 49104, SPELL_SUMMON_CRYSTAL_HANDLER = 49179, + SPELL_SUMMON_COPY_OF_MINIONS = 59933, SPELL_ARCANE_BLAST = 49198, SPELL_BLIZZARD = 49034, @@ -54,6 +48,16 @@ enum Spells SPELL_SUMMON_MINIONS = 59910 }; +enum Misc +{ + ACTION_RESET_CRYSTALS, + ACTION_ACTIVATE_CRYSTAL, + ACTION_DEACTIVATE, + EVENT_ATTACK, + EVENT_SUMMON_MINIONS, + DATA_NOVOS_ACHIEV +}; + struct SummonerInfo { uint32 data, spell, timer; @@ -92,6 +96,7 @@ public: void EnterCombat(Unit* /* victim */) OVERRIDE { _EnterCombat(); + Talk(SAY_AGGRO); SetCrystalsStatus(true); SetSummonerStatus(true); @@ -107,6 +112,18 @@ public: DoStartNoMovement(target); } + void KilledUnit(Unit* who) OVERRIDE + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) OVERRIDE { if (!UpdateVictim() || _bubbled) @@ -210,9 +227,6 @@ public: void SetCrystalStatus(GameObject* crystal, bool active) { - if (!crystal) - return; - crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY); if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f)) { @@ -236,6 +250,7 @@ public: if (++_crystalHandlerCount >= 4) { + Talk(SAY_ARCANE_FIELD); SetSummonerStatus(false); SetBubbled(false); events.ScheduleEvent(EVENT_ATTACK, 3000); @@ -332,42 +347,44 @@ public: } }; -enum SummonMinions +class spell_novos_summon_minions : public SpellScriptLoader { - SPELL_COPY_OF_SUMMON_MINIONS = 59933 -}; + public: + spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { } -class spell_summon_minions : public SpellScriptLoader -{ -public: - spell_summon_minions() : SpellScriptLoader("spell_summon_minions") { } + class spell_novos_summon_minions_SpellScript : public SpellScript + { + PrepareSpellScript(spell_novos_summon_minions_SpellScript); - class spell_summon_minions_SpellScript : public SpellScript - { - PrepareSpellScript(spell_summon_minions_SpellScript); + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_COPY_OF_MINIONS)) + return false; + return true; + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true); - GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true); - } + void HandleScript(SpellEffIndex /*effIndex*/) + { + for (uint8 i = 0; i < 2; ++i) + GetCaster()->CastSpell((Unit*)NULL, SPELL_SUMMON_COPY_OF_MINIONS, true); + } - void Register() OVERRIDE + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + return new spell_novos_summon_minions_SpellScript(); } - }; - - SpellScript* GetSpellScript() const OVERRIDE - { - return new spell_summon_minions_SpellScript(); - } }; void AddSC_boss_novos() { new boss_novos(); new npc_crystal_channel_target(); - new spell_summon_minions(); + new spell_novos_summon_minions(); new achievement_oh_novos(); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index d126340ef51..d0cec8a4f43 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -15,186 +15,313 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* - * Comment: @todo spawn troll waves - */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "SpellAuras.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "drak_tharon_keep.h" enum Spells { - SPELL_INFECTED_WOUND = 49637, - SPELL_CRUSH = 49639, - SPELL_CORPSE_EXPLODE = 49555, - SPELL_CONSUME = 49380, - SPELL_CONSUME_AURA = 49381, - // Heroic spells - H_SPELL_CORPSE_EXPLODE = 59807, - H_SPELL_CONSUME = 59803, - H_SPELL_CONSUME_AURA = 59805, + SPELL_INFECTED_WOUND = 49637, + SPELL_CRUSH = 49639, + SPELL_CORPSE_EXPLODE = 49555, + SPELL_CORPSE_EXPLODE_DAMAGE = 49618, + SPELL_CONSUME = 49380, + SPELL_CONSUME_BUFF = 49381, + SPELL_CONSUME_BUFF_H = 59805, + + SPELL_SUMMON_INVADER_A = 49456, + SPELL_SUMMON_INVADER_B = 49457, + SPELL_SUMMON_INVADER_C = 49458, // can't find any sniffs + + SPELL_INVADER_TAUNT = 49405 }; +#define SPELL_CONSUME_BUFF_HELPER DUNGEON_MODE<uint32>(SPELL_CONSUME_BUFF, SPELL_CONSUME_BUFF_H) + enum Yells { - SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_CONSUME = 2, - SAY_EXPLODE = 3, - SAY_DEATH = 4 + SAY_AGGRO = 0, + SAY_KILL = 1, + SAY_CONSUME = 2, + SAY_EXPLODE = 3, + SAY_DEATH = 4 }; -enum Creatures +enum Misc { - NPC_DRAKKARI_INVADER_1 = 27753, - NPC_DRAKKARI_INVADER_2 = 27709 + DATA_CONSUMPTION_JUNCTION = 1, + POINT_LANDING = 1 }; -enum Misc +enum Events { - DATA_CONSUMPTION_JUNCTION = 1 + EVENT_CONSUME = 1, + EVENT_CRUSH, + EVENT_INFECTED_WOUND, + EVENT_CORPSE_EXPLODE, + EVENT_SPAWN }; -Position AddSpawnPoint = { -260.493011f, -622.968018f, 26.605301f, 3.036870f }; +Position const Landing = { -263.0534f, -660.8658f, 26.50903f, 0.0f }; class boss_trollgore : public CreatureScript { -public: - boss_trollgore() : CreatureScript("boss_trollgore") { } + public: + boss_trollgore() : CreatureScript("boss_trollgore") { } - struct boss_trollgoreAI : public ScriptedAI - { - boss_trollgoreAI(Creature* creature) : ScriptedAI(creature), lSummons(me) + struct boss_trollgoreAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) { } - uint32 uiConsumeTimer; - uint32 uiAuraCountTimer; - uint32 uiCrushTimer; - uint32 uiInfectedWoundTimer; - uint32 uiExplodeCorpseTimer; - uint32 uiSpawnTimer; + void Reset() OVERRIDE + { + _Reset(); + _consumptionJunction = true; + } - bool consumptionJunction; + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_CONSUME, 15000); + events.ScheduleEvent(EVENT_CRUSH, urand(1000, 5000)); + events.ScheduleEvent(EVENT_INFECTED_WOUND, urand(10000, 60000)); + events.ScheduleEvent(EVENT_CORPSE_EXPLODE, 3000); + events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000)); + } - SummonList lSummons; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CONSUME: + Talk(SAY_CONSUME); + DoCastAOE(SPELL_CONSUME); + events.ScheduleEvent(EVENT_CONSUME, 15000); + break; + case EVENT_CRUSH: + DoCastVictim(SPELL_CRUSH); + events.ScheduleEvent(EVENT_CRUSH, urand(10000, 15000)); + break; + case EVENT_INFECTED_WOUND: + DoCastVictim(SPELL_INFECTED_WOUND); + events.ScheduleEvent(EVENT_INFECTED_WOUND, urand(25000, 35000)); + break; + case EVENT_CORPSE_EXPLODE: + Talk(SAY_EXPLODE); + DoCastAOE(SPELL_CORPSE_EXPLODE); + events.ScheduleEvent(EVENT_CORPSE_EXPLODE, urand(15000, 19000)); + break; + case EVENT_SPAWN: + for (uint8 i = 0; i < 3; ++i) + if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TROLLGORE_INVADER_SUMMONER_1 + i))) + trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), true, NULL, NULL, me->GetGUID()); + + events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000)); + break; + default: + break; + } + } + + if (_consumptionJunction) + { + Aura* ConsumeAura = me->GetAura(SPELL_CONSUME_BUFF_HELPER); + if (ConsumeAura && ConsumeAura->GetStackAmount() > 9) + _consumptionJunction = false; + } + + DoMeleeAttackIfReady(); + } - InstanceScript* instance; + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } - void Reset() OVERRIDE - { - uiConsumeTimer = 15*IN_MILLISECONDS; - uiAuraCountTimer = 15500; - uiCrushTimer = urand(1*IN_MILLISECONDS, 5*IN_MILLISECONDS); - uiInfectedWoundTimer = urand(10*IN_MILLISECONDS, 60*IN_MILLISECONDS); - uiExplodeCorpseTimer = 3*IN_MILLISECONDS; - uiSpawnTimer = urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS); + uint32 GetData(uint32 type) const OVERRIDE + { + if (type == DATA_CONSUMPTION_JUNCTION) + return _consumptionJunction ? 1 : 0; - consumptionJunction = true; + return 0; + } - lSummons.DespawnAll(); + void KilledUnit(Unit* victim) OVERRIDE + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; - me->RemoveAura(DUNGEON_MODE(SPELL_CONSUME_AURA, H_SPELL_CONSUME_AURA)); + Talk(SAY_KILL); + } - instance->SetData(DATA_TROLLGORE, NOT_STARTED); + void JustSummoned(Creature* summon) OVERRIDE + { + summon->GetMotionMaster()->MovePoint(POINT_LANDING, Landing); + summons.Summon(summon); + } + + private: + bool _consumptionJunction; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetDrakTharonKeepAI<boss_trollgoreAI>(creature); } +}; - void EnterCombat(Unit* /*who*/) OVERRIDE +class npc_drakkari_invader : public CreatureScript +{ + public: + npc_drakkari_invader() : CreatureScript("npc_drakkari_invader") { } + + struct npc_drakkari_invaderAI : public ScriptedAI { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS); + npc_drakkari_invaderAI(Creature* creature) : ScriptedAI(creature) { } + + void MovementInform(uint32 type, uint32 pointId) OVERRIDE + { + if (type == POINT_MOTION_TYPE && pointId == POINT_LANDING) + { + me->Dismount(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + DoCastAOE(SPELL_INVADER_TAUNT); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetDrakTharonKeepAI<npc_drakkari_invaderAI>(creature); } +}; - void UpdateAI(uint32 diff) OVERRIDE +// 49380, 59803 - Consume +class spell_trollgore_consume : public SpellScriptLoader +{ + public: + spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { } + + class spell_trollgore_consume_SpellScript : public SpellScript { - //Return since we have no target - if (!UpdateVictim()) - return; + PrepareSpellScript(spell_trollgore_consume_SpellScript); - if (uiSpawnTimer <= diff) + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - uint32 spawnNumber = urand(2, DUNGEON_MODE(3, 5)); - for (uint8 i = 0; i < spawnNumber; ++i) - DoSummon(RAND(NPC_DRAKKARI_INVADER_1, NPC_DRAKKARI_INVADER_2), AddSpawnPoint, 0, TEMPSUMMON_DEAD_DESPAWN); - uiSpawnTimer = urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS); - } else uiSpawnTimer -= diff; + if (!sSpellMgr->GetSpellInfo(SPELL_CONSUME_BUFF)) + return false; + return true; + } - if (uiConsumeTimer <= diff) + void HandleConsume(SpellEffIndex /*effIndex*/) { - Talk(SAY_CONSUME); - DoCast(SPELL_CONSUME); - uiConsumeTimer = 15*IN_MILLISECONDS; - } else uiConsumeTimer -= diff; + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_CONSUME_BUFF, true); + } - if (consumptionJunction) + void Register() OVERRIDE { - Aura* ConsumeAura = me->GetAura(DUNGEON_MODE(SPELL_CONSUME_AURA, H_SPELL_CONSUME_AURA)); - if (ConsumeAura && ConsumeAura->GetStackAmount() > 9) - consumptionJunction = false; + OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleConsume, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_trollgore_consume_SpellScript(); + } +}; - if (uiCrushTimer <= diff) +// 49555, 59807 - Corpse Explode +class spell_trollgore_corpse_explode : public SpellScriptLoader +{ + public: + spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { } + + class spell_trollgore_corpse_explode_AuraScript : public AuraScript + { + PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - DoCastVictim(SPELL_CRUSH); - uiCrushTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); - } else uiCrushTimer -= diff; + if (!sSpellMgr->GetSpellInfo(SPELL_CORPSE_EXPLODE_DAMAGE)) + return false; + return true; + } - if (uiInfectedWoundTimer <= diff) + void PeriodicTick(AuraEffect const* aurEff) { - DoCastVictim(SPELL_INFECTED_WOUND); - uiInfectedWoundTimer = urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS); - } else uiInfectedWoundTimer -= diff; + if (aurEff->GetTickNumber() == 2) + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true, NULL, aurEff); + } - if (uiExplodeCorpseTimer <= diff) + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - DoCast(SPELL_CORPSE_EXPLODE); - Talk(SAY_EXPLODE); - uiExplodeCorpseTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS); - } else uiExplodeCorpseTimer -= diff; + if (Creature* target = GetTarget()->ToCreature()) + target->DespawnOrUnsummon(); + } - DoMeleeAttackIfReady(); - } + void Register() OVERRIDE + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; - void JustDied(Unit* /*killer*/) OVERRIDE + AuraScript* GetAuraScript() const OVERRIDE { - Talk(SAY_DEATH); - - lSummons.DespawnAll(); - - instance->SetBossState(DATA_TROLLGORE, DONE); + return new spell_trollgore_corpse_explode_AuraScript(); } +}; - uint32 GetData(uint32 type) const OVERRIDE +// 49405 - Invader Taunt Trigger +class spell_trollgore_invader_taunt : public SpellScriptLoader +{ + public: + spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { } + + class spell_trollgore_invader_taunt_SpellScript : public SpellScript { - if (type == DATA_CONSUMPTION_JUNCTION) - return consumptionJunction ? 1 : 0; + PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript); - return 0; - } + bool Validate(SpellInfo const* spellInfo) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) + return false; + return true; + } - void KilledUnit(Unit* victim) OVERRIDE - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; + void HandleTaunt(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } - Talk(SAY_KILL); - } + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleTaunt, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; - void JustSummoned(Creature* summon) OVERRIDE + SpellScript* GetSpellScript() const OVERRIDE { - lSummons.Summon(summon); - if (summon->AI()) - summon->AI()->AttackStart(me); + return new spell_trollgore_invader_taunt_SpellScript(); } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return GetDrakTharonKeepAI<boss_trollgoreAI>(creature); - } }; class achievement_consumption_junction : public AchievementCriteriaScript @@ -220,5 +347,9 @@ class achievement_consumption_junction : public AchievementCriteriaScript void AddSC_boss_trollgore() { new boss_trollgore(); + new npc_drakkari_invader(); + new spell_trollgore_consume(); + new spell_trollgore_corpse_explode(); + new spell_trollgore_invader_taunt(); new achievement_consumption_junction(); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h index cc0fb9a0090..072a5f2f534 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h +++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h @@ -36,6 +36,10 @@ enum DataTypes // Additional data //DATA_KING_DRED_ACHIEV, + DATA_TROLLGORE_INVADER_SUMMONER_1, + DATA_TROLLGORE_INVADER_SUMMONER_2, + DATA_TROLLGORE_INVADER_SUMMONER_3, + DATA_NOVOS_CRYSTAL_1, DATA_NOVOS_CRYSTAL_2, DATA_NOVOS_CRYSTAL_3, @@ -55,13 +59,23 @@ enum CreatureIds NPC_KING_DRED = 27483, NPC_THARON_JA = 26632, + // Trollgore + NPC_DRAKKARI_INVADER_A = 27709, + NPC_DRAKKARI_INVADER_B = 27753, + NPC_DRAKKARI_INVADER_C = 27754, + // Novos NPC_CRYSTAL_CHANNEL_TARGET = 26712, NPC_CRYSTAL_HANDLER = 26627, + NPC_HULKING_CORPSE = 27597, + NPC_FETID_TROLL_CORPSE = 27598, + NPC_RISEN_SHADOWCASTER = 27600, // King Dred NPC_DRAKKARI_GUTRIPPER = 26641, - NPC_DRAKKARI_SCYTHECLAW = 26628 + NPC_DRAKKARI_SCYTHECLAW = 26628, + + NPC_WORLD_TRIGGER = 22515 }; enum GameObjectIds diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 99a4ce77623..e2ed883ad08 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -36,11 +36,12 @@ class instance_drak_tharon_keep : public InstanceMapScript KingDredGUID = 0; TharonJaGUID = 0; + memset(TrollgoreInvaderSummonerGuids, 0, 4 * sizeof(uint64)); memset(NovosCrystalGUIDs, 0, 4 * sizeof(uint64)); memset(NovosSummonerGUIDs, 0, 4 * sizeof(uint64)); } - void OnCreatureCreate(Creature* creature) + void OnCreatureCreate(Creature* creature) OVERRIDE { switch (creature->GetEntry()) { @@ -56,6 +57,9 @@ class instance_drak_tharon_keep : public InstanceMapScript case NPC_THARON_JA: TharonJaGUID = creature->GetGUID(); break; + case NPC_WORLD_TRIGGER: + InitializeTrollgoreInvaderSummoner(creature); + break; case NPC_CRYSTAL_CHANNEL_TARGET: InitializeNovosSummoner(creature); break; @@ -64,31 +68,43 @@ class instance_drak_tharon_keep : public InstanceMapScript } } - void OnGameObjectCreate(GameObject* go) + void OnGameObjectCreate(GameObject* go) OVERRIDE { switch (go->GetEntry()) { case GO_NOVOS_CRYSTAL_1: NovosCrystalGUIDs[0] = go->GetGUID(); - go->SetGoState(GO_STATE_READY); break; case GO_NOVOS_CRYSTAL_2: NovosCrystalGUIDs[1] = go->GetGUID(); - go->SetGoState(GO_STATE_READY); break; case GO_NOVOS_CRYSTAL_3: NovosCrystalGUIDs[2] = go->GetGUID(); - go->SetGoState(GO_STATE_READY); break; case GO_NOVOS_CRYSTAL_4: NovosCrystalGUIDs[3] = go->GetGUID(); - go->SetGoState(GO_STATE_READY); break; default: break; } } + void InitializeTrollgoreInvaderSummoner(Creature* creature) + { + float y = creature->GetPositionY(); + float z = creature->GetPositionZ(); + + if (z < 50.0f) + return; + + if (y < -650.0f && y > -660.0f) + TrollgoreInvaderSummonerGuids[0] = creature->GetGUID(); + else if (y < -660.0f && y > -670.0f) + TrollgoreInvaderSummonerGuids[1] = creature->GetGUID(); + else if (y < -675.0f && y > -685.0f) + TrollgoreInvaderSummonerGuids[2] = creature->GetGUID(); + } + void InitializeNovosSummoner(Creature* creature) { float x = creature->GetPositionX(); @@ -117,6 +133,10 @@ class instance_drak_tharon_keep : public InstanceMapScript return KingDredGUID; case DATA_THARON_JA: return TharonJaGUID; + case DATA_TROLLGORE_INVADER_SUMMONER_1: + case DATA_TROLLGORE_INVADER_SUMMONER_2: + case DATA_TROLLGORE_INVADER_SUMMONER_3: + return TrollgoreInvaderSummonerGuids[type - DATA_TROLLGORE_INVADER_SUMMONER_1]; case DATA_NOVOS_CRYSTAL_1: case DATA_NOVOS_CRYSTAL_2: case DATA_NOVOS_CRYSTAL_3: @@ -132,14 +152,14 @@ class instance_drak_tharon_keep : public InstanceMapScript return 0; } - void OnUnitDeath(Unit* unit) + void OnUnitDeath(Unit* unit) OVERRIDE { if (unit->GetEntry() == NPC_CRYSTAL_HANDLER) if (Creature* novos = instance->GetCreature(NovosGUID)) novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED); } - std::string GetSaveData() + std::string GetSaveData() OVERRIDE { OUT_SAVE_INST_DATA; @@ -150,7 +170,7 @@ class instance_drak_tharon_keep : public InstanceMapScript return saveStream.str(); } - void Load(char const* str) + void Load(char const* str) OVERRIDE { if (!str) { @@ -188,6 +208,7 @@ class instance_drak_tharon_keep : public InstanceMapScript uint64 KingDredGUID; uint64 TharonJaGUID; + uint64 TrollgoreInvaderSummonerGuids[3]; uint64 NovosCrystalGUIDs[4]; uint64 NovosSummonerGUIDs[4]; }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index d8578b31abb..45c35741c3c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -432,11 +432,10 @@ class spell_ignis_slag_pot : public SpellScriptLoader { PrepareAuraScript(spell_ignis_slag_pot_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_POT_DAMAGE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_IMBUED)) + if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_POT_DAMAGE) + || !sSpellMgr->GetSpellInfo(SPELL_SLAG_IMBUED)) return false; return true; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 9c086d8bd81..fa28695ff62 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -163,6 +163,7 @@ enum TickingTimeBomb { SPELL_TICKING_TIME_BOMB_EXPLODE = 59687 }; + class spell_ticking_time_bomb : public SpellScriptLoader { public: @@ -172,9 +173,11 @@ class spell_ticking_time_bomb : public SpellScriptLoader { PrepareAuraScript(spell_ticking_time_bomb_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - return (bool) sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE); + if (!sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE)) + return false; + return true; } void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) @@ -210,9 +213,11 @@ class spell_fixate : public SpellScriptLoader { PrepareSpellScript(spell_fixate_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - return (bool) sSpellMgr->GetSpellInfo(SPELL_FIXATE_TRIGGER); + if (!sSpellMgr->GetSpellInfo(SPELL_FIXATE_TRIGGER)) + return false; + return true; } void HandleScriptEffect(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 60ae487daa7..5e9a19685bc 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -1609,7 +1609,7 @@ class spell_random_ingredient_aura : public SpellScriptLoader { PrepareAuraScript(spell_random_ingredient_aura_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_EASY) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_MEDIUM) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_HARD)) return false; @@ -1656,7 +1656,7 @@ class spell_random_ingredient : public SpellScriptLoader { PrepareSpellScript(spell_random_ingredient_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) || @@ -1720,7 +1720,7 @@ class spell_pot_check : public SpellScriptLoader { PrepareSpellScript(spell_pot_check_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) || diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index 1876cf68b7d..83c0cbf04d5 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -392,6 +392,8 @@ public: if (!UpdateVictim()) return; + events.Update(diff); + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp new file mode 100644 index 00000000000..707f6c34a90 --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * 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 + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* +Name: Boss_Anzu +%Complete: 80% +Comment: +Category: Auchindoun, Sethekk Halls +*/ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "sethekk_halls.h" + +enum Says +{ + SAY_SUMMON_BROOD = 0, + SAY_SPELL_BOMB = 1 +}; + +enum Spells +{ + SPELL_PARALYZING_SCREECH = 40184, + SPELL_SPELL_BOMB = 40303, + SPELL_CYCLONE_OF_FEATHERS = 40321, + SPELL_BANISH_SELF = 42354, + SPELL_FLESH_RIP = 40199 +}; + +enum Events +{ + EVENT_PARALYZING_SCREECH = 1, + EVENT_SPELL_BOMB = 2, + EVENT_CYCLONE_OF_FEATHERS = 3, + EVENT_SUMMON = 4 +}; + +Position const PosSummonBrood[7] = +{ + { -118.1717f, 284.5299f, 121.2287f, 2.775074f }, + { -98.15528f, 293.4469f, 109.2385f, 0.174533f }, + { -99.70160f, 270.1699f, 98.27389f, 6.178465f }, + { -69.25543f, 303.0768f, 97.84479f, 5.532694f }, + { -87.59662f, 263.5181f, 92.70478f, 1.658063f }, + { -73.54323f, 276.6267f, 94.25807f, 2.802979f }, + { -81.70527f, 280.8776f, 44.58830f, 0.526849f }, +}; + +class boss_anzu : public CreatureScript +{ +public: + boss_anzu() : CreatureScript("boss_anzu") { } + + struct boss_anzuAI : public BossAI + { + boss_anzuAI(Creature* creature) : BossAI(creature, DATA_ANZU) { } + + void Reset() OVERRIDE + { + summon66 = false; + summon33 = false; + } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 14000); + events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5000); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + if (instance) + instance->SetData(DATA_ANZU, DONE); + } + + void KilledUnit(Unit* /*victim*/) OVERRIDE {} + + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PARALYZING_SCREECH: + DoCastVictim(SPELL_PARALYZING_SCREECH); + events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 26000); + break; + + case EVENT_CYCLONE_OF_FEATHERS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_CYCLONE_OF_FEATHERS); + events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21000); + break; + case EVENT_SUMMON: + // TODO: Add pathing for Brood of Anzu + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[5], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[6], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000); + DoCast(me, SPELL_BANISH_SELF); + events.ScheduleEvent(EVENT_SPELL_BOMB, 12000); + break; + case EVENT_SPELL_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + if (target->getPowerType() == POWER_MANA) + { + DoCast(target, SPELL_SPELL_BOMB); + Talk(SAY_SPELL_BOMB, target->GetGUID()); + } + } + break; + default: + break; + } + } + + if (HealthBelowPct(66) && !summon66) + { + summon66 = true; + Talk(SAY_SUMMON_BROOD); + events.ScheduleEvent(EVENT_SUMMON, 3000); + } + + if (HealthBelowPct(33) && !summon33) + { + summon33 = true; + Talk(SAY_SUMMON_BROOD); + events.ScheduleEvent(EVENT_SUMMON, 3000); + } + + DoMeleeAttackIfReady(); + } + + private: + bool summon66; + bool summon33; + + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_anzuAI(creature); + } +}; + +void AddSC_boss_anzu() +{ + new boss_anzu(); +} diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp index 7a486876b3f..782db325496 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -25,14 +25,18 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "sethekk_halls.h" -enum DarkweaverSyth +enum Says { SAY_SUMMON = 0, SAY_AGGRO = 1, SAY_SLAY = 2, - SAY_DEATH = 3, + SAY_DEATH = 3 +}; +enum Spells +{ SPELL_FROST_SHOCK = 21401, //37865 SPELL_FLAME_SHOCK = 34354, SPELL_SHADOW_SHOCK = 30138, @@ -51,40 +55,26 @@ enum DarkweaverSyth SPELL_SHADOW_BUFFET = 33529 }; +enum Events +{ + EVENT_FLAME_SHOCK = 1, + EVENT_ARCANE_SHOCK = 2, + EVENT_FROST_SHOCK = 3, + EVENT_SHADOW_SHOCK = 4, + EVENT_CHAIN_LIGHTNING = 5 +}; + class boss_darkweaver_syth : public CreatureScript { public: boss_darkweaver_syth() : CreatureScript("boss_darkweaver_syth") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_darkweaver_sythAI(creature); - } - - struct boss_darkweaver_sythAI : public ScriptedAI + struct boss_darkweaver_sythAI : public BossAI { - boss_darkweaver_sythAI(Creature* creature) : ScriptedAI(creature) - { - } - - uint32 flameshock_timer; - uint32 arcaneshock_timer; - uint32 frostshock_timer; - uint32 shadowshock_timer; - uint32 chainlightning_timer; - - bool summon90; - bool summon50; - bool summon10; + boss_darkweaver_sythAI(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH) { } void Reset() OVERRIDE { - flameshock_timer = 2000; - arcaneshock_timer = 4000; - frostshock_timer = 6000; - shadowshock_timer = 8000; - chainlightning_timer = 15000; - summon90 = false; summon50 = false; summon10 = false; @@ -92,12 +82,21 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { + events.ScheduleEvent(EVENT_FLAME_SHOCK, 2000); + events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4000); + events.ScheduleEvent(EVENT_FROST_SHOCK, 6000); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8000); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15000); + Talk(SAY_AGGRO); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); + + if (instance) + instance->SetData(DATA_DARKWEAVER_SYTH, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -132,6 +131,42 @@ public: if (!UpdateVictim()) return; + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FLAME_SHOCK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FLAME_SHOCK); + events.ScheduleEvent(EVENT_FLAME_SHOCK, urand(10000, 15000)); + break; + case EVENT_ARCANE_SHOCK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_ARCANE_SHOCK); + events.ScheduleEvent(EVENT_ARCANE_SHOCK, urand(10000, 15000)); + break; + case EVENT_FROST_SHOCK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FROST_SHOCK); + events.ScheduleEvent(EVENT_FROST_SHOCK, urand(10000, 15000)); + break; + case EVENT_SHADOW_SHOCK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_SHADOW_SHOCK); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, urand(10000, 15000)); + break; + case EVENT_CHAIN_LIGHTNING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_CHAIN_LIGHTNING); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000); + break; + default: + break; + } + } + if (HealthBelowPct(90) && !summon90) { SythSummoning(); @@ -150,50 +185,19 @@ public: summon10 = true; } - if (flameshock_timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_FLAME_SHOCK); - - flameshock_timer = urand(10000, 15000); - } else flameshock_timer -= diff; - - if (arcaneshock_timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_ARCANE_SHOCK); - - arcaneshock_timer = urand(10000, 15000); - } else arcaneshock_timer -= diff; - - if (frostshock_timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_FROST_SHOCK); - - frostshock_timer = urand(10000, 15000); - } else frostshock_timer -= diff; - - if (shadowshock_timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_SHOCK); - - shadowshock_timer = urand(10000, 15000); - } else shadowshock_timer -= diff; - - if (chainlightning_timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_CHAIN_LIGHTNING); - - chainlightning_timer = 25000; - } else chainlightning_timer -= diff; - DoMeleeAttackIfReady(); } + + private: + bool summon90; + bool summon50; + bool summon10; }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_darkweaver_sythAI(creature); + } }; /* ELEMENTALS */ diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp index 4123da48ba6..9d3aa623011 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp @@ -27,14 +27,17 @@ EndScriptData */ #include "ScriptedCreature.h" #include "sethekk_halls.h" -enum TailonkingIkiss +enum Says { SAY_INTRO = 0, SAY_AGGRO = 1, SAY_SLAY = 2, SAY_DEATH = 3, - EMOTE_ARCANE_EXP = 4, + EMOTE_ARCANE_EXP = 4 +}; +enum Spells +{ SPELL_BLINK = 38194, SPELL_BLINK_TELEPORT = 38203, SPELL_MANA_SHIELD = 38151, @@ -53,28 +56,9 @@ class boss_talon_king_ikiss : public CreatureScript public: boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE + struct boss_talon_king_ikissAI : public BossAI { - return new boss_talon_king_ikissAI(creature); - } - - struct boss_talon_king_ikissAI : public ScriptedAI - { - boss_talon_king_ikissAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 ArcaneVolley_Timer; - uint32 Sheep_Timer; - uint32 Blink_Timer; - uint32 Slow_Timer; - - bool ManaShield; - bool Blink; - bool Intro; + boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS) { } void Reset() OVERRIDE { @@ -120,7 +104,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_IKISSDOOREVENT, DONE); + instance->SetData(DATA_TALON_KING_IKISS, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -204,8 +188,22 @@ public: if (!Blink) DoMeleeAttackIfReady(); } + + private: + uint32 ArcaneVolley_Timer; + uint32 Sheep_Timer; + uint32 Blink_Timer; + uint32 Slow_Timer; + + bool ManaShield; + bool Blink; + bool Intro; }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_talon_king_ikissAI(creature); + } }; void AddSC_boss_talon_king_ikiss() diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp index d44789f4c39..67f4dc1423a 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp @@ -27,16 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "sethekk_halls.h" -enum Creatures -{ - NPC_ANZU = 23035 -}; - -enum GameObjects -{ - GO_IKISS_DOOR = 177203 -}; - class instance_sethekk_halls : public InstanceMapScript { public: @@ -49,49 +39,102 @@ public: struct instance_sethekk_halls_InstanceMapScript : public InstanceScript { - instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint32 AnzuEncounter; - uint64 m_uiIkissDoorGUID; + instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + } void Initialize() { - AnzuEncounter = NOT_STARTED; - m_uiIkissDoorGUID = 0; + SetBossState(DATA_ANZU, NOT_STARTED); + iIkissDoorGUID = 0; } void OnCreatureCreate(Creature* creature) { if (creature->GetEntry() == NPC_ANZU) { - if (AnzuEncounter >= IN_PROGRESS) + if (GetBossState(DATA_ANZU) == DONE) creature->DisappearAndDie(); else - AnzuEncounter = IN_PROGRESS; + SetBossState(DATA_ANZU, IN_PROGRESS); } } void OnGameObjectCreate(GameObject* go) { if (go->GetEntry() == GO_IKISS_DOOR) - m_uiIkissDoorGUID = go->GetGUID(); + iIkissDoorGUID = go->GetGUID(); } - void SetData(uint32 type, uint32 data) OVERRIDE + bool SetBossState(uint32 type, EncounterState state) { + if (!InstanceScript::SetBossState(type, state)) + return false; + switch (type) { - case DATA_IKISSDOOREVENT: - if (data == DONE) - DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS); + case DATA_DARKWEAVER_SYTH: + break; + case DATA_TALON_KING_IKISS: + if (state == DONE) + DoUseDoorOrButton(iIkissDoorGUID, DAY*IN_MILLISECONDS); + break; + case DATA_ANZU: break; - case TYPE_ANZU_ENCOUNTER: - AnzuEncounter = data; + default: break; } + + return true; } - }; + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "S H " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'S' && dataHead2 == 'H') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + protected: + uint64 iIkissDoorGUID; + }; }; void AddSC_instance_sethekk_halls() diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h index 15ffda4ada9..86789e9982f 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://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 @@ -19,10 +18,24 @@ #ifndef DEF_SETHEKK_HALLS_H #define DEF_SETHEKK_HALLS_H +uint32 const EncounterCount = 3; + enum DataTypes { - DATA_IKISSDOOREVENT = 1, - TYPE_ANZU_ENCOUNTER = 2, + DATA_DARKWEAVER_SYTH = 0, + DATA_TALON_KING_IKISS = 1, + DATA_ANZU = 2 +}; + +enum CreatureIds +{ + NPC_ANZU = 23035, + NPC_BROOD_OF_ANZU = 23132 }; -#endif +enum GameObjectIds +{ + GO_IKISS_DOOR = 177203 +}; + +#endif diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index 3d7a143d59e..290641437f3 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -903,7 +903,7 @@ public: { PrepareAuraScript(spell_boss_lady_malande_shield_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { return sSpellMgr->GetSpellInfo(SPELL_REFLECTIVE_SHIELD_T); } diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt index f038af07634..d7b863da0db 100644 --- a/src/server/scripts/Outland/CMakeLists.txt +++ b/src/server/scripts/Outland/CMakeLists.txt @@ -76,6 +76,7 @@ set(scripts_STAT_SRCS Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp + Outland/Auchindoun/SethekkHalls/boss_anzu.cpp Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp Outland/Auchindoun/SethekkHalls/sethekk_halls.h Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index 597cccda102..3c8627c7058 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -519,7 +519,7 @@ class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader { PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript); - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_WRATH_OF_THE_ASTROMANCER_DOT)) return false; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 2e6594714c9..98ed2c8b331 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -619,7 +619,7 @@ class spell_gen_cannibalize : public SpellScriptLoader { PrepareSpellScript(spell_gen_cannibalize_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED)) return false; @@ -672,7 +672,7 @@ class spell_gen_chaos_blast : public SpellScriptLoader { PrepareSpellScript(spell_gen_chaos_blast_SpellScript) - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST)) return false; @@ -779,7 +779,7 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader uint32 prevItem; - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) || @@ -1021,9 +1021,10 @@ class spell_gen_dalaran_disguise : public SpellScriptLoader class spell_gen_dalaran_disguise_SpellScript : public SpellScript { PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript); - bool Validate(SpellInfo const* spellEntry) OVERRIDE + + bool Validate(SpellInfo const* spellInfo) OVERRIDE { - switch (spellEntry->Id) + switch (spellInfo->Id) { case SPELL_SUNREAVER_DISGUISE_TRIGGER: if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) || @@ -1093,7 +1094,7 @@ class spell_gen_damage_reduction_aura : public SpellScriptLoader { PrepareAuraScript(spell_gen_damage_reduction_AuraScript); - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) return false; @@ -1148,7 +1149,7 @@ class spell_gen_defend : public SpellScriptLoader { PrepareAuraScript(spell_gen_defend_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) return false; @@ -1270,7 +1271,7 @@ class spell_gen_divine_storm_cd_reset : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM)) return false; @@ -1348,7 +1349,7 @@ class spell_gen_dummy_trigger : public SpellScriptLoader { PrepareSpellScript(spell_gen_dummy_trigger_SpellScript); - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD)) @@ -1441,7 +1442,7 @@ class spell_gen_elune_candle : public SpellScriptLoader class spell_gen_elune_candle_SpellScript : public SpellScript { PrepareSpellScript(spell_gen_elune_candle_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) || !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST) || @@ -1508,7 +1509,7 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader { PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript) - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) || @@ -1609,7 +1610,7 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader { PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript) - bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE)) @@ -3204,7 +3205,7 @@ class spell_gen_summon_tournament_mount : public SpellScriptLoader { PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED)) return false; @@ -3253,7 +3254,7 @@ class spell_gen_tournament_duel : public SpellScriptLoader { PrepareSpellScript(spell_gen_tournament_duel_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) || !sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL)) @@ -3345,7 +3346,7 @@ class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF)) diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 09be427d330..9f7386ab7e6 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -47,7 +47,7 @@ class spell_item_trigger_spell : public SpellScriptLoader public: spell_item_trigger_spell_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(_triggeredSpellId)) return false; @@ -322,7 +322,7 @@ class spell_item_deviate_fish : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { for (uint32 spellId = SPELL_SLEEPY; spellId <= SPELL_HEALTHY_SPIRIT; ++spellId) if (!sSpellMgr->GetSpellInfo(spellId)) @@ -367,7 +367,7 @@ class spell_item_flask_of_the_north : public SpellScriptLoader { PrepareSpellScript(spell_item_flask_of_the_north_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_SP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_AP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_STR)) return false; @@ -436,7 +436,7 @@ class spell_item_gnomish_death_ray : public SpellScriptLoader { PrepareSpellScript(spell_item_gnomish_death_ray_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_SELF) || !sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_TARGET)) return false; @@ -492,7 +492,7 @@ class spell_item_make_a_wish : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_BLESSING) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_MIGHTY_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FURIOUS_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_TINY_MAGICAL_CRAWDAD) || !sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_GIFT)) return false; @@ -646,7 +646,7 @@ class spell_item_net_o_matic : public SpellScriptLoader { PrepareSpellScript(spell_item_net_o_matic_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED3)) return false; @@ -703,7 +703,7 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3)) return false; @@ -788,7 +788,7 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { for (uint32 spellId = SPELL_FLIP_OUT_MALE; spellId <= SPELL_YAAARRRR_FEMALE; ++spellId) if (!sSpellMgr->GetSpellInfo(spellId)) @@ -1112,7 +1112,7 @@ class spell_item_six_demon_bag : public SpellScriptLoader { PrepareSpellScript(spell_item_six_demon_bag_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_FROSTBOLT) || !sSpellMgr->GetSpellInfo(SPELL_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FELHOUND_MINION) || !sSpellMgr->GetSpellInfo(SPELL_FIREBALL) || !sSpellMgr->GetSpellInfo(SPELL_CHAIN_LIGHTNING) || !sSpellMgr->GetSpellInfo(SPELL_ENVELOPING_WINDS)) return false; @@ -1213,7 +1213,7 @@ class spell_item_underbelly_elixir : public SpellScriptLoader { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED3)) return false; @@ -1491,7 +1491,7 @@ class spell_item_vanquished_clutches : public SpellScriptLoader { PrepareSpellScript(spell_item_vanquished_clutches_SpellScript); - bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { if (!sSpellMgr->GetSpellInfo(SPELL_CRUSHER) || !sSpellMgr->GetSpellInfo(SPELL_CONSTRICTOR) || !sSpellMgr->GetSpellInfo(SPELL_CORRUPTOR)) return false; diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 10cc62a8a91..fcf87e9bfac 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -1785,6 +1785,62 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader } }; +enum BearFlankMaster +{ + SPELL_BEAR_FLANK_MASTER = 56565, + SPELL_CREATE_BEAR_FLANK = 56566, + SPELL_BEAR_FLANK_FAIL = 56569 +}; + +class spell_q13011_bear_flank_master : public SpellScriptLoader +{ + public: + spell_q13011_bear_flank_master() : SpellScriptLoader("spell_q13011_bear_flank_master") { } + + class spell_q13011_bear_flank_master_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13011_bear_flank_master_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_BEAR_FLANK_MASTER) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_BEAR_FLANK)) + return false; + return true; + } + + bool Load() OVERRIDE + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleScript(SpellEffIndex effIndex) + { + bool failed = RAND(0, 1); // 50% chance + Creature* creature = GetCaster()->ToCreature(); + if (Player* player = GetHitPlayer()) + { + if (failed) + { + player->CastSpell(creature, SPELL_BEAR_FLANK_FAIL); + creature->AI()->Talk(0, player->GetGUID()); + } + else + player->CastSpell(player, SPELL_CREATE_BEAR_FLANK); + } + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_q13011_bear_flank_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_q13011_bear_flank_master_SpellScript(); + } +}; + class spell_q13086_cannons_target : public SpellScriptLoader { public: @@ -1863,5 +1919,6 @@ void AddSC_quest_spell_scripts() new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy(); new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon(); new spell_q12847_summon_soul_moveto_bunny(); + new spell_q13011_bear_flank_master(); new spell_q13086_cannons_target(); } |