From 03eaa132eadd838e56bcce5444cda631e60ffa4b Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 30 Jul 2018 15:10:45 +0200 Subject: [PATCH] Scripts/BrC: implement first two bridge events for Raz the Crazed *todo: fix fking escortAI to work properly... --- .../custom/custom_2018_07_30_01_world.sql | 23 ++ src/server/game/Spells/SpellMgr.cpp | 6 + .../BlackrockCaverns/blackrock_caverns.cpp | 212 ++++++++++++++---- .../BlackrockCaverns/blackrock_caverns.h | 25 ++- .../boss_romogg_bonecrusher.cpp | 1 + .../instance_blackrock_caverns.cpp | 53 ++++- 6 files changed, 272 insertions(+), 48 deletions(-) create mode 100644 sql/updates/world/custom/custom_2018_07_30_01_world.sql diff --git a/sql/updates/world/custom/custom_2018_07_30_01_world.sql b/sql/updates/world/custom/custom_2018_07_30_01_world.sql new file mode 100644 index 00000000000..076b222a3db --- /dev/null +++ b/sql/updates/world/custom/custom_2018_07_30_01_world.sql @@ -0,0 +1,23 @@ +DELETE FROM `conditions` WHERE `SourceEntry` IN (80340, 80196) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 80340, 0, 0, 31, 0, 3, 39978, 0, 0, 0, '', 'Furious Swipe - Target Twilight Torturer'), +(13, 1, 80340, 0, 1, 31, 0, 3, 39980, 0, 0, 0, '', 'Furious Swipe - Target Twilight Sadist'), +(13, 1, 80340, 0, 2, 31, 0, 3, 39982, 0, 0, 0, '', 'Furious Swipe - Target Crazed Mage'), +(13, 1, 80340, 0, 3, 31, 0, 3, 39987, 0, 0, 0, '', 'Furious Swipe - Target Evolved Twilight Zealot'), +(13, 1, 80340, 0, 4, 31, 0, 3, 39708, 0, 0, 0, '', 'Furious Swipe - Target Twilight Flame Caller'), +(13, 1, 80340, 0, 5, 31, 0, 3, 39990, 0, 0, 0, '', 'Furious Swipe - Target Twilight Zealot'), +(13, 1, 80340, 0, 5, 31, 0, 3, 40017, 0, 0, 0, '', 'Furious Swipe - Target Twilight Element Warden'), +(13, 1, 80340, 0, 6, 31, 0, 3, 39985, 0, 0, 0, '', 'Furious Swipe - Target Mad Prisoner'), +(13, 1, 80196, 0, 0, 31, 0, 3, 39978, 0, 0, 0, '', 'Aggro Nearby Targets - Target Twilight Torturer'), +(13, 1, 80196, 0, 1, 31, 0, 3, 39980, 0, 0, 0, '', 'Aggro Nearby Targets - Target Twilight Sadist'), +(13, 1, 80196, 0, 2, 31, 0, 3, 39982, 0, 0, 0, '', 'Aggro Nearby Targets - Target Crazed Mage'), +(13, 1, 80196, 0, 3, 31, 0, 3, 39987, 0, 0, 0, '', 'Aggro Nearby Targets - Target Evolved Twilight Zealot'), +(13, 1, 80196, 0, 4, 31, 0, 3, 39708, 0, 0, 0, '', 'Aggro Nearby Targets - Target Twilight Flame Caller'), +(13, 1, 80196, 0, 5, 31, 0, 3, 39990, 0, 0, 0, '', 'Aggro Nearby Targets - Target Twilight Zealot'), +(13, 1, 80196, 0, 5, 31, 0, 3, 40017, 0, 0, 0, '', 'Aggro Nearby Targets - Target Twilight Element Warden'), +(13, 1, 80196, 0, 5, 31, 0, 3, 39985, 0, 0, 0, '', 'Aggro Nearby Targets - Target Mad Prisoner'); + +-- Areatriggers +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (6014); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(6014, 'at_raz_corla_event'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 6ed5223b83a..12fad095078 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4604,6 +4604,12 @@ void SpellMgr::LoadSpellInfoCorrections() { spellInfo->MaxAffectedTargets = 3; }); + + // Furious Swipe + ApplySpellFix({ 80340 }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(7); // 10yd + }); // ENDOF BLACKROCK CAVERNS SPELLS // diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp index 58b2bc17a3e..3e032bbac8d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp @@ -19,6 +19,7 @@ #include "blackrock_caverns.h" #include "Player.h" #include "ScriptedCreature.h" +#include "ScriptedEscortAI.h" #include "Spell.h" #include "SpellAuras.h" #include "SpellScript.h" @@ -523,74 +524,180 @@ private: enum RazTheCrazed { - SAY_SMASH = 0, - SPELL_AGGRO_NEARBY_TARGETS = 80196, - SPELL_SHADOW_PRISON = 79725, - SPELL_LEAP_FROM_CAGE = 79720, - SPELL_FURIOUS_SWIPE = 80206, - SPELL_LEAP_FROM_BRIDGE = 80273, - TYPE_RAZ = 1, - DATA_ROMOGG_DEAD = 1, - EVENT_AGGO_NEARBY_TARGETS = 19, - EVENT_START_FIRST_PATH = 20, - EVENT_FURIOUS_SWIPE = 21 + // Texts + SAY_SMASH = 0, + + // Spells + SPELL_AGGRO_NEARBY_TARGETS = 80189, + SPELL_HIGH_SECURITY_SHADOW_PRISON = 79725, + SPELL_LEAP_FROM_CAGE = 79720, + SPELL_LEAP_FROM_BRIDGE = 80273, + SPELL_LEAP_FROM_LEDGE = 80300, + SPELL_LEAP_OVER_BORER_PACKS = 80305, + SPELL_LEAP_AT_OBSIDIUS = 80320, + SPELL_FURIOUS_SWIPE = 80206, + SPELL_FURIOUS_SWIPE_DUMMY = 80340, + SPELL_FURIOUS_RAGE = 80218, + + EVENT_DISABLE_GRAVITY_AND_HOVER = 1, + EVENT_SAY_SMASH, + EVENT_START_ESCORT_PATH, + EVENT_FACE_TO_THE_SIDE, + EVENT_LEAP_FROM_BRIDGE, + EVENT_LEAP_FROM_LEDGE, + EVENT_LEAP_OVER_BORER_PACKS, + EVENT_RESUME_ESCORT }; -struct npc_raz_the_crazed : public ScriptedAI +Position const RazPathRomogg[] = { - npc_raz_the_crazed(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + { 208.311f, 946.102f, 191.0072f }, + { 216.6545f, 913.2952f, 190.9795f }, + { 230.5486f, 910.7917f, 191.057f }, + { 242.2326f, 905.5382f, 190.97f }, + { 255.8333f, 910.5886f, 191.0629f }, + { 268.3038f, 918.5191f, 190.9722f }, + { 288.9861f, 949.3038f, 190.8299f }, + { 314.5087f, 949.7239f, 191.1788f }, + { 345.4254f, 948.5174f, 190.9669f }, + { 375.7309f, 949.0417f, 192.2794f }, + { 398.0313f, 945.6302f, 193.3367f }, + { 470.9601f, 905.092f, 165.8345f } +}; - void Reset() override { } +Position const RazPathCorla[] = +{ + { 283.8698f, 817.0018f, 99.45939f }, + { 273.4479f, 816.1007f, 95.95034f } +}; - void JustEngagedWith(Unit* /*who*/) override +struct npc_raz_the_crazed : public npc_escortAI +{ + npc_raz_the_crazed(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) { - _events.Reset(); - _events.ScheduleEvent(SPELL_FURIOUS_SWIPE, 500); + SetCombatMovement(false); } - void IsSummonedBy(Unit* summoner) override + void EnterEvadeMode(EvadeReason /*why*/) override { - me->SetDisableGravity(true); - DoCast(me, SPELL_SHADOW_PRISON); - _events.ScheduleEvent(EVENT_AGGO_NEARBY_TARGETS, 1000); + me->DeleteThreatList(); + me->CombatStop(true); + ReturnToLastPoint(); } - void SetData(uint32 id, uint32 data) override + void JustAppeared() override { - if (id == TYPE_RAZ && data == DATA_ROMOGG_DEAD) + if (_instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_ROMOGG) { - me->RemoveAura(SPELL_SHADOW_PRISON); - me->SetDisableGravity(false); - DoCast(me, SPELL_LEAP_FROM_CAGE); - _events.ScheduleEvent(EVENT_START_FIRST_PATH, 3000); + me->SetDisableGravity(true); + me->SetHover(true); + DoCastSelf(SPELL_HIGH_SECURITY_SHADOW_PRISON, true); + } + else if (_instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_CORLA) + { + _events.ScheduleEvent(EVENT_LEAP_FROM_LEDGE, 2s); + BuildCorlaPath(); + } + + DoCastSelf(SPELL_AGGRO_NEARBY_TARGETS, true); + } + + void DoAction(int32 action) override + { + if (action == ACTION_BREAK_OUT_OF_PRISON) + { + me->RemoveAurasDueToSpell(SPELL_HIGH_SECURITY_SHADOW_PRISON); + DoCastSelf(SPELL_LEAP_FROM_CAGE); + BuildRomoggPath(); + _events.ScheduleEvent(EVENT_DISABLE_GRAVITY_AND_HOVER, 2s + 500ms); + _events.ScheduleEvent(EVENT_START_ESCORT_PATH, 4s); + _events.ScheduleEvent(EVENT_SAY_SMASH, 4s); } } - void UpdateAI(uint32 diff) override + void BuildRomoggPath() { + for (uint8 i = 0; i < 12; i++) + AddWaypoint(i, RazPathRomogg[i].GetPositionX(), RazPathRomogg[i].GetPositionY(), RazPathRomogg[i].GetPositionZ()); + } + + void BuildCorlaPath() + { + for (uint8 i = 0; i < 2; i++) + AddWaypoint(i, RazPathCorla[i].GetPositionX(), RazPathCorla[i].GetPositionY(), RazPathCorla[i].GetPositionZ()); + } + + void WaypointReached(uint32 id) override + { + if (id == 10 && _instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_ROMOGG) + { + SetEscortPaused(true); + _events.ScheduleEvent(EVENT_FACE_TO_THE_SIDE, 1s); + _events.ScheduleEvent(EVENT_LEAP_FROM_BRIDGE, 2s); + _events.ScheduleEvent(EVENT_RESUME_ESCORT, 2s + 500ms); + me->DespawnOrUnsummon(12s); + } + else if (id == 1 && _instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_CORLA) + _events.ScheduleEvent(EVENT_LEAP_OVER_BORER_PACKS, 1s); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) override + { + if (!target) + return; + + if (!target->IsInCombatWith(me)) + return; + + if (spell->Id == SPELL_FURIOUS_SWIPE_DUMMY) + { + DoCast(target, SPELL_FURIOUS_SWIPE); + DoCastSelf(SPELL_FURIOUS_RAGE, true); + } + } + + void UpdateEscortAI(uint32 diff) override + { + UpdateVictim(); + _events.Update(diff); while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { - case EVENT_AGGO_NEARBY_TARGETS: - DoCast(me, SPELL_AGGRO_NEARBY_TARGETS); - _events.ScheduleEvent(EVENT_AGGO_NEARBY_TARGETS, 1500); - break; - case EVENT_START_FIRST_PATH: - Talk(SAY_SMASH); - break; - case EVENT_FURIOUS_SWIPE: - DoCastVictim(SPELL_FURIOUS_SWIPE, true); - _events.ScheduleEvent(SPELL_FURIOUS_SWIPE, 500); - break; - default: - break; + case EVENT_DISABLE_GRAVITY_AND_HOVER: + me->SetDisableGravity(false); + me->SetHover(false); + break; + case EVENT_SAY_SMASH: + Talk(SAY_SMASH); + break; + case EVENT_START_ESCORT_PATH: + Start(false, false); + break; + case EVENT_FACE_TO_THE_SIDE: + me->SetFacingTo(5.061455f); + break; + case EVENT_LEAP_FROM_BRIDGE: + DoCastSelf(SPELL_LEAP_FROM_BRIDGE); + break; + case EVENT_RESUME_ESCORT: + SetEscortPaused(false); + break; + case EVENT_LEAP_FROM_LEDGE: + DoCastSelf(SPELL_LEAP_FROM_LEDGE); + _events.ScheduleEvent(EVENT_SAY_SMASH, 1s); + _events.ScheduleEvent(EVENT_START_ESCORT_PATH, 2s); + break; + case EVENT_LEAP_OVER_BORER_PACKS: + DoCastSelf(SPELL_LEAP_OVER_BORER_PACKS); + me->DespawnOrUnsummon(2s); + break; + default: + break; } } - - DoMeleeAttackIfReady(); } private: @@ -598,9 +705,25 @@ private: InstanceScript* _instance; }; +class at_raz_corla_event : public AreaTriggerScript +{ + public: + at_raz_corla_event() : AreaTriggerScript("at_raz_corla_event") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_ROMOGG + && instance->GetBossState(DATA_CORLA_HERALD_OF_TWILIGHT) == DONE) + instance->SetData(DATA_RAZ_LAST_AREA_INDEX, RAZ_AREA_INDEX_CORLA); + + return true; + + } +}; + void AddSC_blackrock_caverns() { - // Creature Scripts RegisterBlackrockCavernsCreatureAI(npc_fire_cyclone); RegisterBlackrockCavernsCreatureAI(npc_twilight_flame_caller); RegisterBlackrockCavernsCreatureAI(npc_twilight_torturer); @@ -608,4 +731,5 @@ void AddSC_blackrock_caverns() RegisterBlackrockCavernsCreatureAI(npc_mad_prisoner); RegisterBlackrockCavernsCreatureAI(npc_crazed_mage); RegisterBlackrockCavernsCreatureAI(npc_raz_the_crazed); + new at_raz_corla_event(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h index 71b4c275727..be94618d072 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h @@ -34,10 +34,11 @@ enum BRCDataTypes DATA_BEAUTY = 3, DATA_ASCENDANT_LORD_OBSIDIUS = 4, - // Additional Objects + // Additional Data DATA_RAZ_THE_CRAZED = 5, - DATA_LUCKY = 6, - DATA_SPOT = 7 + DATA_RAZ_LAST_AREA_INDEX = 6, + DATA_LUCKY = 7, + DATA_SPOT = 8 }; enum BRCCreatureIds @@ -70,6 +71,24 @@ enum BRCCreatureIds NPC_SPOT = 40011 }; +enum BRCActions +{ + ACTION_BREAK_OUT_OF_PRISON = 0 +}; + +enum BRCRazAreaIndex +{ + RAZ_AREA_INDEX_ROMOGG = 0, + RAZ_AREA_INDEX_CORLA = 1, + RAZ_AREA_INDEX_OBSIDIUS = 2 +}; + +Position const RazTheCrazedSummonPositions[] = +{ + { 249.2639f, 949.1614f, 191.7866f, 3.141593f }, + { 406.1927f, 906.0121f, 163.4926f, 4.310963f } +}; + template inline AI* GetBlackrockCavernsAI(T* obj) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp index 5a6b037f86a..0d266c035c6 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp @@ -99,6 +99,7 @@ struct boss_romogg_bonecrusher : public BossAI void Reset() override { _Reset(); + instance->SetData(DATA_RAZ_LAST_AREA_INDEX, RAZ_AREA_INDEX_ROMOGG); Initialize(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp index a0f4eac1af2..98a2956758f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp @@ -34,17 +34,23 @@ ObjectData const creatureData[] = class instance_blackrock_caverns : public InstanceMapScript { public: - instance_blackrock_caverns(): InstanceMapScript(BCScriptName, 645) { } + instance_blackrock_caverns(): InstanceMapScript(BCScriptName, 645) { } struct instance_blackrock_caverns_InstanceMapScript : public InstanceScript { instance_blackrock_caverns_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { + Initialize(); SetHeaders(DataHeader); SetBossNumber(EncounterCount); LoadObjectData(creatureData, nullptr); } + void Initialize() + { + _lastRazAreaIndex = RAZ_AREA_INDEX_ROMOGG; + } + bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) @@ -53,6 +59,9 @@ class instance_blackrock_caverns : public InstanceMapScript switch (type) { case DATA_ROMOGG_BONECRUSHER: + if (state == DONE) + if (Creature* raz = GetCreature(DATA_RAZ_THE_CRAZED)) + raz->AI()->DoAction(ACTION_BREAK_OUT_OF_PRISON); case DATA_CORLA_HERALD_OF_TWILIGHT: case DATA_KARSH_STEELBENDER: case DATA_BEAUTY: @@ -84,6 +93,48 @@ class instance_blackrock_caverns : public InstanceMapScript break; } } + + uint32 GetData(uint32 type) const override + { + if (type == DATA_RAZ_LAST_AREA_INDEX) + return _lastRazAreaIndex; + + return 0; + } + + void SetData(uint32 type, uint32 data) override + { + if (type == DATA_RAZ_LAST_AREA_INDEX) + { + _lastRazAreaIndex = data; + + switch (data) + { + case RAZ_AREA_INDEX_ROMOGG: + if (!GetCreature(DATA_RAZ_THE_CRAZED)) + instance->SummonCreature(NPC_RAZ_THE_CRAZED, RazTheCrazedSummonPositions[RAZ_AREA_INDEX_ROMOGG]); + break; + case RAZ_AREA_INDEX_CORLA: + instance->SummonCreature(NPC_RAZ_THE_CRAZED, RazTheCrazedSummonPositions[RAZ_AREA_INDEX_CORLA]); + break; + default: + break; + } + } + } + + void WriteSaveDataMore(std::ostringstream& data) override + { + data << _lastRazAreaIndex; + } + + void ReadSaveDataMore(std::istringstream& data) override + { + data >> _lastRazAreaIndex; + } + + private: + uint8 _lastRazAreaIndex; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override