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 <cpw+github@weeksfamily.ca>
This commit is contained in:
cpw 2019-01-20 21:26:31 -05:00
parent eefc4d3e84
commit 040cc4bf16
No known key found for this signature in database
GPG Key ID: 8EB3DF749553B1B7
7 changed files with 45 additions and 13 deletions

View File

@ -261,7 +261,7 @@ project(':forge') {
installer 'cpw.mods:modlauncher:0.6.0' installer 'cpw.mods:modlauncher:0.6.0'
installer 'net.minecraftforge:accesstransformers:0.14.+:shadowed' installer 'net.minecraftforge:accesstransformers:0.14.+:shadowed'
installer 'net.minecraftforge:eventbus:0.6.+:service' 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 'net.minecraftforge:coremods:0.2.+'
installer 'com.electronwill.night-config:core:3.4.2' installer 'com.electronwill.night-config:core:3.4.2'
installer 'com.electronwill.night-config:toml:3.4.2' installer 'com.electronwill.night-config:toml:3.4.2'

View File

@ -25,13 +25,16 @@ key="value"
This is my mod, there may be This is my mod, there may be
others, but this one is mine 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 # A random extra property for a mod loader
randomExtraProperty="somevalue" randomExtraProperty="somevalue"
# Arbitrary key-value pairs # Arbitrary key-value pairs
[inventorysorter.properties] [modproperties.inventorysorter]
key="value" key="value"
# A list of dependencies # A list of dependencies
[[inventorysorter.dependencies]] [[dependencies.inventorysorter]]
# the modid of the dependency # the modid of the dependency
modid="forge" modid="forge"
# Does this dependency have to exist - if not, ordering below must be specified # 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 this dependency is applied on - BOTH, CLIENT or SERVER
side="BOTH" side="BOTH"
# Here's another dependency # Here's another dependency
[[inventorysorter.dependencies]] [[dependencies.inventorysorter]]
modid="minecraft" modid="minecraft"
mandatory=true mandatory=true
versionRange="[1.12.2]" versionRange="[1.12.2]"

View File

@ -98,6 +98,11 @@ public class ModFileInfo implements IModFileInfo
return modLoaderVersion; return modLoaderVersion;
} }
@Override
public Map<String, Object> getFileProperties() {
return this.properties;
}
public Optional<Manifest> getManifest() { public Optional<Manifest> getManifest() {
return modFile.getLocator().findManifest(modFile.getFilePath()); return modFile.getLocator().findManifest(modFile.getFilePath());
} }

View File

@ -28,16 +28,23 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors; 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.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
public class ModInfo implements IModInfo public class ModInfo implements IModInfo
{ {
private static final Logger LOGGER = LogManager.getLogger();
private static final DefaultArtifactVersion DEFAULT_VERSION = new DefaultArtifactVersion("1"); 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 ModFileInfo owningFile;
private final String modId; private final String modId;
private final String namespace;
private final ArtifactVersion version; private final ArtifactVersion version;
private final String displayName; private final String displayName;
private final String description; private final String description;
@ -50,6 +57,15 @@ public class ModInfo implements IModInfo
this.owningFile = owningFile; this.owningFile = owningFile;
this.modConfig = modConfig; this.modConfig = modConfig;
this.modId = modConfig.<String>getOptional("modId").orElseThrow(() -> new InvalidModFileException("Missing modId entry", owningFile)); this.modId = modConfig.<String>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.<String>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.<String>getOptional("version"). this.version = modConfig.<String>getOptional("version").
map(s->StringSubstitutor.replace(s, owningFile != null ? owningFile.getFile() : null )). map(s->StringSubstitutor.replace(s, owningFile != null ? owningFile.getFile() : null )).
map(DefaultArtifactVersion::new).orElse(DEFAULT_VERSION); map(DefaultArtifactVersion::new).orElse(DEFAULT_VERSION);
@ -102,6 +118,16 @@ public class ModInfo implements IModInfo
return this.modConfig; return this.modConfig;
} }
@Override
public String getNamespace() {
return this.namespace;
}
@Override
public Map<String, Object> getModProperties() {
return this.properties;
}
public Optional<String> getLogoFile() public Optional<String> getLogoFile()
{ {
return this.owningFile != null ? this.owningFile.getConfig().getOptional("logoFile") : this.modConfig.getOptional("logoFile"); return this.owningFile != null ? this.owningFile.getConfig().getOptional("logoFile") : this.modConfig.getOptional("logoFile");

View File

@ -29,7 +29,6 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.regex.Pattern;
/** /**
* The container that wraps around mods in the system. * The container that wraps around mods in the system.
@ -46,8 +45,8 @@ import java.util.regex.Pattern;
public abstract class ModContainer public abstract class ModContainer
{ {
private static final Pattern VALID_MODIDS = Pattern.compile("^[a-z0-9_-]{3,64}$");
protected final String modId; protected final String modId;
protected final String namespace;
protected final IModInfo modInfo; protected final IModInfo modInfo;
protected ModLoadingStage modLoadingStage; protected ModLoadingStage modLoadingStage;
protected final Map<ModLoadingStage, Consumer<LifecycleEventProvider.LifecycleEvent>> triggerMap; protected final Map<ModLoadingStage, Consumer<LifecycleEventProvider.LifecycleEvent>> triggerMap;
@ -55,9 +54,9 @@ public abstract class ModContainer
public ModContainer(IModInfo info) 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(); this.modId = info.getModId();
// TODO: Currently not reading namespace from configuration..
this.namespace = this.modId;
this.modInfo = info; this.modInfo = info;
this.triggerMap = new HashMap<>(); this.triggerMap = new HashMap<>();
this.modLoadingStage = ModLoadingStage.CONSTRUCT; this.modLoadingStage = ModLoadingStage.CONSTRUCT;
@ -74,9 +73,9 @@ public abstract class ModContainer
/** /**
* @return the resource prefix for the mod * @return the resource prefix for the mod
*/ */
public final String getPrefix() public final String getNamespace()
{ {
return modId; return namespace;
} }
/** /**

View File

@ -276,7 +276,7 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
int add(int id, V value) 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); return add(id, value, owner);
} }

View File

@ -56,7 +56,6 @@ import org.apache.logging.log4j.MarkerManager;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -821,7 +820,7 @@ public class GameData
int index = name.lastIndexOf(':'); int index = name.lastIndexOf(':');
String oldPrefix = index == -1 ? "" : name.substring(0, index).toLowerCase(Locale.ROOT); String oldPrefix = index == -1 ? "" : name.substring(0, index).toLowerCase(Locale.ROOT);
name = index == -1 ? name : name.substring(index + 1); 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) 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); 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);