Merge branch 'debug-messages' of https://github.com/Vexatos/OpenComputers into master-MC1.7.10

This commit is contained in:
Florian Nücke 2017-02-03 21:43:09 +01:00
commit 5209f57239
7 changed files with 116 additions and 8 deletions

View File

@ -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. 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. 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`).

View File

@ -46,6 +46,7 @@ object PacketHandler extends CommonPacketHandler {
case PacketType.Analyze => onAnalyze(p) case PacketType.Analyze => onAnalyze(p)
case PacketType.ChargerState => onChargerState(p) case PacketType.ChargerState => onChargerState(p)
case PacketType.ClientLog => onClientLog(p) case PacketType.ClientLog => onClientLog(p)
case PacketType.Clipboard => onClipboard(p)
case PacketType.ColorChange => onColorChange(p) case PacketType.ColorChange => onColorChange(p)
case PacketType.ComputerState => onComputerState(p) case PacketType.ComputerState => onComputerState(p)
case PacketType.ComputerUserList => onComputerUserList(p) case PacketType.ComputerUserList => onComputerUserList(p)
@ -133,6 +134,10 @@ object PacketHandler extends CommonPacketHandler {
OpenComputers.log.info(p.readUTF()) OpenComputers.log.info(p.readUTF())
} }
def onClipboard(p: PacketParser) {
GuiScreen.setClipboardString(p.readUTF())
}
def onColorChange(p: PacketParser) = def onColorChange(p: PacketParser) =
p.readTileEntity[Colored]() match { p.readTileEntity[Colored]() match {
case Some(t) => case Some(t) =>

View File

@ -67,6 +67,14 @@ object PacketSender {
pb.sendToPlayer(player) 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) { def sendColorChange(t: Colored) {
val pb = new SimplePacketBuilder(PacketType.ColorChange) val pb = new SimplePacketBuilder(PacketType.ColorChange)

View File

@ -11,5 +11,6 @@ object CommandHandler {
e.registerServerCommand(WirelessRenderingCommand) e.registerServerCommand(WirelessRenderingCommand)
e.registerServerCommand(SpawnComputerCommand) e.registerServerCommand(SpawnComputerCommand)
e.registerServerCommand(DebugWhitelistCommand) e.registerServerCommand(DebugWhitelistCommand)
e.registerServerCommand(SendDebugMessageCommand)
} }
} }

View File

@ -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
}

View File

@ -12,10 +12,14 @@ import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context import li.cil.oc.api.machine.Context
import li.cil.oc.api.network.Environment import li.cil.oc.api.network.Environment
import li.cil.oc.api.network.Node 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.SidedEnvironment
import li.cil.oc.api.network.Visibility import li.cil.oc.api.network.Visibility
import li.cil.oc.api.prefab import li.cil.oc.api.prefab
import li.cil.oc.api.prefab.AbstractValue 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.server.component.DebugCard.{AccessContext, CommandSender}
import li.cil.oc.util.BlockPosition import li.cil.oc.util.BlockPosition
import li.cil.oc.util.ExtendedArguments._ import li.cil.oc.util.ExtendedArguments._
@ -44,7 +48,7 @@ import net.minecraftforge.fluids.IFluidHandler
import scala.collection.convert.WrapAsScala._ import scala.collection.convert.WrapAsScala._
import scala.collection.mutable 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). override val node = Network.newNode(this, Visibility.Neighbors).
withComponent("debug"). withComponent("debug").
withConnector(). withConnector().
@ -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 = { override def onConnect(node: Node): Unit = {
super.onConnect(node) super.onConnect(node)
if (node == this.node) remoteNodePosition.foreach { if (node == this.node) {
case (x, y, z) => DebugNetwork.add(this)
remoteNode = findNode(x, y, z) remoteNodePosition.foreach {
remoteNode match { case (x, y, z) =>
case Some(other) => node.connect(other) remoteNode = findNode(x, y, z)
case _ => remoteNodePosition = None remoteNode match {
} case Some(other) => node.connect(other)
case _ => remoteNodePosition = None
}
}
} }
} }
override def onDisconnect(node: Node): Unit = { override def onDisconnect(node: Node): Unit = {
super.onDisconnect(node) super.onDisconnect(node)
if (node == this.node) { if (node == this.node) {
DebugNetwork.remove(this)
remoteNode.foreach(other => other.disconnect(node)) remoteNode.foreach(other => other.disconnect(node))
} }
else if (remoteNode.contains(node)) { else if (remoteNode.contains(node)) {

View File

@ -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
}
}