【Minecraft】Fabric Mod开发完整流程4 - 自定义物品方块以及食物、燃料

Minecraft Fabric模组开发教程#2 了解模组和项目 在上篇文章中我们已经完成了开发环境的配置,这篇文章我们将会介绍一下模组和项目的基本信息。 阅读详情

自定义物品与方块


自动侦测矿藏工具

探测器纹理下载地址: https://url.kaupenjoe.net/mbkj57/assets

众所周知,正经人永远不喜欢常规套路挖矿,如果能有一个自定探测脚下矿藏的工具就好了~
接下来我们将会一步步实现该工具


工具功能

耐久 64,右击方块使用,每次使用无论找到矿藏与否均销毁一点耐久

被右击的方块向下勘察 128 个方块,如果存在铁或者钻石矿石,就会在聊天框反馈给玩家
反之,如果找不到,就输出失败信息


实现

首先创建一个单独的 custom 文件夹,存储我们自定义的物品

新建类 MetalDetectorItem.java 具体位置可以查看下图

在这里插入图片描述


主要代码如下,相信你一定可以看得懂的!

tips:使用 alt+insert 快捷键可以快速添加构造函数哦

package com.example.item.custom;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.math.BlockPos;

import java.util.Objects;

// extends继承父类Item
public class MetalDetectorItem extends Item {

    // 别忘了构造函数
    public MetalDetectorItem(Settings settings){
        super(settings);
    }

    // 当物品对方块使用的时候(即右键点击方块)
    @Override
    public ActionResult useOnBlock(ItemUsageContext context) {
        // 如果是客户端
        if(!context.getWorld().isClient()){
            // 获取方块位置以及玩家位置,并初始化foundBlock变量以确定是否找到方块
            BlockPos posClicked = context.getBlockPos();
            PlayerEntity player = context.getPlayer();
            boolean foundBlock = false;

            // 据方块坐标,以Y轴为基准向下勘察128格
            // posClicked.down(i)表示当前坐标向下i格
            for(int i=0;i<=posClicked.getY()+128;i++){
                // 逐个获取对应方块状态
                BlockState state = context.getWorld().getBlockState(posClicked.down(i));
                // 判断方块状态如果符合条件,输出成功信息
                if(isTargetBlock(state)){
                    assert player != null;
                    outputTargetBlockCoordinates(
                            posClicked.down(i),
                            player,
                            state.getBlock()
                    );
                    foundBlock=true;
                    break;
                }
            }

            // 如果啥都找不到,输出失败信息
            if(!foundBlock){
                assert player != null;
                player.sendMessage(
                        Text.literal("No Target Ore Found!!!")
                );
            }

            // 最后别忘了给玩家手上拿着的物品(也就是我探测器)加上1损耗
            context.getStack().damage(1, Objects.requireNonNull(context.getPlayer()), player1 -> {
                player1.sendToolBreakStatus(player1.getActiveHand());
            });
        }
        return ActionResult.SUCCESS;
    }

    // 探测指定方块是不是铁矿石或者钻石矿石的函数
    private boolean isTargetBlock(BlockState state){
        return state.isOf(Blocks.IRON_ORE) || state.isOf(Blocks.DIAMOND_ORE);
    }

    // 输出矿藏坐标的函数
    private void outputTargetBlockCoordinates(BlockPos blockPos, PlayerEntity player, Block block){
        player.sendMessage(
                Text.literal("Target Ore:"+block.asItem().getName().getString()+" at ("+blockPos.getX()+","+blockPos.getY()+","+blockPos.getZ()+")"),
                false
        );
    }
}


执行结果

在这里插入图片描述


自定义音乐方块

和自定义物品一样,我们新建一个 custom 文件夹存储自定义的方块

按照下图所示位置创建自定义音乐盒方块 SoundBlock.java
在这里插入图片描述


音乐盒的代码很简单,就是右键点击一次就发出一个声音

代码清单 SoundBlock.java

package com.example.block.custom;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class SoundBlock extends Block {
    public SoundBlock(Settings settings) {
        super(settings);
    }

    // onUse即为右键点击
    @Override
    public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
        // 在玩家所在位置播放一个声音
        world.playSound(player,pos, SoundEvents.BLOCK_NOTE_BLOCK_BASS.value(), SoundCategory.BLOCKS,1f,1f);
        return ActionResult.SUCCESS;
    }
}

注意,我们在 ModBlocks 里面注册这个方块的时候,不要人为指定 sounds,否则会导致声音播放失败!

