From 983c119477736d147ff9cc73dd983b8413ad0fe4 Mon Sep 17 00:00:00 2001 From: Mysticdrew Date: Fri, 5 Aug 2022 11:31:11 -0700 Subject: [PATCH] Let NetworkInstance.isRemotePresent check minecraft:register for channel IDs. (#8921) --- .../network/MCRegisterPacketHandler.java | 10 ++++++++++ .../java/net/minecraftforge/network/NetworkHooks.java | 6 ++++++ .../net/minecraftforge/network/NetworkInstance.java | 5 ++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/network/MCRegisterPacketHandler.java b/src/main/java/net/minecraftforge/network/MCRegisterPacketHandler.java index a90ef0ecea..ea46d4d524 100644 --- a/src/main/java/net/minecraftforge/network/MCRegisterPacketHandler.java +++ b/src/main/java/net/minecraftforge/network/MCRegisterPacketHandler.java @@ -32,12 +32,14 @@ public class MCRegisterPacketHandler public static class ChannelList { private Set locations = new HashSet<>(); + private Set remoteLocations = Set.of(); public void updateFrom(final Supplier source, FriendlyByteBuf buffer, final NetworkEvent.RegistrationChangeType changeType) { byte[] data = new byte[Math.max(buffer.readableBytes(), 0)]; buffer.readBytes(data); Set oldLocations = this.locations; this.locations = bytesToResLocation(data); + this.remoteLocations = Set.copyOf(this.locations); // ensure all locations receive updates, old and new. oldLocations.addAll(this.locations); oldLocations.stream() @@ -76,6 +78,14 @@ public class MCRegisterPacketHandler } return rl; } + + /** + * {@return the unmodifiable set of channel locations sent by the remote side} + * This is useful for interacting with other modloaders via the network to inspect registered network channel IDs. + */ + public Set getRemoteLocations() { + return this.remoteLocations; + } } public void addChannels(Set locations, Connection manager) { diff --git a/src/main/java/net/minecraftforge/network/NetworkHooks.java b/src/main/java/net/minecraftforge/network/NetworkHooks.java index 5f4a1a5ae8..328ec4c636 100644 --- a/src/main/java/net/minecraftforge/network/NetworkHooks.java +++ b/src/main/java/net/minecraftforge/network/NetworkHooks.java @@ -231,4 +231,10 @@ public class NetworkHooks { return mgr.channel().attr(NetworkConstants.FML_MOD_MISMATCH_DATA).get(); } + + @Nullable + public static MCRegisterPacketHandler.ChannelList getChannelList(Connection mgr) + { + return mgr.channel().attr(NetworkConstants.FML_MC_REGISTRY).get(); + } } diff --git a/src/main/java/net/minecraftforge/network/NetworkInstance.java b/src/main/java/net/minecraftforge/network/NetworkInstance.java index d0bc89039a..dd9e733e44 100644 --- a/src/main/java/net/minecraftforge/network/NetworkInstance.java +++ b/src/main/java/net/minecraftforge/network/NetworkInstance.java @@ -95,6 +95,9 @@ public class NetworkInstance public boolean isRemotePresent(Connection manager) { ConnectionData connectionData = NetworkHooks.getConnectionData(manager); - return connectionData != null && connectionData.getChannels().containsKey(channelName); + MCRegisterPacketHandler.ChannelList channelList = NetworkHooks.getChannelList(manager); + return (connectionData != null && connectionData.getChannels().containsKey(channelName)) + // if it's not in the fml connection data, let's check if it's sent by another modloader. + || (channelList != null && channelList.getRemoteLocations().contains(channelName)); } }