当前位置: 首页 > news >正文

我的世界Java版1.21.4的Fabric模组开发教程(十二)方块状态

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十二章——方块状态。想要阅读其他内容,请查看或订阅上面的专栏。

方块状态(blockstate) 指的是方块在世界中出现时展现的形式。有些复杂的方块可以与玩家交互,在此期间方块的状态可能因为玩家的交互而改变;或者是随时间推移,方块中某些数据的改变而导致方块状态的改变;又或者是世界、实体或者物品中某些数据发生改变而导致方块状态的改变。

在绝大多数情况下,方块状态改变的直接体现是方块外观的变化。例如,耕地由于周围有水从干燥变为湿润,或者是熔炉从最开始的熄灭状态,再到放入燃料后改变为燃烧状态。这些都是方块外观的变化,且均由方块状态的改变而引起。

某些方块状态已经由Minecraft API提前编写到位。例如,我们在本章中将创建一个带有多状态的方块——冰霜原木(ice_wood),它与其他原木没有差异,只是纹理有所变化。我们需要使用Minecraft API中提供的,带有AXIS属性的自定义方块类来创建“冰霜原木”,使其能够在其他方块侧面放置时将方块进行旋转,使其顶部始终裸露在外。

在开始前,请确保已经掌握了方块创建的基本流程。如有需要,请参考我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块。

如果使用Minecraft API提供的自定义方块类来创建带有多状态的自定义方块,通常需要完成以下步骤:

  • 直接在方块注册类中注册方块;
  • 创建模型文件、模型描述文件和方块纹理
  • 创建方块状态定义文件;
  • 在语言文件中为方块添加翻译键值对并将方块添加到物品组中;

直接在方块注册类中注册方块

想创建类似原木的方块,我们可以在方块注册类中直接使用PillarBlock注册方块。部分设置需要在配置文件中完成。

在方块注册类中声明静态常量ICE_WOOD,使用封装的register()方法对其初始化;

public static final Block ICE_WOOD = register("ice_wood",PillarBlock::new,AbstractBlock.Settings.create().sounds(BlockSoundGroup.WOOD),true);

参数列表中按顺序依次设置了物品名为“ice_wood”、抽象方块设置内部类对象和方块对象的函数式PillarBlock::new、交互声音为BlockSoundGroup.WOOD并要求注册方块对应的方块物品。

关于封装的register()方法的使用,请参考我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块。


柱状方块类PillarBlock

PillarBlock类是Minecraft API中提供的自定义方块类,用于创建形如柱子、树桩等形状的方块。这种方块有以下特点:

  • 方块的横截面,即顶部,与方块的底部纹理相同;
  • 方块的前后左右四个面的纹理相同,但与顶部和底部不同;
  • 方块放置在其他方块的顶部或底部时,方块以默认的状态呈现;
  • 方块放置在其他方块的前后左右四个部位时,方块将以X轴或Z轴旋转,使方块处于“躺倒”的状态呈现;

PillarBlock类中,设置了AXIS属性,供开发者在模型文件中根据属性设置方块的状态;

public static final EnumProperty<Direction.Axis> AXIS = Properties.AXIS;

枚举属性类EnumProperty与属性类Properties

EnumProperty用于为方块提供用于控制方块状态的枚举型属性,声明EnumProperty对象时,需要添加泛型。在本章中暂时没有用到其中的方法,如果后续使用到相关方法将在此处补充。

Properties定义了游戏中用到的所有方块和流体的属性,是为自定义方块创建与游戏中相同的属性时用到的类。其中声明了大量的静态常量,供游戏中的方块和流体使用。例如,这里我们用到了“轴”属性;

public static final EnumProperty<Direction.Axis> AXIS = EnumProperty.of("axis", Direction.Axis.class);

空间轴内部枚举类Direction.Axis

Axis类用于表示三维空间中的坐标轴方向,它在Direciton内部类中声明,可以作为方块状态属性来控制方块状态。

Axis类中声明了三个枚举常量XYZ,分别代表立体空间的三个坐标轴方向。请添加图片描述
在立体空间直角坐标系中,Z轴沿东西走向延伸,X轴沿南北走向延伸。


创建模型文件、模型描述文件和方块纹理

现在我们为“冰霜原木”分别创建模型文件、模型描述文件和方块纹理图,这里的写法与创建物品对应的文件写法有很大出入。

1.在assets/test/models/block目录中创建ice_wood.json,代表方块的模型文件;

