Skip to content

Commit

Permalink
config task api
Browse files Browse the repository at this point in the history
move receiver interface to outer class
  • Loading branch information
deirn committed Sep 7, 2023
1 parent 54eab00 commit 85b68e0
Show file tree
Hide file tree
Showing 25 changed files with 419 additions and 133 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ minecraft {

dependencies {
compileOnly("org.spongepowered:mixin:0.8.5")
compileOnly("org.ow2.asm:asm:9.2")
}

sourceSets {
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/lol/bai/badpackets/api/C2SPacketReceiver.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lol.bai.badpackets.api;

import lol.bai.badpackets.api.play.PlayPackets;
import lol.bai.badpackets.api.play.ServerPlayPacketReceiver;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
Expand All @@ -11,10 +12,10 @@
@Deprecated(forRemoval = true)
@ApiSide.ServerOnly
@FunctionalInterface
public interface C2SPacketReceiver extends PlayPackets.ServerReceiver<FriendlyByteBuf> {
public interface C2SPacketReceiver extends ServerPlayPacketReceiver<FriendlyByteBuf> {

/**
* @deprecated use {@link PlayPackets#registerServerReceiver(ResourceLocation, PlayPackets.ServerReceiver)}
* @deprecated use {@link PlayPackets#registerServerReceiver(ResourceLocation, ServerPlayPacketReceiver)}
*/
@Deprecated(forRemoval = true)
static void register(ResourceLocation id, C2SPacketReceiver receiver) {
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/lol/bai/badpackets/api/PacketSender.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package lol.bai.badpackets.api;

import lol.bai.badpackets.api.play.ClientPlayPacketReadyCallback;
import lol.bai.badpackets.api.play.ClientPlayPacketReceiver;
import lol.bai.badpackets.api.play.PlayPackets;
import lol.bai.badpackets.api.play.ServerPlayPacketReadyCallback;
import lol.bai.badpackets.api.play.ServerPlayPacketReceiver;
import lol.bai.badpackets.impl.handler.ClientPlayPacketHandler;
import lol.bai.badpackets.impl.handler.ServerPlayPacketHandler;
import lol.bai.badpackets.impl.marker.ApiSide;
Expand All @@ -21,8 +25,8 @@ public interface PacketSender {
* <p>
* <b>Only available when on game.</b>
*
* @see PlayPackets#registerServerReceiver(ResourceLocation, PlayPackets.ServerReceiver)
* @see PlayPackets#registerServerReceiver(ResourceLocation, FriendlyByteBuf.Reader, PlayPackets.ServerReceiver)
* @see PlayPackets#registerServerReceiver(ResourceLocation, ServerPlayPacketReceiver)
* @see PlayPackets#registerServerReceiver(ResourceLocation, FriendlyByteBuf.Reader, ServerPlayPacketReceiver)
*/
@ApiSide.ClientOnly
static PacketSender c2s() {
Expand All @@ -34,8 +38,8 @@ static PacketSender c2s() {
*
* @param player the player that we want to send packets to.
*
* @see PlayPackets#registerClientReceiver(ResourceLocation, PlayPackets.ClientReceiver)
* @see PlayPackets#registerClientReceiver(ResourceLocation, FriendlyByteBuf.Reader, PlayPackets.ClientReceiver)
* @see PlayPackets#registerClientReceiver(ResourceLocation, ClientPlayPacketReceiver)
* @see PlayPackets#registerClientReceiver(ResourceLocation, FriendlyByteBuf.Reader, ClientPlayPacketReceiver)
*/
@ApiSide.ServerOnly
static PacketSender s2c(ServerPlayer player) {
Expand All @@ -47,8 +51,8 @@ static PacketSender s2c(ServerPlayer player) {
* <p>
* <b>Note:</b> Only works for Bad Packets channels.
*
* @see PlayPackets#registerClientReadyCallback(PlayPackets.ClientReadyCallback)
* @see PlayPackets#registerServerReadyCallback(PlayPackets.ServerReadyCallback)
* @see PlayPackets#registerClientReadyCallback(ClientPlayPacketReadyCallback)
* @see PlayPackets#registerServerReadyCallback(ServerPlayPacketReadyCallback)
*/
boolean canSend(ResourceLocation id);

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/lol/bai/badpackets/api/S2CPacketReceiver.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lol.bai.badpackets.api;

import lol.bai.badpackets.api.play.ClientPlayPacketReceiver;
import lol.bai.badpackets.api.play.PlayPackets;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.client.Minecraft;
Expand All @@ -10,10 +11,10 @@
@Deprecated(forRemoval = true)
@ApiSide.ClientOnly
@FunctionalInterface
public interface S2CPacketReceiver extends PlayPackets.ClientReceiver<FriendlyByteBuf> {
public interface S2CPacketReceiver extends ClientPlayPacketReceiver<FriendlyByteBuf> {

/**
* @deprecated use {@link PlayPackets#registerClientReceiver(ResourceLocation, PlayPackets.ClientReceiver)}
* @deprecated use {@link PlayPackets#registerClientReceiver(ResourceLocation, ClientPlayPacketReceiver)}
*/
@ApiSide.ClientOnly
@Deprecated(forRemoval = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl;

@ApiSide.ClientOnly
@FunctionalInterface
public interface ClientConfigPacketReadyCallback {

void onConfig(ClientConfigurationPacketListenerImpl handler, PacketSender sender, Minecraft client);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl;
import net.minecraft.resources.ResourceLocation;

@ApiSide.ClientOnly
@FunctionalInterface
public interface ClientConfigPacketReceiver<P> {

/**
* Server-to-client packet receiver.
*
* @param client the client instance
* @param handler the connection handler instance
* @param payload the packet payload
* @param responseSender the response packet sender, can only reliably send packet when in a
* {@linkplain ConfigPackets#registerTask(ResourceLocation, ConfigTaskExecutor) task}
*/
void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, P payload, PacketSender responseSender);

}
73 changes: 32 additions & 41 deletions src/main/java/lol/bai/badpackets/api/config/ConfigPackets.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,45 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.impl.handler.ServerConfigPacketHandler;
import lol.bai.badpackets.impl.marker.ApiSide;
import lol.bai.badpackets.impl.mixin.AccessServerboundCustomPayloadPacket;
import lol.bai.badpackets.impl.mixin.client.AccessClientboundCustomPayloadPacket;
import lol.bai.badpackets.impl.payload.UntypedPayload;
import lol.bai.badpackets.impl.registry.CallbackRegistry;
import lol.bai.badpackets.impl.registry.ChannelRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerConfigurationPacketListenerImpl;

/**
* Utility for working with configuration packets.
*/
public final class ConfigPackets {

/**
* Register a configuration task.
*
* @param id the task id
* @param executor the task executor
*
* @see ConfigTaskExecutor#runTask
*/
public static void registerTask(ResourceLocation id, ConfigTaskExecutor executor) {
ServerConfigPacketHandler.registerTask(id, executor);
}

/**
* Register a client-to-server packet receiver.
*
* @param id the packet id
* @param receiver the receiver
*
* @see ServerConfigPacketReceiver#receive
*/
public static void registerServerReceiver(ResourceLocation id, ServerReceiver<FriendlyByteBuf> receiver) {
registerServerReceiver(id, UntypedPayload.reader(id), (server, handler, payload, responseSender) ->
receiver.receive(server, handler, payload.buffer(), responseSender));
public static void registerServerReceiver(ResourceLocation id, ServerConfigPacketReceiver<FriendlyByteBuf> receiver) {
registerServerReceiver(id, UntypedPayload.reader(id), (server, handler, payload, responseSender, taskFinisher) ->
receiver.receive(server, handler, payload.buffer(), responseSender, taskFinisher));
}

/**
Expand All @@ -37,11 +48,13 @@ public static void registerServerReceiver(ResourceLocation id, ServerReceiver<Fr
* @param id the {@linkplain CustomPacketPayload#id() packet id}
* @param reader the payload reader
* @param receiver the receiver
*
* @see ServerConfigPacketReceiver#receive
*/
@SuppressWarnings("unchecked")
public static <P extends CustomPacketPayload> void registerServerReceiver(ResourceLocation id, FriendlyByteBuf.Reader<P> reader, ServerReceiver<P> receiver) {
public static <P extends CustomPacketPayload> void registerServerReceiver(ResourceLocation id, FriendlyByteBuf.Reader<P> reader, ServerConfigPacketReceiver<P> receiver) {
AccessServerboundCustomPayloadPacket.badpackets_getPacketReaders().put(id, reader);
ChannelRegistry.CONFIG_C2S.register(id, (ServerReceiver<CustomPacketPayload>) receiver);
ChannelRegistry.CONFIG_C2S.register(id, (ServerConfigPacketReceiver<CustomPacketPayload>) receiver);
}

/**
Expand All @@ -52,7 +65,7 @@ public static <P extends CustomPacketPayload> void registerServerReceiver(Resour
* Not a general-purpose player join callback, use platform specific API for that.
*/
@ApiSide.ServerOnly
public static void registerServerReadyCallback(ServerReadyCallback callback) {
public static void registerServerReadyCallback(ServerConfigPacketReadyCallback callback) {
CallbackRegistry.SERVER_READY_CONFIG.add(callback);
}

Expand All @@ -61,9 +74,11 @@ public static void registerServerReadyCallback(ServerReadyCallback callback) {
*
* @param id the packet id
* @param receiver the receiver
*
* @see ClientConfigPacketReceiver#receive
*/
@ApiSide.ClientOnly
public static void registerClientReceiver(ResourceLocation id, ClientReceiver<FriendlyByteBuf> receiver) {
public static void registerClientReceiver(ResourceLocation id, ClientConfigPacketReceiver<FriendlyByteBuf> receiver) {
registerClientReceiver(id, UntypedPayload.reader(id), (client, handler, payload, responseSender) ->
receiver.receive(client, handler, payload.buffer(), responseSender));
}
Expand All @@ -74,12 +89,14 @@ public static void registerClientReceiver(ResourceLocation id, ClientReceiver<Fr
* @param id the {@linkplain CustomPacketPayload#id() packet id}
* @param reader the payload reader
* @param receiver the receiver
*
* @see ClientConfigPacketReceiver#receive
*/
@ApiSide.ClientOnly
@SuppressWarnings("unchecked")
public static <P extends CustomPacketPayload> void registerClientReceiver(ResourceLocation id, FriendlyByteBuf.Reader<P> reader, ClientReceiver<P> receiver) {
public static <P extends CustomPacketPayload> void registerClientReceiver(ResourceLocation id, FriendlyByteBuf.Reader<P> reader, ClientConfigPacketReceiver<P> receiver) {
AccessClientboundCustomPayloadPacket.badpackets_getPacketReaders().put(id, reader);
ChannelRegistry.CONFIG_S2C.register(id, (ClientReceiver<CustomPacketPayload>) receiver);
ChannelRegistry.CONFIG_S2C.register(id, (ClientConfigPacketReceiver<CustomPacketPayload>) receiver);
}

/**
Expand All @@ -90,37 +107,11 @@ public static <P extends CustomPacketPayload> void registerClientReceiver(Resour
* Not a general-purpose player join callback, use platform specific API for that.
*/
@ApiSide.ClientOnly
public static void registerClientReadyCallback(ClientReadyCallback callback) {
public static void registerClientReadyCallback(ClientConfigPacketReadyCallback callback) {
CallbackRegistry.CLIENT_READY_CONFIG.add(callback);
}

public interface ServerReceiver<P> {

void receive(MinecraftServer server, ServerConfigurationPacketListenerImpl handler, P payload, PacketSender responseSender);

}

@ApiSide.ClientOnly
public interface ClientReceiver<P> {

void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, P payload, PacketSender responseSender);

}

@ApiSide.ServerOnly
@FunctionalInterface
public interface ServerReadyCallback {

void onConfig(ServerConfigurationPacketListenerImpl handler, PacketSender sender, MinecraftServer server);

}

@ApiSide.ClientOnly
@FunctionalInterface
public interface ClientReadyCallback {

void onConfig(ClientConfigurationPacketListenerImpl handler, PacketSender sender, Minecraft client);

private ConfigPackets() {
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.api.config.ServerConfigPacketReceiver.TaskFinisher;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerConfigurationPacketListenerImpl;

@FunctionalInterface
public interface ConfigTaskExecutor {

/**
* Return whether the task is run or not.
* <p>
* Make use of {@link PacketSender#canSend(ResourceLocation)} to check whether the client can process the task,
* and return {@code false} otherwise.
* <p>
* Once the client received the task packet, it should send a response packet to the server.
* After the server received the response packet, it should call {@link TaskFinisher#finish(ResourceLocation)}
* to allow the client to join the server.
*/
boolean runTask(ServerConfigurationPacketListenerImpl handler, PacketSender sender, MinecraftServer server);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerConfigurationPacketListenerImpl;

@ApiSide.ServerOnly
@FunctionalInterface
public interface ServerConfigPacketReadyCallback {

void onConfig(ServerConfigurationPacketListenerImpl handler, PacketSender sender, MinecraftServer server);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package lol.bai.badpackets.api.config;

import lol.bai.badpackets.api.PacketSender;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerConfigurationPacketListenerImpl;
import org.jetbrains.annotations.ApiStatus;

@FunctionalInterface
public interface ServerConfigPacketReceiver<P> {

/**
* Client-to-server packet receiver.
*
* @param server the server instance
* @param handler the connection handler instance
* @param payload the packet payload
* @param responseSender the response packet sender, can only reliably send packet when in a
* {@linkplain ConfigPackets#registerTask(ResourceLocation, ConfigTaskExecutor) task}
* @param taskFinisher the task finisher
*/
void receive(MinecraftServer server, ServerConfigurationPacketListenerImpl handler, P payload, PacketSender responseSender, TaskFinisher taskFinisher);

@ApiStatus.NonExtendable
interface TaskFinisher {

void finish(ResourceLocation taskId);

}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package lol.bai.badpackets.api.event;

import lol.bai.badpackets.api.PacketSender;
import lol.bai.badpackets.api.play.ClientPlayPacketReadyCallback;
import lol.bai.badpackets.api.play.PlayPackets;
import lol.bai.badpackets.api.play.ServerPlayPacketReadyCallback;
import lol.bai.badpackets.impl.marker.ApiSide;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
Expand All @@ -12,7 +14,7 @@
public final class PacketSenderReadyCallback {

/**
* @deprecated use {@link PlayPackets#registerServerReadyCallback(PlayPackets.ServerReadyCallback)}
* @deprecated use {@link PlayPackets#registerServerReadyCallback(ServerPlayPacketReadyCallback)}
*/
@Deprecated(forRemoval = true)
@ApiSide.ServerOnly
Expand All @@ -21,7 +23,7 @@ public static void registerServer(Server callback) {
}

/**
* @deprecated use {@link PlayPackets#registerClientReadyCallback(PlayPackets.ClientReadyCallback)}
* @deprecated use {@link PlayPackets#registerClientReadyCallback(ClientPlayPacketReadyCallback)}
*/
@Deprecated(forRemoval = true)
@ApiSide.ClientOnly
Expand All @@ -31,7 +33,7 @@ public static void registerClient(Client callback) {

@ApiSide.ServerOnly
@FunctionalInterface
public interface Server extends PlayPackets.ServerReadyCallback {
public interface Server extends ServerPlayPacketReadyCallback {

@Override
default void onReady(ServerGamePacketListenerImpl handler, PacketSender sender, MinecraftServer server) {
Expand All @@ -44,7 +46,7 @@ default void onReady(ServerGamePacketListenerImpl handler, PacketSender sender,

@ApiSide.ClientOnly
@FunctionalInterface
public interface Client extends PlayPackets.ClientReadyCallback {
public interface Client extends ClientPlayPacketReadyCallback {

@Override
default void onReady(ClientPacketListener handler, PacketSender sender, Minecraft client) {
Expand Down
Loading

0 comments on commit 85b68e0

Please sign in to comment.