Skip to content

Commit

Permalink
Merge branch 'debug-messages' of https://github.com/Vexatos/OpenCompu…
Browse files Browse the repository at this point in the history
…ters into master-MC1.7.10
  • Loading branch information
fnuecke committed Feb 3, 2017
2 parents c86ce4d + a5e718b commit 5209f57
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@
The debug card is a creative-only item that was originally only intended to make debugging things easier, by automating some processes. It has since gotten a bunch more functionality, making it quite useful for custom map-making.

Note that you can use sneak-activate while holding the card to bind it to you or unbind it, meaning `runCommand` will be performed using your permission levels instead of the default OpenComputers ones.

A debug card can receive messages similar to a [linked card](linkedCard.md), firing a `debug_message` event. You can send such a message using either another debug card's `sendDebugMessage` or the Minecraft command `/oc_sendDebugMessage` (or `/oc_sdbg`).
5 changes: 5 additions & 0 deletions src/main/scala/li/cil/oc/client/PacketHandler.scala
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ object PacketHandler extends CommonPacketHandler {
case PacketType.Analyze => onAnalyze(p)
case PacketType.ChargerState => onChargerState(p)
case PacketType.ClientLog => onClientLog(p)
case PacketType.Clipboard => onClipboard(p)
case PacketType.ColorChange => onColorChange(p)
case PacketType.ComputerState => onComputerState(p)
case PacketType.ComputerUserList => onComputerUserList(p)
Expand Down Expand Up @@ -133,6 +134,10 @@ object PacketHandler extends CommonPacketHandler {
OpenComputers.log.info(p.readUTF())
}

def onClipboard(p: PacketParser) {
GuiScreen.setClipboardString(p.readUTF())
}

def onColorChange(p: PacketParser) =
p.readTileEntity[Colored]() match {
case Some(t) =>
Expand Down
8 changes: 8 additions & 0 deletions src/main/scala/li/cil/oc/server/PacketSender.scala
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,14 @@ object PacketSender {
pb.sendToPlayer(player)
}

def sendClipboard(player: EntityPlayerMP, text: String) {
val pb = new SimplePacketBuilder(PacketType.Clipboard)

pb.writeUTF(text)

pb.sendToPlayer(player)
}

def sendColorChange(t: Colored) {
val pb = new SimplePacketBuilder(PacketType.ColorChange)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ object CommandHandler {
e.registerServerCommand(WirelessRenderingCommand)
e.registerServerCommand(SpawnComputerCommand)
e.registerServerCommand(DebugWhitelistCommand)
e.registerServerCommand(SendDebugMessageCommand)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package li.cil.oc.server.command

import li.cil.oc.api.Network
import li.cil.oc.common.command.SimpleCommand
import li.cil.oc.server.network.DebugNetwork
import net.minecraft.command.ICommandSender
import net.minecraft.command.WrongUsageException

object SendDebugMessageCommand extends SimpleCommand("oc_sendDebugMessage") {
aliases += "oc_sdbg"

override def getCommandUsage(sender: ICommandSender): String = name + "<destinationAddress> [message...]"

override def processCommand(sender: ICommandSender, args: Array[String]): Unit = {
if (args == null || args.length == 0) {
throw new WrongUsageException("no destination address specified.")
}
val destination = args(0)
DebugNetwork.getEndpoint(destination).foreach { endpoint =>
val packet = Network.newPacket(sender.getCommandSenderName, destination, 0, args.drop(1).toList.toArray[AnyRef])
endpoint.receivePacket(packet)
}
}

override def getRequiredPermissionLevel = 2
}
57 changes: 49 additions & 8 deletions src/main/scala/li/cil/oc/server/component/DebugCard.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@ import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network.Environment
import li.cil.oc.api.network.Node
import li.cil.oc.api.network.Packet
import li.cil.oc.api.network.SidedEnvironment
import li.cil.oc.api.network.Visibility
import li.cil.oc.api.prefab
import li.cil.oc.api.prefab.AbstractValue
import li.cil.oc.server.PacketSender
import li.cil.oc.server.network.DebugNetwork
import li.cil.oc.server.network.DebugNetwork.DebugNode
import li.cil.oc.server.component.DebugCard.{AccessContext, CommandSender}
import li.cil.oc.util.BlockPosition
import li.cil.oc.util.ExtendedArguments._
Expand Down Expand Up @@ -44,7 +48,7 @@ import net.minecraftforge.fluids.IFluidHandler
import scala.collection.convert.WrapAsScala._
import scala.collection.mutable

class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment {
class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment with DebugNode {
override val node = Network.newNode(this, Visibility.Neighbors).
withComponent("debug").
withConnector().
Expand Down Expand Up @@ -190,21 +194,58 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment {

// ----------------------------------------------------------------------- //

@Callback(doc = """function(player:string, text:string) -- Sends text to the specified player's clipboard if possible.""")
def sendToClipboard(context: Context, args: Arguments): Array[AnyRef] = {
checkAccess()
Option(MinecraftServer.getServer.getConfigurationManager.func_152612_a(args.checkString(0))) match {
case Some(player) =>
PacketSender.sendClipboard(player, args.checkString(1))
result(true)
case _ =>
result(false, "no such player")
}
}

@Callback(doc = """function(address:string, data...) -- Sends data to the debug card with the specified address.""")
def sendToDebugCard(context: Context, args: Arguments): Array[AnyRef] = {
checkAccess()
val destination = args.checkString(0)
DebugNetwork.getEndpoint(destination).filter(_ != this).foreach{endpoint =>
// Cast to iterable to use Scala's toArray instead of the Arguments' one (which converts byte arrays to Strings).
val packet = Network.newPacket(node.address, destination, 0, args.drop(1).asInstanceOf[java.lang.Iterable[AnyRef]].toArray)
endpoint.receivePacket(packet)
}
result()
}

override def receivePacket(packet: Packet) {
val distance = 0
node.sendToReachable("computer.signal", Seq("debug_message", packet.source, Int.box(packet.port), Double.box(distance)) ++ packet.data: _*)
}

override def address: String = if(node != null) node.address() else "debug"

// ----------------------------------------------------------------------- //

override def onConnect(node: Node): Unit = {
super.onConnect(node)
if (node == this.node) remoteNodePosition.foreach {
case (x, y, z) =>
remoteNode = findNode(x, y, z)
remoteNode match {
case Some(other) => node.connect(other)
case _ => remoteNodePosition = None
}
if (node == this.node) {
DebugNetwork.add(this)
remoteNodePosition.foreach {
case (x, y, z) =>
remoteNode = findNode(x, y, z)
remoteNode match {
case Some(other) => node.connect(other)
case _ => remoteNodePosition = None
}
}
}
}

override def onDisconnect(node: Node): Unit = {
super.onDisconnect(node)
if (node == this.node) {
DebugNetwork.remove(this)
remoteNode.foreach(other => other.disconnect(node))
}
else if (remoteNode.contains(node)) {
Expand Down
25 changes: 25 additions & 0 deletions src/main/scala/li/cil/oc/server/network/DebugNetwork.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package li.cil.oc.server.network

import li.cil.oc.api.network.Packet

import scala.collection.mutable

object DebugNetwork {
val cards = mutable.WeakHashMap.empty[DebugNode, Unit]

def add(card: DebugNode) {
cards.put(card, Unit)
}

def remove(card: DebugNode) {
cards.remove(card)
}

def getEndpoint(tunnel: String) = cards.keys.find(_.address == tunnel)

trait DebugNode {
def address: String

def receivePacket(packet: Packet): Unit
}
}

0 comments on commit 5209f57

Please sign in to comment.