饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜
饥荒中的物品没有详细信息,基本上只有一个名字,所以很多物品的功能都不知道,比如浆果吃了也不知道恢复什么, 采集的胡萝卜也不知道什么功效,可真是太不方便了,所以当我们把鼠标放在物品上面时需要显示物品的详细信息。

原理

widgets/hoverer 类用来显示鼠标悬浮的提示,所以我们需要拦截这个 悬浮的创建,设置需要显示的内容

显示自定义提示

在modmain.lua 文件中添加下面代码用来拦截 widgets/hoverer 创建,然后重写 SetString 方法


local round2 =function(num, idp)
	return GLOBAL.tonumber(string.format("%." .. (idp or 0) .. "f", num))
end
--鼠标悬浮在物品上显示信息
AddClassPostConstruct("widgets/hoverer",function(self)
	local old_SetString = self.text.SetString
	self.text.SetString = function(text,str)
		  -- 获取鼠标下的世界实体
        local target = GLOBAL.TheInput:GetWorldEntityUnderMouse() 
        -- 如果存在目标实体
		if target   then
			  -- 如果目标实体有预制体
            if target.prefab then
                -- 在字符串后添加预制体的代码
                str = str .. "\n代码: " .. target.prefab
            end
            -- 如果目标实体有可旅行组件
            if target.components.travelable then
                -- 在字符串后添加可旅行组件的名称
                str = str .."\n".. tostring(target.components.travelable.name)
            end
			if target.components then
				 -- 如果目标实体有生命组件
                 if target.components.health then
                    -- 在字符串后添加生物的血量
                    str = str.."\n"..math.ceil(target.components.health.currenthealth*10)/10 .."/"..math.ceil(target.components.health.maxhealth*10)/10
                end
                -- 如果目标实体有战斗组件,并且默认伤害大于0
                if target.components.combat and target.components.combat.defaultdamage > 0 then
                    -- 在字符串后添加生物的攻击力
                    str = str.."\n攻击力: "..target.components.combat.defaultdamage
                end
			    -- 如果目标实体是温度计
                if target.prefab == "winterometer" then
                    -- 获取当前温度
                    local temp = GLOBAL.GetSeasonManager() and GLOBAL.GetSeasonManager():GetCurrentTemperature() or 30
                    local high_temp = TUNING.OVERHEAT_TEMP
                    local low_temp = 0
                    
                    -- 限制温度在最高温度和最低温度之间
                    temp = math.min( math.max(low_temp, temp), high_temp)
                    
                    -- 在字符串后添加温度
                    str = str.."\n温度: ".. tostring(math.floor(temp)) .. "\176C"
                end
			
				-- 检查目标实体是否有库存组件
                if target.components.inventory then
                    -- 获取目标实体手部装备的物品
                    local handitem = target.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.HANDS)
                    if handitem then
                        -- 如果有手部装备的物品,可以在这里添加相关的处理代码
                    end
                    -- 获取目标实体头部装备的物品
                    local headitem = target.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.HEAD)
                    if headitem then
                        -- 如果头部装备的物品有防具组件
                        if headitem.components.armor then
                            -- 在字符串后添加头部防御的信息
                            str = str.."\n头部防御: "..headitem.components.armor.absorb_percent*100 .."%"
                            -- 在字符串后添加头部装备的耐久信息
                            str = str.." 耐久: "..math.floor(headitem.components.armor:GetPercent() *100).."%"
                        end
                    end
                    -- 获取目标实体身体装备的物品
                    local bodyitem = target.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.BODY)
                    if bodyitem then
                        -- 如果身体装备的物品有防具组件
                        if bodyitem.components.armor then
                            -- 在字符串后添加身体防御的信息
                            str = str.."\n身体防御: "..bodyitem.components.armor.absorb_percent*100 .."%"
                            -- 在字符串后添加身体装备的耐久信息
                            str = str.." 耐久: "..math.floor(bodyitem.components.armor:GetPercent() *100).."%"
                        end
                    end
                end

				-- 检查目标实体是否可以被驯养
                if target.components.domesticatable ~= nil then
                    -- 如果目标实体有驯养和顺从的方法
                    if target.components.domesticatable.GetDomestication and target.components.domesticatable.GetObedience ~= nil then
                        -- 获取目标实体的饥饿值
                        local hunger = target.components.hunger.current
                        -- 获取目标实体的顺从值
                        local obedience = target.components.domesticatable:GetObedience()
                        -- 获取目标实体的驯养值
                        local domestication = target.components.domesticatable:GetDomestication()
                        -- 如果驯养值不为0
                        if domestication ~= 0 then
                            -- 在字符串后添加饥饿、顺从和驯养的信息
                            str = str.."\n饥饿: "..round2(hunger).."\n顺从: "..round2(obedience*100,0).."%".."\n驯服: "..round2(domestication*100,0).."%"
                        end
                        -- 遍历目标实体的倾向
                        for k,v in pairs(target.components.domesticatable.tendencies) do
                            -- 默认倾向为"默认"
                            local ten = "默认"
                            -- 如果倾向为ORNERY,则设置为"战牛"
                            if k == GLOBAL.TENDENCY.ORNERY then
                                ten = "战牛"
                            -- 如果倾向为RIDER,则设置为"行牛"
                            elseif k == GLOBAL.TENDENCY.RIDER then
                                ten = "行牛"
                            -- 如果倾向为PUDGY,则设置为"肥牛"
                            elseif k == GLOBAL.TENDENCY.PUDGY then
                                ten = "肥牛"
                            end
                            -- 在字符串后添加倾向的信息
                            str = str .. string.format("\n %s:%.2f", ten, v)
                        end
                    end
                end
				-- 检查目标实体是否可以被采摘,并且有目标时间
                if target.components.pickable and target.components.pickable.targettime then
                    -- 在字符串后添加距离成长的时间(树枝、草、浆果、咖啡树)
                    str = str .."\n距离成长: " .. tostring(math.ceil((target.components.pickable.targettime - GLOBAL.GetTime())/48)/10) .." 天"
                end
                -- 检查目标实体是否可以被砍伐,并且有目标时间
                if target.components.hackable and target.components.hackable.targettime then
                    -- 在字符串后添加距离成长的时间(藤蔓、竹林)
                    str = str.."\n距离成长: "..tostring(math.ceil((target.components.hackable.targettime - GLOBAL.GetTime())/48)/10).." 天"
                end
                -- 检查目标实体是否可以被部署,并且有生长时间
                if target.components.deployable and target.growtime then
                    -- 在字符串后添加树苗的生长时间
                    str = str.."\n树苗: "..tostring(math.ceil((target.growtime - GLOBAL.GetTime())/48)/10).." 天"
                end
                -- 检查目标实体是否可以成长,并且有目标时间
                if target.components.growable and target.components.growable.targettime then
                    -- 在字符串后添加下一阶段的时间(树)
                    str = str.."\n下一阶段: "..tostring( math.ceil((target.components.growable.targettime - GLOBAL.GetTime())/48)/10).." 天"
                end
                -- 检查目标实体是否有晾肉架组件,并且正在晾肉
                if target.components.dryer and target.components.dryer:IsDrying() then
                    -- 如果正在晾肉,并且有获取晾肉时间的方法
                    if target.components.dryer:IsDrying() and target.components.dryer.GetTimeToDry then
                        -- 在字符串后添加剩余的晾肉时间
                        str = str.."\n剩余: "..round2((target.components.dryer:GetTimeToDry()/TUNING.TOTAL_DAY_TIME)+0.1,1).." 天"
                    end
                end
				-- 检查目标实体是否有烹饪组件,并且烹饪时间大于0
                if target.components.stewer and target.components.stewer:GetTimeToCook() > 0 then
                    -- 计算剩余的烹饪时间
                    local tm = math.ceil(target.components.stewer.targettime-GLOBAL.GetTime(),0)
                    -- 获取烹饪的食物名称
                    local cookname = GLOBAL.STRINGS.NAMES[string.upper(target.components.stewer.product)]
                    -- 如果剩余时间小于0,则设置为0
                    if tm <0 then tm=0 end
                    -- 在字符串后添加正在烹饪的食物和剩余时间
                    str = str .."\n正在烹饪: "..tostring(cookname).."\n剩余时间(秒): "..tm
                end
                -- 检查目标实体是否有农作物组件,并且有生长百分比
                if target.components.crop and target.components.crop.growthpercent then
                    -- 如果有产品预制体
                    if target.components.crop.product_prefab then
                        -- 在字符串后添加产品的名称
                        str = str.."\n"..(GLOBAL.STRINGS.NAMES[string.upper(target.components.crop.product_prefab)])
                    end 
                    -- 如果生长百分比小于1
                    if target.components.crop.growthpercent < 1 then
                        -- 在字符串后添加距离成长的百分比
                        str = str.."\n距离成长: "..math.ceil(target.components.crop.growthpercent*1000)/10 .."%" 
                    end    
                end
			-- 检查目标实体是否有燃料组件,并且不是库存目标
                if target.components.fueled and not target.components.inventorytarget then
                    -- 在字符串后添加燃料的百分比
                    str = str.."\n燃料: "..math.ceil((target.components.fueled.currentfuel/target.components.fueled.maxfuel)*100) .."%" 
                end
                -- 检查目标实体是否有追随者组件,并且有最大追随时间
                if target.components.follower and target.components.follower.maxfollowtime then
                    -- 获取最大追随时间
                    mx = target.components.follower.maxfollowtime
                    -- 计算当前的忠诚百分比
                    cur = math.floor(target.components.follower:GetLoyaltyPercent()*mx+0.5)
                    -- 如果当前的忠诚百分比大于0
                    if cur>0 then
                        -- 在字符串后添加忠诚的百分比
                        str = str.."\n忠诚: "..cur
                    end
                end
                -- 检查目标实体是否有船耐久组件
                if target.components.boathealth  then
                    -- 在字符串后添加船的当前耐久和最大耐久
                    str = str.."\n船: "..math.ceil(target.components.boathealth.currenthealth).."/"..target.components.boathealth.maxhealth
                end
				-- 检查目标实体是否有有限使用组件
                if target.components.finiteuses then
                    -- 如果有消耗属性
                    if target.components.finiteuses.consumption then
                        local use = 1
                        -- 遍历消耗属性
                        for k,v in pairs(target.components.finiteuses.consumption) do
                            use = v
                        end
                        -- 在字符串后添加耐久的当前值和总值
                        str = str .."\n耐久: "..math.floor(target.components.finiteuses.current/use+.5).."/"..math.floor(target.components.finiteuses.total/use+.5)
                    else
                        -- 在字符串后添加耐久的当前值和总值
                        str = str .."\n耐久: "..target.components.finiteuses.current.."/"..target.components.finiteuses.total 
                    end  
                end
                -- 检查目标实体是否有可工作组件
                if target.components.workable then
                    -- 获取工作动作
                    local action =  target.components.workable:GetWorkAction()
                    -- 在字符串后添加工作动作
                    str = str .."\n动作: ".. tostring(action.id)
                end
                -- 检查目标实体是否有生长组件
                if target.components.growth then
                    -- 在字符串后添加等级和经验值
                    str = str .. "\n等级:" .. target.components.growth:GetLevel() .. " (经验: "..target.components.growth:GetCurrentExp().."/"..target.components.growth:GetCurrentMaxExp() .. ")"
                end
			end
		end
		return old_SetString(text,str)
	end
