Fixed robot energy storage somewhat.

Improved picking of robots (avoid duplicate component ids).
This commit is contained in:
Florian Nücke 2014-05-23 18:55:19 +02:00
parent e443205eac
commit ddd8e18aef
9 changed files with 58 additions and 28 deletions

View File

@ -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

View File

@ -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

View File

@ -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")
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 _ =>

View File

@ -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) {

View File

@ -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

View File

@ -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
}

View File

@ -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.

View File

@ -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 {

View File

@ -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 {