diff --git a/src/main/java/li/cil/oc/api/API.java b/src/main/java/li/cil/oc/api/API.java index 7a89a5b964..8a02ae0fb6 100644 --- a/src/main/java/li/cil/oc/api/API.java +++ b/src/main/java/li/cil/oc/api/API.java @@ -18,7 +18,7 @@ */ public class API { public static final String ID_OWNER = "OpenComputers|Core"; - public static final String VERSION = "5.6.3"; + public static final String VERSION = "5.6.4"; // ----------------------------------------------------------------------- // diff --git a/src/main/java/li/cil/oc/api/Network.java b/src/main/java/li/cil/oc/api/Network.java index 458467f7f1..a159f39e89 100644 --- a/src/main/java/li/cil/oc/api/Network.java +++ b/src/main/java/li/cil/oc/api/Network.java @@ -114,6 +114,22 @@ public static void leaveWirelessNetwork(final WirelessEndpoint endpoint) { API.network.leaveWirelessNetwork(endpoint); } + /** + * Removes a wireless endpoint from the wireless network of a specific dimension. + *
+ * This may be useful if the dimension of an endpoint changed and you can only + * react to that change (e.g. a player changing dimensions). + * + * Calling this for an endpoint that was not added before does nothing. + * + * @param endpoint the endpoint to remove from the wireless network. + * @param dimension the dimension with the wireless network to remove the endpoint from. + */ + public static void leaveWirelessNetwork(final WirelessEndpoint endpoint, final int dimension) { + if (API.network != null) + API.network.leaveWirelessNetwork(endpoint, dimension); + } + /** * Sends a packet via the wireless network. * diff --git a/src/main/java/li/cil/oc/api/detail/NetworkAPI.java b/src/main/java/li/cil/oc/api/detail/NetworkAPI.java index b28b82e428..444a129277 100644 --- a/src/main/java/li/cil/oc/api/detail/NetworkAPI.java +++ b/src/main/java/li/cil/oc/api/detail/NetworkAPI.java @@ -80,6 +80,19 @@ public interface NetworkAPI { */ void leaveWirelessNetwork(WirelessEndpoint endpoint); + /** + * Removes a wireless endpoint from the wireless network of a specific dimension. + * + * This may be useful if the dimension of an endpoint changed and you can only + * react to that change (e.g. a player changing dimensions). + * + * Calling this for an endpoint that was not added before does nothing. + * + * @param endpoint the endpoint to remove from the wireless network. + * @param dimension the dimension with the wireless network to remove the endpoint from. + */ + void leaveWirelessNetwork(WirelessEndpoint endpoint, int dimension); + /** * Sends a packet via the wireless network. * diff --git a/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala b/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala index 7cca6990ae..6b50161c67 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala @@ -5,6 +5,9 @@ import java.util.UUID import com.google.common.base.Charsets import com.google.common.base.Strings +import li.cil.oc.Constants +import li.cil.oc.Settings +import li.cil.oc.api import li.cil.oc.api.nanomachines.Behavior import li.cil.oc.api.nanomachines.Controller import li.cil.oc.api.nanomachines.DisableReason @@ -13,13 +16,10 @@ import li.cil.oc.api.network.WirelessEndpoint import li.cil.oc.common.item.data.NanomachineData import li.cil.oc.integration.util.DamageSourceWithRandomCause import li.cil.oc.server.PacketSender -import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.BlockPosition +import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.InventoryUtils import li.cil.oc.util.PlayerUtils -import li.cil.oc.Constants -import li.cil.oc.Settings -import li.cil.oc.api import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.nbt.NBTTagCompound @@ -33,6 +33,7 @@ import scala.collection.mutable class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessEndpoint { if (isServer) api.Network.joinWirelessNetwork(this) + var previousDimension = player.worldObj.provider.dimensionId lazy val CommandRange = Settings.get.nanomachinesCommandRange * Settings.get.nanomachinesCommandRange final val FullSyncInterval = 20 * 60 @@ -232,11 +233,23 @@ class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessE if (commandDelay > 0) { commandDelay -= 1 if (commandDelay == 0) { - queuedCommand.foreach(_()) + queuedCommand.foreach(_ ()) queuedCommand = None } } - api.Network.updateWirelessNetwork(this) + + // Handle dimension changes, the robust way (because when logging in, + // load is called while the world is still set to the overworld, but + // no dimension change event is fired if the player actually logged + // out in another dimension... yay) + if (player.worldObj.provider.dimensionId != previousDimension) { + api.Network.leaveWirelessNetwork(this, previousDimension) + api.Network.joinWirelessNetwork(this) + previousDimension = player.worldObj.provider.dimensionId + } + else { + api.Network.updateWirelessNetwork(this) + } } var hasPower = getLocalBuffer > 0 || Settings.get.ignorePower diff --git a/src/main/scala/li/cil/oc/server/network/Network.scala b/src/main/scala/li/cil/oc/server/network/Network.scala index a91cbaaead..48f46ec964 100644 --- a/src/main/scala/li/cil/oc/server/network/Network.scala +++ b/src/main/scala/li/cil/oc/server/network/Network.scala @@ -527,6 +527,10 @@ object Network extends api.detail.NetworkAPI { WirelessNetwork.remove(endpoint) } + override def leaveWirelessNetwork(endpoint: WirelessEndpoint, dimension: Int) { + WirelessNetwork.remove(endpoint, dimension) + } + // ----------------------------------------------------------------------- // override def sendWirelessPacket(source: WirelessEndpoint, strength: Double, packet: network.Packet) { diff --git a/src/main/scala/li/cil/oc/server/network/WirelessNetwork.scala b/src/main/scala/li/cil/oc/server/network/WirelessNetwork.scala index 2b0da9ac73..818afb1344 100644 --- a/src/main/scala/li/cil/oc/server/network/WirelessNetwork.scala +++ b/src/main/scala/li/cil/oc/server/network/WirelessNetwork.scala @@ -59,6 +59,13 @@ object WirelessNetwork { } } + def remove(endpoint: WirelessEndpoint, dimension: Int) = { + dimensions.get(dimension) match { + case Some(set) => set.remove(endpoint) + case _ => false + } + } + def remove(endpoint: WirelessEndpoint) = { dimensions.get(dimension(endpoint)) match { case Some(set) => set.remove(endpoint)