Posted December 10, 20168 yr Why is it that when I register the item for my block, I get three copies of it in the creative inventory? My block has three variants for different orientations (like a log). It seems like it's registering an item for each variant. Only one has the right texture in inventory. The other two are untextured cubes. public final class PrimalBlockRegistry { public static Block logStrippedOak = new PrimalBlockLog("log_stripped_oak"); public static void createBlocks() { register(logStrippedOak); } private static <T extends Block> T register(T block) { GameRegistry.register(block); ItemBlock itemBlock = new ItemBlock(block); itemBlock.setRegistryName(block.getRegistryName()); if (itemBlock != null) { GameRegistry.register(itemBlock); } return block; } My block class: public class PrimalBlockLog extends BlockRotatedPillar implements IItemModelProvider { public static final PropertyEnum<PrimalBlockLog.EnumAxis> LOG_AXIS = PropertyEnum.<PrimalBlockLog.EnumAxis> create("axis", PrimalBlockLog.EnumAxis.class); protected String blockName; public PrimalBlockLog(String blockName) { super(Material.WOOD); this.blockName = blockName; setBlockName(this, blockName); this.setCreativeTab(PrimalCreativeTabs.tabPrimalcraft); this.setHardness(2.0F); this.setSoundType(SoundType.WOOD); this.setDefaultState(this.blockState.getBaseState().withProperty(LOG_AXIS, PrimalBlockLog.EnumAxis.X)); } public static void setBlockName(Block block, String blockName) { block.setRegistryName(blockName); block.setUnlocalizedName(blockName); } @Override public void registerItemModel(Item item) { Primalcraft.proxy.registerItemRenderer(item, 0, blockName); } @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, LOG_AXIS); } @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(LOG_AXIS, EnumAxis.byMetadata(meta)); } @Override public int getMetaFromState(IBlockState state) { return state.getValue(LOG_AXIS).getMeta(); } @Override public int damageDropped(IBlockState state) { return getMetaFromState(state); } @Override public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { for (final EnumAxis axis : EnumAxis.values()) { list.add(new ItemStack(this, 1, axis.getMeta())); } } public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { int i = 4; int j = 5; if (worldIn.isAreaLoaded(pos.add(-5, -5, -5), pos.add(5, 5, 5))) { for (BlockPos blockpos : BlockPos.getAllInBox(pos.add(-4, -4, -4), pos.add(4, 4, 4))) { IBlockState iblockstate = worldIn.getBlockState(blockpos); if (iblockstate.getBlock().isLeaves(iblockstate, worldIn, blockpos)) { iblockstate.getBlock().beginLeavesDecay(iblockstate, worldIn, blockpos); } } } } /** * Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the * IBlockstate */ public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return this.getStateFromMeta(meta).withProperty(LOG_AXIS, PrimalBlockLog.EnumAxis.fromFacingAxis(facing.getAxis())); } /** * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withRotation(IBlockState state, Rotation rot) { switch (rot) { case COUNTERCLOCKWISE_90: case CLOCKWISE_90: switch ((PrimalBlockLog.EnumAxis)state.getValue(LOG_AXIS)) { case X: return state.withProperty(LOG_AXIS, PrimalBlockLog.EnumAxis.Z); case Z: return state.withProperty(LOG_AXIS, PrimalBlockLog.EnumAxis.X); default: return state; } default: return state; } } @Override public boolean canSustainLeaves(IBlockState state, net.minecraft.world.IBlockAccess world, BlockPos pos){ return true; } @Override public boolean isWood(net.minecraft.world.IBlockAccess world, BlockPos pos){ return true; } public static enum EnumAxis implements IStringSerializable { X(0, "x"), Y(1, "y"), Z(2, "z"); private final int meta; private final String name; private static final PrimalBlockLog.EnumAxis[] META_LOOKUP = new PrimalBlockLog.EnumAxis[values().length]; //private static final EnumAxis[] META_LOOKUP = Stream.of(values()).sorted(Comparator.comparing(EnumAxis::getMeta)).toArray(EnumAxis[]::new); private EnumAxis(int meta, String name) { this.meta = meta; this.name = name; } public int getMeta() { return meta; } public String getName() { return this.name; } public String toString() { return this.name; } public static PrimalBlockLog.EnumAxis byMetadata(int meta) { if (meta < 0 || meta >= META_LOOKUP.length) { meta = 0; } return META_LOOKUP[meta]; } public static PrimalBlockLog.EnumAxis fromFacingAxis(EnumFacing.Axis axis) { switch (axis) { case X: return X; case Y: return Y; case Z: return Z; default: return Y; } } static { for (PrimalBlockLog.EnumAxis axis : values()) { META_LOOKUP[axis.getMeta()] = axis; } } } }
December 10, 20168 yr All ItemStack s returned by Block#getSubBlocks are added to the creative tab(s) of the block. The sole purpose of Block#getSubBlocks is to allow variants of a block to be added to the creative inventory.
December 10, 20168 yr HMM. public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { for (final EnumAxis axis : EnumAxis.values()) { list.add(new ItemStack(this, 1, axis.getMeta())); } } I wonder what THIS does... Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
December 10, 20168 yr Author Oh. Embarrassingly copied from another class (an old attempt at custom logs) without realizing. Thanks for the reminder. Second problem is the textures. The two untextured variants I saw in the creative inventory are following me around in the world. Everything is fine until I break the blocks. Those on the X axis are fine, but those on the Y and Z axis drop with no texture. As soon as I pick them up, they are fine.
December 11, 20168 yr Author Where should I even look to try to debug this problem with missing textures when the block is broken? One variant is fine, the other two are not. I suspected that perhaps damageDropped was getting the wrong meta somehow, but it seems to be fine. Any ideas?
December 11, 20168 yr Author It's now working correctly. In my registerItemModel method in the block class, I was only registering an item model for one of the variants. So I looped through each of the variants in my enum and registered an item model for each one, and it finally worked as expected. Problem method: @Override public void registerItemModel(Item item) { Primalcraft.proxy.registerItemRenderer(item, 0, blockName); } Fixed method: @Override public void registerItemModel(Item item) { for (PrimalBlockLog.EnumAxis axis : EnumAxis.values()) { Primalcraft.proxy.registerItemRenderer(item, axis.getMeta(), blockName); } } To be honest, I'm still not sure why this fixed the problem. I was only registering an item model for one variant before, because I only need one variant for the item version of my block.
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.