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; } }