我是Lua后端老师!
小仙,我来帮你看看这段代码的问题。从你的代码来看,伤害没有改变的原因很可能是**函数返回值处理**的问题。
先看你的`ATTACK_buff`表中的两个函数:
```lua
-- 狂屠印 对生命值低于25%的目标,提高10%的伤害结果。
[60110] = function(actor, target, gongjizhe, skillid, damage, Model, value)
-- release_print("到这了")
if not hasbuff(actor,60110) then return end
if skillid ~= 7 then return end
-- if getbaseinfo(target,9) > getbaseinfo(target,10) * 0.25 then return end
local hp = math.floor(damage * 1.1)
sendmsg(actor, 1, '{"Msg":"[狂屠印] : 伤害提升至'.. hp ..'","FColor":255,"BColor":219,"Type":1}')
return hp
end,
-- 吸血印 攻杀对目标造成的8%伤害转换成自身生命
[60140] = function(actor, target, gongjizhe, skillid, damage, Model, value)
if not hasbuff(actor,60140) then return end
if skillid ~= 7 then return end
local num = math.floor(damage * 0.08)
humanhp(actor,"+", num)
healthspellchanged(actor)
sendmsg(actor, 1, '{"Msg":"来自{[吸血印]|253:0:1} : 对自身触发 {血量+'.. num ..'|251:0:1}","FColor":255,"BColor":219,"Type":1}')
sendmsg(target, 1, '{"Msg":"受到{[吸血印]|253:0:1} : 使目标 {血量+'.. num ..'|249:0:1}","FColor":255,"BColor":0,"Type":1}')
end,
```
**问题分析:**
1. **60110(狂屠印)**:这个函数有`return hp`,会返回修改后的伤害值
2. **60140(吸血印)**:这个函数**没有return语句**,执行完后会返回`nil`
再看你的`check_buff`函数:
```lua
check_buff = function(actor, target, hiter, skillid, damage, model, value)
local t = getallbuffid(actor)
local buff_num = 0
for _, buff_id in ipairs(t) do
if ATTACK_list.buff[buff_id] then
buff_num = buff_num + 1
local hp = damage
-- 先判断函数是否存在,避免调用nil值
local buff_func = ATTACK_buff[buff_id]
if buff_func then
damage = buff_func(actor, target, hiter, skillid, damage, model, value) or damage
if hp ~= damage then
release_print("Buff", buff_id, "生效: 伤害从", hp, "变为", damage)
end
end
end
end
end,
```
**关键问题在这里:**
```lua
damage = buff_func(actor, target, hiter, skillid, damage, model, value) or damage
```
当`buff_func`返回`nil`时(比如60140吸血印),`or damage`会让`damage`保持不变。但是**这个修改后的damage值只在check_buff函数内部有效**!
看看你的`attackdamage`主函数:
```lua
function attackdamage(actor, target, hiter, skillid, damage, model, value)
-- 通用攻击行为检测 (巡航 禁止触发类怪物等)
damage = ATTACK_func.check_attack(actor, target, hiter, skillid, damage, model, value)
-- 检测所有buff 如果在里表中找到buff 则调取函数
if damage ~= 0 then
ATTACK_func.check_buff(actor, target, hiter, skillid, damage, model, value)
end
return damage
end
```
**问题找到了!** `ATTACK_func.check_buff`函数**没有返回值**,所以它内部对`damage`的修改不会影响到主函数的`damage`变量。
**解决方案:**
修改`check_buff`函数,让它返回修改后的伤害值:
```lua
check_buff = function(actor, target, hiter, skillid, damage, model, value)
local t = getallbuffid(actor)
local buff_num = 0
for _, buff_id in ipairs(t) do
if ATTACK_list.buff[buff_id] then
buff_num = buff_num + 1
local hp = damage
local buff_func = ATTACK_buff[buff_id]
if buff_func then
damage = buff_func(actor, target, hiter, skillid, damage, model, value) or damage
if hp ~= damage then
release_print("Buff", buff_id, "生效: 伤害从", hp, "变为", damage)
end
end
end
end
return damage -- 新增这行,返回修改后的伤害值
end,
```
同时修改主函数:
```lua
function attackdamage(actor, target, hiter, skillid, damage, model, value)
-- 通用攻击行为检测 (巡航 禁止触发类怪物等)
damage = ATTACK_func.check_attack(actor, target, hiter, skillid, damage, model, value)
-- 检测所有buff 如果在里表中找到buff 则调取函数
if damage ~= 0 then
damage = ATTACK_func.check_buff(actor, target, hiter, skillid, damage, model, value) -- 这里接收返回值
end
return damage
end
```
另外,建议你给吸血印函数也加上返回值,虽然它不改变伤害值,但可以返回原始伤害值:
```lua
[60140] = function(actor, target, gongjizhe, skillid, damage, Model, value)
if not hasbuff(actor,60140) then return end
if skillid ~= 7 then return end
local num = math.floor(damage * 0.08)
humanhp(actor,"+", num)
healthspellchanged(actor)
sendmsg(actor, 1, '{"Msg":"来自{[吸血印]|253:0:1} : 对自身触发 {血量+'.. num ..'|251:0:1}","FColor":255,"BColor":219,"Type":1}')
sendmsg(target, 1, '{"Msg":"受到{[吸血印]|253:0:1} : 使目标 {血量+'.. num ..'|249:0:1}","FColor":255,"BColor":0,"Type":1}')
return damage -- 返回原始伤害值
end,
```
这样修改后,伤害计算就能正常传递了。下次写这种链式处理的函数时,一定要注意**返回值**的传递哦!如果还有问题,可以再问我,或者请教浮生梦尊师!