From 5a080a056c75ac0669f680fe3d52408118e1c093 Mon Sep 17 00:00:00 2001 From: sruon Date: Thu, 21 May 2026 00:46:42 -0600 Subject: [PATCH] Macro Test mobs --- scripts/effects/macro_test.lua | 22 +++++++++ scripts/enum/effect.lua | 2 +- scripts/globals/macro_test.lua | 45 +++++++++++++++++++ .../zones/Batallia_Downs/mobs/Macro_Test.lua | 12 +++++ .../Rolanberry_Fields/mobs/Macro_Test.lua | 12 +++++ .../Sauromugue_Champaign/mobs/Macro_Test.lua | 12 +++++ sql/mob_groups.sql | 3 ++ sql/mob_pools.sql | 3 +- sql/mob_spawn_points.sql | 8 ++++ sql/status_effects.sql | 2 +- 10 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 scripts/effects/macro_test.lua create mode 100644 scripts/globals/macro_test.lua create mode 100644 scripts/zones/Batallia_Downs/mobs/Macro_Test.lua create mode 100644 scripts/zones/Rolanberry_Fields/mobs/Macro_Test.lua create mode 100644 scripts/zones/Sauromugue_Champaign/mobs/Macro_Test.lua diff --git a/scripts/effects/macro_test.lua b/scripts/effects/macro_test.lua new file mode 100644 index 00000000000..97c5980355d --- /dev/null +++ b/scripts/effects/macro_test.lua @@ -0,0 +1,22 @@ +----------------------------------- +-- xi.effect.MACRO_TEST +----------------------------------- +---@type TEffect +local effectObject = {} + +effectObject.onEffectGain = function(target, effect) + -- TODO: + -- - Permanent 1000 TP - Cannot gain or lose + -- - Outgoing damage is 0 against ANY target +end + +effectObject.onEffectTick = function(target, effect) + -- TODO: If too far from Macro Test (~5y), effect auto-cancels +end + +effectObject.onEffectLose = function(target, effect) + -- TP is reset to 0 on effect loss + target:setTP(0) +end + +return effectObject diff --git a/scripts/enum/effect.lua b/scripts/enum/effect.lua index 0b8be8eaaf7..075373ce479 100644 --- a/scripts/enum/effect.lua +++ b/scripts/enum/effect.lua @@ -491,7 +491,7 @@ xi.effect = ASYLUM = 492, SUBTLE_SORCERY = 493, STYMIE = 494, - -- NONE = 495, + MACRO_TEST = 495, INTERVENE = 496, SOUL_ENSLAVEMENT = 497, UNLEASH = 498, diff --git a/scripts/globals/macro_test.lua b/scripts/globals/macro_test.lua new file mode 100644 index 00000000000..4659c692019 --- /dev/null +++ b/scripts/globals/macro_test.lua @@ -0,0 +1,45 @@ +----------------------------------- +-- Macro Test +----------------------------------- +xi = xi or {} +xi.macroTest = xi.macroTest or {} + +local applyMacroTest = function(mobArg, attacker) + if attacker and not attacker:hasStatusEffect(xi.effect.MACRO_TEST) then + attacker:addStatusEffect(xi.effect.MACRO_TEST, { duration = 10, origin = mobArg }) + end +end + +xi.macroTest.onMobSpawn = function(mob) + mob:setMod(xi.mod.UDMGPHYS, -10000) + mob:setMod(xi.mod.UDMGMAGIC, -10000) + mob:setMod(xi.mod.UDMGRANGE, -10000) + mob:setMod(xi.mod.UDMGBREATH, -10000) + mob:setMobMod(xi.mobMod.NO_MOVE, 1) + mob:setUnkillable(true) + mob:setAutoAttackEnabled(false) + mob:addImmunity(bit.bxor(0xFFFFFFFF, xi.immunity.TERROR)) -- All but Terror + + -- Can't have perma-Terror in a single call + mob:addStatusEffect(xi.effect.TERROR, { power = 1, duration = 1, origin = mob }) + local terror = mob:getStatusEffect(xi.effect.TERROR) + if terror then + terror:setDuration(0) + end + + mob:addListener('ATTACKED', 'MACRO_TEST_ATTACKED', function(mobArg, attacker, action) + applyMacroTest(mobArg, attacker) + end) + + mob:addListener('ABILITY_TAKE', 'MACRO_TEST_ABILITY_TAKE', function(user, target, skill, action) + applyMacroTest(target, user) + end) + + mob:addListener('MAGIC_TAKE', 'MACRO_TEST_MAGIC_TAKE', function(target, caster, spell) + applyMacroTest(target, caster) + end) + + mob:addListener('WEAPONSKILL_TAKE', 'MACRO_TEST_WEAPONSKILL_TAKE', function(user, target, skill, tp, action) + applyMacroTest(target, user) + end) +end diff --git a/scripts/zones/Batallia_Downs/mobs/Macro_Test.lua b/scripts/zones/Batallia_Downs/mobs/Macro_Test.lua new file mode 100644 index 00000000000..442d8647ab6 --- /dev/null +++ b/scripts/zones/Batallia_Downs/mobs/Macro_Test.lua @@ -0,0 +1,12 @@ +----------------------------------- +-- Area: Batallia Downs +-- Mob: Macro Test +----------------------------------- +---@type TMobEntity +local entity = {} + +entity.onMobSpawn = function(mob) + xi.macroTest.onMobSpawn(mob) +end + +return entity diff --git a/scripts/zones/Rolanberry_Fields/mobs/Macro_Test.lua b/scripts/zones/Rolanberry_Fields/mobs/Macro_Test.lua new file mode 100644 index 00000000000..d59eff45348 --- /dev/null +++ b/scripts/zones/Rolanberry_Fields/mobs/Macro_Test.lua @@ -0,0 +1,12 @@ +----------------------------------- +-- Area: Rolanberry Fields +-- Mob: Macro Test +----------------------------------- +---@type TMobEntity +local entity = {} + +entity.onMobSpawn = function(mob) + xi.macroTest.onMobSpawn(mob) +end + +return entity diff --git a/scripts/zones/Sauromugue_Champaign/mobs/Macro_Test.lua b/scripts/zones/Sauromugue_Champaign/mobs/Macro_Test.lua new file mode 100644 index 00000000000..72bbb23f25b --- /dev/null +++ b/scripts/zones/Sauromugue_Champaign/mobs/Macro_Test.lua @@ -0,0 +1,12 @@ +----------------------------------- +-- Area: Sauromugue Champaign +-- Mob: Macro Test +----------------------------------- +---@type TMobEntity +local entity = {} + +entity.onMobSpawn = function(mob) + xi.macroTest.onMobSpawn(mob) +end + +return entity diff --git a/sql/mob_groups.sql b/sql/mob_groups.sql index d11cf0e2d83..f9d15a0a3c0 100644 --- a/sql/mob_groups.sql +++ b/sql/mob_groups.sql @@ -8005,6 +8005,7 @@ INSERT INTO `mob_groups` VALUES (68,0,105,'Hachiryu_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (69,0,105,'Omodaka_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (70,1642,105,'Goblin_Bounty_Hunter',300,0,1030,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (71,6570,105,'Wight_blm',300,1,2651,0,0,0,NULL); +INSERT INTO `mob_groups` VALUES (72,7354,105,'Macro_Test',0,0,0,0,0,0,'TVR'); -- ------------------------------------------------------------ -- North_Gustaberg (Zone 106) @@ -8381,6 +8382,7 @@ INSERT INTO `mob_groups` VALUES (62,0,110,'Ubuginu_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (63,0,110,'Hachiryu_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (64,0,110,'Omodaka_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (65,6570,110,'Wight_blm',300,1,2651,0,0,0,NULL); +INSERT INTO `mob_groups` VALUES (66,7354,110,'Macro_Test',0,0,0,0,0,0,'TVR'); -- ------------------------------------------------------------ -- Beaucedine_Glacier (Zone 111) @@ -9104,6 +9106,7 @@ INSERT INTO `mob_groups` VALUES (65,0,120,'Omodaka_Armor',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (66,1642,120,'Goblin_Bounty_Hunter',300,0,1030,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (67,6570,120,'Wight_blm',300,1,2651,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (68,6583,120,'Bashe',0,32,3142,3300,0,0,'WOTG'); +INSERT INTO `mob_groups` VALUES (69,7354,120,'Macro_Test',0,0,0,0,0,0,'TVR'); -- ------------------------------------------------------------ -- The_Sanctuary_of_ZiTah (Zone 121) diff --git a/sql/mob_pools.sql b/sql/mob_pools.sql index ddfd4380fc3..d5cdd95f906 100644 --- a/sql/mob_pools.sql +++ b/sql/mob_pools.sql @@ -7446,7 +7446,8 @@ INSERT INTO `mob_pools` VALUES (7350,'Succubus_Bats_Newton_Movalpolos','Succubus INSERT INTO `mob_pools` VALUES (7351,'Succubus_Bats_Uleguerand_Range','Succubus_Bats',181,0x0000040100000000000000000000000000000000,1,1,11,240,100,0,1,0,1,0,0,64,398,643,8,0,0,0,0,2015,47,1,16); INSERT INTO `mob_pools` VALUES (7352,'Nightmare_Bats_Newton_Movalpolos','Nightmare_Bats',181,0x0000040100000000000000000000000000000000,1,1,5,240,100,0,1,0,1,0,0,64,238,643,8,0,0,0,0,2015,47,1,16); INSERT INTO `mob_pools` VALUES (7353,'Nightmare_Bats_Uleguerand_Range','Nightmare_Bats',181,0x0000040100000000000000000000000000000000,1,1,5,240,100,0,1,0,1,0,0,64,238,643,8,0,0,0,0,2015,47,1,16); --- 1 Unused space at 3687 or fresh blocks at 7354. +INSERT INTO `mob_pools` VALUES (7354,'Macro_Test','Macro_Test',49,0x0000AF0100000000000000000000000000000000,1,1,1,240,100,0,0,0,0,2,0,0,0,0,0,0,0,32,0,0,0,0,10); +-- 1 Unused space at 3687 or fresh blocks at 7355. -- Jug pet pools (skipped to allow keeping them sequential) INSERT INTO `mob_pools` VALUES (7500,'Pet_Sweet_Caroline','Pet_Sweet_Caroline',350,0x00008E0B00000000000000000000000000000000,2,2,1,480,100,0,0,0,0,8,0,32,605,129,0,0,0,0,0,766,178,0,12); diff --git a/sql/mob_spawn_points.sql b/sql/mob_spawn_points.sql index 21faa34e737..c2ca72d7a48 100644 --- a/sql/mob_spawn_points.sql +++ b/sql/mob_spawn_points.sql @@ -36303,6 +36303,8 @@ INSERT INTO `mob_spawn_points` VALUES (17207779,0,'Goblin_Bounty_Hunter','Goblin INSERT INTO `mob_spawn_points` VALUES (17207780,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',70,30,36,187.967,10.887,-534.624,219); INSERT INTO `mob_spawn_points` VALUES (17207781,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',70,30,36,191.223,12.130,-541.862,126); INSERT INTO `mob_spawn_points` VALUES (17207782,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',70,30,36,223.048,11.941,-594.665,77); +INSERT INTO `mob_spawn_points` VALUES (17207786,0,'Macro_Test','Macro Test',72,1,1,430.000,7.737,-155.380,250); +INSERT INTO `mob_spawn_points` VALUES (17207787,0,'Macro_Test','Macro Test',72,1,1,430.720,7.763,-159.580,250); -- ------------------------------------------------------------ -- North Gustaberg (Zone 106) @@ -39055,6 +39057,9 @@ INSERT INTO `mob_spawn_points` VALUES (17228305,0,'Hizamaru_Armor','Hizamaru Arm INSERT INTO `mob_spawn_points` VALUES (17228306,0,'Ubuginu_Armor','Ubuginu Armor',62,0,0,0.000,0.000,0.000,0); INSERT INTO `mob_spawn_points` VALUES (17228307,0,'Hachiryu_Armor','Hachiryu Armor',63,0,0,0.000,0.000,0.000,0); INSERT INTO `mob_spawn_points` VALUES (17228308,0,'Omodaka_Armor','Omodaka Armor',64,0,0,0.000,0.000,0.000,0); +INSERT INTO `mob_spawn_points` VALUES (17228309,0,'Macro_Test','Macro Test',66,1,1,221.589,23.516,463.339,184); +INSERT INTO `mob_spawn_points` VALUES (17228310,0,'Macro_Test','Macro Test',66,1,1,225.399,24.354,464.200,184); +INSERT INTO `mob_spawn_points` VALUES (17228311,0,'Macro_Test','Macro Test',66,1,1,230.000,24.573,465.149,184); -- ------------------------------------------------------------ -- Beaucedine Glacier (Zone 111) @@ -43547,6 +43552,9 @@ INSERT INTO `mob_spawn_points` VALUES (17269175,0,'Goblin_Bounty_Hunter','Goblin INSERT INTO `mob_spawn_points` VALUES (17269176,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',66,30,34,306.908,42.103,412.325,30); INSERT INTO `mob_spawn_points` VALUES (17269177,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',66,30,34,254.067,38.460,428.696,230); INSERT INTO `mob_spawn_points` VALUES (17269178,0,'Goblin_Bounty_Hunter','Goblin Bounty Hunter',66,30,34,241.937,39.829,451.606,255); +INSERT INTO `mob_spawn_points` VALUES (17269179,0,'Macro_Test','Macro Test',69,1,1,-462.000,0.400,319.119,156); +INSERT INTO `mob_spawn_points` VALUES (17269180,0,'Macro_Test','Macro Test',69,1,1,-459.399,0.469,322.200,156); +INSERT INTO `mob_spawn_points` VALUES (17269181,0,'Macro_Test','Macro Test',69,1,1,-456.450,0.249,325.459,156); -- ------------------------------------------------------------ -- The Sanctuary of Zi'Tah (Zone 121) diff --git a/sql/status_effects.sql b/sql/status_effects.sql index 6be155a256c..8fb604106e8 100644 --- a/sql/status_effects.sql +++ b/sql/status_effects.sql @@ -554,7 +554,7 @@ INSERT INTO `status_effects` VALUES (491,'inner_strength',@FLAG_DEATH | @FLAG_ON INSERT INTO `status_effects` VALUES (492,'asylum',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL); INSERT INTO `status_effects` VALUES (493,'subtle_sorcery',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL); INSERT INTO `status_effects` VALUES (494,'stymie',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL); -INSERT INTO `status_effects` VALUES (495,'macro_test',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL); +INSERT INTO `status_effects` VALUES (495,'macro_test',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE | @FLAG_NO_LOSS_MESSAGE | @FLAG_HIDE_TIMER | @FLAG_ALWAYS_EXPIRING,0,0,0,0,0,0,0,0,NULL); INSERT INTO `status_effects` VALUES (496,'intervene',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE | @FLAG_NO_CANCEL,0,0,0,0,0,0,0,0,NULL); INSERT INTO `status_effects` VALUES (497,'soul_enslavement',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL); INSERT INTO `status_effects` VALUES (498,'unleash',@FLAG_DEATH | @FLAG_ON_ZONE | @FLAG_ON_JOBCHANGE,0,0,0,0,0,0,0,0,NULL);