package net.geforcemods.securitycraft.blocks; import static net.minecraftforge.common.util.ForgeDirection.DOWN; import static net.minecraftforge.common.util.ForgeDirection.EAST; import static net.minecraftforge.common.util.ForgeDirection.NORTH; import static net.minecraftforge.common.util.ForgeDirection.SOUTH; import static net.minecraftforge.common.util.ForgeDirection.UP; import static net.minecraftforge.common.util.ForgeDirection.WEST; import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.geforcemods.securitycraft.api.Owner; import net.geforcemods.securitycraft.main.mod_SecurityCraft; import net.geforcemods.securitycraft.tileentity.TileEntityAlarm; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class BlockAlarm extends BlockContainer { private final boolean isLit; public BlockAlarm(Material par1Material, boolean isLit) { super(par1Material); float f = 0.2F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.5F, 0.5F + f); this.isLit = isLit; if(this.isLit){ this.setLightLevel(1.0F); } } @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { return false; } public boolean isOpaqueCube(){ return false; } public boolean isNormalCube(){ return false; } public int getRenderType(){ return -1; } /** * checks to see if you can place this block can be placed on that side of a block: BlockLever overrides */ public boolean canPlaceBlockOnSide(World p_149707_1_, int p_149707_2_, int p_149707_3_, int p_149707_4_, int p_149707_5_) { ForgeDirection dir = ForgeDirection.getOrientation(p_149707_5_); return (dir == DOWN && p_149707_1_.isSideSolid(p_149707_2_, p_149707_3_ + 1, p_149707_4_, DOWN )) || (dir == UP && p_149707_1_.isSideSolid(p_149707_2_, p_149707_3_ - 1, p_149707_4_, UP )) || (dir == NORTH && p_149707_1_.isSideSolid(p_149707_2_, p_149707_3_, p_149707_4_ + 1, NORTH)) || (dir == SOUTH && p_149707_1_.isSideSolid(p_149707_2_, p_149707_3_, p_149707_4_ - 1, SOUTH)) || (dir == WEST && p_149707_1_.isSideSolid(p_149707_2_ + 1, p_149707_3_, p_149707_4_, WEST )) || (dir == EAST && p_149707_1_.isSideSolid(p_149707_2_ - 1, p_149707_3_, p_149707_4_, EAST )); } /** * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z */ public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_) { return p_149742_1_.isSideSolid(p_149742_2_ - 1, p_149742_3_, p_149742_4_, EAST ) || p_149742_1_.isSideSolid(p_149742_2_ + 1, p_149742_3_, p_149742_4_, WEST ) || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ - 1, SOUTH) || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ + 1, NORTH) || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_ - 1, p_149742_4_, UP ) || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_ + 1, p_149742_4_, DOWN ); } /** * Called whenever the block is added into the world. Args: world, x, y, z */ public void onBlockAdded(World par1World, int par2, int par3, int par4) { if(par1World.isRemote){ return; }else{ par1World.scheduleBlockUpdate(par2, par3, par4, this, 1); } } /** * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata */ public int onBlockPlaced(World p_149660_1_, int p_149660_2_, int p_149660_3_, int p_149660_4_, int p_149660_5_, float p_149660_6_, float p_149660_7_, float p_149660_8_, int p_149660_9_) { int k1 = p_149660_9_ & 8; byte b0 = -1; if (p_149660_5_ == 0 && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_ + 1, p_149660_4_, DOWN)) { b0 = 0; } if (p_149660_5_ == 1 && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_ - 1, p_149660_4_, UP)) { b0 = 5; } if (p_149660_5_ == 2 && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ + 1, NORTH)) { b0 = 4; } if (p_149660_5_ == 3 && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ - 1, SOUTH)) { b0 = 3; } if (p_149660_5_ == 4 && p_149660_1_.isSideSolid(p_149660_2_ + 1, p_149660_3_, p_149660_4_, WEST)) { b0 = 2; } if (p_149660_5_ == 5 && p_149660_1_.isSideSolid(p_149660_2_ - 1, p_149660_3_, p_149660_4_, EAST)) { b0 = 1; } return b0 + k1; } /** * Called when the block is placed in the world. */ public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack p_149689_6_){ int l = par1World.getBlockMetadata(par2, par3, par4); if (l == 0) par1World.setBlockMetadataWithNotify(par2, par3, par4, 0, 2); else if (l == 1) par1World.setBlockMetadataWithNotify(par2, par3, par4, 1, 2); else if (l == 2) par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 2); else if (l == 3) par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 2); else if(l == 4) par1World.setBlockMetadataWithNotify(par2, par3, par4, 4, 2); else if(l == 5) par1World.setBlockMetadataWithNotify(par2, par3, par4, 5, 2); } public static int invertMetadata(int p_149819_0_) { switch (p_149819_0_) { case 0: return 0; case 1: return 5; case 2: return 4; case 3: return 3; case 4: return 2; case 5: return 1; default: return -1; } } /** * Ticks the block if it's been scheduled */ public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random){ if(!par1World.isRemote){ this.playSoundAndUpdate(par1World, par2, par3, par4); par1World.scheduleBlockUpdate(par2, par3, par4, this, 5); } } /** * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are * their own) Args: x, y, z, neighbor Block */ public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, Block par5Block){ if(!par1World.isRemote){ this.playSoundAndUpdate(par1World, par2, par3, par4); } if (this.func_149820_e(par1World, par2, par3, par4)) { int l = par1World.getBlockMetadata(par2, par3, par4) & 7; boolean flag = false; if (!par1World.isSideSolid(par2, par3 + 1, par4, DOWN) && l == 0) flag = true; else if (!par1World.isSideSolid(par2 - 1, par3, par4, EAST) && l == 1) flag = true; else if (!par1World.isSideSolid(par2 + 1, par3, par4, WEST) && l == 2) flag = true; else if (!par1World.isSideSolid(par2, par3, par4 - 1, SOUTH) && l == 3) flag = true; else if (!par1World.isSideSolid(par2, par3, par4 + 1, NORTH) && l == 4) flag = true; else if (!par1World.isSideSolid(par2, par3 - 1, par4, UP) && l == 5) flag = true; if (flag) { this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); par1World.setBlockToAir(par2, par3, par4); } } } private boolean func_149820_e(World p_149820_1_, int p_149820_2_, int p_149820_3_, int p_149820_4_) { if (!this.canPlaceBlockAt(p_149820_1_, p_149820_2_, p_149820_3_, p_149820_4_)) { this.dropBlockAsItem(p_149820_1_, p_149820_2_, p_149820_3_, p_149820_4_, p_149820_1_.getBlockMetadata(p_149820_2_, p_149820_3_, p_149820_4_), 0); p_149820_1_.setBlockToAir(p_149820_2_, p_149820_3_, p_149820_4_); return false; } else { return true; } } /** * Updates the blocks bounds based on its current state. Args: world, x, y, z */ public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_) { int l = p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_) & 7; float f = 0.1875F; float ySideMin = 0.44F - f; //bottom of the alarm when placed on a block side float ySideMax = 0.56F + f; //top of the alarm when placed on a block side float hSideMin = 0.44F - f; //the left start for s/w and right start for n/e float hSideMax = 0.56F + f; //the left start for n/e and right start for s/w switch(l) { case 0: //down f = 0.25F; this.setBlockBounds(0.5F - f, 0.5F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f); break; case 1: //east this.setBlockBounds(0.0F, ySideMin, hSideMin, 0.5F, ySideMax, hSideMax); break; case 2: //west this.setBlockBounds(0.5F, ySideMin, hSideMin, 1.0F, ySideMax, hSideMax); break; case 3: //north this.setBlockBounds(hSideMin, ySideMin, 0.0F, hSideMax, ySideMax, 0.5F); break; case 4: //south this.setBlockBounds(hSideMin, ySideMin, 0.5F, hSideMax, ySideMax, 1.0F); break; case 5: //up { f = 0.25F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.5F, 0.5F + f); } } } private void playSoundAndUpdate(World par1World, int par2, int par3, int par4){ if(!(par1World.getTileEntity(par2, par3, par4) instanceof TileEntityAlarm)) return; if(par1World.isBlockIndirectlyGettingPowered(par2, par3, par4)){ boolean isPowered = ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).isPowered(); if(!isPowered){ Owner owner = ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).getOwner(); par1World.setBlock(par2, par3, par4, mod_SecurityCraft.alarmLit, par1World.getBlockMetadata(par2, par3, par4), 3); ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).getOwner().set(owner); ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).setPowered(true); } }else{ boolean isPowered = ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).isPowered(); if(isPowered){ Owner owner = ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).getOwner(); par1World.setBlock(par2, par3, par4, mod_SecurityCraft.alarm, par1World.getBlockMetadata(par2, par3, par4), 3); ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).getOwner().set(owner); ((TileEntityAlarm) par1World.getTileEntity(par2, par3, par4)).setPowered(false); } } } /** * Gets an item for the block being called on. Args: world, x, y, z */ @SideOnly(Side.CLIENT) public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_){ return Item.getItemFromBlock(mod_SecurityCraft.alarm); } public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_){ return Item.getItemFromBlock(mod_SecurityCraft.alarm); } public TileEntity createNewTileEntity(World var1, int var2) { return new TileEntityAlarm(); } }