饥荒Mod 开发(十六):五格装备栏

饥荒Mod 开发(十五):小地图显示物品
源码
饥荒中的装备栏只有3个实在太少了,手,头,身体。 身体上装备的物品会有冲突,很多不能一起装备,比如 衣服,项链,背包等。 而这三种物品又有自己不同的功能,所以急需扩展饥荒的装备栏,让游戏更丰富。
下图是饥荒目前的装备栏。

在这里插入图片描述

修改之后的效果图
在这里插入图片描述

准备贴图

这个png图片中包含了两个装备栏贴图,可以打开slots5.xml文件看到里面定义了两个。
在这里插入图片描述

加载资源文件

在modmian.lua 文件中加载资源

Assets = 
{Asset("IMAGE", "images/inventoryimages/slots5.tex"),Asset("ATLAS", "images/inventoryimages/slots5.xml"),
}

注入装备槽创建

默认情况下 装备槽只有3个,我们需要在主界面创建的过程中额外多创建2个槽。所以需要拦截 界面的创建

-- 增加两个物品栏
GLOBAL.EQUIPSLOTS.BACK = "back" -- 定义背包插槽
GLOBAL.EQUIPSLOTS.NECK = "neck" -- 定义项链插槽-- 对"playerhud"类进行后构造
AddClassPostConstruct("screens/playerhud", function(self) -- 保存原始的SetMainCharacter函数local oldfn = self.SetMainCharacter-- 重写SetMainCharacter函数function self:SetMainCharacter(maincharacter,...)-- 调用原始的SetMainCharacter函数oldfn(self, maincharacter,...)-- 检查是否可以注入if not(self.controls and self.controls.inv) thenprint("ERROR: Can't inject in screens/playerhud.")returnend-- 添加背包插槽self.controls.inv:AddEquipSlot(GLOBAL.EQUIPSLOTS.BACK, "images/inventoryimages/slots5.xml", "back.tex")-- 添加项链插槽self.controls.inv:AddEquipSlot(GLOBAL.EQUIPSLOTS.NECK, "images/inventoryimages/slots5.xml", "neck.tex")-- 如果存在背景,则调整背景的缩放if self.controls.inv.bg thenself.controls.inv.bg:SetScale(1.25,1,1.25)end-- 获取背包物品local bp = maincharacter.components.inventory:GetEquippedItem(GLOBAL.EQUIPSLOTS.BACK)-- 如果背包存在并且有容器组件,则关闭并重新打开容器if bp and bp.components.container thenbp.components.container:Close()bp.components.container:Open(maincharacter)endend
end)

进入游戏测试

在这里插入图片描述

可装备物品物品

此时虽然现实了5个装备栏,但是项链和背包还是只能装备在身体部位,并不能装备到其他的槽,主要是因为 装备的部位不对导致的。需要在modmain.lua 文件中增加下面代码

修改项链装备的位置

我们需要修改项链的装备位置,装备到GLOBAL.EQUIPSLOTS.NECK

-- 修改项链的装备位置
local amulets = {"amulet", "blueamulet", "purpleamulet", "orangeamulet", "greenamulet", "yellowamulet", -- 标准的护身符"blackamulet", "pinkamulet", "whiteamulet", "endiaamulet", "grayamulet", "broken_frosthammer", -- mod 物品"musha_egg", "musha_egg1", "musha_egg2", "musha_egg3", "musha_egg8", "musha_eggs1", "musha_eggs2", "musha_eggs3", -- mod 物品
}-- 遍历所有的物品
for i,v in ipairs(amulets) do-- 对每个物品进行后期初始化AddPrefabPostInit(v, function(inst)-- 如果物品可以装备if inst.components.equippable then-- 修改物品的装备插槽为 NECKinst.components.equippable.equipslot = GLOBAL.EQUIPSLOTS.NECKendend)
end

在这里插入图片描述

修改背包的装备位置

-- 修改背包装备的位置
local backpacks = {"backpack", "piggyback", "krampus_sack", "icepack", "mailpack", "thatchpack", "piratepack", "spicepack", "spicepack", --标准"seasack", --新的"bunnyback", "wolfyback", "sunnybackpack", "frostback", "pirateback" } --mod-- 遍历背包数组
for i,v in ipairs(backpacks) do-- 对每种背包进行后初始化AddPrefabPostInit(v,function(inst)-- 如果背包有可装备组件if inst.components.equippable then-- 设置背包的装备插槽为背部插槽inst.components.equippable.equipslot = GLOBAL.EQUIPSLOTS.BACK            endend)
end

在这里插入图片描述

最后再来一张全部装备的截图

在这里插入图片描述

“重生护符”特殊逻辑

红宝石项链有特殊逻辑,可以使角色重。当角色死亡的时候会查找装备栏判断是否有重生护符, 然而此时的项链已经被装备到了 GLOBAL.EQUIPSLOTS.NECK 部位,游戏就会找不到重生护符,导致重生失效,所以需要特殊处理,在modmain.lua 中增加下面代码

