饥荒联机版Mod开发——制作简单的物品(三)

article/2025/3/11 6:11:33

饥荒联机版Mod开发——制作简单的物品(三)

  • 前言
  • 建立文件夹及mod图标
  • 把文件夹添加到VS Code
  • mod代码的入口——modmain
  • 探寻官方代码
  • 看懂官方代码
  • 创建动画、贴图
    • 动画
      • 修改动画相关代码
    • 物品栏贴图
      • 修改贴图相关代码
  • 添加物品名字,检查对话
  • 传送门

前言

在这章中,我们讲学习如何制作一个简单的物品mod,各个文件[夹]的意义,下面有请我们的主角——威尔逊的胡子。让我们看一下它都能干嘛。

  1. 能扔地上
    在这里插入图片描述
  2. 能飘在水面上
    在这里插入图片描述
  3. 能检查
    在这里插入图片描述
  4. 能放进/移出物品栏
    在这里插入图片描述
  5. 能当燃料
    在这里插入图片描述
  6. 当建筑材料,保温?不过这都不是它自己的事,雕像只是需要胡子而已这个,保温是w自己的事。而关于建筑和菜单栏相关教程会在后面出。

所以现在我们先把前5个功能实现了。

建立文件夹及mod图标

打开饥荒联机版的mods路径(如:F:\Steam\steamapps\common\Don’t Starve Together\mods)
新建空文件夹,随便起个名字,这里我的是mybeard。然后去其他mod里面把 modicon.tex、modicon.xml 复制过来。
在这里插入图片描述

用TEXTool.exe打开modicon.tex(没工具的或对工具不熟的看第一期)。观察下面的一行的参数
在这里插入图片描述
Size是 128x128像素,有多个Mipmaps。modicon的Size记号。
接着我们点左上角的保存,把它导出为png格式在这里插入图片描述
这里直接导出到刚才我们建的文件夹就好,方便管理,如果有Steam的饥荒开发工具(见第一期),也会自动打包。
命名为 modicon.png 。然后打开你的图片编辑软件(PS、SAI等),这里我用就简单用画图了,编辑你的mod图标并保存。
在这里插入图片描述
下一步把modicon.png转为modicon.tex。
打开texcreator.exe,选择modicon.png,输出路径选桌面(或者刚才那个文件夹,免去复制)
在这里插入图片描述
由于我们是从其他mod那拿来的modicon,Size不用担心。再把其他参数,对应上即可。Mipmaps是复数的,所以要把Generate Mipmaps勾上,否则导出的tex的Mipmaps为1。
在这里插入图片描述
然后替换我们文件夹的tex即可。这样我们的mod图标就搞定了。

把文件夹添加到VS Code

没用VS Code配置代码环境的,看第二期。打开之前第二期配好的VS Code工作区,看我们的beard文件夹是否出现在mods里了。在这里插入图片描述
点击beard,然后右键创建文件或者点+号在这里插入图片描述
起名为 modinfo.lua,复制粘贴进去。各项的意思基本上可以通过英文名判断出来。


name = "我的mod名字"  ---mod名字
description = "你好,世界"  --mod描述
author = "我" --作者
version = "1.0" -- mod版本 上传mod需要两次的版本不一样forumthread = ""    --和官方论坛相关,一般不填api_version = 10    --api版本,现在版本写10就行dst_compatible = true --是否兼容联机dont_starve_compatible = false --是否兼容原版
reign_of_giants_compatible = false --是否兼容巨人DLCall_clients_require_mod = true --所有人都需要mod,true就是icon_atlas = "modicon.xml" --mod图标
icon = "modicon.tex"server_filter_tags = {  --服务器标签}--[[  取消注释,在这行前面加个-就行。可选的mod设置,在modmain里面用 GetModConfigData("test_name") 来获取值,data只能是boolean/string/number
configuration_options = {{name = "test_name",label = "一直显示的选项标题",hover = "选中时最上面显示的提示",options =		{{description = "选项1", data = true, hover = "提示1"},{description = "选项2", data = false, hover = "提示2"},		},default = true,},
}
--]]

现在进游戏,看看效果。

