Flandre923
1421 words
7 minutes
沉浸工艺多方块00-总体性介绍

00 总体性介绍#

01#

IEMultiblocks​是一个静态的初始化的类,用于注册沉浸中的各种多方块机器。例如高炉,焦炉,粉碎机,合金炉等。

我们用粉碎机作为例子说下整个多方块机器的结构

image

CrusherMultiblock​继承IETemplateMultiblock​。

		super(new ResourceLocation(ImmersiveEngineering.MODID, "multiblocks/crusher"),//标识id
				CrusherLogic.MASTER_OFFSET, new BlockPos(2, 1, 2), new BlockPos(5, 3, 3), // master方块位置,trigger方块位置,大小
				IEMultiblockLogic.CRUSHER);// 方块行为逻辑,粉碎机可以粉碎矿物,代码定义。

IETemplateMultiblock​抽象类,继承于TemplateMultiblock​,

  • 构造器:初始化多方块模板,记录多方块的逻辑信息。

  • replaceStructureBlock:

    • 设置方块状态。
    • 更新方块实体位置。
    • 标记方块更新。
  • getSize:返回多方块的大小。

  • getTemplate:

    • 获取模板数据。
    • 确认模板尺寸正确。
  • prepareBlockForDisassembly:准备方块破坏。

  • initializeClient:初始化客户端数据。

  • getBlockName:获取方块资源名称。

  • getDisplayName:获取显示名称。

  • getBlock:获取方块实例。

TemplateMultiblock​类实现了IMultiblock​,对接口定义的行为有一定的实现,主要涉及到了对于结构模板的旋转匹配等操作。以创建多方块机器时候将机器方块替换掉构建方块。以及机器拆除时候的方法。

IMultiblock​接口定义了多方块结构的行为方法,包含了如何判断是否是当前的机器,以及如何创建当前的机器,以及如何拆除当前的机器等接口。

02#

到这里我们说一下,整个机器的创建逻辑是什么样子的。对于机器,当你放下构建方块排放好了之后,用锤子右键触发方块,那么此时会对所有的机器进行遍历,看当前的结构是否和目标的结构匹配,匹配上了,就会将机器的方块替换掉原先的构建方块,此时整个机器就构建完成了。

再说破坏,当你破坏一个机器的方块时候,机器就会调用方块的破坏方法,读取对于的模板结构的方块数据,将机器的方块替换回原先的构建方块。

举个高炉的例子, 你放置3*3*3的高炉砖,右键中间的方块时候,会更加你右键的面调整模板结构(NBT数据)的方向,最后和你放置的方块匹配,然后成功就将高炉方块替换掉高炉砖方块。完成构建。

03 模板结构数据NBT#

这个数据在image这里放置了多方快结构的所有模板数据,这个就决定了你的构建机器的方块应该摆成什么样子,例如高炉就是3*3*3的高炉砖。其他也是类似,这个模板数据你可以在游戏中搭建,然后通过结构方块(该方块你可以通过指令获得,原版提供的功能)获得。

04 机器模型#

对于机器的模型,是一整个OBJ文件,然后按照多方块的位置切换整个模型的渲染定点信息。然后在渲染具体的方块时候,会根据对应的方块的位置返回对应该位置上的顶点信息,这样整个机器看起来是一整个模型,同时还保留了多个方块的特点。

模型放在了。

image对于3*3 *** 3的结构来说,他们是同一个模型cube_three.obj,然后不同的贴图。另外对于blockstate,和block的json文件是通过datagen的方式生成的,block的model的json文件是自己写的加载,使用了neoforge提供的obj加载,并添加了切分方块的功能。blusunrize.immersiveengineering.client.models.split;​包下的类是对于的加载器。

05 方块实体逻辑#

机器方块的注册,机器方块的方块实体,逻辑处理,数据存储等功能,沉浸将其抽象为了一个MultiblockRegistration​,这个MultiblockRegistration​你需要取定义这个机器对于的机器方块是什么,方块实体是什么,以及数据存储的逻辑和对应有上面组件是否有GUI,是否处理红石信号,是否处理比较器信号等内容。

首先是IMultiblockLogic​每个机器都有一个IMultiblockLogic​实现,IMultiblockLogic​表示了机器的工作逻辑,例如焦炉是烧焦煤的并且生成煤焦油。粉碎机是粉碎矿物的。Logic包含了处理的逻辑,数据存储的方法和格式等内容。

对于机器方块实体的调用逻辑是将对于的tick委托给对于的helper,然后helper在根据当前的机器是否有tickserver进行调用MultiblockRegistration​的tickserver以及组件的tickserver方法(tickclient同理)。而tickerserver是IMultiblockLogic​的内容,对处理机器的逻辑,实现输入,输出,处理等功能。

对于机器的方块实体来说,有两部分,一部分是Master方块实体,另一部分是Dummy方块实体,Master方块实体是主方块实体,我们上述提到的tick和数据的save,load都是由Master来操作的。他的位置就是指定的机器的主方块的位置。Dummy方块实体是除了主方块实体其他的方块的方块实体,他们不处理数据,负责交互,和主方块实体沟通,例如,对于一个由GUI的机器,你右键了一个机器方块,这个机器方块有可能是Dummy的方块实体,那么他会获得机器的Master方块实体,然后获得对应的组件,调用组件的click方块,如果改组件是GUI组件,机会打开对应的GUI。

沉浸工艺多方块00-总体性介绍
https://fuwari.vercel.app/posts/imm/00-总体性介绍/
Author
Flandre923
Published at
2024-08-10