Posted April 5, 20196 yr 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 April 5, 20196 yr by RoyalReject Fixed
April 7, 20196 yr 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.
April 7, 20196 yr Author If that was the case i have 5 different enums in tier and it work? or I just misunderstanding you?
April 7, 20196 yr 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.
April 7, 20196 yr Author 2 hours ago, Draco18s said: Either: 4 or fewer enum values Separate blocks Would it be possible to store anymore states in a tileEntity to affect the texture and/or orientation of the block?
April 7, 20196 yr 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 Website - Cadiboo.github.io My Mods - Cadiboo.github.io/projects My Tutorials - Cadiboo.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)
April 7, 20196 yr Author 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()); }
April 8, 20196 yr 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 April 8, 20196 yr by desht
April 9, 20196 yr 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 Website - Cadiboo.github.io My Mods - Cadiboo.github.io/projects My Tutorials - Cadiboo.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)
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.