function diyattribute.sourceCutting(actor)
local sourceCutting=getbaseinfo(actor,51,245)
addattlist(actor, "本源切割", "+", "3#74#"..sourceCutting)
recalcabilitys(actor)
end
本源切割+ 解释:对混沌怪物的固定伤害值
-------------刀刀切割+-----------------------------
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-08 16:06:48 |
👁️ 阅读: 0
哈喽,我是Lua后端老师!
小仙,咱们一起来看看你的代码。你问的这个问题很关键,是关于属性计算和攻击触发逻辑重叠可能导致的冲突。
首先,我们来分析一下你代码中可能存在的冲突点:
1. **属性叠加冲突**:你在 `diyattribute.sourceCutting` 和 `diyattribute.knifeCutting` 两个函数里,都使用了 `addattlist` 给玩家添加了属性。这里的关键是,它们都使用了 **同一个属性编号 `3#74#`**(通常代表“对怪物固定伤害”或“切割伤害”),只是值不同。如果这两个函数被重复调用,或者你的属性计算逻辑导致它们被多次执行,那么后执行的 `addattlist` 会覆盖掉先添加的“切割”属性值,而不是累加。这可能会导致你预期的“本源切割”或“刀刀切割”其中一个属性失效,或者值不正确。
2. **攻击触发逻辑冗余**:你在 `attack` 触发函数里,又直接使用 `getbaseinfo` 获取了 `51, 215`(刀刀切割)和 `51, 245`(本源切割)的值,并直接扣减怪物血量。这意味着,**同一个伤害效果,你通过“属性系统”和“脚本直接计算”两种方式各实现了一次**。这几乎一定会导致伤害被重复计算,也就是怪物会掉两次血,这显然不是你想要的。
**给你的建议和修改方案:**
通常,**“切割”这类固定伤害属性,建议只通过属性系统(即 `addattlist`)来实现**。引擎的伤害计算公式会自动处理属性 `3#74#` 代表的“对怪物固定伤害”。这样效率更高,且能与引擎的其他伤害机制(如暴击、格挡等)更好地兼容。
因此,你应该**删除** `attack` 触发函数里直接扣血的 `humanhp` 相关代码,只保留属性添加的部分。同时,你需要理清“刀刀切割”和“本源切割”这两个属性是**共存**还是**互斥**。
* **如果共存(两个效果都生效)**:你需要确保 `addattlist` 添加的是两个**不同**的属性ID,或者用其他方式(如不同的Modle类型)在攻击前触发(`attackdamage`)里区分处理。但根据你的描述“本源切割+ 解释:对混沌怪物的固定伤害值”,它似乎是有条件的(只对混沌怪物生效),这更适合在攻击触发里做判断。
* **如果本源切割是刀刀切割的进阶或特殊部分**:你可能需要修改逻辑,让“本源切割”在满足条件(攻击混沌怪物)时,提供一个更高的值或额外的伤害。
**针对你的问题“本源切割属性要怎么去写”,这里提供一个更清晰的思路,将判断逻辑放在攻击前触发 `attackdamage` 中:**
假设“刀刀切割”对所有怪物生效,“本源切割”只对“混沌怪物”生效,且“混沌怪物”有某种标识(比如怪物Race=201)。我们可以这样整合:
首先,确保QF中已经开启了 `attackdamage` 触发。
然后,在Lua脚本中:
```lua
-- 首先,在合适的初始化或登录触发里,为玩家添加基础的“刀刀切割”属性(对所有怪物)
function OnLogin(actor)
local playerknifeCutting = getbaseinfo(actor, 51, 215) -- 获取刀刀切割值
if playerknifeCutting > 0 then
addattlist(actor, "刀刀切割", "+", "3#74#" .. playerknifeCutting)
recalcabilitys(actor)
end
end
-- 然后,在攻击前触发中,处理“本源切割”(对混沌怪物的额外伤害)
function attackdamage(actor, Target, Hiter, MagicId, Damage, Model)
local sourceCutting = getbaseinfo(actor, 51, 245) -- 获取本源切割值
if sourceCutting > 0 then
-- 判断目标是否为怪物,并且是“混沌怪物”(这里假设Race=201代表混沌怪物)
if ismon(Target) then
local monRace = getmonbaseinfo(Target, "Race") -- 获取怪物Race
if monRace == 201 then -- 如果是混沌怪物
-- 这里可以直接修改最终伤害,注意Model参数可以用来区分伤害类型
-- 例如,我们将其视为“切割”伤害(Model=3),并加上本源切割的值
local finalDamage = Damage + sourceCutting
-- 注意:你需要根据引擎版本确认attackdamage触发是否支持直接修改Damage并返回
-- 更常见的做法是在此触发中直接调用 humanhp 造成额外伤害,但这可能不会触发受击方的受击触发。
-- 下面是一种直接附加伤害的写法(需注意可能不会计入仇恨、连击等系统):
humanhp(Target, "-", sourceCutting)
release_print("玩家" .. actor .. "对混沌怪物触发本源切割,额外伤害:" .. sourceCutting)
end
end
end
-- 如果有修改Damage并返回的需求,函数最后需要返回修改后的伤害值
-- return finalDamage or Damage
end
```
**重要说明:**
1. 上面的 `getmonbaseinfo(Target, "Race")` 是示例,你需要查看引擎文档确认获取怪物种族(或用于标识混沌怪物的字段)的正确函数和字段名。
2. `attackdamage` 触发的参数 `Model` 可以帮你区分本次攻击是普通攻击、暴击、格挡还是切割。你可以利用它,使“本源切割”的伤害也正确归类。
3. **务必删除你原来 `attack` 触发中重复的 `humanhp` 扣血代码**,只保留属性添加的部分,或者像上面示例一样,将属性添加移到登录或初始化触发中。
4. 所有调试信息请使用 `release_print()` 而非 `p()` 或 `print()`。
总结一下,小仙,你的思路是对的,但需要避免**双重计算**。将通用切割伤害交给属性系统(`addattlist` + `3#74#`),将特殊的、有条件的切割伤害(如本源切割对混沌怪)放在 `attackdamage` 触发里做判断和追加。这样逻辑清晰,也不会冲突。
如果还有不清楚的地方,随时可以再问我,或者请教浮生梦尊师哦!
哈喽,我是Lua后端老师!
小仙,咱们一起来看看你的代码。你问的这个问题很关键,是关于属性计算和攻击触发逻辑重叠可能导致的冲突。
首先,我们来分析一下你代码中可能存在的冲突点:
1. **属性叠加冲突**:你在 `diyattribute.sourceCutting` 和 `diyattribute.knifeCutting` 两个函数里,都使用了 `addattlist` 给玩家添加了属性。这里的关键是,它们都使用了 **同一个属性编号 `3#74#`**(通常代表“对怪物固定伤害”或“切割伤害”),只是值不同。如果这两个函数被重复调用,或者你的属性计算逻辑导致它们被多次执行,那么后执行的 `addattlist` 会覆盖掉先添加的“切割”属性值,而不是累加。这可能会导致你预期的“本源切割”或“刀刀切割”其中一个属性失效,或者值不正确。
2. **攻击触发逻辑冗余**:你在 `attack` 触发函数里,又直接使用 `getbaseinfo` 获取了 `51, 215`(刀刀切割)和 `51, 245`(本源切割)的值,并直接扣减怪物血量。这意味着,**同一个伤害效果,你通过“属性系统”和“脚本直接计算”两种方式各实现了一次**。这几乎一定会导致伤害被重复计算,也就是怪物会掉两次血,这显然不是你想要的。
**给你的建议和修改方案:**
通常,**“切割”这类固定伤害属性,建议只通过属性系统(即 `addattlist`)来实现**。引擎的伤害计算公式会自动处理属性 `3#74#` 代表的“对怪物固定伤害”。这样效率更高,且能与引擎的其他伤害机制(如暴击、格挡等)更好地兼容。
因此,你应该**删除** `attack` 触发函数里直接扣血的 `humanhp` 相关代码,只保留属性添加的部分。同时,你需要理清“刀刀切割”和“本源切割”这两个属性是**共存**还是**互斥**。
* **如果共存(两个效果都生效)**:你需要确保 `addattlist` 添加的是两个**不同**的属性ID,或者用其他方式(如不同的Modle类型)在攻击前触发(`attackdamage`)里区分处理。但根据你的描述“本源切割+ 解释:对混沌怪物的固定伤害值”,它似乎是有条件的(只对混沌怪物生效),这更适合在攻击触发里做判断。
* **如果本源切割是刀刀切割的进阶或特殊部分**:你可能需要修改逻辑,让“本源切割”在满足条件(攻击混沌怪物)时,提供一个更高的值或额外的伤害。
**针对你的问题“本源切割属性要怎么去写”,这里提供一个更清晰的思路,将判断逻辑放在攻击前触发 `attackdamage` 中:**
假设“刀刀切割”对所有怪物生效,“本源切割”只对“混沌怪物”生效,且“混沌怪物”有某种标识(比如怪物Race=201)。我们可以这样整合:
首先,确保QF中已经开启了 `attackdamage` 触发。
然后,在Lua脚本中:
```lua
-- 首先,在合适的初始化或登录触发里,为玩家添加基础的“刀刀切割”属性(对所有怪物)
function OnLogin(actor)
local playerknifeCutting = getbaseinfo(actor, 51, 215) -- 获取刀刀切割值
if playerknifeCutting > 0 then
addattlist(actor, "刀刀切割", "+", "3#74#" .. playerknifeCutting)
recalcabilitys(actor)
end
end
-- 然后,在攻击前触发中,处理“本源切割”(对混沌怪物的额外伤害)
function attackdamage(actor, Target, Hiter, MagicId, Damage, Model)
local sourceCutting = getbaseinfo(actor, 51, 245) -- 获取本源切割值
if sourceCutting > 0 then
-- 判断目标是否为怪物,并且是“混沌怪物”(这里假设Race=201代表混沌怪物)
if ismon(Target) then
local monRace = getmonbaseinfo(Target, "Race") -- 获取怪物Race
if monRace == 201 then -- 如果是混沌怪物
-- 这里可以直接修改最终伤害,注意Model参数可以用来区分伤害类型
-- 例如,我们将其视为“切割”伤害(Model=3),并加上本源切割的值
local finalDamage = Damage + sourceCutting
-- 注意:你需要根据引擎版本确认attackdamage触发是否支持直接修改Damage并返回
-- 更常见的做法是在此触发中直接调用 humanhp 造成额外伤害,但这可能不会触发受击方的受击触发。
-- 下面是一种直接附加伤害的写法(需注意可能不会计入仇恨、连击等系统):
humanhp(Target, "-", sourceCutting)
release_print("玩家" .. actor .. "对混沌怪物触发本源切割,额外伤害:" .. sourceCutting)
end
end
end
-- 如果有修改Damage并返回的需求,函数最后需要返回修改后的伤害值
-- return finalDamage or Damage
end
```
**重要说明:**
1. 上面的 `getmonbaseinfo(Target, "Race")` 是示例,你需要查看引擎文档确认获取怪物种族(或用于标识混沌怪物的字段)的正确函数和字段名。
2. `attackdamage` 触发的参数 `Model` 可以帮你区分本次攻击是普通攻击、暴击、格挡还是切割。你可以利用它,使“本源切割”的伤害也正确归类。
3. **务必删除你原来 `attack` 触发中重复的 `humanhp` 扣血代码**,只保留属性添加的部分,或者像上面示例一样,将属性添加移到登录或初始化触发中。
4. 所有调试信息请使用 `release_print()` 而非 `p()` 或 `print()`。
总结一下,小仙,你的思路是对的,但需要避免**双重计算**。将通用切割伤害交给属性系统(`addattlist` + `3#74#`),将特殊的、有条件的切割伤害(如本源切割对混沌怪)放在 `attackdamage` 触发里做判断和追加。这样逻辑清晰,也不会冲突。
如果还有不清楚的地方,随时可以再问我,或者请教浮生梦尊师哦!
← 返回问答库