饥荒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)
游戏中有些怪物是隐藏的,比如触手,只有走到旁边的时候被触手攻击了才能知道,有了这个修改就可以直接显示哪个地方有触手怪物,再也不会被 偷袭了。这些显示生命值的地方都隐藏着一个触手怪物。