package joshie.harvest.core.base.block; import joshie.harvest.core.HFTab; import joshie.harvest.core.helpers.EntityHelper; import joshie.harvest.core.lib.CreativeSort; import joshie.harvest.core.util.interfaces.IFaceable; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkCache; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; public abstract class BlockHFEnumRotatableTile<B extends BlockHFEnumRotatableTile, E extends Enum<E> & IStringSerializable> extends BlockHFEnum<B, E> { protected static final PropertyDirection FACING = BlockHorizontal.FACING; //Main Constructor public BlockHFEnumRotatableTile(Material material, Class<E> clazz, CreativeTabs tab) { super(material, clazz, tab); setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); } public BlockHFEnumRotatableTile(Material material, Class<E> clazz) { this(material, clazz, HFTab.FARMING); } @Override protected BlockStateContainer createBlockState() { if(property == null) return new BlockStateContainer(this, temporary, FACING); return new BlockStateContainer(this, property, FACING); } @Override @SideOnly(Side.CLIENT) @Nonnull public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT_MIPPED; } @Override public boolean isVisuallyOpaque() { return false; } @SuppressWarnings("deprecation") @Override @Nonnull public IBlockState withRotation(@Nonnull IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack stack) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof IFaceable) { ((IFaceable) tile).setFacing(EntityHelper.getFacingFromEntity(entity)); } } @SuppressWarnings("deprecation") @Override @Nonnull public IBlockState getActualState(@Nonnull IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity tile = world instanceof ChunkCache ? ((ChunkCache)world).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) : world.getTileEntity(pos); if (tile instanceof IFaceable) { return state.withProperty(FACING, ((IFaceable)tile).getFacing()); } return state; } @Override public boolean hasTileEntity(IBlockState state) { return true; } @Override public int getSortValue(ItemStack stack) { return CreativeSort.TROUGH; } @SideOnly(Side.CLIENT) @Override public void registerModels(Item item, String name) { for (int i = 0; i < values.length; i++) { if (Character.toLowerCase(property.getName().charAt(0)) < Character.toLowerCase('f')) { ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(getRegistryName(), property.getName() + "=" + getEnumFromMeta(i).getName() + ",facing=north")); } else { ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(getRegistryName(), "facing=north," + property.getName() + "=" + getEnumFromMeta(i).getName())); } } } }