饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜

news2025/1/15 16:55:09

饥荒Mod 开发(二十):显示打怪伤害值
源码
游戏中的物品栏容量实在太小了,虽然可以放在箱子里面但是真的很不方便,外出一趟不容易看到东西都不能捡。实在是虐心。 游戏中的食物还有变质机制,时间长了就不能吃了,玩这个游戏心里压力真是太大了。 下面介绍制作一个超级大背包,并且背包中的物品不会变质,基本上可以随心所欲的放食物进去。

1 需要先制作一个简易背包

结合之前做的5格装备栏,我们可以做一个自己的背包,将这个背包装备在背上。

1.1 准备贴图

下载一个64*64 png图片,带alpha通道的图片,放在 images\inventoryimages 目录下
在这里插入图片描述

1.2 编译贴图

使用 编译工具编译贴图,这部分可以参考 饥荒Mod 开发(三):资源工具使用

& 'h:\Don''t Starve Mod Tools\ds_mod_tools\build\win32\mod_tools\autocompiler.exe' "D:\WeGameApps\rail_apps\饥荒:单机版(2000013)\mods\pigpetfood"

执行完命令之后会生成贴图需要的文件
在这里插入图片描述

1.3 制作背包

前面的文章也有介绍如何制作一个简易的物品 饥荒Mod 开发(四):制作一个物品,先制作一个mybackpack 预制物,可以装备在背上,在 scripts\prefabs 目录下新建 mybackpack.lua
在这里插入图片描述

local assets=
{
    Asset("ATLAS", "images/inventoryimages/mybackpack.xml")
}

-- 定义一个函数,用于创建一个实体
local function fn(Sim)
    -- 创建一个新的实体
    local inst = CreateEntity()
    -- 添加变换组件,用于处理实体的位置和方向
    inst.entity:AddTransform()
    -- 添加动画状态组件,用于处理实体的动画
    inst.entity:AddAnimState()
    -- 添加声音发射器组件,用于处理实体的声音
    inst.entity:AddSoundEmitter()
    -- 使实体具有物理属性,如重力和碰撞
    MakeInventoryPhysics(inst)
    
    -- 设置实体的动画库为"backpack1"
    inst.AnimState:SetBank("backpack1")
    -- 设置实体的构建为"backpack"
    inst.AnimState:SetBuild("backpack")
    -- 播放"anim"动画
    inst.AnimState:PlayAnimation("anim")
    
    
    -- 添加可检查组件,使实体可以被检查
    inst:AddComponent("inspectable")
    
    -- 添加库存项组件,使实体可以被放入库存
    inst:AddComponent("inventoryitem")
    -- 设置实体不能被放入容器
    inst.components.inventoryitem.cangoincontainer = false
    inst.components.inventoryitem.atlasname = "images/inventoryimages/mybackpack.xml"

    -- 添加可装备组件,使实体可以被装备
    inst:AddComponent("equippable")
    -- 设置实体的装备插槽为背部插槽
    inst.components.equippable.equipslot = EQUIPSLOTS.BACK
    
    -- 返回创建的实体
    return inst
end


return Prefab( "common/mybackpack", fn, assets) 

1.4 注册预制物,设置描述

创建完了预制物之后需要注册到游戏中,并且设置 检测描述,在modmain.lua中添加 如下代码

PrefabFiles = {
    "mybackpack"
}

GLOBAL.STRINGS.NAMES.MYBACKPACK = "超级大背包"
GLOBAL.STRINGS.CHARACTERS.GENERIC.DESCRIBE.MYBACKPACK = "超级大,永久保鲜" 

1.5 进入游戏测试

由于背包设置的动画使用的饥荒自带的图片

在这里插入图片描述
装备之后
在这里插入图片描述

2 添加物品栏功能

2.1 创建3*25 格子

在mybackpack.lua 中添加容器代码

-- 添加一个容器组件,使实体可以存放物品
inst:AddComponent("container")
-- 创建一个表,用于存放插槽的位置
local slotpos = {}
-- 计算x轴的偏移量
local x_offset = (-72-72-40-2)*2

-- 创建一个3行25列的格子,用于存放物品
for x = 1, 3 do
    for y=1, 25 do
        -- 将每个格子的位置添加到slotpos表中
        table.insert(slotpos, Vector3(72*y +x_offset, 72*x -2-40-72-36, 0))
    end
