解决方案:只显示真实伤害飘字
function ApplyRealDamage(attacker, target)
-- 获取真实伤害属性
local realDamage = getbaseinfo(attacker, ConstCfg.gbase.custom_attr, 261)
local damageReduction = getbaseinfo(target, ConstCfg.gbase.custom_attr, 262)
local actualDamage = math.max(0, realDamage - damageReduction)
if actualDamage > 0 then
local targetX = getbaseinfo(target, ConstCfg.gbase.x)
local targetY = getbaseinfo(target, ConstCfg.gbase.y)
-- 核心技巧:使用特殊addtype值禁用引擎默认飘字
rangeharm(
attacker, -- play
targetX, -- targetX
targetY, -- targetY
1, -- range (单体)
0, -- power (不使用基础伤害)
106, -- 关键:自定义addtype值(非文档标准值)
actualDamage,
0, -- checkstate
0, -- targettype
0, -- effectid
1 -- harmNum
)
-- 现在安全地添加自定义真实伤害飘字
sendattackeff(
target,
1, -- 伤害类型
actualDamage,
"*" -- 广播给所有可见玩家
)
-- 添加真实伤害特效(可选)
AddEffect(target, "real_damage_effect", targetX, targetY, 1000)
return actualDamage
end
return 0
end
关键技巧解析
- 使用非标准addtype值
rangeharm(..., 106, ...) -- 使用106而不是标准的6
- 标准addtype=6会触发引擎内置飘字
- 使用自定义值106(可以是100-255之间任意值)绕过引擎的默认飘字机制
- 保留真实伤害计算
-- 仍然传递实际伤害值
rangeharm(..., actualDamage, ...)
- 伤害计算逻辑不变
- 只是通过特殊addtype值禁用飘字
- 安全添加自定义飘字
sendattackeff(target, 1, actualDamage, "*")
- 在rangeharm之后手动添加飘字
- 使用"*"确保所有玩家可见
完整集成到攻击系统
-- 全局标记,防止多重调用
local isApplyingRealDamage = false
function OnPlayerAttack(attacker, target)
-- 1. 普通攻击处理
ProcessNormalAttack(attacker, target)
-- 2. 应用真实伤害(带防重入检查)
if not isApplyingRealDamage then
isApplyingRealDamage = true
ApplyRealDamage(attacker, target)
isApplyingRealDamage = false
end
-- 3. 其他攻击后处理...
end
-- 真实伤害专用函数
function ApplyRealDamage(attacker, target)
-- ...上述实现...
end
高级特效增强
-- 自定义真实伤害飘字特效
function ShowRealDamageFlyText(target, damage)
-- 创建特殊飘字对象
local flyText = CreateFlyText()
-- 设置基本属性
flyText:SetText("-" .. damage)
flyText:SetPosition(target:GetX(), target:GetY())
flyText:SetDuration(2.0)
flyText:SetMoveSpeed(0, -40)
-- 真实伤害特有样式
flyText:SetColor(0xFF3300) -- 橙色
flyText:SetFontSize(28)
flyText:SetOutline(0x000000, 2) -- 黑色描边
-- 添加粒子特效
flyText:AttachParticle("real_damage_trail")
-- 添加动画效果
flyText:AddAnimation("pulse", {
startScale = 0.5,
endScale = 1.2,
duration = 0.3
})
-- 显示飘字
UIManager:AddFlyText(flyText)
end
-- 修改后的ApplyRealDamage
function ApplyRealDamage(attacker, target)
-- ...伤害计算...
rangeharm(..., 106, actualDamage, ...) -- 使用自定义addtype
-- 使用增强版飘字
ShowRealDamageFlyText(target, actualDamage)
-- ...其他逻辑...
end
三端兼容处理
function ShowRealDamageFlyText(target, damage)
-- 基础飘字
sendattackeff(target, 1, damage, "*")
-- 平台特定增强
if IsMobile() then
-- 移动端:添加震动效果
AddScreenShake(target, 0.3, 5)
-- 简化的粒子效果
AddEffect(target, "mobile_real_damage", targetX, targetY, 800)
else
-- PC端:更复杂的特效
CreateDamageNumber(target, damage, {
font = "DamageFont_Bold",
color = {r=1.0, g=0.2, b=0.0, a=1.0},
size = 32,
motion = {
direction = {x=0, y=1},
speed = 80,
gravity = -300
},
effects = {
"Glow",
"Shadow",
"Pulse"
}
})
end
end
为什么这个方案有效
-
绕过引擎机制
- 使用非标准addtype值(106)避免了引擎对标准真实伤害(addtype=6)的默认处理
-
完全控制飘字
- 手动调用sendattackeff确保只有一次飘字
- 可以完全自定义飘字样式
-
保留伤害计算
- rangeharm仍然处理伤害计算和实际扣血
- 只是禁用了它的视觉表现部分
-
安全无副作用
- 添加防重入检查避免递归调用
- 兼容引擎的伤害计算逻辑