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

自定义物品与方块


自动侦测矿藏工具

探测器纹理下载地址: 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 为一个标准值,能熔炼一个物品;
同理,在高炉中,由于热值固定,所以依然只够熔炼一个物品;
不应该将其理解为燃烧时长,否则移动到高炉里面就是两倍的熔炼时长了,这显然不对!!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Minecraft Fabric模组开发是指使用Fabric API和Minecraft游戏的Java版本开发自定义模组的过程。Fabric是一种轻量级的模组API,它提供了一种简单的方式来创建和管理Minecraft模组开发者可以使用Java语言编写自己的模组,并通过Fabric API与Minecraft游戏进行交互。Fabric模组开发可以为玩家提供更多的游戏内容和功能,使游戏更加有趣和多样化。 ### 回答2: Minecraft Fabric是一个轻量级的模组平台,它与Minecraft的Java版兼容。与其他模组平台相比,它具有更高的灵活性和自由度。因此,Fabric模组开发对于有一定编程知识的人来说是一个不错的选择。 首先,要开始Fabric模组开发,需要下载和安装Minecraft Fabric和Java开发工具包。然后,需要学习Java编程语言。如果你已经有了Java编程经验,那么你可以开始学习Fabric API,其提供的开发框架和API使你的开发更加容易上手。在这个过程中,你也可以参考Fabric官方文档和其他开发者的经验分享,尤其是那些已经开发出成功模组开发者学习他们的思路和技巧是非常重要的。 在进行开发的过程中,需要有一些基本的开发工具,比如开发IDE、代码管理工具和构建工具等,这些工具能够提高开发效率,让你更好地掌控开发进程。在具有一定的基础后,可以开发各种各样的模组,比如新方块,新物品,新生物和新机制等。其中,当你开发出一个好的模组后可以将其分享给其他玩家,在资源网站发布自己开发模组,也可以帮助广大玩家增加游戏的趣味性。 最后,Fabric模组开发需要耐心和热情,在掌握基础知识后,勇于尝试和不断的思考能够使你的模组更加优秀,同时也需要和其他开发者积极交流和分享,在大家的共同努力下,可以让我们的Minecraft更加完美。 ### 回答3: Minecraft Fabric模组开发是介于游戏基础和高级开发之间的活动,它结合了游戏玩法和软件编程技术。FabricMinecraft的一个轻量级模组库,通过将模组代码嵌入游戏的核心运行环境中,实现了游戏机制的修改和扩展。 在Fabric模组开发中,需要掌握Java编程语言以及各种API和工具。首先要学会使用Gradle进行项目管理以及构建模组,其次要熟悉Fabric API的各种类和方法,以及在游戏中使用的相关命令和配置文件的编写。此外,还需要了解模组的相关概念,包括模组结构和生命周期等。 在开发具体的模组时,需要有一定的创意和设计能力。例如,可以通过添加新的生物、方块物品等来扩展游戏内容,或者修改游戏机制,实现新的游戏玩法。不过,在进行模组开发时,需要注意游戏的性能和稳定性,避免过多的资源消耗和崩溃等问题。 总之,Minecraft Fabric模组开发是一项高度具有创造性和技术性的活动,它让玩家可以更加深入地了解游戏机制,并且可以通过自己的努力创造出属于自己的独特游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zhillery

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

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

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

打赏作者

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

抵扣说明:

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

余额充值