From 9848ba067a4107839dd9da67897e6322d700a872 Mon Sep 17 00:00:00 2001 From: MrSent Date: Wed, 29 Apr 2026 22:26:26 +0100 Subject: [PATCH 1/2] Mnejing, gambits, scripts, sql and mob_skill.lua additions --- scripts/actions/mobskills/chimera_ripper.lua | 30 +++++++++++++++ scripts/actions/mobskills/disruptor.lua | 26 +++++++++++++ scripts/actions/mobskills/flashbulb.lua | 24 ++++++++++++ .../actions/mobskills/shield_subverter.lua | 35 +++++++++++++++++ scripts/actions/mobskills/string_clipper.lua | 30 +++++++++++++++ scripts/actions/spells/trust/mnejing.lua | 38 +++++++++++++++++++ sql/mob_skill_lists.sql | 4 +- 7 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 scripts/actions/mobskills/chimera_ripper.lua create mode 100644 scripts/actions/mobskills/disruptor.lua create mode 100644 scripts/actions/mobskills/flashbulb.lua create mode 100644 scripts/actions/mobskills/shield_subverter.lua create mode 100644 scripts/actions/mobskills/string_clipper.lua diff --git a/scripts/actions/mobskills/chimera_ripper.lua b/scripts/actions/mobskills/chimera_ripper.lua new file mode 100644 index 00000000000..4eb7e7cf82a --- /dev/null +++ b/scripts/actions/mobskills/chimera_ripper.lua @@ -0,0 +1,30 @@ +----------------------------------- +-- Chimera Ripper +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 6.0, 8.5, 11.0 } + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/disruptor.lua b/scripts/actions/mobskills/disruptor.lua new file mode 100644 index 00000000000..c058963dd67 --- /dev/null +++ b/scripts/actions/mobskills/disruptor.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- Disruptor +-- Description: Dispels one effects from a target. +-- Type: Enfeebling +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local dispel = target:dispelStatusEffect() + + if dispel == xi.effect.NONE then + -- no effect + skill:setMsg(xi.msg.basic.SKILL_NO_EFFECT) -- no effect + else + skill:setMsg(xi.msg.basic.SKILL_ERASE) + end + + return dispel +end + +return mobskillObject diff --git a/scripts/actions/mobskills/flashbulb.lua b/scripts/actions/mobskills/flashbulb.lua new file mode 100644 index 00000000000..5c856153144 --- /dev/null +++ b/scripts/actions/mobskills/flashbulb.lua @@ -0,0 +1,24 @@ +----------------------------------- +-- Flashbulb +-- Family: Atomaton +-- Description: Automaton will use Flash. +-- Type: A light-based automaton attachment. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + if mob:isTrust() then + target:addEnmity(mob, 180, 1280) + end + + skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 0, 0, 15)) -- Handled in status effect + + return xi.effect.FLASH +end + +return mobskillObject diff --git a/scripts/actions/mobskills/shield_subverter.lua b/scripts/actions/mobskills/shield_subverter.lua new file mode 100644 index 00000000000..e3150f80fd9 --- /dev/null +++ b/scripts/actions/mobskills/shield_subverter.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Shield Subverter +-- Family: Automaton +-- Description: Deals AoE Conal damage. Additional effect: Silence. +-- Notes: Only available to the Mnejing Trust. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 1.0, 2.0, 3.0 } + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.BLUNT + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 15) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/string_clipper.lua b/scripts/actions/mobskills/string_clipper.lua new file mode 100644 index 00000000000..3d6b69158f9 --- /dev/null +++ b/scripts/actions/mobskills/string_clipper.lua @@ -0,0 +1,30 @@ +----------------------------------- +-- String Clipper +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/spells/trust/mnejing.lua b/scripts/actions/spells/trust/mnejing.lua index 192ee54ed72..2ee6445fff5 100644 --- a/scripts/actions/spells/trust/mnejing.lua +++ b/scripts/actions/spells/trust/mnejing.lua @@ -14,6 +14,44 @@ end spellObject.onMobSpawn = function(mob) xi.trust.message(mob, xi.trust.messageOffset.SPAWN) + + mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) + mob:setMobMod(xi.mobMod.CAN_PARRY, 3) + mob:setMod(xi.mod.SHIELD_MASTERY_TP, 40) -- Possesses Barrier Module (Increased Shield Mastery) + mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- Possesses Barrier Module (Increased Block Chance, 45% base block rate from testing) + mob:addMod(xi.mod.DMG, -375) -- Passive -37.5% Damage Taken Reduction. + + local lastSynergyBonus = 0 + + mob:addListener('COMBAT_TICK', 'MNEJING_CTICK', function(mobArg) + local targetBonus = 0 + local party = mobArg:getMaster():getPartyWithTrusts() + + for _, member in pairs(party) do + if member:getObjType() == xi.objType.TRUST then + if member:getTrustID() == xi.magic.spell.NASHMEIRA then + targetBonus = 10 + end + end + end + + if targetBonus ~= lastSynergyBonus then + mobArg:delMod(xi.mod.DEF, lastSynergyBonus) + mobArg:delMod(xi.mod.ENMITY, lastSynergyBonus) + mobArg:addMod(xi.mod.DEF, targetBonus) + mobArg:addMod(xi.mod.ENMITY, targetBonus) + + lastSynergyBonus = targetBonus + end + end) + + mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.PROVOKE_AUTOMATON }, 30) + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.FLASHBULB_AUTOMATON }, 45) + mob:addGambit(ai.t.TARGET, { ai.c.READYING_MS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 60) + mob:addGambit(ai.t.TARGET, { ai.c.READYING_WS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 60) + mob:addGambit(ai.t.TARGET, { ai.c.STATUS_FLAG, xi.effectFlag.DISPELABLE }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.DISRUPTOR_AUTOMATON }, 15) + + mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 1500) end spellObject.onMobDespawn = function(mob) diff --git a/sql/mob_skill_lists.sql b/sql/mob_skill_lists.sql index d36ddf6dd21..33723234b31 100644 --- a/sql/mob_skill_lists.sql +++ b/sql/mob_skill_lists.sql @@ -3490,7 +3490,9 @@ INSERT INTO `mob_skill_lists` VALUES ('TRUST_Lehko_Habhoka',1037,3233); -- Lunar INSERT INTO `mob_skill_lists` VALUES ('TRUST_Nashmeira',1038,3243); -- Imperial Authority -- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Zazarg',1039,0); -- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Ovjang',1040,0); --- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Mnejing',1041,0); +INSERT INTO `mob_skill_lists` VALUES ('TRUST_Mnejing',1041,1940); -- Chimera Ripper +INSERT INTO `mob_skill_lists` VALUES ('TRUST_Mnejing',1041,1941); -- String Clipper +INSERT INTO `mob_skill_lists` VALUES ('TRUST_Mnejing',1041,3245); -- Shield Subverter -- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Sakura',1042,0); -- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Luzaf',1043,0); -- INSERT INTO `mob_skill_lists` VALUES ('TRUST_Najelith',1044,0); From 90bc6d3543a8719eb7623be3076135435a13ab92 Mon Sep 17 00:00:00 2001 From: MrSent Date: Fri, 1 May 2026 14:25:15 +0100 Subject: [PATCH 2/2] Conflict fix for automaton skills in mob_skill.lua --- scripts/enum/mob_skill.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/enum/mob_skill.lua b/scripts/enum/mob_skill.lua index 35e110a4e9b..923a5db34aa 100644 --- a/scripts/enum/mob_skill.lua +++ b/scripts/enum/mob_skill.lua @@ -887,6 +887,10 @@ xi.mobSkill = WARP_IN_GESSHO = 1939, SLAPSTICK = 1943, + SHIELD_BASH_AUTOMATON = 1944, -- Used by the trust Mnejing but may also be used by mobs. + PROVOKE_AUTOMATON = 1945, -- Used by the trust Mnejing but may also be used by mobs. + FLASHBULB_AUTOMATON = 1947, -- Used by the trust Mnejing but may also be used by mobs. + DISRUPTOR_AUTOMATON = 2747, -- Used by the trust Mnejing but may also be used by mobs. RANGED_ATTACK_15 = 1949,