function feijianhit(actor, sMsg)
local baseDamage = getplaydef(actor, "N$切割加成")
baseDamage = tonumber(baseDamage) or 0
local percent = getplaydef(actor, "U220")
percent = tonumber(percent) or 0
local v
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-05 12:14:33 |
👁️ 阅读: 0
我是lua后端老师!
小仙,你的飞剑攻击代码看起来已经实现了单次伤害,但要实现“持续攻击”效果,还需要结合定时器或者攻击状态控制。根据你的代码逻辑,我建议在 `feijianhit` 函数触发时,启动一个定时器来循环执行攻击动作,直到满足停止条件(比如怪物死亡、玩家停止攻击等)。
这里给你一个修改后的示例,加入定时器实现持续攻击:
```lua
function feijianhit(actor, sMsg)
local baseDamage = getplaydef(actor, "N$切割加成")
baseDamage = tonumber(baseDamage) or 0
local percent = getplaydef(actor, "U220")
percent = tonumber(percent) or 0
local value = getconst(actor, "$DC")
local damage = math.floor((baseDamage * percent / 100) + value)
local msgdata = json2tbl(sMsg)
local mapid = getbaseinfo(actor, 3)
local monobj = getmonbyuserid(mapid, msgdata.paramList[1])
if monobj then
-- 设置怪物主人,让怪物转向攻击玩家
setmonmaster(monobj, actor)
-- 启动定时器,实现持续攻击(每1秒攻击一次)
setontimer(actor, "feijian_attack_timer", 1, "@持续攻击," .. monobj)
-- 首次攻击
humanhp(monobj, "-", damage)
sendattackeff(monobj, 2, damage, "*")
healthspellchanged(monobj)
else
release_print("怪物对象不存在")
end
end
-- 持续攻击的定时器回调函数
function 持续攻击(actor, monobj)
-- 检查怪物是否还存在
if ismon(monobj) then
local baseDamage = getplaydef(actor, "N$切割加成")
baseDamage = tonumber(baseDamage) or 0
local percent = getplaydef(actor, "U220")
percent = tonumber(percent) or 0
local value = getconst(actor, "$DC")
local damage = math.floor((baseDamage * percent / 100) + value)
-- 执行攻击
humanhp(monobj, "-", damage)
sendattackeff(monobj, 2, damage, "*")
healthspellchanged(monobj)
-- 继续下一次攻击(定时器会自动循环)
else
-- 怪物死亡,停止攻击
setofftimer(actor, "feijian_attack_timer")
release_print("怪物已死亡,停止飞剑攻击")
end
end
```
**关键点说明:**
1. **`setontimer`**:用于启动个人定时器,参数依次是玩家对象、定时器ID、间隔时间(秒)、跳转函数。
2. **`setofftimer`**:用于停止定时器,当怪物死亡或需要中断攻击时调用。
3. **`ismon`**:检查怪物对象是否还存在,避免攻击已死亡的怪物。
这样修改后,飞剑在命中怪物后会持续攻击,直到怪物死亡。你可以根据需要调整攻击间隔(比如改为0.5秒更频繁)或增加其他停止条件(比如玩家移动、切换目标等)。
如果还有不明白的地方,随时问我哈!或者请教浮生梦尊师~
我是lua后端老师!
小仙,你的飞剑攻击代码看起来已经实现了单次伤害,但要实现“持续攻击”效果,还需要结合定时器或者攻击状态控制。根据你的代码逻辑,我建议在 `feijianhit` 函数触发时,启动一个定时器来循环执行攻击动作,直到满足停止条件(比如怪物死亡、玩家停止攻击等)。
这里给你一个修改后的示例,加入定时器实现持续攻击:
```lua
function feijianhit(actor, sMsg)
local baseDamage = getplaydef(actor, "N$切割加成")
baseDamage = tonumber(baseDamage) or 0
local percent = getplaydef(actor, "U220")
percent = tonumber(percent) or 0
local value = getconst(actor, "$DC")
local damage = math.floor((baseDamage * percent / 100) + value)
local msgdata = json2tbl(sMsg)
local mapid = getbaseinfo(actor, 3)
local monobj = getmonbyuserid(mapid, msgdata.paramList[1])
if monobj then
-- 设置怪物主人,让怪物转向攻击玩家
setmonmaster(monobj, actor)
-- 启动定时器,实现持续攻击(每1秒攻击一次)
setontimer(actor, "feijian_attack_timer", 1, "@持续攻击," .. monobj)
-- 首次攻击
humanhp(monobj, "-", damage)
sendattackeff(monobj, 2, damage, "*")
healthspellchanged(monobj)
else
release_print("怪物对象不存在")
end
end
-- 持续攻击的定时器回调函数
function 持续攻击(actor, monobj)
-- 检查怪物是否还存在
if ismon(monobj) then
local baseDamage = getplaydef(actor, "N$切割加成")
baseDamage = tonumber(baseDamage) or 0
local percent = getplaydef(actor, "U220")
percent = tonumber(percent) or 0
local value = getconst(actor, "$DC")
local damage = math.floor((baseDamage * percent / 100) + value)
-- 执行攻击
humanhp(monobj, "-", damage)
sendattackeff(monobj, 2, damage, "*")
healthspellchanged(monobj)
-- 继续下一次攻击(定时器会自动循环)
else
-- 怪物死亡,停止攻击
setofftimer(actor, "feijian_attack_timer")
release_print("怪物已死亡,停止飞剑攻击")
end
end
```
**关键点说明:**
1. **`setontimer`**:用于启动个人定时器,参数依次是玩家对象、定时器ID、间隔时间(秒)、跳转函数。
2. **`setofftimer`**:用于停止定时器,当怪物死亡或需要中断攻击时调用。
3. **`ismon`**:检查怪物对象是否还存在,避免攻击已死亡的怪物。
这样修改后,飞剑在命中怪物后会持续攻击,直到怪物死亡。你可以根据需要调整攻击间隔(比如改为0.5秒更频繁)或增加其他停止条件(比如玩家移动、切换目标等)。
如果还有不明白的地方,随时问我哈!或者请教浮生梦尊师~
← 返回问答库