Compare commits

...

12 Commits

Author SHA1 Message Date
32937d0bc2
chore: update to FLoader 1.16.1
Some checks failed
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline failed
2024-08-15 15:55:43 +02:00
cae4b0b4db
chore: update to 1.21
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2024-06-14 14:28:55 +02:00
9bb5c4b87c
chore: update to 1.20.5
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2024-04-25 22:36:13 +02:00
c008ce3868
chore: update to 1.20.4
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2023-12-07 20:54:13 +01:00
2954301ea8
chore: update to 1.20.2
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2023-09-22 21:20:53 +02:00
3c4fab0afc
Bump to 1.20
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2023-06-09 17:33:21 +02:00
291b2704fe
Bump to 1.19.4
Some checks failed
ci/woodpecker/push/jfmod Pipeline failed
ci/woodpecker/tag/jfmod Pipeline was successful
2023-03-14 21:49:33 +01:00
8251b26791
Use new config compiler
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2022-12-29 16:05:35 +01:00
0b81b5237b
Update to 1.19.3
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2022-12-07 22:34:30 +01:00
3bf5c852e5
Update FMJ
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2022-12-02 17:24:15 +01:00
135003faf8
Update to new infrastructure 2022-12-02 17:23:28 +01:00
72ebde914e
Update to LibJF 3 2022-08-28 16:47:28 +02:00
11 changed files with 103 additions and 86 deletions

View File

@ -1,2 +0,0 @@
include:
- remote: 'https://jfmods.gitlab.io/scripts/jfmod.yml'

1
.woodpecker.yml Normal file
View File

@ -0,0 +1 @@
#link https://pages.frohnmeyer-wds.de/scripts/jfmod.yml

View File

@ -1,10 +0,0 @@
apply from: "https://jfmods.gitlab.io/scripts/jfmod.gradle"
dependencies {
modImplementation("io.gitlab.jfronny.libjf:libjf-config-v0:${project.jfapi_version}")
modImplementation "com.terraformersmc:modmenu:4.0.5"
// Compat fix
modImplementation(fabricApi.module("fabric-command-api-v2", "${project.fabric_version}"))
}

43
build.gradle.kts Normal file
View File

@ -0,0 +1,43 @@
plugins {
id("jfmod") version "1.6-SNAPSHOT"
}
allprojects { group = "io.gitlab.jfronny" }
base.archivesName = "modsmod"
val commonsVersion = "2.0.0-SNAPSHOT"
jfMod {
minecraftVersion = "1.21.1"
yarn("build.3")
loaderVersion = "0.16.1"
libJfVersion = "3.17.0"
fabricApiVersion = "0.102.1+1.21.1"
modrinth {
projectId = "modsmod"
requiredDependencies.add("libjf")
optionalDependencies.add("modmenu")
}
curseforge {
projectId = "405095"
requiredDependencies.add("libjf")
optionalDependencies.add("modmenu")
}
}
dependencies {
modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2")
modImplementation("io.gitlab.jfronny.libjf:libjf-unsafe-v0")
compileOnly("io.gitlab.jfronny:commons-serialize-generator-annotations:$commonsVersion")
annotationProcessor("io.gitlab.jfronny:commons-serialize-generator:$commonsVersion")
// Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny")
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil")
modLocalRuntime("com.terraformersmc:modmenu:11.0.1")
// for modmenu
modLocalRuntime("net.fabricmc.fabric-api:fabric-resource-loader-v0")
modLocalRuntime("net.fabricmc.fabric-api:fabric-screen-api-v1")
modLocalRuntime("net.fabricmc.fabric-api:fabric-key-binding-api-v1")
}

View File

@ -1,17 +0,0 @@
# https://fabricmc.net/develop/
minecraft_version=1.19.1
yarn_mappings=build.1
loader_version=0.14.8
# Mod Properties
maven_group=io.gitlab.jfronny
archives_base_name=modsmod
jfapi_version=2.10.0
fabric_version=0.58.5+1.19.1
modrinth_id=modsmod
modrinth_required_dependencies=libjf
modrinth_optional_dependencies=modmenu
curseforge_id=405095
curseforge_required_dependencies=libjf
curseforge_optional_dependencies=modmenu

9
settings.gradle.kts Normal file
View File

