diff --git a/src/main/java/ru/bclib/util/ModUtil.java b/src/main/java/ru/bclib/util/ModUtil.java index 0dd8e733..05c0b596 100644 --- a/src/main/java/ru/bclib/util/ModUtil.java +++ b/src/main/java/ru/bclib/util/ModUtil.java @@ -1,22 +1,36 @@ package ru.bclib.util; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.SemanticVersion; import net.fabricmc.loader.api.Version; +import net.fabricmc.loader.api.VersionParsingException; +import net.fabricmc.loader.api.metadata.ContactInformation; +import net.fabricmc.loader.api.metadata.CustomValue; +import net.fabricmc.loader.api.metadata.ModDependency; +import net.fabricmc.loader.api.metadata.ModEnvironment; import net.fabricmc.loader.api.metadata.ModMetadata; -import net.fabricmc.loader.impl.metadata.ModMetadataParser; +import net.fabricmc.loader.api.metadata.Person; +import net.fabricmc.loader.util.version.SemanticVersionImpl; import org.apache.logging.log4j.LogManager; import ru.bclib.BCLib; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; -import java.util.LinkedList; import java.util.Locale; import java.util.Map; import java.util.Optional; @@ -57,8 +71,11 @@ public class ModUtil { Path modMetaFile = fs.getPath("fabric.mod.json"); if (modMetaFile != null) { try (InputStream is = Files.newInputStream(modMetaFile)) { - ModMetadata mc = ModMetadataParser.parseMetadata(is, uri.toString(), new LinkedList()); - mods.put(mc.getId(), new ModInfo(mc, file)); + //ModMetadata mc = ModMetadataParser.parseMetadata(is, uri.toString(), new LinkedList()); + ModMetadata mc = readJSON(is, uri.toString()); + if (mc!=null){ + mods.put(mc.getId(), new ModInfo(mc, file)); + } } } } catch (Exception e) { @@ -74,6 +91,160 @@ public class ModUtil { return mods; } + private static ModMetadata readJSON(InputStream is, String sourceFile) throws IOException { + try (com.google.gson.stream.JsonReader reader = new JsonReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + JsonObject data = new JsonParser().parse(reader).getAsJsonObject(); + Version ver; + try { + ver = new SemanticVersionImpl(data.get("version").getAsString(), false); + } + catch (VersionParsingException e) { + BCLib.LOGGER.error("Unable to parse Version in " + sourceFile); + return null; + } + + if (data.get("id") == null){ + BCLib.LOGGER.error("Unable to read ID in " + sourceFile); + return null; + } + + if (data.get("name") == null){ + BCLib.LOGGER.error("Unable to read name in " + sourceFile); + return null; + } + + return new ModMetadata() { + @Override + public Version getVersion() { + return ver; + } + @Override + public String getType() { + return "fabric"; + } + + @Override + public String getId() { + return data.get("id").getAsString(); + } + + @Override + public Collection getProvides() { + return new ArrayList<>(); + } + + @Override + public ModEnvironment getEnvironment() { + JsonElement env = data.get("environment"); + if (env==null) { + BCLib.LOGGER.error("No environment specified in " + sourceFile); + return ModEnvironment.UNIVERSAL; + } + final String environment = env.getAsString().toLowerCase(Locale.ROOT); + + if (environment.isEmpty() || environment.equals("*") || environment.equals("common")) { + return ModEnvironment.UNIVERSAL; + } else if (environment.equals("client")) { + return ModEnvironment.CLIENT; + } else if (environment.equals("server")) { + return ModEnvironment.SERVER; + } else { + BCLib.LOGGER.error("Unable to read environment in " + sourceFile); + return ModEnvironment.UNIVERSAL; + } + } + + @Override + public Collection getDepends() { + return new ArrayList<>(); + } + + @Override + public Collection getRecommends() { + return new ArrayList<>(); + } + + @Override + public Collection getSuggests() { + return new ArrayList<>(); + } + + @Override + public Collection getConflicts() { + return new ArrayList<>(); + } + + @Override + public Collection getBreaks() { + return new ArrayList<>(); + } + + public Collection getDependencies() { + return new ArrayList<>(); + } + + @Override + public String getName() { + return data.get("name").getAsString(); + } + + @Override + public String getDescription() { + return ""; + } + + @Override + public Collection getAuthors() { + return new ArrayList<>(); + } + + @Override + public Collection getContributors() { + return new ArrayList<>(); + } + + @Override + public ContactInformation getContact() { + return null; + } + + @Override + public Collection getLicense() { + return new ArrayList<>(); + } + + @Override + public Optional getIconPath(int size) { + return Optional.empty(); + } + + @Override + public boolean containsCustomValue(String key) { + return false; + } + + @Override + public CustomValue getCustomValue(String key) { + return null; + } + + @Override + public Map getCustomValues() { + return new HashMap<>(); + } + + @Override + public boolean containsCustomElement(String key) { + return false; + } + + public JsonElement getCustomElement(String key) { + return null; + } + }; + } + } + /** * Returns the {@link ModInfo} or {@code null} if the mod was not found. *

diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c059350d..d49eb0a9 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ "bclib.mixins.client.json" ], "depends": { - "fabricloader": ">=0.12.4", + "fabricloader": ">=0.11.6", "fabric": ">=0.41.0", "minecraft": ">=1.17.1" },