From 81d1fcad6512debdd4205703ed9adae3227fe3c4 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sun, 1 Dec 2024 12:52:44 +0100 Subject: [PATCH] fix(Scripts/ZulAman): eagle gauntlet (#20719) * sql * add script handling https://github.com/cmangos/mangos-wotlk/commit/4b890a4096153686f97c0faa3f6196b27205cc8a Co-authored-by: MantisLord * set Akilzon call for help boss should pull trash * style: remove blank lines * add passiveAI header and sort * Revert "set Akilzon call for help" This reverts commit 99143339a9f00f048d9bc707d5b8d348e8f6bbd4. line of sight blocks call for help --------- Co-authored-by: MantisLord --- .../rev_1732461302175126777.sql | 55 ++++++ .../ZulAman/instance_zulaman.cpp | 91 +++++++++- .../EasternKingdoms/ZulAman/zulaman.cpp | 160 +++++++++++++++++- .../scripts/EasternKingdoms/ZulAman/zulaman.h | 13 +- 4 files changed, 312 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1732461302175126777.sql diff --git a/data/sql/updates/pending_db_world/rev_1732461302175126777.sql b/data/sql/updates/pending_db_world/rev_1732461302175126777.sql new file mode 100644 index 000000000..4b3fa0b63 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1732461302175126777.sql @@ -0,0 +1,55 @@ +-- +-- lookout +-- spawn coords, hp 58682 from 75449 +DELETE FROM `creature` WHERE (`id1` = 24175) AND (`guid` = 89281); +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(89281, 24175, 0, 0, 568, 0, 0, 1, 1, 1, 206.92128, 1473.4196, 26.000067, 3.9619, 7200, 0, 0, 58682, 0, 0, 0, 0, 0, '', 0); + +UPDATE `creature_template` SET `unit_flags` = `unit_flags` | (64 | 32768) WHERE (`entry` = 24175); + +UPDATE `creature_template_model` SET `VerifiedBuild` = 53788 WHERE (`CreatureID` = 24175) AND `Idx` = 0; + +DELETE FROM `waypoint_data` WHERE `id` = 2417500; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `move_type`) VALUES +(2417500, 1, 226.08507, 1461.7535, 25.916739, NULL, 1), +(2417500, 2, 228.17633, 1433.8473, 27.119087, NULL, 1), +(2417500, 3, 227.73102, 1412.5535, 34.49932, NULL, 1), +(2417500, 4, 228.17111, 1388.2885, 42.451878, NULL, 1), +(2417500, 5, 232.54265, 1374.3815, 47.329865, NULL, 1), +(2417500, 6, 263.18665, 1376.4918, 49.32171, NULL, 1), +(2417500, 7, 281.35666, 1378.9646, 49.32171, NULL, 1), +(2417500, 8, 312.53738, 1389.2349, 57.287518, NULL, 1), +(2417500, 9, 330.47836, 1394.2004, 71.362785, NULL, 1); + +-- summon amani eagle at Akil'zon +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 43487); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 43487, 0, 0, 31, 0, 3, 23574, 0, 0, 0, 0, '', 'Summon Amani Eagle target Akil\'zon'); + +-- summon amani warrior at Eagle Troll Spawn Target +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 43486); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 43486, 0, 0, 31, 0, 3, 24325, 0, 0, 0, 0, '', 'Summon Amani Eagle target Eagle Troll Spawn Target'); + +DELETE FROM `creature_text` WHERE (`CreatureID` = 24175) AND (`GroupID` = 0); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(24175, 0, 0, 'Akil\'zon, the invaders approach!', 14, 0, 100, 5, 0, 0, 22971, 0, 'Amani\'shi Lookout'); + +UPDATE `creature_template` SET `ScriptName` = 'npc_amanishi_lookout' WHERE (`entry` = 24175); +UPDATE `creature_template` SET `ScriptName` = 'npc_eagle_trash_aggro_trigger' WHERE (`entry` = 24223); +UPDATE `creature_template` SET `ScriptName` = 'npc_amanishi_tempest' WHERE (`entry` = 24549); + +-- add missing wind walker and protector spawns +SET @GUID:= 93762; +SET @VERIFIED_BUILD:=0; +DELETE FROM `creature` WHERE (`id1` = 24179) AND (`guid` BETWEEN @GUID+0 AND @GUID+3); +DELETE FROM `creature` WHERE (`id1` = 24180) AND (`guid` BETWEEN @GUID+4 AND @GUID+7); +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(@GUID+0, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 284.0440, 1372.3200, 49.4050, 2.77507, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+1, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 231.7970, 1393.4200, 40.5887, 1.69297, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+2, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 244.8070, 1367.6600, 48.9498, 2.61799, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+3, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 232.7490, 1428.7000, 28.8242, 1.83260, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+4, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 274.3580, 1385.1600, 49.4050, 3.75246, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+5, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 223.8010, 1424.9400, 29.4699, 1.16937, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+6, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 224.0690, 1394.2600, 40.1985, 1.30900, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0), +(@GUID+7, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 246.9080, 1375.1500, 49.4050, 2.89725, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 6d5663877..bfc5ddf2f 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -59,10 +59,11 @@ DoorData const doorData[] = ObjectData const creatureData[] = { - { NPC_JANALAI, DATA_JANALAI }, - { NPC_SPIRIT_LYNX, DATA_SPIRIT_LYNX }, - { NPC_HARRISON_JONES, DATA_HARRISON_JONES }, - { 0, 0 } + { NPC_JANALAI, DATA_JANALAI }, + { NPC_SPIRIT_LYNX, DATA_SPIRIT_LYNX }, + { NPC_HARRISON_JONES, DATA_HARRISON_JONES }, + { NPC_AMINISHI_LOOKOUT, DATA_LOOKOUT }, + { 0, 0 } }; ObjectData const gameObjectData[] = @@ -113,6 +114,29 @@ public: DoAction(ACTION_START_TIMED_RUN); } + void OnCreatureCreate(Creature* creature) override + { + switch (creature->GetEntry()) + { + // Akil'zon gauntlet + case NPC_AMINISHI_TEMPEST: + if (creature->GetPositionZ() >= 50.0f) // excludes Tempest in Hexlord Malacrass' trash + AkilzonTrash.insert(creature->GetGUID()); + break; + case NPC_AMINISHI_LOOKOUT: + case NPC_AMINISHI_PROTECTOR: + case NPC_EAGLE_TRASH_AGGRO_TRIGGER: + AkilzonTrash.insert(creature->GetGUID()); + break; + case NPC_AMANISHI_WIND_WALKER: + if (creature->GetPositionZ() >= 26.0f) // excludes Wind Walker in first patrol + AkilzonTrash.insert(creature->GetGUID()); + break; + } + + InstanceScript::OnCreatureCreate(creature); + } + void OnGameObjectCreate(GameObject* go) override { if (go->GetEntry() == GO_GATE_HEXLORD) @@ -167,6 +191,61 @@ public: RandVendor[0] = data; else if (type == TYPE_RAND_VENDOR_2) RandVendor[1] = data; + else if (type == TYPE_AKILZON_GAUNTLET) + { + if (data == IN_PROGRESS) + StartAkilzonGauntlet(); + else if (data == NOT_STARTED) + ResetAkilzonGauntlet(); + else if (data == DONE) + _akilzonGauntlet = DONE; + } + } + + void StartAkilzonGauntlet() + { + _akilzonGauntlet = IN_PROGRESS; + for (ObjectGuid const& guid : AkilzonTrash) + if (Creature* creature = instance->GetCreature(guid)) + switch (creature->GetEntry()) + { + case NPC_EAGLE_TRASH_AGGRO_TRIGGER: + creature->DisappearAndDie(); + break; + case NPC_AMINISHI_LOOKOUT: + case NPC_AMINISHI_TEMPEST: + creature->AI()->DoAction(ACTION_START_AKILZON_GAUNTLET); + break; + default: + break; + } + } + + void ResetAkilzonGauntlet() + { + _akilzonGauntlet = NOT_STARTED; + for (ObjectGuid guid : AkilzonTrash) + if (Creature* creature = instance->GetCreature(guid)) + if (!creature->IsAlive()) + creature->Respawn(); + if (Creature* creature = GetCreature(DATA_LOOKOUT)) + if (creature->isMoving()) + creature->Respawn(true); + } + + void OnCreatureEvade(Creature* creature) override + { + switch (creature->GetEntry()) + { + case NPC_AMINISHI_TEMPEST: + case NPC_AMINISHI_PROTECTOR: + case NPC_AMANISHI_WIND_WALKER: + if (AkilzonTrash.contains(creature->GetGUID())) + ResetAkilzonGauntlet(); + break; + default: + break; + } } bool SetBossState(uint32 type, EncounterState state) override @@ -234,6 +313,8 @@ public: return RandVendor[0]; else if (type == TYPE_RAND_VENDOR_2) return RandVendor[1]; + else if (type == TYPE_AKILZON_GAUNTLET) + return _akilzonGauntlet; return 0; } @@ -245,6 +326,8 @@ public: private: uint32 RandVendor[RAND_VENDOR]; + GuidSet AkilzonTrash; + EncounterState _akilzonGauntlet = NOT_STARTED; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index da714fb7b..ddb9bc6fd 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -15,14 +15,15 @@ * with this program. If not, see . */ -#include "zulaman.h" #include "CreatureScript.h" +#include "PassiveAI.h" #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellInfo.h" #include "SpellScript.h" #include "SpellScriptLoader.h" +#include "zulaman.h" /*###### ## npc_forest_frog @@ -530,10 +531,167 @@ class spell_ritual_of_power : public SpellScript } }; +enum AmanishiLookout +{ + PATH_LOOKOUT = 2417500, + SAY_INVADERS = 0, +}; + +struct npc_amanishi_lookout : public NullCreatureAI +{ + npc_amanishi_lookout(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) {} + + void Reset() override + { + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveUnitFlag(UNIT_FLAG_RENAME); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!me->IsWithinDist(who, 25.0f, false)) // distance not confirmed + return; + + Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!player || player->IsGameMaster()) + return; + + if (!who->IsWithinLOSInMap(me)) + return; + + if (_instance->GetData(TYPE_AKILZON_GAUNTLET) == NOT_STARTED) + _instance->SetData(TYPE_AKILZON_GAUNTLET, IN_PROGRESS); + } + + void DoAction(int32 action) override + { + if (action == ACTION_START_AKILZON_GAUNTLET) + { + Talk(SAY_INVADERS); + me->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->SetUnitFlag(UNIT_FLAG_RENAME); + me->GetMotionMaster()->MovePath(PATH_LOOKOUT, false); + } + } + + void MovementInform(uint32 type, uint32 id) override + { + // at boss + if (type == WAYPOINT_MOTION_TYPE && id == 8) // should despawn with waypoint script + me->DespawnOrUnsummon(0s, 0s); + } +private: + InstanceScript* _instance; +}; + +enum AmanishiTempest +{ + ACTION_START_GAUNTLET = 1, + GROUP_AKILZON_GAUNTLET = 1, + SPELL_SUMMON_EAGLE = 43487, + SPELL_SUMMON_WARRIOR = 43486, + SPELL_THUNDERCLAP = 44033, +}; + +struct npc_amanishi_tempest : public ScriptedAI +{ + npc_amanishi_tempest(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) { } + + void Reset() override + { + _summons.DespawnAll(); + scheduler.CancelAll(); + scheduler.Schedule(9s, 11s, [this](TaskContext context) + { + DoCastVictim(SPELL_THUNDERCLAP); + context.Repeat(); + }); + } + + void JustSummoned(Creature* summon) override + { + _summons.Summon(summon); + summon->SetNoCallAssistance(true); // prevent eagles from pulling boss + summon->SetInCombatWithZone(); + } + + void JustDied(Unit* killer) override + { + ScriptedAI::JustDied(killer); + _instance->SetData(TYPE_AKILZON_GAUNTLET, DONE); + } + + void DoAction(int32 action) override + { + if (action == ACTION_START_GAUNTLET) + ScheduleEvents(); + } + + void EnterEvadeMode(EvadeReason why) override + { + ScriptedAI::EnterEvadeMode(why); + scheduler.CancelAll(); + } + + void ScheduleEvents() + { + me->SetInCombatWithZone(); + scheduler.Schedule(29s, 53s, GROUP_AKILZON_GAUNTLET, [this](TaskContext context) + { + for (uint8 i = 0; i < 5; ++i) + DoCastAOE(SPELL_SUMMON_EAGLE, true); + context.Repeat(); + }).Schedule(40s, GROUP_AKILZON_GAUNTLET, [this](TaskContext context) + { + for (uint8 i = 0; i < 2; ++i) + DoCastAOE(SPELL_SUMMON_WARRIOR, true); + context.Repeat(); + }); + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + if (!me->IsEngaged()) + return; + Unit* victim = me->SelectVictim(); + if (!victim || me->GetExactDist(victim) > me->GetAggroRange(victim)) + return; + ScriptedAI::UpdateAI(diff); + } + +private: + InstanceScript* _instance; + SummonList _summons; +}; + +struct npc_eagle_trash_aggro_trigger : public ScriptedAI +{ + npc_eagle_trash_aggro_trigger(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + void MoveInLineOfSight(Unit* who) override + { + if (!me->IsWithinDist(who, 10.0f, false)) // distance not confirmed + return; + + Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!player || player->IsGameMaster()) + return; + + if (_instance->GetData(TYPE_AKILZON_GAUNTLET) == NOT_STARTED) + _instance->SetData(TYPE_AKILZON_GAUNTLET, IN_PROGRESS); + } +private: + InstanceScript* _instance; +}; + void AddSC_zulaman() { RegisterZulAmanCreatureAI(npc_forest_frog); new npc_zulaman_hostage(); RegisterZulAmanCreatureAI(npc_harrison_jones); RegisterSpellScript(spell_ritual_of_power); + RegisterZulAmanCreatureAI(npc_amanishi_lookout); + RegisterZulAmanCreatureAI(npc_amanishi_tempest); + RegisterZulAmanCreatureAI(npc_eagle_trash_aggro_trigger); } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index 247c458bd..f0f86ad0b 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -38,7 +38,9 @@ enum DataTypes DATA_STRANGE_GONG = 10, DATA_MASSIVE_GATE = 11, DATA_HEXLORD_GATE = 12, - DATA_HARRISON_JONES = 13 + DATA_HARRISON_JONES = 13, + TYPE_AKILZON_GAUNTLET = 14, + DATA_LOOKOUT = 15, }; enum CreatureIds @@ -54,7 +56,13 @@ enum CreatureIds NPC_AMANISHI_TRIBESMAN = 23582, NPC_AMANISHI_MEDICINE_MAN = 23581, NPC_AMANISHI_AXE_THROWER = 23542, - NPC_AMANI_HATCHLING = 23598 // 42493 + NPC_AMANI_HATCHLING = 23598, // 42493 + // Akil'zon gauntlet + NPC_AMANISHI_WIND_WALKER = 24179, + NPC_AMINISHI_LOOKOUT = 24175, + NPC_AMINISHI_PROTECTOR = 24180, + NPC_AMINISHI_TEMPEST = 24549, + NPC_EAGLE_TRASH_AGGRO_TRIGGER = 24223 }; enum GameobjectIds @@ -77,6 +85,7 @@ enum MiscIds { DATA_TIMED_RUN = 0, ACTION_START_TIMED_RUN = 0, + ACTION_START_AKILZON_GAUNTLET = 1, GROUP_TIMED_RUN = 1 };