这是注册方块的写法

public static final Block SOUND_BLOCK = regBlock("sound_block",
            new SoundBlock(FabricBlockSettings.copyOf(Blocks.WHITE_WOOL)));

自定义食物

番茄纹理下载:https://url.kaupenjoe.net/mbkj61/assets

我们将制作一个番茄,它吃下去会有一定效果


新建类 AwfulTomatoFood.java 用于表示我们的食物

代码清单

package com.example.item.food;

import net.minecraft.command.argument.NbtCompoundArgumentType;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.FoodComponent;
import net.minecraft.item.FoodComponents;
import net.minecraft.nbt.NbtCompound;

public class AwfulTomatoFood {
    // 定义一个食物,使用FoodComponent.Builder
    public static final FoodComponent AWFUL_TOMATO = new FoodComponent.Builder()
            // 补充的饥饿值
            .hunger(2)
            // 设置饱和度(即饥饿值开始掉之前先消耗饱和度)
            .saturationModifier(0.25f)

            // 添加吃后的药水效果
            // 参数一:药水效果,参数二:获得效果的几率
            .statusEffect(new StatusEffectInstance(StatusEffects.POISON,200),0.5f)
            .statusEffect(new StatusEffectInstance(StatusEffects.INSTANT_DAMAGE,1),0.25f)

            // 饥饿值满的时候也可以吃
            .alwaysEdible()
            // 可以喂狗吃
            .meat()
            // 指定该食物是一个零食,此时你吃起来就会非常快(大概是吃普通食物耗费时间的一半)
            .snack()
            .build();
}

注册时不要再像之前注册自定义物品一样直接用这个类!请按照如下代码进行注册

代码清单 ModItems.java

// 要明确告诉编译器你需要注册一个食物,用到FabricItemSettings().food()
public static final Item AWFUL_TOMATO_FOOD = regItem("awful_tomato",
        new Item(new FabricItemSettings().food(AwfulTomatoFood.AWFUL_TOMATO)));

自定义燃料

定义燃料很简单,直接像根据定义普通物品一样定义即可

代码清单 ModItems.java

package com.example.item;

import com.example.TutorialMod;
import com.example.item.custom.MetalDetectorItem;
import com.example.item.food.AwfulTomatoFood;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupEntries;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.fabricmc.fabric.api.registry.FuelRegistry;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;


public class ModItems {

    ...

    // 定义燃料物品
    public static final Item COAL_BRIQUETTE = regItem("coal_briquette",
            new Item(new FabricItemSettings()));

    private static Item regItem(String name,Item item){
        return Registry.register(Registries.ITEM,new Identifier(TutorialMod.MOD_ID,name),item);
    }

    public static void registerModItems(){
        TutorialMod.LOGGER.debug("TutorialMod正在注册Items,MOD_ID:"+TutorialMod.MOD_ID);

        // 在这里使用FuelRegistry注册燃料
        // 参数一:欲注册的燃料名称
        // 参数二:燃料热值(200即为在普通熔炉下熔炼一个物品的时长,这个时间在应用到高炉内是按比例的)
        FuelRegistry.INSTANCE.add(ModItems.COAL_BRIQUETTE,200);
    }
}

这里有一个关键概念要搞清楚

FuelRegistry.INSTANCE.add 接收的第二个参数应该理解为燃料热值,即 200 为一个标准值,能熔炼一个物品;
同理,在高炉中,由于热值固定,所以依然只够熔炼一个物品;
不应该将其理解为燃烧时长,否则移动到高炉里面就是两倍的熔炼时长了,这显然不对!!!


Minecraft Fabric模组开发 (一) 开发环境 第一章 开发环境 安装 jdk(8或以上版本) 安装 IntelliJ IDEA (Community版本可以免费使用) 下载 fabric-mod-example 到本地 修改 gradle.properties 文件 mod_version = 1.0.0(版本号) maven_group = com.github.haodong1101 (包名) archives... 阅读详情

相关推荐

【鸿蒙实战开发】Fabric 自定义组件开发

创建一个 Fabric 组件需要实现以下的代码:ComponentInstance:ComponentInstance文件是该自定义组件所有的逻辑集合,也是自定义组件主要需要实现的部分,简单理解就是,一个自定义组件文件对应一个ComponentInstance。Package文件:作用是声明创建该自定义组件的声明,指定创建Instance时会根据Packeage文件内的名称对应,从而生成对应的Instance对象。

