From 5e268af84b28e66103ec48668192e1e162cd3404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 11 Jul 2014 14:10:54 +0200 Subject: [PATCH] Added safety try-catch to machine loading code, to avoid crashes for unexpected states. Added callback doc for experience upgrade and chunkloader upgrades. --- .../oc/server/component/UpgradeChunkloader.scala | 4 ++-- .../oc/server/component/UpgradeExperience.scala | 2 +- .../cil/oc/server/component/machine/Machine.scala | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeChunkloader.scala b/src/main/scala/li/cil/oc/server/component/UpgradeChunkloader.scala index e922d1e43..a7836d84d 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeChunkloader.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeChunkloader.scala @@ -28,10 +28,10 @@ class UpgradeChunkloader(val owner: Container) extends component.ManagedComponen } } - @Callback + @Callback(doc = """function():boolean -- Gets whether the chunkloader is currently active.""") def isActive(context: Context, args: Arguments): Array[AnyRef] = result(ticket.isDefined) - @Callback + @Callback(doc = """function(enabled:boolean):boolean -- Enables or disables the chunkloader.""") def setActive(context: Context, args: Arguments): Array[AnyRef] = { val enabled = args.checkBoolean(0) if (enabled && ticket.isEmpty) { diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala b/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala index 37b8c59c1..08eb39522 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala @@ -39,7 +39,7 @@ class UpgradeExperience extends component.ManagedComponent { } } - @Callback(direct = true) + @Callback(direct = true, doc = """function():number -- The current level of experience stored in this experience upgrade.""") def level(context: Context, args: Arguments): Array[AnyRef] = { val xpNeeded = xpForNextLevel - xpForLevel(level) val xpProgress = math.max(0, experience - xpForLevel(level)) diff --git a/src/main/scala/li/cil/oc/server/component/machine/Machine.scala b/src/main/scala/li/cil/oc/server/component/machine/Machine.scala index 9c9d4caf5..7e4084b81 100644 --- a/src/main/scala/li/cil/oc/server/component/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/component/machine/Machine.scala @@ -577,7 +577,7 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext tmp.foreach(fs => fs.load(nbt.getCompoundTag("tmp"))) - if (state.size > 0 && state.top != Machine.State.Stopped && init()) { + if (state.size > 0 && state.top != Machine.State.Stopped && init()) try { architecture.load(nbt) signals ++= nbt.getTagList("signals").iterator[NBTTagCompound].map(signalNbt => { @@ -612,6 +612,11 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext pause(Settings.get.startupDelay) } } + catch { + case t: Throwable => + OpenComputers.log.log(Level.SEVERE, s"""Unexpected error loading a state of computer at (${owner.x}, ${owner.y}, ${owner.z}). """ + + s"""State: ${state.headOption.fold("no state")(_.toString)}. Unless you're upgrading/downgrading across a major version, please report this! Thank you.""", t) + } else close() // Clean up in case we got a weird state stack. } @@ -641,7 +646,7 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext tmp.foreach(fs => nbt.setNewCompoundTag("tmp", fs.save)) - if (state.top != Machine.State.Stopped) { + if (state.top != Machine.State.Stopped) try { architecture.save(nbt) val signalsNbt = new NBTTagList() @@ -674,6 +679,11 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext nbt.setLong("cpuTime", cpuTotal) nbt.setInteger("remainingPause", remainingPause) } + catch { + case t: Throwable => + OpenComputers.log.log(Level.SEVERE, s"""Unexpected error saving a state of computer at (${owner.x}, ${owner.y}, ${owner.z}). """ + + s"""State: ${state.headOption.fold("no state")(_.toString)}. Unless you're upgrading/downgrading across a major version, please report this! Thank you.""", t) + } } // ----------------------------------------------------------------------- //