mffs/src/main/java/mffs/block/BlockForceField.java

382 lines
13 KiB
Java

package mffs.block;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mffs.ModularForceFieldSystem;
import mffs.api.IForceFieldBlock;
import mffs.api.IProjector;
import mffs.api.fortron.IFortronStorage;
import mffs.api.modules.IModule;
import mffs.api.security.IBiometricIdentifier;
import mffs.api.security.Permission;
import mffs.base.BlockBase;
import mffs.render.RenderForceField;
import mffs.tileentity.TileEntityForceField;
import micdoodle8.mods.galacticraft.api.block.IPartialSealableBlock;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import universalelectricity.core.vector.Vector3;
import universalelectricity.prefab.CustomDamageSource;
public class BlockForceField
extends BlockBase implements IForceFieldBlock, IPartialSealableBlock {
public BlockForceField() {
super("forceField", Material.glass);
this.setBlockUnbreakable();
this.setResistance(999.0f);
this.setCreativeTab((CreativeTabs) null);
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
protected boolean canSilkHarvest() {
return false;
}
@Override
public int quantityDropped(final Random random) {
return 0;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderBlockPass() {
return 1;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderType() {
return RenderForceField.ID;
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(
final IBlockAccess par1IBlockAccess,
final int par2,
final int par3,
final int par4,
final int par5
) {
final Block i1 = par1IBlockAccess.getBlock(par2, par3, par4);
return i1 != this
&& super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5);
}
@Override
public void onBlockClicked(
final World world,
final int x,
final int y,
final int z,
final EntityPlayer entityPlayer
) {
final TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField
&& ((TileEntityForceField) tileEntity).getProjector() != null) {
for (final ItemStack moduleStack :
((TileEntityForceField) tileEntity)
.getProjector()
.getModuleStacks(((TileEntityForceField) tileEntity)
.getProjector()
.getModuleSlots())) {
if (((IModule) moduleStack.getItem())
.onCollideWithForceField(
world, x, y, z, (Entity) entityPlayer, moduleStack
)) {
return;
}
}
}
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(
final World world, final int x, final int y, final int z
) {
if (world.isRemote) {
if (ModularForceFieldSystem.proxy.isSneaking()) {
return null;
}
}
if (this.getProjector((IBlockAccess) world, x, y, z) != null && !world.isRemote) {
final IBiometricIdentifier BiometricIdentifier
= this.getProjector((IBlockAccess) world, x, y, z)
.getBiometricIdentifier();
final List entities = world.getEntitiesWithinAABB(
EntityPlayer.class,
AxisAlignedBB.getBoundingBox(
(double) (x),
(double) y,
(double) (z),
(double) (x + 1),
y + 1,
(double) (z + 1)
)
);
for (final EntityPlayer entityPlayer : (List<EntityPlayer>) entities) {
if (entityPlayer != null && entityPlayer.isSneaking()) {
if (entityPlayer.capabilities.isCreativeMode) {
return null;
}
if (BiometricIdentifier != null
&& BiometricIdentifier.isAccessGranted(
entityPlayer.getDisplayName(), Permission.FORCE_FIELD_WARP
)) {
return null;
}
continue;
}
}
}
final float f = 0.0625f;
return AxisAlignedBB.getBoundingBox(
(double) (x + f),
(double) (y + f),
(double) (z + f),
(double) (x + 1 - f),
(double) (y + 1 - f),
(double) (z + 1 - f)
);
}
@Override
public void onEntityCollidedWithBlock(
final World world, final int x, final int y, final int z, final Entity entity
) {
final TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField
&& this.getProjector((IBlockAccess) world, x, y, z) != null) {
for (final ItemStack moduleStack :
((TileEntityForceField) tileEntity)
.getProjector()
.getModuleStacks(((TileEntityForceField) tileEntity)
.getProjector()
.getModuleSlots())) {
if (((IModule) moduleStack.getItem())
.onCollideWithForceField(world, x, y, z, entity, moduleStack)) {
return;
}
}
final IBiometricIdentifier biometricIdentifier
= this.getProjector((IBlockAccess) world, x, y, z)
.getBiometricIdentifier();
if (new Vector3(entity).distanceTo(new Vector3(x, y, z).add(0.4)) < 0.5
&& entity instanceof EntityLiving && !world.isRemote) {
((EntityLiving) entity)
.addPotionEffect(new PotionEffect(Potion.confusion.id, 80, 3));
((EntityLiving) entity)
.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 1));
boolean hasPermission = false;
final List entities = world.getEntitiesWithinAABB(
EntityPlayer.class,
AxisAlignedBB.getBoundingBox(
(double) x,
(double) y,
(double) z,
(double) (x + 1),
y + 0.9,
(double) (z + 1)
)
);
for (final EntityPlayer entityPlayer : (List<EntityPlayer>) entities) {
if (entityPlayer != null && entityPlayer.isSneaking()) {
if (entityPlayer.capabilities.isCreativeMode) {
hasPermission = true;
break;
}
if (biometricIdentifier == null
|| !biometricIdentifier.isAccessGranted(
entityPlayer.getDisplayName(), Permission.FORCE_FIELD_WARP
)) {
continue;
}
hasPermission = true;
}
}
if (!hasPermission) {
entity.attackEntityFrom(
(DamageSource) CustomDamageSource.electrocution, Integer.MAX_VALUE
);
}
}
}
}
@Override
public IIcon getIcon(
final IBlockAccess iBlockAccess,
final int x,
final int y,
final int z,
final int side
) {
final TileEntity tileEntity = iBlockAccess.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField) {
final ItemStack checkStack = ((TileEntityForceField) tileEntity).camoStack;
if (checkStack != null) {
try {
final Block block = Block.getBlockFromItem(checkStack.getItem());
final Integer[] allowedRenderTypes
= { 0, 1, 4, 31, 20, 39, 5, 13, 23,
6, 8, 7, 12, 29, 30, 14, 16, 17 };
if (Arrays.asList(allowedRenderTypes)
.contains(block.getRenderType())) {
final IIcon icon
= block.getIcon(side, checkStack.getItemDamage());
if (icon != null) {
return icon;
}
}
} catch (final Exception e) {
e.printStackTrace();
}
}
}
return this.getIcon(side, iBlockAccess.getBlockMetadata(x, y, z));
}
@Override
public int colorMultiplier(
final IBlockAccess iBlockAccess, final int x, final int y, final int z
) {
try {
final TileEntity tileEntity = iBlockAccess.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField) {
final ItemStack checkStack
= ((TileEntityForceField) tileEntity).camoStack;
if (checkStack != null) {
try {
return Block.getBlockFromItem(checkStack.getItem())
.colorMultiplier(iBlockAccess, x, y, x);
} catch (final Exception e) {
e.printStackTrace();
}
}
}
} catch (final Exception e2) {
e2.printStackTrace();
}
return super.colorMultiplier(iBlockAccess, x, y, z);
}
@Override
public int getLightValue(
final IBlockAccess iBlockAccess, final int x, final int y, final int z
) {
try {
final TileEntity tileEntity = iBlockAccess.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField) {
final IProjector zhuYao
= ((TileEntityForceField) tileEntity).getProjectorSafe();
if (zhuYao instanceof IProjector) {
return (int
) (Math.min(
zhuYao.getModuleCount(
ModularForceFieldSystem.itemModuleGlow, new int[0]
),
64
)
/ 64.0f * 15.0f);
}
}
} catch (final Exception e) {
e.printStackTrace();
}
return 0;
}
@Override
public float getExplosionResistance(
final Entity entity,
final World world,
final int x,
final int y,
final int z,
final double d,
final double d1,
final double d2
) {
return 2.1474836E9f;
}
@Override
public TileEntity createNewTileEntity(final World world, int meta) {
return new TileEntityForceField();
}
@Override
public void weakenForceField(
final World world, final int x, final int y, final int z, final int joules
) {
final IProjector projector = this.getProjector((IBlockAccess) world, x, y, z);
if (projector != null) {
((IFortronStorage) projector).provideFortron(joules, true);
}
world.setBlock(x, y, z, Blocks.air, 0, 3);
}
@Override
public ItemStack getPickBlock(
final MovingObjectPosition target,
final World world,
final int x,
final int y,
final int z
) {
return null;
}
@Override
public IProjector
getProjector(final IBlockAccess iBlockAccess, final int x, final int y, final int z) {
final TileEntity tileEntity = iBlockAccess.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField) {
return ((TileEntityForceField) tileEntity).getProjector();
}
return null;
}
@Override
public boolean isSealed(World world, int x, int y, int z, ForgeDirection direction) {
return true;
}
@Override
public void registerBlockIcons(IIconRegister p_149651_1_) {
this.blockIcon = p_149651_1_.registerIcon("mffs:forceField");
}
}