From 979dea5337386963cceb2e8cf08ce982ed19f7ce Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sun, 20 Sep 2015 16:57:27 +0400 Subject: [PATCH 1/8] Fix #1445 in RU translation --- src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md index 5e1637111..eed3c4eb2 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md @@ -20,7 +20,7 @@ ### Карты * [Карта абстрактной шины](abstractBusCard.md) -* [Карта данных](dataCard.md) +* [Карта данных](dataCard1.md) * [Отладочная карта](debugCard.md) * [Видеокарта](graphicsCard1.md) * [Интернет карта](internetCard.md) From a5f42623d328ad8ac017b9394916b4496f6ed577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 20 Sep 2015 20:40:12 +0200 Subject: [PATCH 2/8] Fixes #1449. --- src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala b/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala index c20638547..fac5973fb 100644 --- a/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala +++ b/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala @@ -53,5 +53,5 @@ trait InventoryProxy extends IInventory { override def closeInventory() = inventory.closeInventory() - private def isValidSlot(slot: Int) = slot >= 0 && slot < getSizeInventory + private def isValidSlot(slot: Int) = slot >= offset && slot < getSizeInventory + offset } From f440245b939574c546468f9202d7e7fca7274425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 19:32:34 +0200 Subject: [PATCH 3/8] Fix potential stackoverflow in charger, closes #1451. --- .../li/cil/oc/common/tileentity/Charger.scala | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala index ca15f83a9..e4a4c3430 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala @@ -226,14 +226,29 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R abstract class ConnectorChargeable(val connector: Connector) extends Chargeable { override def changeBuffer(delta: Double): Double = connector.changeBuffer(delta) + + override def equals(obj: scala.Any): Boolean = obj match { + case chargeable: ConnectorChargeable => chargeable.connector == chargeable + case _ => false + } } class RobotChargeable(val robot: Robot) extends ConnectorChargeable(robot.node.asInstanceOf[Connector]) { override def pos: Vec3 = BlockPosition(robot).toVec3 + + override def equals(obj: scala.Any): Boolean = obj match { + case chargeable: RobotChargeable => chargeable.robot == robot + case _ => false + } } class DroneChargeable(val drone: Drone) extends ConnectorChargeable(drone.components.node.asInstanceOf[Connector]) { override def pos: Vec3 = Vec3.createVectorHelper(drone.posX, drone.posY, drone.posZ) + + override def equals(obj: scala.Any): Boolean = obj match { + case chargeable: DroneChargeable => chargeable.drone == drone + case _ => false + } } class PlayerChargeable(val player: EntityPlayer) extends Chargeable { @@ -245,6 +260,11 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R case _ => delta // Cannot charge. } } + + override def equals(obj: scala.Any): Boolean = obj match { + case chargeable: PlayerChargeable => chargeable.player == player + case _ => false + } } } From f3f7fb559e8359ccf54d4ea5988cc167322501f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 19:33:05 +0200 Subject: [PATCH 4/8] Only enable EnderIO integration for 2.2; will update to 2.3 when it's out of beta. --- src/main/scala/li/cil/oc/integration/Mods.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index d2e7619ec..85c8f1f3b 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -39,7 +39,7 @@ object Mods { val CraftingCosts = new SimpleMod(IDs.CraftingCosts) val DeepStorageUnit = new ClassBasedMod(IDs.DeepStorageUnit, "powercrystals.minefactoryreloaded.api.IDeepStorageUnit")() val ElectricalAge = new SimpleMod(IDs.ElectricalAge, providesPower = true) - val EnderIO = new SimpleMod(IDs.EnderIO) + val EnderIO = new SimpleMod(IDs.EnderIO, version = "@[2.2,2.3)") val EnderStorage = new SimpleMod(IDs.EnderStorage) val ExtraCells = new SimpleMod(IDs.ExtraCells, version = "@[2.2.73,)") val Factorization = new SimpleMod(IDs.Factorization, providesPower = true) From 2b970bc65a85f7d0241b6c7a345a5ccb93e2c953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 20:54:02 +0200 Subject: [PATCH 5/8] Added command to generate debug nanomachine configuration (/oc_debugNanomachines or /oc_dn). --- .../common/nanomachines/ControllerImpl.scala | 7 ++++ .../common/nanomachines/NeuralNetwork.scala | 24 +++++++++++++ .../oc/server/command/CommandHandler.scala | 1 + .../command/DebugNanomachinesCommand.scala | 36 +++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala 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 20933b275..4411c25ce 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/ControllerImpl.scala @@ -290,6 +290,13 @@ class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessE } } + def debug(): Unit = { + if (isServer) { + configuration.debug() + activeBehaviorsDirty = true + } + } + // ----------------------------------------------------------------------- // def save(nbt: NBTTagCompound): Unit = configuration.synchronized { diff --git a/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala b/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala index 3731e418f..ac64a9ac3 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala @@ -1,5 +1,6 @@ package li.cil.oc.common.nanomachines +import li.cil.oc.OpenComputers import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.Persistable @@ -83,6 +84,29 @@ class NeuralNetwork(controller: ControllerImpl) extends Persistable { behaviorMap ++= behaviors.map(n => n.behavior -> n) } + // Enter debug configuration, one input -> one behavior, and list mapping in console. + def debug(): Unit = { + OpenComputers.log.info(s"Creating debug configuration for nanomachines in player ${controller.player.getDisplayName}.") + + behaviors.clear() + behaviors ++= api.Nanomachines.getProviders. + map(p => (p, Option(p.createBehaviors(controller.player)).map(_.filter(_ != null)).orNull)). // Remove null behaviors. + filter(_._2 != null). // Remove null lists.. + flatMap(pb => pb._2.map(b => new BehaviorNeuron(pb._1, b))) + + connectors.clear() + + triggers.clear() + for (i <- behaviors.indices) { + val behavior = behaviors(i) + val trigger = new TriggerNeuron() + triggers += trigger + behavior.inputs += trigger + + OpenComputers.log.info(s"$i -> ${behavior.behavior.getNameHint} (${behavior.behavior.getClass.toString})") + } + } + override def save(nbt: NBTTagCompound): Unit = { nbt.setNewTagList("triggers", triggers.map(t => { val nbt = new NBTTagCompound() diff --git a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala index 0c70c60fe..540899609 100644 --- a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala +++ b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala @@ -4,6 +4,7 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent object CommandHandler { def register(e: FMLServerStartingEvent) { + e.registerServerCommand(DebugNanomachinesCommand) e.registerServerCommand(NonDisassemblyAgreementCommand) e.registerServerCommand(WirelessRenderingCommand) e.registerServerCommand(SpawnComputerCommand) diff --git a/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala b/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala new file mode 100644 index 000000000..30ac60ae9 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala @@ -0,0 +1,36 @@ +package li.cil.oc.server.command + +import li.cil.oc.api +import li.cil.oc.common.command.SimpleCommand +import li.cil.oc.common.nanomachines.ControllerImpl +import net.minecraft.command.ICommandSender +import net.minecraft.command.WrongUsageException +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.util.ChatComponentText + +object DebugNanomachinesCommand extends SimpleCommand("oc_debugNanomachines") { + aliases += "oc_dn" + + override def getCommandUsage(source: ICommandSender): String = name + + override def processCommand(source: ICommandSender, command: Array[String]) { + source match { + case player: EntityPlayer => + api.Nanomachines.installController(player) match { + case controller: ControllerImpl => + controller.debug() + player.addChatMessage(new ChatComponentText("Debug configuration created, see log for mappings.")) + case _ => // Someone did something. + } + case _ => throw new WrongUsageException("Can only be used by players.") + } + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 2 +} From e6922f86c3d06594bf1dd40ac13bad4d5eadf6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 20:55:25 +0200 Subject: [PATCH 6/8] Increase the likelihood of some behaviors not being available at all in a configuration. --- src/main/resources/application.conf | 2 +- .../scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 2d74bbc8a..67f779278 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -994,7 +994,7 @@ opencomputers { # if there are a total of 10 behaviors available, 0.5 means there will # be 5 trigger inputs, triggers being the inputs that can be activated # via nanomachines. - triggerQuota: 0.5 + triggerQuota: 0.4 # The relative number of connectors based on the number of available # behaviors (see triggerQuota). diff --git a/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala b/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala index ac64a9ac3..29b1f9c3a 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/NeuralNetwork.scala @@ -173,7 +173,7 @@ class NeuralNetwork(controller: ControllerImpl) extends Persistable { class ConnectorNeuron extends Neuron { val inputs = mutable.ArrayBuffer.empty[Neuron] - override def isActive = inputs.exists(_.isActive) + override def isActive = inputs.forall(_.isActive) } class BehaviorNeuron(val provider: BehaviorProvider, val behavior: Behavior) extends ConnectorNeuron From bff25a3cca5b807a2bf9581574b72659cc13c703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 20:58:49 +0200 Subject: [PATCH 7/8] Include particle name in hint, closes #1450. --- .../cil/oc/common/nanomachines/provider/ParticleProvider.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/nanomachines/provider/ParticleProvider.scala b/src/main/scala/li/cil/oc/common/nanomachines/provider/ParticleProvider.scala index 95822bed3..b4f8db4b9 100644 --- a/src/main/scala/li/cil/oc/common/nanomachines/provider/ParticleProvider.scala +++ b/src/main/scala/li/cil/oc/common/nanomachines/provider/ParticleProvider.scala @@ -40,7 +40,7 @@ object ParticleProvider extends ScalaProvider("b48c4bbd-51bb-4915-9367-16cff3220 } class ParticleBehavior(var effectName: String, player: EntityPlayer) extends AbstractBehavior(player) { - override def getNameHint = "particles" + override def getNameHint = "particles." + effectName override def update(): Unit = { val world = player.getEntityWorld From e0f4a0c81ee9091d19fc0ca832d01820fe98af37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 21 Sep 2015 21:04:14 +0200 Subject: [PATCH 8/8] Disable chance of stuff breaking when disassembling creatively, closes #1447. --- .../scala/li/cil/oc/common/tileentity/Disassembler.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index d2e38f0f1..9c9fc7534 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -83,11 +83,12 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra while (buffer >= Settings.get.disassemblerItemCost && queue.nonEmpty) { buffer -= Settings.get.disassemblerItemCost val stack = queue.remove(0) - if (world.rand.nextDouble >= Settings.get.disassemblerBreakChance) { + if (disassembleNextInstantly || world.rand.nextDouble >= Settings.get.disassemblerBreakChance) { drop(stack) } } } + disassembleNextInstantly = queue.nonEmpty // If we have nothing left to do, stop being creative. } } @@ -105,9 +106,11 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra totalRequiredEnergy = queue.size * Settings.get.disassemblerItemCost if (instant) { buffer = totalRequiredEnergy - disassembleNextInstantly = false // Just to be sure... } } + else { + drop(stack) + } } private def drop(stack: ItemStack) {