将块添加到 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怎么设置