Add in MC REGISTER nonsense. Shut up #5730

Tweak network a bit to fix initialization order stupidity. (Constants don't
load classes!)

Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
cpw committed 2019-08-31 13:55:46 -04:00
1 parent 185f7344fa
commit ea1c7a7339
8 files changed
+177 -31

No files matched your search

@@ -115,7 +115,7 @@ public class ModLoader
this.loadingWarnings = FMLLoader.getLoadingModList().
getBrokenFiles().stream().map(file -> new ModLoadingWarning(null, ModLoadingStage.VALIDATE,
InvalidModIdentifier.identifyJarProblem(file.getFilePath()).orElse("fml.modloading.brokenfile"), file.getFileName())).collect(Collectors.toList());
LOGGER.debug(CORE, "Loading Network data for FML net version: {}", FMLNetworkConstants.NETVERSION);
LOGGER.debug(CORE, "Loading Network data for FML net version: {}", FMLNetworkConstants.init());
CrashReportExtender.registerCrashCallable("ModLauncher", FMLLoader::getLauncherInfo);
CrashReportExtender.registerCrashCallable("ModLauncher launch target", FMLLoader::launcherHandlerName);
CrashReportExtender.registerCrashCallable("ModLauncher naming", FMLLoader::getNaming);
@@ -0,0 +1,89 @@
package net.minecraftforge.fml.network;
import io.netty.buffer.Unpooled;
import io.netty.util.Attribute;
import net.minecraft.network.IPacket;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import org.apache.commons.lang3.tuple.Pair;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
public class FMLMCRegisterPacketHandler {
public static final FMLMCRegisterPacketHandler INSTANCE = new FMLMCRegisterPacketHandler();
public static class ChannelList {
private Set<ResourceLocation> locations = new HashSet<>();
public void updateFrom(PacketBuffer buffer) {
locations = bytesToResLocation(buffer.readByteArray());
}
byte[] toByteArray() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
for (ResourceLocation rl : locations) {
try {
bos.write(rl.toString().getBytes(StandardCharsets.UTF_8));
bos.write(0);
} catch (IOException e) {
// fake IOE
}
}
return bos.toByteArray();
}
private Set<ResourceLocation> bytesToResLocation(byte[] all) {
HashSet<ResourceLocation> rl = new HashSet<>();
int last = 0;
for (int cur = 0; cur < all.length; cur++) {
if (all[cur] == '\0') {
String s = new String(all, last, cur - last, StandardCharsets.UTF_8);
rl.add(new ResourceLocation(s));
last = cur + 1;
}
}
return rl;
}
}
public void addChannels(Set<ResourceLocation> locations, NetworkManager manager) {
getFrom(manager).locations.addAll(locations);
}
void registerListener(NetworkEvent evt) {
final ChannelList channelList = getFrom(evt);
channelList.updateFrom(evt.getPayload());
evt.getSource().get().setPacketHandled(true);
}
void unregisterListener(NetworkEvent evt) {
final ChannelList channelList = getFrom(evt);
channelList.updateFrom(evt.getPayload());
evt.getSource().get().setPacketHandled(true);
}
private static ChannelList getFrom(NetworkManager manager) {
return fromAttr(manager.channel().attr(FMLNetworkConstants.FML_MC_REGISTRY));
}
private static ChannelList getFrom(NetworkEvent event) {
return fromAttr(event.getSource().get().attr(FMLNetworkConstants.FML_MC_REGISTRY));
}
private static ChannelList fromAttr(Attribute<ChannelList> attr) {
attr.setIfAbsent(new ChannelList());
return attr.get();
}
public void sendRegistry(NetworkManager manager, final NetworkDirection dir) {
PacketBuffer pb = new PacketBuffer(Unpooled.buffer());
pb.writeByteArray(getFrom(manager).toByteArray());
final ICustomPacket<IPacket<?>> iPacketICustomPacket = dir.buildPacket(Pair.of(pb, 0), FMLNetworkConstants.MC_REGISTER_RESOURCE);
manager.sendPacket(iPacketICustomPacket.getThis());
}
}
@@ -21,10 +21,12 @@ package net.minecraftforge.fml.network;
import io.netty.util.AttributeKey;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.network.event.EventNetworkChannel;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import java.util.List;
/**
* Constants related to networking
*/
@@ -38,12 +40,20 @@ public class FMLNetworkConstants
static final Marker NETWORK = MarkerManager.getMarker("FMLNETWORK");
static final AttributeKey<String> FML_NETVERSION = AttributeKey.valueOf("fml:netversion");
static final AttributeKey<FMLHandshakeHandler> FML_HANDSHAKE_HANDLER = AttributeKey.valueOf("fml:handshake");
static final AttributeKey<FMLMCRegisterPacketHandler.ChannelList> FML_MC_REGISTRY = AttributeKey.valueOf("minecraft:netregistry");
static final ResourceLocation FML_HANDSHAKE_RESOURCE = new ResourceLocation("fml:handshake");
static final ResourceLocation FML_PLAY_RESOURCE = new ResourceLocation("fml:play");
static final ResourceLocation MC_REGISTER_RESOURCE = new ResourceLocation("minecraft:register");
static final ResourceLocation MC_UNREGISTER_RESOURCE = new ResourceLocation("minecraft:unregister");
static final SimpleChannel handshakeChannel = NetworkInitialization.getHandshakeChannel();
static final SimpleChannel playChannel = NetworkInitialization.getPlayChannel();
static final List<EventNetworkChannel> mcRegChannels = NetworkInitialization.buildMCRegistrationChannels();
/**
* Return this value in your {@link net.minecraftforge.fml.ExtensionPoint#DISPLAYTEST} function to be ignored.
*/
public static final String IGNORESERVERONLY = "OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31";
public static String init() {
return FMLNetworkConstants.NETVERSION;
}
}
@@ -20,8 +20,10 @@
package net.minecraftforge.fml.network;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -79,6 +81,14 @@ public class NetworkHooks
FMLHandshakeHandler.registerHandshake(manager, NetworkDirection.LOGIN_TO_SERVER);
}
public synchronized static void sendMCRegistryPackets(NetworkManager manager, String direction) {
final Set<ResourceLocation> resourceLocations = NetworkRegistry.buildChannelVersions().keySet().stream().
filter(rl -> !Objects.equals(rl.getNamespace(), "minecraft")).
collect(Collectors.toSet());
FMLMCRegisterPacketHandler.INSTANCE.addChannels(resourceLocations, manager);
FMLMCRegisterPacketHandler.INSTANCE.sendRegistry(manager, NetworkDirection.valueOf(direction));
}
public static void handleClientLoginSuccess(NetworkManager manager) {
if (manager == null || manager.channel() == null) throw new NullPointerException("ARGH! Network Manager is null (" + manager != null ? "CHANNEL" : "MANAGER"+")" );
if (getConnectionType(()->manager) == ConnectionType.VANILLA) {
@@ -20,9 +20,13 @@
package net.minecraftforge.fml.network;
import net.minecraftforge.fml.config.ConfigTracker;
import net.minecraftforge.fml.network.event.EventNetworkChannel;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import net.minecraftforge.registries.RegistryManager;
import java.util.Arrays;
import java.util.List;
class NetworkInitialization {
public static SimpleChannel getHandshakeChannel() {
@@ -75,12 +79,12 @@ class NetworkInitialization {
}
public static SimpleChannel getPlayChannel() {
SimpleChannel playChannel = NetworkRegistry.ChannelBuilder
.named(FMLNetworkConstants.FML_PLAY_RESOURCE)
.clientAcceptedVersions(a -> true)
.serverAcceptedVersions(a -> true)
.networkProtocolVersion(() -> FMLNetworkConstants.NETVERSION)
.simpleChannel();
SimpleChannel playChannel = NetworkRegistry.ChannelBuilder.
named(FMLNetworkConstants.FML_PLAY_RESOURCE).
clientAcceptedVersions(a -> true).
serverAcceptedVersions(a -> true).
networkProtocolVersion(() -> FMLNetworkConstants.NETVERSION).
simpleChannel();
playChannel.messageBuilder(FMLPlayMessages.SpawnEntity.class, 0).
decoder(FMLPlayMessages.SpawnEntity::decode).
@@ -97,5 +101,21 @@ class NetworkInitialization {
return playChannel;
}
public static List<EventNetworkChannel> buildMCRegistrationChannels() {
final EventNetworkChannel mcRegChannel = NetworkRegistry.ChannelBuilder.
named(FMLNetworkConstants.MC_REGISTER_RESOURCE).
clientAcceptedVersions(a -> true).
serverAcceptedVersions(a -> true).
networkProtocolVersion(() -> FMLNetworkConstants.NETVERSION).
eventNetworkChannel();
mcRegChannel.addListener(FMLMCRegisterPacketHandler.INSTANCE::registerListener);
final EventNetworkChannel mcUnregChannel = NetworkRegistry.ChannelBuilder.
named(FMLNetworkConstants.MC_UNREGISTER_RESOURCE).
clientAcceptedVersions(a -> true).
serverAcceptedVersions(a -> true).
networkProtocolVersion(() -> FMLNetworkConstants.NETVERSION).
eventNetworkChannel();
mcUnregChannel.addListener(FMLMCRegisterPacketHandler.INSTANCE::unregisterListener);
return Arrays.asList(mcRegChannel, mcUnregChannel);
}
}
@@ -125,15 +125,15 @@ public class NetworkRegistry
*/
private static NetworkInstance createInstance(ResourceLocation name, Supplier<String> networkProtocolVersion, Predicate<String> clientAcceptedVersions, Predicate<String> serverAcceptedVersions)
{
if(lock && !name.getNamespace().equals("fml")){
if(lock) {
LOGGER.error(NETREGISTRY, "Attempted to register channel {} even though registry phase is over", name);
throw new IllegalArgumentException("Registration of network channels is locked");
}
final NetworkInstance networkInstance = new NetworkInstance(name, networkProtocolVersion, clientAcceptedVersions, serverAcceptedVersions);
if (instances.containsKey(name)) {
LOGGER.error(NETREGISTRY, "NetworkDirection channel {} already registered.", name);
throw new IllegalArgumentException("NetworkDirection Channel {"+ name +"} already registered");
}
final NetworkInstance networkInstance = new NetworkInstance(name, networkProtocolVersion, clientAcceptedVersions, serverAcceptedVersions);
instances.put(name, networkInstance);
return networkInstance;
}