在这里插入图片描述
如果到这步都没什么问题,那mod贴图和mod介绍部分就完成了。下面将开始编写代码,让它跑起来。

mod代码的入口——modmain

在mybeard文件夹下,建个 modmain.lua
在这里插入图片描述
在这里我们简单声明下我们的预设物(Prefab)文件就好。这样在生成prefab时就会去运行对应的lua文件

PrefabFiles = {     --scripts/prefabs文件夹下面我们自己的文件名,没有后缀"mybeard"
}

在mybeard文件夹下建立scripts文件夹,在scripts文件夹下建立prefabs文件夹,在prefabs文件夹下建立 mybeard.lua(对应我们在modmain里写的名字)
在这里插入图片描述

探寻官方代码

我们可以通过各种途径知道胡须的预设物名字叫 beardhair (你也可以在第一章中资料中的饥荒代码大全里找到)

官方scripts文件夹安排是这样的,而我们写的mod的文件夹名应该和官方的保持一致。
在这里插入图片描述
下一步我们要找的预设物胡须,其文件就在prefabs/beardhair.lua 里。你当然可以直接点开文件夹慢慢找,不过这里推荐,按 Ctrl+P ,输入beardhear来直接跳转到对应文件。
在这里插入图片描述
先复制代码到我们自己的mybeard.lua里面。
把最后一行的beardhair,改为我们自己的预设物名字 mybeard
在这里插入图片描述

因为我们现在用的是官方的动画,所以现在也可以进游戏,用控制台代码 c_spawn(“mybeard”) 来生成。

看懂官方代码

如果没认真学lua,先回去学lua吧!资料在第一期。

  • 资源声明
local assets =
{--添加这个预设物所用到的资源,这里只有个物品在地上时的动画Asset("ANIM", "anim/beardhair.zip"),
}

对应的文件在饥荒目录/data/anim里面,我们先把它复制到桌面,等下我们再创建我们自己的动画。
在这里插入图片描述
接下来我们看看构建函数fn,当生成预设物时,它就会调用构建函数并返回一个实体(entity),一般我们叫它 inst ,全称可能是 instance 。而这个实体一般会添加一堆组件,每个组件各有用处,提供对应的功能,如:

  • health、sanity、hunger对应三维,
  • inspectable 可检查
  • fuel 燃料
  • edible、perishable、eater对应食物系统
  • weapon、armor、combat对应攻击系统,
  • inventory、inventoryitem、stackable、equippable对应背包系统,
  • 而某些组件后面加有 _replica 后缀,它们是通过 netvars.lua 中的网络变量,或RPC来实现服务器和客户端通信的。

这些组件都在官方代码的 scritps/components 文件夹下,当lua学到一定程度,去看相应代码,而不是去随便copy。

local assets =
{--添加这个预设物所用到的资源,这里只有个物品在地上时的动画Asset("ANIM", "anim/beardhair.zip"),
}local function fn()local inst = CreateEntity()     --创建一个实体,官方代码在 scripts/mainfunctions.lua--C层的组件,类似的还有Phiysics、Light、Network、SoundEmitter等--这些组件我们看不见源代码,对应API可以看第一期提供的资源里的 笔记:物品制作常用组件.luainst.entity:AddTransform()  --添加位移组件,坐标位置inst.entity:AddAnimState()  --添加动画组件,用于播放动画(这里就一个地上的动画)MakeInventoryPhysics(inst)  --对于放在物品栏里的物理Phiysics,让其可以放地上,具体代码在 standardcomponents.lua--设置动画,这三个函数的参数意义在第一章提到过inst.AnimState:SetBank("beardhair")     --Sprite里面右下角第一层的entity nameinst.AnimState:SetBuild("beardhair")    --scml name,同时也是zip的名字inst.AnimState:PlayAnimation("idle")    --Sprite里面右下角第二层的animation nameinst.entity:AddNetwork()    --添加网络,因为要在服务器和客户端都显示MakeInventoryFloatable(inst, "med", nil, 0.75)  --让物品浮起来,后面三参数可省,具体代码在 standardcomponents.luainst.entity:SetPristine()   --推断是OnLoad等初始化相关的--一般与entity有关的代码,以及服务器和客户端都运行的代码都写在这行上面if not TheWorld.ismastersim then    --如果是客户端,返回inst,结束return inst         end--下面是服务器代码,我们添加若干组件,让实体有各种各样的功能inst:AddComponent("inspectable")    --可检查inst:AddComponent("inventoryitem")  --可放物品栏inst:AddComponent("stackable")  --可堆叠inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM --设置堆叠最大值inst:AddComponent("fuel")   --可当燃料inst.components.fuel.fuelvalue = TUNING.MED_FUEL    --设置燃料值MakeSmallBurnable(inst, TUNING.MED_BURNTIME)    --可自然MakeSmallPropagator(inst)   --可传递火焰,即自身燃烧时也点燃周围的物体,具体代码在 standardcomponents.luaMakeHauntableLaunchAndIgnite(inst)  --可作祟(Hauntable)和(火把)点燃(Ignite),具体代码在 standardcomponents.luareturn inst
endreturn Prefab("mybeard", fn, assets)  --组成成预设物,具体代码在prefabs.lua

