diff --git a/src/main/java/net/minestom/server/network/packet/server/CachedPacket.java b/src/main/java/net/minestom/server/network/packet/server/CachedPacket.java index fd38efcfa..f848498a5 100644 --- a/src/main/java/net/minestom/server/network/packet/server/CachedPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/CachedPacket.java @@ -3,8 +3,10 @@ package net.minestom.server.network.packet.server; import net.minestom.server.utils.PacketUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.lang.ref.SoftReference; +import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.function.Supplier; @@ -51,7 +53,7 @@ public final class CachedPacket implements SendablePacket { * Retrieves the packet object without allocating a buffer. *

* This method can be useful in case the payload is not important (e.g. for packet listening), - * but {@link #retrieve()} should be privileged otherwise. + * but {@link #toBuffer()} and {@link #toFramedPacket()} should be privileged otherwise. */ public @NotNull ServerPacket packet() { FramedPacket cache; @@ -60,17 +62,19 @@ public final class CachedPacket implements SendablePacket { return packetSupplier.get(); } - /** - * Retrieves the packet content. May be recomputed if the packet is invalidated or - * if there is memory demand (handled by a soft reference). - *

- * {@link FramedPacket#body()} will contain a buffer allocated by this method. - */ - public @NotNull FramedPacket retrieve() { - if (!PacketUtils.CACHED_PACKET) { - // TODO: Using a local buffer may be possible - return PacketUtils.allocateTrimmedPacket(packet()); - } + public @NotNull ByteBuffer toBuffer() { + FramedPacket cache = updatedCache(); + return cache != null ? cache.body() : PacketUtils.createFramedPacket(packet()); + } + + public @NotNull FramedPacket toFramedPacket() { + FramedPacket cache = updatedCache(); + return cache != null ? cache : PacketUtils.allocateTrimmedPacket(packet()); + } + + private @Nullable FramedPacket updatedCache() { + if (!PacketUtils.CACHED_PACKET) + return null; SoftReference ref; FramedPacket cache; if (updated == 0 || diff --git a/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java b/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java index 9d8198720..43dd4c974 100644 --- a/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java +++ b/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java @@ -356,7 +356,7 @@ public class PlayerSocketConnection extends PlayerConnection { } else if (packet instanceof FramedPacket framedPacket) { writeFramedPacketSync(framedPacket); } else if (packet instanceof CachedPacket cachedPacket) { - writeFramedPacketSync(cachedPacket.retrieve()); + writeBufferSync(cachedPacket.toBuffer()); } else { throw new RuntimeException("Unknown packet type: " + packet.getClass().getName()); }