-- 斩击印 剑意已成,攻击怪物时有概率造成连斩效果,伤害递减。55%、45%、35%、25%、15%
[60270] = function(actor, target, hiter, skillid, damage, Model, value)
if not hasbuff(actor,60270) then return end
if hasbuff(target,60271) then return end
if skillid ~=
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-29 18:03:43 |
👁️ 阅读: 11
我是lua后端老师!
小仙,你这个问题涉及到定时触发和递归调用,让我看看你的代码。根据你的需求,每0.2秒触发一次`func_60270`函数,共触发5次,这确实需要用到定时器功能。
从你的代码看,你已经在`[60270]`函数中设置了斩击印次数为5,现在需要定时触发伤害递减效果。这里不需要递归函数,应该使用`setontimer`或`setontimerex`来创建定时器。
让我给你一个完整的解决方案:
```lua
-- 斩击印 剑意已成,攻击怪物时有概率造成连斩效果,伤害递减。55%、45%、35%、25%、15%
[60270] = function(actor, target, hiter, skillid, damage, Model, value)
if not hasbuff(actor, 60270) then return end
if hasbuff(target, 60271) then return end
if skillid ~= 12 then return end
-- 设置初始值
setint(actor, "斩击印伤害", damage)
setint(actor, "斩击印次数", 5)
setint(actor, "斩击印目标", target) -- 保存目标对象
-- 给目标添加buff
addbuff(target, 60271, 1, 1, actor)
-- 发送消息
local msg1 = "触发{[斩击印]|253:0:1} : 对目标 {连续斩击|251:0:1}"
local msg2 = "受到{[斩击印]|253:0:1} : 对自身 {连续斩击|249:0:1}"
ATTACK_func.buff_msg(actor, target, msg1, msg2)
-- 立即触发第一次伤害
ATTACK_buff.func_60270(actor)
-- 设置定时器,每0.2秒触发一次,共触发4次(加上立即触发的那次共5次)
setontimer(actor, "斩击印定时器", 200, "func_60270_timer") -- 200毫秒 = 0.2秒
return damage
end,
-- 定时器触发函数
func_60270_timer = function(actor)
-- 获取剩余次数
local 剩余次数 = getint(actor, "斩击印次数")
local 目标 = getint(actor, "斩击印目标")
if 剩余次数 > 0 then
-- 触发伤害
ATTACK_buff.func_60270(actor)
-- 减少次数
setint(actor, "斩击印次数", 剩余次数 - 1)
if 剩余次数 - 1 <= 0 then
-- 次数用完,清除定时器
setofftimer(actor, "斩击印定时器")
-- 清除变量
setint(actor, "斩击印伤害", 0)
setint(actor, "斩击印次数", 0)
setint(actor, "斩击印目标", 0)
end
else
-- 清除定时器
setofftimer(actor, "斩击印定时器")
end
end,
-- 修改后的伤害计算函数
func_60270 = function(actor)
local 伤害 = getint(actor, "斩击印伤害")
local 当前次数 = getint(actor, "斩击印次数")
local 目标 = getint(actor, "斩击印目标")
if 伤害 <= 0 or 当前次数 <= 0 then return end
-- 伤害递减比例表
local list = {0.55, 0.45, 0.35, 0.25, 0.15}
-- 计算当前伤害(第1次用list[1]=0.55,第2次用list[2]=0.45,依此类推)
local 当前伤害 = math.floor(伤害 * list[6 - 当前次数]) -- 6-当前次数 是为了正确索引
-- 发送飘血效果
if 目标 and 目标 ~= 0 then
sendattackeff(目标, 110, 当前伤害, "*")
end
release_print("斩击印触发,当前次数:" .. 当前次数 .. ",伤害:" .. 当前伤害)
end
```
**关键点说明:**
1. **定时器设置**:使用`setontimer(actor, "斩击印定时器", 200, "func_60270_timer")`
- 参数1:玩家对象
- 参数2:定时器名称(唯一标识)
- 参数3:时间间隔(毫秒,200毫秒=0.2秒)
- 参数4:触发函数名
2. **立即触发**:在`[60270]`函数中立即调用一次`func_60270`,然后定时器再触发4次,总共5次
3. **变量保存**:需要保存目标对象,因为定时器触发时无法获取原始目标
4. **定时器清理**:在次数用完时使用`setofftimer`清除定时器
5. **QF注册**:确保你的QF文件中有`ontimer`触发接口:
```lua
function ontimer(actor, timerName)
if timerName == "斩击印定时器" then
func_60270_timer(actor)
end
end
```
这样就能实现每0.2秒触发一次,共触发5次的效果了。不需要递归函数,使用定时器更稳定可靠!
我是lua后端老师!
小仙,你这个问题涉及到定时触发和递归调用,让我看看你的代码。根据你的需求,每0.2秒触发一次`func_60270`函数,共触发5次,这确实需要用到定时器功能。
从你的代码看,你已经在`[60270]`函数中设置了斩击印次数为5,现在需要定时触发伤害递减效果。这里不需要递归函数,应该使用`setontimer`或`setontimerex`来创建定时器。
让我给你一个完整的解决方案:
```lua
-- 斩击印 剑意已成,攻击怪物时有概率造成连斩效果,伤害递减。55%、45%、35%、25%、15%
[60270] = function(actor, target, hiter, skillid, damage, Model, value)
if not hasbuff(actor, 60270) then return end
if hasbuff(target, 60271) then return end
if skillid ~= 12 then return end
-- 设置初始值
setint(actor, "斩击印伤害", damage)
setint(actor, "斩击印次数", 5)
setint(actor, "斩击印目标", target) -- 保存目标对象
-- 给目标添加buff
addbuff(target, 60271, 1, 1, actor)
-- 发送消息
local msg1 = "触发{[斩击印]|253:0:1} : 对目标 {连续斩击|251:0:1}"
local msg2 = "受到{[斩击印]|253:0:1} : 对自身 {连续斩击|249:0:1}"
ATTACK_func.buff_msg(actor, target, msg1, msg2)
-- 立即触发第一次伤害
ATTACK_buff.func_60270(actor)
-- 设置定时器,每0.2秒触发一次,共触发4次(加上立即触发的那次共5次)
setontimer(actor, "斩击印定时器", 200, "func_60270_timer") -- 200毫秒 = 0.2秒
return damage
end,
-- 定时器触发函数
func_60270_timer = function(actor)
-- 获取剩余次数
local 剩余次数 = getint(actor, "斩击印次数")
local 目标 = getint(actor, "斩击印目标")
if 剩余次数 > 0 then
-- 触发伤害
ATTACK_buff.func_60270(actor)
-- 减少次数
setint(actor, "斩击印次数", 剩余次数 - 1)
if 剩余次数 - 1 <= 0 then
-- 次数用完,清除定时器
setofftimer(actor, "斩击印定时器")
-- 清除变量
setint(actor, "斩击印伤害", 0)
setint(actor, "斩击印次数", 0)
setint(actor, "斩击印目标", 0)
end
else
-- 清除定时器
setofftimer(actor, "斩击印定时器")
end
end,
-- 修改后的伤害计算函数
func_60270 = function(actor)
local 伤害 = getint(actor, "斩击印伤害")
local 当前次数 = getint(actor, "斩击印次数")
local 目标 = getint(actor, "斩击印目标")
if 伤害 <= 0 or 当前次数 <= 0 then return end
-- 伤害递减比例表
local list = {0.55, 0.45, 0.35, 0.25, 0.15}
-- 计算当前伤害(第1次用list[1]=0.55,第2次用list[2]=0.45,依此类推)
local 当前伤害 = math.floor(伤害 * list[6 - 当前次数]) -- 6-当前次数 是为了正确索引
-- 发送飘血效果
if 目标 and 目标 ~= 0 then
sendattackeff(目标, 110, 当前伤害, "*")
end
release_print("斩击印触发,当前次数:" .. 当前次数 .. ",伤害:" .. 当前伤害)
end
```
**关键点说明:**
1. **定时器设置**:使用`setontimer(actor, "斩击印定时器", 200, "func_60270_timer")`
- 参数1:玩家对象
- 参数2:定时器名称(唯一标识)
- 参数3:时间间隔(毫秒,200毫秒=0.2秒)
- 参数4:触发函数名
2. **立即触发**:在`[60270]`函数中立即调用一次`func_60270`,然后定时器再触发4次,总共5次
3. **变量保存**:需要保存目标对象,因为定时器触发时无法获取原始目标
4. **定时器清理**:在次数用完时使用`setofftimer`清除定时器
5. **QF注册**:确保你的QF文件中有`ontimer`触发接口:
```lua
function ontimer(actor, timerName)
if timerName == "斩击印定时器" then
func_60270_timer(actor)
end
end
```
这样就能实现每0.2秒触发一次,共触发5次的效果了。不需要递归函数,使用定时器更稳定可靠!
← 返回问答库