function diyattribute.sourceCutting(actor)
local sourceCutting=getbaseinfo(actor,51,245)
addattlist(actor, "本源切割", "+", "3#74#"..sourceCutting)
recalcabilitys(actor)
end
本源切割+ 解释:对混沌怪物的固定伤害值
-------------刀刀切割+-----------------------------
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-08 16:03:58 |
👁️ 阅读: 0
我是lua后端老师!小仙,你这个问题问得非常好,涉及到属性叠加和触发执行的机制,我们来仔细分析一下。
首先,直接回答你的核心问题:**将“本源切割”和“刀刀切割”关联到同一个属性(`3#74#`)并在攻击触发里也写伤害逻辑,理论上不会直接导致程序崩溃,但会产生逻辑冲突和意料之外的效果,不推荐这样做。**
下面我们来拆解一下问题:
### 1. 属性叠加的冲突
你的两个函数 `diyattribute.sourceCutting` 和 `diyattribute.knifeCutting` 都使用了 `addattlist` 给玩家添加属性,而且属性的键名不同(“本源切割”和“刀刀切割”),但**属性的值部分(`"3#74#"..value`)看起来是相同的类型**。
```lua
-- 本源切割添加的属性
addattlist(actor, "本源切割", "+", "3#74#"..sourceCutting)
-- 刀刀切割添加的属性
addattlist(actor, "刀刀切割", "+", "3#74#"..playerknifeCutting)
```
引擎在处理 `addattlist` 时,是以第一个参数(键名,如“本源切割”)作为唯一标识来管理属性列表的。所以即使它们值的部分都是 `3#74#` 开头,引擎也会视为两个独立的属性条目进行添加和移除。
**冲突点在于**:如果 `3#74#` 在引擎属性系统中对应的是“切割伤害”这类属性,那么通过两个不同的键名添加,可能会导致该属性被计算了两次,或者引擎以某种方式(如最后添加的)覆盖前者,造成实际伤害值与预期不符。
### 2. 攻击触发中的逻辑问题
你在 `attack` 函数中直接使用 `humanhp` 扣血,这与通过 `addattlist` 添加属性让引擎自动计算伤害是**两套独立的系统**。
```lua
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 monster then
humanhp(Target, "-", monsterDamage) -- 再次直接扣血
p(humanhp) -- 这里p(humanhp)写法错误,应该是打印其他变量
end
-- ... 本源切割类似逻辑
end
```
**这样做的结果是**:玩家一次攻击可能会造成三次伤害:
1. 一次来自 `addattlist` 添加的“刀刀切割”属性(引擎自动计算)。
2. 一次来自 `attack` 函数中“刀刀切割”的 `humanhp` 直接扣血。
3. 一次来自 `attack` 函数中“本源切割”的 `humanhp` 直接扣血(如果区分了怪物类型)。
这就导致了**伤害严重重复**,破坏了游戏平衡。`p(humanhp)` 这行代码也有误,`humanhp` 是一个函数,不能直接打印。
### 3. 如何正确区分“本源切割”(对混沌怪物)?
根据你的需求,“本源切割”需要对混沌怪物生效。这需要在攻击触发中判断怪物的类型。引擎通常没有直接的“是否为混沌怪物”函数,但可以通过其他方式间接判断,例如:
**方案一:利用怪物名字或特征**
```lua
function attack(actor, Target, Hiter)
local monster = ismon(Target)
if monster then
local monsterName = getmonbaseinfo(Target, "name") -- 获取怪物名字,假设此函数存在或类似功能
local sourceCuttingValue = getbaseinfo(actor, 51, 245) -- 本源切割值
-- 判断怪物名字是否包含“混沌”等关键字
if string.find(monsterName, "混沌") then
-- 对混沌怪物使用本源切割
-- 注意:这里应该只保留一套伤害系统,建议注释掉addattlist添加本源的逻辑
humanhp(Target, "-", sourceCuttingValue)
else
-- 普通怪物处理其他切割
-- local knifeCuttingValue = getbaseinfo(actor, 51, 215)
-- humanhp(Target, "-", knifeCuttingValue)
end
end
end
```
**方案二:使用更精确的 `attackdamage` 触发**
资料中提到了 `attackdamage` 这个**人物攻击前触发**,它提供了 `Model` 参数,其中 `Model == 3` 时表示本次伤害为“切割”属性。**但这需要你在M2引擎-参数设置-物品参数-新增属性中,启用“切割”选项**。
```lua
function attackdamage(self, Target, Hiter, MagicId, Damage, Model)
local sourceCuttingValue = getbaseinfo(self, 51, 245)
local monster = ismon(Target)
if monster and Model == 3 then -- 如果是切割伤害
local monsterName = getmonbaseinfo(Target, "name")
if string.find(monsterName, "混沌") then
-- 对混沌怪物,在引擎计算的切割伤害上追加或修正
Damage = Damage + sourceCuttingValue
end
end
return Damage -- 必须返回修改后的伤害值
end
```
这个触发更底层,可以直接干预引擎计算出的伤害值 (`Damage`)。
### 总结与建议
1. **不要混用两套系统**:选择要么全部用 `addattlist` 添加属性(让引擎管),要么全部在 `attack` 或 `attackdamage` 触发里写逻辑(自己管)。混合使用必然导致重复计算。
2. **统一属性键名**:如果坚持用 `addattlist`,确保一种伤害类型对应一个唯一的键名。
3. **实现混沌怪物判断**:你需要一个方法来区分怪物是否为“混沌”类。检查引擎是否有相关函数(如 `getmonfield` 获取怪物自定义字段),或者用怪物名字、外观ID (`getmonbaseinfo(Target, "appr")`) 来区分。
4. **清理属性**:如果属性是通过触发动态添加的(如在 `login` 中),注意在玩家下线或触发移除条件时,用 `delattlist(actor, “刀刀切割”)` 清理,防止属性残留。
给你的最终建议是:**只保留 `attackdamage` 触发中的一套逻辑**,在其中根据怪物类型判断,并计算最终要追加的“本源切割”或“刀刀切割”伤害值,然后通过修改 `Damage` 参数并返回来生效。同时,在QF文件中检查是否已经开启了 `attackdamage` 触发的支持。
如果还有不清楚的,随时可以再来问我,或者请教浮生梦尊师!
我是lua后端老师!小仙,你这个问题问得非常好,涉及到属性叠加和触发执行的机制,我们来仔细分析一下。
首先,直接回答你的核心问题:**将“本源切割”和“刀刀切割”关联到同一个属性(`3#74#`)并在攻击触发里也写伤害逻辑,理论上不会直接导致程序崩溃,但会产生逻辑冲突和意料之外的效果,不推荐这样做。**
下面我们来拆解一下问题:
### 1. 属性叠加的冲突
你的两个函数 `diyattribute.sourceCutting` 和 `diyattribute.knifeCutting` 都使用了 `addattlist` 给玩家添加属性,而且属性的键名不同(“本源切割”和“刀刀切割”),但**属性的值部分(`"3#74#"..value`)看起来是相同的类型**。
```lua
-- 本源切割添加的属性
addattlist(actor, "本源切割", "+", "3#74#"..sourceCutting)
-- 刀刀切割添加的属性
addattlist(actor, "刀刀切割", "+", "3#74#"..playerknifeCutting)
```
引擎在处理 `addattlist` 时,是以第一个参数(键名,如“本源切割”)作为唯一标识来管理属性列表的。所以即使它们值的部分都是 `3#74#` 开头,引擎也会视为两个独立的属性条目进行添加和移除。
**冲突点在于**:如果 `3#74#` 在引擎属性系统中对应的是“切割伤害”这类属性,那么通过两个不同的键名添加,可能会导致该属性被计算了两次,或者引擎以某种方式(如最后添加的)覆盖前者,造成实际伤害值与预期不符。
### 2. 攻击触发中的逻辑问题
你在 `attack` 函数中直接使用 `humanhp` 扣血,这与通过 `addattlist` 添加属性让引擎自动计算伤害是**两套独立的系统**。
```lua
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 monster then
humanhp(Target, "-", monsterDamage) -- 再次直接扣血
p(humanhp) -- 这里p(humanhp)写法错误,应该是打印其他变量
end
-- ... 本源切割类似逻辑
end
```
**这样做的结果是**:玩家一次攻击可能会造成三次伤害:
1. 一次来自 `addattlist` 添加的“刀刀切割”属性(引擎自动计算)。
2. 一次来自 `attack` 函数中“刀刀切割”的 `humanhp` 直接扣血。
3. 一次来自 `attack` 函数中“本源切割”的 `humanhp` 直接扣血(如果区分了怪物类型)。
这就导致了**伤害严重重复**,破坏了游戏平衡。`p(humanhp)` 这行代码也有误,`humanhp` 是一个函数,不能直接打印。
### 3. 如何正确区分“本源切割”(对混沌怪物)?
根据你的需求,“本源切割”需要对混沌怪物生效。这需要在攻击触发中判断怪物的类型。引擎通常没有直接的“是否为混沌怪物”函数,但可以通过其他方式间接判断,例如:
**方案一:利用怪物名字或特征**
```lua
function attack(actor, Target, Hiter)
local monster = ismon(Target)
if monster then
local monsterName = getmonbaseinfo(Target, "name") -- 获取怪物名字,假设此函数存在或类似功能
local sourceCuttingValue = getbaseinfo(actor, 51, 245) -- 本源切割值
-- 判断怪物名字是否包含“混沌”等关键字
if string.find(monsterName, "混沌") then
-- 对混沌怪物使用本源切割
-- 注意:这里应该只保留一套伤害系统,建议注释掉addattlist添加本源的逻辑
humanhp(Target, "-", sourceCuttingValue)
else
-- 普通怪物处理其他切割
-- local knifeCuttingValue = getbaseinfo(actor, 51, 215)
-- humanhp(Target, "-", knifeCuttingValue)
end
end
end
```
**方案二:使用更精确的 `attackdamage` 触发**
资料中提到了 `attackdamage` 这个**人物攻击前触发**,它提供了 `Model` 参数,其中 `Model == 3` 时表示本次伤害为“切割”属性。**但这需要你在M2引擎-参数设置-物品参数-新增属性中,启用“切割”选项**。
```lua
function attackdamage(self, Target, Hiter, MagicId, Damage, Model)
local sourceCuttingValue = getbaseinfo(self, 51, 245)
local monster = ismon(Target)
if monster and Model == 3 then -- 如果是切割伤害
local monsterName = getmonbaseinfo(Target, "name")
if string.find(monsterName, "混沌") then
-- 对混沌怪物,在引擎计算的切割伤害上追加或修正
Damage = Damage + sourceCuttingValue
end
end
return Damage -- 必须返回修改后的伤害值
end
```
这个触发更底层,可以直接干预引擎计算出的伤害值 (`Damage`)。
### 总结与建议
1. **不要混用两套系统**:选择要么全部用 `addattlist` 添加属性(让引擎管),要么全部在 `attack` 或 `attackdamage` 触发里写逻辑(自己管)。混合使用必然导致重复计算。
2. **统一属性键名**:如果坚持用 `addattlist`,确保一种伤害类型对应一个唯一的键名。
3. **实现混沌怪物判断**:你需要一个方法来区分怪物是否为“混沌”类。检查引擎是否有相关函数(如 `getmonfield` 获取怪物自定义字段),或者用怪物名字、外观ID (`getmonbaseinfo(Target, "appr")`) 来区分。
4. **清理属性**:如果属性是通过触发动态添加的(如在 `login` 中),注意在玩家下线或触发移除条件时,用 `delattlist(actor, “刀刀切割”)` 清理,防止属性残留。
给你的最终建议是:**只保留 `attackdamage` 触发中的一套逻辑**,在其中根据怪物类型判断,并计算最终要追加的“本源切割”或“刀刀切割”伤害值,然后通过修改 `Damage` 参数并返回来生效。同时,在QF文件中检查是否已经开启了 `attackdamage` 触发的支持。
如果还有不清楚的,随时可以再来问我,或者请教浮生梦尊师!
← 返回问答库