Проблема с добавлением блоков в Minecraft Mod (1.15.2) - PullRequest
0 голосов
/ 08 февраля 2020

Последние несколько часов я потратил на добавление блока в мой Minecraft Mod. Я посмотрел несколько уроков, и ни один из них не работает. Блоки не добавляются в Инвентарь творчества, и я не могу установить их по команде. К сожалению, у меня не было ошибок в консоли, которые я мог бы показать здесь. В какой-то момент я сдался и попытался сделать броню, здесь та же проблема. С другой стороны: нормальные предметы работают (Вы можете видеть пункт "ruby", который проснулся finde).

Вот код моего основного класса:

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);
    }
}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020
@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 файлы

0 голосов
/ 26 марта 2020

Блок в мире и «блок» в инвентаре - это очень разные вещи. Блок в мире представлен IBlockState, а его поведение определяется экземпляром Block. Между тем, предмет в инвентаре - это ItemStack, контролируемый Предметом. В качестве моста между различными мирами Блоков и Предметов существует класс ItemBlock. ItemBlock является подклассом Item, который имеет блок поля, который содержит ссылку на Блок, который он представляет. ItemBlock определяет часть поведения «блока» как элемента, например, как блок правой кнопкой мыши размещает блок. Возможно иметь блок без ItemBlock. (Например, Minecraft: вода существует блок, но не предмет. Поэтому невозможно держать его в инвентаре как один.)

Когда блок зарегистрирован, только блок зарегистрирован. Блок не имеет автоматически ItemBlock. Для создания базового c ItemBlock для блока следует использовать новый ItemBlock (block) .setRegistryName (block.getRegistryName ()). Нелокальное имя совпадает с именем блока. Также можно использовать пользовательские подклассы ItemBlock. Как только ItemBlock зарегистрирован для блока, Item.getItemFromBlock может быть использован для его извлечения. Item.getItemFromBlock вернет значение null, если для блока нет ItemBlock, поэтому, если вы не уверены, что для используемого вами блока есть ItemBlock, проверьте значение null.

из https://mcforge.readthedocs.io/en/latest/blocks/blocks/ .

Я коротко, если все работает, ваши блоки должны появиться в вашем

...