From 01cec929a79155bf276b0200f2bf25ea98e57bc8 Mon Sep 17 00:00:00 2001 From: Adrian Siekierka Date: Wed, 4 Jul 2018 10:57:14 +0200 Subject: [PATCH 1/2] funscii update to d30ed629 --- .../resources/assets/opencomputers/font.hex | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/resources/assets/opencomputers/font.hex b/src/main/resources/assets/opencomputers/font.hex index 00221c12f..7dff88204 100644 --- a/src/main/resources/assets/opencomputers/font.hex +++ b/src/main/resources/assets/opencomputers/font.hex @@ -178,7 +178,7 @@ 00B1:000000001818187E181818007E000000 00B2:00386C0C1830607C0000000000000000 00B3:00386C0C380C6C380000000000000000 -00B4:0C0C1818303000000000000000000000 +00B4:00000C18300000000000000000000000 00B5:0000000000006666666666667C6060C0 00B6:00003E7A7A7A7A3A1A1A1A1A1A000000 00B7:00000000000000180000000000000000 @@ -911,23 +911,36 @@ 2020:00001818187E18181818181818000000 2021:00001818187E1818187E181818000000 2022:000000000000183C3C18000000000000 +2023:00000000000060787E78600000000000 2024:00000000000000000000181818000000 2025:00000000000000000000666666660000 2026:00000000000000000000009292000000 -2030:0000C6C6CCCC18186060DBDBDBDB0000 -2031:0000C6C6CCCC18186060D5D5D5D50000 +2027:00000000000000181800000000000000 +2030:0000CCCCCCCC18186060DBDBDBDB0000 +2031:0000D8D8D8D830306060D5D5D5D50000 +2032:00000C18300000000000000000000000 +2033:0000366CD80000000000000000000000 +2034:00002A54A80000000000000000000000 +2035:000030180C0000000000000000000000 +2036:00006C361B0000000000000000000000 +2037:0000542A150000000000000000000000 203C:66666666666666666666000066660000 +203D:007EDBDB1B1E1C181800001818000000 2044:000006060C0C181830306060C0C00000 2047:CCCC66666666CCCCCCCC0000CCCC0000 2048:E6E6363636366666C6C60000C6C60000 2049:DCDCC6C6C6C6CCCCD8D80000D8D80000 2070:00386C6C6C6C6C380000000000000000 +2071:00303000303030300000000000000000 2074:001C3C6C7E0C0C0C0000000000000000 2075:007C60780C0C6C380000000000000000 2076:00386060786C6C380000000000000000 2077:007C0C0C183030300000000000000000 2078:00386C6C386C6C380000000000000000 2079:00386C6C3C0C0C380000000000000000 +207A:0018187E7E1818000000000000000000 +207B:00007E7E000000000000000000000000 +207C:00007E7E007E7E000000000000000000 207F:000000786C6C6C6C0000000000000000 20A3:00007E6060607C6060F8606060000000 20A4:0000386C6C60F060F0606666FC000000 @@ -957,13 +970,26 @@ 2190:000000000010307F7F30100000000000 2191:183C7E18181818181818181818181818 2192:0000000000080CFEFE0C080000000000 +2193:181818181818181818181818187E3C18 2194:00000000002466FFFF66240000000000 -2196:F0F0E0E0F0F0B8B81C1C0E0E04040000 -2197:0F0F07070F0F1D1D3838707020200000 -2198:00002020707038381D1D0F0F07070F0F -2199:000004040E0E1C1CB8B8F0F0E0E0F0F0 -21A5:183C7E181818181818181818187E3C18 +2195:183C7E181818181818181818187E3C18 +2196:00000000F0E0F0B81C0E040000000000 +2197:000000000F070F1D3870200000000000 +2198:00000000002070381D0F070F00000000 +2199:0000000000040E1CB8F0E0F000000000 +21A4:00000000002262FEFE62220000000000 +21A5:183C7E181818181818181818181818FF +21A6:000000000044467F7F46440000000000 +21A7:FF183C7E1818181818181818187E3C18 21A8:183C7E1818181818181818187E3C18FF +21BC:000000000010307F7F00000000000000 +21BD:000000000000007F7F30100000000000 +21BE:181C1E18181818181818181818181818 +21BF:18387818181818181818181818181818 +21C0:0000000000080CFEFE00000000000000 +21C1:00000000000000FEFE0C080000000000 +21C2:181818181818181818181818181E1C18 +21C3:18181818181818181818181818783818 21E6:0000000018386FC1C16F381800000000 21E7:00000000183C66C3E724243C00000000 21E8:00000000181CF68383F61C1800000000 @@ -1569,7 +1595,7 @@ 28FD:FFFFFFFF0F0F0F0FFFFFFFFFFFFFFFFF 28FE:0F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF 28FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -2913:181818181818181818181818187E3C18 +2913:1C1C1C1C3E3E1C1C080800003E3E0000 2A00:000007C01C7030183018600C638C638C638C600C301830181C7007C000000000 2A01:000007C01D7031183118610C610C7FFC610C610C311831181D7007C000000000 2A02:000007C01C70301838386C6C66CC638C66CC6C6C383830181C7007C000000000 @@ -1577,7 +1603,7 @@ 2A04:4444444454547C7C5454444438380000 2A05:7C7C4444444444444444444444440000 2A06:4444444444444444444444447C7C0000 -2B1D:00000000000018181818000000000000 +2B1D:00000000000000181800000000000000 2B24:000000003C7EFFFFFFFF7E3C00000000 2B55:000000003C7EE7C3C3E77E3C00000000 2B58:00000000003C7E66667E3C0000000000 From 1e86c9f6345fc245efbecf69e63ff518aee1eed3 Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 14 Nov 2018 18:13:24 -0800 Subject: [PATCH 2/2] create a smart terminal server cache to drop dups terminal servers were being added to the list before their address had been loaded, causing connection issues when adding/removing terminal server blades from racks, or when unloading/loading world chunks closes #2246 --- .../scala/li/cil/oc/client/GuiHandler.scala | 2 +- .../oc/common/component/TerminalServer.scala | 83 ++++++++++++++++++- 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index de218cf51..15bf6b2ba 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -112,7 +112,7 @@ object GuiHandler extends CommonGuiHandler { val address = stack.getTagCompound.getString(Settings.namespace + "server") val key = stack.getTagCompound.getString(Settings.namespace + "key") if (!Strings.isNullOrEmpty(key) && !Strings.isNullOrEmpty(address)) { - component.TerminalServer.loaded.find(_.address == address) match { + component.TerminalServer.loaded.find(address) match { case Some(term) => term.rack match { case rack: TileEntity with api.internal.Rack => def inRange = player.isEntityAlive && !rack.isInvalid && rack.getDistanceFrom(player.posX, player.posY, player.posZ) < term.range * term.range diff --git a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala index 399a53371..88abc9e25 100644 --- a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala +++ b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala @@ -30,6 +30,7 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagString import net.minecraftforge.common.util.Constants.NBT +import scala.collection.convert.WrapAsScala._ import scala.collection.convert.WrapAsJava._ import scala.collection.mutable @@ -63,7 +64,17 @@ class TerminalServer(val rack: api.internal.Rack, val slot: Int) extends Environ var range = Settings.get.maxWirelessRange(Tier.Two) val keys = mutable.ListBuffer.empty[String] - def address = rack.getMountableData(slot).getString("terminalAddress") + def hasAddress: Boolean = { + if (rack != null) { + val data = rack.getMountableData(slot) + if (data != null) { + return data.hasKey("terminalAddress") + } + } + false + } + + def address: String = rack.getMountableData(slot).getString("terminalAddress") def sidedKeys = { if (!rack.world.isRemote) keys @@ -206,13 +217,77 @@ class TerminalServer(val rack: api.internal.Rack, val slot: Int) extends Environ override def onLifecycleStateChange(state: Lifecycle.LifecycleState): Unit = if (rack.world.isRemote) state match { case Lifecycle.LifecycleState.Initialized => - TerminalServer.loaded += this + TerminalServer.loaded.add(this) case Lifecycle.LifecycleState.Disposed => - TerminalServer.loaded -= this + TerminalServer.loaded.remove(this) case _ => // Ignore. } } object TerminalServer { - val loaded = mutable.Buffer.empty[TerminalServer] + val loaded = new TerminalServerCache() + + // we need a smart cache because nodes are loaded in before they have addresses + // and we need a unique set of terminal servers based on address + // This cache acts as a Map[address: String, term: TerminalServer] + // But it can store terminals before they have an address + // Null-address terminals are not available for binding + // As an address loads, repeated addresses are dropped from the list + class TerminalServerCache { + + private val ready: mutable.Map[String, TerminalServer] = new mutable.HashMap[String, TerminalServer]() + private val pending: mutable.Buffer[TerminalServer] = mutable.Buffer.empty[TerminalServer] + + private def completePending(): Unit = { + val promoted: mutable.Buffer[TerminalServer] = mutable.Buffer.empty[TerminalServer] + pending.foreach { term => if (term.hasAddress) + promoted += term + } + promoted.foreach { term => + pending -= term + val address = term.address + if (!ready.contains(address)) { + ready.put(address, term) + } + } + } + + def add(terminal: TerminalServer): Boolean = { + completePending() + if (terminal.hasAddress) { + val newAddress: String = terminal.address + if (ready.contains(newAddress)) { + false + } else { + ready.put(newAddress, terminal) + true + } + } + else { + pending += terminal + true + } + } + + def remove(terminal: TerminalServer): Boolean = { + completePending() + if (terminal.hasAddress) + ready.remove(terminal.address).isDefined + else { + val before = pending.size + pending -= terminal + pending.size > before + } + } + + def clear(): Unit = { + ready.clear() + pending.clear() + } + + def find(address: String): Option[TerminalServer] = { + completePending() + Some(ready.getOrDefault(address, null)) + } + } }