From d5f19c21d8b7184541175644f2e5890b97b498b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 16 Feb 2015 18:17:43 +0100 Subject: [PATCH 01/17] Added event viewing program MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Magiera --- .../opencomputers/loot/OpenOS/bin/dmesg.lua | 31 +++++++++++++++++++ .../opencomputers/loot/OpenOS/usr/man/dmesg | 6 ++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua create mode 100644 src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/dmesg diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua new file mode 100644 index 000000000..60bfd71e7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua @@ -0,0 +1,31 @@ +local event = require "event" +local component = require "component" + +local interactive = io.output() == io.stdout +local color, isPal, evt +if interactive then + color, isPal = component.gpu.getForeground() +end +pcall(function() + repeat + evt = {event.pull()} + if interactive then component.gpu.setForeground(0xCC2200) end + io.write("[" .. os.date("%T") .. "] ") + if interactive then component.gpu.setForeground(0x44CC00) end + io.write(tostring(evt[1]) .. string.rep(" ", math.max(10 - #tostring(evt[1]), 0) + 1)) + if interactive then component.gpu.setForeground(0xB0B00F) end + io.write(tostring(evt[2]) .. string.rep(" ", 37 - #tostring(evt[2]))) + if interactive then component.gpu.setForeground(0xFFFFFF) end + if #evt > 2 then + for i = 3, #evt do + io.write(" " .. tostring(evt[i])) + end + end + + io.write("\n") + until evt[1] == "key_down" and evt[3] == 113 +end) +if interactive then + component.gpu.setForeground(color, isPal) +end + diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/dmesg b/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/dmesg new file mode 100644 index 000000000..89f1f7e10 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/dmesg @@ -0,0 +1,6 @@ +NAME + dmesg - display messages(events) + +SYNOPIS + dmesg + From d71c52136fdea95fd820e1246be94523c98501eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 16 Feb 2015 18:51:07 +0100 Subject: [PATCH 02/17] Added backwards compatibility to OpenLoader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Magiera --- .../opencomputers/loot/OpenLoader/bin/opl-flash.lua | 13 +++++++++++-- .../assets/opencomputers/loot/OpenLoader/init.lua | 9 ++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenLoader/bin/opl-flash.lua b/src/main/resources/assets/opencomputers/loot/OpenLoader/bin/opl-flash.lua index d13f30063..a8de2204e 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenLoader/bin/opl-flash.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenLoader/bin/opl-flash.lua @@ -1,9 +1,18 @@ +local version = "OpenLoader 0.2EE" + local eeprom = [[ -_G._OSVERSION = "OpenLoader 0.1EE" +_G._OSVERSION = "]] .. version .. [[" local component = component or require('component') local computer = computer or require('computer') local unicode = unicode or require('unicode') +local eeprom = component.list("eeprom")() +computer.getBootAddress = function() + return component.invoke(eeprom, "getData") +end +computer.setBootAddress = function(address) + return component.invoke(eeprom, "setData", address) +end local gpu = component.list("gpu")() local w, h @@ -147,7 +156,7 @@ say ("Do you really want to flash openloader to EEPROM("..tostring(#eeprom).." b if options.q or options.quiet or io.read():lower() == "y" then say("Flashing... Do not reboot now!") component.eeprom.set(eeprom) - component.eeprom.setLabel((type(options.label) == "string" and options.label) or "OpenLoader") + component.eeprom.setLabel((type(options.label) == "string" and options.label) or version) if options.r or options.reboot then computer.shutdown(true) else diff --git a/src/main/resources/assets/opencomputers/loot/OpenLoader/init.lua b/src/main/resources/assets/opencomputers/loot/OpenLoader/init.lua index 2f70d5a3b..037fde921 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenLoader/init.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenLoader/init.lua @@ -1,8 +1,15 @@ -_G._OSVERSION = "OpenLoader 0.1" +_G._OSVERSION = "OpenLoader 0.2" local component = component or require('component') local computer = computer or require('computer') local unicode = unicode or require('unicode') +local eeprom = component.list("eeprom")() +computer.getBootAddress = function() + return component.invoke(eeprom, "getData") +end +computer.setBootAddress = function(address) + return component.invoke(eeprom, "setData", address) +end local gpu = component.list("gpu")() local w, h From bfb1347e8ca188b2cd00900b8385f29838d39dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 16 Feb 2015 20:58:46 +0100 Subject: [PATCH 03/17] Done some suggestions in dmesg.lua --- .../assets/opencomputers/loot/OpenOS/bin/dmesg.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua index 60bfd71e7..ab3bb4a0e 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/dmesg.lua @@ -1,14 +1,16 @@ local event = require "event" local component = require "component" +local keyboard = require "keyboard" local interactive = io.output() == io.stdout local color, isPal, evt if interactive then color, isPal = component.gpu.getForeground() end +io.write("Press 'q' to exit\n") pcall(function() repeat - evt = {event.pull()} + evt = table.pack(event.pull()) if interactive then component.gpu.setForeground(0xCC2200) end io.write("[" .. os.date("%T") .. "] ") if interactive then component.gpu.setForeground(0x44CC00) end @@ -16,14 +18,14 @@ pcall(function() if interactive then component.gpu.setForeground(0xB0B00F) end io.write(tostring(evt[2]) .. string.rep(" ", 37 - #tostring(evt[2]))) if interactive then component.gpu.setForeground(0xFFFFFF) end - if #evt > 2 then - for i = 3, #evt do + if evt.n > 2 then + for i = 3, evt.n do io.write(" " .. tostring(evt[i])) end end io.write("\n") - until evt[1] == "key_down" and evt[3] == 113 + until evt[1] == "key_down" and evt[4] == keyboard.keys.q end) if interactive then component.gpu.setForeground(color, isPal) From aaca5c45929ad58f1474b1f77b1d0fee2908fc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 16 Feb 2015 22:01:45 +0100 Subject: [PATCH 04/17] Fixed dangling raid fses. --- src/main/scala/li/cil/oc/common/tileentity/Raid.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Raid.scala b/src/main/scala/li/cil/oc/common/tileentity/Raid.scala index 296617ecb..def714fda 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Raid.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Raid.scala @@ -77,7 +77,8 @@ class Raid extends traits.Environment with traits.Inventory with traits.Rotatabl } def tryCreateRaid(id: String) { - if (items.count(_.isDefined) == items.length) { + if (items.count(_.isDefined) == items.length && filesystem.fold(true)(fs => fs.node == null || fs.node.address != id)) { + filesystem.foreach(fs => if (fs.node != null) fs.node.remove()) val fs = api.FileSystem.asManagedEnvironment( api.FileSystem.fromSaveDirectory(id, wipeDisksAndComputeSpace, Settings.get.bufferChanges), label, this, Settings.resourceDomain + ":hdd_access"). From 5416ee9f5587f234fb9e9ce2265b702eb4fdf911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 16 Feb 2015 23:21:53 +0100 Subject: [PATCH 05/17] Fixed two potential NPEs. --- src/main/scala/li/cil/oc/common/block/RobotProxy.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Robot.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index 7bf14710e..987dfee1e 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -88,7 +88,7 @@ class RobotProxy extends RedstoneAware with traits.SpecialBlock with traits.Stat val components = info.containers ++ info.components if (components.length > 0) { tooltip.addAll(Tooltip.get("Server.Components")) - for (component <- components) { + for (component <- components if component != null) { tooltip.add("- " + component.getDisplayName) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index 31f0db864..3a0959bdd 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -692,8 +692,8 @@ class Robot extends traits.Computer with traits.PowerInformation with IFluidHand player().inventory.addItemStackToInventory(stack) spawnStackInWorld(stack, Option(facing)) } + setSelectedSlot(oldSelected) } // else: save is screwed and we potentially lose items. Life is hard. - setSelectedSlot(oldSelected) } } finally { From 4000d88231eabceff0f6bdcd42af9dbe20f2cf4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 16 Feb 2015 23:23:09 +0100 Subject: [PATCH 06/17] Made debug card use actual fake player for running commands. Kinda closes #892. --- .../cil/oc/server/component/DebugCard.scala | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/DebugCard.scala b/src/main/scala/li/cil/oc/server/component/DebugCard.scala index ee94b8f4d..c0c965246 100644 --- a/src/main/scala/li/cil/oc/server/component/DebugCard.scala +++ b/src/main/scala/li/cil/oc/server/component/DebugCard.scala @@ -20,7 +20,6 @@ import li.cil.oc.util.ExtendedArguments._ import li.cil.oc.util.ExtendedWorld._ import li.cil.oc.util.InventoryUtils import net.minecraft.block.Block -import net.minecraft.command.ICommandSender import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.item.Item import net.minecraft.item.ItemStack @@ -33,12 +32,14 @@ import net.minecraft.world.World import net.minecraft.world.WorldServer import net.minecraft.world.WorldSettings.GameType import net.minecraftforge.common.DimensionManager +import net.minecraftforge.common.util.FakePlayer import net.minecraftforge.common.util.FakePlayerFactory import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.FluidRegistry import net.minecraftforge.fluids.FluidStack import net.minecraftforge.fluids.IFluidHandler +import scala.collection.convert.WrapAsScala._ import scala.collection.mutable class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment { @@ -56,6 +57,17 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment { // Player this card is bound to (if any) to use for permissions. var player: Option[String] = None + private lazy val CommandSender = { + def defaultFakePlayer = FakePlayerFactory.get(host.world.asInstanceOf[WorldServer], Settings.get.fakePlayerProfile) + new CommandSender(host, player match { + case Some(name) => Option(MinecraftServer.getServer.getConfigurationManager.func_152612_a(name)) match { + case Some(playerEntity) => playerEntity + case _ => defaultFakePlayer + } + case _ => defaultFakePlayer + }) + } + // ----------------------------------------------------------------------- // import li.cil.oc.server.component.DebugCard.checkEnabled @@ -99,10 +111,18 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment { @Callback(doc = """function(command:string):number -- Runs an arbitrary command using a fake player.""") def runCommand(context: Context, args: Arguments): Array[AnyRef] = { checkEnabled() - val command = args.checkString(0) - val sender = new CommandSender(host, player) - val value = MinecraftServer.getServer.getCommandManager.executeCommand(sender, command) - result(value, sender.messages.orNull) + val commands = + if (args.isTable(0)) collectionAsScalaIterable(args.checkTable(0).values()) + else Iterable (args.checkString(0)) + + CommandSender.synchronized { + CommandSender.prepare() + var value = 0 + for (command <- commands) { + value = MinecraftServer.getServer.getCommandManager.executeCommand(CommandSender, command.toString) + } + result(value, CommandSender.messages.orNull) + } } @Callback(doc = """function(x:number, y:number, z:number):boolean -- Connect the debug card to the block at the specified coordinates.""") @@ -496,31 +516,28 @@ object DebugCard { } } - class CommandSender(val host: EnvironmentHost, val playerName: Option[String]) extends ICommandSender { - val fakePlayer = { - def defaultFakePlayer = FakePlayerFactory.get(host.world.asInstanceOf[WorldServer], Settings.get.fakePlayerProfile) - playerName match { - case Some(name) => Option(MinecraftServer.getServer.getConfigurationManager.func_152612_a(name)) match { - case Some(player) => player - case _ => defaultFakePlayer - } - case _ => defaultFakePlayer - } - } - + class CommandSender(val host: EnvironmentHost, val underlying: EntityPlayerMP) extends FakePlayer(underlying.getEntityWorld.asInstanceOf[WorldServer], underlying.getGameProfile) { var messages: Option[String] = None - override def getCommandSenderName = fakePlayer.getCommandSenderName + def prepare(): Unit = { + val blockPos = BlockPosition(host) + posX = blockPos.x + posY = blockPos.y + posZ = blockPos.z + messages = None + } + + override def getCommandSenderName = underlying.getCommandSenderName override def getEntityWorld = host.world override def addChatMessage(message: IChatComponent) { - messages = Option(messages.getOrElse("") + message.getUnformattedText) + messages = Option(messages.fold("")(_ + "\n") + message.getUnformattedText) } override def canCommandSenderUseCommand(level: Int, command: String) = { - val profile = fakePlayer.getGameProfile - val server = fakePlayer.mcServer + val profile = underlying.getGameProfile + val server = underlying.mcServer val config = server.getConfigurationManager server.isSinglePlayer || (config.func_152596_g(profile) && (config.func_152603_m.func_152683_b(profile) match { case entry: UserListOpsEntry => entry.func_152644_a >= level @@ -530,7 +547,7 @@ object DebugCard { override def getPlayerCoordinates = BlockPosition(host).toChunkCoordinates - override def func_145748_c_() = fakePlayer.func_145748_c_() + override def func_145748_c_() = underlying.func_145748_c_() } class TestValue extends AbstractValue { From a0b6ff4b6d9ce009518e8e59be7277edbe400455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 16 Feb 2015 23:31:19 +0100 Subject: [PATCH 07/17] This isn't MC1.8... fixed update in tile entity env prefab. --- .../java/li/cil/oc/api/prefab/TileEntityEnvironment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/li/cil/oc/api/prefab/TileEntityEnvironment.java b/src/main/java/li/cil/oc/api/prefab/TileEntityEnvironment.java index 1f467dde0..e1fb6fca8 100644 --- a/src/main/java/li/cil/oc/api/prefab/TileEntityEnvironment.java +++ b/src/main/java/li/cil/oc/api/prefab/TileEntityEnvironment.java @@ -6,7 +6,6 @@ import li.cil.oc.api.network.Message; import li.cil.oc.api.network.Node; import li.cil.oc.api.network.Visibility; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.tileentity.TileEntity; /** @@ -18,7 +17,7 @@ import net.minecraft.tileentity.TileEntity; * network as an index structure to find other nodes connected to them. */ @SuppressWarnings("UnusedDeclaration") -public abstract class TileEntityEnvironment extends TileEntity implements Environment, IUpdatePlayerListBox { +public abstract class TileEntityEnvironment extends TileEntity implements Environment { /** * This must be set in subclasses to the node that is used to represent * this tile entity. @@ -97,7 +96,7 @@ public abstract class TileEntityEnvironment extends TileEntity implements Enviro // ----------------------------------------------------------------------- // @Override - public void update() { + public void updateEntity() { // On the first update, try to add our node to nearby networks. We do // this in the update logic, not in validate() because we need to access // neighboring tile entities, which isn't possible in validate(). From 0caf328c1245347e45a0e1dc9fa6bde3346f41b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 17 Feb 2015 12:39:35 +0100 Subject: [PATCH 08/17] Fixes possible NPE in Raid tooltip, closes #918. --- src/main/scala/li/cil/oc/common/block/Raid.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/block/Raid.scala b/src/main/scala/li/cil/oc/common/block/Raid.scala index 7c32128e3..e23b1a959 100644 --- a/src/main/scala/li/cil/oc/common/block/Raid.scala +++ b/src/main/scala/li/cil/oc/common/block/Raid.scala @@ -29,7 +29,7 @@ class Raid(protected implicit val tileTag: ClassTag[tileentity.Raid]) extends Si super.tooltipTail(metadata, stack, player, tooltip, advanced) if (KeyBindings.showExtendedTooltips) { val data = new RaidData(stack) - for (disk <- data.disks) { + for (disk <- data.disks if disk != null) { tooltip.add("- " + disk.getDisplayName) } } From 0a0609696470b70c639807493d64977b8bf9b171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 17 Feb 2015 12:44:43 +0100 Subject: [PATCH 09/17] Fixed memory sizes in Lua architectures, closes #919. --- .../li/cil/oc/integration/opencomputers/DriverMemory.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverMemory.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverMemory.scala index bb655ecd1..ea7bf66b1 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverMemory.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverMemory.scala @@ -10,7 +10,7 @@ import net.minecraft.item.ItemStack object DriverMemory extends Item with driver.item.Memory { override def amount(stack: ItemStack) = Items.multi.subItem(stack) match { - case Some(memory: item.Memory) => memory.tier + case Some(memory: item.Memory) => memory.tier + 1 case _ => 0.0 } From 6e4879c1f2c222765893f67fc5018feb620719ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 17 Feb 2015 13:35:20 +0100 Subject: [PATCH 10/17] Handling a few more corner-cases in network merges/address changes, hopefully closing #911 for good this time. --- .../li/cil/oc/server/network/Network.scala | 89 +++++++++++-------- .../scala/li/cil/oc/server/network/Node.scala | 9 +- 2 files changed, 57 insertions(+), 41 deletions(-) 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 17dd7fa3a..e6a1c487f 100644 --- a/src/main/scala/li/cil/oc/server/network/Network.scala +++ b/src/main/scala/li/cil/oc/server/network/Network.scala @@ -9,7 +9,8 @@ import li.cil.oc.OpenComputers import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.network -import li.cil.oc.api.network.{Node => ImmutableNode, _} +import li.cil.oc.api.network._ +import li.cil.oc.api.network.{Node => ImmutableNode} import li.cil.oc.common.block.Cable import li.cil.oc.common.tileentity import li.cil.oc.integration.Mods @@ -21,8 +22,8 @@ import net.minecraft.nbt._ import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.util.ForgeDirection -import scala.collection.convert.WrapAsScala._ import scala.collection.JavaConverters._ +import scala.collection.convert.WrapAsScala._ import scala.collection.mutable import scala.collection.mutable.ArrayBuffer @@ -50,13 +51,21 @@ private class Network private(private val data: mutable.Map[String, Network.Vert node.data.network = wrapper }) - // Called by nodes when they may have changed address from loading. - def remap(node: MutableNode) { - data.find(_._2.data == node) match { - case Some((address, vertex)) => - data -= address - data += node.address -> vertex - case _ => // Eh? + // Called by nodes when they want to change address from loading. + def remap(remappedNode: MutableNode, newAddress: String) { + data.get(remappedNode.address) match { + case Some(node) => + val neighbors = node.edges.map(_.other(node)) + node.data.remove() + node.data.address = newAddress + while (data.contains(node.data.address)) { + node.data.address = java.util.UUID.randomUUID().toString + } + if (neighbors.isEmpty) + addNew(node.data) + else + neighbors.foreach(_.data.connect(node.data)) + case _ => throw new AssertionError("Node believes it belongs to a network it doesn't.") } } @@ -217,7 +226,7 @@ private class Network private(private val data: mutable.Map[String, Network.Vert newNode } - private def add(oldNode: Network.Vertex, addedNode: MutableNode) = { + private def add(oldNode: Network.Vertex, addedNode: MutableNode): Boolean = { // Queue onConnect calls to avoid side effects from callbacks. val connects = mutable.Buffer.empty[(ImmutableNode, Iterable[ImmutableNode])] // Check if the other node is new or if we have to merge networks. @@ -248,44 +257,52 @@ private class Network private(private val data: mutable.Map[String, Network.Vert // never happen in normal operation anyway. It *can* happen when NBT // editing stuff or using mods to clone blocks (e.g. WorldEdit). otherNetwork.data.filter(entry => data.contains(entry._1)).toArray.foreach { - case (address, node: Network.Vertex) => + case (_, node: Network.Vertex) => val neighbors = node.edges.map(_.other(node)) node.data.remove() - node.data.address = java.util.UUID.randomUUID().toString + do { + node.data.address = java.util.UUID.randomUUID().toString + } while (data.contains(node.data.address) || otherNetwork.data.contains(node.data.address)) if (neighbors.isEmpty) otherNetwork.addNew(node.data) else neighbors.foreach(_.data.connect(node.data)) } - if (addedNode.reachability == Visibility.Neighbors) - connects += ((addedNode, Iterable(oldNode.data))) - if (oldNode.data.reachability == Visibility.Neighbors) - connects += ((oldNode.data, Iterable(addedNode))) + // The address change can theoretically cause the node to be kicked from + // its old network (via onConnect callbacks), so we make sure it's still + // in the same network. If it isn't we start over. + if (addedNode.network != null && addedNode.network.asInstanceOf[Network.Wrapper].network == otherNetwork) { + if (addedNode.reachability == Visibility.Neighbors) + connects += ((addedNode, Iterable(oldNode.data))) + if (oldNode.data.reachability == Visibility.Neighbors) + connects += ((oldNode.data, Iterable(addedNode))) - val oldNodes = nodes - val newNodes = otherNetwork.nodes - val oldVisibleNodes = oldNodes.filter(_.reachability == Visibility.Network) - val newVisibleNodes = newNodes.filter(_.reachability == Visibility.Network) + val oldNodes = nodes + val newNodes = otherNetwork.nodes + val oldVisibleNodes = oldNodes.filter(_.reachability == Visibility.Network) + val newVisibleNodes = newNodes.filter(_.reachability == Visibility.Network) - newVisibleNodes.foreach(node => connects += ((node, oldNodes))) - oldVisibleNodes.foreach(node => connects += ((node, newNodes))) + newVisibleNodes.foreach(node => connects += ((node, oldNodes))) + oldVisibleNodes.foreach(node => connects += ((node, newNodes))) - data ++= otherNetwork.data - connectors ++= otherNetwork.connectors - globalBuffer += otherNetwork.globalBuffer - globalBufferSize += otherNetwork.globalBufferSize - otherNetwork.data.values.foreach(node => { - node.data match { - case connector: Connector => connector.distributor = Some(wrapper) - case _ => - } - node.data.network = wrapper - }) - otherNetwork.data.clear() - otherNetwork.connectors.clear() + data ++= otherNetwork.data + connectors ++= otherNetwork.connectors + globalBuffer += otherNetwork.globalBuffer + globalBufferSize += otherNetwork.globalBufferSize + otherNetwork.data.values.foreach(node => { + node.data match { + case connector: Connector => connector.distributor = Some(wrapper) + case _ => + } + node.data.network = wrapper + }) + otherNetwork.data.clear() + otherNetwork.connectors.clear() - Network.Edge(oldNode, node(addedNode)) + Network.Edge(oldNode, node(addedNode)) + } + else add(oldNode, addedNode) } for ((node, nodes) <- connects) nodes.foreach(_.asInstanceOf[MutableNode].onConnect(node)) diff --git a/src/main/scala/li/cil/oc/server/network/Node.scala b/src/main/scala/li/cil/oc/server/network/Node.scala index bae0e6b08..e9e98da6c 100644 --- a/src/main/scala/li/cil/oc/server/network/Node.scala +++ b/src/main/scala/li/cil/oc/server/network/Node.scala @@ -66,11 +66,10 @@ trait Node extends ImmutableNode { def load(nbt: NBTTagCompound) = { if (nbt.hasKey("address")) { - val oldAddress = address - address = nbt.getString("address") - if (address != oldAddress) network match { - case wrapper: Network.Wrapper => wrapper.network.remap(this) - case _ => + val newAddress = nbt.getString("address") + if (newAddress != address) network match { + case wrapper: Network.Wrapper => wrapper.network.remap(this, newAddress) + case _ => address = newAddress } } } From f648a6271f405fc8d73797c5a815118dbb2da4b8 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Feb 2015 20:04:20 +0000 Subject: [PATCH 11/17] Update robot.names Eh, got bored --- src/main/resources/assets/opencomputers/robot.names | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/opencomputers/robot.names b/src/main/resources/assets/opencomputers/robot.names index 2587ce8c5..a14f0a57c 100644 --- a/src/main/resources/assets/opencomputers/robot.names +++ b/src/main/resources/assets/opencomputers/robot.names @@ -51,6 +51,7 @@ Kilobyte # Contributor KITT # Knight Rider Kodos # Contributor Laire # Perry Rhodan +Loader 1340 # Borderlands 2 LordFokas # Contributor Marvin # Hitchhiker's Guide to the Galaxy Michiyo # Contributor From 9e4b29b4cf9334281f22d31a8941a748ce32e28a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 19 Feb 2015 00:42:50 +0100 Subject: [PATCH 12/17] Added basic hostname mechanism to OpenOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Magiera --- .../opencomputers/loot/OpenOS/bin/hostname.lua | 14 ++++++++++++++ .../opencomputers/loot/OpenOS/boot/94_shell.lua | 11 ++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua new file mode 100644 index 000000000..c3be4d110 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua @@ -0,0 +1,14 @@ +local args = {...} +if args[1] then + local file = io.open("/etc/hostname", "w") + file:write(args[1]) + file:close() + os.setenv("HOSTNAME", args[1]) + os.setenv("PS1", "$HOSTNAME:$PWD# ") +else + local file = io.open("/etc/hostname") + if file then + io.write(file:read("*l")) + file:close() + end +end diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua index e754143d7..1527af1ad 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua @@ -13,4 +13,13 @@ shell.setAlias("rs", "redstone") shell.setAlias("view", "edit -r") shell.setAlias("help", "man") shell.setAlias("?", "man") -shell.setAlias("cp", "cp -i") \ No newline at end of file +shell.setAlias("cp", "cp -i") + +event.listen("init", function() + local file = io.open("/etc/hostname") + if file then + os.setenv("HOSTNAME", file:read("*l")) + os.setenv("PS1", "$HOSTNAME:$PWD# ") + file:close() + end +end) From cba88c7066065fd5b23e25891c3e7e43d1b322ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 19 Feb 2015 17:12:23 +0100 Subject: [PATCH 13/17] Improved hostname, added manpage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Magiera --- .../opencomputers/loot/OpenOS/bin/hostname.lua | 18 ++++++++++++------ .../opencomputers/loot/OpenOS/usr/man/hostname | 12 ++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/hostname diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua index c3be4d110..f8ff68205 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/hostname.lua @@ -1,14 +1,20 @@ local args = {...} if args[1] then - local file = io.open("/etc/hostname", "w") - file:write(args[1]) - file:close() - os.setenv("HOSTNAME", args[1]) - os.setenv("PS1", "$HOSTNAME:$PWD# ") + local file, reason = io.open("/etc/hostname", "w") + if not file then + io.stderr:write(reason .. "\n") + else + file:write(args[1]) + file:close() + os.setenv("HOSTNAME", args[1]) + os.setenv("PS1", "$HOSTNAME:$PWD# ") + end else local file = io.open("/etc/hostname") if file then - io.write(file:read("*l")) + io.write(file:read("*l"), "\n") file:close() + else + io.stderr:write("Hostname not set\n") end end diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/hostname b/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/hostname new file mode 100644 index 000000000..ae853e58a --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/usr/man/hostname @@ -0,0 +1,12 @@ +NAME + hostname - Display and modify hostname + +SYNOPIS + hostname [NEW NAME] + +EXAMPLES + hostname + Prints currently set hostname + + hostname test + Sets hostname of this computer to test From d7a6e67ab3e93270bd5b9b508b24459a34a73b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 19 Feb 2015 22:34:10 +0100 Subject: [PATCH 14/17] Fixed missing require. --- .../assets/opencomputers/loot/OpenOS/boot/94_shell.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua index 1527af1ad..865ad6612 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/94_shell.lua @@ -15,7 +15,7 @@ shell.setAlias("help", "man") shell.setAlias("?", "man") shell.setAlias("cp", "cp -i") -event.listen("init", function() +require("event").listen("init", function() local file = io.open("/etc/hostname") if file then os.setenv("HOSTNAME", file:read("*l")) From 6263b15c7cf51ee1871823c511c5b0710ca8851b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 20 Feb 2015 01:04:30 +0100 Subject: [PATCH 15/17] Fixed workaround. --- src/main/scala/li/cil/oc/common/EventHandler.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index fb206a832..bad067260 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -6,6 +6,7 @@ import cpw.mods.fml.common.Optional import cpw.mods.fml.common.eventhandler.SubscribeEvent import cpw.mods.fml.common.gameevent.PlayerEvent._ import cpw.mods.fml.common.gameevent.TickEvent +import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent import cpw.mods.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent import li.cil.oc._ @@ -97,7 +98,7 @@ object EventHandler { } @SubscribeEvent - def onTick(e: ServerTickEvent) = if (e.phase == TickEvent.Phase.START) { + def onServerTick(e: ServerTickEvent) = if (e.phase == TickEvent.Phase.START) { pending.synchronized { val adds = pending.toArray pending.clear() @@ -107,6 +108,10 @@ object EventHandler { case t: Throwable => OpenComputers.log.warn("Error in scheduled tick action.", t) } }) + } + + @SubscribeEvent + def onClientTick(e: ClientTickEvent) = if (e.phase == TickEvent.Phase.START) { totalWorldTicks += 1 } From fdac72e77f104a68ae68fd7fe87f9ac567dfbd03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 20 Feb 2015 01:28:29 +0100 Subject: [PATCH 16/17] Fix robot run state potentially being initialized incorrectly when playing on a server. --- src/main/scala/li/cil/oc/common/tileentity/Robot.scala | 5 +++++ src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala | 2 -- .../scala/li/cil/oc/common/tileentity/traits/Computer.scala | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index 3a0959bdd..f5ce170df 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -447,6 +447,11 @@ class Robot extends traits.Computer with traits.PowerInformation with IFluidHand swingingTool = nbt.getBoolean(Settings.namespace + "swingingTool") turnAxis = nbt.getByte(Settings.namespace + "turnAxis") } + + // Normally set in superclass, but that's not called directly, only in the + // robot's proxy instance. + _isOutputEnabled = hasRedstoneCard + _isAbstractBusAvailable = hasAbstractBusCard } // Side check for Waila (and other mods that may call this client side). diff --git a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala index 269184479..b97004f74 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala @@ -64,10 +64,8 @@ class RobotProxy(val robot: Robot) extends traits.Computer with traits.PowerInfo override def disconnectComponents() {} - @SideOnly(Side.CLIENT) override def isRunning = robot.isRunning - @SideOnly(Side.CLIENT) override def setRunning(value: Boolean) = robot.setRunning(value) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala index 56df3653a..f41397135 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala @@ -50,7 +50,6 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B def isRunning = _isRunning - @SideOnly(Side.CLIENT) def setRunning(value: Boolean): Unit = if (value != _isRunning) { _isRunning = value world.markBlockForUpdate(x, y, z) @@ -137,7 +136,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B // Kickstart initialization to avoid values getting overwritten by // readFromNBTForClient if that packet is handled after a manual // initialization / state change packet. - _isRunning = machine.isRunning + setRunning(machine.isRunning) _isOutputEnabled = hasRedstoneCard _isAbstractBusAvailable = hasAbstractBusCard } @@ -155,7 +154,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B @SideOnly(Side.CLIENT) override def readFromNBTForClient(nbt: NBTTagCompound) { super.readFromNBTForClient(nbt) - _isRunning = nbt.getBoolean("isRunning") + setRunning(nbt.getBoolean("isRunning")) _users.clear() _users ++= nbt.getTagList("users", NBT.TAG_STRING).map((tag: NBTTagString) => tag.func_150285_a_()) if (_isRunning) runSound.foreach(sound => Sound.startLoop(this, sound, 0.5f, 1000 + world.rand.nextInt(2000))) From c17eab55ea88204e3ac6bc974915fc07f187699b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 20 Feb 2015 01:33:12 +0100 Subject: [PATCH 17/17] All the derpery today. --- .../cil/oc/common/tileentity/traits/Computer.scala | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala index f41397135..65f34d1a6 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala @@ -52,11 +52,13 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B def setRunning(value: Boolean): Unit = if (value != _isRunning) { _isRunning = value - world.markBlockForUpdate(x, y, z) - runSound.foreach(sound => - if (_isRunning) Sound.startLoop(this, sound, 0.5f, 50 + world.rand.nextInt(50)) - else Sound.stopLoop(this) - ) + if (world != null) { + world.markBlockForUpdate(x, y, z) + runSound.foreach(sound => + if (_isRunning) Sound.startLoop(this, sound, 0.5f, 50 + world.rand.nextInt(50)) + else Sound.stopLoop(this) + ) + } } @SideOnly(Side.CLIENT)