153 lines
3.9 KiB
Java
153 lines
3.9 KiB
Java
/**
|
|
* Copyright (c) 2011-2017, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
* <p/>
|
|
* 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.builders;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.world.World;
|
|
|
|
import buildcraft.core.lib.EntityBlock;
|
|
|
|
public class EntityMechanicalArm extends Entity {
|
|
|
|
protected TileQuarry parent;
|
|
|
|
private double armSizeX;
|
|
private double armSizeZ;
|
|
private double xRoot;
|
|
private double yRoot;
|
|
private double zRoot;
|
|
|
|
private int headX, headY, headZ;
|
|
private EntityBlock xArm, yArm, zArm, head;
|
|
|
|
public EntityMechanicalArm(World world) {
|
|
super(world);
|
|
makeParts(world);
|
|
noClip = true;
|
|
}
|
|
|
|
public EntityMechanicalArm(World world, double x, double y, double z, double width, double height, TileQuarry parent) {
|
|
this(world);
|
|
setPositionAndRotation(parent.xCoord, parent.yCoord, parent.zCoord, 0, 0);
|
|
this.xRoot = x;
|
|
this.yRoot = y;
|
|
this.zRoot = z;
|
|
this.motionX = 0.0;
|
|
this.motionY = 0.0;
|
|
this.motionZ = 0.0;
|
|
setArmSize(width, height);
|
|
setHead(x, y - 2, z);
|
|
this.parent = parent;
|
|
parent.setArm(this);
|
|
updatePosition();
|
|
}
|
|
|
|
void setHead(double x, double y, double z) {
|
|
this.headX = (int) (x * 32D);
|
|
this.headY = (int) (y * 32D);
|
|
this.headZ = (int) (z * 32D);
|
|
}
|
|
|
|
private void setArmSize(double x, double z) {
|
|
armSizeX = x;
|
|
xArm.iSize = x;
|
|
armSizeZ = z;
|
|
zArm.kSize = z;
|
|
updatePosition();
|
|
}
|
|
|
|
private void makeParts(World world) {
|
|
xArm = BuilderProxy.proxy.newDrill(world, 0, 0, 0, 1, 0.5, 0.5, true);
|
|
yArm = BuilderProxy.proxy.newDrill(world, 0, 0, 0, 0.5, 1, 0.5, false);
|
|
zArm = BuilderProxy.proxy.newDrill(world, 0, 0, 0, 0.5, 0.5, 1, true);
|
|
|
|
head = BuilderProxy.proxy.newDrillHead(world, 0, 0, 0, 0.2, 1, 0.2);
|
|
head.shadowSize = 1.0F;
|
|
|
|
world.spawnEntityInWorld(xArm);
|
|
world.spawnEntityInWorld(yArm);
|
|
world.spawnEntityInWorld(zArm);
|
|
world.spawnEntityInWorld(head);
|
|
}
|
|
|
|
@Override
|
|
protected void entityInit() {
|
|
}
|
|
|
|
@Override
|
|
protected void readEntityFromNBT(NBTTagCompound nbttagcompound) {
|
|
xRoot = nbttagcompound.getDouble("xRoot");
|
|
yRoot = nbttagcompound.getDouble("yRoot");
|
|
zRoot = nbttagcompound.getDouble("zRoot");
|
|
armSizeX = nbttagcompound.getDouble("armSizeX");
|
|
armSizeZ = nbttagcompound.getDouble("armSizeZ");
|
|
setArmSize(armSizeX, armSizeZ);
|
|
updatePosition();
|
|
}
|
|
|
|
private void findAndJoinQuarry() {
|
|
TileEntity te = worldObj.getTileEntity((int) posX, (int) posY, (int) posZ);
|
|
if (te instanceof TileQuarry) {
|
|
parent = (TileQuarry) te;
|
|
parent.setArm(this);
|
|
} else {
|
|
setDead();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void writeEntityToNBT(NBTTagCompound nbttagcompound) {
|
|
nbttagcompound.setDouble("xRoot", xRoot);
|
|
nbttagcompound.setDouble("yRoot", yRoot);
|
|
nbttagcompound.setDouble("zRoot", zRoot);
|
|
nbttagcompound.setDouble("armSizeX", armSizeX);
|
|
nbttagcompound.setDouble("armSizeZ", armSizeZ);
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
super.onUpdate();
|
|
updatePosition();
|
|
if (parent == null) {
|
|
findAndJoinQuarry();
|
|
}
|
|
|
|
if (parent == null) {
|
|
setDead();
|
|
return;
|
|
}
|
|
}
|
|
|
|
public void updatePosition() {
|
|
double[] headT = getHead();
|
|
this.xArm.setPosition(xRoot, yRoot, headT[2] + 0.25);
|
|
this.yArm.jSize = yRoot - headT[1] - 1;
|
|
this.yArm.setPosition(headT[0] + 0.25, headT[1] + 1, headT[2] + 0.25);
|
|
this.zArm.setPosition(headT[0] + 0.25, yRoot, zRoot);
|
|
this.head.setPosition(headT[0] + 0.4, headT[1], headT[2] + 0.4);
|
|
}
|
|
|
|
@Override
|
|
public void setDead() {
|
|
if (worldObj != null && worldObj.isRemote) {
|
|
xArm.setDead();
|
|
yArm.setDead();
|
|
zArm.setDead();
|
|
head.setDead();
|
|
}
|
|
super.setDead();
|
|
}
|
|
|
|
private double[] getHead() {
|
|
return new double[]{this.headX / 32D, this.headY / 32D, this.headZ / 32D};
|
|
}
|
|
}
|