-- 引入 resurrectable 和 inventory 组件
local comp_res = GLOBAL.require "components/resurrectable"
local comp_inv = GLOBAL.require "components/inventory"-- 定义一个变量,用于确保只修复一次。可能与一些 mod 不兼容。
local fix_once = nil -- 保存原始的 GetEquippedItem 方法
local old_GetEquippedItem = comp_inv.GetEquippedItem
-- 重写 GetEquippedItem 方法
function comp_inv:GetEquippedItem(slot,...)-- 如果 fix_once 不为 nil,则进行修复if fix_once ~= nil thenfix_once = nil-- 获取脖子上装备的物品local item = old_GetEquippedItem(self,GLOBAL.EQUIPSLOTS.NECK,...)-- 如果物品存在,并且是护身符,则返回该物品if item ~= nil and item.prefab == "amulet" thenreturn itemendend-- 否则,调用原始的 GetEquippedItem 方法return old_GetEquippedItem(self,slot,...)
end-- 保存原始的 FindClosestResurrector 方法
local old_FindClosestResurrector = comp_res.FindClosestResurrector
-- 重写 FindClosestResurrector 方法
function comp_res:FindClosestResurrector(...)fix_once = truereturn old_FindClosestResurrector(self,...)
end-- 保存原始的 CanResurrect 方法
local old_CanResurrect = comp_res.CanResurrect
-- 重写 CanResurrect 方法
function comp_res:CanResurrect(...)fix_once = truereturn old_CanResurrect(self,...)
end-- 保存原始的 DoResurrect 方法
local old_DoResurrect = comp_res.DoResurrect
-- 重写 DoResurrect 方法
function comp_res:DoResurrect(...)fix_once = truereturn old_DoResurrect(self,...)
end-- 在模拟器初始化之后执行
AddSimPostInit(function()-- 遍历所有的状态图实例for instance,_ in pairs(GLOBAL.SGManager.instances) do-- 如果实例的名称是 "wilson"if(instance.sg.name == "wilson") then-- 遍历实例的所有状态for k,v in pairs(instance.sg.states) do-- 如果状态的名称是 "amulet_rebirth"if(v.name == "amulet_rebirth") then-- 保存原始的退出函数local old_fn = v["onexit"]-- 重写退出函数v["onexit"] = function(...) -- Hook the function. Don't replace itfix_once = truereturn old_fn(...)end-- 找到目标状态后,退出循环breakendend-- 找到目标实例后,退出循环breakendend
end)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio(目前只支持Windows及Mac平台)搭配相应的SDK进行,现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例,进行开发环境的搭建。 下载…

解决:Invalid bound statement (not found): com.XXXXX.UserMapper.countUser

问题:Invalid bound statement (not found): com.XXXXX.UserMapper.countUser 原因:mapper.java和mapper.xml映射不上 解决方法: 1、在application.properties全局配置文件中没有加上映射mapper文件的配置,mapper为resources下的文件&…

Note3---初阶二叉树~~

目录​​​​​​​ 前言🍄 1.树概念及结构☎️ 1.1 树的概念🎄 1.2 树的相关概念🦜 1.2.1 部分概念的加深理解🐾 1.2.2 树与非树🪴 1.3 树的表示🎋 1.4 树在实际中的运用(表示文件系统…

JMeter定时器

JMeter定时器 一、同步定时器1、场景2、位置3、参数4、使用 二、常数吞吐量定时器1、场景2、作用3、位置4、参数 三、固定定时器1、场景2、位置3、用例 一、同步定时器 1、场景 1w人同时使用电商网站:相对并发,可用线程组实现1w人同时秒杀:绝…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着,这一段程序或代码在MysQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

基于知识库的接口自动化测试——结果模型化方法与装置的分析

一、背景 随着自动化测试的设计理念不断完善、新的技术不断应用,自动化测试资产的积累代价和维护成本不断降低,自动化测试资产的数量持续增长。同时,随着DevOps的普及,应用研发过程越来越敏捷,自动化测试能力逐步从测…

【数据结构复习之路】图(严蔚敏版)两万余字超详细讲解

专栏:数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】【树和二叉树】,我们接着复习 图,这篇文章我写的非常详细且通俗易懂,看完保证会带给你不一样的收获。如果对你有帮助,看在我这么辛…

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…

RLC防孤岛负载测试:电力系统安全运行的重要保障

在电力系统中,孤岛效应是一个严重的问题,它可能导致电力系统的不稳定甚至崩溃。为了确保电力系统的安全运行,必须进行RLC防孤岛负载测试。RLC防孤岛负载测试是一种模拟电网故障后,对电力系统进行检测的方法,主要用于检…

LinuxCNC的使用

先进行程序设置 点击“开始”,选择“创建新的配置” 设置好机床名称和单位 关键是需要设置并口地址 查看并口使用命令:lscpi -v 将使用的并口填入: 这里是设置页面

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言: 本论文由同济大学、微软亚洲研究院、西安电子科技大学,于2023年12月11日中了AAAI2024 论文: 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址: [2312.06323]…

8款AI写作神器,轻松创作高质量内容

随着AI技术的不断发展,AI生成文案平台也逐渐成为一种新型的写作工具。这些平台利用先进的算法和自然语言处理技术,能够快速生成高质量的文案内容。不仅可以提高写作效率,还可以帮助创作者更好地表达思想和创意。AIGCer介绍几款好用的AI写作工…