end
-- 设置容器的插槽数量为slotpos表的长度
inst.components.container:SetNumSlots(#slotpos)
-- 设置容器的插槽位置为slotpos表
inst.components.container.widgetslotpos = slotpos
-- 设置容器的动画库为"ui_chest_3x3"
inst.components.container.widgetanimbank = "ui_chest_3x3"
-- 设置容器的位置
inst.components.container.widgetpos = Vector3(-340, -395, 0)
-- 设置容器的侧边对齐提示
inst.components.container.side_align_tip = 0
-- 设置容器的类型为"pack"
inst.components.container.type = "pack"

在这里插入图片描述

2.2 处理背包装备和卸载事件

-- 当装备背包时执行的函数
	local function onequip(inst, owner) 
	    -- 更改角色的动画状态,将 "swap_body" 符号替换为 "swap_backpack" 的 "backpack" 符号
	    owner.AnimState:OverrideSymbol("swap_body", "swap_backpack", "backpack")
	    -- 更改角色的动画状态,将 "swap_body" 符号替换为 "swap_backpack" 的 "swap_body" 符号
	    owner.AnimState:OverrideSymbol("swap_body", "swap_backpack", "swap_body")
	    -- 设置角色的背包为当前实例
	    owner.components.inventory:SetOverflow(inst)
	    -- 打开背包的容器
	    inst.components.container:Open(owner)
	end
	
	-- 当卸下背包时执行的函数
	local function onunequip(inst, owner) 
	    -- 清除角色动画状态中的 "swap_body" 符号的替换
	    owner.AnimState:ClearOverrideSymbol("swap_body")
	    -- 清除角色动画状态中的 "backpack" 符号的替换
	    owner.AnimState:ClearOverrideSymbol("backpack")
	    -- 清除角色的背包
	    owner.components.inventory:SetOverflow(nil)
	    -- 关闭背包的容器
	    inst.components.container:Close(owner)
	end
        -- 设置装备背包时的行为
    inst.components.equippable:SetOnEquip(onequip)
    -- 设置卸下背包时的行为
    inst.components.equippable:SetOnUnequip(onunequip)

3 添加保鲜功能

只需要在背包预制物代码中添加一个tag就可以实现保鲜功能

 inst:AddTag("fridge")

在modmain.lua 中添加如下代码

TUNING.PERISH_FRIDGE_MULT = 0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DQL-基本查询

概念: 1,数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示 2,MySQL提供了功能强大、灵活的语句来实现这些操作 3…

【SassVue】仿网易云播放器动画

简介 仿网易云播放动画 效果图&#xff08;效果图&#xff09; 最终成品效果 动画组件 src/components/musicPlay.vue <template><div class"music-play"><div></div><div></div><div></div></div> </te…

C语言中关于指针的理解

#include <stdio.h> int main() {int a11;int *p&a; //因为a是整型的&#xff0c;所以我们定义指针p的时候要和a的类型一样char b;char *pa&b; //同理&#xff0c;b是字符型&#xff0c;所以这里的pa也要用字符型return 0; }因为*p指向的是地址&…

Go 泛型之类型参数

Go 泛型之类型参数 文章目录 Go 泛型之类型参数一、Go 的泛型与其他主流编程语言的泛型差异二、返回切片中值最大的元素三、类型参数&#xff08;type parameters&#xff09;四、泛型函数3.1 泛型函数的结构3.2 调用泛型函数3.3 泛型函数实例化&#xff08;instantiation&…

【vue】开发常见问题及解决方案

有一些问题不限于 Vue&#xff0c;还适应于其他类型的 SPA 项目。 1. 页面权限控制和登陆验证页面权限控制 页面权限控制是什么意思呢&#xff1f; 就是一个网站有不同的角色&#xff0c;比如管理员和普通用户&#xff0c;要求不同的角色能访问的页面是不一样的。如果一个页…

ospf学习纪要

1、为避免区域&#xff08;area0,area1等&#xff09;间的路由形成环路&#xff0c;非骨干区域之间不允许直接相互发布区域间的路由。因此&#xff0c;所有的ABR&#xff08;Area Border Router,区域边界路由器&#xff09;都至少有一个借口属于Area0,所以Area0始终包含所有的A…

3.java——继承及拓展(保姆级别教程,万字解析,匠心制作)

三.继承——节省了共有属性和方法的代码&#xff1a;语法 class Student extends Person 1.继承基础 1.继承首先是面向对象中非常强的一种机制&#xff0c;他首先可以复用代码&#xff08;name ,age&#xff09;&#xff0c;让我们的获得了Person全部功能和属性&#xff0c;只…

基于Kubernetes的jenkins上线

1、基于helm 部署jenkins 要求&#xff1a;当前集群配置了storageClass&#xff0c;并已指定默认的storageClass&#xff0c;一般情况下&#xff0c;创建的storageClass即为默认类 指定默认storageClass的方式 # 如果是新创建默认类&#xff1a; apiVersion: storage.k8s.io/v1…

C# WPF上位机开发(从demo编写到项目开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 C# WPF编程&#xff0c;特别是控件部分&#xff0c;其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点&#xff0c;不过…

如何在linux安装软件

一.安装种类 1.编译安装&#xff1a;灵活性高&#xff0c;难度较大&#xff0c; 可以安装新版本 2.rpm安装&#xff1a;查软件信息&#xff0c;是否安装&#xff0c;文件列表 3.yum&#xff1a;是rpm的升级版本&#xff0c;解决rpm的弊端 rpm安装&#xff1a; 安装软件的时…

OpenCV利用HSV颜色区间分离不同物体

需求 当前有个需求是从一个场景中将三个不同的颜色的二维码分离出来&#xff0c;如下图所示。 这里有两个思路可以使用 思路一是通过深度学习的方式&#xff0c;训练一个能够识别旋转边界框的模型&#xff0c;但是需要大量的数据进行模型训练&#xff0c;此处缺少训练数据&a…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知&#xff0c;接口ISchedulerListener&#xff0c;如作业的添加、删除、停止、挂起等事件通知&#xff0c;调度器的启动、关闭、出错等事件通知&#xff0c;触发器的暂停、挂起等事件通知&#xff0c;接口部分定义如下&#xff1a…

springMVC-与spring整合

一、基本介绍 在项目开发中&#xff0c;spring管理的 Service和 Respository&#xff0c;SrpingMVC管理 Controller和ControllerAdvice,分工明确 当我们同时配置application.xml, springDispatcherServlet-servlet.xml , 那么注解的对象会被创建两次&#xff0c; 故…

ZooKeeper 使用介绍和原理详解

目录 1. 介绍 重要性 应用场景 2. ZooKeeper 架构 服务角色 数据模型 工作原理 3. 安装和配置 下载 ZooKeeper 安装和配置 启动 ZooKeeper 验证和管理 停止和关闭 4. ZooKeeper 数据模型 数据结构和层次命名空间&#xff1a; 节点类型和 Watcher 机制&#xff…

8002D 3W单声道带关断模式音频功率放大器 适用于游戏机、无源扬声器

8002D 是一款 AB 类&#xff0c;单声道带关断模式&#xff0c;桥式音频功率放大器。在输入 1KHZ,5V 工作电压时&#xff0c;最大驱动功率为: 3W.(422 负载&#xff0c;THD<10%)&#xff0c;2W,(4Q负载&#xff0c;THD<1%):音频范围内总谐波失真噪音小于 1%(20Hz20KHz ); …

基于YOLOv8深度学习的200种鸟类智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MA…

如何使用树莓派Bookworm系统中配置网络的新方法NetworkManager

树莓派在 10 月新出的 Bookworm 版本系统中&#xff0c;将使用多年的 dhcpcd 换成了 NetworkManager&#xff08;以前是在rasp-config中可选&#xff09;&#xff0c;这是因为 Raspberry Pi OS 使用的是 Debian 内核&#xff08;和 Ubuntu 一样&#xff09;&#xff0c;所以树莓…

持续集成交付CICD:Linux 部署 Jira 9.12.1

目录 一、实验 1.环境 2.K8S master节点部署Jira 3.Jira 初始化设置 4.Jira 使用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins slave &#xff08;从节点&#xff09; jira9.12.1…

Java经典框架之Spring

Java经典框架之Spring Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring简介 2.…