将块添加到 Minecraft Mod (1.15.2) 的问题

Posted

技术标签:

【中文标题】将块添加到 Minecraft Mod (1.15.2) 的问题【英文标题】:Problem with adding Blocks to Minecraft Mod (1.15.2) 【发布时间】:2020-02-08 19:11:23 【问题描述】:

在过去的几个小时里,我一直在为我的 Minecraft Mod 添加一个方块。我看过几个教程,但没有一个有效。这些块没有添加到创意库存中,我也无法通过命令设置它们。不幸的是,我在控制台中没有可以在这里显示的任何错误。在某些时候我放弃并尝试做盔甲,这里同样的问题。另一方面:正常项目工作(你可以看到唤醒 finde 的项目“ruby”)。

这里是我的主类的代码:

package de.thom.***OfClasses;

import de.thom.***OfClasses.init.ArmorMaterialList;
import de.thom.***OfClasses.init.BlockList;
import de.thom.***OfClasses.init.ItemList;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Mod("***ofclasses")
public class ***OfClasses 

    public static ***OfClasses instance;
    public static final String modid = "***ofclasses";
    public static final Logger logger = LogManager.getLogger(modid);

    public ***OfClasses() 
        instance = this;

        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientRegistries);
        MinecraftForge.EVENT_BUS.register(this);
    

    public void setup(final FMLCommonSetupEvent event) 
        logger.info("Setup method complete");
    

    public void clientRegistries(final FMLClientSetupEvent event) 
        logger.info("ClientRegistries method complete");
    

    @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents 

        @SubscribeEvent
        public static void registerItems(final RegistryEvent.Register<Item> event) 
            logger.info("Item Registry started");
            event.getRegistry().registerAll(
                    ItemList.RUBY,

                    ItemList.ruby_block = new BlockItem(BlockList.ruby_block,new Item.Properties().group(ItemGroup.MISC)).setRegistryName(BlockList.ruby_block.getRegistryName())
            );

            logger.info("Items registerd");
        

        @SubscribeEvent
        public static void registerBlocks(final RegistryEvent.Register<Block> event) 
            logger.info("Block Registry started");
            event.getRegistry().registerAll
            (
                    BlockList.ruby_block = new Block(Block.Properties.create(Material.IRON).hardnessAndResistance(2.0f,3.0f).lightValue(5).sound(SoundType.METAL)).setRegistryName(location("ruby_block"))
            );

            logger.info("Blocks registerd");
        

        private static ResourceLocation location(String name)
            return new ResourceLocation(***OfClasses.modid, name);
        

    

这是BlockList的代码

package de.thom.***OfClasses.init;

import net.minecraft.block.Block;

public class BlockList 
    public static Block ruby_block;

ItemList的代码如下:

package de.thom.***OfClasses.init;

import de.thom.***OfClasses.***OfClasses;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.ResourceLocation;

public class ItemList

    //Test Items
    public static Item RUBY = new Item(new Item.Properties().group(ItemGroup.MATERIALS)).setRegistryName(location("ruby"));

    public static Item ruby_block;

    private static ResourceLocation location(String name)
        return new ResourceLocation(***OfClasses.modid, name);
    

【问题讨论】:

【参考方案1】:

世界上的一个方块和物品栏中的一个“方块”是完全不同的东西。世界中的方块由 IBlockState 表示,其行为由 Block 的实例定义。同时,库存中的一个项目是一个 ItemStack,由一个 Item 控制。作为 Block 和 Item 不同世界之间的桥梁,存在 ItemBlock 类。 ItemBlock 是 Item 的一个子类,它具有一个字段 block,该字段包含对它所代表的 Block 的引用。 ItemBlock 将“块”的一些行为定义为一个项目,例如右键单击如何放置块。没有 ItemBlock 的 Block 是可能的。 (例如 minecraft:water 存在一个方块,但不是一个物品。因此不可能将它作为一个物品保存在物品栏中。)

当一个块被注册时,只有一个块被注册。该块不会自动具有 ItemBlock。要为一个块创建一个基本的 ItemBlock,应该使用 new ItemBlock(block).setRegistryName(block.getRegistryName())。未本地化的名称与块的名称相同。也可以使用 ItemBlock 的自定义子类。一旦为块注册了 ItemBlock,就可以使用 Item.getItemFromBlock 来检索它。如果 Block 没有 ItemBlock,Item.getItemFromBlock 将返回 null,因此如果您不确定正在使用的 Block 是否有 ItemBlock,请检查 null。

来自https://mcforge.readthedocs.io/en/latest/blocks/blocks/。

我简短地说,如果一切正常,你的块不应该出现在你的

【讨论】:

【参考方案2】:
@ObjectHolder(modid)
@Mod.EventBusSunscriber(modid = modid, bus = Bus.Mod)
public class BlockInit 
  public static final Block example_block = null;

  @SubscribeEvent
  public static void registerBlocks(final RegistryEvent.Register<Block> event) 
    event.getRegistry().register(new Block(Block.Properties.create(Material)).setRegistry("example_block"));
  

  @SubscribeEvent
  public static void registerBlockItems(final RegistryEvent.Register<Item> event) 
  event.getRegistry().register(new BlockItem(example_item, new Item.Properties().group(ItemGroup)).setRegistry("example_block"));
  

这对我有用,只需将 example_block 替换为您的块的名称,如果您愿意,可以添加更多属性 对于另一个块,只需重复 event.getRegistry 内容并使用新块的名称而不是 example_block。 并且不要忘记做 json 文件

【讨论】:

以上是关于将块添加到 Minecraft Mod (1.15.2) 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Minecraft 1.64 的 Bukkit 服务器 怎么安装Mod ? 我在客户端里安装了,

minecraft bukkit Essentials权限和op怎么设置

[minecraft]mcCoder制作有感

Minecraft Mod 开发实用工具

我的世界Minecraft Mod开发学习笔记 - Mod开发环境设置和Hello World示例

[导入类Java问题Minecraft插件