From 8a9740b641f91e2f7389929d720f6eb3f296433f Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 28 Sep 2018 13:15:03 -0700 Subject: [PATCH 1/2] funnel wake-on-lan start through host, not direct The network card's wake-on-lan previously was sending a computer.start message directly to the machine. But some hosts, specifically the Drone need to make certain start actions before the machine starts. For instance, the drone zeros its velocity (technically, it rises by .5m) closes #2866 --- .../scala/li/cil/oc/common/entity/Drone.scala | 9 ++++++-- .../cil/oc/server/component/NetworkCard.scala | 22 ++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/entity/Drone.scala b/src/main/scala/li/cil/oc/common/entity/Drone.scala index 85e540b2b..33139b18b 100644 --- a/src/main/scala/li/cil/oc/common/entity/Drone.scala +++ b/src/main/scala/li/cil/oc/common/entity/Drone.scala @@ -164,7 +164,13 @@ class Drone(val world: World) extends Entity(world) with MachineHost with intern override def isPaused = machine.isPaused - override def start() = machine.start() + override def start(): Boolean = { + if (world.isRemote || machine.isRunning) { + return false + } + preparePowerUp() + machine.start() + } override def pause(seconds: Double) = machine.pause(seconds) @@ -474,7 +480,6 @@ class Drone(val world: World) extends Entity(world) with MachineHost with intern } } else if (!world.isRemote && !machine.isRunning) { - preparePowerUp() start() } } diff --git a/src/main/scala/li/cil/oc/server/component/NetworkCard.scala b/src/main/scala/li/cil/oc/server/component/NetworkCard.scala index 55ab6f743..cc1c16b1c 100644 --- a/src/main/scala/li/cil/oc/server/component/NetworkCard.scala +++ b/src/main/scala/li/cil/oc/server/component/NetworkCard.scala @@ -176,16 +176,18 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w } // Accept wake-up messages regardless of port because we close all ports // when our computer shuts down. - packet.data match { - case Array(message: Array[Byte]) if wakeMessage.contains(new String(message, Charsets.UTF_8)) => - node.sendToNeighbors("computer.start") - case Array(message: String) if wakeMessage.contains(message) => - node.sendToNeighbors("computer.start") - case Array(message: Array[Byte], _*) if wakeMessageFuzzy && wakeMessage.contains(new String(message, Charsets.UTF_8)) => - node.sendToNeighbors("computer.start") - case Array(message: String, _*) if wakeMessageFuzzy && wakeMessage.contains(message) => - node.sendToNeighbors("computer.start") - case _ => + val wakeup: Boolean = packet.data match { + case Array(message: Array[Byte]) if wakeMessage.contains(new String(message, Charsets.UTF_8)) => true + case Array(message: String) if wakeMessage.contains(message) => true + case Array(message: Array[Byte], _*) if wakeMessageFuzzy && wakeMessage.contains(new String(message, Charsets.UTF_8)) => true + case Array(message: String, _*) if wakeMessageFuzzy && wakeMessage.contains(message) => true + case _ => false + } + if (wakeup) { + host match { + case ctx: Context => ctx.start() + case _ => node.sendToNeighbors("computer.start") + } } } } From 0b7d8bfd92a6e43c14991e02b0b934f9055b893d Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 29 Sep 2018 17:32:41 -0700 Subject: [PATCH 2/2] copy the simulated stack before using it The simulated stack from inventories may not be a copy, and we modify it thus, we should copy it before using it. This fixes our interaction with ae interfaces closes #2845 --- src/main/scala/li/cil/oc/util/InventoryUtils.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 4a407bf50..df541dc2b 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -134,7 +134,8 @@ object InventoryUtils { (stack != null && limit > 0 && stack.stackSize > 0) && { var amount = stack.getMaxStackSize min stack.stackSize min limit inventory.extractItem(slot, amount, true) match { - case extracted: ItemStack => + case simExtracted: ItemStack => + val extracted = simExtracted.copy amount = extracted.stackSize consumer(extracted) if(extracted.stackSize >= amount) return false