CTrup的博客 1163

最全面最细致我的世界Fabric模组开发01 - 模组开端

为什么要写这篇教程,而网上教程千万个相同教程,但是通过学习、模仿过程,仍有许多初学者只会创建简单方块和物品,如果遇到奇特的想法,或者学点高难度的物品和方块,却发现根本不会编写出来。这是因为没有完整系统体系和思维导图,不知道下一步些什么,写完之后各种错误,崩溃报告等。因此,根据学到经验,整理学习资料,发表这篇文章。请各位游客帮忙转发本次教程分为三大板块:基础板块、扩展板块、高级板块1.基础板块。

weixin_66448747的博客 5565

Minecraft Fabric模组开发教程#8 添加武器

首发于。

Enaium的博客 1593

【Minecraft】Fabric Mod开发完整流程1 - 环境配置与第一个物品

fabric mod开发 环境配置与第一个物品

delete_you的博客 1万+

保姆级教程:用SNAP处理哨兵一号数据,5步搞定城区范围提取(附江西晋城案例)

本文提供了一份详细的保姆级教程,介绍如何使用SNAP软件处理哨兵一号数据,通过5个关键步骤快速提取城区范围。以江西晋城为例,教程涵盖数据准备、预处理、核心处理流程、自动化搭建及成果分析,帮助用户轻松掌握SNAP操作技巧,适用于城市规划、环境监测等领域。

weixin_32535389的博客 444

Full Range && Limit Range

Full Range && Limit Range1 Full range和Limit Range定义2 为什么会需要Limit Range3 用Full range去显示limit Range图片4 YUV转RGB5 额外 1 Full range和Limit Range定义 我们知道,对于RGB和YUV的色彩空间来说,有个位深(bit-depth)的概念;位深是指记录图像每个像素的色彩通道时所使用的bit数,常见的RGB888,YUV420-8bit。以RGB888为例,其代表R G B

zjhcj1的博客 1万+

Minecraft 模组推荐

本文为《我的世界》新手玩家提供了一份全面的模组入门指南。文章系统性地介绍了六大类模组:优化模组(Fabric/Forge)、便利生存工具、休闲生活与美食装饰、大型玩法拓展(机械科技、魔法、冒险维度)、建造创意模组,并针对不同需求的新手提供了两套具体的搭配方案。最后强调了模组安装的兼容性、版本匹配和冲突排查等重要注意事项,帮助玩家安全、高效地开启模组体验。

bat_and_vbs的博客 241

CTF---Web---文件包含---01

文章目录前言一、题目描述二、解题步骤1.查看源代码2.文件包含(/etc/passwd)3.解码总结 前言 题目分类: CTF—Web—文件包含 一、题目描述 题目:提示寻找passwd文件 二、解题步骤 1.查看源代码 提示所有图片存储路径是download.php?name=img, 此时name参数的存在就提示此题可能为“文件包含”。 2.文件包含(/etc/passwd) 两种查看方式: 2.1、访问view-source:http://192.168.87.180/download.php

qq_22160557的博客 1387

Minecraft 1.19.2 Fabric模组开发 10.建筑生成

我们本次尝试在Fabric 1.19.2中生成一个自定义的建筑。

Jay_fearless的博客 2661

蓝桥杯STM32G431RBT6学习——GPIO

蓝桥杯STM32G431RBT6学习——GPIO

weixin_44098974的博客 2221

别再死记硬背了!用LTspice和Simulink仿真,5分钟搞懂巴特沃斯、切比雪夫、贝塞尔滤波器的区别

本文通过LTspice和Simulink仿真工具,直观对比了巴特沃斯、切比雪夫和贝塞尔滤波器的特性差异。从通带波纹、过渡带陡峭度到相位线性度,详细解析了三种经典滤波器的设计哲学与应用场景,帮助工程师和学生快速掌握滤波器选型技巧,提升电路设计效率。

weixin_33910191的博客 517

Minecraft 1.19.2 Fabric模组开发 01.eclipse 开发包构建教程

我们本次来进行Minecraft 1.19.2 Fabric模组开发教程的介绍。

Jay_fearless的博客 3600

52、Power BI Desktop 数据筛选全攻略

本文全面介绍了Power BI Desktop中各类数据筛选功能的使用方法,涵盖布尔型数据筛选、高级文本筛选、Top N筛选、可视化级别、页面级别和报告级别筛选等核心操作。通过详细步骤、流程图和实际案例,帮助用户深入理解筛选器的层级关系与综合应用技巧,并提供常见问题解决方案,助力高效精准的数据分析与可视化展示。

