From 7253bea46d5a088608d29653798d5e841a5a1faf Mon Sep 17 00:00:00 2001 From: pepopo978 Date: Sat, 13 Apr 2024 19:52:51 -0700 Subject: [PATCH 1/2] Target furthest player on poison charge --- sql/migrations/20240413233003_world.sql | 23 +++++++ .../naxxramas/instance_naxxramas.cpp | 64 ++++++++++++++++--- 2 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 sql/migrations/20240413233003_world.sql diff --git a/sql/migrations/20240413233003_world.sql b/sql/migrations/20240413233003_world.sql new file mode 100644 index 00000000000..175cd76a116 --- /dev/null +++ b/sql/migrations/20240413233003_world.sql @@ -0,0 +1,23 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240413233003'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240413233003'); +-- Add your query below. + + +/* + - Switch Necro Stalker and Venom Stalker to use script that targets farthest player. +*/ +UPDATE `creature_template` SET `spell_list_id`=0,`script_name`='poison_charge_stalker_ai' WHERE `entry`=16453 OR `entry`=15976; + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp index 4130a32d8e8..abea33a5bd6 100644 --- a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp +++ b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp @@ -307,40 +307,40 @@ void instance_naxxramas::UpdateTeleporters(uint32 uiType, uint32 uiData) case TYPE_MAEXXNA: if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_ARAC_EYE_BOSS)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_ARAC_EYE_RAMP)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_ARAC_PORTAL)) SetTeleporterState(pGO, uiData); break; case TYPE_THADDIUS: if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_CONS_EYE_BOSS)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_CONS_EYE_RAMP)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_CONS_PORTAL)) SetTeleporterState(pGO, uiData); break; case TYPE_LOATHEB: if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_PLAG_EYE_BOSS)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_PLAG_EYE_RAMP)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_PLAG_PORTAL)) SetTeleporterState(pGO, uiData); break; case TYPE_FOUR_HORSEMEN: if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_MILI_EYE_BOSS)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_MILI_EYE_RAMP)) SetTeleporterVisualState(pGO, uiData); - + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_MILI_PORTAL)) SetTeleporterState(pGO, uiData); break; @@ -1502,6 +1502,7 @@ enum SPELL_STONESKIN = 28995, // Periodic Heal and Damage Immunity SPELL_GARGOYLE_STONEFORM_VISUAL = 29153, // Dummy Aura SPELL_ACID_VOLLEY = 29325, + SPELL_POISONCHARGE = 28431, BCT_STRANGE_NOISE = 10755, // %s emits a strange noise. }; @@ -1748,6 +1749,46 @@ struct mob_dark_touched_warriorAI : public ScriptedAI } }; +struct mob_poison_charge_stalkerAI : public ScriptedAI +{ + mob_poison_charge_stalkerAI(Creature* pCreature) : ScriptedAI(pCreature) + { + Reset(); + } + + uint32 m_uiChargeTimer; + + void Reset() override + { + m_uiChargeTimer = 0; + } + + void UpdateAI(uint32 const uiDiff) override + { + if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) + return; + + // Charge Timer + if (m_uiChargeTimer < uiDiff) + { + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_FARTHEST, 0, SPELL_POISONCHARGE, SELECT_FLAG_PLAYER | SELECT_FLAG_IN_LOS)) + { + if (DoCastSpellIfCan(pTarget, SPELL_POISONCHARGE) == CAST_OK) + m_uiChargeTimer = urand(8000, 12000); + } + } + else + m_uiChargeTimer -= uiDiff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_mob_poison_charge_stalker(Creature* pCreature) +{ + return new mob_poison_charge_stalkerAI(pCreature); +} + CreatureAI* GetAI_mob_spiritOfNaxxramas(Creature* pCreature) { return new mob_spiritOfNaxxramasAI(pCreature); @@ -1889,7 +1930,7 @@ bool GossipSelect_npc_MasterCraftsmanOmarion(Player* pPlayer, Creature* pCreatur { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Polar Gloves", GOSSIP_SELECT_LW, GOSSIP_SELECT_POLAR_GLOVES); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Icy Scale Gauntlets", GOSSIP_SELECT_LW, GOSSIP_SELECT_ICYSCALE_GLOVES); - + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Polar Bracers", GOSSIP_SELECT_LW, GOSSIP_SELECT_POLAR_WRISTS); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Icy Scale Bracers", GOSSIP_SELECT_LW, GOSSIP_SELECT_ICYSCALE_WRISTS); } @@ -2084,4 +2125,9 @@ void AddSC_instance_naxxramas() pNewScript->pGossipHello = &GossipHello_npc_MasterCraftsmanOmarion; pNewScript->pGossipSelect = &GossipSelect_npc_MasterCraftsmanOmarion; pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "poison_charge_stalker_ai"; + pNewScript->GetAI = &GetAI_mob_poison_charge_stalker; + pNewScript->RegisterSelf(); } From 2d99627368c765bcf9cdbfc32c02fe10d38015aa Mon Sep 17 00:00:00 2001 From: pepopo978 Date: Sat, 13 Apr 2024 20:19:59 -0700 Subject: [PATCH 2/2] fix initial charge timer --- .../eastern_plaguelands/naxxramas/instance_naxxramas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp index abea33a5bd6..2aac8883102 100644 --- a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp +++ b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/instance_naxxramas.cpp @@ -1760,7 +1760,7 @@ struct mob_poison_charge_stalkerAI : public ScriptedAI void Reset() override { - m_uiChargeTimer = 0; + m_uiChargeTimer = urand(8000, 12000); } void UpdateAI(uint32 const uiDiff) override