From 1927fd76e20a1b3075cb841b09c2caeb57ebd242 Mon Sep 17 00:00:00 2001 From: cpw Date: Sun, 6 Aug 2017 15:42:37 -0230 Subject: [PATCH] Fix up MC version compatibility checking to be a little less verbose. If people use properly formatted version compatibility strings, or the default compiled in one, this will work exactly as before, but has less dependence on specific formats for the mcversion string. So a mod declaring [1.11, 1.12] will now be 1.12.1 compatible by default, for example. --- .../minecraftforge/common/ForgeVersion.java | 22 +++++++++++++++++-- .../fml/common/FMLModContainer.java | 12 +--------- .../net/minecraftforge/fml/common/Loader.java | 7 +++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeVersion.java b/src/main/java/net/minecraftforge/common/ForgeVersion.java index 484be8b528..feccc96c5c 100644 --- a/src/main/java/net/minecraftforge/common/ForgeVersion.java +++ b/src/main/java/net/minecraftforge/common/ForgeVersion.java @@ -31,15 +31,17 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.apache.logging.log4j.Level; +import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; +import net.minecraftforge.fml.common.versioning.VersionRange; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.google.common.io.ByteStreams; import com.google.gson.Gson; -import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.InjectedModContainer; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModContainer; @@ -60,6 +62,7 @@ public class ForgeVersion //This number is incremented every time Jenkins builds Forge, and never reset. Should always be 0 in the repo code. public static final int buildVersion = 0; // This is the minecraft version we're building for - used in various places in Forge/FML code + // Update version compatibility list below if there is SRG compatibility between this version and some previous versions public static final String mcVersion = "1.12.1"; // This is the MCP data version we're using public static final String mcpVersion = "9.41"; @@ -68,6 +71,12 @@ public class ForgeVersion @SuppressWarnings("unused") private static String target = null; + /* + * Version compatibility. Add new version strings for each version we're SRG compatible with. + * Reset the list to empty only when incompatible changes occur. + */ + private static String[] extraCompatibleVersions = { "1.12" }; + private static final Logger log = LogManager.getLogger("ForgeVersionCheck"); public static int getMajorVersion() @@ -107,6 +116,15 @@ public class ForgeVersion return String.format("%d.%d.%d.%d", majorVersion, minorVersion, revisionVersion, buildVersion); } + // We add in the current version (we're compatible with it) and test additional versions for compatibility + private static List COMPATIBLE_VERSIONS = Stream.concat(Stream.of(mcVersion), Stream.of(extraCompatibleVersions)) + .map(s -> new DefaultArtifactVersion("dummy", s)).collect(Collectors.toList()); + + // Tests the mod supplied version range for compatibility with our version compatibility list + public static boolean testMinecraftVersionCompatibility(VersionRange modVersion) { + return COMPATIBLE_VERSIONS.stream().anyMatch(modVersion::containsVersion); + } + public static enum Status { PENDING(), diff --git a/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java b/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java index c7b1577a2a..e8a1d15fc4 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java @@ -67,7 +67,6 @@ import java.util.function.Function; import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; @@ -256,16 +255,7 @@ public class FMLModContainer implements ModContainer } String mcVersionString = (String)descriptor.get("acceptedMinecraftVersions"); - if ("[1.8.8]".equals(mcVersionString)) mcVersionString = "[1.8.8,1.8.9]"; // MC 1.8.8 and 1.8.9 is forward SRG compatible so accept these versions by default. - if ("[1.9.4]".equals(mcVersionString) || - "[1.9,1.9.4]".equals(mcVersionString) || - "[1.9.4,1.10)".equals(mcVersionString) || - "[1.10]".equals(mcVersionString)) - mcVersionString = "[1.9.4,1.10.2]"; - if ("[1.11]".equals(mcVersionString)) - mcVersionString = "[1.11,1.11.2]"; - if ("[1.12]".equals(mcVersionString)) - mcVersionString = "[1.12,1.12.1]"; + if (!Strings.isNullOrEmpty(mcVersionString)) { minecraftAccepted = VersionParser.parseRange(mcVersionString); diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index 5646f8b36c..e484d477c3 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -26,7 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -35,6 +34,7 @@ import java.util.Properties; import java.util.Set; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.ForgeVersion; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.config.ConfigManager; import net.minecraftforge.common.crafting.CraftingHelper; @@ -62,7 +62,6 @@ import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.Level; import com.google.common.base.CharMatcher; -import java.util.function.Function; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.ArrayListMultimap; @@ -238,9 +237,9 @@ public class Loader ArrayListMultimap reqList = ArrayListMultimap.create(); for (ModContainer mod : getActiveModList()) { - if (!mod.acceptableMinecraftVersionRange().containsVersion(minecraft.getProcessedVersion())) + if (!ForgeVersion.testMinecraftVersionCompatibility(mod.acceptableMinecraftVersionRange())) { - FMLLog.log.fatal("The mod {} does not wish to run in Minecraft version {}. You will have to remove it to play.", mod.getModId(), getMCVersionString()); + FMLLog.log.fatal("The mod {} does not wish to run in Minecraft version {}. It is compatible with {}. You will have to remove it to play.", mod.getModId(), getMCVersionString(), mod.acceptableMinecraftVersionRange()); WrongMinecraftVersionException ret = new WrongMinecraftVersionException(mod, getMCVersionString()); FMLLog.log.fatal(ret.getMessage()); wrongMinecraftExceptions.add(ret);