From 0813bc416c79a8b9a9f40b730597f24e079a16e4 Mon Sep 17 00:00:00 2001 From: HypherionMC Date: Tue, 2 Jan 2024 15:16:13 +0200 Subject: [PATCH] New network system --- .../api/networking/CraterNetworkHandler.java | 28 +++++ .../core/network/CraterNetworkHandler.java | 1 + .../craterlib/core/network/CraterPacket.java | 1 + .../core/network/PacketDirection.java | 1 + .../core/networking/CraterPacketNetwork.java | 31 ++++++ .../core/networking/PacketRegistrar.java | 21 ++++ .../core/networking/PacketRegistry.java | 41 +++++++ .../core/networking/data/PacketContext.java | 15 +++ .../core/networking/data/PacketHolder.java | 18 +++ .../core/networking/data/PacketSide.java | 13 +++ .../craterlib/CraterLibInitializer.java | 4 + .../client/CraterLibClientInitializer.java | 4 + .../network/CraterFabricNetworkHandler.java | 81 ++++++++++++++ .../network/FabricNetworkHandler.java | 1 + .../network/FabricNetworkHelper.java | 1 + .../impl/FabricClientNetworkHelper.java | 1 + .../impl/FabricServerNetworkHelper.java | 1 + Fabric/src/main/resources/fabric.mod.json | 2 +- .../com/hypherionmc/craterlib/CraterLib.java | 5 + .../network/CraterForgeNetworkHandler.java | 83 ++++++++++++++ .../network/ForgeNetworkHandler.java | 1 + Forge/src/main/resources/META-INF/mods.toml | 2 +- .../com/hypherionmc/craterlib/CraterLib.java | 9 ++ .../common/NeoForgeCommonHelper.java | 3 +- .../network/CraterNeoForgeNetworkHandler.java | 103 ++++++++++++++++++ .../network/NeoForgeNetworkHandler.java | 102 +---------------- .../craterlib/network/NeoForgePacket.java | 23 ++++ .../network/NeoForgePacketContainer.java | 16 +++ .../src/main/resources/META-INF/mods.toml | 4 +- gradle.properties | 8 +- 30 files changed, 517 insertions(+), 107 deletions(-) create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java create mode 100644 Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java create mode 100644 Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java create mode 100644 Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java create mode 100644 NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java create mode 100644 NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java create mode 100644 NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java b/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java new file mode 100644 index 0000000..6141a14 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java @@ -0,0 +1,28 @@ +package com.hypherionmc.craterlib.api.networking; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; + +import java.util.List; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public interface CraterNetworkHandler { + + void sendToServer(T packet); + + void sendToServer(T packet, boolean ignoreCheck); + + void sendToClient(T packet, ServerPlayer player); + + default void sendToClients(T packet, List players) { + for (ServerPlayer player : players) { + sendToClient(packet, player); + } + } + + default void sendToAllClients(T packet, MinecraftServer server) { + sendToClients(packet, server.getPlayerList().getPlayers()); + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java index cb32346..8e6726e 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java @@ -10,6 +10,7 @@ import java.util.function.Supplier; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public interface CraterNetworkHandler { > void registerPacket(Class clazz, Supplier supplier, PacketDirection packetDirection); diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java index 77be846..7b4c584 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java @@ -6,6 +6,7 @@ import net.minecraft.world.entity.player.Player; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public interface CraterPacket> { void write(final FriendlyByteBuf buf); diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java index f26eb0b..cf70170 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java @@ -3,6 +3,7 @@ package com.hypherionmc.craterlib.core.network; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public enum PacketDirection { TO_SERVER, TO_CLIENT diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java new file mode 100644 index 0000000..103165b --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java @@ -0,0 +1,31 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterPacketNetwork { + + private final PacketRegistry packetRegistry; + public static CraterPacketNetwork INSTANCE; + + public CraterPacketNetwork(PacketRegistry registry) { + INSTANCE = this; + this.packetRegistry = registry; + } + + public static PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + return INSTANCE.packetRegistry.registerPacket(id, messageType, encoder, decoder, handler); + } + + public PacketRegistry getPacketRegistry() { + return packetRegistry; + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java new file mode 100644 index 0000000..106d08c --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java @@ -0,0 +1,21 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public interface PacketRegistrar { + + PacketSide side(); + + PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler); + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java new file mode 100644 index 0000000..27a52e0 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java @@ -0,0 +1,41 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.api.networking.CraterNetworkHandler; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public abstract class PacketRegistry implements CraterNetworkHandler, PacketRegistrar { + + final Map, PacketHolder> PACKET_MAP = new HashMap<>(); + + protected final PacketSide side; + + public PacketRegistry(PacketSide side) { + this.side = side; + } + + public PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + PacketHolder holder = new PacketHolder<>(id, messageType, encoder, decoder, handler); + PACKET_MAP.put(messageType, holder); + registerPacket(holder); + return this; + } + + public PacketSide side() { + return side; + } + + protected abstract void registerPacket(PacketHolder packetHolder); +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java new file mode 100644 index 0000000..bd3eba7 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java @@ -0,0 +1,15 @@ +package com.hypherionmc.craterlib.core.networking.data; + +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record PacketContext(@Nullable Player sender, T message, PacketSide side) { + + public PacketContext(T message, PacketSide side) { + this(null, message, side); + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java new file mode 100644 index 0000000..4e12fc7 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java @@ -0,0 +1,18 @@ +package com.hypherionmc.craterlib.core.networking.data; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record PacketHolder(ResourceLocation packetId, + Class messageType, + BiConsumer encoder, + Function decoder, + Consumer> handler) { +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java new file mode 100644 index 0000000..c843090 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java @@ -0,0 +1,13 @@ +package com.hypherionmc.craterlib.core.networking.data; + +public enum PacketSide { + CLIENT, + SERVER; + + public PacketSide flipped() { + if (CLIENT.equals(this)) + return SERVER; + + return CLIENT; + } +} diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java index eda7fe0..888a275 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java @@ -4,6 +4,9 @@ import com.hypherionmc.craterlib.api.event.server.CraterRegisterCommandEvent; import com.hypherionmc.craterlib.api.event.server.CraterServerLifecycleEvent; import com.hypherionmc.craterlib.common.FabricCommonPlatform; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -12,6 +15,7 @@ public class CraterLibInitializer implements ModInitializer { @Override public void onInitialize() { + new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.SERVER)); CommandRegistrationCallback.EVENT.register( (dispatcher, registryAccess, environment) -> CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent(dispatcher))); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java index 50f30a4..0c91c1a 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java @@ -2,6 +2,9 @@ package com.hypherionmc.craterlib.client; import com.hypherionmc.craterlib.api.event.client.CraterClientTickEvent; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; @@ -9,6 +12,7 @@ public class CraterLibClientInitializer implements ClientModInitializer { @Override public void onInitializeClient() { + new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT)); ClientTickEvents.START_CLIENT_TICK.register((listener) -> { CraterClientTickEvent event = new CraterClientTickEvent(listener.level); CraterEventBus.INSTANCE.postEvent(event); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java new file mode 100644 index 0000000..923f30b --- /dev/null +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java @@ -0,0 +1,81 @@ +package com.hypherionmc.craterlib.network; + +import com.hypherionmc.craterlib.CraterConstants; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterFabricNetworkHandler extends PacketRegistry { + + private final Map, Message> CHANNELS = new HashMap(); + + public CraterFabricNetworkHandler(PacketSide side) { + super(side); + } + + protected void registerPacket(PacketHolder holder) { + if (CHANNELS.get(holder.messageType()) == null) { + CHANNELS.put(holder.messageType(), new Message<>(holder.packetId(), holder.encoder())); + + if (PacketSide.CLIENT.equals(this.side)) { + ClientPlayNetworking.registerGlobalReceiver(holder.packetId(), ((client, listener, buf, responseSender) -> { + buf.readByte(); + T message = holder.decoder().apply(buf); + client.execute(() -> holder.handler().accept(new PacketContext<>(message, PacketSide.CLIENT))); + })); + } else { + + ServerPlayNetworking.registerGlobalReceiver(holder.packetId(), ((server, player, listener, buf, responseSender) -> { + buf.readByte(); + T message = holder.decoder().apply(buf); + server.execute(() -> holder.handler().accept(new PacketContext<>(player, message, PacketSide.SERVER))); + })); + } + + } else { + CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType()); + } + } + + public void sendToServer(T packet) { + this.sendToServer(packet, false); + } + + public void sendToServer(T packet, boolean ignoreCheck) { + Message message = (Message) CHANNELS.get(packet.getClass()); + + if (ClientPlayNetworking.canSend(message.id()) || ignoreCheck) { + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeByte(0); + message.encoder().accept(packet, buf); + ClientPlayNetworking.send(message.id(), buf); + } + } + + public void sendToClient(T packet, ServerPlayer player) { + Message message = (Message) CHANNELS.get(packet.getClass()); + if (ServerPlayNetworking.canSend(player, message.id())) + { + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeByte(0); + message.encoder().accept(packet, buf); + ServerPlayNetworking.send(player, message.id(), buf); + } + } + + public record Message(ResourceLocation id, BiConsumer encoder) { } +} diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java index fd48642..02029bf 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java @@ -23,6 +23,7 @@ import java.util.function.Supplier; * @author HypherionSA * @date 24/09/2022 */ +@Deprecated(forRemoval = true) public class FabricNetworkHandler implements CraterNetworkHandler { private static final Map NETWORK_HANDLERS = Maps.newConcurrentMap(); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java index 8f52b0c..0bc4d62 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public interface FabricNetworkHelper { public static FabricNetworkHelper getForDist(EnvType dist) { diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java index 9e0eaf8..800dde7 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public class FabricClientNetworkHelper extends FabricServerNetworkHelper { @Override diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java index 161e011..b6c9547 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public class FabricServerNetworkHelper implements FabricNetworkHelper { @Override public void registerClientReceiver(@NotNull ResourceLocation channelName, @NotNull Function> factory) { diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index 34183dc..b863c60 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -33,7 +33,7 @@ "depends": { "fabricloader": ">=0.14.21", "fabric-api": "*", - "minecraft": ">=1.20.3", + "minecraft": ">=1.20.4", "java": ">=17" } } diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java b/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java index cef73f1..270a2d5 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java @@ -3,6 +3,9 @@ package com.hypherionmc.craterlib; import com.hypherionmc.craterlib.api.event.client.LateInitEvent; import com.hypherionmc.craterlib.common.ForgeServerEvents; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterForgeNetworkHandler; import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; @@ -10,6 +13,7 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLLoader; @Mod(CraterConstants.MOD_ID) public class CraterLib { @@ -20,6 +24,7 @@ public class CraterLib { } public void commonSetup(FMLCommonSetupEvent evt) { + new CraterPacketNetwork(new CraterForgeNetworkHandler(FMLLoader.getDist().isClient() ? PacketSide.CLIENT : PacketSide.SERVER)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { LateInitEvent event = new LateInitEvent(Minecraft.getInstance(), Minecraft.getInstance().options); CraterEventBus.INSTANCE.postEvent(event); diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java b/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java new file mode 100644 index 0000000..310abcb --- /dev/null +++ b/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java @@ -0,0 +1,83 @@ +package com.hypherionmc.craterlib.network; + +import com.hypherionmc.craterlib.CraterConstants; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Connection; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.event.network.CustomPayloadEvent; +import net.minecraftforge.network.ChannelBuilder; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.SimpleChannel; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterForgeNetworkHandler extends PacketRegistry { + private final Map, SimpleChannel> CHANNELS = new HashMap<>(); + + public CraterForgeNetworkHandler(PacketSide side) { + super(side); + } + + protected void registerPacket(PacketHolder holder) { + if (CHANNELS.get(holder.messageType()) == null) { + SimpleChannel channel = ChannelBuilder + .named(holder.packetId()) + .clientAcceptedVersions((a, b) -> true) + .serverAcceptedVersions((a, b) -> true) + .networkProtocolVersion(1) + .simpleChannel(); + + channel.messageBuilder(holder.messageType()) + .decoder(holder.decoder()) + .encoder(holder.encoder()) + .consumerNetworkThread(buildHandler(holder.handler())) + .add(); + + CHANNELS.put(holder.messageType(), channel); + } else { + CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType()); + } + } + + public void sendToServer(T packet) { + this.sendToServer(packet, false); + } + + public void sendToServer(T packet, boolean ignoreCheck) { + SimpleChannel channel = CHANNELS.get(packet.getClass()); + Connection connection = Minecraft.getInstance().getConnection().getConnection(); + if (channel.isRemotePresent(connection) || ignoreCheck) { + channel.send(packet, PacketDistributor.SERVER.noArg()); + } + } + + public void sendToClient(T packet, ServerPlayer player) { + SimpleChannel channel = CHANNELS.get(packet.getClass()); + Connection connection = player.connection.getConnection(); + if (channel.isRemotePresent(connection)) { + channel.send(packet, PacketDistributor.PLAYER.with(player)); + } + } + + + private BiConsumer buildHandler(Consumer> handler) { + return (message, ctx) -> { + ctx.enqueueWork(() -> { + PacketSide side = ctx.getDirection().getReceptionSide().isServer() ? PacketSide.SERVER : PacketSide.CLIENT; + ServerPlayer player = ctx.getSender(); + handler.accept(new PacketContext<>(player, message, side)); + }); + ctx.setPacketHandled(true); + }; + } +} \ No newline at end of file diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java b/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java index 285db0b..aac8f6b 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java @@ -29,6 +29,7 @@ import java.util.function.Supplier; * @author HypherionSA * Partly inspired by and based on ... */ +@Deprecated(forRemoval = true) public class ForgeNetworkHandler implements CraterNetworkHandler { private static final Map NETWORK_HANDLERS = Maps.newConcurrentMap(); diff --git a/Forge/src/main/resources/META-INF/mods.toml b/Forge/src/main/resources/META-INF/mods.toml index f396b5e..c2ecdab 100644 --- a/Forge/src/main/resources/META-INF/mods.toml +++ b/Forge/src/main/resources/META-INF/mods.toml @@ -26,6 +26,6 @@ side = "BOTH" [[dependencies.${ mod_id }]] modId = "minecraft" mandatory = true -versionRange = "[1.20.3,1.21)" +versionRange = "[1.20.4,1.21)" ordering = "NONE" side = "BOTH" diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java index 1ea6078..bd5f9f9 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java @@ -3,23 +3,32 @@ package com.hypherionmc.craterlib; import com.hypherionmc.craterlib.api.event.client.LateInitEvent; import com.hypherionmc.craterlib.common.NeoForgeServerEvents; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterNeoForgeNetworkHandler; import net.minecraft.client.Minecraft; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext; import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.common.NeoForge; @Mod(CraterConstants.MOD_ID) public class CraterLib { + private final PacketRegistry handler; + public CraterLib(IEventBus eventBus) { NeoForge.EVENT_BUS.register(new NeoForgeServerEvents()); FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup); + handler = new CraterNeoForgeNetworkHandler(FMLLoader.getDist().isClient() ? PacketSide.CLIENT : PacketSide.SERVER); } public void commonSetup(FMLCommonSetupEvent evt) { + new CraterPacketNetwork(handler); if (FMLEnvironment.dist.isClient()) { LateInitEvent event = new LateInitEvent(Minecraft.getInstance(), Minecraft.getInstance().options); CraterEventBus.INSTANCE.postEvent(event); diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java index cb19104..b1d12ba 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java @@ -23,7 +23,8 @@ public class NeoForgeCommonHelper implements CommonPlatform { @Override public CraterNetworkHandler createPacketHandler(String modid, boolean requiredClient, boolean requiredServer) { - return NeoForgeNetworkHandler.of(modid, requiredClient, requiredServer); + return new NeoForgeNetworkHandler(modid, requiredClient, requiredServer); + //return NeoForgeNetworkHandler.of(modid, requiredClient, requiredServer); } @Override diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java new file mode 100644 index 0000000..0b1fc88 --- /dev/null +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java @@ -0,0 +1,103 @@ +package com.hypherionmc.craterlib.network; + +import com.hypherionmc.craterlib.CraterConstants; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.handling.IPayloadHandler; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterNeoForgeNetworkHandler extends PacketRegistry { + + private final Map, NeoForgePacketContainer> PACKETS = new HashMap<>(); + + public CraterNeoForgeNetworkHandler(PacketSide side) { + super(side); + } + + @SubscribeEvent + public void register(final RegisterPayloadHandlerEvent event) { + if (!PACKETS.isEmpty()) { + PACKETS.forEach((type, container) -> { + final IPayloadRegistrar registrar = event.registrar(container.packetId().getNamespace()); + registrar.common( + container.packetId(), + container.decoder(), + container.handler()); + }); + } + } + + protected void registerPacket(PacketHolder container) { + if (PACKETS.get(container.messageType()) == null) { + var packetContainer = new NeoForgePacketContainer<>( + container.messageType(), + container.packetId(), + container.encoder(), + decoder(container.decoder()), + buildHandler(container.handler()) + ); + + PACKETS.put(container.messageType(), packetContainer); + } + } + + private FriendlyByteBuf.Reader> decoder(Function decoder) { + return (buf -> { + T packet = decoder.apply(buf); + return new NeoForgePacket(PACKETS.get(packet.getClass()), packet); + }); + } + + public void sendToServer(T packet) { + this.sendToServer(packet, false); + } + + public void sendToServer(T packet, boolean ignoreCheck) { + NeoForgePacketContainer container = PACKETS.get(packet.getClass()); + try { + PacketDistributor.SERVER.noArg().send(new NeoForgePacket<>(container, packet)); + } catch (Throwable t) { + CraterConstants.LOG.error("{} packet not registered on the client, this is needed.", packet.getClass(), t); + } + } + + public void sendToClient(T packet, ServerPlayer player) { + NeoForgePacketContainer container = PACKETS.get(packet.getClass()); + try { + if (player.connection.isConnected(container.packetId())) { + PacketDistributor.PLAYER.with(player).send(new NeoForgePacket<>(container, packet)); + } + } catch (Throwable t) { + CraterConstants.LOG.error("{} packet not registered on the server, this is needed.", packet.getClass(), t); + } + } + + private > IPayloadHandler buildHandler(Consumer> handler) { + return (payload, ctx) -> { + try { + PacketSide side = ctx.flow().getReceptionSide().equals(LogicalSide.SERVER) ? PacketSide.SERVER : PacketSide.CLIENT; + Player player = ctx.player().orElse(null); + handler.accept(new PacketContext<>(player, payload.packet(), side)); + } catch (Throwable t) { + CraterConstants.LOG.error("Error handling packet: {} -> ", payload.packet().getClass(), t); + } + }; + } +} \ No newline at end of file diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgeNetworkHandler.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgeNetworkHandler.java index 89a3054..66e4eb0 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgeNetworkHandler.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgeNetworkHandler.java @@ -1,129 +1,35 @@ package com.hypherionmc.craterlib.network; -import com.google.common.collect.Maps; import com.hypherionmc.craterlib.core.network.CraterNetworkHandler; import com.hypherionmc.craterlib.core.network.CraterPacket; import com.hypherionmc.craterlib.core.network.PacketDirection; -import com.hypherionmc.craterlib.core.platform.ClientPlatform; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.common.util.LogicalSidedProvider; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.NetworkRegistry; -import net.neoforged.neoforge.network.PlayNetworkDirection; -import net.neoforged.neoforge.network.simple.MessageFunctions; -import net.neoforged.neoforge.network.simple.SimpleChannel; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiConsumer; -import java.util.function.Function; import java.util.function.Supplier; /** * @author HypherionSA * Partly inspired by and based on ... */ +@Deprecated(forRemoval = true) public class NeoForgeNetworkHandler implements CraterNetworkHandler { - private static final Map NETWORK_HANDLERS = Maps.newConcurrentMap(); - private static final String PROTOCOL = Integer.toString(1); - private final SimpleChannel channel; - - private final boolean clientRequired; - - private final boolean serverRequired; - - private final AtomicInteger packetID = new AtomicInteger(); - - private NeoForgeNetworkHandler(SimpleChannel channel, boolean clientRequired, boolean serverRequired) { - this.channel = channel; - this.clientRequired = clientRequired; - this.serverRequired = serverRequired; - } - - public synchronized static CraterNetworkHandler of(String modId, boolean clientRequired, boolean serverRequired) { - NeoForgeNetworkHandler handler = NETWORK_HANDLERS.computeIfAbsent(modId, modId1 -> new NeoForgeNetworkHandler(buildSimpleChannel(modId1, clientRequired, serverRequired), clientRequired, serverRequired)); - if (handler.clientRequired != clientRequired) - throw new IllegalArgumentException("client channel settings mismatch, expected %s, but was %s".formatted(handler.clientRequired, clientRequired)); - if (handler.serverRequired != serverRequired) - throw new IllegalArgumentException("server channel settings mismatch, expected %s, but was %s".formatted(handler.serverRequired, serverRequired)); - return handler; - } - - private static SimpleChannel buildSimpleChannel(String modId, boolean clientAcceptsVanillaOrMissing, boolean serverAcceptsVanillaOrMissing) { - return NetworkRegistry.ChannelBuilder - .named(new ResourceLocation(modId, "crater_network")) - .networkProtocolVersion(() -> PROTOCOL) - .clientAcceptedVersions(clientAcceptsVanillaOrMissing ? NetworkRegistry.acceptMissingOr(PROTOCOL) : PROTOCOL::equals) - .serverAcceptedVersions(serverAcceptsVanillaOrMissing ? NetworkRegistry.acceptMissingOr(PROTOCOL) : PROTOCOL::equals) - .simpleChannel(); + public NeoForgeNetworkHandler(String modid, boolean requiredClient, boolean requiredServer) { } @Override public > void registerPacket(Class clazz, Supplier supplier, PacketDirection packetDirection) { - BiConsumer encoder = CraterPacket::write; - Function decoder = buf -> { - T packet = supplier.get(); - packet.read(buf); - return packet; - }; - BiConsumer handler = (packet, ctx) -> { - LogicalSide expectedSide = getSideFromDirection(packetDirection); - LogicalSide currentSide = ctx.getDirection().getReceptionSide(); - - if (expectedSide != currentSide) { - throw new IllegalStateException(String.format("Received message on wrong side, expected %s, was %s", expectedSide, currentSide)); - } - - ctx.enqueueWork(() -> { - Player player; - if (packetDirection == PacketDirection.TO_CLIENT) { - player = ClientPlatform.INSTANCE.getClientPlayer(); - } else { - player = ctx.getSender(); - } - packet.handle(player, LogicalSidedProvider.WORKQUEUE.get(expectedSide)); - }); - ctx.setPacketHandled(true); - }; - - this.channel.registerMessage(this.packetID.getAndIncrement(), clazz, encoder(encoder), decoder(decoder), buildHandler(handler)); } @Override public Packet toServerBound(CraterPacket packet) { - return this.channel.toVanillaPacket(packet, PlayNetworkDirection.PLAY_TO_SERVER); + return null; } @Override public Packet toClientBound(CraterPacket packet) { - return this.channel.toVanillaPacket(packet, PlayNetworkDirection.PLAY_TO_CLIENT); - } - - @Override - public void sendToServer(CraterPacket packet) { - CraterNetworkHandler.super.sendToServer(packet); - } - - private LogicalSide getSideFromDirection(PacketDirection direction) { - return direction == PacketDirection.TO_CLIENT ? LogicalSide.CLIENT : LogicalSide.SERVER; - } - - private MessageFunctions.MessageEncoder encoder(BiConsumer encoder) { - return encoder::accept; - } - - private MessageFunctions.MessageDecoder decoder(Function decoder) { - return decoder::apply; - } - - private MessageFunctions.MessageConsumer buildHandler(BiConsumer handler) { - return (message, ctx) -> handler.accept(message, ctx); + return null; } } diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java new file mode 100644 index 0000000..bd16989 --- /dev/null +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java @@ -0,0 +1,23 @@ +package com.hypherionmc.craterlib.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record NeoForgePacket(NeoForgePacketContainer container, T packet) implements CustomPacketPayload { + + @Override + public void write(FriendlyByteBuf buff) + { + container().encoder().accept(packet(), buff); + } + + @Override + public ResourceLocation id() + { + return container().packetId(); + } +} \ No newline at end of file diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java new file mode 100644 index 0000000..cddddb6 --- /dev/null +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java @@ -0,0 +1,16 @@ +package com.hypherionmc.craterlib.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadHandler; + +import java.util.function.BiConsumer; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record NeoForgePacketContainer(Class messageType, + ResourceLocation packetId, + BiConsumer encoder, + FriendlyByteBuf.Reader> decoder, + IPayloadHandler> handler) { } \ No newline at end of file diff --git a/NeoForge/src/main/resources/META-INF/mods.toml b/NeoForge/src/main/resources/META-INF/mods.toml index 8b18919..ceb3416 100644 --- a/NeoForge/src/main/resources/META-INF/mods.toml +++ b/NeoForge/src/main/resources/META-INF/mods.toml @@ -19,13 +19,13 @@ displayTest = "MATCH_VERSION" [[dependencies.${ mod_id }]] modId = "neoforge" mandatory = true -versionRange = "[20.3,)" +versionRange = "[20.4,)" ordering = "NONE" side = "BOTH" [[dependencies.${ mod_id }]] modId = "minecraft" mandatory = true -versionRange = "[1.20.3,1.21)" +versionRange = "[1.20.4,1.21)" ordering = "NONE" side = "BOTH" diff --git a/gradle.properties b/gradle.properties index 31dd99a..e2c538e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,14 +8,14 @@ mod_author=HypherionSA mod_id=craterlib mod_name=CraterLib # Shared -minecraft_version=1.20.3 +minecraft_version=1.20.4 # Fabric fabric_loader=0.15.0 -fabric_api=0.91.1+1.20.3 +fabric_api=0.92.0+1.20.4 # Forge -forge_version=49.0.2 +forge_version=49.0.13 # NeoForged -neoforge_version=8-beta +neoforge_version=73-beta # Dependencies mod_menu_version=8.0.0-beta.2 moon_config=1.0.9