From 8519b5283b66a3cb19a694329b5bd8002e38424e Mon Sep 17 00:00:00 2001 From: Critical <48370698+CriticalXI@users.noreply.github.com> Date: Mon, 26 Jan 2026 22:44:38 -0700 Subject: [PATCH] [lua, sql] Monk RoV Era Module --- modules/rov/lua/job_adjustments.lua | 108 ++++++++++++++++++++++++++++ modules/rov/sql/job_adjustments.sql | 36 ++++++++++ scripts/effects/counterstance.lua | 3 +- scripts/effects/footwork.lua | 8 +-- sql/traits.sql | 4 +- 5 files changed, 149 insertions(+), 10 deletions(-) create mode 100644 modules/rov/lua/job_adjustments.lua create mode 100644 modules/rov/sql/job_adjustments.sql diff --git a/modules/rov/lua/job_adjustments.lua b/modules/rov/lua/job_adjustments.lua new file mode 100644 index 00000000000..cea0fd3ea2a --- /dev/null +++ b/modules/rov/lua/job_adjustments.lua @@ -0,0 +1,108 @@ +----------------------------------- +-- Module: Job Adjustments (Rhapsodies of Vana'diel Era) +-- Desc: Removes traits/abilities/effects that were added to jobs during the RoV era +----------------------------------- +-- Source: https://forum.square-enix.com/ffxi/threads/52969 +----------------------------------- +require('modules/module_utils') +----------------------------------- +local m = Module:new('job_adjustments') + +----------------------------------- +-- Monk +----------------------------------- + +-- Focus: Revert to flat +20 ACC only +m:addOverride('xi.effects.focus.onEffectGain', function(target, effect) + local bonusPower = effect:getPower() + + effect:addMod(xi.mod.ACC, 20 + bonusPower) +end) + +-- Dodge: Revert to flat +20 EVA only +m:addOverride('xi.effects.dodge.onEffectGain', function(target, effect) + local bonusPower = effect:getPower() + + effect:addMod(xi.mod.EVA, 20 + bonusPower) +end) + +-- Focus: Revert duration from 30 to 120 seconds +m:addOverride('xi.job_utils.monk.useFocus', function(player, target, ability) + local focusMod = target:getMod(xi.mod.FOCUS_EFFECT) + player:addStatusEffect(xi.effect.FOCUS, focusMod, 0, 120) + + return xi.effect.FOCUS +end) + +-- Dodge: Revert duration from 30 to 120 seconds +m:addOverride('xi.job_utils.monk.useDodge', function(player, target, ability) + local dodgeMod = target:getMod(xi.mod.DODGE_EFFECT) + player:addStatusEffect(xi.effect.DODGE, dodgeMod, 0, 120) + + return xi.effect.DODGE +end) + +-- Chakra: Revert to VIT * 2 healing only +m:addOverride('xi.job_utils.monk.useChakra', function(player, target, ability) + local chakraRemoval = player:getMod(xi.mod.CHAKRA_REMOVAL) + + -- Status effect removal (unchanged) + local chakraStatusEffects = + { + POISON = 0, -- Removed by default + BLINDNESS = 0, -- Removed by default + PARALYSIS = 1, + DISEASE = 2, + PLAGUE = 4, + } + + for k, v in pairs(chakraStatusEffects) do + if bit.band(chakraRemoval, v) == v then + player:delStatusEffect(xi.effect[k]) + end + end + + local chakraMultiplier = 1 + player:getMod(xi.mod.CHAKRA_MULT) / 100 + local maxRecoveryAmount = (player:getStat(xi.mod.VIT) * 2) * chakraMultiplier + local recoveryAmount = math.min(player:getMaxHP() - player:getHP(), maxRecoveryAmount) + + player:setHP(player:getHP() + recoveryAmount) + + local merits = player:getMerit(xi.merit.INVIGORATE) + if merits > 0 then + if player:hasStatusEffect(xi.effect.REGEN) then + player:delStatusEffect(xi.effect.REGEN) + end + + player:addStatusEffect(xi.effect.REGEN, 10, 0, merits, 0, 0, 1) + end + + return recoveryAmount +end) + +-- Revert Footwork to original June 2008 implementation +-- Source: https://wiki.ffo.jp/html/15342.html +-- TODO: +-- Normal attacks replaced with kicks only +-- Max attacks per round capped at 2 +-- Special subtle blow that calculates enemy TP gain as if Monk's delay is 240 +-- Hundred Fists disables Store TP and Attack bonuses from Footwork +-- m:addOverride('xi.job_utils.monk.useFootwork', function(player, target, ability) +-- -- Pre-RoV: base kick damage of 20 only, no weapon damage added +-- local kickDmg = 20 +-- local kickAttPercent = 25 + player:getMod(xi.mod.FOOTWORK_ATT_BONUS) + +-- -- Duration changed from 60 seconds to 300 seconds (5 minutes) +-- player:addStatusEffect(xi.effect.FOOTWORK, kickDmg, 0, 300, 0, kickAttPercent) + +-- return xi.effect.FOOTWORK +-- end) + +-- m:addOverride('xi.effects.footwork.onEffectGain', function(target, effect) +-- -- Kick damage: bare-hand D + 20 (passed as effect power, no weapon damage) +-- effect:addMod(xi.mod.KICK_DMG, effect:getPower()) +-- effect:addMod(xi.mod.STORETP, 180) +-- effect:addMod(xi.mod.HASTE_MAGIC, -6000) +-- end) + +return m diff --git a/modules/rov/sql/job_adjustments.sql b/modules/rov/sql/job_adjustments.sql new file mode 100644 index 00000000000..b2f74eeca51 --- /dev/null +++ b/modules/rov/sql/job_adjustments.sql @@ -0,0 +1,36 @@ +------------------------------------ +-- Rhapsodies of Vana'diel Job SQL Adjustments +-- This module reverts relevant SQL tables for jobs to their pre-RoV values +------------------------------------ +-- Source: https://forum.square-enix.com/ffxi/threads/52969 +------------------------------------ + +------------------------------------ +-- Monk +------------------------------------ + +-- Boost: Revert recast from 60 to 15 seconds +UPDATE abilities SET recastTime = 15 WHERE name = 'boost'; + +-- Focus: Revert recast from 2 to 5 minutes +UPDATE abilities SET recastTime = 300 WHERE name = 'focus'; + +-- Dodge: Revert recast from 2 to 5 minutes +UPDATE abilities SET recastTime = 300 WHERE name = 'dodge'; + +-- Chakra: Revert recast from 3 to 5 minutes +UPDATE abilities SET recastTime = 300 WHERE name = 'chakra'; + +-- Focus Recast merit: Revert value from 4 to 10 seconds per level +UPDATE merits SET value = 10 WHERE name = 'focus_recast'; + +-- Dodge Recast merit: Revert value from 4 to 10 seconds per level +UPDATE merits SET value = 10 WHERE name = 'dodge_recast'; + +-- Chakra Recast merit: Revert value from 6 to 10 seconds per level +UPDATE merits SET value = 10 WHERE name = 'chakra_recast'; + +-- Max HP Boost: Revert trait levels to 35/55/70 +UPDATE traits SET level = 35 WHERE name = 'max hp boost' AND job = 2 AND rank = 2; +UPDATE traits SET level = 55 WHERE name = 'max hp boost' AND job = 2 AND rank = 3; +UPDATE traits SET level = 70 WHERE name = 'max hp boost' AND job = 2 AND rank = 4; diff --git a/scripts/effects/counterstance.lua b/scripts/effects/counterstance.lua index a5c6e79309f..1712b067960 100644 --- a/scripts/effects/counterstance.lua +++ b/scripts/effects/counterstance.lua @@ -10,14 +10,13 @@ effectObject.onEffectGain = function(target, effect) effect:addMod(xi.mod.ATTP, 15) end - target:addMod(xi.mod.COUNTER, effect:getPower()) + effect:addMod(xi.mod.COUNTER, effect:getPower()) end effectObject.onEffectTick = function(target, effect) end effectObject.onEffectLose = function(target, effect) - target:delMod(xi.mod.COUNTER, effect:getPower()) end return effectObject diff --git a/scripts/effects/footwork.lua b/scripts/effects/footwork.lua index f68dbf7c542..f576d0d44c1 100644 --- a/scripts/effects/footwork.lua +++ b/scripts/effects/footwork.lua @@ -7,18 +7,14 @@ local effectObject = {} effectObject.onEffectGain = function(target, effect) local jpLevel = target:getJobPointLevel(xi.jp.FOOTWORK_EFFECT) - target:addMod(xi.mod.KICK_ATTACK_RATE, 20) - target:addMod(xi.mod.KICK_DMG, effect:getPower() + jpLevel) + effect:addMod(xi.mod.KICK_ATTACK_RATE, 20) + effect:addMod(xi.mod.KICK_DMG, effect:getPower() + jpLevel) end effectObject.onEffectTick = function(target, effect) end effectObject.onEffectLose = function(target, effect) - local jpLevel = target:getJobPointLevel(xi.jp.FOOTWORK_EFFECT) - - target:delMod(xi.mod.KICK_ATTACK_RATE, 20) - target:delMod(xi.mod.KICK_DMG, effect:getPower() + jpLevel) end return effectObject diff --git a/sql/traits.sql b/sql/traits.sql index c69f9907fa0..ed610ab43ae 100644 --- a/sql/traits.sql +++ b/sql/traits.sql @@ -149,8 +149,8 @@ INSERT INTO `traits` VALUES (7,'max hp boost',2,15,1,1095,30,NULL,0); INSERT INTO `traits` VALUES (7,'max hp boost',2,25,2,1095,60,NULL,0); INSERT INTO `traits` VALUES (7,'max hp boost',2,35,3,1095,120,NULL,0); INSERT INTO `traits` VALUES (7,'max hp boost',2,45,4,1095,180,NULL,0); -INSERT INTO `traits` VALUES (7,'max hp boost',2,55,5,1095,240,NULL,0); -INSERT INTO `traits` VALUES (7,'max hp boost',2,65,6,1095,280,NULL,0); +INSERT INTO `traits` VALUES (7,'max hp boost',2,55,5,1095,240,'ABYSSEA',0); +INSERT INTO `traits` VALUES (7,'max hp boost',2,65,6,1095,280,'ABYSSEA',0); INSERT INTO `traits` VALUES (7,'max hp boost',7,45,1,1095,30,'SOA',0); INSERT INTO `traits` VALUES (7,'max hp boost',7,85,2,1095,60,'SOA',0); INSERT INTO `traits` VALUES (7,'max hp boost',13,20,1,1095,30,'SOA',0);