Skip to content

Commit cf923a9

Browse files
committed
feat: add capabilities handshake system
1 parent 5de9d75 commit cf923a9

14 files changed

Lines changed: 230 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
- Add ServerConnectionEvents.
2+
- Add capabilities handshake system.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.github.jamalam360.jamlib.client.api.network;
2+
3+
import io.github.jamalam360.jamlib.api.events.core.Event;
4+
5+
/**
6+
* Events related to client networking.
7+
*/
8+
public class ClientNetworkEvents {
9+
/**
10+
* An event called when the client receives capabilities from the logical server.
11+
*/
12+
public static final Event<ServerCapabilitiesHandshakeCompleted> SERVER_CAPABILITIES_HANDSHAKE_COMPLETED = new Event<>();
13+
14+
public interface ServerCapabilitiesHandshakeCompleted {
15+
void onServerCapabilitiesHandshakeCompleted();
16+
}
17+
}

common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import static io.github.jamalam360.jamlib.JamLib.JAR_RENAMING_CHECKER;
44

5+
import io.github.jamalam360.jamlib.api.network.Network;
56
import io.github.jamalam360.jamlib.client.api.events.ClientMouseScrollEvents;
67
import io.github.jamalam360.jamlib.client.api.events.ClientConnectionEvents;
7-
import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl;
8+
import io.github.jamalam360.jamlib.client.impl.network.ClientNetworkCapabilitiesImpl;
9+
import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket;
810
import net.minecraft.ChatFormatting;
911
import net.minecraft.client.Minecraft;
1012
import net.minecraft.client.player.LocalPlayer;
@@ -15,10 +17,11 @@ public class JamLibClient {
1517
@ApiStatus.Internal
1618
public static void init() {
1719
ClientConnectionEvents.CONNECT.listen(JamLibClient::onPlayerJoin);
18-
ClientConnectionEvents.CONNECT.listen(_ -> NetworkCapabilitiesImpl.onClientJoin());
1920

2021
ClientMouseScrollEvents.IN_SCREENS.listen((m, a) -> ClientMouseScrollEvents.ALWAYS.invokeCancellable(l -> l.onScroll(m, a)));
2122
ClientMouseScrollEvents.OUT_OF_SCREENS.listen((m, a) -> ClientMouseScrollEvents.ALWAYS.invokeCancellable(l -> l.onScroll(m, a)));
23+
24+
Network.registerHandler(Network.Direction.CLIENT_BOUND, CapabilitiesPacket.TYPE, ClientNetworkCapabilitiesImpl::handleServerCapabilities);
2225
}
2326

2427
private static void onPlayerJoin(Minecraft minecraft) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.github.jamalam360.jamlib.client.impl.network;
2+
3+
import io.github.jamalam360.jamlib.JamLib;
4+
import io.github.jamalam360.jamlib.api.network.Network;
5+
import io.github.jamalam360.jamlib.api.network.NetworkContext;
6+
import io.github.jamalam360.jamlib.client.api.network.ClientNetworkEvents;
7+
import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket;
8+
import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl;
9+
import io.github.jamalam360.jamlib.impl.network.NetworkCapabilityImpl;
10+
import net.minecraft.resources.Identifier;
11+
12+
import java.util.List;
13+
14+
public class ClientNetworkCapabilitiesImpl {
15+
public static void handleServerCapabilities(NetworkContext ctx, CapabilitiesPacket.Payload payload) {
16+
NetworkCapabilityImpl capability = NetworkCapabilitiesImpl.getOrCreateServerCapability();
17+
payload.capabilities().forEach(capability::addSupportedPayloadType);
18+
List<Identifier> clientCapabilities = Network.getRegisteredHandlerTypes(Network.Direction.CLIENT_BOUND);
19+
Network.sendToServer(CapabilitiesPacket.TYPE, new CapabilitiesPacket.Payload(clientCapabilities));
20+
JamLib.LOGGER.info("Received {} network capabilities from server, responded with {}", payload.capabilities().size(), clientCapabilities.size());
21+
ClientNetworkEvents.SERVER_CAPABILITIES_HANDSHAKE_COMPLETED.invoke(ClientNetworkEvents.ServerCapabilitiesHandshakeCompleted::onServerCapabilitiesHandshakeCompleted);
22+
}
23+
}

common/src/main/java/io/github/jamalam360/jamlib/JamLib.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package io.github.jamalam360.jamlib;
22

3+
import io.github.jamalam360.jamlib.api.events.ServerConnectionEvents;
4+
import io.github.jamalam360.jamlib.api.network.Network;
35
import io.github.jamalam360.jamlib.api.platform.Platform;
46
import io.github.jamalam360.jamlib.impl.JarRenamingChecker;
7+
import io.github.jamalam360.jamlib.impl.network.CapabilitiesPacket;
8+
import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl;
59
import net.minecraft.resources.Identifier;
610
import org.jetbrains.annotations.ApiStatus;
711
import org.slf4j.Logger;
@@ -19,6 +23,10 @@ public class JamLib {
1923
public static void init() {
2024
LOGGER.info("Initializing JamLib on {}", Platform.getModLoader());
2125
checkForJarRenaming(JamLib.class);
26+
27+
ServerConnectionEvents.CONNECT.listen(NetworkCapabilitiesImpl::onPlayerJoin);
28+
Network.registerPayloadType(CapabilitiesPacket.TYPE, CapabilitiesPacket.INSTANCE);
29+
Network.registerHandler(Network.Direction.SERVER_BOUND, CapabilitiesPacket.TYPE, NetworkCapabilitiesImpl::handleCapabilities);
2230
}
2331

2432
/**

common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import io.github.jamalam360.jamlib.JamLib;
44
import io.github.jamalam360.jamlib.impl.network.JamLibPacket;
5+
import io.github.jamalam360.jamlib.impl.network.NetworkCapabilitiesImpl;
56
import io.github.jamalam360.jamlib.impl.network.PlatformNetwork;
7+
import net.minecraft.resources.Identifier;
68
import net.minecraft.server.level.ServerPlayer;
79
import org.jetbrains.annotations.ApiStatus;
810

@@ -48,6 +50,25 @@ public static <T> void registerPayloadType(PayloadType<T> id, NetworkPayloadType
4850
JamLib.LOGGER.info("Registered network payload type {}", id.id());
4951
}
5052

53+
/**
54+
* Gets the network capability of the logical server that the client is currently connected to.
55+
* Should only be called client-side.
56+
* @return The server's network capability.
57+
*/
58+
public static NetworkCapability getServerCapability() {
59+
return NetworkCapabilitiesImpl.getServerCapability();
60+
}
61+
62+
/**
63+
* Gets the network capability of a player connected to the server.
64+
* Should only be called server-side.
65+
* @param player The player to get the capability of.
66+
* @return The player's network capability.
67+
*/
68+
public static NetworkCapability getPlayerCapability(ServerPlayer player) {
69+
return NetworkCapabilitiesImpl.getPlayerCapability(player);
70+
}
71+
5172
/**
5273
* Sends a payload to the server.
5374
* @param id The ID of the payload type.
@@ -99,6 +120,11 @@ public static <T> void receive(Direction direction, NetworkContext context, JamL
99120
handler.handle(context, type.getDeserializer().deserialize(packet.payload()));
100121
}
101122

123+
@ApiStatus.Internal
124+
public static List<Identifier> getRegisteredHandlerTypes(Direction direction) {
125+
return (direction == Direction.CLIENT_BOUND ? clientBoundHandlers : serverBoundHandlers).keySet().stream().map(PayloadType::id).toList();
126+
}
127+
102128
public enum Direction {
103129
CLIENT_BOUND,
104130
SERVER_BOUND
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.github.jamalam360.jamlib.api.network;
2+
3+
public interface NetworkCapability {
4+
boolean canReceive(PayloadType<?> type);
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.jamalam360.jamlib.api.network;
2+
3+
import io.github.jamalam360.jamlib.api.events.core.Event;
4+
import net.minecraft.server.level.ServerPlayer;
5+
6+
/**
7+
* Events related to networking.
8+
*/
9+
public class NetworkEvents {
10+
/**
11+
* An event called when the server receives capabilities from a client.
12+
*/
13+
public static final Event<ClientCapabilitiesHandshakeCompleted> CLIENT_CAPABILITIES_HANDSHAKE_COMPLETED = new Event<>();
14+
15+
public interface ClientCapabilitiesHandshakeCompleted {
16+
void onClientCapabilitiesHandshakeCompleted(ServerPlayer player);
17+
}
18+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.github.jamalam360.jamlib.impl.network;
2+
3+
import io.github.jamalam360.jamlib.JamLib;
4+
import io.github.jamalam360.jamlib.api.network.PayloadType;
5+
import io.github.jamalam360.jamlib.api.network.StreamCodecNetworkPayloadType;
6+
import net.minecraft.network.FriendlyByteBuf;
7+
import net.minecraft.network.RegistryFriendlyByteBuf;
8+
import net.minecraft.network.codec.ByteBufCodecs;
9+
import net.minecraft.network.codec.StreamCodec;
10+
import net.minecraft.resources.Identifier;
11+
12+
import java.util.List;
13+
14+
public class CapabilitiesPacket implements StreamCodecNetworkPayloadType<CapabilitiesPacket.Payload> {
15+
public static final CapabilitiesPacket INSTANCE = new CapabilitiesPacket();
16+
public static final PayloadType<Payload> TYPE = new PayloadType<>(JamLib.id("capabilities"));
17+
private static final StreamCodec<RegistryFriendlyByteBuf, Payload> STREAM_CODEC = ByteBufCodecs
18+
.<RegistryFriendlyByteBuf, Identifier>list(1_000)
19+
.apply(StreamCodec.of(
20+
FriendlyByteBuf::writeIdentifier,
21+
FriendlyByteBuf::readIdentifier
22+
))
23+
.map(Payload::new, Payload::capabilities);
24+
25+
@Override
26+
public StreamCodec<RegistryFriendlyByteBuf, Payload> getStreamCodec() {
27+
return STREAM_CODEC;
28+
}
29+
30+
public record Payload(List<Identifier> capabilities) {}
31+
}

common/src/main/java/io/github/jamalam360/jamlib/impl/network/JamLibPacket.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import io.github.jamalam360.jamlib.JamLib;
44
import io.github.jamalam360.jamlib.api.network.PayloadType;
55
import net.minecraft.network.RegistryFriendlyByteBuf;
6-
import net.minecraft.network.codec.ByteBufCodecs;
76
import net.minecraft.network.codec.StreamCodec;
87
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
98
import net.minecraft.resources.Identifier;

0 commit comments

Comments
 (0)