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

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

这里是我的主类的代码:

package de.thom.clashOfClasses;

import de.thom.clashOfClasses.init.ArmorMaterialList;
import de.thom.clashOfClasses.init.BlockList;
import de.thom.clashOfClasses.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("clashofclasses")
public class ClashOfClasses {

    public static ClashOfClasses instance;
    public static final String modid = "clashofclasses";
    public static final Logger logger = LogManager.getLogger(modid);

    public ClashOfClasses() {
        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(ClashOfClasses.modid, name);
        }

    }
}

这是BlockList的代码

package de.thom.clashOfClasses.init;

import net.minecraft.block.Block;

public class BlockList {
    public static Block ruby_block;
}

ItemList的代码如下:

package de.thom.clashOfClasses.init;

import de.thom.clashOfClasses.ClashOfClasses;
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(ClashOfClasses.modid, name);
    }
}

【问题讨论】:

    标签: minecraft-forge


    【解决方案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 文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多