diff --git a/build.gradle b/build.gradle index 2587bb6..72560c0 100644 --- a/build.gradle +++ b/build.gradle @@ -11,18 +11,17 @@ archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group +repositories { + maven { url = "https://maven.terraformersmc.com/"; name = "ModMenu" } +} + dependencies { - //to change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - - // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. - // You may need to force-disable transitiveness on them. - modCompile("io.github.prospector:modmenu:1.14.9+build.14") + modCompile "com.terraformersmc:modmenu:1.16.7" } processResources { diff --git a/gradle.properties b/gradle.properties index 4032e04..5837ba6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.16.4 -yarn_mappings=1.16.4+build.7 -loader_version=0.10.8 +minecraft_version=1.16.5 +yarn_mappings=1.16.5+build.4 +loader_version=0.11.1 # Mod Properties -mod_version=1.2.0 +mod_version=1.3.0 maven_group=io.gitlab.jfronny archives_base_name=resclone # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.25.1+build.416-1.16 +fabric_version=0.30.3+1.16 diff --git a/src/main/java/io/gitlab/jfronny/resclone/Resclone.java b/src/main/java/io/gitlab/jfronny/resclone/Resclone.java index f527c68..f1e0f68 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/Resclone.java +++ b/src/main/java/io/gitlab/jfronny/resclone/Resclone.java @@ -31,6 +31,7 @@ public class Resclone implements ModInitializer, RescloneApi { @Override public void onInitialize() { + System.out.println("[resclone] Beginning init, will download packs"); conf.clear(); fetcherInstances.clear(); processors.clear(); @@ -45,6 +46,7 @@ public class Resclone implements ModInitializer, RescloneApi { } addProcessor(new RemoveEmptyProcessor()); reload(); + System.out.println("[resclone] Completed"); } @Override diff --git a/src/main/java/io/gitlab/jfronny/resclone/data/CfAddon.java b/src/main/java/io/gitlab/jfronny/resclone/data/CfAddon.java new file mode 100644 index 0000000..9f96bf9 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/resclone/data/CfAddon.java @@ -0,0 +1,9 @@ +package io.gitlab.jfronny.resclone.data; + +import java.util.Set; + +public class CfAddon { + public String downloadUrl; + public String fileDate; + public Set gameVersion; +} diff --git a/src/main/java/io/gitlab/jfronny/resclone/fetchers/CurseforgeFetcher.java b/src/main/java/io/gitlab/jfronny/resclone/fetchers/CurseforgeFetcher.java index 27c243a..3b16739 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/fetchers/CurseforgeFetcher.java +++ b/src/main/java/io/gitlab/jfronny/resclone/fetchers/CurseforgeFetcher.java @@ -1,8 +1,11 @@ package io.gitlab.jfronny.resclone.fetchers; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; +import io.gitlab.jfronny.resclone.data.CfAddon; import io.gitlab.jfronny.resclone.data.RescloneException; +import net.minecraft.MinecraftVersion; + +import java.text.SimpleDateFormat; +import java.util.Date; public class CurseforgeFetcher extends PackFetcher { @Override @@ -13,8 +16,31 @@ public class CurseforgeFetcher extends PackFetcher { @Override public String getDownloadUrl(String baseUrl) throws RescloneException { try { - JsonObject latest = (JsonObject)readJsonFromURL("https://addons-ecs.forgesvc.net/api/v2/addon/" + baseUrl + "/files", JsonArray.class).get(0); - return latest.get("downloadUrl").getAsString(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'"); + + String version = MinecraftVersion.field_25319.getName(); + + CfAddon latest = null; + Date latestDate = null; + boolean foundMatchingVersion = false; + + for (CfAddon addon : readJsonFromURLSet("https://addons-ecs.forgesvc.net/api/v2/addon/" + baseUrl + "/files", CfAddon.class)) { + Date d = df.parse(addon.fileDate); + if (foundMatchingVersion && !addon.gameVersion.contains(version)) + continue; + if (!foundMatchingVersion && addon.gameVersion.contains(version)) { + foundMatchingVersion = true; + latest = null; + } + if (latest == null || d.after(latestDate)) { + latest = addon; + latestDate = d; + } + } + + if (!foundMatchingVersion) + System.err.println("Could not find pack for matching version, using latest"); + return latest.downloadUrl; } catch (Throwable e) { throw new RescloneException("Could not get CF download for " + baseUrl, e); } diff --git a/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java b/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java index caced0d..11d1f93 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java +++ b/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java @@ -1,6 +1,7 @@ package io.gitlab.jfronny.resclone.fetchers; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import io.gitlab.jfronny.resclone.Resclone; import io.gitlab.jfronny.resclone.data.RescloneException; @@ -12,6 +13,7 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Scanner; +import java.util.Set; public abstract class PackFetcher { abstract public String getSourceTypeName(); // The name for users to specify in the config @@ -41,8 +43,13 @@ public abstract class PackFetcher { return gson.fromJson(readStringFromURL(requestUrl), classOfT); } + public Set readJsonFromURLSet(String requestUrl, Class classOfT) throws IOException { + return gson.fromJson(readStringFromURL(requestUrl), TypeToken.getParameterized(Set.class, classOfT).getType()); + } + public void get(String baseUrl, Path targetPath) throws RescloneException { String url = getDownloadUrl(baseUrl); + System.out.println("Downloading pack " + url); try (InputStream is = new URL(url).openStream()) { FileOutputStream os = new FileOutputStream(targetPath.toFile()); byte[] dataBuffer = new byte[1024]; @@ -50,6 +57,7 @@ public abstract class PackFetcher { while ((bytesRead = is.read(dataBuffer, 0, 1024)) != -1) { os.write(dataBuffer, 0, bytesRead); } + System.out.println("Completed download"); } catch (Throwable e) { throw new RescloneException("Could not download pack", e); diff --git a/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java b/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java index df8163c..975683c 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java +++ b/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java @@ -21,21 +21,23 @@ public class PruneVanillaProcessor extends PackProcessor { public void process(FileSystem p) throws RescloneException { ClassLoader cl = MinecraftClient.class.getClassLoader(); try { - Files.walkFileTree(p.getPath("/assets/minecraft"), new PathPruneVisitor((s) -> { - if (Files.isDirectory(s)) - return false; - try { - InputStream vn = cl.getResourceAsStream(p.getPath("/").relativize(s).toString()); - if (vn != null) { - InputStream pk = Files.newInputStream(s, StandardOpenOption.READ); - return IOUtils.contentEquals(vn, pk); + if (Files.isDirectory(p.getPath("/assets/minecraft"))) { + Files.walkFileTree(p.getPath("/assets/minecraft"), new PathPruneVisitor((s) -> { + if (Files.isDirectory(s)) + return false; + try { + InputStream vn = cl.getResourceAsStream(p.getPath("/").relativize(s).toString()); + if (vn != null) { + InputStream pk = Files.newInputStream(s, StandardOpenOption.READ); + return IOUtils.contentEquals(vn, pk); + } } - } - catch (Throwable e) { - e.printStackTrace(); - } - return false; - })); + catch (Throwable e) { + e.printStackTrace(); + } + return false; + })); + } } catch (IOException e) { throw new RescloneException("Could not prune vanilla files", e); }