From 3ccaaeac35d90c54ba9490d81289e6e9a39d0dd3 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Mon, 13 Nov 2023 23:42:46 +0100 Subject: [PATCH] Add support packetflow based payload handling. Add packet registration for registry packets. --- .../network/protocol/PacketFlow.java.patch | 10 +++ .../extensions/IPacketFlowExtension.java | 18 +++++ .../network/NetworkInitialization.java | 24 +++++- .../network/configuration/SyncRegistries.java | 5 +- .../VanillaConnectionNetworkFilter.java | 15 ++-- .../handlers/ServerForgeRegistryHandler.java | 8 +- .../payload/FrozenRegistryPayload.java | 3 +- .../FrozenRegistrySyncCompletePayload.java | 7 +- .../FrozenRegistrySyncCompletedPayload.java | 21 ------ .../FrozenRegistrySyncStartPayload.java | 3 +- .../network/payload/SplitPacketPayload.java | 6 +- .../ConfigurationPayloadHandler.java | 52 +++++++++++++ .../registrar/IFlowBasedPayloadRegistrar.java | 11 +++ .../registrar/IPayloadRegistrar.java | 75 +++++++++++++++++++ .../registrar/ModdedPacketRegistrar.java | 11 +++ .../registrar/PayloadHandlerBuilder.java | 40 ++++++++++ .../registrar/PlayPayloadHandler.java | 52 +++++++++++++ .../neoforge/registries/RegistryManager.java | 4 +- 18 files changed, 319 insertions(+), 46 deletions(-) create mode 100644 patches/net/minecraft/network/protocol/PacketFlow.java.patch create mode 100644 src/main/java/net/neoforged/neoforge/common/extensions/IPacketFlowExtension.java delete mode 100644 src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletedPayload.java create mode 100644 src/main/java/net/neoforged/neoforge/network/registration/registrar/ConfigurationPayloadHandler.java create mode 100644 src/main/java/net/neoforged/neoforge/network/registration/registrar/PayloadHandlerBuilder.java create mode 100644 src/main/java/net/neoforged/neoforge/network/registration/registrar/PlayPayloadHandler.java diff --git a/patches/net/minecraft/network/protocol/PacketFlow.java.patch b/patches/net/minecraft/network/protocol/PacketFlow.java.patch new file mode 100644 index 00000000000..b6e9dd90f2a --- /dev/null +++ b/patches/net/minecraft/network/protocol/PacketFlow.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/network/protocol/PacketFlow.java ++++ b/net/minecraft/network/protocol/PacketFlow.java +@@ -1,6 +1,6 @@ + package net.minecraft.network.protocol; + +-public enum PacketFlow { ++public enum PacketFlow implements net.neoforged.neoforge.common.extensions.IPacketFlowExtension { + SERVERBOUND, + CLIENTBOUND; + diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IPacketFlowExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IPacketFlowExtension.java new file mode 100644 index 00000000000..c0a25183e6b --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IPacketFlowExtension.java @@ -0,0 +1,18 @@ +package net.neoforged.neoforge.common.extensions; + +import net.minecraft.network.protocol.PacketFlow; + +public interface IPacketFlowExtension { + + default PacketFlow self() { + return (PacketFlow) this; + } + + default boolean isClientbound() { + return self() == PacketFlow.CLIENTBOUND; + } + + default boolean isServerbound() { + return self() == PacketFlow.SERVERBOUND; + } +} diff --git a/src/main/java/net/neoforged/neoforge/network/NetworkInitialization.java b/src/main/java/net/neoforged/neoforge/network/NetworkInitialization.java index 7f63974cc1c..818ad4c1988 100644 --- a/src/main/java/net/neoforged/neoforge/network/NetworkInitialization.java +++ b/src/main/java/net/neoforged/neoforge/network/NetworkInitialization.java @@ -8,12 +8,19 @@ import java.util.Arrays; import java.util.List; +import net.minecraft.network.protocol.PacketFlow; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.internal.versions.neoforge.NeoForgeVersion; import net.neoforged.neoforge.network.event.EventNetworkChannel; import net.neoforged.neoforge.network.event.RegisterPacketHandlerEvent; +import net.neoforged.neoforge.network.handlers.ClientForgeRegistryHandler; +import net.neoforged.neoforge.network.handlers.ServerForgeRegistryHandler; +import net.neoforged.neoforge.network.handling.ConfigurationPayloadContext; +import net.neoforged.neoforge.network.handling.IConfigurationPayloadHandler; import net.neoforged.neoforge.network.payload.FrozenRegistryPayload; +import net.neoforged.neoforge.network.payload.FrozenRegistrySyncCompletePayload; +import net.neoforged.neoforge.network.payload.FrozenRegistrySyncStartPayload; import net.neoforged.neoforge.network.simple.SimpleChannel; import net.neoforged.neoforge.registries.RegistryManager; import org.jetbrains.annotations.ApiStatus; @@ -26,12 +33,27 @@ public class NetworkInitialization { public static void register(final RegisterPacketHandlerEvent event) { event.registrar() .withVersion(buildNetworkVersion()) + .flowing(PacketFlow.CLIENTBOUND) + .configuration( + FrozenRegistrySyncStartPayload.ID, + FrozenRegistrySyncStartPayload.class, + FrozenRegistrySyncStartPayload::new, + handlers -> handlers.client(ClientForgeRegistryHandler.getInstance()::handle) + ) .configuration( FrozenRegistryPayload.ID, FrozenRegistryPayload.class, FrozenRegistryPayload::new, - + handlers -> handlers.client(ClientForgeRegistryHandler.getInstance()::handle) ) + .bidirectional() + .configuration( + FrozenRegistrySyncCompletePayload.ID, + FrozenRegistrySyncCompletePayload.class, + FrozenRegistrySyncCompletePayload::new, + handlers -> handlers.client(ClientForgeRegistryHandler.getInstance()::handle) + .server(ServerForgeRegistryHandler.getInstance()::handle) + ); } /** diff --git a/src/main/java/net/neoforged/neoforge/network/configuration/SyncRegistries.java b/src/main/java/net/neoforged/neoforge/network/configuration/SyncRegistries.java index ffc40a6c324..1ab89b4db6b 100644 --- a/src/main/java/net/neoforged/neoforge/network/configuration/SyncRegistries.java +++ b/src/main/java/net/neoforged/neoforge/network/configuration/SyncRegistries.java @@ -1,9 +1,8 @@ package net.neoforged.neoforge.network.configuration; -import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.network.ConfigurationTask; import net.neoforged.neoforge.network.payload.FrozenRegistrySyncStartPayload; +import net.neoforged.neoforge.registries.RegistryManager; import java.util.function.Consumer; @@ -13,7 +12,7 @@ public record SyncRegistries() implements ICustomConfigurationTask { @Override public void run(Consumer sender) { - sender.accept(new FrozenRegistrySyncStartPayload()); + sender.accept(new FrozenRegistrySyncStartPayload(RegistryManager.getRegistryNamesForSyncToClient())); } @Override diff --git a/src/main/java/net/neoforged/neoforge/network/filters/VanillaConnectionNetworkFilter.java b/src/main/java/net/neoforged/neoforge/network/filters/VanillaConnectionNetworkFilter.java index 9c5511eec9a..31909cf424a 100644 --- a/src/main/java/net/neoforged/neoforge/network/filters/VanillaConnectionNetworkFilter.java +++ b/src/main/java/net/neoforged/neoforge/network/filters/VanillaConnectionNetworkFilter.java @@ -9,11 +9,6 @@ import com.mojang.brigadier.tree.RootCommandNode; import com.mojang.logging.LogUtils; import io.netty.channel.ChannelHandler; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; @@ -32,12 +27,18 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagNetworkSerialization; -import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.registration.NetworkRegistry; import net.neoforged.neoforge.registries.ForgeRegistries; import net.neoforged.neoforge.registries.RegistryManager; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + /** * A filter for impl packets, used to filter/modify parts of vanilla impl messages that * will cause errors or warnings on vanilla clients, for example entity attributes that are added by Forge or mods. @@ -57,7 +58,7 @@ public VanillaConnectionNetworkFilter() { @Override protected boolean isNecessary(Connection manager) { - return NetworkHooks.isVanillaConnection(manager); + return NetworkRegistry.getInstance().isVanillaConnection(manager); } /** diff --git a/src/main/java/net/neoforged/neoforge/network/handlers/ServerForgeRegistryHandler.java b/src/main/java/net/neoforged/neoforge/network/handlers/ServerForgeRegistryHandler.java index 4938eb53462..d31e923fd39 100644 --- a/src/main/java/net/neoforged/neoforge/network/handlers/ServerForgeRegistryHandler.java +++ b/src/main/java/net/neoforged/neoforge/network/handlers/ServerForgeRegistryHandler.java @@ -1,8 +1,8 @@ package net.neoforged.neoforge.network.handlers; +import net.neoforged.neoforge.network.configuration.SyncRegistries; import net.neoforged.neoforge.network.handling.ConfigurationPayloadContext; -import net.neoforged.neoforge.network.handling.IConfigurationPayloadHandler; -import net.neoforged.neoforge.network.payload.FrozenRegistrySyncCompletedPayload; +import net.neoforged.neoforge.network.payload.FrozenRegistrySyncCompletePayload; public class ServerForgeRegistryHandler { @@ -15,7 +15,7 @@ public static ServerForgeRegistryHandler getInstance() { private ServerForgeRegistryHandler() { } - public void handle(ConfigurationPayloadContext context, FrozenRegistrySyncCompletedPayload payload) { - context.taskCompletedHandler().onTaskCompleted(); + public void handle(ConfigurationPayloadContext context, FrozenRegistrySyncCompletePayload payload) { + context.taskCompletedHandler().onTaskCompleted(SyncRegistries.TYPE); } } diff --git a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistryPayload.java b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistryPayload.java index 99949a26741..3826861a5eb 100644 --- a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistryPayload.java +++ b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistryPayload.java @@ -3,13 +3,14 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.reading.PayloadReadingContext; import net.neoforged.neoforge.registries.ForgeRegistry; public record FrozenRegistryPayload(ResourceLocation registryName, ForgeRegistry.Snapshot snapshot) implements CustomPacketPayload { public static final ResourceLocation ID = new ResourceLocation("neoforge:frozen_registry"); - public FrozenRegistryPayload(FriendlyByteBuf buf) { + public FrozenRegistryPayload(FriendlyByteBuf buf, PayloadReadingContext context) { this(buf.readResourceLocation(), ForgeRegistry.Snapshot.read(buf)); } diff --git a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletePayload.java b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletePayload.java index 1f1e4bace42..b607a052a55 100644 --- a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletePayload.java +++ b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletePayload.java @@ -3,11 +3,16 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.reading.PayloadReadingContext; import org.jetbrains.annotations.NotNull; public record FrozenRegistrySyncCompletePayload() implements CustomPacketPayload { - private static final ResourceLocation ID = new ResourceLocation("neoforge:frozen_registry_sync_complete"); + public static final ResourceLocation ID = new ResourceLocation("neoforge:frozen_registry_sync_complete"); + + public FrozenRegistrySyncCompletePayload(FriendlyByteBuf buf, PayloadReadingContext context) { + this(); + } @Override public void write(@NotNull FriendlyByteBuf buf) { diff --git a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletedPayload.java b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletedPayload.java deleted file mode 100644 index cd949f2a633..00000000000 --- a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncCompletedPayload.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.neoforged.neoforge.network.payload; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -public record FrozenRegistrySyncCompletedPayload() implements CustomPacketPayload { - - public static final ResourceLocation ID = new ResourceLocation("neoforge:frozen_registry_sync_completed"); - - @Override - public void write(@NotNull FriendlyByteBuf p_294947_) { - - } - - @Override - public @NotNull ResourceLocation id() { - return ID; - } -} diff --git a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncStartPayload.java b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncStartPayload.java index 8fa32c06f4d..eabd59fa0f8 100644 --- a/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncStartPayload.java +++ b/src/main/java/net/neoforged/neoforge/network/payload/FrozenRegistrySyncStartPayload.java @@ -3,6 +3,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.reading.PayloadReadingContext; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -11,7 +12,7 @@ public record FrozenRegistrySyncStartPayload(Set toAccess) imp public static final ResourceLocation ID = new ResourceLocation("neoforge:frozen_registry_sync_start"); - public FrozenRegistrySyncStartPayload(FriendlyByteBuf buf) { + public FrozenRegistrySyncStartPayload(FriendlyByteBuf buf, PayloadReadingContext context) { this(buf.readSet(FriendlyByteBuf::readResourceLocation)); } diff --git a/src/main/java/net/neoforged/neoforge/network/payload/SplitPacketPayload.java b/src/main/java/net/neoforged/neoforge/network/payload/SplitPacketPayload.java index a36abc4e234..4dc530d0acd 100644 --- a/src/main/java/net/neoforged/neoforge/network/payload/SplitPacketPayload.java +++ b/src/main/java/net/neoforged/neoforge/network/payload/SplitPacketPayload.java @@ -9,12 +9,8 @@ public record SplitPacketPayload(byte[] payload) implements CustomPacketPayload public static final ResourceLocation ID = new ResourceLocation("neoforge", "split"); - public SplitPacketPayload(FriendlyByteBuf buf) { - this(buf.readBytes(buf.readVarInt()).array()); - } - public SplitPacketPayload(FriendlyByteBuf buf, PayloadReadingContext context) { - this(buf); + this(buf.readBytes(buf.readVarInt()).array()); } @Override diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/ConfigurationPayloadHandler.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/ConfigurationPayloadHandler.java new file mode 100644 index 00000000000..9cfe7c46614 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/ConfigurationPayloadHandler.java @@ -0,0 +1,52 @@ +package net.neoforged.neoforge.network.registration.registrar; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.ConfigurationPayloadContext; +import net.neoforged.neoforge.network.handling.IConfigurationPayloadHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class ConfigurationPayloadHandler implements IConfigurationPayloadHandler { + + @Nullable + private final IConfigurationPayloadHandler clientSide; + @Nullable + private final IConfigurationPayloadHandler serverSide; + + private ConfigurationPayloadHandler(@Nullable IConfigurationPayloadHandler clientSide, @Nullable IConfigurationPayloadHandler serverSide) { + this.clientSide = clientSide; + this.serverSide = serverSide; + } + + @Override + public void handle(ConfigurationPayloadContext context, T payload) { + if (context.flow().isClientbound()) { + if (clientSide != null) { + clientSide.handle(context, payload); + } + } else if (context.flow().isServerbound()) { + if (serverSide != null) { + serverSide.handle(context, payload); + } + } + } + + public static class Builder { + private @Nullable IConfigurationPayloadHandler clientSide; + private @Nullable IConfigurationPayloadHandler serverSide; + + public Builder client(@NotNull IConfigurationPayloadHandler clientSide) { + this.clientSide = clientSide; + return this; + } + + public Builder server(@NotNull IConfigurationPayloadHandler serverSide) { + this.serverSide = serverSide; + return this; + } + + ConfigurationPayloadHandler create() { + return new ConfigurationPayloadHandler(clientSide, serverSide); + } + } +} diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/IFlowBasedPayloadRegistrar.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/IFlowBasedPayloadRegistrar.java index 63fc2a989d4..40caa089b67 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/registrar/IFlowBasedPayloadRegistrar.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/IFlowBasedPayloadRegistrar.java @@ -14,4 +14,15 @@ public interface IFlowBasedPayloadRegistrar extends IPayloadRegistrar { * @return A registrar that is bound to the given flow. */ IPayloadRegistrarWithAcceptableRange flowing(PacketFlow flow); + + /** + * Enables payloads registered with this registrar to flow in both directions. + *

+ * This is the default value for all registrars, unless {@link #flowing(PacketFlow)} has been called. + * Invoking this method as such is only needed to reset the ability to flow in both directions. + *

+ * + * @return A registrar that is bound to both directions. + */ + IPayloadRegistrarWithAcceptableRange bidirectional(); } diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/IPayloadRegistrar.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/IPayloadRegistrar.java index 395c68d0461..a28cb62515c 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/registrar/IPayloadRegistrar.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/IPayloadRegistrar.java @@ -7,6 +7,8 @@ import net.neoforged.neoforge.network.handling.*; import net.neoforged.neoforge.network.reading.IPayloadReader; +import java.util.function.Consumer; + /** * Defines a registrar for custom payloads that can be sent over the network. *

@@ -85,6 +87,31 @@ public interface IPayloadRegistrar { */ IPayloadRegistrarWithAcceptableRange play(ResourceLocation id, Class type, IPayloadReader reader, IPlayPayloadHandler handler); + /** + * Registers a new payload type for the play phase. + *

+ * This method allows different handlers to be registered for different packet-flows. + *
+ * In practice this means that you can register a different handler for clientbound and serverbound packets, + * which allows you to handle them differently on the client and server side. + *

+ * + * @param id The id of the payload. + * @param type The class of the payload. + * @param reader The reader for the payload. + * @param handler The handler for the payload. + * @param The type of the payload. + * @return The registrar. + * + * @implNote This method will capture all internal errors and wrap them in a {@link RegistrationFailedException}. + */ + default IPayloadRegistrarWithAcceptableRange play(ResourceLocation id, Class type, IPayloadReader reader, Consumer> handler) { + final PlayPayloadHandler.Builder builder = new PlayPayloadHandler.Builder<>(); + handler.accept(builder); + return play(id, type, reader, builder.create()); + } + + /** * Registers a new payload type for the configuration phase. * @@ -99,6 +126,30 @@ public interface IPayloadRegistrar { */ IPayloadRegistrarWithAcceptableRange configuration(ResourceLocation id, Class type, IPayloadReader reader, IConfigurationPayloadHandler handler); + /** + * Registers a new payload type for the configuration phase. + *

+ * This method allows different handlers to be registered for different packet-flows. + *
+ * In practice this means that you can register a different handler for clientbound and serverbound packets, + * which allows you to handle them differently on the client and server side. + *

+ * + * @param id The id of the payload. + * @param type The class of the payload. + * @param reader The reader for the payload. + * @param handler The handler for the payload. + * @param The type of the payload. + * @return The registrar. + * + * @implNote This method will capture all internal errors and wrap them in a {@link RegistrationFailedException}. + */ + default IPayloadRegistrarWithAcceptableRange configuration(ResourceLocation id, Class type, IPayloadReader reader, Consumer> handler) { + final ConfigurationPayloadHandler.Builder builder = new ConfigurationPayloadHandler.Builder<>(); + handler.accept(builder); + return configuration(id, type, reader, builder.create()); + } + /** * Registers a new payload type for all supported phases. * @@ -113,4 +164,28 @@ public interface IPayloadRegistrar { default IPayloadRegistrarWithAcceptableRange common(ResourceLocation id, Class type, IPayloadReader reader, IPayloadHandler handler) { return play(id, type, reader, handler::handle).configuration(id, type, reader, handler::handle); } + + /** + * Registers a new payload type for all supported phases. + *

+ * This method allows different handlers to be registered for different packet-flows. + *
+ * In practice this means that you can register a different handler for clientbound and serverbound packets, + * which allows you to handle them differently on the client and server side. + *

+ * + * @param id The id of the payload. + * @param type The class of the payload. + * @param reader The reader for the payload. + * @param handler The handler for the payload. + * @return The registrar. + * + * @param The type of the payload. + */ + default IPayloadRegistrarWithAcceptableRange common(ResourceLocation id, Class type, IPayloadReader reader, Consumer> handler) { + final PayloadHandlerBuilder builder = new PayloadHandlerBuilder<>(); + handler.accept(builder); + + return play(id, type, reader, builder::handle).configuration(id, type, reader, builder::handle); + } } diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/ModdedPacketRegistrar.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/ModdedPacketRegistrar.java index 832c7fca8c0..85a4aa964f4 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/registrar/ModdedPacketRegistrar.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/ModdedPacketRegistrar.java @@ -86,6 +86,11 @@ public IPayloadRegistrarWithAcceptableRange flowing(PacketFlow flow) { return configured.flowing(flow); } + @Override + public IPayloadRegistrarWithAcceptableRange bidirectional() { + return this; + } + private void configuration(final ResourceLocation id, ConfigurationRegistration registration) { validatePayload(id, registration.type(), configurationPayloads); @@ -171,6 +176,12 @@ public IPayloadRegistrarWithAcceptableRange flowing(PacketFlow flow) { this.flow = flow; return this; } + + @Override + public IPayloadRegistrarWithAcceptableRange bidirectional() { + this.flow = null; + return this; + } } } diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/PayloadHandlerBuilder.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/PayloadHandlerBuilder.java new file mode 100644 index 00000000000..2164134ec09 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/PayloadHandlerBuilder.java @@ -0,0 +1,40 @@ +package net.neoforged.neoforge.network.registration.registrar; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PayloadHandlerBuilder { + private @Nullable IPayloadHandler clientSide; + private @Nullable IPayloadHandler serverSide; + + public PayloadHandlerBuilder client(@NotNull IPayloadHandler clientSide) { + this.clientSide = clientSide; + return this; + } + + public PayloadHandlerBuilder server(@NotNull IPayloadHandler serverSide) { + this.serverSide = serverSide; + return this; + } + + void handle(PlayPayloadHandler.Builder play) { + if (clientSide != null) { + play.client(clientSide::handle); + } + if (serverSide != null) { + play.server(serverSide::handle); + } + } + + void handle(ConfigurationPayloadHandler.Builder configuration) { + if (clientSide != null) { + configuration.client(clientSide::handle); + } + if (serverSide != null) { + configuration.server(serverSide::handle); + } + } +} diff --git a/src/main/java/net/neoforged/neoforge/network/registration/registrar/PlayPayloadHandler.java b/src/main/java/net/neoforged/neoforge/network/registration/registrar/PlayPayloadHandler.java new file mode 100644 index 00000000000..f79dd617b38 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/network/registration/registrar/PlayPayloadHandler.java @@ -0,0 +1,52 @@ +package net.neoforged.neoforge.network.registration.registrar; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPlayPayloadHandler; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class PlayPayloadHandler implements IPlayPayloadHandler { + + @Nullable + private final IPlayPayloadHandler clientSide; + @Nullable + private final IPlayPayloadHandler serverSide; + + private PlayPayloadHandler(@Nullable IPlayPayloadHandler clientSide, @Nullable IPlayPayloadHandler serverSide) { + this.clientSide = clientSide; + this.serverSide = serverSide; + } + + @Override + public void handle(PlayPayloadContext context, T payload) { + if (context.flow().isClientbound()) { + if (clientSide != null) { + clientSide.handle(context, payload); + } + } else if (context.flow().isServerbound()) { + if (serverSide != null) { + serverSide.handle(context, payload); + } + } + } + + public static class Builder { + private @Nullable IPlayPayloadHandler clientSide; + private @Nullable IPlayPayloadHandler serverSide; + + public Builder client(@NotNull IPlayPayloadHandler clientSide) { + this.clientSide = clientSide; + return this; + } + + public Builder server(@NotNull IPlayPayloadHandler serverSide) { + this.serverSide = serverSide; + return this; + } + + PlayPayloadHandler create() { + return new PlayPayloadHandler(clientSide, serverSide); + } + } +} diff --git a/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java b/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java index d1e3218bdb4..6267f8bc7f7 100644 --- a/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java +++ b/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java @@ -169,8 +169,8 @@ public static List generateRegistryPackets(boolean isLoca : Collections.emptyList(); } - public static List getRegistryNamesForSyncToClient() { - return ACTIVE.registries.keySet().stream().filter(resloc -> ACTIVE.synced.contains(resloc)).collect(Collectors.toList()); + public static Set getRegistryNamesForSyncToClient() { + return ACTIVE.registries.keySet().stream().filter(resloc -> ACTIVE.synced.contains(resloc)).collect(Collectors.toSet()); } public static Set getVanillaRegistryKeys() {