Minecraft Modding 模组制作-自定义方块

目录

  • 自定义方块
    • 一般方块
      • 定义物品所属类
      • 注册方块
      • 注册方块对应物品
      • 添加材质
      • 添加各面不同的材质
      • 本地化
    • 更多样的方块的实现方式会在之后陆续更新
    • 参考
    • 打赏

注意:本文代码只表现个人实现方式及习惯,本文解释只体现个人理解,不一定符合规范(除非声明了这是规范)

自定义方块

一般方块

定义物品所属类

类似物品的添加, M i n e c r a f t Minecraft Minecraft中所有方块都继承类 B l o c k Block Block,我们在<author>.<modid>.block包下新建一个ModBlock.java并输入以下代码

package author.modid.block;

import author.modid.Modid;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;     //调用材料类

public class ModBlock extends Block {
    public ModBlock() {
        super(Material.SAND);     //参数为该物品的材料种类,此处为沙子
        this.setUnlocalizedName(Modid.MODID + ".modBlock");
        this.setRegistryName("mod_block");
        this.setHarvestLevel("shovel", 0);     //设置挖掘工具和挖掘等级,此处分别为锹,0级
        this.setHardness(0.5F);     //设置硬度(可以决定挖掘速度)
        this.setResistance(0.5F / 3.0F);     //设置爆炸抗性(但是爆炸抗性会将这里的数值翻三倍)
    }
}

代码中的super用于调用父类的含参构造方法,必须位于子类构造方法的第一句,如果没有super,子类的构造方法会在开始时自动调用父类的默认构造方法,而默认构造方法是无参的,并且如果子类含有默认构造方法而父类没有默认构造方法则会报错

注册方块

类似物品的注册,我们在<author>.<modid>.block包下新建一个BlockRegistryHandler.java并输入以下代码

package author.modid.block;

import ...

@Mod.EventBusSubscriber
public class BlockRegistryHandler {
    public static final ModBlock MOD_BLOCK = new ModBlock();
    @SubscribeEvent
    public static void onRegistry(Register<Block> event) {
        event.getRegistry().registerAll(
                MOD_BLOCK
        );
    }
}

这简直和物品一模一样啊,但是不一样的马上就来了

注册方块对应物品

现在需要注册刚才那个方块对应的物品,这也有现成的类可用—— I t e m B l o c k ItemBlock ItemBlock,它的构造函数的参数就是一个注册了的方块,接下来要在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加语句定义一个 I t e m B l o c k ItemBlock ItemBlock来对应刚才那个方块

    public static final ItemBlock MOD_ITEM_BLOCK = new
            ItemBlock(BlockRegistryHandler.MOD_BLOCK);

但是forge的 I t e m B l o c k ItemBlock ItemBlock的构造方法唯一没有完成的初始化是设置registry name,为避免对于每个方块都要在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加语句来设置registry name而导致冗长,可以给 I t e m B l o c k ItemBlock ItemBlock写一个子类并在其构造方法中加入初始化registry name的语句,具体操作为在<author>.<modid>.item包下新建一个MyItemBlock.java并输入以下代码

package author.modid.item;

import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;

import java.util.Objects;

public class MyItemBlock extends ItemBlock {
    public MyItemBlock(Block block) {
        super(block);     //必须要加,因为ItemBlock没有默认的构造方法
        this.setRegistryName(Objects.requireNonNull(block.getRegistryName()));     //设置registry name
    }
}

当然,在此之后还要把 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler的那条定义语句中的ItemBlock改为MyItemBlock

添加材质

方块的材质需要用它对应的 I t e m B l o c k ItemBlock ItemBlock进行添加,方法和普通物品是一样的,为了以后都可以方便地添加普通物品的材质,可在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加一个方法如下

    @SideOnly(Side.CLIENT)
    private static void setResourceLocation(Item item) {
        ModelLoader.setCustomModelResourceLocation(item, 0,
                new ModelResourceLocation(Objects.requireNonNull(item.getRegistryName()), "inventory"));
    }

这个方法类似于含metadata的物品的setSubtypeResourceLocation,所以在指定资源位置时只需要在onModelRegistry中加入一行

        setResourceLocation(MOD_ITEM_BLOCK);

接下来在相应位置放入资源,先在main.resources.assets.modid.blockstates中新建一个mod_block.json文件,输入以下内容

{
  "forge_marker" : 1,
  "defaults" : {
    "model" : "minecraft:cube_all",     //说明该方块各面完全相同
    "textures" : { "all" : "modid:blocks/mod_block" }     //指定图片文件位置
  },
  "variants" : {
    "normal" : [{}],     //说明该方块的显示方式
    "inventory" : [{ "transform" : "forge:default-block" }]     //说明该方块对应的物品显示方式与原版方块对应的物品一样
  }
}

接下来新建文件夹及放入图片文件的操作和物品类似

添加各面不同的材质

陆续更新中…

本地化

方块的本地化与物品的唯一不同点在于它将item换为了tile,即

tile.modid.modBlock.name=模组方块

该本地化同时作用于方块及其对应物品

更多样的方块的实现方式会在之后陆续更新

参考

Harbinger
土球球的《我的世界Minecraft模组开发指南》
Forge文档
我的世界开发者中文指南


打赏

制作不易,若有帮助,欢迎打赏!
赞赏码

支付宝付款码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【并发编程】ConcurrentHashMap底层结构和原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

MySQL进阶知识:二

