From c82875a857cf01c70a5dc46c9029618e2c65ee4a Mon Sep 17 00:00:00 2001 From: Critical <48370698+CriticalXI@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:41:02 -0700 Subject: [PATCH 1/3] [lua, sql] Implement Abyssea job module; Warrior effect adjustments --- modules/abyssea/lua/job_adjustments.lua | 31 +++++++++++++++++++ modules/abyssea/sql/job_adjustments.sql | 17 ++++++++++ scripts/actions/abilities/warriors_charge.lua | 4 +-- scripts/effects/defender.lua | 18 +++-------- scripts/effects/warriors_charge.lua | 6 ++-- scripts/globals/job_utils/warrior.lua | 2 +- 6 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 modules/abyssea/lua/job_adjustments.lua create mode 100644 modules/abyssea/sql/job_adjustments.sql diff --git a/modules/abyssea/lua/job_adjustments.lua b/modules/abyssea/lua/job_adjustments.lua new file mode 100644 index 00000000000..0e455979d97 --- /dev/null +++ b/modules/abyssea/lua/job_adjustments.lua @@ -0,0 +1,31 @@ +----------------------------------- +-- Module: Job Adjustments (Abyssea Era) +-- Desc: Removes traits/abilities/effects that were added to jobs during the Abyssea era +----------------------------------- +-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(03/26/2012) +------------------------------------ +require('modules/module_utils') +----------------------------------- + +local m = Module:new('job_adjustments') + +----------------------------------- +-- Warrior +----------------------------------- + +-- Remove Triple Attack from Warrior's Charge +m:addOverride('xi.effects.warriors_charge.onEffectGain', function(target, effect) + effect:addMod(xi.mod.DOUBLE_ATTACK, 100) +end) + +-- Set Warrior's Charge recast to be reduced by merits +m:addOverride('xi.job_utils.warrior.useWarriorsCharge', function(player, target, ability, action) + local recastReduction = player:getMerit(xi.merit.WARRIORS_CHARGE) - 150 + action:setRecast(action:getRecast() - recastReduction) + + player:addStatusEffect(xi.effect.WARRIORS_CHARGE, 1, 0, 60) + + return xi.effect.WARRIORS_CHARGE +end) + +return m diff --git a/modules/abyssea/sql/job_adjustments.sql b/modules/abyssea/sql/job_adjustments.sql new file mode 100644 index 00000000000..0b29bbeee97 --- /dev/null +++ b/modules/abyssea/sql/job_adjustments.sql @@ -0,0 +1,17 @@ +------------------------------------ +-- Abyssea Job SQL Adjustments +-- This module reverts relevant SQL tables for jobs to their pre-Abyssea values +------------------------------------ +-- Source : https://www.bg-wiki.com/ffxi/Version_Update_(03/26/2012) +------------------------------------ + +------------------------------------ +-- Warrior +------------------------------------ + +-- Reverts Warrior's Charge cooldown to 15 minutes +UPDATE abilities SET recastTime = 900 WHERE name = 'warriors_charge'; + +-- Change merit value to represent recast reduction per upgrade (150 seconds = 2.5 minutes) +-- First merit unlocks ability, upgrades 2-5 each reduce recast by 2.5 min down to 5 min minimum +UPDATE merits SET value = 150 WHERE name = 'warriors_charge'; diff --git a/scripts/actions/abilities/warriors_charge.lua b/scripts/actions/abilities/warriors_charge.lua index 747fb3334e7..a2eb8b34bc0 100644 --- a/scripts/actions/abilities/warriors_charge.lua +++ b/scripts/actions/abilities/warriors_charge.lua @@ -9,8 +9,8 @@ abilityObject.onAbilityCheck = function(player, target, ability) return 0, 0 end -abilityObject.onUseAbility = function(player, target, ability) - return xi.job_utils.warrior.useWarriorsCharge(player, target, ability) +abilityObject.onUseAbility = function(player, target, ability, action) + return xi.job_utils.warrior.useWarriorsCharge(player, target, ability, action) end return abilityObject diff --git a/scripts/effects/defender.lua b/scripts/effects/defender.lua index e83e4c9b623..0316b7b4298 100644 --- a/scripts/effects/defender.lua +++ b/scripts/effects/defender.lua @@ -9,28 +9,18 @@ effectObject.onEffectGain = function(target, effect) local jpLevel = target:getJobPointLevel(xi.jp.DEFENDER_EFFECT) local jpEffect = jpLevel * 3 - target:addMod(xi.mod.DEFP, power) - target:addMod(xi.mod.RATTP, -25) - target:addMod(xi.mod.ATTP, -25) + effect:addMod(xi.mod.DEFP, power) + effect:addMod(xi.mod.RATTP, -25) + effect:addMod(xi.mod.ATTP, -25) -- Job Point Bonuses - target:addMod(xi.mod.DEF, jpEffect) + effect:addMod(xi.mod.DEF, jpEffect) end effectObject.onEffectTick = function(target, effect) end effectObject.onEffectLose = function(target, effect) - local power = effect:getPower() - local jpLevel = target:getJobPointLevel(xi.jp.DEFENDER_EFFECT) - local jpEffect = jpLevel * 3 - - target:delMod(xi.mod.DEFP, power) - target:delMod(xi.mod.ATTP, -25) - target:delMod(xi.mod.RATTP, -25) - - -- Job Point Bonuses - target:delMod(xi.mod.DEF, jpEffect) end return effectObject diff --git a/scripts/effects/warriors_charge.lua b/scripts/effects/warriors_charge.lua index bd2e5b4bdb4..d0b0514d630 100644 --- a/scripts/effects/warriors_charge.lua +++ b/scripts/effects/warriors_charge.lua @@ -5,16 +5,14 @@ local effectObject = {} effectObject.onEffectGain = function(target, effect) - target:addMod(xi.mod.TRIPLE_ATTACK, effect:getPower()) - target:addMod(xi.mod.DOUBLE_ATTACK, 100) + effect:addMod(xi.mod.TRIPLE_ATTACK, effect:getPower()) + effect:addMod(xi.mod.DOUBLE_ATTACK, 100) end effectObject.onEffectTick = function(target, effect) end effectObject.onEffectLose = function(target, effect) - target:delMod(xi.mod.TRIPLE_ATTACK, effect:getPower()) - target:delMod(xi.mod.DOUBLE_ATTACK, 100) end return effectObject diff --git a/scripts/globals/job_utils/warrior.lua b/scripts/globals/job_utils/warrior.lua index 12431db569e..d7173bd3eca 100644 --- a/scripts/globals/job_utils/warrior.lua +++ b/scripts/globals/job_utils/warrior.lua @@ -129,7 +129,7 @@ xi.job_utils.warrior.useWarcry = function(player, target, ability) return xi.effect.WARCRY end -xi.job_utils.warrior.useWarriorsCharge = function(player, target, ability) +xi.job_utils.warrior.useWarriorsCharge = function(player, target, ability, action) local merits = player:getMerit(xi.merit.WARRIORS_CHARGE) player:addStatusEffect(xi.effect.WARRIORS_CHARGE, merits - 5, 0, 60) From 53e6d594ca562747ac431e325245857cddce1da8 Mon Sep 17 00:00:00 2001 From: Critical <48370698+CriticalXI@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:41:41 -0700 Subject: [PATCH 2/3] [sql] Block job traits behind associated merit unlocks --- sql/traits.sql | 84 +++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/sql/traits.sql b/sql/traits.sql index f7c13ab881d..c69f9907fa0 100644 --- a/sql/traits.sql +++ b/sql/traits.sql @@ -438,10 +438,10 @@ INSERT INTO `traits` VALUES (70,'zanshin',12,35,2,306,25,'COP',0); INSERT INTO `traits` VALUES (70,'zanshin',12,50,3,306,35,'COP',0); INSERT INTO `traits` VALUES (70,'zanshin',12,75,4,306,45,'COP',0); INSERT INTO `traits` VALUES (70,'zanshin',12,95,5,306,50,'ABYSSEA',0); -INSERT INTO `traits` VALUES (71,'savagery',1,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (72,'aggressive aim',1,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (73,'invigorate',2,75,1,0,24,'TOAU',0); -INSERT INTO `traits` VALUES (74,'penance',2,75,1,0,0,'TOAU',0); +INSERT INTO `traits` VALUES (71,'savagery',1,75,1,0,0,'TOAU',2052); +INSERT INTO `traits` VALUES (72,'aggressive aim',1,75,1,0,0,'TOAU',2054); +INSERT INTO `traits` VALUES (73,'invigorate',2,75,1,0,24,'TOAU',2116); +INSERT INTO `traits` VALUES (74,'penance',2,75,1,0,0,'TOAU',2118); INSERT INTO `traits` VALUES (75,'aura steal',6,75,1,0,0,'TOAU',2372); INSERT INTO `traits` VALUES (76,'ambush',6,75,1,0,0,'TOAU',2374); INSERT INTO `traits` VALUES (77,'iron will',7,75,1,0,0,'TOAU',2436); @@ -450,9 +450,9 @@ INSERT INTO `traits` VALUES (79,'muted soul',8,75,1,0,0,'TOAU',2500); INSERT INTO `traits` VALUES (80,'desperate blows',8,15,1,906,500,'SOA',0); INSERT INTO `traits` VALUES (80,'desperate blows',8,30,2,906,1000,'SOA',0); INSERT INTO `traits` VALUES (80,'desperate blows',8,45,3,906,1500,'SOA',0); -INSERT INTO `traits` VALUES (81,'beast affinity ',9,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (82,'beast healer',9,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (83,'snapshot',11,75,1,0,0,'TOAU',0); +INSERT INTO `traits` VALUES (81,'beast affinity ',9,75,1,0,0,'TOAU',2564); +INSERT INTO `traits` VALUES (82,'beast healer',9,75,1,0,0,'TOAU',2566); +INSERT INTO `traits` VALUES (83,'snapshot',11,75,1,0,0,'TOAU',2692); INSERT INTO `traits` VALUES (84,'recycle',11,20,1,305,10,'SOA',0); INSERT INTO `traits` VALUES (84,'recycle',11,35,2,305,30,'SOA',0); INSERT INTO `traits` VALUES (84,'recycle',11,50,3,305,20,'SOA',0); @@ -462,19 +462,19 @@ INSERT INTO `traits` VALUES (84,'recycle',17,95,3,305,30,'SOA',0); INSERT INTO `traits` VALUES (85,'ikishoten',12,75,1,0,0,'TOAU',2756); INSERT INTO `traits` VALUES (86,'overwhelm',12,75,1,0,0,'TOAU',2758); INSERT INTO `traits` VALUES (87,'ninja tool expert.',13,75,1,308,0,'TOAU',2818); -INSERT INTO `traits` VALUES (88,'empathy',14,75,1,0,0,'TOAU',0); +INSERT INTO `traits` VALUES (88,'empathy',14,75,1,0,0,'TOAU',2884); INSERT INTO `traits` VALUES (89,'strafe',14,20,1,986,10,'TOAU',0); INSERT INTO `traits` VALUES (89,'strafe',14,40,2,986,15,'TOAU',0); INSERT INTO `traits` VALUES (89,'strafe',14,60,3,986,25,'TOAU',0); INSERT INTO `traits` VALUES (89,'strafe',14,80,4,986,30,'TOAU',0); -INSERT INTO `traits` VALUES (90,'enchainment',16,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (91,'assimilation',16,75,1,0,0,'TOAU',0); -INSERT INTO `traits` VALUES (92,'winning streak',17,75,1,0,0,'TOAU',3076); -INSERT INTO `traits` VALUES (93,'loaded deck',17,75,1,0,0,'TOAU',3078); -INSERT INTO `traits` VALUES (94,'fine-tuning',18,75,1,0,0,'TOAU',3140); -INSERT INTO `traits` VALUES (95,'optimization',18,75,1,0,0,'TOAU',3142); +INSERT INTO `traits` VALUES (90,'enchainment',16,75,1,0,0,'WOTG',3012); +INSERT INTO `traits` VALUES (91,'assimilation',16,75,1,0,0,'WOTG',3014); +INSERT INTO `traits` VALUES (92,'winning streak',17,75,1,0,0,'WOTG',3076); +INSERT INTO `traits` VALUES (93,'loaded deck',17,75,1,0,0,'WOTG',3078); +INSERT INTO `traits` VALUES (94,'fine-tuning',18,75,1,0,0,'WOTG',3140); +INSERT INTO `traits` VALUES (95,'optimization',18,75,1,0,0,'WOTG',3142); INSERT INTO `traits` VALUES (96,'closed position',19,75,1,0,0,'WOTG',3206); -INSERT INTO `traits` VALUES (97,'stormsurge',20,75,1,0,0,'WOTG',0); +INSERT INTO `traits` VALUES (97,'stormsurge',20,75,1,0,0,'WOTG',3274); INSERT INTO `traits` VALUES (98,'crit. atk. bonus',1,78,1,421,5,'ABYSSEA',0); INSERT INTO `traits` VALUES (98,'crit. atk. bonus',1,86,2,421,8,'ABYSSEA',0); INSERT INTO `traits` VALUES (98,'crit. atk. bonus',6,78,1,421,5,'ABYSSEA',0); @@ -708,33 +708,33 @@ INSERT INTO `traits` VALUES (127,'smite',14,40,1,898,25,'SOA',0); INSERT INTO `traits` VALUES (127,'smite',14,80,2,898,38,'SOA',0); INSERT INTO `traits` VALUES (127,'smite',18,60,1,898,25,'SOA',0); -INSERT INTO `traits` VALUES (129,'damage limit+',1,40,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',1,80,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',2,30,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',2,60,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',2,90,3,1080,30,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',5,60,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',6,50,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',8,20,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',8,40,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',8,55,3,1080,30,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',8,70,4,1080,40,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',8,80,5,1080,50,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',9,45,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',9,90,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',11,30,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',11,60,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',11,90,3,1080,30,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',12,40,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',12,80,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',13,50,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',14,30,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',14,60,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',14,90,3,1080,30,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',18,45,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',18,90,2,1080,20,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',19,45,1,1080,10,NULL,0); -INSERT INTO `traits` VALUES (129,'damage limit+',19,90,2,1080,20,NULL,0); +INSERT INTO `traits` VALUES (129,'damage limit+',1,40,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',1,80,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',2,30,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',2,60,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',2,90,3,1080,30,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',5,60,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',6,50,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',8,20,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',8,40,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',8,55,3,1080,30,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',8,70,4,1080,40,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',8,80,5,1080,50,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',9,45,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',9,90,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',11,30,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',11,60,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',11,90,3,1080,30,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',12,40,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',12,80,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',13,50,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',14,30,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',14,60,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',14,90,3,1080,30,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',18,45,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',18,90,2,1080,20,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',19,45,1,1080,10,'ROV',0); +INSERT INTO `traits` VALUES (129,'damage limit+',19,90,2,1080,20,'ROV',0); INSERT INTO `traits` VALUES (134,'ws damage boost',14,45,1,840,7,'ROV',0); INSERT INTO `traits` VALUES (134,'ws damage boost',14,55,2,840,10,'ROV',0); From 9ad3ea2697d9178e7d66d95824215aeb9b46322d Mon Sep 17 00:00:00 2001 From: Critical <48370698+CriticalXI@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:42:17 -0700 Subject: [PATCH 3/3] [sql] Revert job special abilities to two hour cooldown module --- modules/abyssea/lua/job_adjustments.lua | 2 +- modules/abyssea/sql/job_adjustments.sql | 3 +-- modules/abyssea/sql/revert_two_hours.sql | 30 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 modules/abyssea/sql/revert_two_hours.sql diff --git a/modules/abyssea/lua/job_adjustments.lua b/modules/abyssea/lua/job_adjustments.lua index 0e455979d97..0687113002a 100644 --- a/modules/abyssea/lua/job_adjustments.lua +++ b/modules/abyssea/lua/job_adjustments.lua @@ -3,7 +3,7 @@ -- Desc: Removes traits/abilities/effects that were added to jobs during the Abyssea era ----------------------------------- -- Source: https://www.bg-wiki.com/ffxi/Version_Update_(03/26/2012) ------------------------------------- +----------------------------------- require('modules/module_utils') ----------------------------------- diff --git a/modules/abyssea/sql/job_adjustments.sql b/modules/abyssea/sql/job_adjustments.sql index 0b29bbeee97..256116bb5f6 100644 --- a/modules/abyssea/sql/job_adjustments.sql +++ b/modules/abyssea/sql/job_adjustments.sql @@ -12,6 +12,5 @@ -- Reverts Warrior's Charge cooldown to 15 minutes UPDATE abilities SET recastTime = 900 WHERE name = 'warriors_charge'; --- Change merit value to represent recast reduction per upgrade (150 seconds = 2.5 minutes) --- First merit unlocks ability, upgrades 2-5 each reduce recast by 2.5 min down to 5 min minimum +-- Change warrior's Charge merit value to reduce cooldown by 150 seconds per merit UPDATE merits SET value = 150 WHERE name = 'warriors_charge'; diff --git a/modules/abyssea/sql/revert_two_hours.sql b/modules/abyssea/sql/revert_two_hours.sql new file mode 100644 index 00000000000..a953d752473 --- /dev/null +++ b/modules/abyssea/sql/revert_two_hours.sql @@ -0,0 +1,30 @@ +-- -------------------------------------------------------- +-- Revert Two-Hour Ability Recast Change +-- -------------------------------------------------------- +-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(12/12/2012) +-- -------------------------------------------------------- + +UPDATE `abilities` +SET `recastTime` = 7200 +WHERE `name` IN ( + 'mighty_strikes', + 'hundred_fists', + 'benediction', + 'manafont', + 'chainspell', + 'perfect_dodge', + 'invincible', + 'blood_weapon', + 'familiar', + 'soul_voice', + 'eagle_eye_shot', + 'meikyo_shisui', + 'mijin_gakure', + 'spirit_surge', + 'astral_flow', + 'azure_lore', + 'wild_card', + 'overdrive', + 'trance', + 'tabula_rasa' +);