以上代码解释完毕。下一期教你如何看懂component和调试代码

创建动画、贴图

现在可以进游戏看下效果,控制台 c_spawn(“mybeard”) 生成我们的预设物来看看。发现,对应本文开头的5种功能都在,只是名字显示,检查时并不是我们想要的效果,以及放在物品栏里没贴图。所以接下来,我们先制作动画和贴图。

动画

在mybeard文件夹下建个exported文件夹,在里面建个mybeard文件夹,在里面建个mybeard文件夹,随便找张图。(这一步除了exported文件夹名字不能变,其他文件夹和图片名随意,不过推荐和预设物一个名字,图片是xxx-序号,方便管理)
在这里插入图片描述
打开Sprite,点击左上角 File->New Project,有提示直接Ok
在这里插入图片描述
选择exported文件夹下的mybeard文件夹
在这里插入图片描述
双击右边的图片设置锚点(对应物品的落地点)
在这里插入图片描述
把图片拖出来,设置x,y为0。这样掉落物体时就正好从人物正中间位置开始掉落。

在这里插入图片描述
设置第一层的entity name为 mybeard(对应inst.AnimState:SetBank(“mybeard”))
设置第二层的anim name为 idle (对应inst.AnimState:PlayAnimation(“idle”))
在这里插入图片描述

保存为mybeard.scml (对应等下生成的zip文件名,对应代码里面inst.AnimState:SetBuild(“mybeard”) )
在这里插入图片描述
如果下有Steam上的饥荒开发工具,运行游戏时会自动打包,可以跳过这一步。没有的就需要我们手动打包了。
把exported文件夹下的mybeard文件夹复制
在这里插入图片描述
粘贴到打包工具下的相关目录(没软件的看第一章)
在这里插入图片描述
运行打包软件
在这里插入图片描述
把anim文件夹下的zip拷贝到我们自己mod下的anim文件夹。
在这里插入图片描述

修改动画相关代码

回到我们的mybeard.lua中,把对应动画代码的名字改为我们自己的文件,其他部分不变。

local assets =
{--添加这个预设物所用到的资源,这里只有个物品在地上时的动画Asset("ANIM", "anim/mybeard.zip"),
}--设置动画,这三个函数的参数意义在第一章提到过inst.AnimState:SetBank("mybeard")     --Sprite里面右下角第一层的entity nameinst.AnimState:SetBuild("mybeard")    --scml name,同时也是zip的名字inst.AnimState:PlayAnimation("idle")    --Sprite里面右下角第二层的animation name

运行游戏看是否正常显示我们的动画。
在这里插入图片描述
(这里我直接那modicon的图来用了,白底没删……)

物品栏贴图