目录 视图 基本语法 视图的更新 视图的作用 存储过程 介绍 存储过程基本语法 存储过程的变量 系统变量 用户自定义变量 局部变量 存储过程的判断逻辑 存储过程的参数 存储过程中的流程控制 存储过程中的循环 while的基本语法 repeat的基本语法 loop的基本语法…

Flink-执行拓扑图与作业调度

算子与作业提交 一、Flink执行模式1.流执行模式2.批执行模式 二、Flink拓扑图1.基本概念2.拓扑图生成过程 三、拓扑生成和优化1.应用程序2.逻辑视图3.算子链4.Task Slots 四、作业调度1.调度2.拓扑图数据结构3.Job状态转化4.Task状态转化 总结参考链接 一、Flink执行模式 Flin…

Python语言学习笔记之四(Python文档化)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 Python文档化是指在Python代码中添加注释和文档字符串&#xff0c;以提供有关代码的详细信息和说明。 文档的…

这个变量要不要用volatile修饰呢?

正文 大家好&#xff0c;又见面了&#xff0c;我是bug菌~ 在嵌入式软件开发过程中&#xff0c;如果对volatile不熟&#xff0c;那可以你应该是个"假嵌入式程序员"&#xff0c;因为一个变量需不需要使用volatile考虑的场景挺多的&#xff0c;如果在某些场景下乱用&…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…

使用STM32微控制器实现光电传感器的接口和数据处理

光电传感器在许多领域中被广泛应用&#xff0c;例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案&#xff0c;包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤&#xff0c;并给出相应的代码示例。 一、引言 光…

深入浅出 Vue 中的插槽 slot

深入浅出 Vue 中的插槽 slot start 最近被问到好几次 Vue 中的插槽相关知识&#xff0c;掌握的还是有些不全面。抱着重新学习的心态&#xff0c;写这篇博客。首先对基础知识做一个回顾&#xff0c;然后再对源码实现做一个学习。作者&#xff1a;番茄编写时间&#xff1a;2023…

【藏经阁一起读】(78)__《Apache Tomcat 的云原生演进》

【藏经阁一起读】&#xff08;78&#xff09; __《Apache Tomcat 的云原生演进》 目录 __《Apache Tomcat 的云原生演进》 一、读后感 二、文章知识点摘要 2.1、Tomcat的技术内幕和在喜马拉雅的实践 2.2、GraalVM static compilation in web container application&…

企业级开发链表思路

项目结构 头文件代码 头文件代码LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #include <stdio.h> #include <stdlib.h> #include <iostream> // 链表小节点 typedef struct LINKBODE {struct LINKBODE* next;}LinkNode; // 遍历的函数指针 typedef …

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…

Python字典类型

目录 目标 版本 官方文档 简介 实战 创建 循环 常用方法 目标 掌握字典类型的使用方法&#xff0c;包括&#xff1a;创建、循环、常用方法等操作。 版本 Python 3.12.0 官方文档 Mapping Types — dicthttps://docs.python.org/3/library/stdtypes.html#mapping-type…

绝地求生:成长型皮肤异色定价是否有些夸张?

大家好&#xff0c;我闲游盒小盒子&#xff01; 自从26.2更新上架回归的黑市中四款成长型皮肤以后&#xff0c;能看到社区里很多玩家都分享抽中了自己心仪的成长型皮肤。 但是对于异色很少有人去实装&#xff0c;大多数玩家都是选择去分解异色换取五张图纸然后追求升级原皮等级…

【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。 用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击) 自定义阴影遮罩Mask&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

L型骨牌覆盖问题。

问题&#xff1a;解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。 思路&#xff1a; 棋盘覆盖实现的基本方法为分治法 当k0时(1ⅹ1棋盘)&#xff0c;及特殊方格&#xff0c;骨牌数为0 当k >0时&#xff0c;将2kⅹ2k棋盘分割为4个2k-1ⅹ2k-1子棋盘了 特殊方格位于4个较小…

【3D程序软件】SideFX与上海道宁一直为设计师提供程序化 3D动画和视觉效果工具,旨在创造高质量的电影效果

Houdini是一个 从头开始构建的程序系统 使艺术家能够自由工作 创建多次迭代 并与同事快速共享工作流程 Houdini FX为 视觉特效艺术家创作故事片 广告或视频游戏 凭借其基于程序节点的工作流程 Houdini FX可让 您更快地创建更多内容 从而缩短时间并 在所有创意任务中…

制作电脑微信双开快捷方式

一、介绍 电脑下载的微信正常只能打开一个&#xff0c;那有时候需要双开甚至多开微信我们需要怎么操作呢&#xff1f; 我这里就讲一个制作微信双开快捷键方式的办法&#xff0c;争对其他应用也是一样的原理。 二、制作过程 1、右击微信快捷方式 2、点击属性 3、复制目标 …

微服务实战系列之Cache

前言 欢迎来到Cache&#xff08;缓存&#xff09;的世界&#xff01; 自从世界第一台计算机诞生之日起&#xff0c;人们对效率的渴望逐步增强。从CPU到存储&#xff0c;从芯片到内存&#xff0c;一批又一批的先驱以一种孜孜不倦的“工匠”精神&#xff0c;为计算机运行效率的提…

MyBatis-Plus及多数据源入门教程

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34 框架介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源…

快速了解Spring AOP的概念及使用

文章目录 1. AOP概念1.1 什么是AOP&#xff1f;1.2 什么是Spring AOP&#xff1f; 2. Spring AOP的使用2.1 引入Spring AOP依赖2.2 编写AOP程序 3. Spring AOP详解3.1 Spring AOP核心概念1. 切点&#xff08;Pointcut&#xff09;2. 连接点&#xff08;Join Point&#xff09;3…