mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-12 08:17:35 +00:00
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:
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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user