package joshie.harvest.animals.block;
import joshie.harvest.animals.block.BlockSizedStorage.SizedStorage;
import joshie.harvest.animals.tile.TileIncubator;
import joshie.harvest.api.core.Size;
import joshie.harvest.core.base.tile.TileFillableSized;
import joshie.harvest.core.base.block.BlockHFEnumRotatableTile;
import joshie.harvest.core.util.interfaces.IFaceable;
import net.minecraft.block.SoundType;
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.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
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 java.util.Locale;
import static joshie.harvest.animals.block.BlockSizedStorage.Fill.EMPTY;
public class BlockSizedStorage extends BlockHFEnumRotatableTile<BlockSizedStorage, SizedStorage> {
private static final AxisAlignedBB NEST_NORTH_AABB = new AxisAlignedBB(0.05D, 0D, 0.3D, 0.95D, 0.7D, 0.95);
private static final AxisAlignedBB NEST_SOUTH_AABB = new AxisAlignedBB(0.05D, 0D, 0.05D, 0.95D, 0.7D, 0.7);
private static final AxisAlignedBB NEST_WEST_AABB = new AxisAlignedBB(0.3D, 0D, 0.05D, 0.95D, 0.7D, 0.95);
private static final AxisAlignedBB NEST_EAST_AABB = new AxisAlignedBB(0.05D, 0D, 0.05D, 0.7D, 0.7D, 0.95);
public static final PropertyEnum<Fill> FILL = PropertyEnum.create("fill", Fill.class);
public enum SizedStorage implements IStringSerializable {
INCUBATOR;
@Override
public String getName() {
return toString().toLowerCase(Locale.ENGLISH);
}
}
public enum Fill implements IStringSerializable {
EMPTY, SMALL, MEDIUM, LARGE;
public static Fill getFillFromSize(Size size) {
return size == Size.SMALL ? SMALL : size == Size.MEDIUM ? MEDIUM : LARGE;
}
@Override
public String getName() {
return toString().toLowerCase(Locale.ENGLISH);
}
}
public BlockSizedStorage() {
super(Material.WOOD, SizedStorage.class);
setHardness(1.5F);
setSoundType(SoundType.WOOD);
setDefaultState(getDefaultState().withProperty(FILL, EMPTY));
}
@Override
protected BlockStateContainer createBlockState() {
if(property == null) return new BlockStateContainer(this, temporary, FACING, FILL);
return new BlockStateContainer(this, property, FACING, FILL);
}
@Override
public String getToolType(SizedStorage wood) {
return "axe";
}
@SuppressWarnings("deprecation")
@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
IFaceable tile = (IFaceable) world.getTileEntity(pos);
if (tile != null) {
switch (tile.getFacing()) {
case NORTH:
return NEST_NORTH_AABB;
case SOUTH:
return NEST_SOUTH_AABB;
case WEST:
return NEST_WEST_AABB;
case EAST:
return NEST_EAST_AABB;
default:
return FULL_BLOCK_AABB;
}
} else return FULL_BLOCK_AABB;
}
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack held, EnumFacing side, float hitX, float hitY, float hitZ) {
if (player.isSneaking()) return false;
else if (held != null) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileFillableSized) {
return ((TileFillableSized)tile).onActivated(player, held);
}
}
return false;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state) {
return new TileIncubator();
}
@Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
TileEntity tile = world instanceof ChunkCache ? ((ChunkCache)world).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) : world.getTileEntity(pos);
if (tile instanceof TileFillableSized) {
TileFillableSized sized = (TileFillableSized) tile;
boolean isFilled = sized.getFillAmount() > 0;
IBlockState theState = isFilled ? state.withProperty(FILL, Fill.getFillFromSize(sized.getSize())) : state.withProperty(FILL, EMPTY);
return super.getActualState(theState, world, pos);
}
return super.getActualState(state, world, pos);
}
@SideOnly(Side.CLIENT)
@Override
public void registerModels(Item item, String name) {
for (int i = 0; i < values.length; i++) {
ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(getRegistryName(), "facing=north,fill=empty," + property.getName() + "=" + getEnumFromMeta(i).getName()));
}
}
}