linux6sysadmin的博客 105

Minecraft 1.19.2 Fabric模组开发 13.自定义村民

我们本次在1.19.2fabric模组中实现一个自定义村民并与其进行交易

Jay_fearless的博客 2512

Open3D 模拟退火算法优化的ICP点云配准

传统ICP算法易陷入局部最优且对初始位姿敏感,而SA算法通过概率性接受劣解,能够在高温阶段广泛探索解空间,低温阶段精细收敛。

点云侠的博客 241

大聪明教你学Java | Seata 2.5 从下载到运行:全流程编译部署教程

Seata 2.5 版本带来了不少特性优化,但实际部署时却发现一个尴尬问题:全网找不到一篇完整覆盖「Git 源码下载→本地编译→环境配置→启动验证」的实操教程。作为一名踩遍无数坑才成功跑通的开发者,我深知这个过程的煎熬:Git 拉取源码后编译失败、依赖版本冲突、配置文件参数混乱、启动时端口占用或连接报错… 每一个坑都能耗费数小时排查。为了让后续开发者少走弯路,我将自己从0到1的完整实操经验整理成文,跟着步骤走即可成功运行 Seata 2.5.

不肯过江东丶 2066

Minecraft Fabric模组开发教程#10 添加矿物

首发于。

Enaium的博客 1181

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Minecraft Fabric模组开发教程#1 配置开发环境

在几年前我已经写过很多关于Mincraft开发相关的文章,今年已经是2024年了所以我决定重新写一遍,这次我会更加详细的介绍一些内容。

Enaium的博客 1804

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Minecraft 1.18.1、1.18.2模组开发 07.食物制作

我们本次在模组中制作一款食物 在1.18中,食物作为一种物品,可以直接调用Item类中的构造方法 1.在ItemInit类中添加我们的食物信息 //tab(放到哪个物品栏中),nutrition(i) 回复i点饥饿度,saturationMod(j)饱腹度为j点, public static final RegistryObject<Item> MCHEESE = ITEMS.register("mcheese", () -> new Item(new Item.

Jay_fearless的博客 1079

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Fabric模组开发终极指南:从零创建自定义Minecraft模组

🚀 想要为Minecraft添加独特功能?Fabric模组开发让你轻松实现创意!本指南将带你从零开始,掌握Fabric模组开发的核心技巧,创建属于你自己的Minecraft自定义模组。 ## 什么是Fabric模组?🤔 Fabric是一个轻量级的Minecraft模组加载器,相比其他方案具有更快的加载速度和更好的兼容性。它使用Mixin技术来修改Minecraft的代码,让你的模组能够无缝

gitblog_00502的博客 554

Minecraft 1.19.2 Fabric模组开发 09.Mixin

我们今天用mixin在1.19.2 fabric中实现一个望远镜

Jay_fearless的博客 2998

Minecraft 1.19.2 Fabric模组开发 03.动画生物实体

我们本次尝试在1.19.2 Fabric中添加一个能够具有各种动画效果动作的生物实体。

Jay_fearless的博客 2863

【Minecraft】Fabric Mod开发完整流程3 - 配方与挖掘等级

fabric mod开发第三期 分析普通合成配方以及熔炼配方的设置 包括战利品掉落物以及挖掘等级的配置文件设置

delete_you的博客 1729

Fabric Mod Development Toolkit 教程

Fabric Mod Development Toolkit 教程 1. 项目目录结构及介绍 该项目基于GitHub上的thi-ng/fabric(请注意,实际链接指向的项目可能与描述不匹配,因为提供的链接对应于一个假设的或错误的仓库路径,实际应指向Fabric的正确仓库,例如Minecraft Fabric)。然而,基于一般开源mod开发工具包的常见结构,我们可以构想一个典型的目录布局: fab...

gitblog_00169的博客 800

我的世界Java版1.21.4的Fabric模组开发教程(一)环境配置与前言

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第一章——环境配置与前言。

Kim的博客 5206

Fabric 自定义组件开发指导

hongxiaomeng的博客 811
上一篇: 【Minecraft】Fabric Mod开发完整流程3 - 配方与挖掘等级
下一篇: 【Gazebo安装教程】2023年最新安装全流程详解!
ZhillerDev
博客等级 码龄11年 4998粉丝 283原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhillerDev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值