function attack(actor, Target, Hiter)
local playercutting = getbaseinfo(actor, 51, 216) --刀刀秒人
humanhp(Target, "-", playercutting)
local monsterDamage = getbaseinfo(actor, 51, 215) --刀刀切割
local monster = ismon(Target)
if mons
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-08 16:32:21 |
👁️ 阅读: 0
我是lua后端老师!
小仙,我来帮你补全这个刀刀减伤功能。从你的代码来看,思路是对的,但需要把减伤逻辑应用到实际伤害上,并且修正一些细节。另外,我注意到你用了`p`函数,在996引擎中,我们通常使用`release_print()`来打印调试信息。
首先,我们检查一下`QF`中是否有`attack`这个触发接口。如果存在,我们就可以在攻击触发时进行伤害计算和减伤处理。
根据你的需求,我来补全代码。主要思路是:当攻击者和被攻击者都有刀刀减伤属性(`51`类型,`216`索引)时,根据攻击者的减伤数值(`51`类型,`219`索引)来减少本次攻击造成的伤害。
```lua
function attack(actor, Target, Hiter)
-- 刀刀秒人(对玩家)
local playercutting = getbaseinfo(actor, 51, 216) -- 获取刀刀秒人值
if playercutting > 0 then
humanhp(Target, "-", playercutting) -- 对目标造成固定伤害
end
-- 刀刀切割(对怪物)
local monsterDamage = getbaseinfo(actor, 51, 215) -- 获取刀刀切割值
local monster = ismon(Target) -- 判断目标是否为怪物
if monster and monsterDamage > 0 then
humanhp(Target, "-", monsterDamage) -- 对怪物造成固定伤害
end
-- 刀刀减伤逻辑补全
local playercutting11 = getbaseinfo(actor, 51, 216) -- 攻击者的刀刀减伤标记
local Targetcutting11 = getbaseinfo(Target, 51, 216) -- 被攻击者的刀刀减伤标记
if playercutting11 > 0 and Targetcutting11 > 0 then
local knifeAndBladeReduction = getbaseinfo(actor, 51, 219) -- 获取减伤数值
-- 这里需要计算原始伤害并应用减伤
-- 注意:原版humanhp可能无法直接获取本次攻击的原始伤害值
-- 一个常见的做法是,在减伤触发时,给目标添加一个吸收伤害的buff
-- 或者设置伤害吸收属性
-- 示例:设置伤害吸收(总吸收量=减伤值,比率=100%,成功率=100%)
setsuckdamage(Target, "=", knifeAndBladeReduction, 1000, 100)
-- 打印日志
release_print("玩家" .. actor .. "攻击" .. Target .. "触发刀刀减伤,减伤值:" .. knifeAndBladeReduction)
-- 注意:setsuckdamage是设置一个持续性的伤害吸收
-- 如果只需要单次减伤,需要在减伤后清除这个吸收效果
-- 可以配合定时器来实现
end
end
```
**代码说明:**
1. **刀刀秒人**:直接使用`humanhp`对目标造成固定伤害。
2. **刀刀切割**:先判断目标是否为怪物,再造成伤害。
3. **刀刀减伤(关键补全)**:
* 当攻击双方都有减伤标记时,获取攻击者的减伤数值。
* 使用`setsuckdamage`函数为目标设置伤害吸收。参数说明:
* `Target`:被攻击者对象
* `"="`:操作符,直接设置
* `knifeAndBladeReduction`:总吸收伤害量
* `1000`:吸收比率(1000 = 100%)
* `100`:吸收成功率(100 = 100%)
* 使用`release_print`输出日志。
**重要提醒:**
* `setsuckdamage`设置的伤害吸收是**持续生效**的,直到吸收量耗尽或被清除。
* 如果你希望**每次攻击独立计算减伤**,需要在减伤生效后立即清除吸收效果。这通常需要配合`ontimer`触发器来实现。
* 这个减伤逻辑是作用在**被攻击者**身上的,即被攻击者获得一个伤害吸收护盾。
**扩展建议(如果需要单次攻击减伤):**
```lua
-- 在attack函数中,刀刀减伤部分可以改为:
if playercutting11 > 0 and Targetcutting11 > 0 then
local knifeAndBladeReduction = getbaseinfo(actor, 51, 219)
-- 先获取当前伤害吸收值
local currentSuck = getsuckdamage(Target)
-- 临时增加吸收值(单次)
setsuckdamage(Target, "+", knifeAndBladeReduction, 1000, 100)
release_print("玩家" .. actor .. "攻击" .. Target .. "触发刀刀减伤,临时增加吸收值:" .. knifeAndBladeReduction)
-- 设置定时器,在短时间内清除临时吸收(例如0.1秒后)
setontimerex(Target, "ClearTempSuck", 1, 1, 0) -- 注意:实际使用需要调整时间参数
end
-- 在QF中需要添加对应的定时器触发
function ClearTempSuck(actor, timerid)
-- 清除临时吸收效果,恢复原来的吸收值
-- 这里需要记录原来的吸收值,逻辑会复杂一些
setsuckdamage(actor, "=", originalSuckDamage, 1000, 100)
end
```
小仙,这样补全后,你的刀刀减伤功能就基本完成了。不过实际应用中,你可能需要根据具体的游戏数值平衡来调整。如果还有不明白的地方,随时问我,或者请教浮生梦尊师!
我是lua后端老师!
小仙,我来帮你补全这个刀刀减伤功能。从你的代码来看,思路是对的,但需要把减伤逻辑应用到实际伤害上,并且修正一些细节。另外,我注意到你用了`p`函数,在996引擎中,我们通常使用`release_print()`来打印调试信息。
首先,我们检查一下`QF`中是否有`attack`这个触发接口。如果存在,我们就可以在攻击触发时进行伤害计算和减伤处理。
根据你的需求,我来补全代码。主要思路是:当攻击者和被攻击者都有刀刀减伤属性(`51`类型,`216`索引)时,根据攻击者的减伤数值(`51`类型,`219`索引)来减少本次攻击造成的伤害。
```lua
function attack(actor, Target, Hiter)
-- 刀刀秒人(对玩家)
local playercutting = getbaseinfo(actor, 51, 216) -- 获取刀刀秒人值
if playercutting > 0 then
humanhp(Target, "-", playercutting) -- 对目标造成固定伤害
end
-- 刀刀切割(对怪物)
local monsterDamage = getbaseinfo(actor, 51, 215) -- 获取刀刀切割值
local monster = ismon(Target) -- 判断目标是否为怪物
if monster and monsterDamage > 0 then
humanhp(Target, "-", monsterDamage) -- 对怪物造成固定伤害
end
-- 刀刀减伤逻辑补全
local playercutting11 = getbaseinfo(actor, 51, 216) -- 攻击者的刀刀减伤标记
local Targetcutting11 = getbaseinfo(Target, 51, 216) -- 被攻击者的刀刀减伤标记
if playercutting11 > 0 and Targetcutting11 > 0 then
local knifeAndBladeReduction = getbaseinfo(actor, 51, 219) -- 获取减伤数值
-- 这里需要计算原始伤害并应用减伤
-- 注意:原版humanhp可能无法直接获取本次攻击的原始伤害值
-- 一个常见的做法是,在减伤触发时,给目标添加一个吸收伤害的buff
-- 或者设置伤害吸收属性
-- 示例:设置伤害吸收(总吸收量=减伤值,比率=100%,成功率=100%)
setsuckdamage(Target, "=", knifeAndBladeReduction, 1000, 100)
-- 打印日志
release_print("玩家" .. actor .. "攻击" .. Target .. "触发刀刀减伤,减伤值:" .. knifeAndBladeReduction)
-- 注意:setsuckdamage是设置一个持续性的伤害吸收
-- 如果只需要单次减伤,需要在减伤后清除这个吸收效果
-- 可以配合定时器来实现
end
end
```
**代码说明:**
1. **刀刀秒人**:直接使用`humanhp`对目标造成固定伤害。
2. **刀刀切割**:先判断目标是否为怪物,再造成伤害。
3. **刀刀减伤(关键补全)**:
* 当攻击双方都有减伤标记时,获取攻击者的减伤数值。
* 使用`setsuckdamage`函数为目标设置伤害吸收。参数说明:
* `Target`:被攻击者对象
* `"="`:操作符,直接设置
* `knifeAndBladeReduction`:总吸收伤害量
* `1000`:吸收比率(1000 = 100%)
* `100`:吸收成功率(100 = 100%)
* 使用`release_print`输出日志。
**重要提醒:**
* `setsuckdamage`设置的伤害吸收是**持续生效**的,直到吸收量耗尽或被清除。
* 如果你希望**每次攻击独立计算减伤**,需要在减伤生效后立即清除吸收效果。这通常需要配合`ontimer`触发器来实现。
* 这个减伤逻辑是作用在**被攻击者**身上的,即被攻击者获得一个伤害吸收护盾。
**扩展建议(如果需要单次攻击减伤):**
```lua
-- 在attack函数中,刀刀减伤部分可以改为:
if playercutting11 > 0 and Targetcutting11 > 0 then
local knifeAndBladeReduction = getbaseinfo(actor, 51, 219)
-- 先获取当前伤害吸收值
local currentSuck = getsuckdamage(Target)
-- 临时增加吸收值(单次)
setsuckdamage(Target, "+", knifeAndBladeReduction, 1000, 100)
release_print("玩家" .. actor .. "攻击" .. Target .. "触发刀刀减伤,临时增加吸收值:" .. knifeAndBladeReduction)
-- 设置定时器,在短时间内清除临时吸收(例如0.1秒后)
setontimerex(Target, "ClearTempSuck", 1, 1, 0) -- 注意:实际使用需要调整时间参数
end
-- 在QF中需要添加对应的定时器触发
function ClearTempSuck(actor, timerid)
-- 清除临时吸收效果,恢复原来的吸收值
-- 这里需要记录原来的吸收值,逻辑会复杂一些
setsuckdamage(actor, "=", originalSuckDamage, 1000, 100)
end
```
小仙,这样补全后,你的刀刀减伤功能就基本完成了。不过实际应用中,你可能需要根据具体的游戏数值平衡来调整。如果还有不明白的地方,随时问我,或者请教浮生梦尊师!
← 返回问答库