在mybeard文件夹下,建个images文件夹,在里面建个inventoryimages。
在这里插入图片描述
官方没用单独的物品栏贴图,这里看看其他mod的物品栏贴图参数。Size64x64像素,多个Mipmaps。
在这里插入图片描述
打开的图像编辑软件(PS、SAI等)创建个64x64的png图片,并保存到inventoryimages文件夹下。名字就叫 mybeard(和我们预设物的名字对应)
在这里插入图片描述
如果下有Steam上的饥荒开发工具,运行游戏时会自动打包,可以跳过这一步。没有的就需要我们手动打包了。
用texcreator.exe把这张png,转为tex,记得勾选生成Mipmaps
在这里插入图片描述
(这里我先生成在桌面,等下剪切过去就行)
把modicon.xml复制粘贴过来,文件夹改为mybeard.xml
在这里插入图片描述
打开mybeard.xml(推荐用XML Tool,记事本也行)
把modicon替换成mybeard

在这里插入图片描述

修改贴图相关代码

回到 mybeardlua,在assets里注册我们的贴图文件。

local assets =
{--添加这个预设物所用到的资源,这里只有个物品在地上时的动画Asset("ANIM", "anim/mybeard.zip"),--物品栏贴图Asset("IMAGE", "images/inventoryimages/nohat.tex"), Asset("ATLAS", "images/inventoryimages/nohat.xml"),
}

并在inst:AddComponent(“inventoryitem”) 下指出我们的贴图。(参数名的意义去看官方代码 inventoryitem.lua)

    inst:AddComponent("inventoryitem")  --可放物品栏inst.components.inventoryitem.imagename = "mybeard"inst.components.inventoryitem.atlasname = "images/inventoryimages/mybeard.xml"

至此动画和贴图部分都搞定了。mybeard.lua 完整代码如下

local assets =
{--添加这个预设物所用到的资源,这里只有个物品在地上时的动画Asset("ANIM", "anim/mybeard.zip"),--物品栏贴图Asset("IMAGE", "images/inventoryimages/mybeard.tex"), Asset("ATLAS", "images/inventoryimages/mybeard.xml"),
}local function fn()local inst = CreateEntity()     --创建一个实体,官方代码在 scripts/mainfunctions.lua--C层的组件,类似的还有Phiysics、Light、Network、SoundEmitter等--这些组件我们看不见源代码,对应API可以看第一期提供的资源里的 笔记:物品制作常用组件.luainst.entity:AddTransform()  --添加位移组件,坐标位置inst.entity:AddAnimState()  --添加动画组件,用于播放动画(这里就一个地上的动画)MakeInventoryPhysics(inst)  --对于放在物品栏里的物理Phiysics,让其可以放地上,具体代码在 standardcomponents.lua--设置动画,这三个函数的参数意义在第一章提到过inst.AnimState:SetBank("mybeard")     --Sprite里面右下角第一层的entity nameinst.AnimState:SetBuild("mybeard")    --scml name,同时也是zip的名字inst.AnimState:PlayAnimation("idle")    --Sprite里面右下角第二层的animation nameinst.entity:AddNetwork()    --添加网络,因为要在服务器和客户端都显示MakeInventoryFloatable(inst, "med", nil, 0.75)  --让物品浮起来,后面三参数可省,具体代码在 standardcomponents.luainst.entity:SetPristine()   --推断是OnLoad等初始化相关的--一般与entity有关的代码,以及服务器和客户端都运行的代码都写在这行上面if not TheWorld.ismastersim then    --如果是客户端,返回inst,结束return inst         end--下面是服务器代码,我们添加若干组件,让实体有各种各样的功能inst:AddComponent("inspectable")    --可检查inst:AddComponent("inventoryitem")  --可放物品栏inst.components.inventoryitem.imagename = "mybeard"inst.components.inventoryitem.atlasname = "images/inventoryimages/mybeard.xml"inst:AddComponent("stackable")  --可堆叠inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM --设置堆叠最大值inst:AddComponent("fuel")   --可当燃料inst.components.fuel.fuelvalue = TUNING.MED_FUEL    --设置燃料值MakeSmallBurnable(inst, TUNING.MED_BURNTIME)    --可自然MakeSmallPropagator(inst)   --可传递火焰,即自身燃烧时也点燃周围的物体,具体代码在 standardcomponents.luaMakeHauntableLaunchAndIgnite(inst)  --可作祟(Hauntable)和(火把)点燃(Ignite),具体代码在 standardcomponents.luareturn inst
endreturn Prefab("mybeard", fn, assets)  --组成成预设物,具体代码在prefabs.lua

