mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-11 00:09:44 -04:00
Tracking previous dimension in nanomachine controller to robustly handle dimension changes to update wireless network association, fixes #1535.
Added `api.Network.leaveWirelessNetwork(WirelessEndpoint endpoint, int dimension)` to API.
This commit is contained in:
parent
eb8074097e
commit
f19dd57a0c
@ -18,7 +18,7 @@ import li.cil.oc.api.detail.NetworkAPI;
|
|||||||
*/
|
*/
|
||||||
public class API {
|
public class API {
|
||||||
public static final String ID_OWNER = "OpenComputers|Core";
|
public static final String ID_OWNER = "OpenComputers|Core";
|
||||||
public static final String VERSION = "5.6.3";
|
public static final String VERSION = "5.6.4";
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
|
@ -114,6 +114,22 @@ public final class Network {
|
|||||||
API.network.leaveWirelessNetwork(endpoint);
|
API.network.leaveWirelessNetwork(endpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a wireless endpoint from the wireless network of a specific dimension.
|
||||||
|
* <p/>
|
||||||
|
* 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).
|
||||||
|
* <p/>
|
||||||
|
* 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.
|
* Sends a packet via the wireless network.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -80,6 +80,19 @@ public interface NetworkAPI {
|
|||||||
*/
|
*/
|
||||||
void leaveWirelessNetwork(WirelessEndpoint endpoint);
|
void leaveWirelessNetwork(WirelessEndpoint endpoint);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a wireless endpoint from the wireless network of a specific dimension.
|
||||||
|
* <p/>
|
||||||
|
* 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).
|
||||||
|
* <p/>
|
||||||
|
* 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.
|
* Sends a packet via the wireless network.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -5,6 +5,9 @@ import java.util.UUID
|
|||||||
|
|
||||||
import com.google.common.base.Charsets
|
import com.google.common.base.Charsets
|
||||||
import com.google.common.base.Strings
|
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.Behavior
|
||||||
import li.cil.oc.api.nanomachines.Controller
|
import li.cil.oc.api.nanomachines.Controller
|
||||||
import li.cil.oc.api.nanomachines.DisableReason
|
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.common.item.data.NanomachineData
|
||||||
import li.cil.oc.integration.util.DamageSourceWithRandomCause
|
import li.cil.oc.integration.util.DamageSourceWithRandomCause
|
||||||
import li.cil.oc.server.PacketSender
|
import li.cil.oc.server.PacketSender
|
||||||
import li.cil.oc.util.ExtendedNBT._
|
|
||||||
import li.cil.oc.util.BlockPosition
|
import li.cil.oc.util.BlockPosition
|
||||||
|
import li.cil.oc.util.ExtendedNBT._
|
||||||
import li.cil.oc.util.InventoryUtils
|
import li.cil.oc.util.InventoryUtils
|
||||||
import li.cil.oc.util.PlayerUtils
|
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.EntityPlayer
|
||||||
import net.minecraft.entity.player.EntityPlayerMP
|
import net.minecraft.entity.player.EntityPlayerMP
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
@ -33,6 +33,7 @@ import scala.collection.mutable
|
|||||||
|
|
||||||
class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessEndpoint {
|
class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessEndpoint {
|
||||||
if (isServer) api.Network.joinWirelessNetwork(this)
|
if (isServer) api.Network.joinWirelessNetwork(this)
|
||||||
|
var previousDimension = player.worldObj.provider.dimensionId
|
||||||
|
|
||||||
lazy val CommandRange = Settings.get.nanomachinesCommandRange * Settings.get.nanomachinesCommandRange
|
lazy val CommandRange = Settings.get.nanomachinesCommandRange * Settings.get.nanomachinesCommandRange
|
||||||
final val FullSyncInterval = 20 * 60
|
final val FullSyncInterval = 20 * 60
|
||||||
@ -232,12 +233,24 @@ class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessE
|
|||||||
if (commandDelay > 0) {
|
if (commandDelay > 0) {
|
||||||
commandDelay -= 1
|
commandDelay -= 1
|
||||||
if (commandDelay == 0) {
|
if (commandDelay == 0) {
|
||||||
queuedCommand.foreach(_())
|
queuedCommand.foreach(_ ())
|
||||||
queuedCommand = None
|
queuedCommand = None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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)
|
api.Network.updateWirelessNetwork(this)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var hasPower = getLocalBuffer > 0 || Settings.get.ignorePower
|
var hasPower = getLocalBuffer > 0 || Settings.get.ignorePower
|
||||||
lazy val active = getActiveBehaviors.toIterable // Wrap once.
|
lazy val active = getActiveBehaviors.toIterable // Wrap once.
|
||||||
|
@ -527,6 +527,10 @@ object Network extends api.detail.NetworkAPI {
|
|||||||
WirelessNetwork.remove(endpoint)
|
WirelessNetwork.remove(endpoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def leaveWirelessNetwork(endpoint: WirelessEndpoint, dimension: Int) {
|
||||||
|
WirelessNetwork.remove(endpoint, dimension)
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def sendWirelessPacket(source: WirelessEndpoint, strength: Double, packet: network.Packet) {
|
override def sendWirelessPacket(source: WirelessEndpoint, strength: Double, packet: network.Packet) {
|
||||||
|
@ -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) = {
|
def remove(endpoint: WirelessEndpoint) = {
|
||||||
dimensions.get(dimension(endpoint)) match {
|
dimensions.get(dimension(endpoint)) match {
|
||||||
case Some(set) => set.remove(endpoint)
|
case Some(set) => set.remove(endpoint)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user