饥荒Mod 开发(十九):显示简易血量

饥荒Mod 开发(十八):Mod 添加配置选项
饥荒Mod 开发(二十):显示打怪伤害值
源码
饥荒这个游戏还真是特别,真的是要什么没什么,啥都没有,全靠开发者制作Mod,就连一个怪物的血条都没有,打个怪,打个boss 啥都都不知道还剩多少血,真是极度消耗耐性。
这次介绍个简单的方法显示生物血量值,无论是怪物,还是兔子,小鸟等,只要有生命值的都可以显示。

原理

所有的有生命值的生物都会有一个"health"组件,所以我们只需要拦截这个 组件的创建,然后给对象添加一个显示标签就可以了。
在modmain.lua 文件中添加下面拦截代码

显示生命值

-- 定义一个函数,用于显示生命条
local function ShowHealthBar(inst)
    -- 如果实例是玩家或者没有生命组件,则直接返回
    if inst:HasTag("player") or not inst.components.health then
        return
    end
    -- 为实例添加一个标签,用于显示生命值
    inst.health_label = inst.entity:AddLabel()
    -- 设置标签的字体
    inst.health_label:SetFont(GLOBAL.NUMBERFONT)
    -- 设置标签的字体大小
    inst.health_label:SetFontSize(20)
    -- 设置标签的文本,显示当前生命值和最大生命值
    inst.health_label:SetText(string.format("%d/%d", inst.components.health.currenthealth, inst.components.health:GetMaxHealth()))
    -- 设置标签的位置,位于实例的正上方
    inst.health_label:SetPos(0, 0, 0)
    -- 启动一次性定时器,在1秒后更新生命值显示
    inst:DoTaskInTime(1, function()
        -- 更新标签的文本,显示当前生命值和最大生命值
        inst.health_label:SetText(string.format("%d/%d", inst.components.health.currenthealth, inst.components.health:GetMaxHealth()))
    end)
end

AddComponentPostInit("health", function(Health, inst)
	ShowHealthBar(inst)
end)

监听生命值变化

此时虽然显示了生命值,但是当怪物被攻击掉血的时候,生命值还是原先的,并没有更新,所以我们需要监听"healthdelta" 事件用来更新生命值

-- 对"health"组件进行后初始化
AddComponentPostInit("health", function(Health, inst)
    -- 显示实例的生命条
    ShowHealthBar(inst)
    -- 监听"healthdelta"事件,当实例的生命值发生变化时触发
    inst:ListenForEvent("healthdelta", function(inst, data)
        -- 如果实例有生命值标签,则更新标签的文本,显示当前生命值和最大生命值
        if inst.health_label then
            inst.health_label:SetText(string.format("%d/%d", inst.components.health.currenthealth, inst.components.health:GetMaxHealth()))
        end
    end)
end)

饥荒Mod 开发(十九):显示简易血量_第1张图片

显示隐藏怪物

游戏中有些怪物是隐藏的,比如触手,只有走到旁边的时候被触手攻击了才能知道,有了这个修改就可以直接显示哪个地方有触手怪物,再也不会被 偷袭了。这些显示生命值的地方都隐藏着一个触手怪物。饥荒Mod 开发(十九):显示简易血量_第2张图片

你可能感兴趣的:(饥荒Mod,游戏,lua,饥荒,饥荒Mod)