{"parent": "minecraft:block/cube_column","textures": {"end": "test:block/ice_wood_horizontal","side": "test:block/ice_wood"}
}

这里要使用block/cube_column父模型,代表柱状模型。按照Minecraft API中cube_column模型的约定,方块顶部和底部共用同一纹理,配置项为"end";方块的其他面共用同一纹理,配置项为"side"

2.在assets/test/items目录中创建创建ice_wood.json,代表方块的模型描述文件;

{"model": {"type": "minecraft:model","model": "test:block/ice_wood"}
}

3.在assets/test/textures/block目录中创建ice_wood.png,作为原木前后左右四个面的纹理图;

在这里插入图片描述
然后再创建ice_wood_horizontal.png,作为原木顶部和底部的纹理图。

在这里插入图片描述

创建方块状态定义文件

在这里我们为“冰霜原木”添加三种方块状态,分别是方块沿X、Y、Z轴摆放时方块的朝向。

assets/test/blockstates目录中创建ice_wood.json,作为方块状态定义文件;

{"variants": {"axis=x": {"model": "test:block/ice_wood","x": 90,"y": 90},"axis=y": {"model": "test:block/ice_wood"},"axis=z": {"model": "test:block/ice_wood","x": 90}}
}

三种变种都需要应用test:block/ice_wood模型且:

  • "axis=x":当方块沿X轴摆放(东西走向),将方块绕X轴顺时针旋转90度,然后再绕Y轴顺时针旋转90度;
  • "axis=y":当方块沿Y轴摆放,保持原状;
  • "axis=z":当方块沿Z轴摆放(南北走向),将方块绕X轴顺时针旋转90度;

在语言文件中为方块添加翻译键值对并将方块添加到物品组中

现在我们为方块添加中文翻译,并将其添加到指定物品组中。

1.在语言文件zh-cn.json中添加一条键值对;

{..."item.test.ice_wood": "冰霜原木",...
}

将方块翻译为“冰霜原木”。

2.在入口点类的onInitialize()方法中,将方块添加到指定物品组中;

ItemGroupEvents.modifyEntriesEvent(CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {//...itemGroup.add(ModBlocks.ICE_WOOD.asItem());//...});

启动游戏测试

现在可以启动游戏,测试方块是否正常工作。

1.打开创造模式物品栏,找到“冰霜原木”;
在这里插入图片描述
可以看到物品名和物品纹理显示正常;

2.将其放置在地面上,并沿X轴和Z轴各摆放一个;
在这里插入图片描述
方块的朝向和显示均正常。

本章小结

本章详细阐述了创建特定方块状态的自定义方块的步骤。本文难度较小,篇幅较短,所有内容均基于创建方块的基本步骤,因此阅读本章需要有创建方块的相关知识基础。感谢各位的阅读,有兴趣可以订阅此专栏!

相关文章:

  • VRRP(虚拟路由冗余协议)深度解析
  • API网关Envoy的鉴权与限流:构建安全可靠的微服务网关
  • 算法思想之广度优先搜索(BFS)及示例(亲子游戏)
  • yolo模型精度提升策略
  • OpenHarmony标准系统-HDF框架之I2C驱动开发
  • Gemini 2.5 Pro (0605版本) 深度测评与体验指南
  • 如何将联系人从 iPhone 转移到 Android
  • 初探 OpenCV for Android:利用官方示例开启视觉之旅
  • 计算机技术、互联网与 IT 前沿:量子计算、Web3.0 等趋势洞察及行业应用
  • 生成对抗网络(GAN)损失函数解读
  • 【C++】红黑树的实现详解
  • 《机器学习》(周志华)第二章 模型评估与选择
  • Sklearn 机器学习 缺失值处理 获取填充失值的统计值
  • Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
  • 用docker来安装部署freeswitch记录
  • 「Java基本语法」变量的使用
  • Hilt -> Android 专属依赖注入(DI)框架
  • VESA DSC 基于FPGA DSC_Encoder IP仿真
  • ABP vNext + HBase:打造超高吞吐分布式列式数据库
  • [C#]基于winform部署PP-OCRv5的推理模型paddleocrv5模型部署
  • 在线做春节网站/淘宝关键词优化推广排名
  • wordpress自动加内链/网站seo课设
  • 仪器仪表行业网站建设/冯耀宗seo课程
  • 新疆网站建设一条龙服务/免费发布信息的网站平台
  • 滤芯网站怎么做/做seo需要用到什么软件
  • 温岭做网站公司/济南市最新消息