diff --git a/neoforge/src/main/java/dev/architectury/neoforge/ArchitecturyNeoForge.java b/neoforge/src/main/java/dev/architectury/neoforge/ArchitecturyNeoForge.java index a07507d4..71cbd4b2 100644 --- a/neoforge/src/main/java/dev/architectury/neoforge/ArchitecturyNeoForge.java +++ b/neoforge/src/main/java/dev/architectury/neoforge/ArchitecturyNeoForge.java @@ -20,8 +20,11 @@ package dev.architectury.neoforge; import dev.architectury.event.EventHandler; +import dev.architectury.networking.SpawnEntityPacket; import dev.architectury.registry.level.biome.forge.BiomeModificationsImpl; import dev.architectury.utils.ArchitecturyConstants; +import dev.architectury.utils.Env; +import dev.architectury.utils.EnvExecutor; import net.neoforged.fml.common.Mod; @Mod(ArchitecturyConstants.MOD_ID) @@ -29,5 +32,7 @@ public class ArchitecturyNeoForge { public ArchitecturyNeoForge() { EventHandler.init(); BiomeModificationsImpl.init(); + + EnvExecutor.runInEnv(Env.CLIENT, () -> SpawnEntityPacket.Client::register); } } diff --git a/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java index 7d7a766d..7ec02011 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java @@ -26,10 +26,15 @@ import net.minecraft.resources.ResourceLocation; /** * Wraps a {@link FriendlyByteBuf} because NeoForge doesn't easily let us use the buf directly. */ -public record BufCustomPacketPayload(FriendlyByteBuf buf) implements CustomPacketPayload { +public record BufCustomPacketPayload(ResourceLocation type, byte[] payload) implements CustomPacketPayload { + public BufCustomPacketPayload(FriendlyByteBuf buf) { + this(buf.readResourceLocation(), buf.readByteArray()); + } + @Override - public void write(FriendlyByteBuf arg) { - arg.writeBytes(buf); + public void write(FriendlyByteBuf buf) { + buf.writeResourceLocation(type); + buf.writeByteArray(payload); } @SuppressWarnings("NullableProblems") diff --git a/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java b/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java index 8700c099..8231ce3e 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java @@ -30,6 +30,7 @@ import dev.architectury.networking.transformers.PacketTransformer; import dev.architectury.platform.hooks.forge.EventBusesHooksImpl; import dev.architectury.utils.ArchitecturyConstants; import dev.architectury.utils.Env; +import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; @@ -70,10 +71,11 @@ public class NetworkManagerImpl { } public static Packet toPacket(NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buffer) { - FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer()); - packetBuffer.writeResourceLocation(id); - packetBuffer.writeBytes(buffer); - return side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)); + try { + return side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(id, ByteBufUtil.getBytes(buffer))) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(id, ByteBufUtil.getBytes(buffer))); + } finally { + buffer.release(); + } } public static void collectPackets(PacketSink sink, NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buf) { @@ -107,41 +109,46 @@ public class NetworkManagerImpl { return (arg, context) -> { NetworkManager.Side side = side(context.flow()); if (side != direction) return; - ResourceLocation type = arg.buf().readResourceLocation(); + ResourceLocation type = arg.type(); + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(arg.payload())); PacketTransformer transformer = map.get(type); - if (transformer != null) { - NetworkManager.PacketContext packetContext = new NetworkManager.PacketContext() { - @Override - public Player getPlayer() { - return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.player().orElse(null); - } + try { + if (transformer != null) { + NetworkManager.PacketContext packetContext = new NetworkManager.PacketContext() { + @Override + public Player getPlayer() { + return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.player().orElse(null); + } + + @Override + public void queue(Runnable runnable) { + context.workHandler().submitAsync(runnable); + } + + @Override + public Env getEnvironment() { + return context.flow().getReceptionSide() == LogicalSide.CLIENT ? Env.CLIENT : Env.SERVER; + } + + @SuppressWarnings("removal") + private Player getClientPlayer() { + return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::getClientPlayer); + } + }; - @Override - public void queue(Runnable runnable) { - context.workHandler().submitAsync(runnable); - } - - @Override - public Env getEnvironment() { - return context.flow().getReceptionSide() == LogicalSide.CLIENT ? Env.CLIENT : Env.SERVER; - } - - @SuppressWarnings("removal") - private Player getClientPlayer() { - return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::getClientPlayer); - } - }; - - transformer.inbound(side, type, arg.buf(), packetContext, (side1, id1, buf1) -> { - NetworkReceiver networkReceiver = side == NetworkManager.Side.C2S ? C2S.get(id1) : S2C.get(id1); - if (networkReceiver == null) { - throw new IllegalArgumentException("Network Receiver not found! " + id1); - } - networkReceiver.receive(buf1, packetContext); - }); - } else { - LOGGER.error("Unknown message ID: " + type); + transformer.inbound(side, type, buf, packetContext, (side1, id1, buf1) -> { + NetworkReceiver networkReceiver = side == NetworkManager.Side.C2S ? C2S.get(id1) : S2C.get(id1); + if (networkReceiver == null) { + throw new IllegalArgumentException("Network Receiver not found! " + id1); + } + networkReceiver.receive(buf1, packetContext); + }); + } else { + LOGGER.error("Unknown message ID: " + type); + } + } finally { + buf.release(); } }; } @@ -201,12 +208,11 @@ public class NetworkManagerImpl { @Nullable IPlayPayloadHandler s2c = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::initClient); - IPayloadRegistrar registrar = event.registrar("architectury")/*.versioned(Platform.getMod("architectury-api").getVersion())*/.optional(); + IPayloadRegistrar registrar = event.registrar(ArchitecturyConstants.MOD_ID).optional(); registrar.play(CHANNEL_ID, BufCustomPacketPayload::new, builder -> { - builder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(s2c); + builder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(Objects.requireNonNullElseGet(s2c, IPlayPayloadHandler::noop)); }); - registerC2SReceiver(SYNC_IDS, Collections.emptyList(), (buffer, context) -> { Set receivables = (Set) clientReceivables.get(context.getPlayer()); int size = buffer.readInt();