From d94cc46cef231690530447793bf1a7df12875ae7 Mon Sep 17 00:00:00 2001 From: Henry Mao Date: Sun, 3 Feb 2013 13:50:50 +0800 Subject: [PATCH] Got Armbots to render items properly --- .../client/render/RenderArmbot.java | 35 +++--- .../machine/armbot/TileEntityArmbot.java | 116 +++++++++++------- .../common/machine/command/CommandDrop.java | 23 +--- .../machine/command/CommandManager.java | 20 ++- 4 files changed, 102 insertions(+), 92 deletions(-) diff --git a/src/minecraft/assemblyline/client/render/RenderArmbot.java b/src/minecraft/assemblyline/client/render/RenderArmbot.java index 46e407e6..5b0eb553 100644 --- a/src/minecraft/assemblyline/client/render/RenderArmbot.java +++ b/src/minecraft/assemblyline/client/render/RenderArmbot.java @@ -25,7 +25,7 @@ public class RenderArmbot extends TileEntitySpecialRenderer public static final String TEXTURE = "armbot.png"; @Override - public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { if (tileEntity instanceof TileEntityArmbot) { @@ -51,33 +51,32 @@ public class RenderArmbot extends TileEntitySpecialRenderer MODEL.render(0.0625f, ((TileEntityArmbot) tileEntity).renderYaw, ((TileEntityArmbot) tileEntity).renderPitch); - // debug render - /* - * GL11.glEnable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_ALPHA_TEST); - * GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1f, - * 1f, 1f, 0.25f); MODEL.render(0.0625f, ((TileEntityArmbot) tileEntity).rotationYaw, - * ((TileEntityArmbot) tileEntity).rotationPitch); GL11.glColor4f(1f, 1f, 1f, 1f); - */ + GL11.glPopMatrix(); - Vector3 handPos = ((TileEntityArmbot) tileEntity).getHandPosition(); - handPos.subtract(new Vector3(tileEntity)); - GL11.glPushMatrix(); - GL11.glRotatef(180, 0, 0, 1); + Vector3 handPosition = ((TileEntityArmbot) tileEntity).getDeltaHandPosition(); + handPosition.add(0.5); + handPosition.add(new Vector3(x, y, z)); + RenderItem renderItem = ((RenderItem) RenderManager.instance.getEntityClassRenderObject(EntityItem.class)); + RenderEngine renderEngine = Minecraft.getMinecraft().renderEngine; for (ItemStack itemStack : ((TileEntityArmbot) tileEntity).getGrabbedItems()) { // Items don't move right, so we render them manually if (itemStack != null) { - RenderItem renderItem = ((RenderItem) RenderManager.instance.getEntityClassRenderObject(EntityItem.class)); - RenderEngine renderEngine = Minecraft.getMinecraft().renderEngine; - renderItem.renderItemIntoGUI(this.getFontRenderer(), renderEngine, itemStack, 0, 0); + if (((TileEntityArmbot) tileEntity).renderEntityItem == null) + { + ((TileEntityArmbot) tileEntity).renderEntityItem = new EntityItem(tileEntity.worldObj, 0, 0, 0, itemStack); + } + else if (!itemStack.isItemEqual(((TileEntityArmbot) tileEntity).renderEntityItem.getEntityItem())) + { + ((TileEntityArmbot) tileEntity).renderEntityItem = new EntityItem(tileEntity.worldObj, 0, 0, 0, itemStack); + } + renderItem.doRenderItem(((TileEntityArmbot) tileEntity).renderEntityItem, handPosition.x, handPosition.y, handPosition.z, 0, f); + break; } } - GL11.glPopMatrix(); - GL11.glPopMatrix(); } } - } \ No newline at end of file diff --git a/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java b/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java index 6b765f1b..d6fc653f 100644 --- a/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java +++ b/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java @@ -5,6 +5,7 @@ import java.io.DataInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.EnumSet; +import java.util.Iterator; import java.util.List; import net.minecraft.block.Block; @@ -83,6 +84,11 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult private final List grabbedEntities = new ArrayList(); private final List grabbedItems = new ArrayList(); + /** + * Client Side Object Storage + */ + public EntityItem renderEntityItem = null; + @Override public void initiate() { @@ -145,7 +151,8 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult if (this.disk == null && this.computersAttached == 0) { this.commandManager.clear(); - if (this.grabbedEntities.size() > 0) + + if (this.grabbedEntities.size() > 0 || this.grabbedItems.size() > 0) { this.addCommand(CommandDrop.class); } @@ -301,20 +308,23 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult { Vector3 position = new Vector3(this); position.add(0.5); + position.add(this.getDeltaHandPosition()); + return position; + } + + public Vector3 getDeltaHandPosition() + { // The distance of the position relative to the main position. double distance = 1f; Vector3 delta = new Vector3(); // The delta Y of the hand. - delta.y = Math.sin(Math.toRadians(this.renderPitch)) * distance * 2; // arm bend up in a - // taller-than-wide - // arc + delta.y = Math.sin(Math.toRadians(this.renderPitch)) * distance * 2; // The horizontal delta of the hand. double dH = Math.cos(Math.toRadians(this.renderPitch)) * distance; // The delta X and Z. delta.x = Math.sin(Math.toRadians(-this.renderYaw)) * dH; delta.z = Math.cos(Math.toRadians(-this.renderYaw)) * dH; - position.add(delta); - return position; + return delta; } @Override @@ -489,10 +499,7 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult this.displayText = nbt.getString("cmdText"); } } - /* - * NBTTagCompound cmdManager = nbt.getCompoundTag("cmdManager"); - * this.commandManager.readFromNBT(this, cmdManager); - */ + this.commandManager.setCurrentTask(nbt.getInteger("curTask")); NBTTagList entities = nbt.getTagList("entities"); @@ -506,6 +513,18 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult this.grabbedEntities.add(entity); } } + + NBTTagList items = nbt.getTagList("items"); + this.grabbedItems.clear(); + for (int i = 0; i < items.tagCount(); i++) + { + NBTTagCompound itemTag = (NBTTagCompound) items.tagAt(i); + if (itemTag != null) + { + ItemStack item = ItemStack.loadItemStackFromNBT(itemTag); + this.grabbedItems.add(item); + } + } } /** @@ -527,16 +546,12 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult nbt.setFloat("yaw", this.rotationYaw); nbt.setFloat("pitch", this.rotationPitch); - /* - * NBTTagCompound cmdManager = new NBTTagCompound("cmdManager"); - * this.commandManager.writeToNBT(cmdManager); nbt.setCompoundTag("cmdManager", cmdManager); - */ - nbt.setString("cmdText", this.displayText); nbt.setInteger("curTask", this.commandManager.getCurrentTask()); NBTTagList entities = new NBTTagList(); + for (Entity entity : grabbedEntities) { if (entity != null) @@ -549,6 +564,20 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult } nbt.setTag("entities", entities); + + NBTTagList items = new NBTTagList(); + + for (ItemStack itemStack : grabbedItems) + { + if (itemStack != null) + { + NBTTagCompound entityNBT = new NBTTagCompound(); + itemStack.writeToNBT(entityNBT); + items.appendTag(entityNBT); + } + } + + nbt.setTag("items", items); } @Override @@ -713,13 +742,14 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult } break; } - case 1: // rotateTo: rotates to a specific rotation + case 1: { + // rotateTo: rotates to a specific rotation if (arguments.length > 0) { try - // try to cast to Float - { + + {// try to cast to Float double yaw = (Double) arguments[0]; double pitch = (Double) arguments[1]; this.addCommand(CommandRotateTo.class, new String[] { Double.toString(yaw), Double.toString(pitch) }); @@ -736,29 +766,34 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult } break; } - case 2: // grab: grabs an item + case 2: { + // grab: grabs an item this.addCommand(CommandGrab.class); break; } - case 3: // drop: drops an item + case 3: { + // drop: drops an item this.addCommand(CommandDrop.class); break; } - case 4: // reset: equivalent to calling .clear() then .return() + case 4: { + // reset: equivalent to calling .clear() then .return() this.commandManager.clear(); this.addCommand(CommandReturn.class); break; } - case 5: // isWorking: returns whether or not the ArmBot is executing commands + case 5: { + // isWorking: returns whether or not the ArmBot is executing commands return new Object[] { this.commandManager.hasTasks() }; } - case 6: // touchingEntity: returns whether or not the ArmBot is touching an entity it is - // able to pick up + case 6: { + // touchingEntity: returns whether or not the ArmBot is touching an entity it is + // able to pick up Vector3 serachPosition = this.getHandPosition(); List 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)); @@ -766,16 +801,7 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult { 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 }; } + if (found.get(i) != null && !(found.get(i) instanceof EntityPlayer) && found.get(i).ridingEntity == null) { return new Object[] { true }; } } } @@ -786,8 +812,8 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult if (arguments.length > 0) { try - // try to cast to Float { + // try to cast to Float int times = (Integer) arguments[0]; this.addCommand(CommandUse.class, new String[] { Integer.toString(times) }); } @@ -808,8 +834,8 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult if (arguments.length > 0) { try - // try to cast to Float { + // try to cast to Float float strength = (float) ((double) ((Double) arguments[0])); this.addCommand(CommandFire.class, new String[] { Float.toString(strength) }); } @@ -825,18 +851,21 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult } break; } - case 9: // return: returns to home position + case 9: { + // return: returns to home position this.addCommand(CommandReturn.class); break; } - case 10: // clear: clears commands + case 10: { + // clear: clears commands this.commandManager.clear(); break; } - case 11: // isHolding: returns whether or not it is holding something + case 11: { + // isHolding: returns whether or not it is holding something return new Object[] { this.grabbedEntities.size() > 0 }; } } @@ -904,15 +933,20 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult @Override public void dropItem(ItemStack itemStack) { + Vector3 handPosition = this.getHandPosition(); + this.worldObj.spawnEntityInWorld(new EntityItem(worldObj, handPosition.x, handPosition.y, handPosition.z, itemStack)); this.grabbedItems.remove(itemStack); } @Override public void dropAll() { - for (ItemStack itemStack : this.grabbedItems) + Vector3 handPosition = this.getHandPosition(); + Iterator it = this.grabbedItems.iterator(); + + while (it.hasNext()) { - this.dropItem(itemStack); + this.worldObj.spawnEntityInWorld(new EntityItem(worldObj, handPosition.x, handPosition.y, handPosition.z, it.next())); } this.grabbedEntities.clear(); diff --git a/src/minecraft/assemblyline/common/machine/command/CommandDrop.java b/src/minecraft/assemblyline/common/machine/command/CommandDrop.java index 9500409d..c9022136 100644 --- a/src/minecraft/assemblyline/common/machine/command/CommandDrop.java +++ b/src/minecraft/assemblyline/common/machine/command/CommandDrop.java @@ -10,30 +10,9 @@ public class CommandDrop extends Command { super.doTask(); - if (this.tileEntity.getGrabbedEntities().size() == 0) - return false; - - for (Entity entity : this.tileEntity.getGrabbedEntities()) - { - if (entity != null) - { - entity.isDead = false; - entity.worldObj = this.tileEntity.worldObj; - - if (entity instanceof EntityItem) - { - if (!world.isRemote) - { - // TODO: This causes crash. - // world.spawnEntityInWorld(entity); - } - } - } - } - + this.tileEntity.dropAll(); this.world.playSound(this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, "random.pop", 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F, true); - this.tileEntity.getGrabbedEntities().clear(); return false; } diff --git a/src/minecraft/assemblyline/common/machine/command/CommandManager.java b/src/minecraft/assemblyline/common/machine/command/CommandManager.java index 2681228a..418f690f 100644 --- a/src/minecraft/assemblyline/common/machine/command/CommandManager.java +++ b/src/minecraft/assemblyline/common/machine/command/CommandManager.java @@ -11,11 +11,11 @@ import cpw.mods.fml.common.FMLLog; public class CommandManager { - private final List tasks = new ArrayList(); + private final List tasks = new ArrayList(); - private int ticks = 0; - private int currentTask = 0; - private int lastTask = -1; + private int ticks = 0; + private int currentTask = 0; + private int lastTask = -1; /** * Must be called every tick by a tileEntity. @@ -45,17 +45,14 @@ public class CommandManager task.onTaskStart(); } - // if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) - // System.out.println("curTask: " + this.currentTask + ": " + - // this.tasks.get(this.currentTask).toString().substring(this.tasks.get(this.currentTask).toString().lastIndexOf('.') - // + 1)); - if (!task.doTask()) { int tempCurrentTask = this.currentTask; task.onTaskEnd(); this.currentTask++; - if (!(task instanceof CommandRepeat)) // repeat needs to be persistent + + // Repeat needs to be persistent + if (!(task instanceof CommandRepeat)) { // End the task and reinitialize it into a new class to make sure it is // fresh. @@ -99,7 +96,8 @@ public class CommandManager } /** - * Used to register Tasks for a TileEntity, executes onTaskStart for the Task after registering it + * Used to register Tasks for a TileEntity, executes onTaskStart for the Task after registering + * it * * @param tileEntity TE instance to register the task for * @param newCommand Task instance to register