From 040cc4bf16d2355733d9b78974c5083f5980bde2 Mon Sep 17 00:00:00 2001 From: cpw Date: Sun, 20 Jan 2019 21:26:31 -0500 Subject: [PATCH] Expose a couple of mods.toml properties properly. Half-implemented override namespace - still needs to be reviewed and determined how this might work in detail. Signed-off-by: cpw --- build.gradle | 2 +- mods.toml | 9 ++++--- .../fml/loading/moddiscovery/ModFileInfo.java | 5 ++++ .../fml/loading/moddiscovery/ModInfo.java | 26 +++++++++++++++++++ .../net/minecraftforge/fml/ModContainer.java | 11 ++++---- .../registries/ForgeRegistry.java | 2 +- .../minecraftforge/registries/GameData.java | 3 +-- 7 files changed, 45 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 6c2288689..b5b1348e0 100644 --- a/build.gradle +++ b/build.gradle @@ -261,7 +261,7 @@ project(':forge') { installer 'cpw.mods:modlauncher:0.6.0' installer 'net.minecraftforge:accesstransformers:0.14.+:shadowed' installer 'net.minecraftforge:eventbus:0.6.+:service' - installer 'net.minecraftforge:forgespi:0.2.+' + installer 'net.minecraftforge:forgespi:0.4.+' installer 'net.minecraftforge:coremods:0.2.+' installer 'com.electronwill.night-config:core:3.4.2' installer 'com.electronwill.night-config:toml:3.4.2' diff --git a/mods.toml b/mods.toml index 38978c67d..a7b3d90b6 100644 --- a/mods.toml +++ b/mods.toml @@ -25,13 +25,16 @@ key="value" This is my mod, there may be others, but this one is mine ''' + # Override the default resourcelocation namespace with this instead + # Currently not implemented + namespace="invsorter" # A random extra property for a mod loader randomExtraProperty="somevalue" # Arbitrary key-value pairs - [inventorysorter.properties] + [modproperties.inventorysorter] key="value" # A list of dependencies - [[inventorysorter.dependencies]] + [[dependencies.inventorysorter]] # the modid of the dependency modid="forge" # Does this dependency have to exist - if not, ordering below must be specified @@ -43,7 +46,7 @@ key="value" # Side this dependency is applied on - BOTH, CLIENT or SERVER side="BOTH" # Here's another dependency - [[inventorysorter.dependencies]] + [[dependencies.inventorysorter]] modid="minecraft" mandatory=true versionRange="[1.12.2]" diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java index c72ad458b..165d6b00c 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java @@ -98,6 +98,11 @@ public class ModFileInfo implements IModFileInfo return modLoaderVersion; } + @Override + public Map getFileProperties() { + return this.properties; + } + public Optional getManifest() { return modFile.getLocator().findManifest(modFile.getFilePath()); } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java index 6030b5623..4fa2b15af 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java @@ -28,16 +28,23 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; public class ModInfo implements IModInfo { + private static final Logger LOGGER = LogManager.getLogger(); private static final DefaultArtifactVersion DEFAULT_VERSION = new DefaultArtifactVersion("1"); + private static final Pattern VALID_LABEL = Pattern.compile("^[a-z][a-z0-9_-]{1,63}$"); + private final ModFileInfo owningFile; private final String modId; + private final String namespace; private final ArtifactVersion version; private final String displayName; private final String description; @@ -50,6 +57,15 @@ public class ModInfo implements IModInfo this.owningFile = owningFile; this.modConfig = modConfig; this.modId = modConfig.getOptional("modId").orElseThrow(() -> new InvalidModFileException("Missing modId entry", owningFile)); + if (!VALID_LABEL.matcher(this.modId).matches()) { + LOGGER.fatal("Invalid modId found in file {} - {} does not match the standard: {}", this.owningFile.getFile().getFilePath(), this.modId, VALID_LABEL.pattern()); + throw new InvalidModFileException("Invalid modId found : "+ this.modId, owningFile); + } + this.namespace = modConfig.getOptional("namespace").orElse(this.modId); + if (!VALID_LABEL.matcher(this.namespace).matches()) { + LOGGER.fatal("Invalid override namespace found in file {} - {} does not match the standard: {}", this.owningFile.getFile().getFilePath(), this.namespace, VALID_LABEL.pattern()); + throw new InvalidModFileException("Invalid override namespace found : "+ this.namespace, owningFile); + } this.version = modConfig.getOptional("version"). map(s->StringSubstitutor.replace(s, owningFile != null ? owningFile.getFile() : null )). map(DefaultArtifactVersion::new).orElse(DEFAULT_VERSION); @@ -102,6 +118,16 @@ public class ModInfo implements IModInfo return this.modConfig; } + @Override + public String getNamespace() { + return this.namespace; + } + + @Override + public Map getModProperties() { + return this.properties; + } + public Optional getLogoFile() { return this.owningFile != null ? this.owningFile.getConfig().getOptional("logoFile") : this.modConfig.getOptional("logoFile"); diff --git a/src/main/java/net/minecraftforge/fml/ModContainer.java b/src/main/java/net/minecraftforge/fml/ModContainer.java index 09f18db6e..128107c86 100644 --- a/src/main/java/net/minecraftforge/fml/ModContainer.java +++ b/src/main/java/net/minecraftforge/fml/ModContainer.java @@ -29,7 +29,6 @@ import java.util.Map; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.regex.Pattern; /** * The container that wraps around mods in the system. @@ -46,8 +45,8 @@ import java.util.regex.Pattern; public abstract class ModContainer { - private static final Pattern VALID_MODIDS = Pattern.compile("^[a-z0-9_-]{3,64}$"); protected final String modId; + protected final String namespace; protected final IModInfo modInfo; protected ModLoadingStage modLoadingStage; protected final Map> triggerMap; @@ -55,9 +54,9 @@ public abstract class ModContainer public ModContainer(IModInfo info) { - if (!VALID_MODIDS.matcher(info.getModId()).matches()) - throw new IllegalArgumentException("Invalid modid " + info.getModId() + "! Mod ids need to be lowercase alphanumeric characters or '-'/'_' and need to be between 3 and 64 chars long."); this.modId = info.getModId(); + // TODO: Currently not reading namespace from configuration.. + this.namespace = this.modId; this.modInfo = info; this.triggerMap = new HashMap<>(); this.modLoadingStage = ModLoadingStage.CONSTRUCT; @@ -74,9 +73,9 @@ public abstract class ModContainer /** * @return the resource prefix for the mod */ - public final String getPrefix() + public final String getNamespace() { - return modId; + return namespace; } /** diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java index ba0a1acc7..e11720e34 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java @@ -276,7 +276,7 @@ public class ForgeRegistry> implements IForgeRe int add(int id, V value) { - final String owner = ModThreadContext.get().getActiveContainer().getPrefix(); + final String owner = ModThreadContext.get().getActiveContainer().getNamespace(); return add(id, value, owner); } diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index 91b4d47ba..9519fb3dd 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -56,7 +56,6 @@ import org.apache.logging.log4j.MarkerManager; import javax.annotation.Nullable; import java.lang.reflect.Field; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -821,7 +820,7 @@ public class GameData int index = name.lastIndexOf(':'); String oldPrefix = index == -1 ? "" : name.substring(0, index).toLowerCase(Locale.ROOT); name = index == -1 ? name : name.substring(index + 1); - String prefix = ModThreadContext.get().getActiveContainer().getPrefix(); + String prefix = ModThreadContext.get().getActiveContainer().getNamespace(); if (!oldPrefix.equals(prefix) && oldPrefix.length() > 0) { LogManager.getLogger().info("Potentially Dangerous alternative prefix `{}` for name `{}`, expected `{}`. This could be a intended override, but in most cases indicates a broken mod.", oldPrefix, name, prefix);