Finished implementing CC API for armbots

This commit is contained in:
Brian Ricketts 2013-01-18 21:51:38 -06:00
parent 189fc9b857
commit 86fd779608
5 changed files with 113 additions and 54 deletions

View file

@ -21,6 +21,7 @@ import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet250CustomPayload;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import universalelectricity.core.electricity.ElectricityConnections; import universalelectricity.core.electricity.ElectricityConnections;
import universalelectricity.core.implement.IJouleStorage; import universalelectricity.core.implement.IJouleStorage;
@ -60,6 +61,7 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
public double wattsReceived = 0; public double wattsReceived = 0;
private int playerUsing = 0; private int playerUsing = 0;
private int computersAttached = 0; private int computersAttached = 0;
private List<IComputerAccess> connectedComputers = new ArrayList<IComputerAccess>();
/** /**
* The rotation of the arms. In Degrees. * The rotation of the arms. In Degrees.
*/ */
@ -175,13 +177,28 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
{ {
float speed; float speed;
if (this.renderYaw > this.rotationYaw) if (this.renderYaw > this.rotationYaw)
speed = -this.ROTATION_SPEED; if (Math.abs(this.renderYaw - this.rotationYaw) > 180)
speed = this.ROTATION_SPEED;
else
speed = -this.ROTATION_SPEED;
else else
speed = this.ROTATION_SPEED; if (Math.abs(this.renderYaw - this.rotationYaw) > 180)
// System.out.println("Speed: " + speed); speed = -this.ROTATION_SPEED;
// System.out.println("Yaw: [" + this.rotationYaw + ", " + this.renderYaw + "]"); else
speed = this.ROTATION_SPEED;
this.renderYaw += speed; this.renderYaw += speed;
if (this.ticks % 5 == 0) //sound is 0.5 seconds long (20 ticks/second)
if (this.renderYaw <= -360)
{
this.renderYaw += 360;
}
if (this.renderYaw >= 360)
{
this.renderYaw -= 360;
}
if (this.ticks % 5 == 0) // sound is 0.5 seconds long (20 ticks/second)
Minecraft.getMinecraft().sndManager.playSound("assemblyline.conveyor", this.xCoord, this.yCoord, this.zCoord, 2f, 1.7f); Minecraft.getMinecraft().sndManager.playSound("assemblyline.conveyor", this.xCoord, this.yCoord, this.zCoord, 2f, 1.7f);
if (Math.abs(this.renderYaw - this.rotationYaw) < this.ROTATION_SPEED + 0.1f) if (Math.abs(this.renderYaw - this.rotationYaw) < this.ROTATION_SPEED + 0.1f)
{ {
@ -225,7 +242,7 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
{ {
NBTTagCompound nbt = new NBTTagCompound(); NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt); writeToNBT(nbt);
return PacketManager.getPacket(AssemblyLine.CHANNEL, this, this.powerTransferRange, this.commandManager.getCurrentTask(), nbt); return PacketManager.getPacket(AssemblyLine.CHANNEL, this, this.powerTransferRange, nbt);
} }
/** /**
@ -246,7 +263,6 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
y = dis.readInt(); y = dis.readInt();
z = dis.readInt(); z = dis.readInt();
this.powerTransferRange = dis.readInt(); this.powerTransferRange = dis.readInt();
this.commandManager.setCurrentTask(dis.readInt());
NBTTagCompound tag = Packet.readNBTTagCompound(dis); NBTTagCompound tag = Packet.readNBTTagCompound(dis);
readFromNBT(tag); readFromNBT(tag);
} }
@ -512,6 +528,11 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
} }
} }
} }
else
{
this.commandManager.addCommand(this, Command.getCommand("DROP"));
this.commandManager.addCommand(this, Command.getCommand("RETURN"));
}
} }
@Override @Override
@ -538,12 +559,12 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
@Override @Override
public String[] getMethodNames() public String[] getMethodNames()
{ {
return new String[] { "rotateBy", "rotateTo", "grab", "drop", "reset", "isWorking" }; return new String[] { "rotate", "grab", "drop", "reset", "isWorking", "touchingEntity" };
} }
@Override @Override
public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception
{ {
switch (method) switch (method)
{ {
case 0: // rotateBy: rotates by a certain amount case 0: // rotateBy: rotates by a certain amount
@ -555,10 +576,6 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
{ {
double angle = (Double) arguments[0]; double angle = (Double) arguments[0];
this.commandManager.addCommand(this, CommandRotate.class, new String[] { Double.toString(angle) }); this.commandManager.addCommand(this, CommandRotate.class, new String[] { Double.toString(angle) });
while (this.commandManager.hasTasks())
{
Thread.sleep(1);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -572,49 +589,42 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
} }
break; break;
} }
case 1: // rotateTo: rotates to an absolute angle (0 is idle position, increases clockwise) case 1: // grab: grabs an item
{
if (arguments.length > 0)
{
try
{
double angle = (Double) arguments[0];
double diff = angle - this.rotationYaw;
this.commandManager.addCommand(this, CommandRotate.class, new String[] { Double.toString(diff) });
while (this.commandManager.hasTasks())
;
}
catch (Exception ex)
{
ex.printStackTrace();
throw new IllegalArgumentException("expected number");
}
}
else
{
throw new IllegalArgumentException("expected number");
}
break;
}
case 2: // grab: grabs an item
{ {
this.commandManager.addCommand(this, CommandGrab.class); this.commandManager.addCommand(this, CommandGrab.class);
break; break;
} }
case 3: // drop: drops an item case 2: // drop: drops an item
{ {
this.commandManager.addCommand(this, CommandDrop.class); this.commandManager.addCommand(this, CommandDrop.class);
break; break;
} }
case 4: // reset: calls the RETURN command case 3: // reset: clears the queue and calls the RETURN command
{ {
this.commandManager.clear();
this.commandManager.addCommand(this, CommandReturn.class); this.commandManager.addCommand(this, CommandReturn.class);
break; break;
} }
case 5: // isWorking: returns whether or not the ArmBot is executing commands case 4: // isWorking: returns whether or not the ArmBot is executing commands
{ {
return new Object[] { this.commandManager.hasTasks() }; return new Object[] { this.commandManager.hasTasks() };
} }
case 5: // touchingEntity: returns whether or not the ArmBot is touching an entity it is able to pick up
{
Vector3 serachPosition = this.getHandPosition();
List<Entity> found = this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(serachPosition.x - 0.5f, serachPosition.y - 0.5f, serachPosition.z - 0.5f, serachPosition.x + 0.5f, serachPosition.y + 0.5f, serachPosition.z + 0.5f));
if (found != null && found.size() > 0)
{
for (int i = 0; i < found.size(); i++)
{
if (found.get(i) != null && !(found.get(i) instanceof EntityPlayer) && found.get(i).ridingEntity == null) // isn't null, isn't a player, and isn't riding anything
{ return new Object[] { true }; }
}
}
return new Object[] { false };
}
} }
return null; return null;
} }
@ -629,12 +639,20 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult
public void attach(IComputerAccess computer) public void attach(IComputerAccess computer)
{ {
computersAttached++; computersAttached++;
synchronized (connectedComputers)
{
connectedComputers.add(computer);
}
} }
@Override @Override
public void detach(IComputerAccess computer) public void detach(IComputerAccess computer)
{ {
computersAttached--; computersAttached--;
synchronized (connectedComputers)
{
connectedComputers.remove(computer);
}
} }
} }

View file

@ -129,6 +129,40 @@ public abstract class Command
return 0; return 0;
} }
protected Double getDoubleArg(int i)
{
if (getArg(i) != null)
{
try
{
return Double.parseDouble(getArg(i));
}
catch (Exception e)
{
}
}
return 0.0;
}
protected Float getFloatArg(int i)
{
if (getArg(i) != null)
{
try
{
return Float.parseFloat(getArg(i));
}
catch (Exception e)
{
}
}
return 0.0f;
}
public void writeToNBT(NBTTagCompound taskCompound) public void writeToNBT(NBTTagCompound taskCompound)
{ {

View file

@ -48,16 +48,6 @@ public class CommandGrab extends Command
this.tileEntity.worldObj.removeEntity(found.get(i)); //items don't move right, so we render them manually this.tileEntity.worldObj.removeEntity(found.get(i)); //items don't move right, so we render them manually
Minecraft.getMinecraft().sndManager.playSound("random.pop", this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F); Minecraft.getMinecraft().sndManager.playSound("random.pop", this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F);
found.get(i).isDead = false; found.get(i).isDead = false;
/*if (found.get(i).riddenByEntity != null)
{
found.get(i).riddenByEntity.ridingEntity = null;
found.get(i).riddenByEntity = null;
}
if (found.get(i).ridingEntity != null)
{
found.get(i).ridingEntity.riddenByEntity = null;
found.get(i).ridingEntity = null;
}*/
return false; return false;
} }
} }

