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 index 103165b..483e701 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java @@ -15,14 +15,27 @@ public class CraterPacketNetwork { private final PacketRegistry packetRegistry; public static CraterPacketNetwork INSTANCE; + private static DeferredPacketRegistrar delayedHandler; public CraterPacketNetwork(PacketRegistry registry) { INSTANCE = this; this.packetRegistry = registry; + getDelayedHandler().registerQueuedPackets(registry); + } + + private static DeferredPacketRegistrar getDelayedHandler() { + if (delayedHandler == null) { + delayedHandler = new DeferredPacketRegistrar(); + } + return delayedHandler; } public static PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { - return INSTANCE.packetRegistry.registerPacket(id, messageType, encoder, decoder, handler); + if (INSTANCE != null) { + return INSTANCE.packetRegistry.registerPacket(id, messageType, encoder, decoder, handler); + } else { + return getDelayedHandler().registerPacket(id, messageType, encoder, decoder, handler); + } } public PacketRegistry getPacketRegistry() { diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java new file mode 100644 index 0000000..8e66b62 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java @@ -0,0 +1,41 @@ +package com.hypherionmc.craterlib.core.networking; + +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 class DeferredPacketRegistrar implements PacketRegistrar { + + private static final Map, PacketHolder> QUEUED_PACKET_MAP = new HashMap<>(); + + @Override + public PacketSide side() { + return PacketSide.CLIENT; + } + + @Override + public PacketRegistrar registerPacket(ResourceLocation packetIdentifier, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + PacketHolder container = new PacketHolder<>(packetIdentifier, messageType, encoder, decoder, handler); + QUEUED_PACKET_MAP.put(messageType, container); + return this; + } + + + public void registerQueuedPackets(PacketRegistry packetRegistration) { + if (!QUEUED_PACKET_MAP.isEmpty()) { + packetRegistration.PACKET_MAP.putAll(QUEUED_PACKET_MAP); + QUEUED_PACKET_MAP.forEach((aClass, container) -> packetRegistration.registerPacket(container)); + } + } +}