@ -0,0 +1,9 @@
pluginManagement {
repositories {
maven("https://maven.frohnmeyer-wds.de/mirrors")
maven("https://maven.neoforged.net/releases")
gradlePluginPortal()
}
}
rootProject.name = "modsmod"

View File

@ -1,15 +1,13 @@
package io.gitlab.jfronny.modsmod; package io.gitlab.jfronny.modsmod;
import io.gitlab.jfronny.gson.reflect.TypeToken; import io.gitlab.jfronny.commons.serialize.databind.api.TypeToken;
import io.gitlab.jfronny.modsmod.util.IteratorCallbackList; import io.gitlab.jfronny.modsmod.util.IteratorCallbackList;
import net.fabricmc.loader.impl.FabricLoaderImpl; import net.fabricmc.loader.impl.FabricLoaderImpl;
import net.fabricmc.loader.impl.ModContainerImpl; import net.fabricmc.loader.impl.ModContainerImpl;
import net.fabricmc.loader.impl.discovery.ModCandidate; import net.fabricmc.loader.impl.discovery.ModCandidateImpl;
import net.fabricmc.loader.impl.metadata.LoaderModMetadata; import net.fabricmc.loader.impl.metadata.LoaderModMetadata;
import java.lang.reflect.Field; import java.lang.reflect.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -21,13 +19,13 @@ public class FabricLoaderInterface {
static { static {
try { try {
ADD_MOD_METHOD = FabricLoaderImpl.class.getDeclaredMethod("addMod", ModCandidate.class); ADD_MOD_METHOD = FabricLoaderImpl.class.getDeclaredMethod("addMod", ModCandidateImpl.class);
ADD_MOD_METHOD.setAccessible(true); ADD_MOD_METHOD.setAccessible(true);
MODS_FIELD = FabricLoaderImpl.class.getDeclaredField("mods"); MODS_FIELD = FabricLoaderImpl.class.getDeclaredField("mods");
MODS_FIELD.setAccessible(true); MODS_FIELD.setAccessible(true);
CREATE_PLAIN_METHOD = ModCandidate.class.getDeclaredMethod("createPlain", new TypeToken<List<Path>>(){}.getRawType(), LoaderModMetadata.class, boolean.class, new TypeToken<Collection<ModCandidate>>(){}.getRawType()); CREATE_PLAIN_METHOD = ModCandidateImpl.class.getDeclaredMethod("createPlain", new TypeToken<List<Path>>(){}.getRawType(), LoaderModMetadata.class, boolean.class, new TypeToken<Collection<ModCandidateImpl>>(){}.getRawType());
CREATE_PLAIN_METHOD.setAccessible(true); CREATE_PLAIN_METHOD.setAccessible(true);
} catch (NoSuchMethodException | NoSuchFieldException e) { } catch (NoSuchMethodException | NoSuchFieldException e) {
throw new IllegalStateException("Failed to get reference to fabric loader internals. This fabric loader version is probably unsupported by modsmod", e); throw new IllegalStateException("Failed to get reference to fabric loader internals. This fabric loader version is probably unsupported by modsmod", e);
@ -48,7 +46,7 @@ public class FabricLoaderInterface {
} }
} }
public static void addMod(FabricLoaderImpl fabricLoader, ModCandidate modCandidate) { public static void addMod(FabricLoaderImpl fabricLoader, ModCandidateImpl modCandidate) {
try { try {
ADD_MOD_METHOD.invoke(fabricLoader, modCandidate); ADD_MOD_METHOD.invoke(fabricLoader, modCandidate);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
@ -56,9 +54,9 @@ public class FabricLoaderInterface {
} }
} }
public static ModCandidate createPlain(Path path, LoaderModMetadata metadata, boolean requiresRemap, Collection<ModCandidate> nestedMods) { public static ModCandidateImpl createPlain(Path path, LoaderModMetadata metadata, boolean requiresRemap, Collection<ModCandidateImpl> nestedMods) {
try { try {
return (ModCandidate) CREATE_PLAIN_METHOD.invoke(null, List.of(path), metadata, requiresRemap, nestedMods); return (ModCandidateImpl) CREATE_PLAIN_METHOD.invoke(null, List.of(path), metadata, requiresRemap, nestedMods);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("Failed to create plain mod container", e); throw new IllegalStateException("Failed to create plain mod container", e);
} }

View File

@ -1,39 +1,34 @@
package io.gitlab.jfronny.modsmod; package io.gitlab.jfronny.modsmod;
import io.gitlab.jfronny.commons.log.*; import io.gitlab.jfronny.commons.logger.SystemLoggerPlus;
import io.gitlab.jfronny.gson.Gson; import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.ConfigInstanceRoot;
import io.gitlab.jfronny.libjf.unsafe.UltraEarlyInit; import io.gitlab.jfronny.libjf.unsafe.UltraEarlyInit;
import io.gitlab.jfronny.modsmod.builder.JsonBuilder; import io.gitlab.jfronny.modsmod.builder.JsonBuilder;
import io.gitlab.jfronny.modsmod.builder.ModMeta; import io.gitlab.jfronny.modsmod.builder.ModMeta;
import io.gitlab.jfronny.modsmod.util.IOUtil; import io.gitlab.jfronny.modsmod.util.IOUtil;
import net.fabricmc.loader.api.*; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.impl.FabricLoaderImpl; import net.fabricmc.loader.impl.FabricLoaderImpl;
import net.fabricmc.loader.impl.metadata.*; import net.fabricmc.loader.impl.metadata.*;
import net.fabricmc.loader.impl.util.FileSystemUtil; import net.fabricmc.loader.impl.util.FileSystemUtil;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileSystem; import java.nio.file.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
public class ModsMod implements UltraEarlyInit { public class ModsMod implements UltraEarlyInit {
static final HashSet<ModMeta> MODS = new HashSet<>(); static final HashSet<ModMeta> MODS = new HashSet<>();
static final FabricLoaderImpl LOADER = FabricLoaderImpl.INSTANCE; static final FabricLoaderImpl LOADER = FabricLoaderImpl.INSTANCE;
public static final Gson GSON = new Gson();
public static final String MOD_ID = "modsmod"; public static final String MOD_ID = "modsmod";
public static final Logger LOGGER = Logger.forName(MOD_ID); public static final SystemLoggerPlus LOGGER = SystemLoggerPlus.forName(MOD_ID);
private static final String CACHE_NAME = MOD_ID + "cache"; private static final String CACHE_NAME = MOD_ID + "cache";
@Override @Override
public void init() { public void init() {
try { try {
JFC_ModsModConfig.ensureInitialized();
//Load config //Load config
Path modsmodCfgFile = ((ConfigInstanceRoot)ConfigInstance.get(MOD_ID)).path; Path modsmodCfgFile = ConfigInstance.get(MOD_ID).getFilePath().orElseThrow();
//make sure the modsmodcache dir is ok //make sure the modsmodcache dir is ok
Path path = LOADER.getConfigDir().resolve(CACHE_NAME); Path path = LOADER.getConfigDir().resolve(CACHE_NAME);
if (!Files.isDirectory(path)) { if (!Files.isDirectory(path)) {
@ -92,7 +87,8 @@ public class ModsMod implements UltraEarlyInit {
meta.url.toString(), meta.url.toString(),
new ArrayList<>(), new ArrayList<>(),
new VersionOverrides(), new VersionOverrides(),
new DependencyOverrides(FabricLoader.getInstance().getConfigDir())); new DependencyOverrides(FabricLoader.getInstance().getConfigDir()),
false);
FabricLoaderInterface.addMod(LOADER, FabricLoaderInterface.createPlain(meta.rootPath, info, false, new HashSet<>())); FabricLoaderInterface.addMod(LOADER, FabricLoaderInterface.createPlain(meta.rootPath, info, false, new HashSet<>()));
} catch (IOException | ParseMetadataException e) { } catch (IOException | ParseMetadataException e) {
throw new IllegalStateException(e); throw new IllegalStateException(e);

View File

@ -1,13 +1,15 @@
package io.gitlab.jfronny.modsmod; package io.gitlab.jfronny.modsmod;
import io.gitlab.jfronny.libjf.config.api.JfConfig; import io.gitlab.jfronny.libjf.config.api.v2.Entry;
import io.gitlab.jfronny.libjf.config.api.Entry; import io.gitlab.jfronny.libjf.config.api.v2.JfConfig;
public class ModsModConfig implements JfConfig { @JfConfig
@Entry public class ModsModConfig {
public static Boolean parent = false; @Entry public static boolean parent = false;
@Entry @Entry public static boolean cache = true;
public static Boolean cache = true; @Entry public static int modsCount = 26;
@Entry
public static Integer modsCount = 26; static {
JFC_ModsModConfig.ensureInitialized();
}
} }

View File

@ -1,5 +1,8 @@
package io.gitlab.jfronny.modsmod.builder; package io.gitlab.jfronny.modsmod.builder;
import io.gitlab.jfronny.commons.serialize.generator.annotations.GPrefer;
import io.gitlab.jfronny.commons.serialize.generator.annotations.GSerializable;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.modsmod.ModsMod; import io.gitlab.jfronny.modsmod.ModsMod;
import java.io.BufferedWriter; import java.io.BufferedWriter;
@ -12,27 +15,21 @@ import java.util.Map;
public class JsonBuilder { public class JsonBuilder {
public static void build(int number, Path outputPath, boolean parent) throws IOException { public static void build(int number, Path outputPath, boolean parent) throws IOException {
try (BufferedWriter bw = Files.newBufferedWriter(outputPath)) { try (BufferedWriter bw = Files.newBufferedWriter(outputPath)) {
ModsMod.GSON.toJson(new ModManifest(number, parent), bw); GC_JsonBuilder.ModManifest.serialize(new ModManifest(number, parent), bw, LibJf.JSON_TRANSPORT);
} }
} }
@SuppressWarnings("unused") @GSerializable
private static class ModManifest { public record ModManifest(int schemaVersion, String id, String version, String name, Map<String, ModMenuData> custom) {
public final int schemaVersion = 1; @GPrefer
public final String id; public ModManifest {
public final String version = "1.0"; }
public final String name;
public final Map<String, ModMenuData> custom = new HashMap<>();
public ModManifest(int number, boolean parent) { public ModManifest(int number, boolean parent) {
id = "modmod_" + number; this(1, "modmod_" + number, "1.0", "ModsMod " + number, parent ? Map.of("modmenu", new ModMenuData("modsmod")) : Map.of());
name = "ModsMod " + number;
if (parent)
custom.put("modmenu", new ModMenuData());
} }
public static class ModMenuData { @GSerializable
public final String parent = "modsmod"; public record ModMenuData(String parent) { }
}
} }
} }

View File

@ -1,27 +1,27 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"id": "modsmod", "id": "modsmod",
"version": "${version}",
"name": "ModsMod", "name": "ModsMod",
"version": "${version}",
"description": "Dynamically creates and loads empty mods", "description": "Dynamically creates and loads empty mods",
"authors": [ "authors": ["JFronny"],
"JFronny"
],
"contact": { "contact": {
"website": "https://jfronny.gitlab.io", "email": "projects.contact@frohnmeyer-wds.de",
"repo": "https://www.gitlab.com/jfmods/ModsMod" "homepage": "https://jfronny.gitlab.io",
"issues": "https://git.frohnmeyer-wds.de/JfMods/ModsMod/issues",
"sources": "https://git.frohnmeyer-wds.de/JfMods/ModsMod"
}, },
"license": "MIT", "license": "MIT",
"icon": "assets/modsmod/icon.png", "icon": "assets/modsmod/icon.png",
"environment": "*", "environment": "*",
"entrypoints": { "entrypoints": {
"libjf:config": ["io.gitlab.jfronny.modsmod.ModsModConfig"], "libjf:config": ["io.gitlab.jfronny.modsmod.JFC_ModsModConfig"],
"libjf:early": ["io.gitlab.jfronny.modsmod.ModsMod"] "libjf:early": ["io.gitlab.jfronny.modsmod.ModsMod"]
}, },
"depends": { "depends": {
"fabricloader": ">=0.13.3", "fabricloader": ">=0.16.1",
"libjf-config-v0": ">=2.5.0", "libjf-config-core-v1": ">=3.0.3",
"libjf-unsafe-v0": ">=2.5.0", "libjf-unsafe-v0": ">=3.0.3",
"minecraft": "*" "minecraft": "*"
} }
} }