找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

1

听众

134

主题

不用官方的附加伤害效果

IP属地:浙江省杭州市
发表于 2025-7-15 14:36:20 | 查看: 56| 回复: 0

解决方案:只显示真实伤害飘字

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

关键技巧解析

  1. 使用非标准addtype值
rangeharm(..., 106, ...)  -- 使用106而不是标准的6
  • 标准addtype=6会触发引擎内置飘字
  • 使用自定义值106(可以是100-255之间任意值)绕过引擎的默认飘字机制
  1. 保留真实伤害计算
-- 仍然传递实际伤害值
rangeharm(..., actualDamage, ...)
  • 伤害计算逻辑不变
  • 只是通过特殊addtype值禁用飘字
  1. 安全添加自定义飘字
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

为什么这个方案有效

  1. 绕过引擎机制

    • 使用非标准addtype值(106)避免了引擎对标准真实伤害(addtype=6)的默认处理
  2. 完全控制飘字

    • 手动调用sendattackeff确保只有一次飘字
    • 可以完全自定义飘字样式
  3. 保留伤害计算

    • rangeharm仍然处理伤害计算和实际扣血
    • 只是禁用了它的视觉表现部分
  4. 安全无副作用

    • 添加防重入检查避免递归调用
    • 兼容引擎的伤害计算逻辑
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-7-27 08:12 , Processed in 0.454894 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表