From ddd8e18aef6a7b9873d9b0084a2d988f37ce652d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 23 May 2014 18:55:19 +0200 Subject: [PATCH] Fixed robot energy storage somewhat. Improved picking of robots (avoid duplicate component ids). --- .../assets/opencomputers/lang/de_DE.lang | 2 +- .../assets/opencomputers/lang/en_US.lang | 2 +- .../li/cil/oc/common/block/RobotProxy.scala | 8 ++- .../oc/common/tileentity/Disassembler.scala | 2 +- .../li/cil/oc/common/tileentity/Robot.scala | 6 +- .../oc/common/tileentity/RobotAssembler.scala | 3 +- .../UpgradeInventoryController.scala | 2 +- .../server/driver/CompoundBlockDriver.scala | 5 -- src/main/scala/li/cil/oc/util/ItemUtils.scala | 56 +++++++++++++++---- 9 files changed, 58 insertions(+), 28 deletions(-) diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index a2e680357..25d309366 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -125,7 +125,7 @@ oc:gui.Robot.TurnOn=Einschalten oc:gui.RobotAssembler.CollectRobot=Roboter entnehmen oc:gui.RobotAssembler.Complexity=Komplexität: %s/%s oc:gui.RobotAssembler.InsertCase=Computergehäuse einlegen -oc:gui.RobotAssembler.Progress=Fortschritt: %s (%s) +oc:gui.RobotAssembler.Progress=Fortschritt: %s%% (%s) oc:gui.RobotAssembler.Run=Zusammenbauen oc:gui.ServerRack.None=Keine oc:gui.ServerRack.Back=Hinten diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 054f0e5d1..f32279397 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -125,7 +125,7 @@ oc:gui.Robot.TurnOn=Turn on oc:gui.RobotAssembler.CollectRobot=Collect robot oc:gui.RobotAssembler.Complexity=Complexity: %s/%s oc:gui.RobotAssembler.InsertCase=Insert a Computer Case -oc:gui.RobotAssembler.Progress=Progress: %s (%s) +oc:gui.RobotAssembler.Progress=Progress: %s%% (%s) oc:gui.RobotAssembler.Run=Assemble oc:gui.ServerRack.None=None oc:gui.ServerRack.Back=Back diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index 26065b677..95c8b1332 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -58,10 +58,11 @@ class RobotProxy(val parent: SpecialDelegator) extends RedstoneAware with Specia } if (stack.getTagCompound.hasKey(Settings.namespace + "storedEnergy")) { val energy = stack.getTagCompound.getInteger(Settings.namespace + "storedEnergy") - tooltip.addAll(Tooltip.get(unlocalizedName + "_StoredEnergy", energy)) + if (energy > 0) { + tooltip.addAll(Tooltip.get(unlocalizedName + "_StoredEnergy", energy)) + } } } - } @SideOnly(Side.CLIENT) @@ -75,7 +76,7 @@ class RobotProxy(val parent: SpecialDelegator) extends RedstoneAware with Specia override def pick(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int) = world.getBlockTileEntity(x, y, z) match { - case proxy: tileentity.RobotProxy => proxy.robot.info.createItemStack() + case proxy: tileentity.RobotProxy => proxy.robot.info.copyItemStack() case _ => null } @@ -160,6 +161,7 @@ class RobotProxy(val parent: SpecialDelegator) extends RedstoneAware with Specia case Some((robot, owner)) => robot.owner = owner robot.info.load(stack) + robot.bot.node.changeBuffer(robot.info.robotEnergy - robot.bot.node.localBuffer) robot.updateInventorySize() robot.updateMaxComponentCount() case _ => diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 14865f657..9bc1f7869 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -84,7 +84,7 @@ class Disassembler extends traits.Environment with traits.Inventory { queue += api.Items.get("case" + (info.tier + 1)).createItemStack(1) queue ++= info.containers queue ++= info.components - node.changeBuffer(info.energy) + node.changeBuffer(info.robotEnergy) } private def enqueueServer(server: ItemStack, serverTier: Int) { diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index 028665a49..56e8b6a4d 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -264,6 +264,8 @@ class Robot(val isRemote: Boolean) extends traits.Computer with traits.PowerInfo if (isServer) { globalBuffer = bot.node.globalBuffer globalBufferSize = bot.node.globalBufferSize + info.totalEnergy = globalBuffer.toInt + info.robotEnergy = bot.node.localBuffer.toInt updatePowerInformation() } else if (isRunning && isAnimatingMove) { @@ -319,9 +321,6 @@ class Robot(val isRemote: Boolean) extends traits.Computer with traits.PowerInfo swingingTool = nbt.getBoolean(Settings.namespace + "swingingTool") turnAxis = nbt.getByte(Settings.namespace + "turnAxis") } - - // TODO migration: xp to xp upgrade - // xp = nbt.getDouble(Settings.namespace + "xp") max 0 } // Side check for Waila (and other mods that may call this client side). @@ -407,6 +406,7 @@ class Robot(val isRemote: Boolean) extends traits.Computer with traits.PowerInfo super.onConnect(node) if (node == this.node) { node.connect(bot.node) + node.asInstanceOf[Connector].setLocalBufferSize(0) // There's a chance the server sends a robot tile entity to its clients // before the tile entity's first update was called, in which case the diff --git a/src/main/scala/li/cil/oc/common/tileentity/RobotAssembler.scala b/src/main/scala/li/cil/oc/common/tileentity/RobotAssembler.scala index 40aec4d3c..3ad11d8cd 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/RobotAssembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/RobotAssembler.scala @@ -53,7 +53,8 @@ class RobotAssembler extends traits.Environment with traits.Inventory with trait } val data = new ItemUtils.RobotData() data.name = ItemUtils.RobotData.randomName - data.energy = 50000 + data.robotEnergy = 50000 + data.totalEnergy = data.robotEnergy data.containers = items.take(4).drop(1).collect { case Some(item) => item } diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala b/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala index 90918fcc0..c2d5c14b2 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeInventoryController.scala @@ -38,7 +38,7 @@ class UpgradeInventoryController(val owner: TileEntity with Robot) extends Manag val slot = args.checkSlot(inventory, 1) if (!InventoryUtils.insertIntoInventorySlot(stack, inventory, facing.getOpposite, slot, count)) { // Cannot drop into that inventory. - return result(false, "inventory full") + return result(false, "inventory full/invalid slot") } else if (stack.stackSize == 0) { // Dropped whole stack. diff --git a/src/main/scala/li/cil/oc/server/driver/CompoundBlockDriver.scala b/src/main/scala/li/cil/oc/server/driver/CompoundBlockDriver.scala index 769b3494f..4cb2e9399 100644 --- a/src/main/scala/li/cil/oc/server/driver/CompoundBlockDriver.scala +++ b/src/main/scala/li/cil/oc/server/driver/CompoundBlockDriver.scala @@ -35,11 +35,6 @@ class CompoundBlockDriver(val blocks: driver.Block*) extends driver.Block { case named: NamedBlock => return named.preferredName case _ => } - // TODO Deprecated, remove in 1.3. - for (block <- blocks) block match { - case named: NamedBlock => return named.preferredName - case _ => - } try world.getBlockTileEntity(x, y, z) match { case inventory: IInventory if !Strings.isNullOrEmpty(inventory.getInvName) => return inventory.getInvName.stripPrefix("container.") } catch { diff --git a/src/main/scala/li/cil/oc/util/ItemUtils.scala b/src/main/scala/li/cil/oc/util/ItemUtils.scala index 3b6620c0f..9705bffac 100644 --- a/src/main/scala/li/cil/oc/util/ItemUtils.scala +++ b/src/main/scala/li/cil/oc/util/ItemUtils.scala @@ -1,15 +1,17 @@ package li.cil.oc.util -import net.minecraft.item.{ItemMap, Item, ItemStack} -import li.cil.oc.{OpenComputers, Blocks, Settings, api} -import li.cil.oc.common.InventorySlots.Tier -import li.cil.oc.util.ExtendedNBT._ -import net.minecraft.nbt.NBTTagCompound import com.google.common.base.Strings -import scala.io.Source import java.util.logging.Level +import li.cil.oc.{OpenComputers, Blocks, Settings, api} import li.cil.oc.api.Persistable +import li.cil.oc.common.InventorySlots.Tier +import li.cil.oc.server.driver.item.UpgradeExperience +import li.cil.oc.util.ExtendedNBT._ +import net.minecraft.item.{ItemMap, Item, ItemStack} +import net.minecraft.nbt.{NBTBase, NBTTagCompound} import net.minecraft.world.World +import scala.io.Source +import scala.collection.convert.WrapAsScala._ object ItemUtils { def caseTier(stack: ItemStack) = { @@ -49,7 +51,11 @@ object ItemUtils { var name = "" - var energy = 0 + // Overall energy including components. + var totalEnergy = 0 + + // Energy purely stored in robot component - this is what we have to restore manually. + var robotEnergy = 0 var tier = 0 @@ -64,7 +70,8 @@ object ItemUtils { if (Strings.isNullOrEmpty(name)) { name = RobotData.randomName } - energy = nbt.getInteger(Settings.namespace + "storedEnergy") + totalEnergy = nbt.getInteger(Settings.namespace + "storedEnergy") + robotEnergy = nbt.getInteger(Settings.namespace + "robotEnergy") if (nbt.hasKey(Settings.namespace + "components")) { tier = nbt.getInteger(Settings.namespace + "tier") components = nbt.getTagList(Settings.namespace + "components").map(ItemStack.loadItemStackFromNBT).toArray @@ -73,11 +80,14 @@ object ItemUtils { else { // Old robot, upgrade to new modular model. tier = 0 + val experienceUpgrade = api.Items.get("experienceUpgrade").createItemStack(1) + UpgradeExperience.dataTag(experienceUpgrade).setDouble(Settings.namespace + "xp", nbt.getDouble(Settings.namespace + "xp")) components = Array( api.Items.get("screen1").createItemStack(1), api.Items.get("keyboard").createItemStack(1), api.Items.get("inventoryUpgrade").createItemStack(1), - api.Items.get("experienceUpgrade").createItemStack(1), + experienceUpgrade, + api.Items.get("openOS").createItemStack(1), api.Items.get("graphicsCard1").createItemStack(1), api.Items.get("cpu1").createItemStack(1), api.Items.get("ram2").createItemStack(1) @@ -87,8 +97,7 @@ object ItemUtils { api.Items.get("upgradeContainer3").createItemStack(1), api.Items.get("diskDrive").createItemStack(1) ) - // TODO migration: xp to xp upgrade - // experience = nbt.getDouble(Settings.namespace + "xp") + robotEnergy = totalEnergy } } @@ -99,11 +108,34 @@ object ItemUtils { } nbt.getCompoundTag("display").setString("Name", name) } - nbt.setInteger(Settings.namespace + "storedEnergy", energy) + nbt.setInteger(Settings.namespace + "storedEnergy", totalEnergy) + nbt.setInteger(Settings.namespace + "robotEnergy", robotEnergy) nbt.setInteger(Settings.namespace + "tier", tier) nbt.setNewTagList(Settings.namespace + "components", components.toIterable) nbt.setNewTagList(Settings.namespace + "containers", containers.toIterable) } + + def copyItemStack() = { + val stack = super.createItemStack() + // Forget all node addresses and so on. This is used when 'picking' a + // robot in creative mode. + val newInfo = new RobotData(stack) + newInfo.components.foreach(cs => Option(api.Driver.driverFor(cs)) match { + case Some(driver) => + val nbt = driver.dataTag(cs) + nbt.getTags.toArray.foreach { + case tag: NBTBase => nbt.removeTag(tag.getName) + case _ => + } + case _ => + }) + // Don't show energy info (because it's unreliable) but fill up the + // internal buffer. This is for creative use only, anyway. + newInfo.totalEnergy = 0 + newInfo.robotEnergy = 50000 + newInfo.save(stack) + stack + } } object RobotData {