package net.geforcemods.securitycraft.blocks;
import java.util.Iterator;
import net.geforcemods.securitycraft.api.CustomizableSCTE;
import net.geforcemods.securitycraft.entity.EntitySecurityCamera;
import net.geforcemods.securitycraft.misc.EnumCustomModules;
import net.geforcemods.securitycraft.tileentity.TileEntitySecurityCamera;
import net.geforcemods.securitycraft.util.BlockUtils;
import net.geforcemods.securitycraft.util.PlayerUtils;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.translation.I18n;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockSecurityCamera extends BlockContainer{
public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
public static final PropertyBool POWERED = PropertyBool.create("powered");
public BlockSecurityCamera(Material par2Material) {
super(par2Material);
}
@Override
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos){
return null;
}
@Override
public EnumBlockRenderType getRenderType(IBlockState state){
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
}
@Override
public boolean isOpaqueCube(IBlockState state){
return false;
}
@Override
public boolean isFullCube(IBlockState state){
return false;
}
@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
{
EnumFacing dir = BlockUtils.getBlockPropertyAsEnum((World) source, pos, FACING);
if(dir == EnumFacing.SOUTH)
return new AxisAlignedBB(0.275F, 0.250F, 0.000F, 0.700F, 0.800F, 0.850F);
else if(dir == EnumFacing.NORTH)
return new AxisAlignedBB(0.275F, 0.250F, 0.150F, 0.700F, 0.800F, 1.000F);
else if(dir == EnumFacing.WEST)
return new AxisAlignedBB(0.125F, 0.250F, 0.275F, 1.000F, 0.800F, 0.725F);
else
return new AxisAlignedBB(0.000F, 0.250F, 0.275F, 0.850F, 0.800F, 0.725F);
}
@Override
public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer){
IBlockState iblockstate = this.getDefaultState().withProperty(POWERED, Boolean.valueOf(false));
if(worldIn.isSideSolid(pos.offset(facing.getOpposite()), facing)){
return iblockstate.withProperty(FACING, facing).withProperty(POWERED, false);
}else{
Iterator<?> iterator = EnumFacing.Plane.HORIZONTAL.iterator();
EnumFacing enumfacing1;
do{
if(!iterator.hasNext()){
return iblockstate;
}
enumfacing1 = (EnumFacing)iterator.next();
}while (!worldIn.isSideSolid(pos.offset(enumfacing1.getOpposite()), enumfacing1));
return iblockstate.withProperty(FACING, facing).withProperty(POWERED, false);
}
}
@Override
public void onNeighborChange(IBlockAccess w, BlockPos pos, BlockPos neighbor){
World world = (World)w;
if(BlockUtils.getBlockPropertyAsEnum(world, pos, FACING) == EnumFacing.NORTH){
if(!world.isSideSolid(pos.south(), EnumFacing.NORTH)){
BlockUtils.destroyBlock(world, pos, true);
}
}else if(BlockUtils.getBlockPropertyAsEnum(world, pos, FACING) == EnumFacing.SOUTH){
if(!world.isSideSolid(pos.north(), EnumFacing.SOUTH)){
BlockUtils.destroyBlock(world, pos, true);
}
}else if(BlockUtils.getBlockPropertyAsEnum(world, pos, FACING) == EnumFacing.EAST){
if(!world.isSideSolid(pos.west(), EnumFacing.EAST)){
BlockUtils.destroyBlock(world, pos, true);
}
}else if(BlockUtils.getBlockPropertyAsEnum(world, pos, FACING) == EnumFacing.WEST){
if(!world.isSideSolid(pos.east(), EnumFacing.WEST)){
BlockUtils.destroyBlock(world, pos, true);
}
}
}
public void mountCamera(World world, int par2, int par3, int par4, int par5, EntityPlayer player){
if(!world.isRemote && player.getRidingEntity() == null) {
PlayerUtils.sendMessageToPlayer(player, I18n.translateToLocal("tile.securityCamera.name"), I18n.translateToLocal("messages.securityCamera.mounted"), TextFormatting.GREEN);
}
if(player.getRidingEntity() != null && player.getRidingEntity() instanceof EntitySecurityCamera){
EntitySecurityCamera dummyEntity = new EntitySecurityCamera(world, par2, par3, par4, par5, (EntitySecurityCamera) player.getRidingEntity());
world.spawnEntityInWorld(dummyEntity);
player.startRiding(dummyEntity);
return;
}
EntitySecurityCamera dummyEntity = new EntitySecurityCamera(world, par2, par3, par4, par5, player);
world.spawnEntityInWorld(dummyEntity);
player.startRiding(dummyEntity);
for(Object e : world.loadedEntityList)
{
if(e instanceof EntityLiving)
{
if(((EntityLiving)e).getAttackTarget() == player)
((EntityLiving)e).setAttackTarget(null);
}
}
}
@Override
public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, EnumFacing side){
return (side != EnumFacing.UP && side != EnumFacing.DOWN) ? super.canPlaceBlockOnSide(worldIn, pos, side) : false;
}
@Override
public boolean canPlaceBlockAt(World world, BlockPos pos){
return !world.getBlockState(pos).getBlock().isReplaceable(world, pos) ^ //exclusive or
(world.isSideSolid(pos.west(), EnumFacing.EAST, true) ||
world.isSideSolid(pos.east(), EnumFacing.WEST, true) ||
world.isSideSolid(pos.north(), EnumFacing.SOUTH, true) ||
world.isSideSolid(pos.south(), EnumFacing.NORTH, true));
}
@Override
public boolean canProvidePower(IBlockState state){
return true;
}
@Override
public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side){
if(blockState.getValue(POWERED).booleanValue() && ((CustomizableSCTE) blockAccess.getTileEntity(pos)).hasModule(EnumCustomModules.REDSTONE)){
return 15;
}else{
return 0;
}
}
@Override
public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side){
if(blockState.getValue(POWERED).booleanValue() && ((CustomizableSCTE) blockAccess.getTileEntity(pos)).hasModule(EnumCustomModules.REDSTONE)){
return 15;
}else{
return 0;
}
}
/* TODO: no clue about this
@SideOnly(Side.CLIENT)
public IBlockState getStateForEntityRender(IBlockState state)
{
return this.getDefaultState().withProperty(FACING, EnumFacing.SOUTH);
}*/
@Override
public IBlockState getStateFromMeta(int meta)
{
if(meta <= 5){
return this.getDefaultState().withProperty(FACING, (EnumFacing.values()[meta] == EnumFacing.UP || EnumFacing.values()[meta] == EnumFacing.DOWN) ? EnumFacing.NORTH : EnumFacing.values()[meta]).withProperty(POWERED, false);
}else{
return this.getDefaultState().withProperty(FACING, EnumFacing.values()[meta - 6]).withProperty(POWERED, true);
}
}
@Override
public int getMetaFromState(IBlockState state)
{
if(state.getValue(POWERED).booleanValue()){
return (state.getValue(FACING).getIndex() + 6);
}else{
return state.getValue(FACING).getIndex();
}
}
@Override
protected BlockStateContainer createBlockState()
{
return new BlockStateContainer(this, new IProperty[] {FACING, POWERED});
}
@Override
public TileEntity createNewTileEntity(World world, int par2){
return new TileEntitySecurityCamera().nameable();
}
}