From 09872ddadac8e362f8b11717d692b413d2e7f38d Mon Sep 17 00:00:00 2001 From: Skold <113406182+Skold177@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:40:15 -0400 Subject: [PATCH] Move Automaton Mods From C++ to LUA / Add CD to Automaton Abilities Moves some automaton modifiers from C++ into LUA and adds a cooldown to automaton attachment abilities when summoned. --- scripts/globals/pets/automaton.lua | 96 ++++++++++++++++++++++++++++-- src/map/utils/petutils.cpp | 9 --- 2 files changed, 92 insertions(+), 13 deletions(-) diff --git a/scripts/globals/pets/automaton.lua b/scripts/globals/pets/automaton.lua index 3b2c540b275..e745412c203 100644 --- a/scripts/globals/pets/automaton.lua +++ b/scripts/globals/pets/automaton.lua @@ -5,17 +5,105 @@ xi = xi or {} xi.pets = xi.pets or {} xi.pets.automaton = {} +xi.pets.automaton.frameMods = +{ + ----------------------------------- + -- Harlequin + ----------------------------------- + [xi.automaton.frame.HARLEQUIN] = + { + mods = + { + { xi.mod.DMG, -625 }, + }, + }, + + ----------------------------------- + -- Valoredge + ----------------------------------- + [xi.automaton.frame.VALOREDGE] = + { + mobMods = + { + { xi.mobMod.CAN_SHIELD_BLOCK, 1 }, + }, + + mods = + { + { xi.mod.SHIELDBLOCKRATE, 45 }, + { xi.mod.DMG, -1250 }, + }, + }, + + ----------------------------------- + -- Sharpshot + ----------------------------------- + [xi.automaton.frame.SHARPSHOT] = + { + mods = + { + { xi.mod.PIERCE_SDT, 8750 }, + { xi.mod.DMGBREATH, -1250 }, + { xi.mod.DMGMAGIC, -1250 }, + }, + }, + + ----------------------------------- + -- Stormwaker + ----------------------------------- + [xi.automaton.frame.STORMWAKER] = + { + mods = + { + { xi.mod.DMGBREATH, -2500 }, + { xi.mod.DMGMAGIC, -2500 }, + }, + }, +} + +local function applyAutomatonFrameMods(mob) + local frameEquipped = mob:getAutomatonFrame() + local frameData = xi.pets.automaton.frameMods[frameEquipped] + + if not frameData then + return + end + + for _, mobModData in ipairs(frameData.mobMods or {}) do + mob:setMobMod(mobModData[1], mobModData[2]) + end + + for _, modData in ipairs(frameData.mods or {}) do + mob:setMod(modData[1], modData[2]) + end +end + xi.pets.automaton.onMobSpawn = function(mob) + mob:setMobMod(xi.mobMod.CAN_PARRY, 1) + applyAutomatonFrameMods(mob) + mob:setLocalVar('MANEUVER_DURATION', 60) + mob:addListener('EFFECTS_TICK', 'MANEUVER_DURATION', function(automaton) if automaton:getTarget() then - local dur = automaton:getLocalVar('MANEUVER_DURATION') - automaton:setLocalVar('MANEUVER_DURATION', math.min(dur + 3, 300)) + local maneuverDuration = automaton:getLocalVar('MANEUVER_DURATION') + automaton:setLocalVar('MANEUVER_DURATION', math.min(maneuverDuration + 3, 300)) end end) - -- Barrage Turbine cannot be used unless the automaton has been active for at least 3 minutes. - mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.BARRAGE_TURBINE, 60 * 3) + -- All Automaton Attachments have their cooldowns applied on spawn. + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.BARRAGE_TURBINE, 180) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.DISRUPTOR, 60) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.ECONOMIZER, 60) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.ERASER, 30) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.FLASHBULB, 45) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.HEAT_CAPACITOR, 90) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.MANA_CONVERTER, 180) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.PROVOKE, 30) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.REACTIVE_SHIELD, 60) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.REGULATOR, 60) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.REPLICATOR, 60) + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.SHOCK_ABSORBER, 180) end xi.pets.automaton.onMobDeath = function(mob) diff --git a/src/map/utils/petutils.cpp b/src/map/utils/petutils.cpp index 3f2d22172a0..af48207e319 100644 --- a/src/map/utils/petutils.cpp +++ b/src/map/utils/petutils.cpp @@ -596,27 +596,18 @@ void LoadAutomatonStats(CCharEntity* PMaster, CPetEntity* PPet, Pet_t* petStats, default: // case AutomatonFrame::Harlequin: PPet->WorkingSkills.evasion = battleutils::GetMaxSkill(4, mlvl > 99 ? 99 : mlvl); PPet->setModifier(Mod::DEF, battleutils::GetMaxSkill(11, mlvl > 99 ? 99 : mlvl)); - PPet->setModifier(Mod::DMG, -625); break; case AutomatonFrame::Valoredge: - PPet->setModifier(Mod::SHIELDBLOCKRATE, 45); - PPet->setMobMod(MOBMOD_CAN_SHIELD_BLOCK, 1); - PPet->setModifier(Mod::DMG, -1250); PPet->WorkingSkills.evasion = battleutils::GetMaxSkill(7, mlvl > 99 ? 99 : mlvl); PPet->setModifier(Mod::DEF, battleutils::GetMaxSkill(8, mlvl > 99 ? 99 : mlvl)); break; case AutomatonFrame::Sharpshot: PPet->WorkingSkills.evasion = battleutils::GetMaxSkill(2, mlvl > 99 ? 99 : mlvl); PPet->setModifier(Mod::DEF, battleutils::GetMaxSkill(12, mlvl > 99 ? 99 : mlvl)); - PPet->setModifier(Mod::PIERCE_SDT, 8750); - PPet->setModifier(Mod::DMGBREATH, -1250); - PPet->setModifier(Mod::DMGMAGIC, -1250); break; case AutomatonFrame::Stormwaker: PPet->WorkingSkills.evasion = battleutils::GetMaxSkill(10, mlvl > 99 ? 99 : mlvl); PPet->setModifier(Mod::DEF, battleutils::GetMaxSkill(12, mlvl > 99 ? 99 : mlvl)); - PPet->setModifier(Mod::DMGBREATH, -2500); - PPet->setModifier(Mod::DMGMAGIC, -2500); break; }