添加物品名字,检查对话

回到modmain.lua,声明具体名称和描述。完整modmain.lua代码如下

PrefabFiles = {     --scripts/prefabs文件夹下面我们自己的文件名,没有后缀"mybeard"
}--一键GLOBAL,免去了local STRINGS = GLOBAL.STRINGS等繁琐操作
GLOBAL.setmetatable(env,{__index=function(t,k) return GLOBAL.rawget(GLOBAL,k) end})		--全部大写,最后面对应我们的预设物名
STRINGS.NAMES.MYBEARD = "一个简单的物品"    --显示的名字
STRINGS.CHARACTERS.GENERIC.DESCRIBE.MYBEARD = "你好"    --人物检查时说的话

现在进入游戏看看效果。(每次修改mod要么重回世界,要么控制台命令 c_reset() 进行回滚,不过换贴图和动画时必须要重回世界)(建议不开洞穴,并把把资源调为无,世界调小)

完整的文件夹图。发布mod时.png文件和exported文件夹可以不上传。
在这里插入图片描述

传送门

→饥荒联机版Mod开发——Class, Prefab, component,debug(四)
←饥荒联机版Mod开发——配置代码环境(二)


http://chatgpt.dhexx.cn/article/f5aZdwsF.shtml

相关文章

我的世界mod服务器详细搭建

我的世界服务器搭建以及mod安装 服务器准备(推荐使用Linux系统)阿里云服务器购买xshell、xftp连接服务器1.安装配置java环境,java82.安装虚拟终端screen3.获取mc服务器jar包4.首次启动mc服务器端5.同意最终用户许可协议 EULA6.根据需要修改se…

我的世界在自建的服务器中装mod,《我的世界》中国版服务器MOD添加教程

我的世界中国版怎么加MOD 中国版功能组件怎么安装 《我的世界中国版》加MOD方法详解 1、首先右键你的MC中国版启动器找到打开文件夹位置,(如果右键中没有打开文件夹位置的话可以点击属性-快捷方式-打开文件夹所在位置)。 2、点击进入MCLauncherDownloadGame你需要添…

我的世界javamod怎么装_我的世界MOD安装方法图文教程_我的世界MOD怎么安装_牛游戏网...

【导读】很多玩家不知道我的世界MOD怎么安装,怎么用,今天小编就为你讲解一下我的世界MOD怎么用?一起来了解一下吧! 第一部分-安装JAVA7 下载完成后,打开: 安装(别更改目标文件夹) 安装完成 第二部分-选择游…

我的世界制作服务器rj,我的世界星系mod常用工具制作方法

我的世界星系mod中有许多有用的工具,下面小编为大家带来各种工具的详细介绍。 一、常用工具 全星系mod中**的装备系列,耐久度与戴斯系列装备相同 合成:致密钛板木棒 星系mod中装备等级第二高的系列 合成:致密戴斯板戴斯棒 戴斯稿子…

我的世界1.13 mod制作——Item材质及翻译(四)

