201 lines
6.6 KiB
Lua
201 lines
6.6 KiB
Lua
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
|