package choonster.testmod3.block;
import choonster.testmod3.util.IVariant;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.Comparator;
import java.util.stream.Stream;
/**
* A block with several variants.
* <p>
* Test for this thread:
* http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2594064-metadata-blocks-dont-have-textures
*
* @author Choonster
*/
public class BlockVariants extends BlockTestMod3 {
public static final IProperty<EnumType> VARIANT = PropertyEnum.create("variant", EnumType.class);
public BlockVariants(Material materialIn) {
super(materialIn, "variants");
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, VARIANT);
}
@SuppressWarnings("deprecation")
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState().withProperty(VARIANT, EnumType.byMetadata(meta));
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(VARIANT).getMeta();
}
@Override
public int damageDropped(IBlockState state) {
return getMetaFromState(state);
}
@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
return worldIn.setBlockState(pos, state.cycleProperty(VARIANT));
}
@Override
public void getSubBlocks(Item itemIn, CreativeTabs tab, NonNullList<ItemStack> list) {
for (final EnumType enumType : EnumType.values()) {
list.add(new ItemStack(this, 1, enumType.getMeta()));
}
}
/**
* Get the unlocalised name suffix for the specified {@link ItemStack}.
*
* @param stack The ItemStack
* @return The unlocalised name suffix
*/
public String getName(ItemStack stack) {
final int metadata = stack.getMetadata();
return EnumType.byMetadata(metadata).getName();
}
public enum EnumType implements IVariant {
VARIANT_A(0, "a"),
VARIANT_B(1, "b");
private static final EnumType[] META_LOOKUP = Stream.of(values()).sorted(Comparator.comparing(EnumType::getMeta)).toArray(EnumType[]::new);
private final int meta;
private final String name;
EnumType(int meta, String name) {
this.meta = meta;
this.name = name;
}
public int getMeta() {
return meta;
}
@Override
public String getName() {
return name;
}
public static EnumType byMetadata(int meta) {
if (meta < 0 || meta >= META_LOOKUP.length) {
meta = 0;
}
return META_LOOKUP[meta];
}
}
}