diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala index 81655f760..df3cdd997 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala @@ -12,6 +12,7 @@ import li.cil.oc.common.Slot import li.cil.oc.common.Tier import li.cil.oc.common.item import li.cil.oc.common.item.Delegator +import li.cil.oc.server.machine.luac.NativeLuaArchitecture import net.minecraft.item.ItemStack import scala.collection.convert.WrapAsScala._ @@ -40,7 +41,13 @@ abstract class DriverCPU extends Item with Processor { override def architecture(stack: ItemStack): Class[_ <: Architecture] = { if (stack.hasTagCompound) { - val archClass = stack.getTagCompound.getString(Settings.namespace + "archClass") + val archClass = stack.getTagCompound.getString(Settings.namespace + "archClass") match { + case clazz if clazz == classOf[NativeLuaArchitecture].getName => + // Migrate old saved CPUs to new versions (since the class they refer still + // exists, but is abstract, which would lead to issues). + api.Machine.LuaArchitecture.getName + case clazz => clazz + } if (!archClass.isEmpty) try return Class.forName(archClass).asSubclass(classOf[Architecture]) catch { case t: Throwable => OpenComputers.log.warn("Failed getting class for CPU architecture. Resetting CPU to use the default.", t) diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala index d4cff5c12..8bb64559b 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -124,9 +124,12 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach case Some(driver: Processor) if driver.slot(stack) == Slot.CPU => Option(driver.architecture(stack)) match { case Some(clazz) => - if (architecture == null || architecture.getClass != clazz) { + if (architecture == null || architecture.getClass != clazz) try { newArchitecture = clazz.getConstructor(classOf[machine.Machine]).newInstance(this) } + catch { + case t: Throwable => OpenComputers.log.warn("Failed instantiating a CPU architecture.", t) + } else { newArchitecture = architecture }