Jump to content

1.12.2 Use 2 blockstates


RoyalReject

Recommended Posts

So I currently have my block class setup and wanted my block to change face based on its direction no big deal, but I also use the same class to register different blocks via Enum values, basically I am trying to return 2 blockstates and wondered if it was possible. Because currently I can get it to rotate, but all blocks have same texture, otherwise i can get it to have different textures but then it no longer rotates 

 

public class BlockTier extends Block{
	public static final PropertyEnum<EnumTier> TIER = PropertyEnum.create("tier", EnumTier.class);
	public static final IProperty<EnumFacing> FACING = BlockHorizontal.FACING;
	
	public BlockTier(Material m, MapColor c) {
		super(m, c);
	}
	
	@Nonnull
	@Override
	protected BlockStateContainer createBlockState() {
		return new BlockStateContainer(this, TIER, FACING);
	}
	
	@Override
	@Deprecated
	public IBlockState getStateFromMeta(int meta){
		return this.getDefaultState().withProperty(FACING, EnumFacing.byHorizontalIndex(meta)).withProperty(TIER, EnumTier.byMeta(meta));
      //FIXED 
		
	}

	@Override
	public int getMetaFromState(IBlockState state){
		return state.getValue(TIER).ordinal() + state.getValue(FACING).getHorizontalIndex();
	}

	@Override
	public boolean hasTileEntity(IBlockState state){
		return true;
	}

	@Override
	public int damageDropped(IBlockState state){
		return state.getValue(TIER).ordinal();
	}

	@Override
	public void getSubBlocks(CreativeTabs itemIn, NonNullList<ItemStack> items){
		for (EnumTier tier : EnumTier.VALUES){
			items.add(new ItemStack(this, 1, tier.ordinal()));
		}
	}
	
	@Nonnull
	@Override
	public IBlockState getStateForPlacement(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing facing, float hitX, float hitY, float hitZ, int meta, @Nonnull EntityLivingBase placer, EnumHand hand){
		return getStateFromMeta(meta).withProperty(FACING, placer.getHorizontalFacing().getOpposite());
	}

 

Edited by RoyalReject
Fixed
Link to comment
Share on other sites

Blockstates aren't magic. They're just a more developer-friendly way of expressing the same information that has always been there: metadata. Metadata is still limited to 16 possible unique states, so with your current code you have a FACING value that has 4 distinct states. This means that your TIER value can only have 4 distinct states that fit within metadata.

 

That said, you shouldn't be using metadata to store "different" blocks at this point. Once you update your mod for 1.13, you'll have to flatten those metadata values back into separate block instances, so you may as well just do that now.

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.

Link to comment
Share on other sites

48 minutes ago, RoyalReject said:

If that was the case i have 5 different enums in tier and it work? or I just misunderstanding you?

Either:

  • 4 or fewer enum values
  • Separate blocks

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.

Link to comment
Share on other sites

You can’t store blockstates as a tile entity. You can have an infinite amount of variables in a tile entity though which is probably what you meant.

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

I ended up creating a TileEntity and got it to store its Facing value in nbt.

public class TileCollector extends TileEntity implements ITickable{
	private EnumFacing facing;
	
	public EnumFacing getFacing(){
		if(facing != null) {
			return facing;
		}
		return EnumFacing.NORTH;
	}

	@Override
	public void update(){
		// TODO Auto-generated method stub		
	}
	
	public void setFacing(EnumFacing facing){		 
		 this.facing = facing;
		 markDirty();
	}
	
	@Override
	 public void readFromNBT(NBTTagCompound compound) {
		 facing = EnumFacing.byHorizontalIndex(compound.getInteger("Facing"));
		 super.readFromNBT(compound);		
	 }
	 
	 @Override
	 public NBTTagCompound writeToNBT(NBTTagCompound compound){
		 super.writeToNBT(compound);
		 compound.setInteger("Facing", facing.getHorizontalIndex());
		 return compound;		 
	 }
	 
	 @Override
	 public SPacketUpdateTileEntity getUpdatePacket(){
	     return new SPacketUpdateTileEntity(this.pos, 1, this.getUpdateTag());
	 }

	 @Override
	 public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt){
		 super.onDataPacket(net, pkt);
		 handleUpdateTag(pkt.getNbtCompound());
	 }
	 
	 @Override
	public NBTTagCompound getUpdateTag(){
		 return this.writeToNBT(new NBTTagCompound());
	}
}	

 

And then changed by block class to overtire

	@Override
	public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos){			
		TileCollector collector = (TileCollector) worldIn.getTileEntity(pos);
		return state.withProperty(FACING, collector.getFacing());	
	}
	
	@Override
	public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack){		
		TileCollector collector = (TileCollector) worldIn.getTileEntity(pos);;
		collector.setFacing(placer.getHorizontalFacing().getOpposite());		
	}

 

Link to comment
Share on other sites

Don't call World#getTileEntity() directly from getActualState() (or getExtendedState()), or you could end up with mysterious crashes and other flakiness.  Read the warning section here for a full explanation of why: https://mcforge.readthedocs.io/en/latest/blocks/states/#actual-states

 

A safer version (for use by getActualState()/getExtendedState()) looks like this:

 

public static TileEntity getTileEntitySafely(IBlockAccess world, BlockPos pos) {
    return world instanceof ChunkCache ?
            ((ChunkCache) world).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) :
            world.getTileEntity(pos);
}
Edited by desht
Link to comment
Share on other sites

The above code won't quite work with OptiFine because it replaces ChunkCache with its own implementation, you can ignore this if you don't particularly care about compatibility. I can't think of how to solve this problem easily otherwise I would provide a solution

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

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.