From 8a9740b641f91e2f7389929d720f6eb3f296433f Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 28 Sep 2018 13:15:03 -0700 Subject: [PATCH] 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") + } } } }