View file

@ -33,6 +33,7 @@ public class CommandManager
if (this.currentTask < 0) if (this.currentTask < 0)
{ {
this.currentTask = 0; this.currentTask = 0;
this.lastTask = -1;
} }
Command task = this.tasks.get(this.currentTask); Command task = this.tasks.get(this.currentTask);
@ -42,7 +43,9 @@ public class CommandManager
this.lastTask = this.currentTask; this.lastTask = this.currentTask;
task.onTaskStart(); task.onTaskStart();
} }
//System.out.print(Command.getCommandName(task.getClass()) + "|");
if (!task.doTask()) if (!task.doTask())
{ {
// End the task and reinitiate it into a new class to make sure it is fresh. // End the task and reinitiate it into a new class to make sure it is fresh.
@ -51,6 +54,18 @@ public class CommandManager
task.onTaskEnd(); task.onTaskEnd();
this.tasks.set(tempCurrentTask, this.getNewCommand(task.tileEntity, task.getClass(), task.getArgs())); this.tasks.set(tempCurrentTask, this.getNewCommand(task.tileEntity, task.getClass(), task.getArgs()));
} }
/*for (Command command : this.tasks)
{
System.out.print(Command.getCommandName(command.getClass()));
System.out.print("; ");
}
System.out.println(this.currentTask);*/
}
else
{
this.clear();
} }
} }
} }
@ -110,7 +125,7 @@ public class CommandManager
*/ */
public boolean hasTasks() public boolean hasTasks()
{ {
return !tasks.isEmpty(); return tasks.size() > 0;
} }
public List<Command> getCommands() public List<Command> getCommands()

View file

@ -15,6 +15,8 @@ public class CommandRotate extends Command
public void onTaskStart() public void onTaskStart()
{ {
super.onTaskStart(); super.onTaskStart();
this.ticks = 0;
if (this.getArg(0) == null) if (this.getArg(0) == null)
{ {
@ -22,7 +24,7 @@ public class CommandRotate extends Command
} }
else else
{ {
this.targetRotation = this.tileEntity.rotationYaw + this.getIntArg(0); this.targetRotation = this.tileEntity.rotationYaw + this.getFloatArg(0);
} }
while (this.targetRotation >= 360) while (this.targetRotation >= 360)