Jump to content

[1.10.2] Multiple copies of item in inventory when registering


Recommended Posts

Posted

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


}

}

 

Posted

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.

Posted

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.

Posted

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?

Posted

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.