1.13 游戏改了好多内容,就拿item来说,没有那么多花里胡哨冗余的代码了。 单单是给item上材质,研究老长时间,看了官方的教程,非官方的教程(国内的教程,国外的墙的太厉害,英语底子差也…

我的世界自制mod{0}

目录 路径如上 games/com.mojang/rescource_packs 创建一个叫做manifest.json的文件 里面创建叫做functions sounds shaders textures等等的一些名称 打开我的世界 面相国际基岩版 网易版不知道可不可以 我用的是手机编写的mod 其实就是懒 我认为手机写更加简便 用的是m…

【MineCraft】-- Mod制作物品与方块

基于上一文章继续, 下面完成以下功能:制作一个方块和物品,物品有描述信息。 快速指南 (第一次看请跳过这步) 如何制作物品与方块 1、/resources/assets/xxx/lang/... 添加物品或方块id 例: item.dem…

我的世界自制mod{1}

上期我们制作了一个什么也没有的mod上期说错了文件夹里没有functions文件 做一个包的图标 首先打开sounds for idol{你们自己包的名字的文件夹就是放manifest.json的文件夹} 然后像我这样在mt管理器找到一张图片 图片途径一般是DCIM/screenshots里面的 然后把他转移到刚刚说…

【MineCraft】-- 学习Mod制作合成配方

下面完成合成配方的制作; 合成分为有序合成和无序合成; 无序合成:无摆放位置要求 有序合成:需要正确的摆放位置 一、在recipes下放置json json名字建议与产物相关,但非必须。 首先找到recipes文件 recipes文件下建…

我的世界mod服务器怎么制作,我的世界国服MOD添加教程 我的世界国服MOD添加方法...

关于MOD: 首先我们要找到游戏的安装文件夹。 路径为: MCLDDownload---Game---你的账号---NetGame---你所要添加mod的服务器---.minecraft---mods(就是这个文件夹)将你需要安装的mod复制到mods文件夹即可。 如果找不到位置,也可以先进入游戏&a…

我的世界1.13 mod制作——简单的方块(五)

(一) 注册一个方块 新建一个类,继承Block(本来可以不用新建,可以直接实例化一个Block,为方便管理还是新建一个) package com.qiao.mymod.block;import net.minecraft.block.Block;public class MyBlock extends Block {public MyBlock(Prop…

java我的世界mod制作_我的世界:MOD的编写有多复杂,估计你也学不会

原标题:我的世界:MOD的编写有多复杂,估计你也学不会 MOD应该有不少人使用,但是你们知道MOD的去做有多困难吗?你们知道该怎么做吗?如何才能做一个简单的游戏模组呢?其实制作模组是非常简单的&…

我的世界1.13 mod制作——制作一个Item(二)

(一) 修改mod信息 forge 默认提供了一个mod配置,ExampleMod.java,接下来修改mod信息。 首先修改的是包的结构,去掉默认的包结构,改成符合mod信息的结构,我这里修改成了com.qiao.mymod. 修改类名…

java版我的世界如何做mod_《我的世界手机版》怎么制作mod制作JS教程图文攻略

我的世界手机版中,用惯其他人分享的JS之后觉得不满意,自己想要创作专属的JS?今天当乐网小编给大家带来的是我的世界手机版的JS基础教程,各位小伙伴学习一下然后自己制作JS吧: 教程作者:s某某世…

【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件

基于前面搭建的环境继续。 下面完成一个附魔书制作,并且附魔武器后有雷击效果。 一、监听事件两种情况 成员函数 对象构造时AddToEventBus 如: 函数开头上一行加SubscribeEvent 如: 静态函数 类开头Mod.EventBusSubscriber(括号里可写…

【MC 网易-我的世界-mod开发基础笔记】 --- 创建第一个空白Mod

目录 创建Mod文件夹构建Mod的基本目录结构构建行为包基本结构构建脚本文件夹基本结构构建 mod 启动入口脚本 构建资源包基本结构构建国际化文件基本结构自定义物品配置中文名称自定义方块配置中文名称自定义实体配置中文名 构建贴图资源文件夹的基本结构 创建Mod文件夹 在电脑…

我的世界1.13 mod制作——环境搭建(一)

说明:已经玩过好多年《我的世界》,大概从13年开始吧,虽然不算早,但是也不是很晚。因为高度自由、丰富的mod、精美的材质光影,简单的方块游戏风靡世界。最近心血来潮想学学怎么做mod,但是直接从1.13.2直接起…

我的世界MOD制作(2)|| 你的第一个MOD

正文:I. 开发环境配置 我们需要一个带mixin的forge开发环境,这一步相当折磨人,网络不好的话半天时间都得砸这上面,但是不要灰心,过了这个坎接下来基本是顺风顺水。 1. 下载资源 & 修改build.gradle 首先去forge官网…

Ts 简单随机迷宫迷宫地图

直接上代码 //随机地图const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)mapItem: cc.Node null;property(cc.Node)mapContent: cc.Node null;private mapArr: any [];onLoad() {}start() {}ran…

C++游戏编程--实现鼠标编辑迷宫地图界面

鼠标左键放砖,右键取消。 void Change() {Show();while (true) {ExMessage m;//定义一个消息变量m getmessage(EM_MOUSE);//获取鼠标消息switch (m.message){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:/…