MagicOBJ = {} function beginmagic(actor, magicId, magicName, target, x, y) if magicId == 25 and isplayer(actor) then local self_id = getbaseinfo(actor, ConstCfg.gbase.id) if JueXueXiuLianOBJ.CaChe[self_id][7] then ---* 圆月刀法 releasemagic(actor, 2012, 1, 3, target, 1) return false end end if magicId == 56 and isplayer(actor) then local self_id = getbaseinfo(actor, ConstCfg.gbase.id) if JueXueXiuLianOBJ.CaChe[self_id][20] then if Func.random(20) then makeposion(target, 12, 2, 1) Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,冰冻目标持续2s.#7", "追云逐日")) end end end if magicId == 6 then local Bool = checkhumanstate(target, 11, 1) if Bool then return false end end end ---*沉默 对目标人物使用技能时自身触发 function magtagfunc2013(actor, roleObject) if not hasbuff(roleObject, 10013) then addbuff(roleObject, 10013) end end -- 玩家推动技能(野蛮冲撞/抗拒火环/气波功/自定义推动技能)施法前触发 function canpush(actor, target, hitter, magicId) if os.time() - Player.getint(target, VarCfg.Player.int.cd["不动明王"]) >= 10 then magtagfunc27(actor, target) Player.setint(target, VarCfg.Player.int.cd["不动明王"], os.time()) end -- LOGPrint("推动技能进来了:", Player.getname(actor), Player.getname(target), Player.getname(hitter), magicId) end -- 对目标人物使用野蛮冲撞时自身触发 function magtagfunc27(actor, roleObject) if isplayer(actor) then local self_id = getbaseinfo(actor, ConstCfg.gbase.id) if JueXueXiuLianOBJ.CaChe[self_id][10] then if not hasbuff(roleObject, 10002) then addbuff(roleObject, 10002, 1) playeffect(roleObject, 33, 0, 0, 1, 0, 0) Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使目标定身1秒.#7", "不动明王")) end end if JueXueXiuLianOBJ.CaChe[self_id][11] then if not hasbuff(roleObject, 10003) then addbuff(roleObject, 10003, 3) Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使目标禁止使用回城、随机、传送.#7", "恶魔降临")) end end end end function magselffunc27(actor) if isplayer(actor) then local self_id = getbaseinfo(actor, ConstCfg.gbase.id) if JueXueXiuLianOBJ.CaChe[self_id][12] then if Player.gettempint(actor, VarCfg.Player.temp.int["迅捷如风"]) == 0 then if Func.random(20) then SetSkillCD(actor, 27, 0) Player.settempint(actor, VarCfg.Player.temp.int["迅捷如风"], 1) Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,刷新野蛮冲撞CD.#7", "迅捷如风")) end else SetSkillCD(actor, 27, 10000) Player.settempint(actor, VarCfg.Player.temp.int["迅捷如风"], 0) end end end end function magselffunc26(actor) if isplayer(actor) then local self_id = getbaseinfo(actor, ConstCfg.gbase.id) if JueXueXiuLianOBJ.CaChe[self_id][15] then if Player.gettempint(actor, VarCfg.Player.temp.int["熔灵再生"]) == 0 then if Func.random(30) then releasemagic(actor, 26, 1, 3, 1, 1) Player.settempint(actor, VarCfg.Player.temp.int["熔灵再生"], 1) Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,刷新烈火剑法CD.#7", "熔灵再生")) end else Player.settempint(actor, VarCfg.Player.temp.int["熔灵再生"], 0) end end end end function magselffunc2014(actor) if isplayer(actor) then if addbuff(actor, 10030) then Func.sendmsg(actor, "[神禁领域]:#70|开启触发,伤害减免+10%,神圣一击概率+5% 持续10s.#7") end end end ---* ========== 技能CD事件系统 ========== MagicOBJ.SkillCD_handlers = {} ---* 技能ID→技能名映射(供getskillcscd查询原始CD用) MagicOBJ.SkillNameMap = { [66] = "开天斩", [26] = "烈火剑法", [56] = "逐日剑法", [12] = "刺杀剑术", } ---* 注册技能CD减少源 ---* key: 唯一标识(如"套装_xxx") ---* callback: function(actor) -> {{skillId, cdMs}, ...} or nil function MagicOBJ:regSkillCD(key, callback) if not key or not callback then LOGPrint("regSkillCD 注册失败: key或callback为空") return end MagicOBJ.SkillCD_handlers[key] = callback end ---* 注销技能CD减少源 function MagicOBJ:unregSkillCD(key) MagicOBJ.SkillCD_handlers[key] = nil end ---* 推送技能CD刷新事件(外部统一入口) ---* 回调返回的是减少量(reductionMs),此函数用原始CD减去减少量 function MagicOBJ:pushSkillCD(actor) local reduceMap = {} -- {skillId = totalReductionMs} for key, callback in pairs(self.SkillCD_handlers or {}) do local ok, ret = pcall(callback, actor) if ok and ret then for _, v in ipairs(ret) do local skillId, reductionMs = v[1], v[2] if skillId and reductionMs and reductionMs > 0 then ---* 多个来源减同一技能CD,累加减少量 reduceMap[skillId] = (reduceMap[skillId] or 0) + reductionMs end end end end ---* 遍历所有映射技能,先恢复原始CD再减(防止脱装备后CD不恢复) for skillId, skillName in pairs(MagicOBJ.SkillNameMap) do local originalCD = getskillcscd(skillName) or 0 if originalCD > 0 then local totalReduce = reduceMap[skillId] or 0 local finalCD = math.max(0, originalCD - totalReduce) SetSkillMaxCD(actor, skillId, finalCD) end end end ---* 套装技能CD配置 ---* value = {{skillId, reductionMs}, ...} 减少量(毫秒) MagicOBJ.SuitSkillCD = { [2001] = {{66, 1000},{26, 1000},{56, 1000}}, -- 减1秒 [2002] = {{66, 2000},{26, 2000},{56, 2000}}, -- 减2秒 [2003] = {{66, 3000},{56, 3000},{26, 3000}}, -- 减3秒 [2004] = {{66, 4000},{56, 4000},{26, 4000}}, -- 减4秒 } ---* 注册:根据已激活套装减少技能CD MagicOBJ:regSkillCD("套装技能CD", function(actor) local suits = GetActiveEquipSuits(actor) or {} local result = {} for _, suitId in ipairs(suits) do local cfg = MagicOBJ.SuitSkillCD[suitId] if cfg then for _, v in ipairs(cfg) do table.insert(result, v) end end end if #result > 0 then return result end return nil end) ---* 登录时推送技能CD GameEvent.add(EventCfg.onLogin, function(actor) MagicOBJ:pushSkillCD(actor) end, MagicOBJ) return MagicOBJ