package com.jaquadro.minecraft.storagedrawers.block;
import com.jaquadro.minecraft.storagedrawers.StorageDrawers;
import com.jaquadro.minecraft.storagedrawers.api.security.ISecurityProvider;
import com.jaquadro.minecraft.storagedrawers.api.storage.INetworked;
import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.LockAttribute;
import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityController;
import com.jaquadro.minecraft.storagedrawers.core.ModCreativeTabs;
import com.jaquadro.minecraft.storagedrawers.core.ModItems;
import com.jaquadro.minecraft.storagedrawers.item.ItemPersonalKey;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.SoundType;
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.entity.EntityLivingBase;
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.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import java.util.EnumSet;
import java.util.Random;
public class BlockController extends BlockContainer implements INetworked
{
public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
public BlockController (String name) {
super(Material.ROCK);
setUnlocalizedName(name);
setRegistryName(name);
this.useNeighborBrightness = true;
setCreativeTab(ModCreativeTabs.tabStorageDrawers);
setHardness(5f);
setSoundType(SoundType.STONE);
setLightOpacity(255);
setTickRandomly(true);
setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
}
@Override
@SuppressWarnings("deprecation")
public boolean isOpaqueCube (IBlockState state) {
return false;
}
@Override
public EnumBlockRenderType getRenderType (IBlockState state) {
return EnumBlockRenderType.MODEL;
}
@Override
public int tickRate (World world) {
return 100;
}
@Override
public Item getItemDropped (IBlockState state, Random rand, int fortune) {
return Item.getItemFromBlock(this);
}
@Override
public void onBlockAdded (World world, BlockPos pos, IBlockState state) {
if (!world.isRemote) {
IBlockState blockNorth = world.getBlockState(pos.north());
IBlockState blockSouth = world.getBlockState(pos.south());
IBlockState blockWest = world.getBlockState(pos.west());
IBlockState blockEast = world.getBlockState(pos.east());
EnumFacing facing = state.getValue(FACING);
if (facing == EnumFacing.NORTH && blockNorth.isFullBlock() && !blockSouth.isFullBlock())
facing = EnumFacing.SOUTH;
if (facing == EnumFacing.SOUTH && blockSouth.isFullBlock() && !blockNorth.isFullBlock())
facing = EnumFacing.NORTH;
if (facing == EnumFacing.WEST && blockWest.isFullBlock() && !blockEast.isFullBlock())
facing = EnumFacing.EAST;
if (facing == EnumFacing.EAST && blockEast.isFullBlock() && !blockWest.isFullBlock())
facing = EnumFacing.WEST;
world.setBlockState(pos, state.withProperty(FACING, facing), 2);
}
}
@Override
public IBlockState getStateForPlacement (World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
return getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
}
@Override
public void onBlockPlacedBy (World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack itemStack) {
world.setBlockState(pos, state.withProperty(FACING, entity.getHorizontalFacing().getOpposite()), 2);
}
@Override
public boolean onBlockActivated (World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
EnumFacing blockDir = state.getValue(FACING);
TileEntityController te = getTileEntitySafe(world, pos);
ItemStack item = player.inventory.getCurrentItem();
if (item != null && toggle(world, pos, player, item.getItem()))
return true;
if (blockDir != side)
return false;
if (!world.isRemote)
te.interactPutItemsIntoInventory(player);
return true;
}
public boolean toggle (World world, BlockPos pos, EntityPlayer player, Item item) {
if (world.isRemote || item == null)
return false;
if (item == ModItems.drawerKey)
toggle(world, pos, player, EnumKeyType.DRAWER);
else if (item == ModItems.shroudKey)
toggle(world, pos, player, EnumKeyType.CONCEALMENT);
else if (item == ModItems.quantifyKey)
toggle(world, pos, player, EnumKeyType.QUANTIFY);
else if (item == ModItems.personalKey)
toggle(world, pos, player, EnumKeyType.PERSONAL);
else
return false;
return true;
}
public void toggle (World world, BlockPos pos, EntityPlayer player, EnumKeyType keyType) {
if (world.isRemote)
return;
TileEntityController te = getTileEntitySafe(world, pos);
if (te == null)
return;
switch (keyType) {
case DRAWER:
te.toggleLock(EnumSet.allOf(LockAttribute.class), LockAttribute.LOCK_POPULATED, player.getGameProfile());
break;
case CONCEALMENT:
te.toggleShroud(player.getGameProfile());
break;
case QUANTIFY:
te.toggleQuantified(player.getGameProfile());
break;
case PERSONAL:
String securityKey = ModItems.personalKey.getSecurityProviderKey(0);
ISecurityProvider provider = StorageDrawers.securityRegistry.getProvider(securityKey);
te.toggleProtection(player.getGameProfile(), provider);
break;
}
}
@Override
public boolean isSideSolid (IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) {
return state == null || state.getValue(FACING) != side;
}
@Override
public void updateTick (World world, BlockPos pos, IBlockState state, Random rand) {
if (world.isRemote)
return;
TileEntityController te = getTileEntity(world, pos);
if (te == null)
return;
te.updateCache();
world.scheduleUpdate(pos, this, this.tickRate(world));
}
@Override
@SuppressWarnings("deprecation")
public IBlockState getStateFromMeta (int meta) {
EnumFacing facing = EnumFacing.getFront(meta);
if (facing.getAxis() == EnumFacing.Axis.Y)
facing = EnumFacing.NORTH;
return getDefaultState().withProperty(FACING, facing);
}
@Override
public int getMetaFromState (IBlockState state) {
return (state.getValue(FACING)).getIndex();
}
@Override
protected BlockStateContainer createBlockState () {
return new BlockStateContainer(this, FACING);
}
@Override
public TileEntityController createNewTileEntity (World world, int meta) {
return new TileEntityController();
}
public TileEntityController getTileEntity (IBlockAccess blockAccess, BlockPos pos) {
TileEntity tile = blockAccess.getTileEntity(pos);
return (tile instanceof TileEntityController) ? (TileEntityController) tile : null;
}
public TileEntityController getTileEntitySafe (World world, BlockPos pos) {
TileEntityController tile = getTileEntity(world, pos);
if (tile == null) {
tile = createNewTileEntity(world, 0);
world.setTileEntity(pos, tile);
}
return tile;
}
}