package joshie.harvest.core.base.block; import joshie.harvest.api.HFApi; import joshie.harvest.core.HFTab; import joshie.harvest.core.base.item.ItemBlockHF; import joshie.harvest.core.util.interfaces.ISellable; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; 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.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import java.util.List; import java.util.Locale; import java.util.Random; public abstract class BlockHFEnum<B extends BlockHFEnum, E extends Enum<E> & IStringSerializable> extends BlockHFBase<B> { protected static PropertyEnum<?> temporary; public final PropertyEnum<E> property; protected final Class<E> enumClass; protected final E[] values; //Main Constructor @SuppressWarnings("unchecked") public BlockHFEnum(Material material, Class<E> clazz, CreativeTabs tab) { super(preInit(material, clazz), tab); enumClass = clazz; property = (PropertyEnum<E>) temporary; values = clazz.getEnumConstants(); setDefaultState(blockState.getBaseState()); for (E e : values) { setHarvestLevel(getToolType(e), getToolLevel(e), getStateFromEnum(e)); } } public void registerSellables(ItemBlockHF item) { if (values[0] instanceof ISellable) { for (E e: values) { long value = ((ISellable)e).getSellValue(); if (value > 0L) { HFApi.shipping.registerSellable(new ItemStack(item, 1, e.ordinal()), value); } } } } private static Material preInit(Material material, Class clazz) { temporary = PropertyEnum.create(clazz.getSimpleName().toLowerCase(Locale.ENGLISH), clazz); return material; } //Constructor default to farming tab public BlockHFEnum(Material material, Class<E> clazz) { this(material, clazz, HFTab.FARMING); } @Override protected BlockStateContainer createBlockState() { if(property == null) return new BlockStateContainer(this, temporary); return new BlockStateContainer(this, property); } @SuppressWarnings("deprecation") @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(property, getEnumFromMeta(meta)); } public IBlockState getStateFromEnum(E e) { return getDefaultState().withProperty(property, e); } public E getEnumFromBlockPos(IBlockAccess world, BlockPos pos) { return getEnumFromState(world.getBlockState(pos)); } public E getEnumFromState(IBlockState state) { return state.getValue(property); } public E getEnumFromMeta(int meta) { if (meta < 0 || meta >= values.length) { meta = 0; } return values[meta]; } public E getEnumFromStack(ItemStack stack) { return getEnumFromMeta(stack.getItemDamage()); } public ItemStack getStackFromEnum(E e) { return new ItemStack(this, 1, e.ordinal()); } public ItemStack getStackFromEnumString(String name) { return getStackFromEnum(Enum.valueOf(enumClass, name.toUpperCase())); } @Override public int getMetaFromState(IBlockState state) { return (state.getValue(property)).ordinal(); } @Override public int damageDropped(IBlockState state) { return getMetaFromState(state); } //Default to pickaxe public String getToolType(E type) { return "pickaxe"; } //Default to level 0 protected int getToolLevel(E level) { return 0; } @Override public Item getItemDropped(IBlockState state, Random rand, int side) { return !doesDrop(state) ? null : super.getItemDropped(state, rand, side); } protected boolean doesDrop(IBlockState state) { return true; } @Override @SideOnly(Side.CLIENT) @Nonnull public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } @SuppressWarnings("deprecation") @Override public boolean isFullCube(IBlockState blockState) { return false; } @SuppressWarnings("deprecation") @Override public boolean isOpaqueCube(IBlockState blockState) { return false; } @Override public String getUnlocalizedName(ItemStack stack) { return getEnumFromMeta(stack.getItemDamage()).name().toLowerCase(Locale.ENGLISH); } protected boolean shouldDisplayInCreative(E e) { return true; } @Override @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) { for (E e : values) { if (shouldDisplayInCreative(e)) { list.add(new ItemStack(item, 1, e.ordinal())); } } } @SideOnly(Side.CLIENT) public void registerModels(Item item, String name) { for (int i = 0; i < values.length; i++) { ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(getRegistryName(), property.getName() + "=" + getEnumFromMeta(i).getName())); } } }