end)

添加完上面代码之后就可以进入游戏测试,将鼠标放在物品上就会显示详细信息了
在这里插入图片描述`

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Airbert: In-domain Pretraining for Vision-and-Language Navigation

题目&#xff1a;Airbert&#xff1a;视觉和语言导航的域内预训练 摘要 为了解决VLN数据集稀缺的问题&#xff0c;本文创建了一个数据集BNB。我们首先从在线租赁市场的数十万个列表中收集图像标题 (IC) 对。接下来&#xff0c;我们使用 IC 对提出自动策略来生成数百万个 VLN …

OpenCV与YOLO学习与研究指南

引言 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一个流行的实时对象检测系统。对于大学生和初学者而言&#xff0c;掌握这两项技术将大大提升他们在图像处理和机器视觉领域的能力。 基础知识储备 在深入…

Apache Commons IO: 简化文件和IO操作

第1章&#xff1a;引言 咱们在做Java编程的时候&#xff0c;经常会遇到各种文件操作和输入输出&#xff08;IO&#xff09;的问题。不论是读取一个配置文件&#xff0c;还是把数据写入日志&#xff0c;这些看似简单的任务有时候会让人头疼。传统的Java IO操作&#xff0c;虽然…

Odoo16 实用功能之Form视图详解(表单视图)

目录 1、什么是Form视图 2、Form视图的结构 3、源码示例 1、什么是Form视图 Form视图是用于查看和编辑数据库记录的界面。每个数据库模型在Odoo中都有一个Form视图&#xff0c;用于显示该模型的数据。Form视图提供了一个可编辑的界面&#xff0c;允许用户查看和修改数据库记…

设计模式--迭代器模式

实验18&#xff1a;迭代器模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解迭代器模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用迭代器模式解决实际问题。 [实验任务]&#xff1a;JAVA和C常见数据结构迭代…

PyTorch随机数生成:torch.rand,torch.randn,torch.randind,torch.rand_like

在用PyTorch做深度学习开发过程中&#xff0c;时常用到随机数生成功能&#xff0c;但经常记不住几个随机数生成函数的用法&#xff0c;现在正好有点时间&#xff0c;整理一下。 1. torch.rand() torch.rand(*size, *, generatorNone, outNone, dtypeNone, layouttorch.stride…

我们是如何测试人工智能的(一)基础效果篇(内含大模型的测试内容)

来源&#xff5c;TesterHome社区 作者&#xff5c;孙高飞 前言 这个系列算是科普文吧&#xff0c;尤其这第一篇可能会比较长&#xff0c;因为我这8年里一直在 AI 领域里做测试&#xff0c;涉及到的场景有些多&#xff0c;我希望能尽量把我经历过的东西都介绍一下&#xff0c;…

<JavaEE> 协议格式 -- 传输层协议 UDP

目录 一、UDP协议格式长啥样&#xff1f; 二、端口号和IP地址 1&#xff09;UDP协议中包含哪两个端口号&#xff1f; 2&#xff09;有没有包含IP地址&#xff1f; 三、UDP报文长度 1&#xff09;UDP报文长度最长多长&#xff1f; 2&#xff09;UDP报文的组成&#xff1f…

Socket地址

socket地址其实是一个结构体&#xff0c;封装端口号和IP等信息 。后面的 socket 相关的 api 中需要使用到这个socket地址。 客户端 -> 服务器需要知道服务器的&#xff08; IP, Port &#xff09; 一、通用 socket 地址 socket 网络编程接口中表示 socket 地址的是结构体…

linux cpu调度分析

一、cpu调度调试方法 echo 0 > /sys/kernel/debug/tracing/tracing_on echo > /sys/kernel/debug/tracing/trace echo 30720 > /sys/kernel/debug/tracing/buffer_size_kb echo nop > /sys/kernel/debug/tracing/current_tracer echo sched_switch sched_wakeup s…

MYSQL函数\约束\多表查询\事务

函数 字符串函数 数值函数 mod就是取余 日期函数 流程函数 约束 外键约束 删除更新\外键 多表查询 多表关系 一对多 多对多 一对一 多表查询 内连接 select e.name d.name from emp e join dept d on e.id d.id; 外连接 select emp.*, d.name from emp left join tm…

计算机网络(4):网络层

网络层提供的两种服务 虚电路服务&#xff08;Virtual Circuit Service&#xff09;和数据报服务&#xff08;Datagram Service&#xff09;是在网络层&#xff08;第三层&#xff09;提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…

初识QT(上篇):What Qt

初识QT&#xff08;上篇&#xff09;&#xff1a;What Qt 前言 & 说明前言说明 初识QT1.1 QT的what1. 介绍2. 发展历程3. QT架构的主要内容4.QT的常用模块 1.2 QT的 why1. QT的核心机制 下篇笔记链接 前言 & 说明 前言 前言&#xff1a; 之前说要share的qt相关知识&am…

看图学源码之FutureTask

RunnableFuture 源码学习&#xff1a; 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现&#xff0c;包括启动和取消计算的方法&#xff0c;查询计算是否完成以…

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts

介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架&#xff0c;前端主要是echarts 安装教程 下载到本地&#xff0c;在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…

Unity2017升级到Unity2018在Window7上输出空异常错误问题

Unity2017升级到Unity2018在Window7上输出空异常错误问题 一、环境Window7二、现象Unity报空异常&#xff08;.NET 4.x Equivalent&#xff09;三、日志四、解决方案第一种解决方案第二种解决方案 一、环境Window7 二、现象Unity报空异常&#xff08;.NET 4.x Equivalent&…

免费WPML v4.6.6已注册学习版+17插件包

免费WPML v4.6.6已注册学习版17插件包 关于一个名为WPML的WordPress插件的描述。这个插件被用于创建和管理多语言网站&#xff0c;使得网站的内容可以轻松地翻译成多种语言。 以下是这段文本的详细分析&#xff1a; WPML v4.6.6 已注册&#xff1a;这是插件的名称和版本号。表…

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

黑格尔哲学,从入门到入坟

身体需要锻炼&#xff0c;心灵也需要锻炼。哲学家思考的大致步骤&#xff1a;确立自己哲学的基本原则&#xff0c;在此原则基础上建构哲学体系。 黑格尔建立了哲学史上最庞大最全面的哲学体系。 黑格尔的对手是康德。 黑格尔哲学包括逻辑学、自然哲学、精神哲学。逻辑学&…

Vscode中plot不显示

需要在File->preference->settings中的搜索框中搜索plots&#xff0c;然后将勾选框勾选 然后重启vscode&#xff0c;解决!