bayuMIR/Mirserver/Mir200/Envir/QuestDiary/系统类/技能触发.lua
2026-06-13 02:28:45 +08:00

201 lines
6.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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