diff --git a/sql/updates/world/4.3.4/2017_11_23_00_world.sql b/sql/updates/world/4.3.4/2017_11_23_00_world.sql new file mode 100644 index 00000000000..0491ea82185 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_11_23_00_world.sql @@ -0,0 +1,76 @@ +-- Rajh +UPDATE `creature_template` SET `difficulty_entry_1`= 48815, `mechanic_immune_mask`= 80297983, `scriptname`= 'boss_rajh' WHERE `entry`= 39378; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `faction`= 16, `speed_walk`= 2, `type_flags`= 104, `exp`= 3, `faction`= 14, + `unit_flags`= 32832, `unit_flags2`= 0, `vehicleId`= 790, `movementId`= 151, `mechanic_immune_mask`= 80297983, `flags_extra`= 1, `unit_class`= 4 WHERE `entry`= 48815; + +-- Solar Winds Dummy +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 35, `unit_flags`= 33554496, `flags_extra`= 128 WHERE `entry`= 39634; + +-- Solar Winds +UPDATE `creature_template` SET `scale`= 0.1, `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554496, `flags_extra`= 128, `InhabitType`= 1, `scriptname`= 'npc_solar_winds' WHERE `entry`= 39635; + +-- Solar Winds (Fire) +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554496, `flags_extra`= 128 WHERE `entry`= 47922; + +-- Inferno Leap +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 14, `unit_flags`= 33587200, `unit_flags2`= 34816, `flags_extra`= 128, `VehicleId`= 1233 WHERE `entry`= 47040; + +-- Orb of the Sun +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 14, `unit_flags`= 33587200, `unit_flags2`= 34816, `flags_extra`= 128, `vehicleId`= 787, `scale`= 0.1, `InhabitType`= 4, `scriptname`= 'npc_orb_of_the_sun' WHERE `entry`= 40835; + +-- Blazing Inferno +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33587200, `unit_flags2`= 34816, `flags_extra`= 128, `vehicleId`= 790 WHERE `entry`= 40927; + +DELETE FROM `creature_text` WHERE `CreatureID`= 39378; +INSERT INTO `creature_text` (`CreatureID`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(39378, 0, 0, 'Defilers! Wretches! Fiends! Begone from here!', 14, 0, 100, 0, 0, 18911, 44757, 'Rajh'), +(39378, 1, 0, 'Can you feel it? The blessed warmth of the sun?', 14, 0, 100, 0, 0, 18912, 44761, 'Rajh'), +(39378, 2, 0, 'I send you to your deity.', 14, 0, 100, 0, 0, 18914, 44758, 'Rajh to Player'), +(39378, 2, 1, 'I will take this life as an offering!', 14, 0, 100, 0, 0, 18913, 44759, 'Rajh to Player'), +(39378, 3, 0, 'Blazing rays of light, take me!', 14, 0, 100, 0, 0, 18910, 44760, 'Rajh to Player'); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (39635, 47922, 47040, 40835); +INSERT INTO `creature_template_addon` (`entry`, `Auras`) VALUES +(39635, '74109'), +(47922, '89131'), +(47040, '87645'), +(40835, '73658'); + +DELETE FROM `conditions` WHERE `SourceEntry`= 87653; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 87653, 0, 0, 31, 0, 3, 47040, 0, 0, 0, '', 'Inferno Leap - Target Inferno Leap'); + +-- Creature Inferno Leap 47040 SAI +SET @ENTRY := 47040; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 8, 0, 100, 1, 87653, 0, 0, 0, 67, 0, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On spell 87653 hit - Trigger timed event #0 in 500 - 500 ms // "), +(@ENTRY, 0, 1, 0, 59, 0, 100, 0, 0, 0, 0, 0, 11, 87647, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Cast spell 87647 on Self // "); + +-- Creature Blazing Inferno 40927 SAI +SET @ENTRY := 40927; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 8, 0, 100, 1, 43671, 0, 0, 0, 67, 0, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On spell 43671 hit - Trigger timed event #0 in 500 - 500 ms // "), +(@ENTRY, 0, 1, 0, 59, 0, 100, 1, 0, 0, 0, 0, 11, 89877, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Cast spell 89877 on Action invoker // "); + +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`= 15990; +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(15990, 11, 0, 0, 'achievement_sun_of_a'); + +DELETE FROM `spell_dbc` WHERE `Id`= 76374; +INSERT INTO `spell_dbc` (`Id`, `CastingTimeIndex`, `DurationIndex`, `Comment`) VALUES +(76374, 0, 575, 'Summon Meteor'); +DELETE FROM `spelleffect_dbc` WHERE `Id`= 155916; +INSERT INTO `spelleffect_dbc` (`Id`, `Effect`, `EffectMiscValue`, `EffectMiscValueB`, `EffectRadiusIndex`, `EffectRadiusIndexMax`, `EffectImplicitTargetA`, `EffectImplicitTargetB`, `EffectSpellId`, `EffectIndex`) VALUES +(155916, 28, 40927, 64, 12, 12, 18, 18, 76374, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_rajh_summon_meteor', +'spell_rajh_summon_sun_orb'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(76375, 'spell_rajh_summon_meteor'), +(76338, 'spell_rajh_summon_sun_orb'); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index e817393f951..f9b4d827585 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -80,6 +80,47 @@ void Vehicle::Install() _me->setPowerType(POWER_ENERGY); } + if (Creature* creature = _me->ToCreature()) + { + switch (_vehicleInfo->m_powerDisplayId) + { + case POWER_STEAM: + case POWER_HEAT: + case POWER_BLOOD: + case POWER_OOZE: + case POWER_WRATH: + case POWER_ARCANE_ENERGY: + case POWER_LIFE_ENERGY: + case POWER_SUN_ENERGY: + case POWER_SWING_VELOCITY: + case POWER_SHADOWFLAME_ENERGY: + case POWER_BLUE_POWER: + case POWER_PURPLE_POWER: + case POWER_GREEN_POWER: + case POWER_ORANGE_POWER: + case POWER_ELECTRICAL_ENERGY: + case POWER_ARCANE_ENERGY_2: + case POWER_FUEL: + case POWER_SUN_POWER: + case POWER_TWILIGHT_ENERGY: + _me->SetMaxPower(POWER_ENERGY, 100); + _me->SetPower(POWER_ENERGY, 100); + break; + case POWER_PYRITE: + _me->SetMaxPower(POWER_ENERGY, 50); + _me->SetPower(POWER_ENERGY, 50); + break; + case POWER_WIND_POWER_1: + case POWER_WIND_POWER_2: + case POWER_WIND_POWER_3: + _me->SetMaxPower(POWER_MANA, 90); + _me->SetPower(POWER_MANA, 90); + break; + default: + break; + } + } + _status = STATUS_INSTALLED; if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnInstall(this); diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index d22db46f05d..298d5b48324 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -42,8 +42,8 @@ enum PowerType POWER_PURPLE_POWER = 149, POWER_GREEN_POWER = 150, POWER_ORANGE_POWER = 151, - POWER_ENERGY_2 = 153, - POWER_ARCANEENERGY = 161, + POWER_ELECTRICAL_ENERGY = 153, + POWER_ARCANE_ENERGY_2 = 161, POWER_WIND_POWER_1 = 162, POWER_WIND_POWER_2 = 163, POWER_WIND_POWER_3 = 164, diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index c592fbae1ee..5cc8e72688a 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3626,6 +3626,15 @@ void SpellMgr::LoadSpellInfoCorrections() // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. spellInfo->AttributesEx8 |= SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; break; + // Rajh + case 89133: // Solar Fire + case 89878: // Solar Fire + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + break; + case 74108: // Solar Winds + case 89130: // Solar Winds + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + break; case 24314: // Threatening Gaze spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP; break; diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_rajh.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_rajh.cpp new file mode 100644 index 00000000000..4c279388cda --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_rajh.cpp @@ -0,0 +1,487 @@ +/* +* Copyright (C) 2008-2017 TrinityCore +* +* 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 . +*/ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "GridNotifiers.h" +#include "Player.h" +#include "ObjectAccessor.h" +#include "halls_of_origination.h" + +enum Spells +{ + // Rajh + SPELL_SOLAR_WINDS_DUMMY = 74104, + SPELL_SOLAR_WINDS_SUMMON = 74106, + SPELL_SUMMON_SUN_ORB = 80352, + SPELL_SUN_STRIKE = 73872, + SPELL_BLESSING_OF_THE_SUN = 76352, + SPELL_INFERNO_LEAP_DUMMY = 87650, + SPELL_INFERNO_LEAP_VEHICLE = 87653, + + // Solar Winds + SPELL_SOLAR_WINDS_PERIODIC = 74107, + + // Orb of the Sun + SPELL_SUMMON_METEOR = 76375, + SPELL_RIDE_VEHICLE = 43671, +}; + +enum Texts +{ + SAY_AGGRO = 0, + SAY_BLESSING_OF_THE_SUN = 1, + SAY_SLAY = 2, + SAY_DEATH = 3, +}; + +enum Events +{ + // Rajh + EVENT_SOLAR_WINDS = 1, + EVENT_SUMMON_SOLAR_WINDS, + EVENT_SUMMON_SUN_ORB, + EVENT_SUN_STRIKE, + EVENT_SUMMON_INFERNO_LEAP, + EVENT_INFERNO_LEAP, + EVENT_APPLY_IMMUNITY, + EVENT_MOVE_TO_MIDDLE, + EVENT_BLESSING_OF_THE_SUN, + EVENT_TALK_BLESSING, + EVENT_ATTACK, + + // Solar Winds + EVENT_GROW, + EVENT_START_MOVING, + EVENT_MOVE_ARROUND, + + // Orb of the Sun + EVENT_SUMMON_BLAZING_INFERNO, + EVENT_RIDE_VEHICLE, +}; + +enum Points +{ + POINT_RAJH_CENTER = 1, +}; + +enum AchievementData +{ + DATA_SUN_OF_A = 1, +}; + +Position const RajhMiddlePos = { -318.5936f, 192.8621f, 343.9443f }; + +class boss_rajh : public CreatureScript +{ +public: + boss_rajh() : CreatureScript("boss_rajh") { } + + struct boss_rajhAI : public BossAI + { + boss_rajhAI(Creature* creature) : BossAI(creature, DATA_RAJH) { } + + void Reset() override + { + _Reset(); + _energized = true; + _achievementEnabled = true; + me->SetReactState(REACT_PASSIVE); + me->SetPower(POWER_ENERGY, 100); + MakeInterruptable(false); + } + + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(EVENT_SOLAR_WINDS, Seconds(5)); + events.ScheduleEvent(EVENT_SUMMON_SUN_ORB, Seconds(10)); + events.ScheduleEvent(EVENT_SUMMON_INFERNO_LEAP, Seconds(14)); + events.ScheduleEvent(EVENT_SUN_STRIKE, Seconds(20)); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + + if (summon->GetEntry() == NPC_INFERNO_LEAP) + { + MakeInterruptable(true); + events.ScheduleEvent(EVENT_INFERNO_LEAP, 1); + events.ScheduleEvent(EVENT_APPLY_IMMUNITY, Seconds(1) + Milliseconds(500)); + } + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _EnterEvadeMode(); + summons.DespawnAll(); + MakeInterruptable(false); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _DespawnAtEvade(); + } + void OnSpellCastInterrupt(SpellInfo const* /*spell*/) override + { + MakeInterruptable(false); + events.CancelEvent(EVENT_APPLY_IMMUNITY); + } + + void MakeInterruptable(bool apply) + { + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, !apply); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, !apply); + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_SUN_OF_A: + return _achievementEnabled; + default: + break; + } + return 0; + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type != POINT_MOTION_TYPE) + return; + + switch (pointId) + { + case POINT_RAJH_CENTER: + events.ScheduleEvent(EVENT_BLESSING_OF_THE_SUN, 1); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (me->GetPower(POWER_ENERGY) <= 10 && _energized) + { + events.ScheduleEvent(EVENT_MOVE_TO_MIDDLE, 1000); + _energized = false; + } + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUN_STRIKE: + DoCastVictim(SPELL_SUN_STRIKE); + events.Repeat(Seconds(35), Seconds(37)); + break; + case EVENT_SOLAR_WINDS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + DoCast(target, SPELL_SOLAR_WINDS_DUMMY); + events.Repeat(Seconds(15), Seconds(21)); + events.ScheduleEvent(EVENT_SUMMON_SOLAR_WINDS, Seconds(1)); + } + break; + case EVENT_SUMMON_SOLAR_WINDS: + DoCastSelf(SPELL_SOLAR_WINDS_SUMMON); + break; + case EVENT_SUMMON_SUN_ORB: + MakeInterruptable(true); + me->StopMoving(); + DoCastSelf(SPELL_SUMMON_SUN_ORB); + events.Repeat(Seconds(35), Seconds(36)); + events.ScheduleEvent(EVENT_APPLY_IMMUNITY, Seconds(3)); + break; + case EVENT_APPLY_IMMUNITY: + MakeInterruptable(false); + break; + case EVENT_MOVE_TO_MIDDLE: + events.Reset(); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->ExitVehicle(); + me->GetMotionMaster()->MovePoint(POINT_RAJH_CENTER, RajhMiddlePos, true); + break; + case EVENT_BLESSING_OF_THE_SUN: + DoCastSelf(SPELL_BLESSING_OF_THE_SUN); + events.ScheduleEvent(EVENT_TALK_BLESSING, Seconds(1) + Milliseconds(500)); + events.ScheduleEvent(EVENT_ATTACK, Seconds(20)); + me->SetFacingTo(3.124139f); + break; + case EVENT_TALK_BLESSING: + Talk(SAY_BLESSING_OF_THE_SUN); + me->HandleEmoteCommand(EMOTE_STATE_READY_SPELL_OMNI); + break; + case EVENT_ATTACK: + _achievementEnabled = false; + _energized = true; + events.ScheduleEvent(EVENT_SOLAR_WINDS, Seconds(5)); + events.ScheduleEvent(EVENT_SUMMON_SUN_ORB, Seconds(10)); + events.ScheduleEvent(EVENT_SUMMON_INFERNO_LEAP, Seconds(14)); + events.ScheduleEvent(EVENT_SUN_STRIKE, Seconds(20)); + me->SetReactState(REACT_AGGRESSIVE); + break; + case EVENT_SUMMON_INFERNO_LEAP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_INFERNO_LEAP_DUMMY, true); + events.Repeat(Seconds(59), Seconds(60)); + break; + case EVENT_INFERNO_LEAP: + DoCastAOE(SPELL_INFERNO_LEAP_VEHICLE); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + bool _energized; + bool _achievementEnabled; + }; + CreatureAI* GetAI(Creature *creature) const override + { + return GetHallsOfOriginationAI(creature); + } +}; + +class npc_solar_winds : public CreatureScript +{ +public: + npc_solar_winds() : CreatureScript("npc_solar_winds") { } + + struct npc_solar_windsAI : public ScriptedAI + { + npc_solar_windsAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + me->SetWalk(true); + _events.ScheduleEvent(EVENT_GROW, Seconds(1)); + } + + void JustSummoned(Creature* summon) override + { + if (Creature* rajh = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_RAJH))) + rajh->AI()->JustSummoned(summon); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GROW: + me->SetObjectScale(1.0f); + _events.ScheduleEvent(EVENT_START_MOVING, Seconds(2)); + break; + case EVENT_START_MOVING: + DoCastSelf(SPELL_SOLAR_WINDS_PERIODIC, true); + _events.ScheduleEvent(EVENT_MOVE_ARROUND, 1); + break; + case EVENT_MOVE_ARROUND: + { + float o = me->GetOrientation() + frand(0.0f, float(M_PI * 2)); + float x = me->GetPositionX() + cos(o) * 20.0f; + float y = me->GetPositionY() + sin(o) * 20.0f; + float z = me->GetPositionZ(); + me->GetMotionMaster()->MovePoint(0, x, y, z, true); + _events.Repeat(Seconds(7)); + break; + } + default: + break; + } + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfOriginationAI(creature); + } +}; + +class npc_orb_of_the_sun : public CreatureScript +{ +public: + npc_orb_of_the_sun() : CreatureScript("npc_orb_of_the_sun") { } + + struct npc_orb_of_the_sunAI : public ScriptedAI + { + npc_orb_of_the_sunAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + _events.ScheduleEvent(EVENT_GROW, Seconds(1)); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GROW: + me->SetObjectScale(1.0f); + _events.ScheduleEvent(EVENT_SUMMON_BLAZING_INFERNO, Seconds(1)); + break; + case EVENT_SUMMON_BLAZING_INFERNO: + DoCastSelf(SPELL_SUMMON_METEOR); + _events.ScheduleEvent(EVENT_RIDE_VEHICLE, Seconds(2)); + break; + case EVENT_RIDE_VEHICLE: + if (Creature* inferno = me->FindNearestCreature(NPC_BLAZING_INFERNO, 100.0f, true)) + DoCast(inferno, SPELL_RIDE_VEHICLE, true); + break; + default: + break; + } + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfOriginationAI(creature); + } +}; + +class spell_rajh_summon_meteor : public SpellScriptLoader +{ +public: + spell_rajh_summon_meteor() : SpellScriptLoader("spell_rajh_summon_meteor") { } + + class spell_rajh_summon_meteor_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rajh_summon_meteor_SpellScript); + + void FilterTargets(std::list& targets) + { + Trinity::Containers::RandomResize(targets, 1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rajh_summon_meteor_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_rajh_summon_meteor_SpellScript(); + } +}; + +class spell_rajh_summon_sun_orb : public SpellScriptLoader +{ +public: + spell_rajh_summon_sun_orb() : SpellScriptLoader("spell_rajh_summon_sun_orb") { } + + class spell_rajh_summon_sun_orb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rajh_summon_sun_orb_SpellScript); + + void SetDestPosition(SpellEffIndex effIndex) + { + float x = GetExplTargetDest()->GetPositionX(); + float y = GetExplTargetDest()->GetPositionY(); + float z = 358.0276f; + + const_cast(GetExplTargetDest())->Relocate(x, y, z); + GetHitDest()->Relocate(x, y, z); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_rajh_summon_sun_orb_SpellScript::SetDestPosition, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rajh_summon_sun_orb_SpellScript(); + } +}; + +class achievement_sun_of_a : public AchievementCriteriaScript +{ +public: + achievement_sun_of_a() : AchievementCriteriaScript("achievement_sun_of_a") { } + + bool OnCheck(Player* /*source*/, Unit* target) + { + if (!target) + return false; + + if (target->GetMap()->IsHeroic()) + return target->GetAI()->GetData(DATA_SUN_OF_A); + + return false; + } +}; + +void AddSC_boss_rajh() +{ + new boss_rajh(); + new npc_solar_winds(); + new npc_orb_of_the_sun(); + new spell_rajh_summon_meteor(); + new spell_rajh_summon_sun_orb(); + new achievement_sun_of_a(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 811b4b8b14e..df765995b3a 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -71,6 +71,10 @@ enum HOOCreatures NPC_WATER_WARDEN = 39802, NPC_AIR_WARDEN = 39803, + BOSS_RAJH = 39378, + NPC_INFERNO_LEAP = 47040, + NPC_BLAZING_INFERNO = 40927, + WARDEN_ENTRY_DATA_DELTA = NPC_FIRE_WARDEN - DATA_FIRE_WARDEN, NPC_BRANN_BRONZEBEARD_0 = 39908, diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index a1dedff5fb0..fa8c2f77397 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -130,6 +130,9 @@ class instance_halls_of_origination : public InstanceMapScript case BOSS_ANRAPHET: AnraphetGUID = creature->GetGUID(); break; + case BOSS_RAJH: + RajhGUID = creature->GetGUID(); + break; } } @@ -164,6 +167,8 @@ class instance_halls_of_origination : public InstanceMapScript return BrannBronzebeardGUID; case DATA_ANRAPHET_GUID: return AnraphetGUID; + case DATA_RAJH: + return RajhGUID; } return ObjectGuid::Empty; @@ -225,6 +230,7 @@ class instance_halls_of_origination : public InstanceMapScript ObjectGuid AnraphetGUID; ObjectGuid AnraphetDoorGUID; ObjectGuid SunMirrorGUID; + ObjectGuid RajhGUID; uint32 _deadElementals; }; diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp index f1e0c58f11c..44ee0f251e5 100644 --- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -97,6 +97,7 @@ void AddSC_instance_halls_of_origination(); //Halls of Origination void AddSC_boss_temple_guardian_anhuur(); void AddSC_boss_earthrager_ptah(); void AddSC_boss_anraphet(); +void AddSC_boss_rajh(); void AddSC_vortex_pinnacle(); //Vortex Pinnacle void AddSC_instance_vortex_pinnacle(); void AddSC_boss_grand_vizier_ertan(); @@ -206,6 +207,7 @@ void AddKalimdorScripts() AddSC_boss_temple_guardian_anhuur(); AddSC_boss_earthrager_ptah(); AddSC_boss_anraphet(); + AddSC_boss_rajh(); AddSC_vortex_pinnacle(); AddSC_instance_vortex_pinnacle(); AddSC_boss_grand_vizier_ertan();