From b81ef83d68d35aa4c82ac7baef9f577c8848b7e0 Mon Sep 17 00:00:00 2001 From: Cloud Chagnon Date: Thu, 20 Jan 2022 13:06:14 -0700 Subject: [PATCH] Fix #16, clients now use server configured terminal dimensions. (#55) Adds `TerminalDimensionsClientMessage` that: - is sent to each player on server join. - syncs computer, pocket, and maximum monitor sizes. --- .../shared/network/NetworkHandler.java | 1 + .../TerminalDimensionsClientMessage.java | 70 +++++++++++++++++++ .../proxy/ComputerCraftProxyCommon.java | 6 ++ 3 files changed, 77 insertions(+) create mode 100644 src/main/java/dan200/computercraft/shared/network/client/TerminalDimensionsClientMessage.java diff --git a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java index 469927cf3..aa2833e96 100644 --- a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java +++ b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java @@ -76,6 +76,7 @@ public final class NetworkHandler registerMainThread( 18, SpeakerPlayClientMessage.class, SpeakerPlayClientMessage::new ); registerMainThread( 19, SpeakerStopClientMessage.class, SpeakerStopClientMessage::new ); registerMainThread( 20, UploadResultMessage.class, UploadResultMessage::new ); + registerMainThread( 21, TerminalDimensionsClientMessage.class, TerminalDimensionsClientMessage::new ); } private static void receive( MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buffer, PacketSender sender ) diff --git a/src/main/java/dan200/computercraft/shared/network/client/TerminalDimensionsClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/TerminalDimensionsClientMessage.java new file mode 100644 index 000000000..69ce7f445 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/network/client/TerminalDimensionsClientMessage.java @@ -0,0 +1,70 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared.network.client; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.network.NetworkMessage; +import dan200.computercraft.shared.network.PacketContext; +import net.minecraft.network.FriendlyByteBuf; + +import javax.annotation.Nonnull; + +/** + * The terminal and portable computer server-side configured dimensions. + */ +public class TerminalDimensionsClientMessage implements NetworkMessage +{ + + private final int computerTermWidth; + private final int computerTermHeight; + private final int pocketTermWidth; + private final int pocketTermHeight; + private final int monitorWidth; + private final int monitorHeight; + + public TerminalDimensionsClientMessage() + { + this.computerTermWidth = ComputerCraft.computerTermWidth; + this.computerTermHeight = ComputerCraft.computerTermHeight; + this.pocketTermWidth = ComputerCraft.pocketTermWidth; + this.pocketTermHeight = ComputerCraft.pocketTermHeight; + this.monitorHeight = ComputerCraft.monitorHeight; + this.monitorWidth = ComputerCraft.monitorWidth; + } + + public TerminalDimensionsClientMessage( @Nonnull FriendlyByteBuf buf ) + { + computerTermWidth = buf.readVarInt(); + computerTermHeight = buf.readVarInt(); + pocketTermWidth = buf.readVarInt(); + pocketTermHeight = buf.readVarInt(); + monitorHeight = buf.readVarInt(); + monitorWidth = buf.readVarInt(); + } + + @Override + public void toBytes( FriendlyByteBuf buf ) + { + buf.writeVarInt( computerTermWidth ); + buf.writeVarInt( computerTermHeight ); + buf.writeVarInt( pocketTermWidth ); + buf.writeVarInt( pocketTermHeight ); + buf.writeVarInt( monitorWidth ); + buf.writeVarInt( monitorHeight ); + } + + @Override + public void handle( PacketContext context ) + { + ComputerCraft.computerTermWidth = this.computerTermWidth; + ComputerCraft.computerTermHeight = this.computerTermHeight; + ComputerCraft.pocketTermWidth = this.pocketTermWidth; + ComputerCraft.pocketTermHeight = this.pocketTermHeight; + ComputerCraft.monitorWidth = this.monitorWidth; + ComputerCraft.monitorHeight = this.monitorHeight; + } + +} diff --git a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java index 060fbd866..cb3efc464 100644 --- a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java +++ b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java @@ -23,6 +23,7 @@ import dan200.computercraft.shared.data.HasComputerIdLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.media.items.RecordMedia; import dan200.computercraft.shared.network.NetworkHandler; +import dan200.computercraft.shared.network.client.TerminalDimensionsClientMessage; import dan200.computercraft.shared.peripheral.commandblock.CommandBlockPeripheral; import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods; import dan200.computercraft.shared.peripheral.modem.wired.BlockCable; @@ -36,6 +37,7 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -139,6 +141,10 @@ public final class ComputerCraftProxyCommon // Config ServerLifecycleEvents.SERVER_STARTING.register( Config::serverStarting ); ServerLifecycleEvents.SERVER_STOPPING.register( Config::serverStopping ); + ServerPlayConnectionEvents.JOIN.register( ( listener, sender, server ) -> + { + NetworkHandler.sendToPlayer( listener.player, new TerminalDimensionsClientMessage() ); + } ); TurtleEvent.EVENT_BUS.register( FurnaceRefuelHandler.INSTANCE ); TurtleEvent.EVENT_BUS.register( new TurtlePermissions() );