Package buildcraft.factory

Source Code of buildcraft.factory.TileMiningWell

/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.factory;

import java.util.List;

import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.event.world.BlockEvent.BreakEvent;
import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftFactory;
import buildcraft.api.tiles.IHasWork;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.core.RFBattery;
import buildcraft.core.TileBuildCraft;
import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.utils.BlockUtil;
import buildcraft.core.utils.Utils;

public class TileMiningWell extends TileBuildCraft implements IHasWork, IPipeConnection {

  boolean isDigging = true;

  public TileMiningWell() {
    super();
    this.setBattery(new RFBattery(10000, BuildCraftFactory.MINING_RF_COST_PER_BLOCK, 0));
  }

  /**
   * Dig the next available piece of land if not done. As soon as it reaches
   * bedrock, lava or goes below 0, it's considered done.
   */
  @Override
  public void updateEntity () {
    if (worldObj.isRemote) {
      return;
    }

    int miningCost = (int) Math.ceil(BuildCraftFactory.MINING_RF_COST_PER_BLOCK
        * BuildCraftFactory.miningMultiplier);

    if (getBattery().useEnergy(miningCost, miningCost, false) == 0) {
      return;
    }

    World world = worldObj;

    int depth = yCoord - 1;

    while (world.getBlock(xCoord, depth, zCoord) == BuildCraftFactory.plainPipeBlock) {
      depth = depth - 1;
    }

    if (depth < 1 || depth < yCoord - BuildCraftFactory.miningDepth || !BlockUtil.canChangeBlock(world, xCoord, depth, zCoord)) {
      isDigging = false;
      return;
    }

        BreakEvent breakEvent = new BreakEvent(xCoord, depth, zCoord, worldObj, world.getBlock(xCoord, depth, zCoord),
                world.getBlockMetadata(xCoord, depth, zCoord), CoreProxy.proxy.getBuildCraftPlayer((WorldServer) world).get());
        MinecraftForge.EVENT_BUS.post(breakEvent);

        if (breakEvent.isCanceled()) {
            isDigging = false;
            return;
        }

    boolean wasAir = world.isAirBlock(xCoord, depth, zCoord);

    List<ItemStack> stacks = BlockUtil.getItemStackFromBlock((WorldServer) worldObj, xCoord, depth, zCoord);

    world.setBlock(xCoord, depth, zCoord, BuildCraftFactory.plainPipeBlock);

    if (wasAir) {
      return;
    }

    if (stacks == null || stacks.isEmpty()) {
      return;
    }

    for (ItemStack stack : stacks) {

      stack.stackSize -= Utils.addToRandomInventoryAround(worldObj, xCoord, yCoord, zCoord, stack);
      if (stack.stackSize <= 0) {
        continue;
      }

      stack.stackSize -= Utils.addToRandomPipeAround(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN, stack);
      if (stack.stackSize <= 0) {
        continue;
      }

      // Throw the object away.
      // TODO: factorize that code

      float f = world.rand.nextFloat() * 0.8F + 0.1F;
      float f1 = world.rand.nextFloat() * 0.8F + 0.1F;
      float f2 = world.rand.nextFloat() * 0.8F + 0.1F;

      EntityItem entityitem = new EntityItem(world, xCoord + f, yCoord + f1 + 0.5F, zCoord + f2, stack);

      entityitem.lifespan = BuildCraftCore.itemLifespan;
      entityitem.delayBeforeCanPickup = 10;

      float f3 = 0.05F;
      entityitem.motionX = (float) world.rand.nextGaussian() * f3;
      entityitem.motionY = (float) world.rand.nextGaussian() * f3 + 1.0F;
      entityitem.motionZ = (float) world.rand.nextGaussian() * f3;
      world.spawnEntityInWorld(entityitem);
    }
  }

  @Override
  public void invalidate() {
    super.invalidate();
    if (worldObj != null && yCoord > 2) {
      BuildCraftFactory.miningWellBlock.removePipes(worldObj, xCoord, yCoord, zCoord);
    }
  }

  @Override
  public boolean hasWork() {
    return isDigging;
  }

  @Override
  public ConnectOverride overridePipeConnection(PipeType type,
      ForgeDirection with) {
    return type == PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
  }
}
TOP

Related Classes of buildcraft.factory.TileMiningWell

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.