Skip to content

Commit

Permalink
Rewrite networking system to fix environment error on servers
Browse files Browse the repository at this point in the history
  • Loading branch information
object-Object committed Jun 11, 2024
1 parent 3e70ace commit 22a9206
Show file tree
Hide file tree
Showing 19 changed files with 154 additions and 256 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import dev.architectury.event.events.client.ClientPlayerEvent
import gay.`object`.hexdebug.HexDebug
import gay.`object`.hexdebug.config.HexDebugConfig
import gay.`object`.hexdebug.items.ItemDebugger
import gay.`object`.hexdebug.networking.msg.MsgDebugAdapterProxyC2S
import gay.`object`.hexdebug.networking.msg.MsgDebugAdapterProxy
import io.ktor.network.selector.*
import io.ktor.network.sockets.*
import io.ktor.utils.io.jvm.javaio.*
Expand Down Expand Up @@ -139,7 +139,7 @@ class DebugProxyClientProducer(input: InputStream) : StreamMessageProducer(input

// instead of parsing the message here, just forward it to the server
val content = String(buffer, charset(headers.charset))
MsgDebugAdapterProxyC2S(content).sendToServer()
MsgDebugAdapterProxy(content).sendToServer()
} catch (exception: Exception) {
// UnsupportedEncodingException can be thrown by String constructor
// JsonParseException can be thrown by jsonHandler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package gay.`object`.hexdebug.adapter.proxy

import gay.`object`.hexdebug.adapter.DebugAdapter
import gay.`object`.hexdebug.adapter.IHexDebugLauncher
import gay.`object`.hexdebug.networking.msg.MsgDebugAdapterProxyS2C
import gay.`object`.hexdebug.networking.msg.MsgDebugAdapterProxy
import net.minecraft.server.level.ServerPlayer
import org.eclipse.lsp4j.debug.services.IDebugProtocolClient
import org.eclipse.lsp4j.jsonrpc.*
Expand Down Expand Up @@ -105,7 +105,7 @@ class DebugProxyServerConsumer(
override fun consume(message: Message) {
try {
val content = jsonHandler.serialize(message)
MsgDebugAdapterProxyS2C(content).sendToPlayer(player)
MsgDebugAdapterProxy(content).sendToPlayer(player)
} catch (exception: IOException) {
throw JsonRpcException(exception)
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,14 @@ package gay.`object`.hexdebug.networking

import dev.architectury.networking.NetworkChannel
import gay.`object`.hexdebug.HexDebug
import gay.`object`.hexdebug.networking.msg.*
import net.minecraft.server.level.ServerPlayer
import gay.`object`.hexdebug.networking.msg.HexDebugMessageCompanion

object HexDebugNetworking {
private val CHANNEL = NetworkChannel.create(HexDebug.id("networking_channel"))
val CHANNEL: NetworkChannel = NetworkChannel.create(HexDebug.id("networking_channel"))

fun init() {
val messages = listOf(
MsgDebugAdapterProxyC2S,
MsgDebugAdapterProxyS2C,
MsgDebuggerStateS2C,
MsgEvaluatorStateS2C,
MsgPrintDebuggerStatusS2C,
MsgSplicingTableActionC2S,
MsgSplicingTableGetDataC2S,
MsgSplicingTableNewSelectionS2C,
MsgSplicingTableNewDataS2C,
MsgSplicingTableNewStaffPatternC2S,
MsgSplicingTableNewStaffPatternS2C,
)
for (message in messages) {
message.register(CHANNEL)
for (subclass in HexDebugMessageCompanion::class.sealedSubclasses) {
subclass.objectInstance?.register(CHANNEL)
}
}

fun <T> sendToServer(message: T) = CHANNEL.sendToServer(message)

fun <T> sendToPlayer(player: ServerPlayer, message: T) = CHANNEL.sendToPlayer(player, message)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package gay.`object`.hexdebug.networking.handler

import at.petrak.hexcasting.api.casting.eval.ExecutionClientView
import dev.architectury.networking.NetworkManager.PacketContext
import gay.`object`.hexdebug.adapter.proxy.DebugProxyClient
import gay.`object`.hexdebug.config.DebuggerDisplayMode
import gay.`object`.hexdebug.config.HexDebugConfig
import gay.`object`.hexdebug.gui.SplicingTableMenu
import gay.`object`.hexdebug.gui.SplicingTableScreen
import gay.`object`.hexdebug.items.ItemDebugger
import gay.`object`.hexdebug.items.ItemDebugger.DebugState
import gay.`object`.hexdebug.items.ItemEvaluator
import gay.`object`.hexdebug.items.ItemEvaluator.EvalState
import gay.`object`.hexdebug.networking.msg.*
import net.minecraft.network.chat.Component

fun HexDebugMessageS2C.applyOnClient(ctx: PacketContext) {
when (this) {
is MsgDebugAdapterProxy -> {
DebugProxyClient.instance?.consume(content)
}

is MsgDebuggerStateS2C -> {
ItemDebugger.debugState = debuggerState
if (debuggerState == DebugState.NOT_DEBUGGING) {
ItemEvaluator.evalState = EvalState.DEFAULT
}
}

is MsgEvaluatorStateS2C -> {
ItemEvaluator.evalState = evalState
}

is MsgPrintDebuggerStatusS2C -> {
val config = HexDebugConfig.get().client
val shouldPrint = when (config.debuggerDisplayMode) {
DebuggerDisplayMode.DISABLED -> false
DebuggerDisplayMode.NOT_CONNECTED -> !isConnected
DebuggerDisplayMode.ENABLED -> true
}

if (shouldPrint) {
ctx.player.displayClientMessage(
Component.translatable(
"text.hexdebug.debugger_stopped",
if (config.showDebugClientLineNumber) line else index,
iota,
),
true,
)
}
}

is MsgSplicingTableNewDataS2C -> {
SplicingTableMenu.getInstance(ctx.player)?.also { menu ->
menu.clientView = data
SplicingTableScreen.getInstance()?.updateButtons()
}
}

is MsgSplicingTableNewSelectionS2C -> {
SplicingTableScreen.getInstance()?.selection = selection
}

is MsgSplicingTableNewStaffPatternS2C -> {
val info = ExecutionClientView(false, resolutionType, listOf(), null)
SplicingTableScreen.getInstance()?.guiSpellcasting?.recvServerUpdate(info, index)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package gay.`object`.hexdebug.networking.handler

import dev.architectury.networking.NetworkManager.PacketContext
import gay.`object`.hexdebug.adapter.DebugAdapterManager
import gay.`object`.hexdebug.gui.SplicingTableMenu
import gay.`object`.hexdebug.networking.msg.*
import net.minecraft.server.level.ServerPlayer

fun HexDebugMessageC2S.applyOnServer(ctx: PacketContext) {
val player = ctx.player as ServerPlayer
when (this) {
is MsgDebugAdapterProxy -> {
DebugAdapterManager[ctx.player]?.launcher?.handleMessage(content)
}

is MsgSplicingTableActionC2S -> {
val menu = SplicingTableMenu.getInstance(ctx.player) ?: return
val newSelection = menu.table.runAction(action, ctx.player as? ServerPlayer, selection)
MsgSplicingTableNewSelectionS2C(newSelection).sendToPlayer(ctx.player as ServerPlayer)
}

is MsgSplicingTableGetDataC2S -> {
SplicingTableMenu.getInstance(ctx.player)?.sendData(ctx.player as ServerPlayer)
}

is MsgSplicingTableNewStaffPatternC2S -> {
val menu = SplicingTableMenu.getInstance(player) ?: return
val (newSelection, resolutionType) = menu.table.drawPattern(player, pattern, index, selection)
MsgSplicingTableNewSelectionS2C(newSelection).sendToPlayer(player)
MsgSplicingTableNewStaffPatternS2C(resolutionType, index).sendToPlayer(player)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
package gay.`object`.hexdebug.networking
package gay.`object`.hexdebug.networking.msg

import dev.architectury.networking.NetworkChannel
import dev.architectury.networking.NetworkManager.PacketContext
import gay.`object`.hexdebug.HexDebug
import gay.`object`.hexdebug.networking.HexDebugNetworking
import gay.`object`.hexdebug.networking.handler.applyOnClient
import gay.`object`.hexdebug.networking.handler.applyOnServer
import net.fabricmc.api.EnvType
import net.fabricmc.api.Environment
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.server.level.ServerPlayer
import java.util.function.Supplier

interface HexDebugMessage

interface HexDebugMessageC2S : HexDebugMessage {
fun applyOnServer(ctx: PacketContext)
sealed interface HexDebugMessage

sealed interface HexDebugMessageC2S : HexDebugMessage {
fun sendToServer() {
HexDebugNetworking.CHANNEL.sendToServer(this)
}
}

interface HexDebugMessageS2C : HexDebugMessage {
@Environment(EnvType.CLIENT)
fun applyOnClient(ctx: PacketContext)

sealed interface HexDebugMessageS2C : HexDebugMessage {
fun sendToPlayer(player: ServerPlayer) {
HexDebugNetworking.CHANNEL.sendToPlayer(player, this)
}
Expand All @@ -32,7 +29,7 @@ interface HexDebugMessageS2C : HexDebugMessage {
}
}

interface HexDebugMessageCompanion<T : HexDebugMessage> {
sealed interface HexDebugMessageCompanion<T : HexDebugMessage> {
val type: Class<T>

fun decode(buf: FriendlyByteBuf): T
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gay.`object`.hexdebug.networking.msg

import net.minecraft.network.FriendlyByteBuf

data class MsgDebugAdapterProxy(val content: String) : HexDebugMessageC2S, HexDebugMessageS2C {
companion object : HexDebugMessageCompanion<MsgDebugAdapterProxy> {
override val type = MsgDebugAdapterProxy::class.java

override fun decode(buf: FriendlyByteBuf) = MsgDebugAdapterProxy(
buf.readUtf(),
)

override fun MsgDebugAdapterProxy.encode(buf: FriendlyByteBuf) {
buf.writeUtf(content)
}
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
package gay.`object`.hexdebug.networking.msg

import dev.architectury.networking.NetworkManager.PacketContext
import gay.`object`.hexdebug.items.ItemDebugger
import gay.`object`.hexdebug.items.ItemDebugger.DebugState
import gay.`object`.hexdebug.items.ItemEvaluator
import gay.`object`.hexdebug.items.ItemEvaluator.EvalState
import gay.`object`.hexdebug.networking.HexDebugMessageCompanionS2C
import gay.`object`.hexdebug.networking.HexDebugMessageS2C
import net.minecraft.network.FriendlyByteBuf

data class MsgDebuggerStateS2C(val debuggerState: DebugState) : HexDebugMessageS2C {
companion object : HexDebugMessageCompanionS2C<MsgDebuggerStateS2C> {
companion object : HexDebugMessageCompanion<MsgDebuggerStateS2C> {
override val type = MsgDebuggerStateS2C::class.java

override fun decode(buf: FriendlyByteBuf) = MsgDebuggerStateS2C(
Expand All @@ -20,12 +14,5 @@ data class MsgDebuggerStateS2C(val debuggerState: DebugState) : HexDebugMessageS
override fun MsgDebuggerStateS2C.encode(buf: FriendlyByteBuf) {
buf.writeEnum(debuggerState)
}

override fun MsgDebuggerStateS2C.applyOnClient(ctx: PacketContext) = ctx.queue {
ItemDebugger.debugState = debuggerState
if (debuggerState == DebugState.NOT_DEBUGGING) {
ItemEvaluator.evalState = EvalState.DEFAULT
}
}
}
}
Loading

0 comments on commit 22a9206

Please sign in to comment.