From 3c141d9e1bafc17ac1b329d3483d9a2316662604 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Sun, 12 Mar 2023 16:33:58 -0400 Subject: [PATCH] redo like literally all of networking --- src/main/java/net/montoyo/wd/WebDisplays.java | 24 +- .../montoyo/wd/block/BlockKeyboardLeft.java | 17 +- .../montoyo/wd/block/BlockKeyboardRight.java | 6 +- .../net/montoyo/wd/block/BlockPeripheral.java | 10 +- .../java/net/montoyo/wd/block/BlockRCTRL.java | 16 +- .../net/montoyo/wd/block/BlockRedCTRL.java | 16 +- .../net/montoyo/wd/block/BlockScreen.java | 12 +- .../net/montoyo/wd/block/BlockServer.java | 16 +- .../net/montoyo/wd/client/ClientProxy.java | 15 +- .../montoyo/wd/client/JSQueryDispatcher.java | 7 +- .../montoyo/wd/client/gui/GuiKeyboard.java | 8 +- .../wd/client/gui/GuiRedstoneCtrl.java | 6 +- .../wd/client/gui/GuiScreenConfig.java | 19 +- .../net/montoyo/wd/client/gui/GuiServer.java | 4 +- .../net/montoyo/wd/client/gui/GuiSetURL2.java | 16 +- .../net/montoyo/wd/client/gui/WDScreen.java | 6 +- .../wd/client/renderers/ScreenRenderer.java | 59 +-- .../java/net/montoyo/wd/config/ModConfig.java | 1 - .../net/montoyo/wd/core/WDDCapability.java | 10 +- .../java/net/montoyo/wd/data/GuiData.java | 90 +++-- .../net/montoyo/wd/data/KeyboardData.java | 42 +- .../net/montoyo/wd/data/RedstoneCtrlData.java | 24 +- .../net/montoyo/wd/data/ScreenConfigData.java | 152 +++---- .../java/net/montoyo/wd/data/ServerData.java | 18 +- .../java/net/montoyo/wd/data/SetURLData.java | 27 +- .../montoyo/wd/entity/ServerEventHandler.java | 35 -- .../wd/entity/TileEntityInterfaceBase.java | 74 ++-- .../wd/entity/TileEntityPeripheralBase.java | 40 +- .../montoyo/wd/entity/TileEntityRedCtrl.java | 24 +- .../montoyo/wd/entity/TileEntityScreen.java | 154 +++++--- .../net/montoyo/wd/miniserv/SyncPlugin.java | 10 +- .../montoyo/wd/miniserv/client/Client.java | 16 +- .../montoyo/wd/miniserv/server/Server.java | 42 +- .../java/net/montoyo/wd/net/BufferUtils.java | 75 ++++ .../java/net/montoyo/wd/net/Messages.java | 47 --- .../java/net/montoyo/wd/net/NetworkEntry.java | 25 ++ src/main/java/net/montoyo/wd/net/Packet.java | 76 ++++ .../net/montoyo/wd/net/WDNetworkRegistry.java | 62 +++ .../wd/net/client/CMessageAddScreen.java | 127 ------ .../wd/net/client/CMessageCloseGui.java | 65 --- .../wd/net/client/CMessageMiniservKey.java | 48 --- .../wd/net/client/CMessageOpenGui.java | 50 --- .../wd/net/client/CMessageServerInfo.java | 39 -- .../S2CMessageACResult.java} | 29 +- .../net/client_bound/S2CMessageAddScreen.java | 135 +++++++ .../net/client_bound/S2CMessageCloseGui.java | 57 +++ .../S2CMessageJSResponse.java} | 35 +- .../client_bound/S2CMessageMiniservKey.java | 46 +++ .../net/client_bound/S2CMessageOpenGui.java | 43 ++ .../S2CMessageScreenUpdate.java} | 80 ++-- .../client_bound/S2CMessageServerInfo.java | 46 +++ .../wd/net/server/SMessageACQuery.java | 61 --- .../montoyo/wd/net/server/SMessageGetUrl.java | 40 -- .../net/server/SMessageMiniservConnect.java | 64 --- .../wd/net/server/SMessagePadCtrl.java | 112 ------ .../wd/net/server/SMessageRequestTEData.java | 71 ---- .../wd/net/server/SMessageScreenCtrl.java | 372 ----------------- .../net/montoyo/wd/net/server/URLMessage.java | 35 -- .../net/server_bound/C2SMessageACQuery.java | 64 +++ .../C2SMessageMiniservConnect.java | 57 +++ .../C2SMessageRedstoneCtrl.java} | 46 ++- .../server_bound/C2SMessageScreenCtrl.java | 374 ++++++++++++++++++ .../net/montoyo/wd/utilities/DistSafety.java | 7 + 63 files changed, 1651 insertions(+), 1753 deletions(-) delete mode 100644 src/main/java/net/montoyo/wd/entity/ServerEventHandler.java create mode 100644 src/main/java/net/montoyo/wd/net/BufferUtils.java delete mode 100644 src/main/java/net/montoyo/wd/net/Messages.java create mode 100644 src/main/java/net/montoyo/wd/net/NetworkEntry.java create mode 100644 src/main/java/net/montoyo/wd/net/Packet.java create mode 100644 src/main/java/net/montoyo/wd/net/WDNetworkRegistry.java delete mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java delete mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageCloseGui.java delete mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageMiniservKey.java delete mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageOpenGui.java delete mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageServerInfo.java rename src/main/java/net/montoyo/wd/net/{client/CMessageACResult.java => client_bound/S2CMessageACResult.java} (57%) create mode 100644 src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java create mode 100644 src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java rename src/main/java/net/montoyo/wd/net/{client/CMessageJSResponse.java => client_bound/S2CMessageJSResponse.java} (70%) create mode 100644 src/main/java/net/montoyo/wd/net/client_bound/S2CMessageMiniservKey.java create mode 100644 src/main/java/net/montoyo/wd/net/client_bound/S2CMessageOpenGui.java rename src/main/java/net/montoyo/wd/net/{client/CMessageScreenUpdate.java => client_bound/S2CMessageScreenUpdate.java} (76%) create mode 100644 src/main/java/net/montoyo/wd/net/client_bound/S2CMessageServerInfo.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageACQuery.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageMiniservConnect.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageRequestTEData.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageScreenCtrl.java delete mode 100644 src/main/java/net/montoyo/wd/net/server/URLMessage.java create mode 100644 src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java create mode 100644 src/main/java/net/montoyo/wd/net/server_bound/C2SMessageMiniservConnect.java rename src/main/java/net/montoyo/wd/net/{server/SMessageRedstoneCtrl.java => server_bound/C2SMessageRedstoneCtrl.java} (63%) create mode 100644 src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index a127446..d5ab58e 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -33,25 +33,21 @@ import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.server.ServerStoppingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; -import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.ModConfig; import net.montoyo.wd.core.*; import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; import net.montoyo.wd.miniserv.server.Server; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageServerInfo; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageServerInfo; import net.montoyo.wd.utilities.DistSafety; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Util; @@ -160,7 +156,7 @@ public class WebDisplays { padResX = padResY * PAD_RATIO; IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - bus.addListener(Messages::registryNetworkPackets); + WDNetworkRegistry.init(); SOUNDS.register(bus); onRegisterSounds(); BlockInit.init(bus); @@ -319,8 +315,7 @@ public class WebDisplays { @SubscribeEvent public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) { if(!ev.getEntity().getLevel().isClientSide && ev.getEntity() instanceof ServerPlayer) { - IWDDCapability cap = - ev.getEntity().getCapability(WDDCapability.Provider.cap, null).orElseThrow(RuntimeException::new); + IWDDCapability cap = ev.getEntity().getCapability(WDDCapability.Provider.cap, null).orElseThrow(RuntimeException::new); if(cap.isFirstRun()) { Util.toast(ev.getEntity(), ChatFormatting.LIGHT_PURPLE, "welcome1"); @@ -330,14 +325,13 @@ public class WebDisplays { cap.clearFirstRun(); } - PacketDistributor.PacketTarget packetDistrutor = PacketDistributor.PLAYER - .with( - () -> - (ServerPlayer) ev.getEntity()); + PacketDistributor.PacketTarget packetDistrutor = PacketDistributor.PLAYER.with( + () -> (ServerPlayer) ev.getEntity() + ); - CMessageServerInfo message = new CMessageServerInfo(miniservPort); + S2CMessageServerInfo message = new S2CMessageServerInfo(miniservPort); - Messages.INSTANCE.send(packetDistrutor, message); + WDNetworkRegistry.INSTANCE.send(packetDistrutor, message); } } diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java index f4a0ec9..430507e 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardLeft.java @@ -6,18 +6,12 @@ package net.montoyo.wd.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; @@ -34,16 +28,11 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.core.DefaultPeripheral; -import net.montoyo.wd.entity.TileEntityInterfaceBase; import net.montoyo.wd.entity.TileEntityKeyboard; -import net.montoyo.wd.entity.TileEntityPeripheralBase; -import net.montoyo.wd.entity.TileEntityServer; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class BlockKeyboardLeft extends BlockPeripheral { @@ -146,7 +135,7 @@ public class BlockKeyboardLeft extends BlockPeripheral { } world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); } - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } @Override diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java index 2fa4400..ab2d104 100644 --- a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java @@ -26,8 +26,8 @@ import net.minecraftforge.network.PacketDistributor; import net.montoyo.wd.core.IPeripheral; import net.montoyo.wd.entity.TileEntityKeyboard; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; @@ -60,7 +60,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral { } world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); } - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> BlockKeyboardLeft.point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> BlockKeyboardLeft.point(world, pos)), new S2CMessageCloseGui(pos)); } @Override diff --git a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java index 9dee7d4..0a31ed9 100644 --- a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java +++ b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java @@ -6,7 +6,6 @@ package net.montoyo.wd.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; @@ -40,10 +39,9 @@ import net.montoyo.wd.entity.TileEntityInterfaceBase; import net.montoyo.wd.entity.TileEntityKeyboard; import net.montoyo.wd.entity.TileEntityPeripheralBase; import net.montoyo.wd.entity.TileEntityServer; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.Nullable; public class BlockPeripheral extends WDBlockContainer { @@ -220,7 +218,7 @@ public class BlockPeripheral extends WDBlockContainer { removeRightPiece(world, pos); world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); // dropBlockAsItem(world, pos, state, 0); //TODO Loottable - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } @@ -230,7 +228,7 @@ public class BlockPeripheral extends WDBlockContainer { if(state.getBlock() == this && state.getValue(type) == DefaultPeripheral.KEYBOARD) removeRightPiece(world, pos); - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } diff --git a/src/main/java/net/montoyo/wd/block/BlockRCTRL.java b/src/main/java/net/montoyo/wd/block/BlockRCTRL.java index 37d9308..c61076e 100644 --- a/src/main/java/net/montoyo/wd/block/BlockRCTRL.java +++ b/src/main/java/net/montoyo/wd/block/BlockRCTRL.java @@ -6,21 +6,18 @@ package net.montoyo.wd.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -30,17 +27,12 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; -import net.montoyo.mcef.utilities.Log; import net.montoyo.wd.core.DefaultPeripheral; import net.montoyo.wd.entity.*; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.Nullable; public class BlockRCTRL extends WDBlockContainer { @@ -188,14 +180,14 @@ public class BlockRCTRL extends WDBlockContainer { if(neighbor.getX() == pos.getX() && neighbor.getY() == pos.getY() - 1 && neighbor.getZ() == pos.getZ() && world.isEmptyBlock(neighbor)) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); // dropBlockAsItem(world, pos, state, 0); //TODO Loottable - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } @Override public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { if(!world.isClientSide) { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } diff --git a/src/main/java/net/montoyo/wd/block/BlockRedCTRL.java b/src/main/java/net/montoyo/wd/block/BlockRedCTRL.java index 6abe27a..59b821b 100644 --- a/src/main/java/net/montoyo/wd/block/BlockRedCTRL.java +++ b/src/main/java/net/montoyo/wd/block/BlockRedCTRL.java @@ -6,21 +6,18 @@ package net.montoyo.wd.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -30,17 +27,12 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; -import net.montoyo.mcef.utilities.Log; import net.montoyo.wd.core.DefaultPeripheral; import net.montoyo.wd.entity.*; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.Nullable; public class BlockRedCTRL extends WDBlockContainer { @@ -188,14 +180,14 @@ public class BlockRedCTRL extends WDBlockContainer { if(neighbor.getX() == pos.getX() && neighbor.getY() == pos.getY() - 1 && neighbor.getZ() == pos.getZ() && world.isEmptyBlock(neighbor)) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); // dropBlockAsItem(world, pos, state, 0); //TODO Loottable - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } @Override public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { if(!world.isClientSide) { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/BlockScreen.java index 06553ec..4b22ddb 100644 --- a/src/main/java/net/montoyo/wd/block/BlockScreen.java +++ b/src/main/java/net/montoyo/wd/block/BlockScreen.java @@ -4,11 +4,7 @@ package net.montoyo.wd.block; -import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.Input; -import net.minecraft.client.player.KeyboardInput; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; @@ -35,25 +31,19 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.client.renderers.ScreenRenderer; -import net.montoyo.wd.config.ModConfig; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.SetURLData; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.BlockInit; -import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.item.WDItem; import net.montoyo.wd.utilities.*; import org.jetbrains.annotations.NotNull; -import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Map; public class BlockScreen extends BaseEntityBlock { @@ -247,7 +237,7 @@ public class BlockScreen extends BaseEntityBlock { created = true; } - te.addScreen(side, size, null, player, !created); + te.addScreen(side, size, null, player, true); return InteractionResult.SUCCESS; } diff --git a/src/main/java/net/montoyo/wd/block/BlockServer.java b/src/main/java/net/montoyo/wd/block/BlockServer.java index ad03573..12873e7 100644 --- a/src/main/java/net/montoyo/wd/block/BlockServer.java +++ b/src/main/java/net/montoyo/wd/block/BlockServer.java @@ -6,21 +6,18 @@ package net.montoyo.wd.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -30,20 +27,15 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.network.PacketDistributor; -import net.montoyo.mcef.utilities.Log; import net.montoyo.wd.core.DefaultPeripheral; import net.montoyo.wd.entity.TileEntityInterfaceBase; import net.montoyo.wd.entity.TileEntityKeyboard; import net.montoyo.wd.entity.TileEntityPeripheralBase; import net.montoyo.wd.entity.TileEntityServer; -import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.item.ItemLinker; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; import org.jetbrains.annotations.Nullable; public class BlockServer extends WDBlockContainer{ @@ -189,14 +181,14 @@ public class BlockServer extends WDBlockContainer{ if(neighbor.getX() == pos.getX() && neighbor.getY() == pos.getY() - 1 && neighbor.getZ() == pos.getZ() && world.isEmptyBlock(neighbor)) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); // dropBlockAsItem(world, pos, state, 0); //TODO Loottable - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } @Override public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { if(!world.isClientSide) { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new CMessageCloseGui(pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos)); } } diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index b3a8c79..d9e3339 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -65,9 +65,8 @@ import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; import net.montoyo.wd.item.WDItem; import net.montoyo.wd.miniserv.client.Client; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessagePadCtrl; -import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.*; import org.lwjgl.glfw.GLFW; @@ -179,8 +178,6 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer mcef.registerDisplayHandler(this); //mcef.registerJSQueryHandler(this); //TODO why crashing on this method! findAdvancementToProgressField(); - String url = "https://www.google.com"; - new ScreenRenderer(url); } @Override @@ -428,7 +425,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer pd.view.loadURL(WebDisplays.BLACKLIST_URL); else { pd.lastURLSent = t; //Avoid spamming the server with porn URLs - Messages.INSTANCE.sendToServer(new SMessagePadCtrl(pd.id, url)); +// WDNetworkRegistry.INSTANCE.sendToServer(new SMessagePadCtrl(pd.id, url)); } break; @@ -697,19 +694,19 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer if(t - lastPointPacket >= 100) { lastPointPacket = t; - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_MOVE, hit)); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.vec2(tes, side, C2SMessageScreenCtrl.CTRL_LASER_MOVE, hit)); } } else { deselectScreen(); pointedScreen = tes; pointedScreenSide = side; - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_DOWN, hit)); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.vec2(tes, side, C2SMessageScreenCtrl.CTRL_LASER_DOWN, hit)); } } private void deselectScreen() { if(pointedScreen != null && pointedScreenSide != null) { - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.laserUp(pointedScreen, pointedScreenSide)); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(pointedScreen, pointedScreenSide)); pointedScreen = null; pointedScreenSide = null; } diff --git a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java index b99f762..283db73 100644 --- a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java +++ b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java @@ -12,15 +12,14 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.mcef.api.IBrowser; import net.montoyo.mcef.api.IJSQueryCallback; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IScreenQueryHandler; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.*; import java.util.*; @@ -215,7 +214,7 @@ public final class JSQueryDispatcher { ServerQuery ret = new ServerQuery(tes, side, cb); serverQueries.add(ret); - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.jsRequest(tes, side, ret.id, type, data)); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.jsRequest(tes, side, ret.id, type, data)); } private void registerDefaults() { diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java index 5be8b5c..531cbda 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java @@ -18,21 +18,19 @@ import net.montoyo.wd.client.gui.controls.Control; import net.montoyo.wd.client.gui.controls.Label; import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.TypeData; import net.montoyo.wd.utilities.Util; import org.lwjgl.glfw.GLFW; -import org.cef.browser.CefBrowserOsr; import org.vivecraft.gameplay.VRPlayer; import org.vivecraft.gameplay.screenhandlers.KeyboardHandler; import java.io.*; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Locale; import java.util.Map; @OnlyIn(Dist.CLIENT) @@ -181,7 +179,7 @@ public class GuiKeyboard extends WDScreen { @Override protected void sync() { if(!evStack.isEmpty()) { - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.type(tes, side, WebDisplays.GSON.toJson(evStack), kbPos)); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.type(tes, side, WebDisplays.GSON.toJson(evStack), kbPos)); evStack.clear(); } } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java index 8c3b8a3..f9a64e5 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java @@ -13,8 +13,8 @@ import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.loading.FillControl; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageRedstoneCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageRedstoneCtrl; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Vector3i; @@ -60,7 +60,7 @@ public class GuiRedstoneCtrl extends WDScreen { String rising = mcef.punycode(Util.addProtocol(tfRisingEdge.getText())); String falling = mcef.punycode(Util.addProtocol(tfFallingEdge.getText())); - Messages.INSTANCE.sendToServer(new SMessageRedstoneCtrl(dimension, pos, rising, falling)); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageRedstoneCtrl(pos, rising, falling)); } minecraft.setScreen(null); diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java index 7dcc3dc..98dec71 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -17,8 +17,8 @@ import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.item.WDItem; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.*; import javax.annotation.Nullable; @@ -201,7 +201,7 @@ public class GuiScreenConfig extends WDScreen { throw new NumberFormatException(); //I'm lazy if(x != scr.resolution.x || y != scr.resolution.y) - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_SET_RESOLUTION, new Vector2i(x, y))); + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.vec2(tes, side, C2SMessageScreenCtrl.CTRL_SET_RESOLUTION, new Vector2i(x, y))); } catch(NumberFormatException ex) { //Roll back tfResX.setText("" + scr.resolution.x); @@ -219,7 +219,7 @@ public class GuiScreenConfig extends WDScreen { clickSetRes(); else if(ev.getSource() == btnChangeRot) { Rotation[] rots = Rotation.values(); - Messages.INSTANCE.sendToServer(new SMessageScreenCtrl(tes, side, rots[(rotation.ordinal() + 1) % rots.length])); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageScreenCtrl(tes, side, rots[(rotation.ordinal() + 1) % rots.length])); } } @@ -282,7 +282,7 @@ public class GuiScreenConfig extends WDScreen { @GuiSubscribe public void onRemovePlayer(List.EntryClick ev) { if(ev.getSource() == lstFriends) - Messages.INSTANCE.sendToServer(new SMessageScreenCtrl(tes, side, (NameUUIDPair) ev.getUserdata(), true)); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageScreenCtrl(tes, side, (NameUUIDPair) ev.getUserdata(), true)); } @GuiSubscribe @@ -312,13 +312,12 @@ public class GuiScreenConfig extends WDScreen { } catch(NumberFormatException ex) { cbLockRatio.setChecked(false); } - } else if(ev.getSource() == cbAutoVolume) - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.autoVol(tes, side, ev.isChecked())); + } else if(ev.getSource() == cbAutoVolume) WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.autoVol(tes, side, ev.isChecked())); } @GuiSubscribe public void onRemoveUpgrade(UpgradeGroup.ClickEvent ev) { - Messages.INSTANCE.sendToServer(new SMessageScreenCtrl(tes, side, ev.getMouseOverStack())); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageScreenCtrl(tes, side, ev.getMouseOverStack())); } public boolean isFriendCheckbox(CheckBox cb) { @@ -339,7 +338,7 @@ public class GuiScreenConfig extends WDScreen { if(adding) { if(!hasFriend(pairs[0])) - Messages.INSTANCE.sendToServer(new SMessageScreenCtrl(tes, side, pairs[0], false)); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageScreenCtrl(tes, side, pairs[0], false)); tfFriend.setDisabled(false); tfFriend.clear(); @@ -428,7 +427,7 @@ public class GuiScreenConfig extends WDScreen { @Override protected void sync() { - Messages.INSTANCE.sendToServer(new SMessageScreenCtrl(tes, side, friendRights, otherRights)); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageScreenCtrl(tes, side, friendRights, otherRights)); Log.info("Sent sync packet"); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index 922ff4f..7022b75 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -20,7 +20,7 @@ import net.minecraft.util.RandomSource; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.miniserv.Constants; import net.montoyo.wd.miniserv.client.*; -import net.montoyo.wd.net.Messages; +import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.utilities.*; import org.lwjgl.glfw.GLFW; @@ -689,7 +689,7 @@ public class GuiServer extends WDScreen { @CommandHandler("reconnect") public void commandReconnect() { Client.getInstance().stop(); - Messages.INSTANCE.sendToServer(Client.getInstance().beginConnection()); + WDNetworkRegistry.INSTANCE.sendToServer(Client.getInstance().beginConnection()); } private void startFileUpload(File f, boolean quit) { diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index 680704e..0b8e93e 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -16,13 +16,10 @@ import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.loading.FillControl; -import net.montoyo.wd.client.renderers.ScreenRenderer; -import net.montoyo.wd.entity.ServerEventHandler; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.ItemInit; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessagePadCtrl; -import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Vector3i; @@ -90,8 +87,8 @@ public class GuiSetURL2 extends WDScreen { else if(ev.getSource() == btnOk) validate(tfURL.getText()); else if(ev.getSource() == btnShutDown) { - if(isPad) - Messages.INSTANCE.sendToServer(new SMessagePadCtrl("")); +// if(isPad) +// WDNetworkRegistry.INSTANCE.sendToServer(new SMessagePadCtrl("")); minecraft.setScreen(null); } @@ -115,7 +112,7 @@ public class GuiSetURL2 extends WDScreen { url = ((ClientProxy) WebDisplays.PROXY).getMCEF().punycode(url); if(isPad) { - Messages.INSTANCE.sendToServer(new SMessagePadCtrl(url)); +// WDNetworkRegistry.INSTANCE.sendToServer(new SMessagePadCtrl(url)); ItemStack held = minecraft.player.getItemInHand(InteractionHand.MAIN_HAND); if(held.getItem().equals(ItemInit.itemMinePad.get()) && held.getTag() != null && held.getTag().contains("PadID")) { @@ -125,8 +122,7 @@ public class GuiSetURL2 extends WDScreen { pd.view.loadURL(WebDisplays.applyBlacklist(url)); } } - } else - Messages.INSTANCE.sendToServer(SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation)); + } else WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation)); } minecraft.setScreen(null); diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java index 99acfb5..0baa9e7 100644 --- a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -22,8 +22,8 @@ import net.montoyo.wd.client.gui.controls.Event; import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.gui.loading.JsonOWrapper; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageACQuery; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageACQuery; import net.montoyo.wd.utilities.*; import javax.annotation.Nullable; @@ -328,7 +328,7 @@ public abstract class WDScreen extends Screen { } protected void requestAutocomplete(String beginning, boolean matchExact) { - Messages.INSTANCE.sendToServer(new SMessageACQuery(beginning, matchExact)); + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageACQuery(beginning, matchExact)); } public void onAutocompleteResult(NameUUIDPair pairs[]) { diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index d8eb603..d635e78 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -4,41 +4,20 @@ package net.montoyo.wd.client.renderers; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.world.phys.AABB; -import net.montoyo.mcef.api.IStringVisitor; -import net.montoyo.wd.SharedProxy; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.client.ClientProxy; -import net.montoyo.wd.entity.ServerEventHandler; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; -import java.io.IOException; - import static com.mojang.math.Vector3f.*; -import static org.lwjgl.opengl.GL11.*; public class ScreenRenderer implements BlockEntityRenderer { - - private String url; - - public ScreenRenderer(String url) { - this.url = url; - } - public ScreenRenderer() {} public static class ScreenRendererProvider implements BlockEntityRendererProvider { @@ -59,25 +38,17 @@ public class ScreenRenderer implements BlockEntityRenderer { //Disable lighting RenderSystem.enableTexture(); - RenderSystem.disableCull(); +// RenderSystem.disableCull(); RenderSystem.disableBlend(); for(int i = 0; i < te.screenCount(); i++) { TileEntityScreen.Screen scr = te.getScreen(i); if(scr.browser == null) { - if(WebDisplays.PROXY instanceof ClientProxy clientProxy) { - scr.browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(this.url != null ? this.url : "https://www.google.com")); - - if (scr.rotation.isVertical) - scr.browser.resize(scr.resolution.y, scr.resolution.x); - else - scr.browser.resize(scr.resolution.x, scr.resolution.y); - - scr.doTurnOnAnim = true; - scr.turnOnTime = System.currentTimeMillis(); - } + scr.createBrowser(true); } - + + // TODO: manually backface cull the screens + tmpi.set(scr.side.right); tmpi.mul(scr.size.x); tmpi.addMul(scr.side.up, scr.size.y); @@ -143,7 +114,7 @@ public class ScreenRenderer implements BlockEntityRenderer { Tesselator tesselator = Tesselator.getInstance(); BufferBuilder builder = tesselator.getBuilder(); - //TODO: Use tesselator + //TODO: don't use tesselator RenderSystem.enableDepthTest(); RenderSystem.setShader(GameRenderer::getPositionTexColorShader); RenderSystem._setShaderTexture(0, scr.browser.getTextureID()); @@ -159,16 +130,16 @@ public class ScreenRenderer implements BlockEntityRenderer { } - //Bounding box debugging - poseStack.pushPose(); - poseStack.translate(-te.getBlockPos().getX(), -te.getBlockPos().getY(), -te.getBlockPos().getZ()); - LevelRenderer.renderLineBox( - poseStack, bufferSource.getBuffer(RenderType.LINES), - te.getRenderBoundingBox(), 1, 1, 1, 1f - ); - poseStack.popPose(); +// //Bounding box debugging +// poseStack.pushPose(); +// poseStack.translate(-te.getBlockPos().getX(), -te.getBlockPos().getY(), -te.getBlockPos().getZ()); +// LevelRenderer.renderLineBox( +// poseStack, bufferSource.getBuffer(RenderType.LINES), +// te.getRenderBoundingBox(), 1, 1, 1, 1f +// ); +// poseStack.popPose(); //Re-enable lighting - RenderSystem.enableCull(); +// RenderSystem.enableCull(); } } diff --git a/src/main/java/net/montoyo/wd/config/ModConfig.java b/src/main/java/net/montoyo/wd/config/ModConfig.java index a15e781..5e6eaa7 100644 --- a/src/main/java/net/montoyo/wd/config/ModConfig.java +++ b/src/main/java/net/montoyo/wd/config/ModConfig.java @@ -4,7 +4,6 @@ import me.shedaniel.autoconfig.ConfigData; import me.shedaniel.autoconfig.annotation.Config; import me.shedaniel.autoconfig.annotation.ConfigEntry; import net.minecraft.util.Mth; -import net.montoyo.mcef.easy_forge_compat.Configuration; import java.util.List; diff --git a/src/main/java/net/montoyo/wd/core/WDDCapability.java b/src/main/java/net/montoyo/wd/core/WDDCapability.java index a6ab05c..f049827 100644 --- a/src/main/java/net/montoyo/wd/core/WDDCapability.java +++ b/src/main/java/net/montoyo/wd/core/WDDCapability.java @@ -6,6 +6,7 @@ package net.montoyo.wd.core; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.CapabilityToken; @@ -42,11 +43,16 @@ public class WDDCapability implements IWDDCapability { @Override public CompoundTag serializeNBT() { - return new CompoundTag(); + CompoundTag tag = new CompoundTag(); + if (wddCap != null) tag.putBoolean("firstRun", wddCap.firstRun); + return tag; } @Override - public void deserializeNBT(CompoundTag tag) {} + public void deserializeNBT(CompoundTag tag) { + if (wddCap != null && tag.contains("firstRun", Tag.TAG_BYTE)) + wddCap.firstRun = tag.getBoolean("firstRun"); + } @Nonnull private IWDDCapability createWDDCapability() { diff --git a/src/main/java/net/montoyo/wd/data/GuiData.java b/src/main/java/net/montoyo/wd/data/GuiData.java index 5104bbf..57d0473 100644 --- a/src/main/java/net/montoyo/wd/data/GuiData.java +++ b/src/main/java/net/montoyo/wd/data/GuiData.java @@ -6,55 +6,65 @@ package net.montoyo.wd.data; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.PacketDistributor; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageOpenGui; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageOpenGui; import java.util.HashMap; -import java.util.function.Function; +import java.util.function.Supplier; public abstract class GuiData { + public static GuiData read(String name, FriendlyByteBuf buf) { + GuiType type = dataTable.get(name); + GuiData data = type.create(); + data.deserialize(buf); + return data; + } + + protected static class GuiType { + Class clazz; + Supplier constructor; + + public GuiType(Class clazz, Supplier constructor) { + this.clazz = clazz; + this.constructor = constructor; + } + + public GuiData create() { + return constructor.get(); + } + } + + private static final HashMap dataTable = new HashMap<>(); + + static { + dataTable.put("SetURL", new GuiType(SetURLData.class, SetURLData::new)); + dataTable.put("ScreenConfig", new GuiType(ScreenConfigData.class, ScreenConfigData::new)); + dataTable.put("Keyboard", new GuiType(KeyboardData.class, KeyboardData::new)); + dataTable.put("RedstoneCtrl", new GuiType(RedstoneCtrlData.class, RedstoneCtrlData::new)); + dataTable.put("Server", new GuiType(ServerData.class, ServerData::new)); + } + + public static Class classOf(String name) { + return dataTable.get(name).clazz; + } + + public GuiData() { + } - protected static class GuiType { - Class clazz; - ResourceLocation id; - } - - private static final HashMap> dataTable = new HashMap<>(); - static { - dataTable.put("SetURL", SetURLData.class); - dataTable.put("ScreenConfig", ScreenConfigData.class); - dataTable.put("Keyboard", KeyboardData.class); - dataTable.put("RedstoneCtrl", RedstoneCtrlData.class); - dataTable.put("Server", ServerData.class); - } + @OnlyIn(Dist.CLIENT) + public abstract Screen createGui(Screen old, Level world); + + public abstract String getName(); + + public void sendTo(ServerPlayer player) { + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageOpenGui(this)); + } - public static Class classOf(String name) { - return dataTable.get(name); - } - - public GuiData() { - } - -// public GuiData(FriendlyByteBuf buf) { -// this.deserialize(buf); -// } - - @OnlyIn(Dist.CLIENT) - public abstract Screen createGui(Screen old, Level world); - public abstract String getName(); - - public void sendTo(ServerPlayer player) { - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new CMessageOpenGui(this)); - } - -// public abstract void serialize(FriendlyByteBuf buf); -// public abstract void deserialize(FriendlyByteBuf buf); - + public abstract void serialize(FriendlyByteBuf buf); + public abstract void deserialize(FriendlyByteBuf buf); } diff --git a/src/main/java/net/montoyo/wd/data/KeyboardData.java b/src/main/java/net/montoyo/wd/data/KeyboardData.java index 0cde240..969b136 100644 --- a/src/main/java/net/montoyo/wd/data/KeyboardData.java +++ b/src/main/java/net/montoyo/wd/data/KeyboardData.java @@ -28,10 +28,6 @@ public class KeyboardData extends GuiData { public KeyboardData() { } -// public KeyboardData(FriendlyByteBuf buf) { -// super(buf); -// } - public KeyboardData(TileEntityScreen tes, BlockSide side, BlockPos kbPos) { pos = new Vector3i(tes.getBlockPos()); this.side = side; @@ -57,23 +53,23 @@ public class KeyboardData extends GuiData { return "Keyboard"; } -// @Override -// public void serialize(FriendlyByteBuf buf) { -// buf.writeInt(pos.x); -// buf.writeInt(pos.y); -// buf.writeInt(pos.z); -// buf.writeByte(side.ordinal()); -// buf.writeInt(kbX); -// buf.writeInt(kbY); -// buf.writeInt(kbZ); -// } -// -// @Override -// public void deserialize(FriendlyByteBuf buf) { -// this.pos = new Vector3i(buf.readInt(), buf.readInt(), buf.readInt()); -// this.side = BlockSide.values()[buf.readByte()]; -// this.kbX = buf.readInt(); -// this.kbY = buf.readInt(); -// this.kbZ = buf.readInt(); -// } + @Override + public void serialize(FriendlyByteBuf buf) { + buf.writeInt(pos.x); + buf.writeInt(pos.y); + buf.writeInt(pos.z); + buf.writeByte(side.ordinal()); + buf.writeInt(kbX); + buf.writeInt(kbY); + buf.writeInt(kbZ); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + this.pos = new Vector3i(buf.readInt(), buf.readInt(), buf.readInt()); + this.side = BlockSide.values()[buf.readByte()]; + this.kbX = buf.readInt(); + this.kbY = buf.readInt(); + this.kbZ = buf.readInt(); + } } diff --git a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java index 3017310..f9ee152 100644 --- a/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java +++ b/src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java @@ -4,16 +4,15 @@ package net.montoyo.wd.data; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiRedstoneCtrl; +import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.utilities.Vector3i; public class RedstoneCtrlData extends GuiData { @@ -27,10 +26,6 @@ public class RedstoneCtrlData extends GuiData { super(); } -// public RedstoneCtrlData(FriendlyByteBuf buf) { -// super(buf); -// } - public RedstoneCtrlData(ResourceLocation d, BlockPos p, String r, String f) { dimension = d; pos = new Vector3i(p); @@ -48,5 +43,20 @@ public class RedstoneCtrlData extends GuiData { public String getName() { return "RedstoneCtrl"; } - + + @Override + public void serialize(FriendlyByteBuf buf) { + buf.writeUtf(dimension.toString()); + BufferUtils.writeVec3i(buf, pos); + buf.writeUtf(risingEdgeURL); + buf.writeUtf(fallingEdgeURL); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + dimension = new ResourceLocation(buf.readUtf()); + pos = BufferUtils.readVec3i(buf); + risingEdgeURL = buf.readUtf(); + fallingEdgeURL = buf.readUtf(); + } } diff --git a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java index fd49a1e..c016e6c 100644 --- a/src/main/java/net/montoyo/wd/data/ScreenConfigData.java +++ b/src/main/java/net/montoyo/wd/data/ScreenConfigData.java @@ -11,83 +11,97 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.PacketDistributor; -import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.gui.GuiScreenConfig; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageOpenGui; +import net.montoyo.wd.net.BufferUtils; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageOpenGui; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Vector3i; public class ScreenConfigData extends GuiData { + + public boolean onlyUpdate; + public Vector3i pos; + public BlockSide side; + public NameUUIDPair[] friends; + public int friendRights; + public int otherRights; + + public ScreenConfigData() { + } - public boolean onlyUpdate; - public Vector3i pos; - public BlockSide side; - public NameUUIDPair[] friends; - public int friendRights; - public int otherRights; - - public ScreenConfigData() { - } - -// public ScreenConfigData(FriendlyByteBuf buf) { -// super(buf); -// } - - public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) { - this.pos = pos; - this.side = side; - friends = scr.friends.toArray(new NameUUIDPair[0]); - friendRights = scr.friendRights; - otherRights = scr.otherRights; - onlyUpdate = false; - } - - @OnlyIn(Dist.CLIENT) - @Override - public Screen createGui(Screen old, Level world) { - if(old != null && old instanceof GuiScreenConfig) { - GuiScreenConfig gsc = (GuiScreenConfig) old; - - if(gsc.isForBlock(pos.toBlock(), side)) { - gsc.updateFriends(friends); - gsc.updateFriendRights(friendRights); - gsc.updateOtherRights(otherRights); - gsc.updateMyRights(); - - return null; - } - } - - if(onlyUpdate) - return null; - - BlockEntity te = world.getBlockEntity(pos.toBlock()); - if(te == null || !(te instanceof TileEntityScreen)) { - Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); - return null; - } - - return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights); - } - - @Override - public String getName() { - return "ScreenConfig"; - } - - public ScreenConfigData updateOnly() { - onlyUpdate = true; - return this; - } - - public void sendTo(PacketDistributor.TargetPoint tp) { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> tp), new CMessageOpenGui(this)); - } - + public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) { + this.pos = pos; + this.side = side; + friends = scr.friends.toArray(new NameUUIDPair[0]); + friendRights = scr.friendRights; + otherRights = scr.otherRights; + onlyUpdate = false; + } + + @OnlyIn(Dist.CLIENT) + @Override + public Screen createGui(Screen old, Level world) { + if (old != null && old instanceof GuiScreenConfig) { + GuiScreenConfig gsc = (GuiScreenConfig) old; + + if (gsc.isForBlock(pos.toBlock(), side)) { + gsc.updateFriends(friends); + gsc.updateFriendRights(friendRights); + gsc.updateOtherRights(otherRights); + gsc.updateMyRights(); + + return null; + } + } + + if (onlyUpdate) + return null; + + BlockEntity te = world.getBlockEntity(pos.toBlock()); + if (te == null || !(te instanceof TileEntityScreen)) { + Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString()); + return null; + } + + return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights); + } + + @Override + public String getName() { + return "ScreenConfig"; + } + + public ScreenConfigData updateOnly() { + onlyUpdate = true; + return this; + } + + public void sendTo(PacketDistributor.TargetPoint tp) { + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> tp), new S2CMessageOpenGui(this)); + } + + @Override + public void serialize(FriendlyByteBuf buf) { + buf.writeBoolean(onlyUpdate); + BufferUtils.writeVec3i(buf, pos); + BufferUtils.writeEnum(buf, side, (byte) 1); + BufferUtils.writeArray(buf, friends, (nameUUIDPair) -> nameUUIDPair.writeTo(buf)); + buf.writeInt(friendRights); + buf.writeInt(otherRights); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + onlyUpdate = buf.readBoolean(); + pos = BufferUtils.readVec3i(buf); + side = (BlockSide) BufferUtils.readEnum(buf, (v) -> BlockSide.values()[v], (byte) 1); + friends = BufferUtils.readArray(buf, () -> new NameUUIDPair(buf)); + friendRights = buf.readInt(); + otherRights = buf.readInt(); + } } diff --git a/src/main/java/net/montoyo/wd/data/ServerData.java b/src/main/java/net/montoyo/wd/data/ServerData.java index ce41a71..d0e37d6 100644 --- a/src/main/java/net/montoyo/wd/data/ServerData.java +++ b/src/main/java/net/montoyo/wd/data/ServerData.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiServer; +import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Vector3i; @@ -22,10 +23,6 @@ public class ServerData extends GuiData { public ServerData() { } -// public ServerData(FriendlyByteBuf buf) { -// super(buf); -// } - public ServerData(BlockPos bp, NameUUIDPair owner) { pos = new Vector3i(bp); this.owner = owner; @@ -41,5 +38,16 @@ public class ServerData extends GuiData { public String getName() { return "Server"; } - + + @Override + public void serialize(FriendlyByteBuf buf) { + BufferUtils.writeVec3i(buf, pos); + owner.writeTo(buf); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + pos = BufferUtils.readVec3i(buf); + owner = new NameUUIDPair(buf); + } } diff --git a/src/main/java/net/montoyo/wd/data/SetURLData.java b/src/main/java/net/montoyo/wd/data/SetURLData.java index 40ae70d..f1b8e5f 100644 --- a/src/main/java/net/montoyo/wd/data/SetURLData.java +++ b/src/main/java/net/montoyo/wd/data/SetURLData.java @@ -13,12 +13,13 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.client.gui.GuiSetURL2; import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.BufferUtils; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Vector3i; public class SetURLData extends GuiData { - + public Vector3i pos; public BlockSide side; public String url; @@ -28,10 +29,6 @@ public class SetURLData extends GuiData { public SetURLData() { } -// public SetURLData(FriendlyByteBuf buf) { -// super(buf); -// } - public SetURLData(Vector3i pos, BlockSide side, String url) { this.pos = pos; this.side = side; @@ -65,5 +62,23 @@ public class SetURLData extends GuiData { public String getName() { return "SetURL"; } - + + @Override + public void serialize(FriendlyByteBuf buf) { + BufferUtils.writeVec3i(buf, pos); + BufferUtils.writeEnum(buf, side, (byte) 1); + buf.writeUtf(url); + buf.writeBoolean(isRemote); + if (isRemote) BufferUtils.writeVec3i(buf, remoteLocation); + } + + @Override + public void deserialize(FriendlyByteBuf buf) { + pos = BufferUtils.readVec3i(buf); + side = (BlockSide) BufferUtils.readEnum(buf, (v) -> BlockSide.values()[v], (byte) 1); + url = buf.readUtf(); + isRemote = buf.readBoolean(); + if (isRemote) remoteLocation = BufferUtils.readVec3i(buf); + else remoteLocation = new Vector3i(); + } } diff --git a/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java b/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java deleted file mode 100644 index 863098b..0000000 --- a/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.montoyo.wd.entity; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.montoyo.wd.client.renderers.ScreenRenderer; -import net.montoyo.wd.miniserv.SyncPlugin; - -import java.util.HashMap; -import java.util.Map; - -@Mod.EventBusSubscriber -public class ServerEventHandler { - public static final Map playerScreens = new HashMap<>(); - - @SubscribeEvent - public void onPlayerConnect(PlayerEvent.PlayerLoggedInEvent event) { - // create a new instance of the ScreenRenderer class for the player - ServerPlayer player = (ServerPlayer) event.getEntity(); - String url = SyncPlugin.getPlayerString(player); - if(event.getEntity().getLevel().isClientSide) { - ScreenRenderer screen = new ScreenRenderer(url); - // store the ScreenRenderer instance in the playerScreens map - playerScreens.put(player, screen); - } - } - - @SubscribeEvent - public void onPlayerDisconnect(PlayerEvent.PlayerLoggedOutEvent event) { - // remove the ScreenRenderer instance for the player - ServerPlayer player = (ServerPlayer) event.getEntity(); - playerScreens.remove(player); - } -} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java b/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java index 247dbad..ee841ed 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java @@ -13,10 +13,8 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.IComputerArgs; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.net.client.CMessageScreenUpdate; import net.montoyo.wd.utilities.*; -import javax.annotation.Nonnull; import java.io.IOException; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -38,21 +36,19 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { private NameUUIDPair owner; private static final Object[] TRUE = new Object[] { true }; private static final Object[] FALSE = new Object[] { false }; - + @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); + public void load(CompoundTag tag) { + super.load(tag); owner = Util.readOwnerFromNBT(tag); } - + @Override - @Nonnull - public CompoundTag serializeNBT() { - CompoundTag tag = new CompoundTag(); - super.serializeNBT(); - return Util.writeOwnerToNBT(tag, owner); + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + Util.writeOwnerToNBT(tag, owner); } - + public void setOwner(Player ep) { owner = new NameUUIDPair(ep.getGameProfile()); setChanged(); @@ -186,29 +182,29 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { if(args.count() > 2) action = args.checkString(2).toLowerCase(); - int actionId; - switch(action) { - case "click": - actionId = CMessageScreenUpdate.MOUSE_CLICK; - break; - - case "up": - case "release": - actionId = CMessageScreenUpdate.MOUSE_UP; - break; - - case "down": - case "press": - actionId = CMessageScreenUpdate.MOUSE_DOWN; - break; - - case "move": - actionId = CMessageScreenUpdate.MOUSE_MOVE; - break; - - default: - throw new IllegalArgumentException("bad action name"); - } +// int actionId; +// switch(action) { +// case "click": +// actionId = CMessageScreenUpdate.MOUSE_CLICK; +// break; +// +// case "up": +// case "release": +// actionId = CMessageScreenUpdate.MOUSE_UP; +// break; +// +// case "down": +// case "press": +// actionId = CMessageScreenUpdate.MOUSE_DOWN; +// break; +// +// case "move": +// actionId = CMessageScreenUpdate.MOUSE_MOVE; +// break; +// +// default: +// throw new IllegalArgumentException("bad action name"); +// } TileEntityScreen scr = getConnectedScreenEx(); @@ -238,10 +234,10 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase { break; } - if(scrscr.rotation.isVertical) - scr.clickUnsafe(screenSide, actionId, y, x); - else - scr.clickUnsafe(screenSide, actionId, x, y); +// if(scrscr.rotation.isVertical) +// scr.clickUnsafe(screenSide, actionId, y, x); +// else +// scr.clickUnsafe(screenSide, actionId, x, y); return TRUE; } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java b/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java index 843002b..1c54927 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java @@ -5,20 +5,16 @@ package net.montoyo.wd.entity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; -import net.montoyo.wd.block.BlockKeyboardRight; import net.montoyo.wd.core.IPeripheral; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Log; @@ -36,11 +32,12 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP public TileEntityPeripheralBase(BlockEntityType arg, BlockPos arg2, BlockState arg3) { super(arg, arg2, arg3); } - + + // TODO @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); - + public void load(CompoundTag tag) { + super.load(tag); + if(tag.contains("WDScreen", 10)) { CompoundTag scr = tag.getCompound("WDScreen"); screenPos = new Vector3i(scr.getInt("X"), scr.getInt("Y"), scr.getInt("Z")); @@ -50,24 +47,33 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP screenSide = null; } } - + @Override - @Nonnull - public CompoundTag serializeNBT() { - CompoundTag tag = new CompoundTag(); - super.serializeNBT(); - + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + if(screenPos != null && screenSide != null) { CompoundTag scr = new CompoundTag(); scr.putInt("X", screenPos.x); scr.putInt("Y", screenPos.y); scr.putInt("Z", screenPos.z); scr.putByte("Side", (byte) screenSide.ordinal()); - + tag.put("WDScreen", scr); } - - return tag; + } + + // this is not used for loading from disk, so I'm marking it final + @Override + public final void deserializeNBT(CompoundTag tag) { + super.deserializeNBT(tag); + } + + // this is not used for writing to disk, so I'm marking it final + @Override + @Nonnull + public final CompoundTag serializeNBT() { + return super.serializeNBT(); } @Override diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java b/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java index 397aa46..d68e9d9 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java @@ -11,17 +11,13 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.montoyo.wd.block.BlockPeripheral; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.data.RedstoneCtrlData; import net.montoyo.wd.init.TileInit; -import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Util; -import javax.annotation.Nonnull; import java.io.IOException; public class TileEntityRedCtrl extends TileEntityPeripheralBase { @@ -41,28 +37,24 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase { public static Block getBlockFromTE() { return new BlockPeripheral().defaultBlockState().getBlock(); } - + @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); - + public void load(CompoundTag tag) { + super.load(tag); + risingEdgeURL = tag.getString("RisingEdgeURL"); fallingEdgeURL = tag.getString("FallingEdgeURL"); state = tag.getBoolean("Powered"); } - + @Override - @Nonnull - public CompoundTag serializeNBT() { - CompoundTag tag = new CompoundTag(); - super.serializeNBT(); - + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); tag.putString("RisingEdgeURL", risingEdgeURL); tag.putString("FallingEdgeURL", fallingEdgeURL); tag.putBoolean("Powered", state); - return tag; } - + @Override public InteractionResult onRightClick(Player player, InteractionHand hand) { if(level.isClientSide) diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 99ce416..e417c8e 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -4,18 +4,13 @@ package net.montoyo.wd.entity; -import com.mojang.authlib.minecraft.client.MinecraftClient; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.multiplayer.PlayerInfo; -import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.multiplayer.resolver.ServerAddress; -import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; @@ -43,17 +38,21 @@ import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; import net.montoyo.wd.miniserv.SyncPlugin; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.*; -import net.montoyo.wd.net.server.SMessageRequestTEData; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageAddScreen; +import net.montoyo.wd.net.client_bound.S2CMessageCloseGui; +import net.montoyo.wd.net.client_bound.S2CMessageJSResponse; +import net.montoyo.wd.net.client_bound.S2CMessageScreenUpdate; import net.montoyo.wd.utilities.*; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.awt.event.InputEvent; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import java.util.function.Consumer; import static net.montoyo.wd.block.BlockPeripheral.point; @@ -220,7 +219,20 @@ public class TileEntityScreen extends BlockEntity { resolution.y = WebDisplays.INSTANCE.maxResY; } } - + + public void createBrowser(boolean doAnim) { + if (WebDisplays.PROXY instanceof ClientProxy clientProxy) { + browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(url != null ? url : "https://www.google.com")); + + if (rotation.isVertical) + browser.resize(resolution.y, resolution.x); + else + browser.resize(resolution.x, resolution.y); + + doTurnOnAnim = doAnim; + turnOnTime = System.currentTimeMillis(); + } + } } public void forEachScreenBlocks(BlockSide side, Consumer func) { @@ -259,32 +271,29 @@ public class TileEntityScreen extends BlockEntity { } @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); - - ListTag list = tag.getList("WDScreens", 10); + public void load(CompoundTag tag) { + super.load(tag); + + ListTag list = tag.getList("WDScreens", Tag.TAG_COMPOUND); if (list.isEmpty()) return; - + screens.clear(); for (int i = 0; i < list.size(); i++) screens.add(Screen.deserialize(list.getCompound(i))); } - + @Override - @Nonnull - public CompoundTag serializeNBT() { - CompoundTag tag = new CompoundTag(); - super.serializeNBT(); - + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + ListTag list = new ListTag(); for (Screen scr : screens) list.add(scr.serialize()); - + tag.put("WDScreens", list); - return tag; } - + public Screen addScreen(BlockSide side, Vector2i size, @Nullable Vector2i resolution, @Nullable Player owner, boolean sendUpdate) { for (Screen scr : screens) { if (scr.side == side) @@ -333,7 +342,7 @@ public class TileEntityScreen extends BlockEntity { ret.setupRedstoneStatus(level, getBlockPos()); if (sendUpdate) - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new CMessageAddScreen(this, ret)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new S2CMessageAddScreen(this, ret)); } screens.add(ret); @@ -343,6 +352,8 @@ public class TileEntityScreen extends BlockEntity { else setChanged(); +// level.blockEntityChanged(worldPosition); + return ret; } @@ -372,7 +383,7 @@ public class TileEntityScreen extends BlockEntity { public void requestData(ServerPlayer ep) { if (!level.isClientSide) - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ep), new CMessageAddScreen(this)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ep), new S2CMessageAddScreen(this)); } public static String url(String url) throws IOException { @@ -385,7 +396,7 @@ public class TileEntityScreen extends BlockEntity { } return url; } else { - return null; + return url; // TODO: ? } } @@ -406,7 +417,7 @@ public class TileEntityScreen extends BlockEntity { if (scr.browser != null) scr.browser.loadURL(weburl); } else { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.setURL(this, side, weburl)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.setURL(this, side, weburl)); setChanged(); } } @@ -430,8 +441,7 @@ public class TileEntityScreen extends BlockEntity { screens.get(idx).browser.close(); screens.get(idx).browser = null; } - } else - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new CMessageScreenUpdate(this, side)); //Delete the screen + } else WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new S2CMessageScreenUpdate(this, side)); //Delete the screen screens.remove(idx); @@ -466,7 +476,7 @@ public class TileEntityScreen extends BlockEntity { scr.browser = null; //Will be re-created by renderer } } else { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.setResolution(this, side, res)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.setResolution(this, side, res)); setChanged(); } } @@ -502,13 +512,13 @@ public class TileEntityScreen extends BlockEntity { if (level.isClientSide) Log.warning("TileEntityScreen.click() from client side is useless..."); else if (getLaserUser(scr) == null) - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_CLICK, vec)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_CLICK, vec)); } void clickUnsafe(BlockSide side, int action, int x, int y) { if (level.isClientSide) { - Vector2i vec = (action == CMessageScreenUpdate.MOUSE_UP) ? null : new Vector2i(x, y); - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.click(this, side, action, vec)); + Vector2i vec = (action == S2CMessageScreenUpdate.MOUSE_UP) ? null : new Vector2i(x, y); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, action, vec)); } } @@ -520,7 +530,7 @@ public class TileEntityScreen extends BlockEntity { } if (scr.browser != null) { - if (event == CMessageScreenUpdate.MOUSE_CLICK) { + if (event == S2CMessageScreenUpdate.MOUSE_CLICK) { if(InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_LEFT_ALT) || InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_RIGHT_ALT)) { scr.browser.injectMouseMove(vec.x, vec.y, 0, false); //Move to target @@ -531,12 +541,12 @@ public class TileEntityScreen extends BlockEntity { scr.browser.injectMouseButton(vec.x, vec.y, 0, 1, true, 1); //Press scr.browser.injectMouseButton(vec.x, vec.y, 0, 1, false, 1); //Release } - } else if (event == CMessageScreenUpdate.MOUSE_DOWN) { + } else if (event == S2CMessageScreenUpdate.MOUSE_DOWN) { scr.browser.injectMouseMove(vec.x, vec.y, 0, false); //Move to target scr.browser.injectMouseButton(vec.x, vec.y, 0, 1, true, 1); //Press - } else if (event == CMessageScreenUpdate.MOUSE_MOVE) + } else if (event == S2CMessageScreenUpdate.MOUSE_MOVE) scr.browser.injectMouseMove(vec.x, vec.y, 0, false); //Move - else if (event == CMessageScreenUpdate.MOUSE_UP) + else if (event == S2CMessageScreenUpdate.MOUSE_UP) scr.browser.injectMouseButton(scr.lastMousePos.x, scr.lastMousePos.y, 0, 1, false, 1); //Release if (vec != null) { scr.lastMousePos.x = vec.x; @@ -571,11 +581,12 @@ public class TileEntityScreen extends BlockEntity { } if (sendMsg) - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.jsRedstone(this, side, vec, redstoneLevel)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.jsRedstone(this, side, vec, redstoneLevel)); } } public void handleJSRequest(ServerPlayer src, BlockSide side, int reqId, JSServerRequest req, Object[] data) { + // TODO: if (level.isClientSide) { Log.error("Called handleJSRequest client-side"); return; @@ -584,18 +595,18 @@ public class TileEntityScreen extends BlockEntity { Screen scr = getScreen(side); if (scr == null) { Log.error("Called handleJSRequest on non-existing side %s", side.toString()); - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, 403, "Invalid side")); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, 403, "Invalid side")); return; } if (!scr.owner.uuid.equals(src.getGameProfile().getId())) { Log.warning("Player %s (UUID %s) tries to use the redstone output API on a screen he doesn't own!", src.getName(), src.getGameProfile().getId().toString()); - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, 403, "Only the owner can do that")); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, 403, "Only the owner can do that")); return; } if (scr.upgrades.stream().noneMatch(DefaultUpgrade.REDOUTPUT::matchesRedInput)) { - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, 403, "Missing upgrade")); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, 403, "Missing upgrade")); return; } @@ -620,14 +631,14 @@ public class TileEntityScreen extends BlockEntity { vec1.add(side.up.x, side.up.y, side.up.z); } - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, new byte[0])); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, new byte[0])); } else if (req == JSServerRequest.SET_REDSTONE_AT) { int x = (Integer) data[0]; int y = (Integer) data[1]; boolean state = (Boolean) data[2]; if (x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y) - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, 403, "Out of range")); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, 403, "Out of range")); else { BlockPos bp = (new Vector3i(getBlockPos())).addMul(side.right, x).addMul(side.up, y).toBlock(); BlockState bs = level.getBlockState(bp); @@ -635,20 +646,36 @@ public class TileEntityScreen extends BlockEntity { if (!bs.getValue(BlockScreen.emitting).equals(state)) level.setBlockAndUpdate(bp, bs.setValue(BlockScreen.emitting, state)); - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, new byte[0])); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, new byte[0])); } } else - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new CMessageJSResponse(reqId, req, 400, "Invalid request")); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> src), new S2CMessageJSResponse(reqId, req, 400, "Invalid request")); } @Override public void onLoad() { if (level.isClientSide) { - Messages.INSTANCE.sendToServer(new SMessageRequestTEData(this)); WebDisplays.PROXY.trackScreen(this, true); } } - + + @Override + public CompoundTag getUpdateTag() { + CompoundTag tag = new CompoundTag(); + saveAdditional(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + load(tag); + for (Screen screen : screens) { + if (screen.browser == null) screen.createBrowser(false); + if (screen.browser != null) screen.browser.loadURL(screen.url); + } + updateAABB(); + } + @Override public void onChunkUnloaded() { if (level.isClientSide) { @@ -705,7 +732,8 @@ public class TileEntityScreen extends BlockEntity { } } - renderBB = box.toMc(); + if (box == null) renderBB = new AABB(worldPosition); + else renderBB = box.toMc(); } @Override @@ -864,7 +892,7 @@ public class TileEntityScreen extends BlockEntity { } } } else { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.type(this, side, text)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.type(this, side, text)); if (soundPos != null) playSoundAt(WebDisplays.INSTANCE.soundTyping, soundPos, 0.25f, 1.f); @@ -931,7 +959,7 @@ public class TileEntityScreen extends BlockEntity { isCopy.setCount(1); scr.upgrades.add(isCopy); - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.upgrade(this, side)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.upgrade(this, side)); itemAsUpgrade.onInstall(this, side, player, isCopy); playSoundAt(WebDisplays.INSTANCE.soundUpgradeAdd, getBlockPos(), 1.0f, 1.0f); setChanged(); @@ -993,7 +1021,7 @@ public class TileEntityScreen extends BlockEntity { if (idxToRemove >= 0) { dropUpgrade(scr.upgrades.get(idxToRemove), side, player); scr.upgrades.remove(idxToRemove); - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.upgrade(this, side)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.upgrade(this, side)); playSoundAt(WebDisplays.INSTANCE.soundUpgradeDel, getBlockPos(), 1.0f, 1.0f); setChanged(); } else @@ -1049,10 +1077,10 @@ public class TileEntityScreen extends BlockEntity { //Try to acquire laser lock if (getLaserUser(scr) == null) { scr.laserUser = ply; - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_DOWN, pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_DOWN, pos)); } } else if (getLaserUser(scr) == ply) - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_MOVE, pos)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_MOVE, pos)); } } @@ -1062,7 +1090,7 @@ public class TileEntityScreen extends BlockEntity { if (scr != null) { if (getLaserUser(scr) == ply) { scr.laserUser = null; - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_UP, null)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_UP, null)); } } } @@ -1073,7 +1101,7 @@ public class TileEntityScreen extends BlockEntity { scr.upgrades.clear(); } - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new CMessageCloseGui(getBlockPos())); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new S2CMessageCloseGui(getBlockPos())); } public void setOwner(BlockSide side, Player newOwner) { @@ -1094,7 +1122,7 @@ public class TileEntityScreen extends BlockEntity { } scr.owner = new NameUUIDPair(newOwner.getGameProfile()); - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.owner(this, side, scr.owner)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.owner(this, side, scr.owner)); checkLaserUserRights(scr); setChanged(); } @@ -1118,7 +1146,7 @@ public class TileEntityScreen extends BlockEntity { } } else { scr.rotation = rot; - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.rotation(this, side, rot)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.rotation(this, side, rot)); setChanged(); } } @@ -1133,8 +1161,8 @@ public class TileEntityScreen extends BlockEntity { if (level.isClientSide) { if (scr.browser != null) scr.browser.runJS(code, ""); - } else - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.js(this, side, code)); + } + else WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.js(this, side, code)); } public void setAutoVolume(BlockSide side, boolean av) { @@ -1149,7 +1177,7 @@ public class TileEntityScreen extends BlockEntity { if (level.isClientSide) WebDisplays.PROXY.screenUpdateAutoVolumeInGui(new Vector3i(getBlockPos()), side, av); else { - Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.autoVolume(this, side, av)); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.autoVolume(this, side, av)); setChanged(); } } diff --git a/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java b/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java index cd2c33c..57eee43 100644 --- a/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java +++ b/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java @@ -1,9 +1,6 @@ package net.montoyo.wd.miniserv; import net.minecraft.server.level.ServerPlayer; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageGetUrl; -import net.montoyo.wd.net.server.URLMessage; import java.util.ArrayList; import java.util.HashMap; @@ -23,9 +20,8 @@ public class SyncPlugin { } public static String getPlayerString(ServerPlayer player) { - if(URL.get(player) == null) { - setPlayerString(player, new URLMessage().getURL()); - } +// if(URL.get(player) == null) +// setPlayerString(player, new URLMessage().getURL()); return URL.get(player); } @@ -35,7 +31,7 @@ public class SyncPlugin { if (syncedPlayersList != null) { for (ServerPlayer syncedPlayer : syncedPlayersList) { if(!syncedPlayer.hasDisconnected()) { - Messages.INSTANCE.sendToServer(new SMessageGetUrl(URL.get(syncedPlayer))); +// WDNetworkRegistry.INSTANCE.sendToServer(new SMessageGetUrl(URL.get(syncedPlayer))); } } } diff --git a/src/main/java/net/montoyo/wd/miniserv/client/Client.java b/src/main/java/net/montoyo/wd/miniserv/client/Client.java index 12de278..021d175 100644 --- a/src/main/java/net/montoyo/wd/miniserv/client/Client.java +++ b/src/main/java/net/montoyo/wd/miniserv/client/Client.java @@ -5,8 +5,9 @@ package net.montoyo.wd.miniserv.client; import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; import net.montoyo.wd.miniserv.*; -import net.montoyo.wd.net.server.SMessageMiniservConnect; +import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Util; @@ -43,13 +44,13 @@ public class Client extends AbstractClient implements Runnable { private volatile boolean connected; private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(8192); private volatile Thread thread; - private final UUID clientUUID = Minecraft.getInstance().player.getGameProfile().getId(); + private UUID clientUUID; private final ArrayDeque tasks = new ArrayDeque<>(); private ClientTask currentTask; private volatile boolean authenticated; private long lastPingTime; - public SMessageMiniservConnect beginConnection() { + public C2SMessageMiniservConnect beginConnection() { if(keyPair == null) { try { KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); @@ -62,7 +63,7 @@ public class Client extends AbstractClient implements Runnable { } RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic(); - return new SMessageMiniservConnect(pubKey.getModulus().toByteArray(), pubKey.getPublicExponent().toByteArray()); + return new C2SMessageMiniservConnect(pubKey.getModulus().toByteArray(), pubKey.getPublicExponent().toByteArray()); } public boolean decryptKey(byte[] encKey) { @@ -146,6 +147,13 @@ public class Client extends AbstractClient implements Runnable { @Override public void run() { + if (clientUUID == null) { + Player player = Minecraft.getInstance().player; + if (player != null) + clientUUID = player.getGameProfile().getId(); + else return; // can't tick yet; player does not exist + } + try { selector = Selector.open(); socket = SocketChannel.open(); diff --git a/src/main/java/net/montoyo/wd/miniserv/server/Server.java b/src/main/java/net/montoyo/wd/miniserv/server/Server.java index 73fe883..7a2a95f 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/Server.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/Server.java @@ -141,26 +141,30 @@ public class Server implements Runnable { selector.select(1000); //Allow the server to kick timed-out clients for(SelectionKey key: selector.selectedKeys()) { - if(key.isAcceptable()) { - SocketChannel chan; - - try { - chan = server.accept(); - } catch(Throwable t) { - Log.warningEx("Could not accept client", t); - chan = null; - } - - if(chan != null) { - chan.configureBlocking(false); - ServerClient toAdd = new ServerClient(chan, selector); - - clientMap.put(chan, toAdd); - clientList.add(toAdd); - } - } - + if (key == null) continue; + try { + // this can throw an exception + // there is no getting around this fact other than try/catch + if(key.isAcceptable()) { + SocketChannel chan; + + try { + chan = server.accept(); + } catch(Throwable t) { + Log.warningEx("Could not accept client", t); + chan = null; + } + + if(chan != null) { + chan.configureBlocking(false); + ServerClient toAdd = new ServerClient(chan, selector); + + clientMap.put(chan, toAdd); + clientList.add(toAdd); + } + } + if (key.isReadable()) { ServerClient cli = clientMap.get(key.channel()); diff --git a/src/main/java/net/montoyo/wd/net/BufferUtils.java b/src/main/java/net/montoyo/wd/net/BufferUtils.java new file mode 100644 index 0000000..fa29cad --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/BufferUtils.java @@ -0,0 +1,75 @@ +package net.montoyo.wd.net; + +import net.minecraft.network.FriendlyByteBuf; +import net.montoyo.wd.utilities.Vector3i; + +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +public class BufferUtils { + public static void writeUShort(FriendlyByteBuf buf, int v) { + // TODO: write a pair of bytes manually + buf.writeInt(v); + } + + public static int readUShort(FriendlyByteBuf buf) { + return buf.readInt(); + } + + public static void writeBytes(FriendlyByteBuf buf, byte[] data) { + writeUShort(buf, data.length); + for (byte datum : data) buf.writeByte(datum); + } + + public static byte[] readBytes(FriendlyByteBuf buf) { + byte[] data = new byte[readUShort(buf)]; + for (int i = 0; i < data.length; i++) data[i] = buf.readByte(); + return data; + } + + public static void writeVec3i(FriendlyByteBuf buf, Vector3i pos) { + buf.writeInt(pos.x); + buf.writeInt(pos.y); + buf.writeInt(pos.z); + } + + public static Vector3i readVec3i(FriendlyByteBuf buf) { + return new Vector3i(buf.readInt(), buf.readInt(), buf.readInt()); + } + + public static void writeEnum(FriendlyByteBuf buf, Enum value, byte byteCount) { + int ord = 0; + if (value != null) ord = value.ordinal() + 1; + switch (byteCount) { + case 1 -> buf.writeByte(ord); + case 2 -> buf.writeShort(ord); + case 4 -> buf.writeInt(ord); + default -> throw new RuntimeException("Invalid byte count " + byteCount + ". Must be 1, 2... and 4"); + } + } + + public static void writeArray(FriendlyByteBuf buf, T[] elements, Consumer writer) { + writeUShort(buf, elements.length); + for (T element : elements) writer.accept(element); + } + + public static T[] readArray(FriendlyByteBuf buf, Supplier reader) { + //noinspection unchecked + T[] ts = (T[]) new Object[readUShort(buf)]; + for (int i = 0; i < ts.length; i++) ts[i] = reader.get(); + return ts; + } + + public static Enum readEnum(FriendlyByteBuf buf, Function> mapper, byte byteCount) { + int ord = switch (byteCount) { + case 1 -> buf.readByte(); + case 2 -> buf.readShort(); + case 4 -> buf.readInt(); + default -> throw new RuntimeException("Invalid byte count " + byteCount + ". Must be 1, 2, or 4"); + }; + if (ord == 0) return null; + + return mapper.apply(ord - 1); + } +} diff --git a/src/main/java/net/montoyo/wd/net/Messages.java b/src/main/java/net/montoyo/wd/net/Messages.java deleted file mode 100644 index 3ce6b71..0000000 --- a/src/main/java/net/montoyo/wd/net/Messages.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import net.montoyo.wd.net.client.*; -import net.montoyo.wd.net.server.*; - -@Mod.EventBusSubscriber -public class Messages { - - private static final String PROTOCOL_VERSION = "1"; - private static int index = 0; - public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( - new ResourceLocation("webdisplays", "packetsystem"), - () -> PROTOCOL_VERSION, - PROTOCOL_VERSION::equals, - PROTOCOL_VERSION::equals - ); - - @SubscribeEvent - public static void registryNetworkPackets (FMLCommonSetupEvent event) { - INSTANCE.registerMessage(index++, CMessageACResult.class, CMessageACResult::encode, CMessageACResult::decode, CMessageACResult::handle); - INSTANCE.registerMessage(index++, CMessageAddScreen.class, CMessageAddScreen::encode, CMessageAddScreen::decode, CMessageAddScreen::handle); - INSTANCE.registerMessage(index++, CMessageCloseGui.class, CMessageCloseGui::encode, CMessageCloseGui::decode, CMessageCloseGui::handle); - INSTANCE.registerMessage(index++, CMessageJSResponse.class, CMessageJSResponse::encode, CMessageJSResponse::decode, CMessageJSResponse::handle); - INSTANCE.registerMessage(index++, CMessageMiniservKey.class, CMessageMiniservKey::encode, CMessageMiniservKey::decode, CMessageMiniservKey::handle); - INSTANCE.registerMessage(index++, CMessageScreenUpdate.class, CMessageScreenUpdate::encode, CMessageScreenUpdate::decode, CMessageScreenUpdate::handle); - INSTANCE.registerMessage(index++, CMessageServerInfo.class, CMessageServerInfo::encode, CMessageServerInfo::decode, CMessageServerInfo::handle); - INSTANCE.registerMessage(index++, SMessageACQuery.class, SMessageACQuery::encode, SMessageACQuery::decode, SMessageACQuery::handle); - INSTANCE.registerMessage(index++, SMessageMiniservConnect.class, SMessageMiniservConnect::encode, SMessageMiniservConnect::decode, SMessageMiniservConnect::handle); - INSTANCE.registerMessage(index++, SMessageRedstoneCtrl.class, SMessageRedstoneCtrl::encode, SMessageRedstoneCtrl::decode, SMessageRedstoneCtrl::handle); - INSTANCE.registerMessage(index++, SMessageRequestTEData.class, SMessageRequestTEData::encode, SMessageRequestTEData::decode, SMessageRequestTEData::handle); - INSTANCE.registerMessage(index++, SMessageScreenCtrl.class, SMessageScreenCtrl::encode, SMessageScreenCtrl::decode, SMessageScreenCtrl::handle); - INSTANCE.registerMessage(index++, SMessagePadCtrl.class, SMessagePadCtrl::encode, SMessagePadCtrl::decode, SMessagePadCtrl::handle); - INSTANCE.registerMessage(index++, CMessageOpenGui.class, CMessageOpenGui::encode, CMessageOpenGui::decode, CMessageOpenGui::handle); - INSTANCE.registerMessage(index++, SMessageGetUrl.class, SMessageGetUrl::encode, SMessageGetUrl::decode, SMessageGetUrl::handle); - INSTANCE.registerMessage(index++, URLMessage.class, URLMessage::encode, URLMessage::decode, URLMessage::handle); - } -} diff --git a/src/main/java/net/montoyo/wd/net/NetworkEntry.java b/src/main/java/net/montoyo/wd/net/NetworkEntry.java new file mode 100644 index 0000000..6d22fd2 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/NetworkEntry.java @@ -0,0 +1,25 @@ +package net.montoyo.wd.net; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.simple.SimpleChannel; + +import java.util.function.Function; + +public class NetworkEntry { + Class clazz; + Function fabricator; + + public NetworkEntry(Class clazz, Function fabricator) { + this.clazz = clazz; + this.fabricator = fabricator; + } + + public void register(int indx, SimpleChannel channel) { + channel.registerMessage( + indx, clazz, + Packet::write, + fabricator, + (pkt, ctx) -> pkt.handle(ctx.get()) + ); + } +} diff --git a/src/main/java/net/montoyo/wd/net/Packet.java b/src/main/java/net/montoyo/wd/net/Packet.java new file mode 100644 index 0000000..d524273 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/Packet.java @@ -0,0 +1,76 @@ +package net.montoyo.wd.net; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.PacketListener; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.PacketDistributor; +import net.montoyo.wd.utilities.DistSafety; + +import java.util.ArrayList; +import java.util.function.Supplier; + +public class Packet implements net.minecraft.network.protocol.Packet { + public Packet() { + } + + public Packet(FriendlyByteBuf buf) { + + } + + public void write(FriendlyByteBuf buf) { + } + + public void handle(NetworkEvent.Context ctx) { + } + + public final void handle(PacketListener pHandler) { + } + + public boolean isSkippable() { + return net.minecraft.network.protocol.Packet.super.isSkippable(); + } + + public boolean checkClient(NetworkEvent.Context ctx) { + return ctx.getDirection().getReceptionSide().isClient(); + } + + public boolean checkServer(NetworkEvent.Context ctx) { + return ctx.getDirection().getReceptionSide().isServer(); + } + + public void respond(NetworkEvent.Context ctx, Packet packet) { + ctx.enqueueWork(() -> WDNetworkRegistry.INSTANCE.reply(packet, ctx)); + } + + private static final ArrayList runLater = new ArrayList<>(); + + public void respondLater(NetworkEvent.Context ctx, Packet packet) { + ctx.enqueueWork(() -> runLater.add(() -> { + if (checkClient(ctx)) + WDNetworkRegistry.INSTANCE.sendToServer(packet); + else if (ctx.getSender() != null) + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(ctx::getSender), packet); + else WDNetworkRegistry.INSTANCE.reply(packet, ctx); + })); + } + + public static void onTick(TickEvent.RenderTickEvent event) { + if (event.phase.equals(TickEvent.Phase.END)) { + if (!runLater.isEmpty()) { + if (DistSafety.isConnected()) { + for (Runnable runnable : runLater) runnable.run(); + runLater.clear(); + } + } + } + } + + static { + MinecraftForge.EVENT_BUS.addListener(Packet::onTick); + } + + public final void handle(Supplier contextSupplier) { + } +} diff --git a/src/main/java/net/montoyo/wd/net/WDNetworkRegistry.java b/src/main/java/net/montoyo/wd/net/WDNetworkRegistry.java new file mode 100644 index 0000000..6fbc7b5 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/WDNetworkRegistry.java @@ -0,0 +1,62 @@ +package net.montoyo.wd.net; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; +import net.montoyo.wd.net.client_bound.*; +import net.montoyo.wd.net.server_bound.C2SMessageACQuery; +import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect; +import net.montoyo.wd.net.server_bound.C2SMessageRedstoneCtrl; +import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; + +import java.util.ArrayList; + +public class WDNetworkRegistry { + public static final String networkingVersion = "2"; + public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( + new ResourceLocation("webdisplays", "packetsystem"), + () -> networkingVersion, + (s) -> s.equals(networkingVersion), + (s) -> s.equals(networkingVersion) + ); + + // if an old packet needs to be ported, refer to the following link + // https://github.com/Mysticpasta1/webdisplays/tree/ff55cbf1b27773c15f44f17ad3364da3a16b6ed9/src/main/java/net/montoyo/wd/net + // however, I think I got all the essentials + // only thing I skipped on, is the minepad + static { + ArrayList> entries = new ArrayList<>(); + + // login handshake + entries.add(new NetworkEntry<>(S2CMessageServerInfo.class, S2CMessageServerInfo::new)); + entries.add(new NetworkEntry<>(C2SMessageMiniservConnect.class, C2SMessageMiniservConnect::new)); + entries.add(new NetworkEntry<>(S2CMessageMiniservKey.class, S2CMessageMiniservKey::new)); + + // guis + entries.add(new NetworkEntry<>(S2CMessageCloseGui.class, S2CMessageCloseGui::new)); + entries.add(new NetworkEntry<>(S2CMessageOpenGui.class, S2CMessageOpenGui::new)); + + // screen creation + entries.add(new NetworkEntry<>(S2CMessageAddScreen.class, S2CMessageAddScreen::new)); + + // screen modifications + entries.add(new NetworkEntry<>(C2SMessageScreenCtrl.class, C2SMessageScreenCtrl::new)); + entries.add(new NetworkEntry<>(S2CMessageScreenUpdate.class, S2CMessageScreenUpdate::new)); + + // redstone control + entries.add(new NetworkEntry<>(C2SMessageRedstoneCtrl.class, C2SMessageRedstoneCtrl::new)); + + // autocomplete + entries.add(new NetworkEntry<>(C2SMessageACQuery.class, C2SMessageACQuery::new)); + entries.add(new NetworkEntry<>(S2CMessageACResult.class, S2CMessageACResult::new)); + + // jsquery + entries.add(new NetworkEntry<>(S2CMessageJSResponse.class, S2CMessageJSResponse::new)); + + for (int i = 0; i < entries.size(); i++) entries.get(i).register(i, INSTANCE); + } + + public static void init() { + // nothing to do + } +} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java deleted file mode 100644 index f4cae6d..0000000 --- a/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.client; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.utilities.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.function.Supplier; - -public class CMessageAddScreen { - - private boolean clear; - private Vector3i pos; - private TileEntityScreen.Screen[] screens; - - public CMessageAddScreen(TileEntityScreen tes) { - clear = true; - pos = new Vector3i(tes.getBlockPos()); - screens = new TileEntityScreen.Screen[tes.screenCount()]; - - for (int i = 0; i < tes.screenCount(); i++) - screens[i] = tes.getScreen(i); - } - - public CMessageAddScreen(TileEntityScreen tes, TileEntityScreen.Screen... toSend) { - clear = false; - pos = new Vector3i(tes.getBlockPos()); - screens = toSend; - } - - public CMessageAddScreen(boolean clear, Vector3i pos, TileEntityScreen.Screen[] screens) { - this.clear = clear; - this.pos = pos; - this.screens = screens; - } - - public static CMessageAddScreen decode(FriendlyByteBuf buf) { - boolean clear = buf.readBoolean(); - Vector3i pos = new Vector3i(buf); - - int cnt = buf.readByte() & 7; - - TileEntityScreen.Screen[] screens = new TileEntityScreen.Screen[cnt]; - for (int i = 0; i < cnt; i++) { - screens[i] = new TileEntityScreen.Screen(); - screens[i].side = BlockSide.values()[buf.readByte()]; - screens[i].size = new Vector2i(buf); - screens[i].url = buf.readUtf(); - screens[i].resolution = new Vector2i(buf); - screens[i].rotation = Rotation.values()[buf.readByte() & 3]; - screens[i].owner = new NameUUIDPair(buf); - screens[i].upgrades = new ArrayList<>(); - - int numUpgrades = buf.readByte(); - for (int j = 0; j < numUpgrades; j++) - screens[i].upgrades.add(buf.readItem()); - } - - return new CMessageAddScreen(clear, pos, screens); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeBoolean(clear); - pos.writeTo(buf); - buf.writeByte(screens.length); - - for (TileEntityScreen.Screen scr : screens) { - buf.writeByte(scr.side.ordinal()); - scr.size.writeTo(buf); - buf.writeUtf(scr.url); - scr.resolution.writeTo(buf); - buf.writeByte(scr.rotation.ordinal()); - scr.owner.writeTo(buf); - buf.writeByte(scr.upgrades.size()); - - for (ItemStack is : scr.upgrades) - buf.writeItem(is); - } - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - BlockEntity te = WebDisplays.PROXY.getWorld(contextSupplier.get()).getBlockEntity(pos.toBlock()); - if (!(te instanceof TileEntityScreen)) { - if (clear) - Log.error("CMessageAddScreen: Can't add screen to invalid tile entity at %s", pos.toString()); - - return; - } - - TileEntityScreen tes = (TileEntityScreen) te; - if (clear) - tes.clear(); - - for (TileEntityScreen.Screen entry : screens) { - TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); - scr.rotation = entry.rotation; - String webUrl; - - try { - webUrl = TileEntityScreen.url(entry.url); - } catch (IOException e) { - throw new RuntimeException(e); - } - - scr.url = webUrl; - scr.owner = entry.owner; - scr.upgrades = entry.upgrades; - - if (scr.browser != null) - scr.browser.loadURL(webUrl); - } - - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageCloseGui.java b/src/main/java/net/montoyo/wd/net/client/CMessageCloseGui.java deleted file mode 100644 index b1c3983..0000000 --- a/src/main/java/net/montoyo/wd/net/client/CMessageCloseGui.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.client; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.utilities.BlockSide; - -import java.util.Arrays; -import java.util.function.Supplier; - -public class CMessageCloseGui { - - private BlockPos blockPos; - private BlockSide blockSide; - - public CMessageCloseGui(BlockPos bp) { - blockPos = bp; - blockSide = null; - } - - public CMessageCloseGui(BlockPos bp, BlockSide side) { - blockPos = bp; - blockSide = side; - } - - public static CMessageCloseGui decode(FriendlyByteBuf buf) { - int x, y, z, side; - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - side = buf.readByte(); - - BlockPos blockPos = new BlockPos(x, y, z); - BlockSide blockSide = side <= 0 ? null : BlockSide.values()[side - 1]; - - return new CMessageCloseGui(blockPos, blockSide); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeInt(blockPos.getX()); - buf.writeInt(blockPos.getY()); - buf.writeInt(blockPos.getZ()); - - if(blockSide == null) { - buf.writeByte(0); - } else { - buf.writeByte(blockSide.ordinal() + 1); - } - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - if (blockSide == null) - Arrays.stream(BlockSide.values()).forEach(s -> WebDisplays.PROXY.closeGui(blockPos, s)); - else - WebDisplays.PROXY.closeGui(blockPos, blockSide); - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageMiniservKey.java b/src/main/java/net/montoyo/wd/net/client/CMessageMiniservKey.java deleted file mode 100644 index 237d3ad..0000000 --- a/src/main/java/net/montoyo/wd/net/client/CMessageMiniservKey.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.client; - -import io.netty.buffer.ByteBuf; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.client.ClientProxy; -import net.montoyo.wd.miniserv.client.Client; -import net.montoyo.wd.utilities.Log; - -import java.util.function.Supplier; - -public class CMessageMiniservKey { - - private byte[] encryptedKey; - - public CMessageMiniservKey(byte[] key) { - encryptedKey = key; - } - - public static CMessageMiniservKey decode(FriendlyByteBuf buf) { - byte[] encryptedKey = new byte[buf.readShort() & 0xFFFF]; - buf.readBytes(encryptedKey); - return new CMessageMiniservKey(encryptedKey); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeShort(encryptedKey.length); - buf.writeBytes(encryptedKey); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - if (Client.getInstance().decryptKey(encryptedKey)) { - Log.info("Successfully received and decrypted key, starting miniserv client..."); - if(WebDisplays.PROXY instanceof ClientProxy proxy) { - proxy.startMiniservClient(); - } - } - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageOpenGui.java b/src/main/java/net/montoyo/wd/net/client/CMessageOpenGui.java deleted file mode 100644 index faef23e..0000000 --- a/src/main/java/net/montoyo/wd/net/client/CMessageOpenGui.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2019 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.client; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.data.GuiData; -import net.montoyo.wd.utilities.Util; - -import java.util.function.Supplier; - -public class CMessageOpenGui implements Runnable { - - private GuiData data; - - public CMessageOpenGui(GuiData data) { - this.data = data; - } - - public static CMessageOpenGui decode(FriendlyByteBuf buf) { - String name = buf.readUtf(); - Class cls = GuiData.classOf(name); - - if(cls == null) { - Log.error("Could not create GuiData of type %s because it doesn't exist!", name); - return null; - } - - return new CMessageOpenGui((GuiData) Util.unserialize(buf, cls)); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(data.getName()); - Util.serialize(buf, data); - } - - @Override - public void run() { - WebDisplays.PROXY.displayGui(data); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageServerInfo.java b/src/main/java/net/montoyo/wd/net/client/CMessageServerInfo.java deleted file mode 100644 index f294865..0000000 --- a/src/main/java/net/montoyo/wd/net/client/CMessageServerInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.client; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.miniserv.client.Client; -import net.montoyo.wd.net.Messages; - -import java.util.function.Supplier; - -public class CMessageServerInfo { - - private int miniservPort; - - public CMessageServerInfo(int msPort) { - miniservPort = msPort; - } - - public static CMessageServerInfo decode(FriendlyByteBuf buf) { - return new CMessageServerInfo(buf.readShort() & 0xFFFF); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeShort(miniservPort); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - WebDisplays.PROXY.setMiniservClientPort(miniservPort); - if (miniservPort > 0) - Messages.INSTANCE.sendToServer(Client.getInstance().beginConnection()); - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageACResult.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java similarity index 57% rename from src/main/java/net/montoyo/wd/net/client/CMessageACResult.java rename to src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java index 00f57a9..69b46a9 100644 --- a/src/main/java/net/montoyo/wd/net/client/CMessageACResult.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageACResult.java @@ -2,45 +2,44 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.net.client; +package net.montoyo.wd.net.client_bound; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.NameUUIDPair; -import java.util.function.Supplier; - -public class CMessageACResult { - +public class S2CMessageACResult extends Packet { private static NameUUIDPair[] result; - public CMessageACResult(NameUUIDPair[] pairs) { + public S2CMessageACResult(NameUUIDPair[] pairs) { result = pairs; } - - public static CMessageACResult decode(FriendlyByteBuf buf) { + + public S2CMessageACResult(FriendlyByteBuf buf) { + super(buf); + int cnt = buf.readByte(); result = new NameUUIDPair[cnt]; for(int i = 0; i < cnt; i++) result[i] = new NameUUIDPair(buf); - - return new CMessageACResult(result); } - public void encode(FriendlyByteBuf buf) { + @Override + public void write(FriendlyByteBuf buf) { buf.writeByte(result.length); for(NameUUIDPair pair : result) pair.writeTo(buf); } - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { + public void handle(NetworkEvent.Context ctx) { + ctx.enqueueWork(() -> { WebDisplays.PROXY.onAutocompleteResult(result); }); - contextSupplier.get().setPacketHandled(true); + ctx.setPacketHandled(true); } -} +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java new file mode 100644 index 0000000..1761e08 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageAddScreen.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.client_bound; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.utilities.*; + +import java.io.IOException; +import java.util.ArrayList; + +import static net.montoyo.wd.block.BlockScreen.hasTE; + +public class S2CMessageAddScreen extends Packet { + private boolean clear; + private Vector3i pos; + private TileEntityScreen.Screen[] screens; + + public S2CMessageAddScreen(TileEntityScreen tes) { + clear = true; + pos = new Vector3i(tes.getBlockPos()); + screens = new TileEntityScreen.Screen[tes.screenCount()]; + + for (int i = 0; i < tes.screenCount(); i++) + screens[i] = tes.getScreen(i); + } + + public S2CMessageAddScreen(TileEntityScreen tes, TileEntityScreen.Screen... toSend) { + clear = false; + pos = new Vector3i(tes.getBlockPos()); + screens = toSend; + } + + public S2CMessageAddScreen(boolean clear, Vector3i pos, TileEntityScreen.Screen[] screens) { + this.clear = clear; + this.pos = pos; + this.screens = screens; + } + + public S2CMessageAddScreen(FriendlyByteBuf buf) { + super(buf); + + clear = buf.readBoolean(); + pos = new Vector3i(buf); + + int cnt = buf.readByte() & 7; + + screens = new TileEntityScreen.Screen[cnt]; + for (int i = 0; i < cnt; i++) { + screens[i] = new TileEntityScreen.Screen(); + screens[i].side = BlockSide.values()[buf.readByte()]; + screens[i].size = new Vector2i(buf); + screens[i].url = buf.readUtf(); + screens[i].resolution = new Vector2i(buf); + screens[i].rotation = Rotation.values()[buf.readByte() & 3]; + screens[i].owner = new NameUUIDPair(buf); + screens[i].upgrades = new ArrayList<>(); + + int numUpgrades = buf.readByte(); + for (int j = 0; j < numUpgrades; j++) + screens[i].upgrades.add(buf.readItem()); + } + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeBoolean(clear); + pos.writeTo(buf); + buf.writeByte(screens.length); + + for (TileEntityScreen.Screen scr : screens) { + buf.writeByte(scr.side.ordinal()); + scr.size.writeTo(buf); + buf.writeUtf(scr.url); + scr.resolution.writeTo(buf); + buf.writeByte(scr.rotation.ordinal()); + scr.owner.writeTo(buf); + buf.writeByte(scr.upgrades.size()); + + for (ItemStack is : scr.upgrades) + buf.writeItem(is); + } + } + + public void handle(NetworkEvent.Context ctx) { + ctx.enqueueWork(() -> { + Level lvl = (Level) WebDisplays.PROXY.getWorld(ctx); + BlockEntity te = lvl.getBlockEntity(pos.toBlock()); + if (!(te instanceof TileEntityScreen)) { + lvl.setBlockAndUpdate(pos.toBlock(), lvl.getBlockState(pos.toBlock()).setValue(hasTE, true)); + te = lvl.getBlockEntity(pos.toBlock()); + + if (!(te instanceof TileEntityScreen)) { + if (clear) + Log.error("CMessageAddScreen: Can't add screen to invalid tile entity at %s", pos.toString()); + + return; + } + } + + TileEntityScreen tes = (TileEntityScreen) te; + if (clear) + tes.clear(); + + for (TileEntityScreen.Screen entry : screens) { + TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); + scr.rotation = entry.rotation; + String webUrl; + + try { + webUrl = TileEntityScreen.url(entry.url); + } catch (IOException e) { + throw new RuntimeException(e); + } + + scr.url = webUrl; + scr.owner = entry.owner; + scr.upgrades = entry.upgrades; + + if (scr.browser != null) + scr.browser.loadURL(webUrl); + } + }); + + ctx.setPacketHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java new file mode 100644 index 0000000..5b8789b --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageCloseGui.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.client_bound; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.utilities.BlockSide; + +import java.util.Arrays; + +public class S2CMessageCloseGui extends Packet { + private BlockPos blockPos; + private BlockSide blockSide; + + public S2CMessageCloseGui(BlockPos bp) { + blockPos = bp; + blockSide = null; + } + + public S2CMessageCloseGui(BlockPos bp, BlockSide side) { + blockPos = bp; + blockSide = side; + } + + public S2CMessageCloseGui(FriendlyByteBuf buf) { + super(buf); + blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); + byte b = buf.readByte(); + if (b <= 0) blockSide = null; + else blockSide = BlockSide.values()[b - 1]; + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeInt(blockPos.getX()); + buf.writeInt(blockPos.getY()); + buf.writeInt(blockPos.getZ()); + + if (blockSide == null) buf.writeByte(0); + else buf.writeByte(blockSide.ordinal() + 1); + } + + public void handle(NetworkEvent.Context ctx) { + ctx.enqueueWork(() -> { + if (blockSide == null) + Arrays.stream(BlockSide.values()).forEach(s -> WebDisplays.PROXY.closeGui(blockPos, s)); + else + WebDisplays.PROXY.closeGui(blockPos, blockSide); + }); + ctx.setPacketHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageJSResponse.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageJSResponse.java similarity index 70% rename from src/main/java/net/montoyo/wd/net/client/CMessageJSResponse.java rename to src/main/java/net/montoyo/wd/net/client_bound/S2CMessageJSResponse.java index af15bda..9de71c6 100644 --- a/src/main/java/net/montoyo/wd/net/client/CMessageJSResponse.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageJSResponse.java @@ -2,17 +2,16 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.net.client; +package net.montoyo.wd.net.client_bound; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.JSServerRequest; +import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.Log; -import java.util.function.Supplier; - -public class CMessageJSResponse { +public class S2CMessageJSResponse extends Packet { private int id; private JSServerRequest type; @@ -21,22 +20,24 @@ public class CMessageJSResponse { private int errCode; private String errString; - public CMessageJSResponse(int id, JSServerRequest t, byte[] d) { + public S2CMessageJSResponse(int id, JSServerRequest t, byte[] d) { this.id = id; type = t; success = true; data = d; } - public CMessageJSResponse(int id, JSServerRequest t, int code, String err) { + public S2CMessageJSResponse(int id, JSServerRequest t, int code, String err) { this.id = id; type = t; success = false; errCode = code; errString = err; } - - public static CMessageJSResponse decode(FriendlyByteBuf buf) { + + public S2CMessageJSResponse(FriendlyByteBuf buf) { + super(buf); + int id = buf.readInt(); JSServerRequest type = JSServerRequest.fromID(buf.readByte()); boolean success = buf.readBoolean(); @@ -50,15 +51,21 @@ public class CMessageJSResponse { data = new byte[buf.readByte()]; buf.readBytes(data); - return new CMessageJSResponse(id, type, data); + this.id = id; + this.type = type; + this.data = data; } else { errCode = buf.readInt(); errString = buf.readUtf(); - return new CMessageJSResponse(id, type, errCode, errString); + this.id = id; + this.type = type; + this.errCode = errCode; + this.errString = errString; } } - public void encode(FriendlyByteBuf buf) { + @Override + public void write(FriendlyByteBuf buf) { buf.writeInt(id); buf.writeByte(type.ordinal()); buf.writeBoolean(success); @@ -72,8 +79,8 @@ public class CMessageJSResponse { } } - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { + public void handle(NetworkEvent.Context ctx) { + ctx.enqueueWork(() -> { try { if (success) WebDisplays.PROXY.handleJSResponseSuccess(id, type, data); @@ -83,6 +90,6 @@ public class CMessageJSResponse { Log.warningEx("Could not handle JS response", t); } }); - contextSupplier.get().setPacketHandled(true); + ctx.setPacketHandled(true); } } diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageMiniservKey.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageMiniservKey.java new file mode 100644 index 0000000..f2608ef --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageMiniservKey.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.client_bound; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.net.BufferUtils; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.utilities.Log; + +public class S2CMessageMiniservKey extends Packet { + private byte[] encryptedKey; + + public S2CMessageMiniservKey(byte[] key) { + encryptedKey = key; + } + + public S2CMessageMiniservKey(FriendlyByteBuf buf) { + super(buf); + encryptedKey = BufferUtils.readBytes(buf); + } + + @Override + public void write(FriendlyByteBuf buf) { + BufferUtils.writeBytes(buf, encryptedKey); + } + + @Override + public void handle(NetworkEvent.Context ctx) { + if (checkClient(ctx)) { + if (Client.getInstance().decryptKey(encryptedKey)) { + Log.info("Successfully received and decrypted key, starting miniserv client..."); + if (WebDisplays.PROXY instanceof ClientProxy proxy) { + proxy.startMiniservClient(); + } + } + + ctx.setPacketHandled(true); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageOpenGui.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageOpenGui.java new file mode 100644 index 0000000..de1fb9b --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageOpenGui.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.client_bound; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.data.GuiData; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.utilities.Log; + +public class S2CMessageOpenGui extends Packet { + private GuiData data; + + public S2CMessageOpenGui(GuiData data) { + this.data = data; + } + + public S2CMessageOpenGui(FriendlyByteBuf buf) { + super(buf); + + String name = buf.readUtf(); + data = GuiData.read(name, buf); + Class cls = GuiData.classOf(name); + + if (cls == null) { + Log.error("Could not create GuiData of type %s because it doesn't exist!", name); + } + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeUtf(data.getName()); + data.serialize(buf); + } + + public void handle(NetworkEvent.Context context) { + context.enqueueWork(() -> WebDisplays.PROXY.displayGui(data)); + context.setPacketHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageScreenUpdate.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java similarity index 76% rename from src/main/java/net/montoyo/wd/net/client/CMessageScreenUpdate.java rename to src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java index c9e05d7..f5b55a6 100644 --- a/src/main/java/net/montoyo/wd/net/client/CMessageScreenUpdate.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java @@ -2,7 +2,7 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.net.client; +package net.montoyo.wd.net.client_bound; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; @@ -13,16 +13,15 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.*; import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; -import java.util.function.Supplier; - -public class CMessageScreenUpdate { +// TODO: use registry based approach +public class S2CMessageScreenUpdate extends Packet { public static final int UPDATE_URL = 0; public static final int UPDATE_RESOLUTION = 1; public static final int UPDATE_DELETE = 2; @@ -51,12 +50,12 @@ public class CMessageScreenUpdate { private NameUUIDPair owner; private Rotation rotation; private boolean autoVolume; - - public CMessageScreenUpdate() { + + public S2CMessageScreenUpdate() { } - public static CMessageScreenUpdate setURL(TileEntityScreen tes, BlockSide side, String url) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate setURL(TileEntityScreen tes, BlockSide side, String url) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_URL; @@ -65,8 +64,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate setResolution(TileEntityScreen tes, BlockSide side, Vector2i res) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate setResolution(TileEntityScreen tes, BlockSide side, Vector2i res) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_RESOLUTION; @@ -75,8 +74,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate click(TileEntityScreen tes, BlockSide side, int mouseEvent, @Nullable Vector2i pos) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate click(TileEntityScreen tes, BlockSide side, int mouseEvent, @Nullable Vector2i pos) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_MOUSE; @@ -86,14 +85,14 @@ public class CMessageScreenUpdate { return ret; } - public CMessageScreenUpdate(TileEntityScreen tes, BlockSide side) { + public S2CMessageScreenUpdate(TileEntityScreen tes, BlockSide side) { pos = new Vector3i(tes.getBlockPos()); this.side = side; action = UPDATE_DELETE; } - public static CMessageScreenUpdate type(TileEntityScreen tes, BlockSide side, String text) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate type(TileEntityScreen tes, BlockSide side, String text) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.string = text; @@ -102,8 +101,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate js(TileEntityScreen tes, BlockSide side, String code) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate js(TileEntityScreen tes, BlockSide side, String code) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.string = code; @@ -112,8 +111,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate upgrade(TileEntityScreen tes, BlockSide side) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate upgrade(TileEntityScreen tes, BlockSide side) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_UPGRADES; @@ -127,8 +126,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate jsRedstone(TileEntityScreen tes, BlockSide side, Vector2i vec, int level) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate jsRedstone(TileEntityScreen tes, BlockSide side, Vector2i vec, int level) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_JS_REDSTONE; @@ -138,8 +137,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate owner(TileEntityScreen tes, BlockSide side, NameUUIDPair owner) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate owner(TileEntityScreen tes, BlockSide side, NameUUIDPair owner) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_OWNER; @@ -148,8 +147,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate rotation(TileEntityScreen tes, BlockSide side, Rotation rot) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate rotation(TileEntityScreen tes, BlockSide side, Rotation rot) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_ROTATION; @@ -158,8 +157,8 @@ public class CMessageScreenUpdate { return ret; } - public static CMessageScreenUpdate autoVolume(TileEntityScreen tes, BlockSide side, boolean av) { - CMessageScreenUpdate ret = new CMessageScreenUpdate(); + public static S2CMessageScreenUpdate autoVolume(TileEntityScreen tes, BlockSide side, boolean av) { + S2CMessageScreenUpdate ret = new S2CMessageScreenUpdate(); ret.pos = new Vector3i(tes.getBlockPos()); ret.side = side; ret.action = UPDATE_AUTO_VOL; @@ -167,13 +166,15 @@ public class CMessageScreenUpdate { return ret; } - - public static CMessageScreenUpdate decode(FriendlyByteBuf buf) { + + public S2CMessageScreenUpdate(FriendlyByteBuf buf) { + super(buf); + Vector3i pos = new Vector3i(buf); BlockSide side = BlockSide.values()[buf.readByte()]; byte action = buf.readByte(); - CMessageScreenUpdate message = new CMessageScreenUpdate(); + S2CMessageScreenUpdate message = this; message.pos = pos; message.side = side; message.action = action; @@ -199,12 +200,10 @@ public class CMessageScreenUpdate { case UPDATE_ROTATION -> message.rotation = Rotation.values()[buf.readByte() & 3]; case UPDATE_AUTO_VOL -> message.autoVolume = buf.readBoolean(); } - - return message; } - - - public CMessageScreenUpdate encode(FriendlyByteBuf buf) { + + @Override + public void write(FriendlyByteBuf buf) { pos.writeTo(buf); buf.writeByte(side.ordinal()); buf.writeByte(action); @@ -232,12 +231,11 @@ public class CMessageScreenUpdate { buf.writeByte(rotation.ordinal()); else if(action == UPDATE_AUTO_VOL) buf.writeBoolean(autoVolume); - return new CMessageScreenUpdate(); } - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - BlockGetter level = WebDisplays.PROXY.getWorld(contextSupplier.get()); + public void handle(NetworkEvent.Context ctx) { + ctx.enqueueWork(() -> { + BlockGetter level = WebDisplays.PROXY.getWorld(ctx); if (level instanceof Level level1) // ensure that the TE exists level1.setBlock( @@ -278,6 +276,6 @@ public class CMessageScreenUpdate { } }); - contextSupplier.get().setPacketHandled(true); + ctx.setPacketHandled(true); } } diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageServerInfo.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageServerInfo.java new file mode 100644 index 0000000..c31ebe3 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageServerInfo.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.client_bound; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect; + +public class S2CMessageServerInfo extends Packet { + + private int miniservPort; + + public S2CMessageServerInfo(int msPort) { + miniservPort = msPort; + } + + public S2CMessageServerInfo(FriendlyByteBuf buf) { + super(buf); + miniservPort = buf.readShort(); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeShort(miniservPort); + } + + @Override + public void handle(NetworkEvent.Context ctx) { + if (checkClient(ctx)) { + try { + WebDisplays.PROXY.setMiniservClientPort(miniservPort); + C2SMessageMiniservConnect message = Client.getInstance().beginConnection(); + respondLater(ctx, message); + ctx.setPacketHandled(true); + } catch (Throwable err) { + err.printStackTrace(); + throw new RuntimeException(err); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageACQuery.java b/src/main/java/net/montoyo/wd/net/server/SMessageACQuery.java deleted file mode 100644 index b021478..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageACQuery.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.server; - -import com.mojang.authlib.GameProfile; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageACResult; -import net.montoyo.wd.utilities.NameUUIDPair; - -import java.util.Arrays; -import java.util.function.Supplier; - -public class SMessageACQuery implements Runnable { - - private ServerPlayer player; - private String beginning; - private boolean matchExact; - - public SMessageACQuery(String beg, boolean exact) { - beginning = beg; - matchExact = exact; - } - - public static SMessageACQuery decode(FriendlyByteBuf buf) { - return new SMessageACQuery(buf.readUtf(), buf.readBoolean()); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(beginning); - buf.writeBoolean(matchExact); - } - - @Override - public void run() { - GameProfile[] profiles = WebDisplays.PROXY.getOnlineGameProfiles(); - NameUUIDPair[] result; - - if(matchExact) - result = Arrays.stream(profiles).filter(gp -> gp.getName().equalsIgnoreCase(beginning)).map(NameUUIDPair::new).toArray(NameUUIDPair[]::new); - else { - final String lBeg = beginning.toLowerCase(); - result = Arrays.stream(profiles).filter(gp -> gp.getName().toLowerCase().startsWith(lBeg)).map(NameUUIDPair::new).toArray(NameUUIDPair[]::new); - } - - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new CMessageACResult(result)); - } - - public void handle(Supplier contextSupplier) { - player = contextSupplier.get().getSender(); - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); - } - -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java b/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java deleted file mode 100644 index 3de051c..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.montoyo.wd.net.server; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; -import net.montoyo.wd.net.Messages; - -import java.util.Objects; -import java.util.function.Supplier; - -public class SMessageGetUrl { - String url; - - public SMessageGetUrl() { - } - - public SMessageGetUrl(String url) { - this.url = url; - } - - public static SMessageGetUrl decode(FriendlyByteBuf buf) { - SMessageGetUrl message = new SMessageGetUrl(); - message.url = buf.readUtf(); - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(url); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - if(Objects.requireNonNull(contextSupplier.get().getSender()).connection.getConnection().isConnected()) { - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> contextSupplier.get().getSender()), new URLMessage(url)); - } - Messages.INSTANCE.send(PacketDistributor.ALL.noArg(), new URLMessage(url)); - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageMiniservConnect.java b/src/main/java/net/montoyo/wd/net/server/SMessageMiniservConnect.java deleted file mode 100644 index 864a1ee..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageMiniservConnect.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.server; - -import net.minecraft.client.Minecraft; -import net.minecraft.core.Direction; -import net.minecraft.network.Connection; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.PacketFlow; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.miniserv.server.ClientManager; -import net.montoyo.wd.miniserv.server.Server; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageMiniservKey; - -import java.util.Objects; -import java.util.function.Supplier; - -public class SMessageMiniservConnect { - - private byte[] modulus; - private byte[] exponent; - - public SMessageMiniservConnect() { - } - - public SMessageMiniservConnect(byte[] mod, byte[] exp) { - modulus = mod; - exponent = exp; - } - - public static SMessageMiniservConnect decode(FriendlyByteBuf buf) { - int sz = buf.readShort() & 0xFFFF; - byte[] modulus = new byte[sz]; - buf.readBytes(modulus); - - sz = buf.readShort() & 0xFFFF; - byte[] exponent = new byte[sz]; - buf.readBytes(exponent); - - return new SMessageMiniservConnect(modulus, exponent); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeShort(modulus.length); - buf.writeBytes(modulus); - buf.writeShort(exponent.length); - buf.writeBytes(exponent); - } - - public void handle(Supplier contextSupplier) { - ClientManager cliMgr = Server.getInstance().getClientManager(); - byte[] encKey = cliMgr.encryptClientKey(Objects.requireNonNull(contextSupplier.get().getSender()).getGameProfile().getId(), modulus, exponent); - - if (encKey != null) { - Messages.INSTANCE.sendTo(new CMessageMiniservKey(encKey), new Connection(PacketFlow.SERVERBOUND), NetworkDirection.LOGIN_TO_SERVER); - } - - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java b/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java deleted file mode 100644 index 09cf3ff..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.server; - -import net.minecraft.core.NonNullList; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.WebDisplays; -import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.ItemInit; - -import java.io.IOException; -import java.util.function.Supplier; - -public class SMessagePadCtrl implements Runnable { - - private int id; - private String url; - private ServerPlayer player; - - public SMessagePadCtrl() { - } - - public SMessagePadCtrl(String url) { - id = -1; - this.url = url; - } - - public SMessagePadCtrl(int id, String url) { - this.id = id; - this.url = url; - } - - private boolean matchesMinePadID(ItemStack is) { - return is.getItem() == ItemInit.itemMinePad.get() && is.getTag() != null && is.getTag().contains("PadID") && is.getTag().getInt("PadID") == id; - } - - @Override - public void run() { - if(id < 0) { - ItemStack is = player.getItemInHand(InteractionHand.MAIN_HAND); - - if(is.getItem() == ItemInit.itemMinePad.get()) { - if(url.isEmpty()) - is.setTag(null); //Shutdown - else { - if(is.getTag() == null) - is.setTag(new CompoundTag()); - - if(!is.getTag().contains("PadID")) - is.getTag().putInt("PadID", WebDisplays.getNextAvailablePadID()); - - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } - is.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); - } - } - } else { - NonNullList inv = player.getInventory().items; - ItemStack target = null; - - for(int i = 0; i < 9; i++) { - if(matchesMinePadID(inv.get(i))) { - target = inv.get(i); - break; - } - } - - if(target == null && matchesMinePadID(player.getInventory().offhand.get(0))) - target = player.getInventory().offhand.get(0); - - if(target != null) { - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } - target.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); - } - } - } - - public static SMessagePadCtrl decode(FriendlyByteBuf buf) { - SMessagePadCtrl message = new SMessagePadCtrl(); - message.id = buf.readInt(); - message.url = buf.readUtf(); - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeInt(id); - buf.writeUtf(url); - } - - public void handle(Supplier contextSupplier) { - player = contextSupplier.get().getSender(); - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); - } - -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageRequestTEData.java b/src/main/java/net/montoyo/wd/net/server/SMessageRequestTEData.java deleted file mode 100644 index 5a9888a..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageRequestTEData.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2019 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.server; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.utilities.Log; -import net.montoyo.wd.utilities.Vector3i; - -import java.util.function.Supplier; - -public class SMessageRequestTEData implements Runnable { - - private ResourceLocation dim; - private Vector3i pos; - private ServerPlayer player; - - public SMessageRequestTEData() { - } - - public SMessageRequestTEData(BlockEntity te) { - dim = te.getLevel().dimension().location(); - pos = new Vector3i(te.getBlockPos()); - } - - public SMessageRequestTEData(ResourceLocation dim, Vector3i pos) { - this.dim = dim; - this.pos = pos; - } - - public static SMessageRequestTEData decode(FriendlyByteBuf buf) { - return new SMessageRequestTEData(buf.readResourceLocation(), new Vector3i(buf)); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeResourceLocation(dim); - pos.writeTo(buf); - } - - @Override - public void run() { - if(!player.level.dimension().location().equals(dim)) - return; - - BlockPos bp = pos.toBlock(); - if(player.distanceToSqr(bp.getX(), bp.getY(), bp.getZ()) > 512.0 * 512.0) - return; - - BlockEntity te = player.level.getBlockEntity(bp); - if(te == null) { - Log.error("MesageRequestTEData: Can't request data of null tile entity at %s", pos.toString()); - return; - } - - if(te instanceof TileEntityScreen) - ((TileEntityScreen) te).requestData(player); - } - - public void handle(Supplier contextSupplier) { - player = contextSupplier.get().getSender(); - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageScreenCtrl.java b/src/main/java/net/montoyo/wd/net/server/SMessageScreenCtrl.java deleted file mode 100644 index 4fcad1d..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageScreenCtrl.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (C) 2018 BARBOTIN Nicolas - */ - -package net.montoyo.wd.net.server; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.ForgeMod; -import net.minecraftforge.network.NetworkEvent; -import net.montoyo.wd.block.BlockPeripheral; -import net.montoyo.wd.core.DefaultPeripheral; -import net.montoyo.wd.core.JSServerRequest; -import net.montoyo.wd.core.MissingPermissionException; -import net.montoyo.wd.core.ScreenRights; -import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.init.BlockInit; -import net.montoyo.wd.init.ItemInit; -import net.montoyo.wd.utilities.*; - -import java.io.IOException; -import java.util.function.Supplier; - -public class SMessageScreenCtrl implements Runnable { - - public static final int CTRL_SET_URL = 0; - public static final int CTRL_SHUT_DOWN = 1; - public static final int CTRL_ADD_FRIEND = 2; - public static final int CTRL_REMOVE_FRIEND = 3; - public static final int CTRL_SET_RIGHTS = 4; - public static final int CTRL_SET_RESOLUTION = 5; - public static final int CTRL_TYPE = 6; - public static final int CTRL_REMOVE_UPGRADE = 7; - public static final int CTRL_LASER_DOWN = 8; - public static final int CTRL_LASER_MOVE = 9; - public static final int CTRL_LASER_UP = 10; - public static final int CTRL_JS_REQUEST = 11; - public static final int CTRL_SET_ROTATION = 12; - public static final int CTRL_SET_URL_REMOTE = 13; - public static final int CTRL_SET_AUTO_VOL = 14; - - private int ctrl; - private ResourceLocation dim; - private Vector3i pos; - private BlockSide side; - private String url; - private NameUUIDPair friend; - private ServerPlayer player; - private int friendRights; - private int otherRights; - private Vector2i vec2i; - private String text; - private BlockPos soundPos; - private ItemStack toRemove; - private int jsReqID; - private JSServerRequest jsReqType; - private Object[] jsReqData; - private Rotation rotation; - private Vector3i remoteLoc; - private boolean autoVol; - - public SMessageScreenCtrl() { - } - - public static SMessageScreenCtrl setURL(TileEntityScreen tes, BlockSide side, String url, Vector3i remoteLocation) { - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = (remoteLocation == null) ? CTRL_SET_URL : CTRL_SET_URL_REMOTE; - ret.dim = tes.getLevel().dimension().location(); - ret.pos = new Vector3i(tes.getBlockPos()); - ret.side = side; - ret.url = url; - - if(remoteLocation != null) - ret.remoteLoc = remoteLocation; - - return ret; - } - - public SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, NameUUIDPair friend, boolean del) { - ctrl = del ? CTRL_REMOVE_FRIEND : CTRL_ADD_FRIEND; - dim = tes.getLevel().dimension().location(); - pos = new Vector3i(tes.getBlockPos()); - this.side = side; - this.friend = friend; - } - - public SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, int fr, int or) { - ctrl = CTRL_SET_RIGHTS; - dim = tes.getLevel().dimension().location(); - pos = new Vector3i(tes.getBlockPos()); - this.side = side; - friendRights = fr; - otherRights = or; - } - - public SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, ItemStack toRem) { - ctrl = CTRL_REMOVE_UPGRADE; - dim = tes.getLevel().dimension().location(); - pos = new Vector3i(tes.getBlockPos()); - this.side = side; - toRemove = toRem; - } - - public SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, Rotation rot) { - ctrl = CTRL_SET_ROTATION; - dim = tes.getLevel().dimension().location(); - pos = new Vector3i(tes.getBlockPos()); - this.side = side; - rotation = rot; - } - - public static SMessageScreenCtrl type(TileEntityScreen tes, BlockSide side, String text, BlockPos soundPos) { - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = CTRL_TYPE; - ret.pos = new Vector3i(tes.getBlockPos()); - ret.dim = tes.getLevel().dimension().location(); - ret.side = side; - ret.text = text; - ret.soundPos = soundPos; - - return ret; - } - - public static SMessageScreenCtrl vec2(TileEntityScreen tes, BlockSide side, int ctrl, Vector2i vec) { - if(!isVec2Ctrl(ctrl)) - throw new RuntimeException("Called SMessageScreenCtrl.vec2() with non-vec2 control message " + ctrl); - - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = ctrl; - ret.pos = new Vector3i(tes.getBlockPos()); - ret.dim = tes.getLevel().dimension().location(); - ret.side = side; - ret.vec2i = vec; - - return ret; - } - - public static SMessageScreenCtrl laserUp(TileEntityScreen tes, BlockSide side) { - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = CTRL_LASER_UP; - ret.pos = new Vector3i(tes.getBlockPos()); - ret.dim = tes.getLevel().dimension().location(); - ret.side = side; - - return ret; - } - - public static SMessageScreenCtrl jsRequest(TileEntityScreen tes, BlockSide side, int reqId, JSServerRequest reqType, Object ... data) { - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = CTRL_JS_REQUEST; - ret.pos = new Vector3i(tes.getBlockPos()); - ret.dim = tes.getLevel().dimension().location(); - ret.side = side; - ret.jsReqID = reqId; - ret.jsReqType = reqType; - ret.jsReqData = data; - - return ret; - } - - public static SMessageScreenCtrl autoVol(TileEntityScreen tes, BlockSide side, boolean av) { - SMessageScreenCtrl ret = new SMessageScreenCtrl(); - ret.ctrl = CTRL_SET_AUTO_VOL; - ret.pos = new Vector3i(tes.getBlockPos()); - ret.dim = tes.getLevel().dimension().location(); - ret.side = side; - ret.autoVol = av; - - return ret; - } - - private static boolean isVec2Ctrl(int msg) { - return msg == CTRL_SET_RESOLUTION || msg == CTRL_LASER_DOWN || msg == CTRL_LASER_MOVE; - } - - public static SMessageScreenCtrl decode(FriendlyByteBuf buf) { - SMessageScreenCtrl message = new SMessageScreenCtrl(); - message.ctrl = buf.readByte(); - message.dim = buf.readResourceLocation(); - message.pos = new Vector3i(buf); - message.side = BlockSide.fromInt(buf.readByte()); - - if(message.ctrl == CTRL_SET_URL) - message.url = buf.readUtf(); - else if(message.ctrl == CTRL_ADD_FRIEND || message.ctrl == CTRL_REMOVE_FRIEND) - message.friend = new NameUUIDPair(buf); - else if(message.ctrl == CTRL_SET_RIGHTS) { - message.friendRights = buf.readByte(); - message.otherRights = buf.readByte(); - } else if(isVec2Ctrl(message.ctrl)) - message.vec2i = new Vector2i(buf); - else if(message.ctrl == CTRL_TYPE) { - message.text = buf.readUtf(); - - int sx = buf.readInt(); - int sy = buf.readInt(); - int sz = buf.readInt(); - message.soundPos = new BlockPos(sx, sy, sz); - } else if(message.ctrl == CTRL_REMOVE_UPGRADE) - message.toRemove = buf.readItem(); - else if(message.ctrl == CTRL_JS_REQUEST) { - message.jsReqID = buf.readInt(); - message.jsReqType = JSServerRequest.fromID(buf.readByte()); - - if(message.jsReqType != null) - message.jsReqData = message.jsReqType.deserialize(buf); - } else if(message.ctrl == CTRL_SET_ROTATION) - message.rotation = Rotation.values()[buf.readByte() & 3]; - else if(message.ctrl == CTRL_SET_URL_REMOTE) { - message.url = buf.readUtf(); - message.remoteLoc = new Vector3i(buf); - } else if(message.ctrl == CTRL_SET_AUTO_VOL) - message.autoVol = buf.readBoolean(); - - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeByte(ctrl); - buf.writeResourceLocation(dim); - pos.writeTo(buf); - buf.writeByte(side.ordinal()); - - if(ctrl == CTRL_SET_URL) - buf.writeUtf(url); - else if(ctrl == CTRL_ADD_FRIEND || ctrl == CTRL_REMOVE_FRIEND) - friend.writeTo(buf); - else if(ctrl == CTRL_SET_RIGHTS) { - buf.writeByte(friendRights); - buf.writeByte(otherRights); - } else if(isVec2Ctrl(ctrl)) - vec2i.writeTo(buf); - else if(ctrl == CTRL_TYPE) { - buf.writeUtf(text); - buf.writeInt(soundPos.getX()); - buf.writeInt(soundPos.getY()); - buf.writeInt(soundPos.getZ()); - } else if(ctrl == CTRL_REMOVE_UPGRADE) - buf.writeItem(toRemove); - else if(ctrl == CTRL_JS_REQUEST) { - buf.writeInt(jsReqID); - buf.writeByte(jsReqType.ordinal()); - - if(!jsReqType.serialize(buf, jsReqData)) - throw new RuntimeException("Could not serialize CTRL_JS_REQUEST " + jsReqType); - } else if(ctrl == CTRL_SET_ROTATION) - buf.writeByte(rotation.ordinal()); - else if(ctrl == CTRL_SET_URL_REMOTE) { - buf.writeUtf(url); - remoteLoc.writeTo(buf); - } else if(ctrl == CTRL_SET_AUTO_VOL) - buf.writeBoolean(autoVol); - } - - @Override - public void run() { - if(side == null) { - Log.warning("Caught invalid packet from %s (UUID %s) referencing an invalid block side", player.getName(), player.getGameProfile().getId().toString()); - return; - } - - try { - runUnsafe(); - } catch(MissingPermissionException e) { - Log.errorEx("I have reasons to believe %s (UUID %s) is a hacker, but don't take my word for it...", e, e.getPlayer().getName(), e.getPlayer().getGameProfile().getId().toString()); - } - } - - private void checkPermission(TileEntityScreen scr, int right) throws MissingPermissionException { - int prights = scr.getScreen(side).rightsFor(player); - if((prights & right) == 0) - throw new MissingPermissionException(right, player); - } - - private void runUnsafe() throws MissingPermissionException { - Level world = player.level; - BlockPos bp = pos.toBlock(); - - if(!world.dimension().location().equals(dim)) - return; //Out of range (dimension mismatch) - - if(ctrl == CTRL_SET_URL_REMOTE) { - double reachDist = player.getAttributeValue(ForgeMod.REACH_DISTANCE.get()); - BlockPos blockPos = remoteLoc.toBlock(); - - if(player.distanceToSqr(blockPos.getX(), blockPos.getY(), blockPos.getZ()) > reachDist * reachDist) - return; //Out of range (player reach distance) - - BlockState bs = world.getBlockState(blockPos); - if(bs.getBlock() != BlockInit.blockServer.get() && bs.getBlock() != BlockInit.blockRControl.get() && - bs.getBlock() != BlockInit.blockKeyBoard.get() && bs.getBlock() != BlockInit.blockRedControl.get() - && bs.getValue(BlockPeripheral.type) != DefaultPeripheral.REMOTE_CONTROLLER) - return; //I call it hax... - } else if(player.distanceToSqr(bp.getX(), bp.getY(), bp.getZ()) > (128 * 128)) - return; //Out of range (range problem) - - BlockEntity te = world.getBlockEntity(bp); - if(te == null || !(te instanceof TileEntityScreen)) { - Log.error("TileEntity at %s is not a screen; can't control it!", pos.toString()); - return; - } - - TileEntityScreen tes = (TileEntityScreen) te; - - if(ctrl == CTRL_SET_URL || ctrl == CTRL_SET_URL_REMOTE) { - checkPermission(tes, ScreenRights.CHANGE_URL); - try { - tes.setScreenURL(side, url); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else if(ctrl == CTRL_SHUT_DOWN) { - //TODO - //checkPermission(tes, ScreenRights.CHANGE_URL); - //tes.removeScreen(side); - } else if(ctrl == CTRL_ADD_FRIEND) { - checkPermission(tes, ScreenRights.MANAGE_FRIEND_LIST); - tes.addFriend(player, side, friend); - } else if(ctrl == CTRL_REMOVE_FRIEND) { - checkPermission(tes, ScreenRights.MANAGE_FRIEND_LIST); - tes.removeFriend(player, side, friend); - } else if(ctrl == CTRL_SET_RIGHTS) { - TileEntityScreen.Screen scr = tes.getScreen(side); - - if(scr != null) { - int fr = scr.owner.uuid.equals(player.getGameProfile().getId()) ? friendRights : scr.friendRights; - int or = (scr.rightsFor(player) & ScreenRights.MANAGE_OTHER_RIGHTS) == 0 ? scr.otherRights : otherRights; - - if(scr.friendRights != fr || scr.otherRights != or) - tes.setRights(player, side, fr, or); - } - } else if(ctrl == CTRL_SET_RESOLUTION) { - checkPermission(tes, ScreenRights.CHANGE_RESOLUTION); - tes.setResolution(side, vec2i); - } else if(ctrl == CTRL_TYPE) { - checkPermission(tes, ScreenRights.CLICK); - tes.type(side, text, soundPos); - } else if(ctrl == CTRL_REMOVE_UPGRADE) { - checkPermission(tes, ScreenRights.MANAGE_UPGRADES); - tes.removeUpgrade(side, toRemove, player); - } else if(ctrl == CTRL_LASER_DOWN || ctrl == CTRL_LASER_MOVE) - tes.laserDownMove(side, player, vec2i, ctrl == CTRL_LASER_DOWN); - else if(ctrl == CTRL_LASER_UP) - tes.laserUp(side, player); - else if(ctrl == CTRL_JS_REQUEST) { - if(jsReqType == null || jsReqData == null) - Log.warning("Caught invalid JS request from player %s (UUID %s)", player.getName(), player.getGameProfile().getId().toString()); - else - tes.handleJSRequest(player, side, jsReqID, jsReqType, jsReqData); - } else if(ctrl == CTRL_SET_ROTATION) { - checkPermission(tes, ScreenRights.CHANGE_RESOLUTION); - tes.setRotation(side, rotation); - } else if(ctrl == CTRL_SET_AUTO_VOL) { - checkPermission(tes, ScreenRights.MANAGE_UPGRADES); //because why not - tes.setAutoVolume(side, autoVol); - } else - Log.warning("Caught SMessageScreenCtrl with invalid control ID %d from player %s (UUID %s)", ctrl, player.getName(), player.getGameProfile().getId().toString()); - } - - public void handle(Supplier contextSupplier) { - player = contextSupplier.get().getSender(); - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); - } - -} diff --git a/src/main/java/net/montoyo/wd/net/server/URLMessage.java b/src/main/java/net/montoyo/wd/net/server/URLMessage.java deleted file mode 100644 index a3a86ca..0000000 --- a/src/main/java/net/montoyo/wd/net/server/URLMessage.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.montoyo.wd.net.server; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; - -public class URLMessage { - - private String url; - - public URLMessage() {} - - public URLMessage(String url) { - this.url = url; - } - - public String getURL() { - return url; - } - - public static URLMessage decode(FriendlyByteBuf buf) { - URLMessage message = new URLMessage(); - message.url = buf.readUtf(); - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(url); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().setPacketHandled(true); - } - } \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java new file mode 100644 index 0000000..197b6f3 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageACQuery.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.server_bound; + +import com.mojang.authlib.GameProfile; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.PacketDistributor; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.client_bound.S2CMessageACResult; +import net.montoyo.wd.utilities.NameUUIDPair; + +import java.util.Arrays; + +public class C2SMessageACQuery extends Packet implements Runnable { + + private ServerPlayer player; + private String beginning; + private boolean matchExact; + + public C2SMessageACQuery(String beg, boolean exact) { + beginning = beg; + matchExact = exact; + } + + public C2SMessageACQuery(FriendlyByteBuf buf) { + super(buf); + beginning = buf.readUtf(); + matchExact = buf.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeUtf(beginning); + buf.writeBoolean(matchExact); + } + + @Override + public void run() { + GameProfile[] profiles = WebDisplays.PROXY.getOnlineGameProfiles(); + NameUUIDPair[] result; + + if (matchExact) + result = Arrays.stream(profiles).filter(gp -> gp.getName().equalsIgnoreCase(beginning)).map(NameUUIDPair::new).toArray(NameUUIDPair[]::new); + else { + final String lBeg = beginning.toLowerCase(); + result = Arrays.stream(profiles).filter(gp -> gp.getName().toLowerCase().startsWith(lBeg)).map(NameUUIDPair::new).toArray(NameUUIDPair[]::new); + } + + WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageACResult(result)); + } + + public void handle(NetworkEvent.Context ctx) { + player = ctx.getSender(); + ctx.enqueueWork(this); + ctx.setPacketHandled(true); + } + +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageMiniservConnect.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageMiniservConnect.java new file mode 100644 index 0000000..0ff4d3a --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageMiniservConnect.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.server_bound; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.miniserv.server.ClientManager; +import net.montoyo.wd.miniserv.server.Server; +import net.montoyo.wd.net.BufferUtils; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.net.client_bound.S2CMessageMiniservKey; + +import java.util.Objects; + +public class C2SMessageMiniservConnect extends Packet { + private byte[] modulus; + private byte[] exponent; + + public C2SMessageMiniservConnect(byte[] mod, byte[] exp) { + modulus = mod; + exponent = exp; + } + + public C2SMessageMiniservConnect(FriendlyByteBuf buf) { + super(buf); + + modulus = BufferUtils.readBytes(buf); + exponent = BufferUtils.readBytes(buf); + } + + @Override + public void write(FriendlyByteBuf buf) { + BufferUtils.writeBytes(buf, modulus); + BufferUtils.writeBytes(buf, exponent); + } + + @Override + public void handle(NetworkEvent.Context ctx) { + if (checkServer(ctx)) { + try { + ClientManager cliMgr = Server.getInstance().getClientManager(); + byte[] encKey = cliMgr.encryptClientKey(Objects.requireNonNull(ctx.getSender()).getGameProfile().getId(), modulus, exponent); + + if (encKey != null) { + respond(ctx, new S2CMessageMiniservKey(encKey)); + } + + ctx.setPacketHandled(true); + } catch (Throwable err) { + err.printStackTrace(); + throw new RuntimeException(err); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageRedstoneCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java similarity index 63% rename from src/main/java/net/montoyo/wd/net/server/SMessageRedstoneCtrl.java rename to src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java index 2b5c0db..40f19e1 100644 --- a/src/main/java/net/montoyo/wd/net/server/SMessageRedstoneCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageRedstoneCtrl.java @@ -2,11 +2,10 @@ * Copyright (C) 2018 BARBOTIN Nicolas */ -package net.montoyo.wd.net.server; +package net.montoyo.wd.net.server_bound; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -15,36 +14,39 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.entity.TileEntityRedCtrl; import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.Packet; import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Vector3i; -import java.util.function.Supplier; - -public class SMessageRedstoneCtrl implements Runnable { - +public class C2SMessageRedstoneCtrl extends Packet implements Runnable { private Player player; - private ResourceLocation dimension; private Vector3i pos; private String risingEdgeURL; private String fallingEdgeURL; - public SMessageRedstoneCtrl() { + public C2SMessageRedstoneCtrl() { } - public SMessageRedstoneCtrl(ResourceLocation d, Vector3i p, String r, String f) { - dimension = d; + public C2SMessageRedstoneCtrl(Vector3i p, String r, String f) { pos = p; risingEdgeURL = r; fallingEdgeURL = f; } - + + public C2SMessageRedstoneCtrl(FriendlyByteBuf buf) { + super(buf); + pos = new Vector3i(buf); + risingEdgeURL = buf.readUtf(); + fallingEdgeURL = buf.readUtf(); + } + @Override public void run() { Level world = player.level; BlockPos blockPos = pos.toBlock(); final double maxRange = player.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue(); - if(!world.dimension().location().equals(dimension) || player.distanceToSqr(blockPos.getX(), blockPos.getY(), blockPos.getZ()) > maxRange * maxRange) + if(player.distanceToSqr(blockPos.getX(), blockPos.getY(), blockPos.getZ()) > maxRange * maxRange) return; BlockEntity te = world.getBlockEntity(blockPos); @@ -67,20 +69,16 @@ public class SMessageRedstoneCtrl implements Runnable { redCtrl.setURLs(risingEdgeURL, fallingEdgeURL); } - public static SMessageRedstoneCtrl decode(FriendlyByteBuf buf) { - return new SMessageRedstoneCtrl(buf.readResourceLocation(), new Vector3i(buf), buf.readUtf(), buf.readUtf()); - } - - public void encode(FriendlyByteBuf buf) { - buf.writeResourceLocation(dimension); + @Override + public void write(FriendlyByteBuf buf) { pos.writeTo(buf); buf.writeUtf(risingEdgeURL); buf.writeUtf(fallingEdgeURL); } - - public void handle(Supplier contextSupplier) { - player = contextSupplier.get().getSender(); - contextSupplier.get().enqueueWork(this); - contextSupplier.get().setPacketHandled(true); + + public void handle(NetworkEvent.Context ctx) { + player = ctx.getSender(); + ctx.enqueueWork(this); + ctx.setPacketHandled(true); } -} +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java new file mode 100644 index 0000000..6cc578b --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.net.server_bound; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.block.BlockPeripheral; +import net.montoyo.wd.core.DefaultPeripheral; +import net.montoyo.wd.core.JSServerRequest; +import net.montoyo.wd.core.MissingPermissionException; +import net.montoyo.wd.core.ScreenRights; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.init.BlockInit; +import net.montoyo.wd.net.Packet; +import net.montoyo.wd.utilities.*; + +import java.io.IOException; + +// TODO: this is a mess; a registry based approach would likely be more readable +public class C2SMessageScreenCtrl extends Packet implements Runnable { + public static final int CTRL_SET_URL = 0; + public static final int CTRL_SHUT_DOWN = 1; + public static final int CTRL_ADD_FRIEND = 2; + public static final int CTRL_REMOVE_FRIEND = 3; + public static final int CTRL_SET_RIGHTS = 4; + public static final int CTRL_SET_RESOLUTION = 5; + public static final int CTRL_TYPE = 6; + public static final int CTRL_REMOVE_UPGRADE = 7; + public static final int CTRL_LASER_DOWN = 8; + public static final int CTRL_LASER_MOVE = 9; + public static final int CTRL_LASER_UP = 10; + public static final int CTRL_JS_REQUEST = 11; + public static final int CTRL_SET_ROTATION = 12; + public static final int CTRL_SET_URL_REMOTE = 13; + public static final int CTRL_SET_AUTO_VOL = 14; + + private int ctrl; + private ResourceLocation dim; + private Vector3i pos; + private BlockSide side; + private String url; + private NameUUIDPair friend; + private ServerPlayer player; + private int friendRights; + private int otherRights; + private Vector2i vec2i; + private String text; + private BlockPos soundPos; + private ItemStack toRemove; + private int jsReqID; + private JSServerRequest jsReqType; + private Object[] jsReqData; + private Rotation rotation; + private Vector3i remoteLoc; + private boolean autoVol; + + public C2SMessageScreenCtrl() { + } + + public static C2SMessageScreenCtrl setURL(TileEntityScreen tes, BlockSide side, String url, Vector3i remoteLocation) { + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = (remoteLocation == null) ? CTRL_SET_URL : CTRL_SET_URL_REMOTE; + ret.dim = tes.getLevel().dimension().location(); + ret.pos = new Vector3i(tes.getBlockPos()); + ret.side = side; + ret.url = url; + + if (remoteLocation != null) + ret.remoteLoc = remoteLocation; + + return ret; + } + + public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, NameUUIDPair friend, boolean del) { + ctrl = del ? CTRL_REMOVE_FRIEND : CTRL_ADD_FRIEND; + dim = tes.getLevel().dimension().location(); + pos = new Vector3i(tes.getBlockPos()); + this.side = side; + this.friend = friend; + } + + public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, int fr, int or) { + ctrl = CTRL_SET_RIGHTS; + dim = tes.getLevel().dimension().location(); + pos = new Vector3i(tes.getBlockPos()); + this.side = side; + friendRights = fr; + otherRights = or; + } + + public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, ItemStack toRem) { + ctrl = CTRL_REMOVE_UPGRADE; + dim = tes.getLevel().dimension().location(); + pos = new Vector3i(tes.getBlockPos()); + this.side = side; + toRemove = toRem; + } + + public C2SMessageScreenCtrl(TileEntityScreen tes, BlockSide side, Rotation rot) { + ctrl = CTRL_SET_ROTATION; + dim = tes.getLevel().dimension().location(); + pos = new Vector3i(tes.getBlockPos()); + this.side = side; + rotation = rot; + } + + public static C2SMessageScreenCtrl type(TileEntityScreen tes, BlockSide side, String text, BlockPos soundPos) { + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = CTRL_TYPE; + ret.pos = new Vector3i(tes.getBlockPos()); + ret.dim = tes.getLevel().dimension().location(); + ret.side = side; + ret.text = text; + ret.soundPos = soundPos; + + return ret; + } + + public static C2SMessageScreenCtrl vec2(TileEntityScreen tes, BlockSide side, int ctrl, Vector2i vec) { + if (!isVec2Ctrl(ctrl)) + throw new RuntimeException("Called SMessageScreenCtrl.vec2() with non-vec2 control message " + ctrl); + + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = ctrl; + ret.pos = new Vector3i(tes.getBlockPos()); + ret.dim = tes.getLevel().dimension().location(); + ret.side = side; + ret.vec2i = vec; + + return ret; + } + + public static C2SMessageScreenCtrl laserUp(TileEntityScreen tes, BlockSide side) { + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = CTRL_LASER_UP; + ret.pos = new Vector3i(tes.getBlockPos()); + ret.dim = tes.getLevel().dimension().location(); + ret.side = side; + + return ret; + } + + public static C2SMessageScreenCtrl jsRequest(TileEntityScreen tes, BlockSide side, int reqId, JSServerRequest reqType, Object... data) { + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = CTRL_JS_REQUEST; + ret.pos = new Vector3i(tes.getBlockPos()); + ret.dim = tes.getLevel().dimension().location(); + ret.side = side; + ret.jsReqID = reqId; + ret.jsReqType = reqType; + ret.jsReqData = data; + + return ret; + } + + public static C2SMessageScreenCtrl autoVol(TileEntityScreen tes, BlockSide side, boolean av) { + C2SMessageScreenCtrl ret = new C2SMessageScreenCtrl(); + ret.ctrl = CTRL_SET_AUTO_VOL; + ret.pos = new Vector3i(tes.getBlockPos()); + ret.dim = tes.getLevel().dimension().location(); + ret.side = side; + ret.autoVol = av; + + return ret; + } + + private static boolean isVec2Ctrl(int msg) { + return msg == CTRL_SET_RESOLUTION || msg == CTRL_LASER_DOWN || msg == CTRL_LASER_MOVE; + } + + public C2SMessageScreenCtrl(FriendlyByteBuf buf) { + super(buf); + decode(buf); + } + + public void decode(FriendlyByteBuf buf) { + C2SMessageScreenCtrl message = this; + message.ctrl = buf.readByte(); + message.dim = buf.readResourceLocation(); + message.pos = new Vector3i(buf); + message.side = BlockSide.fromInt(buf.readByte()); + + if (message.ctrl == CTRL_SET_URL) + message.url = buf.readUtf(); + else if (message.ctrl == CTRL_ADD_FRIEND || message.ctrl == CTRL_REMOVE_FRIEND) + message.friend = new NameUUIDPair(buf); + else if (message.ctrl == CTRL_SET_RIGHTS) { + message.friendRights = buf.readByte(); + message.otherRights = buf.readByte(); + } else if (isVec2Ctrl(message.ctrl)) + message.vec2i = new Vector2i(buf); + else if (message.ctrl == CTRL_TYPE) { + message.text = buf.readUtf(); + + int sx = buf.readInt(); + int sy = buf.readInt(); + int sz = buf.readInt(); + message.soundPos = new BlockPos(sx, sy, sz); + } else if (message.ctrl == CTRL_REMOVE_UPGRADE) + message.toRemove = buf.readItem(); + else if (message.ctrl == CTRL_JS_REQUEST) { + message.jsReqID = buf.readInt(); + message.jsReqType = JSServerRequest.fromID(buf.readByte()); + + if (message.jsReqType != null) + message.jsReqData = message.jsReqType.deserialize(buf); + } else if (message.ctrl == CTRL_SET_ROTATION) + message.rotation = Rotation.values()[buf.readByte() & 3]; + else if (message.ctrl == CTRL_SET_URL_REMOTE) { + message.url = buf.readUtf(); + message.remoteLoc = new Vector3i(buf); + } else if (message.ctrl == CTRL_SET_AUTO_VOL) + message.autoVol = buf.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeByte(ctrl); + buf.writeResourceLocation(dim); + pos.writeTo(buf); + buf.writeByte(side.ordinal()); + + if (ctrl == CTRL_SET_URL) + buf.writeUtf(url); + else if (ctrl == CTRL_ADD_FRIEND || ctrl == CTRL_REMOVE_FRIEND) + friend.writeTo(buf); + else if (ctrl == CTRL_SET_RIGHTS) { + buf.writeByte(friendRights); + buf.writeByte(otherRights); + } else if (isVec2Ctrl(ctrl)) + vec2i.writeTo(buf); + else if (ctrl == CTRL_TYPE) { + buf.writeUtf(text); + buf.writeInt(soundPos.getX()); + buf.writeInt(soundPos.getY()); + buf.writeInt(soundPos.getZ()); + } else if (ctrl == CTRL_REMOVE_UPGRADE) + buf.writeItem(toRemove); + else if (ctrl == CTRL_JS_REQUEST) { + buf.writeInt(jsReqID); + buf.writeByte(jsReqType.ordinal()); + + if (!jsReqType.serialize(buf, jsReqData)) + throw new RuntimeException("Could not serialize CTRL_JS_REQUEST " + jsReqType); + } else if (ctrl == CTRL_SET_ROTATION) + buf.writeByte(rotation.ordinal()); + else if (ctrl == CTRL_SET_URL_REMOTE) { + buf.writeUtf(url); + remoteLoc.writeTo(buf); + } else if (ctrl == CTRL_SET_AUTO_VOL) + buf.writeBoolean(autoVol); + } + + @Override + public void run() { + if (side == null) { + Log.warning("Caught invalid packet from %s (UUID %s) referencing an invalid block side", player.getName(), player.getGameProfile().getId().toString()); + return; + } + + try { + runUnsafe(); + } catch (MissingPermissionException e) { + Log.errorEx("I have reasons to believe %s (UUID %s) is a hacker, but don't take my word for it...", e, e.getPlayer().getName(), e.getPlayer().getGameProfile().getId().toString()); + } + } + + private void checkPermission(TileEntityScreen scr, int right) throws MissingPermissionException { + int prights = scr.getScreen(side).rightsFor(player); + if ((prights & right) == 0) + throw new MissingPermissionException(right, player); + } + + private void runUnsafe() throws MissingPermissionException { + Level world = player.level; + BlockPos bp = pos.toBlock(); + + if (!world.dimension().location().equals(dim)) + return; //Out of range (dimension mismatch) + + if (ctrl == CTRL_SET_URL_REMOTE) { + double reachDist = player.getAttributeValue(ForgeMod.REACH_DISTANCE.get()); + BlockPos blockPos = remoteLoc.toBlock(); + + if (player.distanceToSqr(blockPos.getX(), blockPos.getY(), blockPos.getZ()) > reachDist * reachDist) + return; //Out of range (player reach distance) + + BlockState bs = world.getBlockState(blockPos); + if (bs.getBlock() != BlockInit.blockServer.get() && bs.getBlock() != BlockInit.blockRControl.get() && + bs.getBlock() != BlockInit.blockKeyBoard.get() && bs.getBlock() != BlockInit.blockRedControl.get() + && bs.getValue(BlockPeripheral.type) != DefaultPeripheral.REMOTE_CONTROLLER) + return; //I call it hax... + } else if (player.distanceToSqr(bp.getX(), bp.getY(), bp.getZ()) > (128 * 128)) + return; //Out of range (range problem) + + BlockEntity te = world.getBlockEntity(bp); + if (te == null || !(te instanceof TileEntityScreen)) { + Log.error("TileEntity at %s is not a screen; can't control it!", pos.toString()); + return; + } + + TileEntityScreen tes = (TileEntityScreen) te; + + if (ctrl == CTRL_SET_URL || ctrl == CTRL_SET_URL_REMOTE) { + checkPermission(tes, ScreenRights.CHANGE_URL); + try { + tes.setScreenURL(side, url); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (ctrl == CTRL_SHUT_DOWN) { + //TODO + //checkPermission(tes, ScreenRights.CHANGE_URL); + //tes.removeScreen(side); + } else if (ctrl == CTRL_ADD_FRIEND) { + checkPermission(tes, ScreenRights.MANAGE_FRIEND_LIST); + tes.addFriend(player, side, friend); + } else if (ctrl == CTRL_REMOVE_FRIEND) { + checkPermission(tes, ScreenRights.MANAGE_FRIEND_LIST); + tes.removeFriend(player, side, friend); + } else if (ctrl == CTRL_SET_RIGHTS) { + TileEntityScreen.Screen scr = tes.getScreen(side); + + if (scr != null) { + int fr = scr.owner.uuid.equals(player.getGameProfile().getId()) ? friendRights : scr.friendRights; + int or = (scr.rightsFor(player) & ScreenRights.MANAGE_OTHER_RIGHTS) == 0 ? scr.otherRights : otherRights; + + if (scr.friendRights != fr || scr.otherRights != or) + tes.setRights(player, side, fr, or); + } + } else if (ctrl == CTRL_SET_RESOLUTION) { + checkPermission(tes, ScreenRights.CHANGE_RESOLUTION); + tes.setResolution(side, vec2i); + } else if (ctrl == CTRL_TYPE) { + checkPermission(tes, ScreenRights.CLICK); + tes.type(side, text, soundPos); + } else if (ctrl == CTRL_REMOVE_UPGRADE) { + checkPermission(tes, ScreenRights.MANAGE_UPGRADES); + tes.removeUpgrade(side, toRemove, player); + } else if (ctrl == CTRL_LASER_DOWN || ctrl == CTRL_LASER_MOVE) + tes.laserDownMove(side, player, vec2i, ctrl == CTRL_LASER_DOWN); + else if (ctrl == CTRL_LASER_UP) + tes.laserUp(side, player); + else if (ctrl == CTRL_JS_REQUEST) { + if (jsReqType == null || jsReqData == null) + Log.warning("Caught invalid JS request from player %s (UUID %s)", player.getName(), player.getGameProfile().getId().toString()); + else + tes.handleJSRequest(player, side, jsReqID, jsReqType, jsReqData); + } else if (ctrl == CTRL_SET_ROTATION) { + checkPermission(tes, ScreenRights.CHANGE_RESOLUTION); + tes.setRotation(side, rotation); + } else if (ctrl == CTRL_SET_AUTO_VOL) { + checkPermission(tes, ScreenRights.MANAGE_UPGRADES); //because why not + tes.setAutoVolume(side, autoVol); + } else + Log.warning("Caught SMessageScreenCtrl with invalid control ID %d from player %s (UUID %s)", ctrl, player.getName(), player.getGameProfile().getId().toString()); + } + + public void handle(NetworkEvent.Context ctx) { + player = ctx.getSender(); + ctx.enqueueWork(this); + ctx.setPacketHandled(true); + } +} diff --git a/src/main/java/net/montoyo/wd/utilities/DistSafety.java b/src/main/java/net/montoyo/wd/utilities/DistSafety.java index 5797c5a..3bd4064 100644 --- a/src/main/java/net/montoyo/wd/utilities/DistSafety.java +++ b/src/main/java/net/montoyo/wd/utilities/DistSafety.java @@ -1,9 +1,16 @@ package net.montoyo.wd.utilities; +import net.minecraft.client.Minecraft; import net.montoyo.wd.client.ClientProxy; public class DistSafety { public static ClientProxy createProxy() { return new ClientProxy(); } + + public static boolean isConnected() { + if (Minecraft.getInstance().getConnection() == null) return false; + if (Minecraft.getInstance().getConnection().getConnection().isConnecting()) return false; + return Minecraft.getInstance().getConnection().getConnection().isConnected(); + } }