Posted January 27, 20187 yr I want to preface this with I am a complete amatuer in JAVA coding, and everything I know is from YouTube tutorials, so examples of code would be greatly appreciated. I am creating a custom slab for my mod, but when doing so I am having an issue where the double slab will not display correctly, the top slab will be invisible when placed after the bottom slab, and when trying to place a top slab first then bottom, the game will not let me place the bottom slab at all. BLOCKSLABBASE.java package guardia.coremod.objects.blocks.slab; import java.util.Random; import guardia.coremod.Main; import guardia.coremod.init.BlockInit; import guardia.coremod.init.ItemInit; import guardia.coremod.utils.interfaces.IHasModel; import net.minecraft.block.BlockSlab; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemSlab; import net.minecraft.item.ItemStack; public abstract class BlockSlabBase extends BlockSlab implements IHasModel { public BlockSlabBase(String name) { super(Material.WOOD); setUnlocalizedName(name); setRegistryName(name); setHardness(3F); setResistance(15F); setCreativeTab(Main.coretab); IBlockState state = this.blockState.getBaseState(); if (!this.isDouble()) { state = state.withProperty(HALF, EnumBlockHalf.BOTTOM); } setDefaultState(state); this.useNeighborBrightness = true; this.fullBlock = !this.isDouble(); BlockInit.BLOCKS.add(this); } @Override public String getUnlocalizedName(int meta) { return this.getUnlocalizedName(); } @Override public IProperty<?> getVariantProperty() { return HALF; } @Override public Comparable<?> getTypeForItem(ItemStack stack) { return EnumBlockHalf.BOTTOM; } @Override public int damageDropped(IBlockState state) { return 0; } @Override public IBlockState getStateFromMeta(int meta) { if (!this.isDouble()) return this.getDefaultState().withProperty(HALF, EnumBlockHalf.values()[meta % EnumBlockHalf.values().length]); return this.getDefaultState(); } @Override public int getMetaFromState(IBlockState state) { if (this.isDouble()) return 0; return((EnumBlockHalf) state.getValue(HALF)).ordinal() + 1; } @Override public Item getItemDropped(IBlockState state, Random rand, int fortune) { return Item.getItemFromBlock(BlockInit.HALF_SLAB); } @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {HALF}); } @Override public void registerModels() { Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory"); } } REGISTRYHANDLER.java package guardia.coremod.utils.handlers; import guardia.coremod.init.BiomeInit; import guardia.coremod.init.BlockInit; import guardia.coremod.init.EntityInit; import guardia.coremod.init.ItemInit; import guardia.coremod.utils.interfaces.IHasModel; import guardia.coremod.world.gen.WorldGenCustomOres; import guardia.coremod.world.gen.WorldGenCustomStructures; import guardia.coremod.world.gen.WorldGenCustomTrees; import guardia.coremod.world.types.WorldTypeCustom; import guardia.coremod.world.types.WorldTypeElderOak; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemSlab; import net.minecraft.world.WorldType; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.GameRegistry; @EventBusSubscriber public class RegistryHandler { @SubscribeEvent public static void onItemRegister(RegistryEvent.Register<Item> event) { event.getRegistry().registerAll(ItemInit.ITEMS.toArray(new Item[0])); ItemBlock item = new ItemSlab(BlockInit.HALF_SLAB, BlockInit.HALF_SLAB, BlockInit.DOUBLE_SLAB); item.setRegistryName(BlockInit.HALF_SLAB.getRegistryName()); ForgeRegistries.ITEMS.register(item); } @SubscribeEvent public static void onBlockRegister(RegistryEvent.Register<Block> event) { event.getRegistry().registerAll(BlockInit.BLOCKS.toArray(new Block[0])); } @SubscribeEvent public static void onModelRegister(ModelRegistryEvent event) { for(Item item : ItemInit.ITEMS) { if(item instanceof IHasModel) { ((IHasModel)item).registerModels(); } } for(Block block : BlockInit.BLOCKS) { if(block instanceof IHasModel) { ((IHasModel)block).registerModels(); } } } public static void preInitRegistries() { GameRegistry.registerWorldGenerator(new WorldGenCustomOres(), 0); GameRegistry.registerWorldGenerator(new WorldGenCustomTrees(), 0); GameRegistry.registerWorldGenerator(new WorldGenCustomStructures(), 0); BiomeInit.registerBiomes(); EntityInit.registerEntities(); RenderHandler.registerEntityRenders(); } public static void Client() { RecipeHandler.registerSmelting(); } public static void initRegistries() { SoundsHandler.registerSounds(); } public static void postInitRegistries() { WorldType ELDER_OAK = new WorldTypeElderOak(); WorldType CUSTOM = new WorldTypeCustom(); } }
January 27, 20187 yr It looks close, but you should probably look at the implementation of the vanilla block slab wood blocks and try making your code even closer. For example, in your constructor you set the block state based without any variant. Now that could make sense in your case, if you only have one type of slab you're making. However, it could also screw up your blockstates and model files unless you know what you're doing. So you're close, but I would personally work back and copy more of the vanilla stuff until you get it working, and only then change things if you think you need to. Check out my tutorials here: http://jabelarminecraft.blogspot.com/
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.