From 8335cbd15e29dc9ab649eb0ad61a0a2f9064ddac Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 9 Sep 2012 02:45:27 -0400 Subject: [PATCH] Change the quarry so all processing is in the TileEntity. The entity is now completely dumb and does nothing on either side. Also, the quarry now plays the block break effect when it breaks a block for sheer awesome :) --- .../factory/EntityMechanicalArm.java | 147 +---------------- common/buildcraft/factory/IArmListener.java | 16 -- common/buildcraft/factory/TileQuarry.java | 156 ++++++++++++------ 3 files changed, 117 insertions(+), 202 deletions(-) delete mode 100644 common/buildcraft/factory/IArmListener.java diff --git a/common/buildcraft/factory/EntityMechanicalArm.java b/common/buildcraft/factory/EntityMechanicalArm.java index 74a9cb48..745bdbe9 100644 --- a/common/buildcraft/factory/EntityMechanicalArm.java +++ b/common/buildcraft/factory/EntityMechanicalArm.java @@ -20,10 +20,9 @@ import net.minecraft.src.NBTTagCompound; import net.minecraft.src.TileEntity; import net.minecraft.src.World; -public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpawnData { +public class EntityMechanicalArm extends Entity { EntityBlock xArm, yArm, zArm, head; - public IArmListener listener; boolean inProgressionXZ = false; boolean inProgressionY = false; @@ -31,30 +30,16 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw private double armSizeX; private double armSizeZ; - private double xRoot; - private double yRoot; - private double zRoot; - private double angle; + private int headX, headY, headZ; + public EntityMechanicalArm(World world) { super(world); makeParts(world); - // Head X, Y, Z - dataWatcher.addObject(2, 1); - dataWatcher.addObject(3, 1); - dataWatcher.addObject(4, 1); - - // Target X, Y, Z - dataWatcher.addObject(5, 1); - dataWatcher.addObject(6, 1); - dataWatcher.addObject(7, 1); - - // Speed - dataWatcher.addObject(8, (int)(0.03 * 8000D)); } public EntityMechanicalArm(World world, double i, double j, double k, double width, double height, TileQuarry parent) { @@ -68,38 +53,19 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw this.motionZ = 0.0; setArmSize(width, height); setHead(i, j - 2, k); - setTarget(i, j - 2, k); noClip = true; - inProgressionXZ = false; - inProgressionY = false; this.parent = parent; parent.setArm(this); updatePosition(); } - public void setArmSpeed(double speed) - { - dataWatcher.updateObject(8, (int)(speed * 8000D)); - } - - public double getArmSpeed() - { - return dataWatcher.getWatchableObjectInt(8) / 8000D; - } - void setHead(double x, double y, double z) { - dataWatcher.updateObject(2, ((int)(x * 32D))); - dataWatcher.updateObject(3, ((int)(y * 32D))); - dataWatcher.updateObject(4, ((int)(z * 32D))); - } - - void setTarget(double x, double y, double z) { - dataWatcher.updateObject(5, ((int)(x * 32D))); - dataWatcher.updateObject(6, ((int)(y * 32D))); - dataWatcher.updateObject(7, ((int)(z * 32D))); + this.headX = (int) (x * 32D); + this.headY = (int) (y * 32D); + this.headZ = (int) (z * 32D); } private void setArmSize(double x, double z) @@ -151,7 +117,6 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw { parent = (TileQuarry) te; parent.setArm(this); - } else { @@ -170,13 +135,8 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw @Override public void onUpdate() { - if (worldObj.isRemote) - { - super.onUpdate(); - updatePosition(); - return; - } super.onUpdate(); + updatePosition(); if (parent == null) { findAndJoinQuarry(); @@ -187,69 +147,6 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw setDead(); return; } - - double[] target = getTarget(); - double[] head = getHead(); - - double dX = target[0] - head[0]; - double dY = target[1] - head[1]; - double dZ = target[2] - head[2]; - - if (dX != 0 || dY != 0 || dZ != 0) - { - angle = Math.atan2(target[2]-head[2], target[0]-head[0]); - inProgressionXZ = true; - inProgressionY = true; - } - - if (getArmSpeed() > 0) { - doMove(getArmSpeed()); - } - } - - public void doMove(double instantSpeed) { - double[] target = getTarget(); - double[] head = getHead(); - - if (inProgressionXZ) { - if (Math.abs(target[0] - head[0]) < instantSpeed * 2 && Math.abs(target[2] - head[2]) < instantSpeed * 2) { - head[0] = target[0]; - head[2] = target[2]; - - inProgressionXZ = false; - - if (listener != null && !inProgressionY) { - listener.positionReached(this); - head[1] = target[1]; - } - } else { - head[0] += Math.cos(angle) * instantSpeed; - head[2] += Math.sin(angle) * instantSpeed; - } - setHead(head[0], head[1], head[2]); - } - - if (inProgressionY) { - if (Math.abs(target[1] - head[1]) < instantSpeed * 2) { - head[1] = target[1]; - - inProgressionY = false; - - if (listener != null && !inProgressionXZ) { - listener.positionReached(this); - head[0] = target[0]; - head[2] = target[2]; - } - } else { - if (target[1] > head[1]) { - head[1] += instantSpeed / 2; - } else { - head[1] -= instantSpeed / 2; - } - } - setHead(head[0],head[1],head[2]); - } - updatePosition(); } public void updatePosition() { @@ -262,13 +159,6 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw } - public void joinToWorld(World w) { - if (!w.isRemote) - { - w.spawnEntityInWorld(this); - } - } - @Override public void setDead() { if (worldObj!=null && worldObj.isRemote) @@ -281,27 +171,8 @@ public class EntityMechanicalArm extends Entity implements IEntityAdditionalSpaw super.setDead(); } - @Override - public void writeSpawnData(ByteArrayDataOutput data) { - data.writeDouble(armSizeX); - data.writeDouble(armSizeZ); - } - - @Override - public void readSpawnData(ByteArrayDataInput data) { - armSizeX = data.readDouble(); - armSizeZ = data.readDouble(); - setArmSize(armSizeX, armSizeZ); - updatePosition(); - } - - public double[] getTarget() + private double[] getHead() { - return new double[] { this.dataWatcher.getWatchableObjectInt(5) / 32D, this.dataWatcher.getWatchableObjectInt(6) / 32D, this.dataWatcher.getWatchableObjectInt(7) / 32D }; - } - - public double[] getHead() - { - return new double[] { this.dataWatcher.getWatchableObjectInt(2) / 32D, this.dataWatcher.getWatchableObjectInt(3) / 32D, this.dataWatcher.getWatchableObjectInt(4) / 32D }; + return new double[] { this.headX / 32D, this.headY / 32D, this.headZ / 32D }; } } diff --git a/common/buildcraft/factory/IArmListener.java b/common/buildcraft/factory/IArmListener.java deleted file mode 100644 index 28f247d3..00000000 --- a/common/buildcraft/factory/IArmListener.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) SpaceToad, 2011 - * 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; - -public interface IArmListener { - - public void positionReached(EntityMechanicalArm arm); - -} diff --git a/common/buildcraft/factory/TileQuarry.java b/common/buildcraft/factory/TileQuarry.java index 3c6520c3..a294bd6f 100644 --- a/common/buildcraft/factory/TileQuarry.java +++ b/common/buildcraft/factory/TileQuarry.java @@ -40,37 +40,36 @@ import net.minecraft.src.Block; import net.minecraft.src.EntityItem; import net.minecraft.src.EntityPlayer; import net.minecraft.src.ItemStack; +import net.minecraft.src.MathHelper; import net.minecraft.src.NBTTagCompound; -public class TileQuarry extends TileMachine implements IArmListener, IMachine, IPowerReceptor, IPipeConnection, IBuilderInventory { - - boolean isDigging = false; - +public class TileQuarry extends TileMachine implements IMachine, IPowerReceptor, IPipeConnection, IBuilderInventory { public @TileNetworkData Box box = new Box(); public @TileNetworkData boolean inProcess = false; - - public EntityMechanicalArm arm; public @TileNetworkData int targetX, targetY, targetZ; public @TileNetworkData double headPosX, headPosY, headPosZ; public @TileNetworkData double speed = 0.03; - - public EntityRobot builder; public @TileNetworkData boolean builderDone = false; + + public EntityRobot builder; BptBuilderBase bluePrintBuilder; + public EntityMechanicalArm arm; + public IPowerProvider powerProvider; + boolean isDigging = false; + public static int MAX_ENERGY = 7000; public TileQuarry() { - powerProvider = PowerFramework.currentFramework.createPowerProvider(); powerProvider.configure(20, 25, 25, 25, MAX_ENERGY); } @@ -95,6 +94,10 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I if (findTarget(false)) { isDigging = true; + if (box != null && (( headPosX < box.xMin || headPosX > box.xMax) || (headPosZ < box.zMin || headPosZ > box.zMax))) + { + setHead(box.xMin + 1, yCoord + 2, box.zMin + 1); + } } } else { @@ -105,10 +108,12 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I } private boolean loadDefaultBoundaries = false; + private boolean movingHorizontally; + private boolean movingVertically; + private double headTrajectory; private void createArm() { -// worldObj.getEntitiesWithinAABB(EntityMechanicalArm.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord)); worldObj.spawnEntityInWorld(new EntityMechanicalArm(worldObj, box.xMin + Utils.pipeMaxPos, yCoord + bluePrintBuilder.bluePrint.sizeY - 1 + Utils.pipeMinPos, box.zMin + Utils.pipeMaxPos, @@ -120,38 +125,21 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I public void setArm(EntityMechanicalArm arm) { this.arm = arm; - arm.listener = this; - isDigging = true; } @Override public void updateEntity() { super.updateEntity(); - - if (inProcess && arm != null) { - - arm.setArmSpeed(0); + if (inProcess) { float energyToUse = 2 + powerProvider.getEnergyStored() / 1000; - boolean enoughStep=(0.015 + energyToUse / 200F)>(1F/32F); // (otherwise the movement is rounded to 0 and the energy absorbed with no movement) - if(enoughStep){ - float energy = powerProvider.useEnergy(energyToUse, energyToUse, true); + float energy = powerProvider.useEnergy(energyToUse, energyToUse, true); - if (energy > 0) { - arm.doMove(0.015 + energy / 200F); - } + if (energy > 0) { + moveHead(0.05 + energy / 200F); } } - if (arm != null) { - double[] head = arm.getHead(); - headPosX = head[0]; - headPosY = head[1]; - headPosZ = head[2]; - - speed = arm.getArmSpeed(); - } - if (CoreProxy.proxy.isSimulating(worldObj)) { sendNetworkUpdate(); } @@ -210,7 +198,6 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I } protected void dig() { - powerProvider.configure(20, 30, 200, 50, MAX_ENERGY); if (powerProvider.useEnergy(30, 30, true) != 30) { return; @@ -220,14 +207,20 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I //I believe the issue is box going null becuase of bad chunkloader positioning if (arm != null && box != null) - arm.setTarget((double)box.xMin + (box.xMax - box.xMin) / 2D, yCoord + 2D, (double)box.zMin + ( box.zMax - box.zMin) / 2D); + setTarget(box.xMin + 1, yCoord + 2, box.zMin + 1); isDigging = false; } inProcess = true; + movingHorizontally = true; + movingVertically = true; + double[] head = getHead(); + int[] target = getTarget(); + headTrajectory = Math.atan2(target[2] -head[2], target[0] -head[0]); } + public boolean findTarget(boolean doSet) { if (worldObj.isRemote) @@ -276,8 +269,8 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I if (isUnquarriableBlock(blockId, bx, by, bz)) { blockedColumns[searchX][searchZ] = true; } else if (isQuarriableBlock(blockId, bx, by + 1, bz)) { - if (doSet && arm != null) { - arm.setTarget(bx, by + 1, bz); + if (doSet) { + setTarget(bx, by + 1, bz); } return true; @@ -345,19 +338,14 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I nbttagcompound.setTag("box", boxTag); } - @Override - public void positionReached(EntityMechanicalArm arm) { + public void positionReached() { inProcess = false; + System.out.println("PositionReached!" + Thread.currentThread()); if (worldObj.isRemote) { return; } - double[] targ = arm.getTarget(); - targetX = (int)targ[0]; - targetY = (int)targ[1]; - targetZ = (int)targ[2]; - int i = targetX; int j = targetY - 1; int k = targetZ; @@ -379,12 +367,13 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I } } + worldObj.playAuxSFXAtEntity(null, 2001, i, j, k, blockId + (worldObj.getBlockMetadata(i, j, k) << 12)); worldObj.setBlockWithNotify(i, j, k, 0); } // Collect any lost items laying around - double[] armHead = arm.getHead(); - AxisAlignedBB axis = AxisAlignedBB.getBoundingBox(armHead[0] - 1.5, armHead[1], armHead[2] - 1.5, armHead[0] + 2.5, armHead[1] + 2.5, armHead[2] + 2.5); + double[] head = getHead(); + AxisAlignedBB axis = AxisAlignedBB.getBoundingBox(head[0] - 1.5, head[1], head[2] - 1.5, head[0] + 2.5, head[1] + 2.5, head[2] + 2.5); List result = worldObj.getEntitiesWithinAABB(EntityItem.class, axis); for (int ii = 0; ii < result.size(); ii++) { if (result.get(ii) instanceof EntityItem) { @@ -400,7 +389,7 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I } private void mineStack(ItemStack stack) { - + // First, try to add to a nearby chest ItemStack added = Utils.addToRandomInventory(stack, worldObj, xCoord, yCoord, zCoord, Orientations.Unknown); stack.stackSize -= added.stackSize; @@ -576,11 +565,10 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I super.postPacketHandling(packet); createUtilsIfNeeded(); -// + if (arm != null) { arm.setHead(headPosX, headPosY, headPosZ); -// arm.setTarget(targetX, targetY, targetZ); -// arm.setArmSpeed(speed); + arm.updatePosition(); } } @@ -681,4 +669,76 @@ public class TileQuarry extends TileMachine implements IArmListener, IMachine, I return false; } + public void moveHead(double instantSpeed) { + int[] target = getTarget(); + double[] head = getHead(); + + if (movingHorizontally) { + if (Math.abs(target[0] - head[0]) < instantSpeed * 2 && Math.abs(target[2] - head[2]) < instantSpeed * 2) { + head[0] = target[0]; + head[2] = target[2]; + + movingHorizontally = false; + + if (!movingVertically) { + positionReached(); + head[1] = target[1]; + } + } else { + head[0] += Math.cos(headTrajectory) * instantSpeed; + head[2] += Math.sin(headTrajectory) * instantSpeed; + } + setHead(head[0], head[1], head[2]); + } + + if (movingVertically) { + if (Math.abs(target[1] - head[1]) < instantSpeed * 2) { + head[1] = target[1]; + + movingVertically = false; + if (!movingHorizontally) { + positionReached(); + head[0] = target[0]; + head[2] = target[2]; + } + } else { + if (target[1] > head[1]) { + head[1] += instantSpeed; + } else { + head[1] -= instantSpeed; + } + } + setHead(head[0],head[1],head[2]); + } + + updatePosition(); + } + + private void updatePosition() { + if (arm!=null && worldObj.isRemote) + { + arm.setHead(headPosX, headPosY, headPosZ); + arm.updatePosition(); + } + } + + private void setHead(double x, double y, double z) { + this.headPosX = x; + this.headPosY = y; + this.headPosZ = z; + } + + private double[] getHead() { + return new double[] { headPosX, headPosY, headPosZ }; + } + + private int[] getTarget() { + return new int[] { targetX, targetY, targetZ }; + } + private void setTarget(int x, int y, int z) { + this.targetX = x; + this.targetY = y; + this.targetZ = z; + } + }