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);