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.
This commit is contained in:
cpw committed 2017-08-06 15:42:37 -02:30
1 parent f73c7cb764
commit 1927fd76e2
3 files changed
+24 -17

No files matched your search

@@ -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<DefaultArtifactVersion> 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(),
@@ -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);
@@ -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<String, String> 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);