diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java index dc0a402..b1e738b 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java @@ -1,10 +1,9 @@ package io.github.jamalam360.jamlib.client.impl; -import static io.github.jamalam360.jamlib.JamLib.JAR_RENAMING_CHECKER; - import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.client.api.events.ClientMouseScrollEvents; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.client.api.events.ClientConnectionEvents; +import io.github.jamalam360.jamlib.client.api.events.ClientMouseScrollEvents; import io.github.jamalam360.jamlib.client.impl.network.ClientNetworkCapabilitiesImpl; import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket; import net.minecraft.ChatFormatting; @@ -13,6 +12,8 @@ import net.minecraft.network.chat.Component; import org.jetbrains.annotations.ApiStatus; +import static io.github.jamalam360.jamlib.JamLib.JAR_RENAMING_CHECKER; + public class JamLibClient { @ApiStatus.Internal public static void init() { @@ -21,7 +22,7 @@ public static void init() { ClientMouseScrollEvents.IN_SCREENS.listen((m, a) -> ClientMouseScrollEvents.ALWAYS.invokeCancellable(l -> l.onScroll(m, a))); ClientMouseScrollEvents.OUT_OF_SCREENS.listen((m, a) -> ClientMouseScrollEvents.ALWAYS.invokeCancellable(l -> l.onScroll(m, a))); - Network.registerHandler(Network.Direction.CLIENT_BOUND, CapabilitiesPacket.TYPE, ClientNetworkCapabilitiesImpl::handleServerCapabilities); + Network.registerHandler(PacketDirection.CLIENTBOUND, CapabilitiesPacket.KIND, ClientNetworkCapabilitiesImpl::handleServerCapabilities); } private static void onPlayerJoin(Minecraft minecraft) { diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/impl/network/ClientNetworkCapabilitiesImpl.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/network/ClientNetworkCapabilitiesImpl.java index 4d1ce41..f0b5591 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/impl/network/ClientNetworkCapabilitiesImpl.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/network/ClientNetworkCapabilitiesImpl.java @@ -3,20 +3,22 @@ import io.github.jamalam360.jamlib.JamLib; import io.github.jamalam360.jamlib.api.network.Network; import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.client.api.network.ClientNetworkEvents; import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket; import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl; import io.github.jamalam360.jamlib.impl.network.NetworkCapabilityImpl; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; import net.minecraft.resources.Identifier; import java.util.List; public class ClientNetworkCapabilitiesImpl { - public static void handleServerCapabilities(NetworkContext ctx, CapabilitiesPacket.Payload payload) { + public static void handleServerCapabilities(NetworkContext ctx, CapabilitiesPacket payload) { NetworkCapabilityImpl capability = NetworkCapabilitiesImpl.getOrCreateServerCapability(); payload.capabilities().forEach(capability::addSupportedPayloadType); - List clientCapabilities = Network.getRegisteredHandlerTypes(Network.Direction.CLIENT_BOUND); - Network.sendToServer(CapabilitiesPacket.TYPE, new CapabilitiesPacket.Payload(clientCapabilities)); + List clientCapabilities = NetworkImpl.getRegisteredHandlerTypes(PacketDirection.CLIENTBOUND); + Network.sendToServer(new CapabilitiesPacket(clientCapabilities)); JamLib.LOGGER.info("Received {} network {} from server (responded with {})", payload.capabilities().size(), payload.capabilities().size() > 1 ? "capabilities" : "capability", clientCapabilities.size()); ClientNetworkEvents.SERVER_CAPABILITIES_HANDSHAKE_COMPLETED.invoke(ClientNetworkEvents.ServerCapabilitiesHandshakeCompleted::onServerCapabilitiesHandshakeCompleted); } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java b/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java index 3ca319b..54b8f85 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java @@ -2,6 +2,7 @@ import io.github.jamalam360.jamlib.api.events.ServerConnectionEvents; import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.api.platform.Platform; import io.github.jamalam360.jamlib.impl.JarRenamingChecker; import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket; @@ -25,8 +26,7 @@ public static void init() { checkForJarRenaming(JamLib.class); ServerConnectionEvents.CONNECT.listen(NetworkCapabilitiesImpl::onPlayerJoin); - Network.registerPayloadType(CapabilitiesPacket.TYPE, CapabilitiesPacket.INSTANCE); - Network.registerHandler(Network.Direction.SERVER_BOUND, CapabilitiesPacket.TYPE, NetworkCapabilitiesImpl::handleCapabilities); + Network.registerHandler(PacketDirection.SERVERBOUND, CapabilitiesPacket.KIND, NetworkCapabilitiesImpl::handleCapabilities); } /** diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java index b1b692f..9204b1e 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java @@ -1,53 +1,37 @@ package io.github.jamalam360.jamlib.api.network; -import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.impl.network.JamLibPacket; import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl; -import io.github.jamalam360.jamlib.impl.network.PlatformNetwork; -import net.minecraft.resources.Identifier; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; import net.minecraft.server.level.ServerPlayer; -import org.jetbrains.annotations.ApiStatus; - -import java.util.*; /** - * A platform-agnostic packet sending system. + * Networking system. */ public class Network { - private static final Map, NetworkPayloadType> types = new HashMap<>(); - private static final Map, NetworkPayloadHandler> clientBoundHandlers = new HashMap<>(); - private static final Map, NetworkPayloadHandler> serverBoundHandlers = new HashMap<>(); - /** - * Registers a handler for a payload type. + * Registers a handler for a packet kind. * @param direction The direction the handler should be registered for. - * @param id The ID of the payload the handler handles. + * @param kind The kind of packet that the handler handles. * @param handler The handler. */ - public static void registerHandler(Direction direction, PayloadType id, NetworkPayloadHandler handler) { - Map, NetworkPayloadHandler> handlers = switch (direction) { - case CLIENT_BOUND -> clientBoundHandlers; - case SERVER_BOUND -> serverBoundHandlers; - }; - - if (handlers.containsKey(id)) { - throw new IllegalArgumentException("A handler for the payload type with the id " + id + " is already registered"); - } - - handlers.put(id, handler); + public static void registerHandler(PacketDirection direction, PacketKind kind, NetworkPayloadHandler handler) { + NetworkImpl.registerHandler(direction, kind, handler); } - /** - * @param id The ID of the payload type. - * @param type The type of the payload. + /** + * Sends a packet to the server. + * @param payload The payload. */ - public static void registerPayloadType(PayloadType id, NetworkPayloadType type) { - if (types.containsKey(id)) { - throw new IllegalArgumentException("A payload type with the id " + id + " is already registered"); - } + public static void sendToServer(PacketPayload payload) { + NetworkImpl.sendToServer(payload); + } - types.put(id, type); - JamLib.LOGGER.info("Registered network payload type {}", id.id()); + /** + * Sends a payload to the client. + * @param payload The payload. + */ + public static void sendToClient(ServerPlayer player, PacketPayload payload) { + NetworkImpl.sendToClient(player, payload); } /** @@ -68,65 +52,4 @@ public static NetworkCapability getServerCapability() { public static NetworkCapability getPlayerCapability(ServerPlayer player) { return NetworkCapabilitiesImpl.getPlayerCapability(player); } - - /** - * Sends a payload to the server. - * @param id The ID of the payload type. - * @param payload The payload. - */ - @SuppressWarnings("unchecked") - public static void sendToServer(PayloadType id, T payload) { - if (!types.containsKey(id)) { - throw new IllegalArgumentException("No payload type with the id " + id + " is registered"); - } - - NetworkPayloadType type = (NetworkPayloadType) types.get(id); - PlatformNetwork.sendToServer(id, type.getSerializer(), payload); - } - - /** - * Sends a payload to the client. - * @param id The ID of the payload type. - * @param payload The payload. - */ - @SuppressWarnings("unchecked") - public static void sendToClient(ServerPlayer player, PayloadType id, T payload) { - if (!types.containsKey(id)) { - throw new IllegalArgumentException("No payload type with the id " + id + " is registered"); - } - - NetworkPayloadType type = (NetworkPayloadType) types.get(id); - PlatformNetwork.sendToClient(player, id, type.getSerializer(), payload); - } - - @SuppressWarnings("unchecked") - @ApiStatus.Internal - public static void receive(Direction direction, NetworkContext context, JamLibPacket packet) { - Map, NetworkPayloadHandler> handlers = switch (direction) { - case CLIENT_BOUND -> clientBoundHandlers; - case SERVER_BOUND -> serverBoundHandlers; - }; - - if (!types.containsKey(packet.payloadType())) { - throw new IllegalArgumentException("No payload type with the id " + packet.payloadType() + " (" + direction.name() + ") is registered"); - } - - if (!handlers.containsKey(packet.payloadType())) { - throw new IllegalStateException("Received a packet with the id " + packet.payloadType() + " (" + direction.name() + ") for which no handler is registered"); - } - - NetworkPayloadType type = (NetworkPayloadType) types.get(packet.payloadType()); - NetworkPayloadHandler handler = (NetworkPayloadHandler) handlers.get(packet.payloadType()); - handler.handle(context, type.getDeserializer().deserialize(packet.payload())); - } - - @ApiStatus.Internal - public static List getRegisteredHandlerTypes(Direction direction) { - return (direction == Direction.CLIENT_BOUND ? clientBoundHandlers : serverBoundHandlers).keySet().stream().map(PayloadType::id).toList(); - } - - public enum Direction { - CLIENT_BOUND, - SERVER_BOUND - } } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkCapability.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkCapability.java index a3bd119..b6dfdba 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkCapability.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkCapability.java @@ -5,8 +5,16 @@ */ public interface NetworkCapability { /** - * @param type The type of payload to check for. - * @return {@code true} if the connection that this capability represents can handle the packet type. + * @param kind The packet kind to check for. + * @return {@code true} if the connection that this capability represents can handle the packet kind. */ - boolean canReceive(PayloadType type); + default boolean canReceive(PacketKind kind) { + return this.canReceive(kind.getIdentifier()); + } + + /** + * @param identifier The identifier of packet kind to check for. + * @return {@code true} if the connection that this capability represents can handle the packet kind. + */ + boolean canReceive(PacketIdentifier identifier); } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java index ef9857d..841202e 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java @@ -4,7 +4,10 @@ /** * Context passed to a {@link NetworkPayloadHandler}. - * @param player The player who received or sent the packet. */ -public record NetworkContext(Player player) { +public interface NetworkContext { + /** + * @return The player associated with the received packet. + */ + Player getPlayer(); } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java deleted file mode 100644 index 2f62efc..0000000 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.jamalam360.jamlib.api.network; - -import net.minecraft.network.RegistryFriendlyByteBuf; - -/** - * A payload that can be sent over the network. - * @param The type of the payload, usually a record. - */ -public interface NetworkPayloadType { - /** - * @return A serializer instance for the payload type. - */ - Serializer getSerializer(); - - /** - * @return A deserializer instance for the payload type. - */ - Deserializer getDeserializer(); - - /** - * A serializer for a payload. - */ - @FunctionalInterface - interface Serializer { - - /** - * Serializes a payload to a buffer. - * @param object The payload to serialize. - * @param buf The buffer to write to. - */ - void serialize(T object, RegistryFriendlyByteBuf buf); - } - - /** - * A deserializer for a payload. - */ - @FunctionalInterface - interface Deserializer { - /** - * Deserializes a payload from a buffer. - * @param buf The buffer to read from. - * @return The deserialized payload. - */ - T deserialize(RegistryFriendlyByteBuf buf); - } -} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketDirection.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketDirection.java new file mode 100644 index 0000000..9694f27 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketDirection.java @@ -0,0 +1,6 @@ +package io.github.jamalam360.jamlib.api.network; + +public enum PacketDirection { + SERVERBOUND, + CLIENTBOUND +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketIdentifier.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketIdentifier.java new file mode 100644 index 0000000..b44ba70 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketIdentifier.java @@ -0,0 +1,9 @@ +package io.github.jamalam360.jamlib.api.network; + +import net.minecraft.resources.Identifier; + +/** + * Uniquely identifies a {@link PacketKind}. + */ +public record PacketIdentifier(Identifier identifier) { +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketKind.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketKind.java new file mode 100644 index 0000000..f709d39 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketKind.java @@ -0,0 +1,73 @@ +package io.github.jamalam360.jamlib.api.network; + +import io.github.jamalam360.jamlib.impl.network.PacketKindImpl; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.Identifier; + +/** + * Represents the kind of packet that can be sent over the network. + * @param The type of the payload, usually a record. + */ +public interface PacketKind { + /** + * @param id A unique identifier for this packet kind. + * @param codec A stream codec to encode and decode the payload. + * @param The payload type. + * @return A {@link PacketKind} implementation. + */ + static PacketKind of(Identifier id, StreamCodec codec) { + return new PacketKindImpl<>(new PacketIdentifier(id), codec); + } + + /** + * @param id A unique identifier for this packet kind. + * @param codec A stream codec to encode and decode the payload. + * @param The payload type. + * @return A {@link PacketKind} implementation. + */ + static PacketKind of(PacketIdentifier id, StreamCodec codec) { + return new PacketKindImpl<>(id, codec); + } + + /** + * @return A unique {@link PacketIdentifier} for this packet kind. + */ + PacketIdentifier getIdentifier(); + + /** + * @return A serializer instance for the payload type. + */ + Serializer getSerializer(); + + /** + * @return A deserializer instance for the payload type. + */ + Deserializer getDeserializer(); + + /** + * A serializer for a payload. + */ + @FunctionalInterface + interface Serializer { + /** + * Serializes a payload to a buffer. + * @param object The payload to serialize. + * @param buf The buffer to write to. + */ + void serialize(T object, RegistryFriendlyByteBuf buf); + } + + /** + * A deserializer for a payload. + */ + @FunctionalInterface + interface Deserializer { + /** + * Deserializes a payload from a buffer. + * @param buf The buffer to read from. + * @return The deserialized payload. + */ + T deserialize(RegistryFriendlyByteBuf buf); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketPayload.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketPayload.java new file mode 100644 index 0000000..fe03129 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PacketPayload.java @@ -0,0 +1,6 @@ +package io.github.jamalam360.jamlib.api.network; + +public interface PacketPayload { + PacketKind getKind(); + T getPayload(); +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java deleted file mode 100644 index ceb22b0..0000000 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.github.jamalam360.jamlib.api.network; - -import net.minecraft.resources.Identifier; - -/** - * Uniquely identifies a {@link NetworkPayloadType}. - * @param id A unique identifier for the payload type. - */ -public record PayloadType(Identifier id) { -} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java deleted file mode 100644 index 14f7c3d..0000000 --- a/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.github.jamalam360.jamlib.api.network; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; - -/** - * A {@link NetworkPayloadType} that uses a {@link StreamCodec} to encode and decode the payload. - */ -public interface StreamCodecNetworkPayloadType extends NetworkPayloadType { - StreamCodec getStreamCodec(); - - @Override - default Serializer getSerializer() { - return (object, buf) -> getStreamCodec().encode(buf, object); - } - - @Override - default Deserializer getDeserializer() { - return buf -> getStreamCodec().decode(buf); - } -} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/CapabilitiesPacket.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/CapabilitiesPacket.java index 51ea84f..491ef2b 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/CapabilitiesPacket.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/CapabilitiesPacket.java @@ -1,8 +1,8 @@ package io.github.jamalam360.jamlib.impl.network; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.api.network.PayloadType; -import io.github.jamalam360.jamlib.api.network.StreamCodecNetworkPayloadType; +import io.github.jamalam360.jamlib.api.network.PacketKind; +import io.github.jamalam360.jamlib.api.network.PacketPayload; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -11,21 +11,23 @@ import java.util.List; -public class CapabilitiesPacket implements StreamCodecNetworkPayloadType { - public static final CapabilitiesPacket INSTANCE = new CapabilitiesPacket(); - public static final PayloadType TYPE = new PayloadType<>(JamLib.id("capabilities")); - private static final StreamCodec STREAM_CODEC = ByteBufCodecs +public record CapabilitiesPacket(List capabilities) implements PacketPayload { + private static final StreamCodec STREAM_CODEC = ByteBufCodecs .list(1_000) .apply(StreamCodec.of( FriendlyByteBuf::writeIdentifier, FriendlyByteBuf::readIdentifier )) - .map(Payload::new, Payload::capabilities); + .map(CapabilitiesPacket::new, CapabilitiesPacket::capabilities); + public static final PacketKind KIND = PacketKind.of(JamLib.id("capabilities"), STREAM_CODEC); @Override - public StreamCodec getStreamCodec() { - return STREAM_CODEC; + public PacketKind getKind() { + return KIND; } - public record Payload(List capabilities) {} + @Override + public CapabilitiesPacket getPayload() { + return this; + } } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/JamLibPacket.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/JamLibPacket.java index cbca7d6..f389db2 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/JamLibPacket.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/JamLibPacket.java @@ -1,18 +1,19 @@ package io.github.jamalam360.jamlib.impl.network; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketIdentifier; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; -public record JamLibPacket(PayloadType payloadType, RegistryFriendlyByteBuf payload) implements CustomPacketPayload { +public record JamLibPacket(PacketIdentifier packetIdentifier, + RegistryFriendlyByteBuf payload) implements CustomPacketPayload { public static final Identifier JAMLIB_PACKET_ID = JamLib.id("packet"); public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(JAMLIB_PACKET_ID); public static final StreamCodec CODEC = StreamCodec.of( (buf, packet) -> { - buf.writeIdentifier(packet.payloadType().id()); + buf.writeIdentifier(packet.packetIdentifier().identifier()); int len = packet.payload().writerIndex(); buf.writeInt(len); buf.writeBytes(packet.payload(), 0, len); @@ -21,7 +22,7 @@ public record JamLibPacket(PayloadType payloadType, RegistryFriendlyByteBuf p Identifier payloadType = buf.readIdentifier(); int len = buf.readInt(); RegistryFriendlyByteBuf payload = new RegistryFriendlyByteBuf(buf.readBytes(len), buf.registryAccess()); - return new JamLibPacket(new PayloadType<>(payloadType), payload); + return new JamLibPacket(new PacketIdentifier(payloadType), payload); } ); diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilitiesImpl.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilitiesImpl.java index fb9c1b5..5de48c9 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilitiesImpl.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilitiesImpl.java @@ -4,6 +4,7 @@ import io.github.jamalam360.jamlib.api.network.Network; import io.github.jamalam360.jamlib.api.network.NetworkContext; import io.github.jamalam360.jamlib.api.network.NetworkEvents; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; @@ -45,15 +46,15 @@ public static NetworkCapabilityImpl getOrCreatePlayerCapability(ServerPlayer pla } public static void onPlayerJoin(ServerPlayer player) { - List capabilities = Network.getRegisteredHandlerTypes(Network.Direction.SERVER_BOUND); + List capabilities = NetworkImpl.getRegisteredHandlerTypes(PacketDirection.SERVERBOUND); JamLib.LOGGER.info("Sending {} network {} to {}", capabilities.size(), capabilities.size() > 1 ? "capabilities" : "capability", player.getName().getString()); - Network.sendToClient(player, CapabilitiesPacket.TYPE, new CapabilitiesPacket.Payload(capabilities)); + Network.sendToClient(player, new CapabilitiesPacket(capabilities)); } - public static void handleCapabilities(NetworkContext context, CapabilitiesPacket.Payload payload) { - NetworkCapabilityImpl capabilities = getOrCreatePlayerCapability((ServerPlayer) context.player()); + public static void handleCapabilities(NetworkContext context, CapabilitiesPacket payload) { + NetworkCapabilityImpl capabilities = getOrCreatePlayerCapability((ServerPlayer) context.getPlayer()); payload.capabilities().forEach(capabilities::addSupportedPayloadType); - JamLib.LOGGER.info("Received {} {} from {}", payload.capabilities().size(), payload.capabilities().size() > 1 ? "capabilities" : "capability", context.player().getName().getString()); - NetworkEvents.CLIENT_CAPABILITIES_HANDSHAKE_COMPLETED.invoke(l -> l.onClientCapabilitiesHandshakeCompleted((ServerPlayer) context.player())); + JamLib.LOGGER.info("Received {} {} from {}", payload.capabilities().size(), payload.capabilities().size() > 1 ? "capabilities" : "capability", context.getPlayer().getName().getString()); + NetworkEvents.CLIENT_CAPABILITIES_HANDSHAKE_COMPLETED.invoke(l -> l.onClientCapabilitiesHandshakeCompleted((ServerPlayer) context.getPlayer())); } } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilityImpl.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilityImpl.java index b6552c9..bff28d2 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilityImpl.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkCapabilityImpl.java @@ -1,7 +1,7 @@ package io.github.jamalam360.jamlib.impl.network; import io.github.jamalam360.jamlib.api.network.NetworkCapability; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketIdentifier; import net.minecraft.resources.Identifier; import java.util.HashSet; @@ -11,8 +11,8 @@ public class NetworkCapabilityImpl implements NetworkCapability { private final Set supportedTypes = new HashSet<>(); @Override - public boolean canReceive(PayloadType type) { - return this.supportedTypes.contains(type.id()); + public boolean canReceive(PacketIdentifier identifier) { + return this.supportedTypes.contains(identifier.identifier()); } public void addSupportedPayloadType(Identifier identifier) { diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkImpl.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkImpl.java new file mode 100644 index 0000000..5f58f56 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/NetworkImpl.java @@ -0,0 +1,64 @@ +package io.github.jamalam360.jamlib.impl.network; + +import io.github.jamalam360.jamlib.api.network.*; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.ApiStatus; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NetworkImpl { + private static final Map> packetKinds = new HashMap<>(); + private static final Map> clientBoundHandlers = new HashMap<>(); + private static final Map> serverBoundHandlers = new HashMap<>(); + + public static void registerHandler(PacketDirection direction, PacketKind kind, NetworkPayloadHandler handler) { + Map> handlers = switch (direction) { + case CLIENTBOUND -> clientBoundHandlers; + case SERVERBOUND -> serverBoundHandlers; + }; + + if (handlers.containsKey(kind.getIdentifier())) { + throw new IllegalArgumentException("A handler for the payload kind with the id " + kind.getIdentifier() + " is already registered"); + } + + packetKinds.put(kind.getIdentifier(), kind); + handlers.put(kind.getIdentifier(), handler); + } + + public static void sendToServer(PacketPayload payload) { + PlatformNetwork.sendToServer(payload.getKind(), payload.getPayload()); + } + + public static void sendToClient(ServerPlayer player, PacketPayload payload) { + PlatformNetwork.sendToClient(player, payload.getKind(), payload.getPayload()); + } + + @SuppressWarnings("unchecked") + @ApiStatus.Internal + public static void receive(PacketDirection direction, NetworkContext context, JamLibPacket packet) { + Map> handlers = switch (direction) { + case CLIENTBOUND -> clientBoundHandlers; + case SERVERBOUND -> serverBoundHandlers; + }; + + if (!packetKinds.containsKey(packet.packetIdentifier())) { + throw new IllegalArgumentException("No payload kind with the id " + packet.packetIdentifier() + " (" + direction.name() + ") is registered"); + } + + if (!handlers.containsKey(packet.packetIdentifier())) { + throw new IllegalStateException("Received a packet with the id " + packet.packetIdentifier() + " (" + direction.name() + ") for which no handler is registered"); + } + + PacketKind kind = (PacketKind) packetKinds.get(packet.packetIdentifier()); + NetworkPayloadHandler handler = (NetworkPayloadHandler) handlers.get(packet.packetIdentifier()); + handler.handle(context, kind.getDeserializer().deserialize(packet.payload())); + } + + @ApiStatus.Internal + public static List getRegisteredHandlerTypes(PacketDirection direction) { + return (direction == PacketDirection.CLIENTBOUND ? clientBoundHandlers : serverBoundHandlers).keySet().stream().map(PacketIdentifier::identifier).toList(); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PacketKindImpl.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PacketKindImpl.java new file mode 100644 index 0000000..3e5fe43 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PacketKindImpl.java @@ -0,0 +1,23 @@ +package io.github.jamalam360.jamlib.impl.network; + +import io.github.jamalam360.jamlib.api.network.PacketIdentifier; +import io.github.jamalam360.jamlib.api.network.PacketKind; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public record PacketKindImpl(PacketIdentifier identifier, StreamCodec codec) implements PacketKind { + @Override + public PacketIdentifier getIdentifier() { + return this.identifier(); + } + + @Override + public Serializer getSerializer() { + return (object, buf) -> this.codec().encode(buf, object); + } + + @Override + public Deserializer getDeserializer() { + return this.codec()::decode; + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PlatformNetwork.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PlatformNetwork.java index c39ef4a..e4595bb 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PlatformNetwork.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/network/PlatformNetwork.java @@ -2,19 +2,18 @@ import dev.architectury.injectables.annotations.ExpectPlatform; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.api.network.NetworkPayloadType; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketKind; import net.minecraft.server.level.ServerPlayer; @SuppressWarnings("unused") public class PlatformNetwork { @ExpectPlatform - public static void sendToServer(PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToServer(PacketKind kind, T payload) { JamLib.expectPlatform(); } @ExpectPlatform - public static void sendToClient(ServerPlayer target, PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToClient(ServerPlayer target, PacketKind kind, T payload) { JamLib.expectPlatform(); } } diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java index 19967fe..3aaca84 100644 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java @@ -1,12 +1,13 @@ package io.github.jamalam360.jamlib.impl.fabric; import com.mojang.brigadier.CommandDispatcher; -import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.client.api.command.ClientCommandRegistrationEvent; import io.github.jamalam360.jamlib.client.api.command.ClientCommandSourceStack; import io.github.jamalam360.jamlib.client.impl.JamLibClient; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; +import io.github.jamalam360.jamlib.impl.network.fabric.FabricClientNetworkContext; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -21,6 +22,6 @@ public void onInitializeClient() { ClientCommandRegistrationCallback.EVENT.register(((dispatcher, context) -> ClientCommandRegistrationEvent.EVENT.invoke(l -> l.register((CommandDispatcher) (CommandDispatcher) dispatcher, context)))); // Networking - ClientPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> Network.receive(Network.Direction.CLIENT_BOUND, new NetworkContext(ctx.player()), payload)); + ClientPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> NetworkImpl.receive(PacketDirection.CLIENTBOUND, new FabricClientNetworkContext(ctx), payload)); } } diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java index 061e274..8535878 100644 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java @@ -2,9 +2,10 @@ import io.github.jamalam360.jamlib.JamLib; import io.github.jamalam360.jamlib.api.events.CommandRegistrationEvent; -import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; +import io.github.jamalam360.jamlib.impl.network.fabric.FabricServerNetworkContext; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; @@ -22,6 +23,6 @@ public void onInitialize() { // Networking PayloadTypeRegistry.serverboundPlay().register(JamLibPacket.TYPE, JamLibPacket.CODEC); PayloadTypeRegistry.clientboundPlay().register(JamLibPacket.TYPE, JamLibPacket.CODEC); - ServerPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> Network.receive(Network.Direction.SERVER_BOUND, new NetworkContext(ctx.player()), payload)); + ServerPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> NetworkImpl.receive(PacketDirection.SERVERBOUND, new FabricServerNetworkContext(ctx), payload)); } } diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricClientNetworkContext.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricClientNetworkContext.java new file mode 100644 index 0000000..23875f0 --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricClientNetworkContext.java @@ -0,0 +1,18 @@ +package io.github.jamalam360.jamlib.impl.network.fabric; + +import io.github.jamalam360.jamlib.api.network.NetworkContext; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.world.entity.player.Player; + +public class FabricClientNetworkContext implements NetworkContext { + private final ClientPlayNetworking.Context delegate; + + public FabricClientNetworkContext(ClientPlayNetworking.Context delegate) { + this.delegate = delegate; + } + + @Override + public Player getPlayer() { + return this.delegate.player(); + } +} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricServerNetworkContext.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricServerNetworkContext.java new file mode 100644 index 0000000..56317a7 --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/FabricServerNetworkContext.java @@ -0,0 +1,18 @@ +package io.github.jamalam360.jamlib.impl.network.fabric; + +import io.github.jamalam360.jamlib.api.network.NetworkContext; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.world.entity.player.Player; + +public class FabricServerNetworkContext implements NetworkContext { + private final ServerPlayNetworking.Context delegate; + + public FabricServerNetworkContext(ServerPlayNetworking.Context delegate) { + this.delegate = delegate; + } + + @Override + public Player getPlayer() { + return this.delegate.player(); + } +} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/PlatformNetworkImpl.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/PlatformNetworkImpl.java index 5ddcf24..185e93f 100644 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/PlatformNetworkImpl.java +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/network/fabric/PlatformNetworkImpl.java @@ -1,7 +1,6 @@ package io.github.jamalam360.jamlib.impl.network.fabric; -import io.github.jamalam360.jamlib.api.network.NetworkPayloadType; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketKind; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -11,22 +10,22 @@ import net.minecraft.server.level.ServerPlayer; public class PlatformNetworkImpl { - public static void sendToServer(PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToServer(PacketKind kind, T payload) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level == null) { throw new IllegalStateException("Attempted to send a play phase packet before a level exists"); } RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), minecraft.level.registryAccess()); - serializer.serialize(payload, payloadData); - JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + kind.getSerializer().serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(kind.getIdentifier(), payloadData); ClientPlayNetworking.send(packet); } - public static void sendToClient(ServerPlayer target, PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToClient(ServerPlayer target, PacketKind kind, T payload) { RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), target.level().registryAccess()); - serializer.serialize(payload, payloadData); - JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + kind.getSerializer().serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(kind.getIdentifier(), payloadData); ServerPlayNetworking.send(target, packet); } } diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java index 15b1caf..32f03e5 100644 --- a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java @@ -2,9 +2,10 @@ import io.github.jamalam360.jamlib.JamLib; import io.github.jamalam360.jamlib.api.events.CommandRegistrationEvent; -import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; +import io.github.jamalam360.jamlib.impl.network.neoforge.NeoForgeNetworkContext; import io.github.jamalam360.jamlib.impl.pack.neoforge.PlatformPackReloadListenerRegistryImpl; import io.github.jamalam360.jamlib.impl.registry.neoforge.PlatformRegistriesImpl; import net.neoforged.bus.api.IEventBus; @@ -35,6 +36,6 @@ private void onRegisterCommands(RegisterCommandsEvent event) { @SubscribeEvent private void onRegisterPayloadHandlers(RegisterPayloadHandlersEvent event) { final PayloadRegistrar registrar = event.registrar("1").executesOn(HandlerThread.MAIN); - registrar.playBidirectional(JamLibPacket.TYPE, JamLibPacket.CODEC, (payload, ctx) -> Network.receive(Network.Direction.SERVER_BOUND, new NetworkContext(ctx.player()), payload)); + registrar.playBidirectional(JamLibPacket.TYPE, JamLibPacket.CODEC, (payload, ctx) -> NetworkImpl.receive(PacketDirection.SERVERBOUND, new NeoForgeNetworkContext(ctx), payload)); } } diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java index 48dd3b0..f7f16a8 100644 --- a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java @@ -3,8 +3,7 @@ import com.mojang.brigadier.CommandDispatcher; import io.github.jamalam360.jamlib.JamLib; import io.github.jamalam360.jamlib.api.config.ConfigManager; -import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.api.network.PacketDirection; import io.github.jamalam360.jamlib.client.api.command.ClientCommandRegistrationEvent; import io.github.jamalam360.jamlib.client.api.command.ClientCommandSourceStack; import io.github.jamalam360.jamlib.client.impl.JamLibClient; @@ -12,6 +11,8 @@ import io.github.jamalam360.jamlib.client.impl.config.SelectConfigScreen; import io.github.jamalam360.jamlib.client.impl.keymapping.neoforge.PlatformKeyMappingRegistryImpl; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; +import io.github.jamalam360.jamlib.impl.network.NetworkImpl; +import io.github.jamalam360.jamlib.impl.network.neoforge.NeoForgeNetworkContext; import io.github.jamalam360.jamlib.impl.pack.neoforge.ClientPackReloadListenerRegistry; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; @@ -70,6 +71,6 @@ private IConfigScreenFactory createConfigScreenFactory(String modId, List Network.receive(Network.Direction.CLIENT_BOUND, new NetworkContext(ctx.player()), payload)); + ev.register(JamLibPacket.TYPE, (payload, ctx) -> NetworkImpl.receive(PacketDirection.CLIENTBOUND, new NeoForgeNetworkContext(ctx), payload)); } } diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/NeoForgeNetworkContext.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/NeoForgeNetworkContext.java new file mode 100644 index 0000000..c18c5dc --- /dev/null +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/NeoForgeNetworkContext.java @@ -0,0 +1,18 @@ +package io.github.jamalam360.jamlib.impl.network.neoforge; + +import io.github.jamalam360.jamlib.api.network.NetworkContext; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +public class NeoForgeNetworkContext implements NetworkContext { + private final IPayloadContext delegate; + + public NeoForgeNetworkContext(IPayloadContext delegate) { + this.delegate = delegate; + } + + @Override + public Player getPlayer() { + return this.delegate.player(); + } +} diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/PlatformNetworkImpl.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/PlatformNetworkImpl.java index 6c54edf..825b6d0 100644 --- a/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/PlatformNetworkImpl.java +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/network/neoforge/PlatformNetworkImpl.java @@ -1,7 +1,6 @@ package io.github.jamalam360.jamlib.impl.network.neoforge; -import io.github.jamalam360.jamlib.api.network.NetworkPayloadType; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketKind; import io.github.jamalam360.jamlib.impl.network.JamLibPacket; import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; @@ -11,22 +10,22 @@ import net.neoforged.neoforge.network.PacketDistributor; public class PlatformNetworkImpl { - public static void sendToServer(PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToServer(PacketKind kind, T payload) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level == null) { throw new IllegalStateException("Attempted to send a play phase packet before a level exists"); } RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), minecraft.level.registryAccess()); - serializer.serialize(payload, payloadData); - JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + kind.getSerializer().serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(kind.getIdentifier(), payloadData); ClientPacketDistributor.sendToServer(packet); } - public static void sendToClient(ServerPlayer target, PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + public static void sendToClient(ServerPlayer target, PacketKind kind, T payload) { RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), target.level().registryAccess()); - serializer.serialize(payload, payloadData); - JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + kind.getSerializer().serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(kind.getIdentifier(), payloadData); PacketDistributor.sendToPlayer(target, packet); } } diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java index a67b3e7..28e5431 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java @@ -6,7 +6,7 @@ import io.github.jamalam360.jamlib.api.events.core.EventResult; import io.github.jamalam360.jamlib.api.network.Network; import io.github.jamalam360.jamlib.api.network.NetworkEvents; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketIdentifier; import io.github.jamalam360.jamlib.api.pack.PackReloadListenerRegistry; import io.github.jamalam360.jamlib.api.platform.Platform; import io.github.jamalam360.jamlib.api.config.ConfigManager; @@ -51,11 +51,10 @@ public static void init() { PackReloadListenerRegistry.register(PackType.SERVER_DATA, id("test_server_data"), new TestReloadListener("server_data")); ITEMS.registerEntries(); - Network.registerPayloadType(PotatoPacket.TYPE, PotatoPacket.INSTANCE); NetworkEvents.CLIENT_CAPABILITIES_HANDSHAKE_COMPLETED.listen(p -> { - boolean recvPotato = Network.getPlayerCapability(p).canReceive(PotatoPacket.TYPE); - boolean recvFake = Network.getPlayerCapability(p).canReceive(new PayloadType<>(id("fake_packet"))); + boolean recvPotato = Network.getPlayerCapability(p).canReceive(PotatoPacket.KIND); + boolean recvFake = Network.getPlayerCapability(p).canReceive(new PacketIdentifier(id("fake_packet"))); TestMod.LOGGER.info("Capabilities handshake with client completed! Can receive potato packet: {}, can receive fake packet: {}", recvPotato, recvFake); }); diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java index cdd6d01..8846f93 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java @@ -2,7 +2,8 @@ import io.github.jamalam360.jamlib.api.events.core.EventResult; import io.github.jamalam360.jamlib.api.network.Network; -import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.PacketDirection; +import io.github.jamalam360.jamlib.api.network.PacketIdentifier; import io.github.jamalam360.jamlib.api.pack.PackReloadListenerRegistry; import io.github.jamalam360.jamlib.client.api.command.ClientCommandBuilders; import io.github.jamalam360.jamlib.client.api.command.ClientCommandRegistrationEvent; @@ -22,13 +23,13 @@ public class TestModClient { public static void init() { - Network.registerHandler(Network.Direction.CLIENT_BOUND, PotatoPacket.TYPE, (ctx, payload) -> { + Network.registerHandler(PacketDirection.CLIENTBOUND, PotatoPacket.KIND, (ctx, payload) -> { TestMod.LOGGER.info("Received potato packet with random: {}", payload.random()); }); ClientNetworkEvents.SERVER_CAPABILITIES_HANDSHAKE_COMPLETED.listen(() -> { - boolean recvPotato = Network.getServerCapability().canReceive(PotatoPacket.TYPE); - boolean recvFake = Network.getServerCapability().canReceive(new PayloadType<>(TestMod.id("fake_packet"))); + boolean recvPotato = Network.getServerCapability().canReceive(PotatoPacket.KIND); + boolean recvFake = Network.getServerCapability().canReceive(new PacketIdentifier(TestMod.id("fake_packet"))); TestMod.LOGGER.info("Capabilities handshake with server completed! Can receive potato packet: {}, can receive fake packet: {}", recvPotato, recvFake); }); diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java index e5286a4..6cba831 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java @@ -25,7 +25,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) { int random = new Random().nextInt(3, 10); TestMod.LOGGER.info("On server: {}", random); - Network.sendToClient((ServerPlayer) player, PotatoPacket.TYPE, new PotatoPacket.Payload(random)); + Network.sendToClient((ServerPlayer) player, new PotatoPacket(random)); return InteractionResult.SUCCESS; } } diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java index ab3dfd8..0ecec45 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java @@ -1,22 +1,25 @@ package io.github.jamalam360.testmod.network; -import io.github.jamalam360.jamlib.api.network.PayloadType; -import io.github.jamalam360.jamlib.api.network.StreamCodecNetworkPayloadType; +import io.github.jamalam360.jamlib.api.network.PacketKind; +import io.github.jamalam360.jamlib.api.network.PacketPayload; import io.github.jamalam360.testmod.TestMod; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -public class PotatoPacket implements StreamCodecNetworkPayloadType { - public static final PotatoPacket INSTANCE = new PotatoPacket(); - public static final PayloadType TYPE = new PayloadType<>(TestMod.id("potato")); +public record PotatoPacket(int random) implements PacketPayload { + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + (buf, payload) -> buf.writeInt(payload.random()), + (buf) -> new PotatoPacket(buf.readInt()) + ); + public static final PacketKind KIND = PacketKind.of(TestMod.id("potato"), STREAM_CODEC); @Override - public StreamCodec getStreamCodec() { - return StreamCodec.of( - (buf, payload) -> buf.writeInt(payload.random()), - (buf) -> new Payload(buf.readInt()) - ); + public PacketKind getKind() { + return KIND; } - public record Payload(int random) {} + @Override + public PotatoPacket getPayload() { + return this; + } }