diff --git a/sql/updates/world/custom/custom_2018_06_10_00_world.sql b/sql/updates/world/custom/custom_2018_06_10_00_world.sql new file mode 100644 index 00000000000..182dd5c1ee7 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_06_10_00_world.sql @@ -0,0 +1,52 @@ +-- Template Updates +UPDATE `creature_template` SET `DamageModifier`= 80, `mingold`= 19000, `maxgold`= 21000 WHERE `entry`= 39425; +UPDATE `creature_template` SET `DamageModifier`= 80, `mingold`= 19000, `maxgold`= 21000 WHERE `entry`= 49262; + +-- Pit Viper snakes respawn in 30 seconds. +UPDATE `creature` SET `spawntimesecs`= 30 WHERE `map`= 644 AND `id`= 39444; + +-- broadcast text ids for Anhuur +UPDATE `creature_text` SET `BroadcastTextId`= 40968 WHERE `CreatureID`= 39425 AND `GroupID` = 2; +UPDATE `creature_text` SET `BroadcastTextId`= 50665 WHERE `CreatureID`= 39425 AND `GroupID` = 3; + +-- script names ("spell_anhuur_activate_beacons" rewritten into "spell_anhuur_handle_beacons") +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_anhuur_reverberating_hymn', +'spell_anhuur_activate_beacons', +'spell_anhuur_handle_beacons'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(75322, 'spell_anhuur_reverberating_hymn'), +(76599, 'spell_anhuur_handle_beacons'), +(76600, 'spell_anhuur_handle_beacons'); + +-- spell condition +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (76599, 76600); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 76599, 0, 0, 31, 0, 5, 207218, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'), +(13, 1, 76599, 0, 1, 31, 0, 5, 207219, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'), +(13, 1, 76599, 0, 2, 31, 0, 5, 203133, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'), +(13, 1, 76599, 0, 3, 31, 0, 5, 203136, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'), +(13, 1, 76600, 0, 0, 31, 0, 5, 207218, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'), +(13, 1, 76600, 0, 1, 31, 0, 5, 207219, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'), +(13, 1, 76600, 0, 2, 31, 0, 5, 203133, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'), +(13, 1, 76600, 0, 3, 31, 0, 5, 203136, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'); + +UPDATE `gameobject` SET `spawnMask`= 1 WHERE `guid` IN (220773, 220775); +UPDATE `gameobject` SET `spawnMask`= 2 WHERE `guid` IN (200969, 200968); + +-- Creature Pit Viper 39444 SAI +SET @ENTRY := 39444; +UPDATE `creature_template` SET `AIName`="SmartAI", `DamageModifier`= 5, `difficulty_entry_1`= 48891 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, 6, 0, 100, 0, 0, 0, 0, 0, 41, 6000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "On death - Self: Despawn in 6000 ms // "), +(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 5000, 5000, 6000, 7000, 11, 74538, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 5000 and 5000 ms (and later repeats every 6000 and 7000 ms) - Self: Cast spell 74538 on Victim // "); + +UPDATE `creature_template` SET `DamageModifier`= 5, `minlevel`= 85, `maxlevel`= 85, `exp`= 3, `faction`= 16 WHERE `entry`= 48891; + +-- Currency Loot +DELETE FROM `creature_onkill_reward` WHERE `creature_id` IN (39425, 49262); +INSERT INTO `creature_onkill_reward` (`creature_id`, `CurrencyId1`, `CurrencyCount1`) VALUES +(39425, 395, 3500), +(49262, 395, 7000); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index 7990ce57cac..355f9833dbc 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -34,7 +34,7 @@ enum Texts SAY_AGGRO = 0, SAY_SHIELD = 1, EMOTE_SHIELD = 2, - EMOTE_UNSHIELD = 3, + EMOTE_SHIELD_REMOVED = 3, SAY_KILL = 4, SAY_DEATH = 5 }; @@ -64,13 +64,7 @@ enum Spells SPELL_DEACTIVATE_BEACONS = 76600, // Cave In Stalker (eyes) - SPELL_BURNING_LIGHT_SEAR = 75194, - - // Cave In Stalker (beacons) - SPELL_SHIELD_VISUAL_LEFT = 83697, - SPELL_SHIELD_VISUAL_RIGHT = 83698, - SPELL_BEAM_OF_LIGHT_LEFT = 74930, - SPELL_BEAM_OF_LIGHT_RIGHT = 76573 + SPELL_BURNING_LIGHT_SEAR = 75194 }; enum Phases @@ -109,13 +103,8 @@ public: { Initialize(); _Reset(); - CleanStalkers(); me->MakeInterruptable(false); - me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); DoCastAOE(SPELL_DEACTIVATE_BEACONS, true); - me->SetReactState(REACT_AGGRESSIVE); - events.SetPhase(PHASE_FIGHT); - ScheduleEvents(); } void DamageTaken(Unit* /*attacker*/, uint32& damage) override @@ -136,16 +125,24 @@ public: void DoAction(int32 action) override { - if (action == ACTION_DISABLE_BEACON_L) - _leftBeaconDisabled = true; - else if (action == ACTION_DISABLE_BEACON_R) - _rightBeaconDisabled = true; - else if (action == ACTION_HYMN_EXPIRED) // We manually deactivate beacons. - DoCastAOE(SPELL_DEACTIVATE_BEACONS, true); + switch (action) + { + case ACTION_DISABLE_BEACON_L: + _leftBeaconDisabled = true; + break; + case ACTION_DISABLE_BEACON_R: + _rightBeaconDisabled = true; + break; + case ACTION_HYMN_EXPIRED: + RemoveShieldOfLight(); + break; + default: + break; + } // Exit shield phase if both beacons are disabled or channeling Reverberating Hymn finished. - if ((_leftBeaconDisabled && _rightBeaconDisabled) || action == ACTION_HYMN_EXPIRED) - ExitShieldPhase(); + if (_leftBeaconDisabled && _rightBeaconDisabled) + RemoveShieldOfLight(); } void JustEngagedWith(Unit* /*who*/) override @@ -153,9 +150,12 @@ public: instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); Talk(SAY_AGGRO); _JustEngagedWith(); + events.SetPhase(PHASE_FIGHT); + events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT); instance->DoUpdateWorldState(WS_I_HATE_THIS_SONG, 0); - sWorld->setWorldState(WS_I_HATE_THIS_SONG, 0); // To-do: make InstanceScript::DoUpdateWorldState do the World::setWorldState. + sWorld->setWorldState(WS_I_HATE_THIS_SONG, 0); } void JustDied(Unit* /*killer*/) override @@ -175,6 +175,7 @@ public: { DoCastAOE(SPELL_DEACTIVATE_BEACONS, true); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, NOT_STARTED); _EnterEvadeMode(); _DespawnAtEvade(); } @@ -186,8 +187,9 @@ public: if (spell->Id == SPELL_REVERBERATING_HYMN) { events.CancelEvent(EVENT_ACHIEVEMENT_FAILED); - DoAction(ACTION_HYMN_EXPIRED); - ScheduleEvents(); + events.SetPhase(PHASE_FIGHT); + events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT); } } @@ -224,8 +226,8 @@ public: break; case EVENT_CAST_SHIELD: me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT); - me->SetFacingTo(1.5708f); // Sniffs set it again - DoCastSelf(SPELL_SHIELD_OF_LIGHT); // Note: stun! + me->SetFacingTo(1.5708f); + DoCastSelf(SPELL_SHIELD_OF_LIGHT); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31); events.ScheduleEvent(EVENT_ACTIVATE_BEACONS, Seconds(2), 0, PHASE_SHIELD); break; @@ -233,16 +235,16 @@ public: Talk(EMOTE_SHIELD); DoCastAOE(SPELL_ACTIVATE_BEACONS, true); DoCastSelf(SPELL_REVERBERATING_HYMN); - HandleVisuals(SPELL_SHIELD_VISUAL_LEFT, SPELL_SHIELD_VISUAL_RIGHT, true); + instance->SetData(DATA_HANDLE_SHIELD_VISUAL, IN_PROGRESS); events.ScheduleEvent(EVENT_CAST_BEAMS, Seconds(1), 0, PHASE_SHIELD); events.ScheduleEvent(EVENT_ACHIEVEMENT_FAILED, Seconds(15), 0, PHASE_SHIELD); break; case EVENT_CAST_BEAMS: - HandleVisuals(SPELL_BEAM_OF_LIGHT_LEFT, SPELL_BEAM_OF_LIGHT_RIGHT, true); + instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, IN_PROGRESS); break; - case EVENT_ACHIEVEMENT_FAILED: // Happens on normal too, heroic check is in dbc. + case EVENT_ACHIEVEMENT_FAILED: instance->DoUpdateWorldState(WS_I_HATE_THIS_SONG, 1); - sWorld->setWorldState(WS_I_HATE_THIS_SONG, 1); // To-do: make InstanceScript::DoUpdateWorldState do the World::setWorldState. + sWorld->setWorldState(WS_I_HATE_THIS_SONG, 1); break; default: break; @@ -256,15 +258,6 @@ public: DoMeleeAttackIfReady(); } - private: - void ScheduleEvents() - { - events.Reset(); - events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT); - events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT); - } - - // To-do: Ideal for a custom spell. void HandleSearingLight() { Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f); @@ -294,7 +287,7 @@ public: void EnterShieldPhase() { events.SetPhase(PHASE_SHIELD); - ++_countShield; + _countShield++; _leftBeaconDisabled = false; _rightBeaconDisabled = false; @@ -308,42 +301,14 @@ public: events.ScheduleEvent(EVENT_CAST_SHIELD, Seconds(1), 0, PHASE_SHIELD); } - void ExitShieldPhase() + void RemoveShieldOfLight() { - CleanStalkers(); + instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, NOT_STARTED); // includes whole aura removal me->MakeInterruptable(true); me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); me->SetReactState(REACT_AGGRESSIVE); - Talk(EMOTE_UNSHIELD); - events.SetPhase(PHASE_FIGHT); - } - - void CleanStalkers() - { - HandleVisuals(SPELL_SHIELD_VISUAL_LEFT, SPELL_SHIELD_VISUAL_RIGHT, false); - HandleVisuals(SPELL_BEAM_OF_LIGHT_LEFT, SPELL_BEAM_OF_LIGHT_RIGHT, false); - } - - void HandleVisuals(uint32 leftSpellId, uint32 rightSpellId, bool apply) - { - std::list stalkers; - GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); - for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) - { - // Target only the bottom stalkers (Y: 65.392f and 64.9004f) - if ((*itr)->GetPositionZ() > 70.f) - return; - - // Left stalker X: -603.465f; right stalker X: -678.132f - uint32 spellId = ((*itr)->GetPositionX() > -640.0f) ? leftSpellId : rightSpellId; - if (apply) - (*itr)->CastSpell((*itr), spellId, true); - else - { - (*itr)->InterruptNonMeleeSpells(true, spellId); - (*itr)->RemoveAurasDueToSpell(spellId); - } - } + DoCastAOE(SPELL_DEACTIVATE_BEACONS, true); + Talk(EMOTE_SHIELD_REMOVED); } uint8 _countShield; @@ -394,7 +359,6 @@ public: // 74930 - Shield of Light (left) // 76573 - Shield of Light (right) - class spell_anhuur_shield_of_light : public SpellScriptLoader { public: @@ -406,16 +370,14 @@ class spell_anhuur_shield_of_light : public SpellScriptLoader void FilterTargets(std::list& targets) { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - { - if (GameObject* go = instance->GetGameObject(DATA_ANHUUR_DOOR)) - { - targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false)); - targets.remove(GetCaster()); - targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster())); - targets.resize(2); - } - } + if (targets.empty()) + return; + + targets.remove(GetCaster()); + targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster())); + + if (targets.size() > 2) + targets.resize(2); } void Register() override diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index d21858555f0..912653746b1 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -43,6 +43,8 @@ enum HOOData // Temple Guardian Anhuur DATA_ANHUUR_DOOR, + DATA_HANDLE_SHIELD_VISUAL, + DATA_HANDLE_BEAM_OF_LIGHT, // Anraphet DATA_BRANN_0, @@ -194,7 +196,13 @@ enum HOOMisc SPELL_TELEPORT_EARTH = 82329, // South-West SPELL_TELEPORT_AIR = 82330, // South-East SPELL_TELEPORT_FIRE = 82331, // North-West - SPELL_TELEPORT_WATER = 82332 // North-East + SPELL_TELEPORT_WATER = 82332, // North-East + + // Cave In Stalker (beacons) + SPELL_SHIELD_VISUAL_LEFT = 83697, + SPELL_SHIELD_VISUAL_RIGHT = 83698, + SPELL_BEAM_OF_LIGHT_LEFT = 74930, + SPELL_BEAM_OF_LIGHT_RIGHT = 76573 }; enum HOOGlobalActions 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 be86a256e84..f4e7af44341 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -102,8 +102,8 @@ class instance_halls_of_origination : public InstanceMapScript switch (go->GetEntry()) { - case GO_HOO_TRANSIT_DEVICE: // 5 spawns - case GO_HOO_TRANSIT_DEVICE_2: // 1 spawn: elevator + case GO_HOO_TRANSIT_DEVICE: + case GO_HOO_TRANSIT_DEVICE_2: _transitDeviceGUIDs.insert(go->GetGUID()); UpdateTransitDevice(go); break; @@ -203,6 +203,9 @@ class instance_halls_of_origination : public InstanceMapScript case NPC_ALPHA_BEAM: if (Creature* anraphet = GetCreature(DATA_ANRAPHET)) anraphet->AI()->JustSummoned(creature); + case NPC_CAVE_IN_STALKER: + if (creature->GetPositionZ() <= 70.0f) + _caveInStalkerGUIDs.insert(creature->GetGUID()); default: break; } @@ -227,6 +230,40 @@ class instance_halls_of_origination : public InstanceMapScript case DATA_ISISET_VEIL_OF_SKY_ALIVE: _isisetVeilOfSkyAlive = value; break; + case DATA_HANDLE_SHIELD_VISUAL: + for (ObjectGuid guid : _caveInStalkerGUIDs) + { + if (Creature* stalker = instance->GetCreature(guid)) + { + if (value == IN_PROGRESS) + { + if (stalker->GetPositionX() > -640.0f) + stalker->CastSpell(stalker, SPELL_SHIELD_VISUAL_LEFT, true); + else + stalker->CastSpell(stalker, SPELL_SHIELD_VISUAL_RIGHT, true); + } + } + } + break; + case DATA_HANDLE_BEAM_OF_LIGHT: + for (ObjectGuid guid : _caveInStalkerGUIDs) + { + if (Creature* stalker = instance->GetCreature(guid)) + { + if (value == IN_PROGRESS) + { + if (stalker->GetPositionX() > -640.0f) + stalker->CastSpell(stalker, SPELL_BEAM_OF_LIGHT_LEFT, true); + else + stalker->CastSpell(stalker, SPELL_BEAM_OF_LIGHT_RIGHT, true); + } + else + stalker->RemoveAllAuras(); + } + } + break; + default: + break; } }