Migrate to FabricLoader 0.12.0
This commit is contained in:
parent
9024376f8c
commit
e50daa1b80
|
@ -11,7 +11,6 @@ plugins {
|
|||
|
||||
def ENV = System.getenv()
|
||||
ext.isPublicMaven = project.hasProperty('publicMaven')
|
||||
version = "$project.mod_version" + (project.hasProperty('pipeline') ? "+" + project.getProperty('pipeline') : "")
|
||||
|
||||
static Node getOrCreateNode(Node node, String name) {
|
||||
Node dependencies = null
|
||||
|
@ -62,6 +61,7 @@ allprojects {
|
|||
}
|
||||
|
||||
group = "io.gitlab.jfronny.libjf"
|
||||
version = "$project.mod_version" + (project.hasProperty('pipeline') ? "+" + project.getProperty('pipeline') : "")
|
||||
|
||||
sourceSets {
|
||||
testmod {
|
||||
|
@ -92,7 +92,7 @@ allprojects {
|
|||
mappings "net.fabricmc:yarn:${project.minecraft_version}+${project.yarn_mappings}:v2"
|
||||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||
|
||||
modImplementation "com.terraformersmc:modmenu:2.0.10"
|
||||
modImplementation "com.terraformersmc:modmenu:3.0.0"
|
||||
include modImplementation(fabricApi.module("fabric-tag-extensions-v0", "${project.fabric_version}"))
|
||||
include modImplementation(fabricApi.module("fabric-resource-loader-v0", "${project.fabric_version}"))
|
||||
}
|
||||
|
@ -169,8 +169,6 @@ subprojects {
|
|||
|
||||
setupRepositories(repositories)
|
||||
}
|
||||
|
||||
version = rootProject.version
|
||||
}
|
||||
|
||||
task remapMavenJar(type: net.fabricmc.loom.task.RemapJarTask, dependsOn: jar) {
|
||||
|
|
|
@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G
|
|||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/versions.html
|
||||
minecraft_version=21w39a
|
||||
yarn_mappings=build.8
|
||||
loader_version=0.11.7
|
||||
yarn_mappings=build.13
|
||||
loader_version=0.12.0
|
||||
# Mod Properties
|
||||
mod_version=2.0
|
||||
maven_group=io.gitlab.jfronny
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
"license": "MIT",
|
||||
"environment": "*",
|
||||
"depends": {
|
||||
"fabricloader": ">=0.11.3",
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-base-testmod",
|
||||
"version": "${version}",
|
||||
"version": "1.0",
|
||||
"environment": "*"
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
package io.gitlab.jfronny.libjf.config;
|
||||
|
||||
public interface JfConfig {
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.entry;
|
||||
package io.gitlab.jfronny.libjf.config.api;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
|
@ -0,0 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api;
|
||||
|
||||
public interface JfConfig {
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
package io.gitlab.jfronny.libjf.config.entry;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.Config;
|
||||
import io.gitlab.jfronny.libjf.config.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.EntryInfo;
|
||||
import io.gitlab.jfronny.libjf.gson.GsonHidden;
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
|
||||
public class JfConfigClient implements ClientModInitializer {
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
for (Config config : ConfigHolder.getConfigs().values()) {
|
||||
LibJf.LOGGER.info("Registring config UI for " + config.modid);
|
||||
for (EntryInfo info : config.entries) {
|
||||
if (info.field.isAnnotationPresent(Entry.class) || info.field.isAnnotationPresent(GsonHidden.class))
|
||||
try {
|
||||
config.initClient(info);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl;
|
||||
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import io.gitlab.jfronny.libjf.config.api.Entry;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/** Based on https://github.com/TeamMidnightDust/MidnightLib which is based on https://github.com/Minenash/TinyConfig
|
||||
* Credits to TeamMidnightDust and Minenash */
|
||||
|
||||
public class Config {
|
||||
public final List<EntryInfo> entries = new ArrayList<>();
|
||||
public Path path;
|
||||
public final String modid;
|
||||
public final Class<?> configClass;
|
||||
|
||||
public Config(String modid, Class<?> config) {
|
||||
this.modid = modid;
|
||||
configClass = config;
|
||||
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
|
||||
|
||||
for (Field field : config.getFields()) {
|
||||
EntryInfo info = new EntryInfo();
|
||||
info.field = field;
|
||||
if (field.isAnnotationPresent(Entry.class))
|
||||
try {
|
||||
info.defaultValue = field.get(null);
|
||||
} catch (IllegalAccessException ignored) {}
|
||||
entries.add(info);
|
||||
}
|
||||
try {
|
||||
LibJf.GSON.fromJson(Files.newBufferedReader(path), config); }
|
||||
catch (Exception e) { write(); }
|
||||
}
|
||||
|
||||
public void write() {
|
||||
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
|
||||
try {
|
||||
if (!Files.exists(path)) Files.createFile(path);
|
||||
Files.write(path, LibJf.GSON.toJson(configClass.getDeclaredConstructor().newInstance()).getBytes());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config;
|
||||
package io.gitlab.jfronny.libjf.config.impl;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config;
|
||||
package io.gitlab.jfronny.libjf.config.impl;
|
||||
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.Text;
|
|
@ -1,8 +1,8 @@
|
|||
package io.gitlab.jfronny.libjf.config;
|
||||
package io.gitlab.jfronny.libjf.config.impl;
|
||||
|
||||
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
|
||||
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||
import io.gitlab.jfronny.libjf.config.gui.TinyConfigScreen;
|
||||
import io.gitlab.jfronny.libjf.config.impl.gui.TinyConfigScreen;
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
|
||||
import java.util.HashMap;
|
|
@ -0,0 +1,20 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.entry;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.impl.Config;
|
||||
import io.gitlab.jfronny.libjf.config.impl.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.impl.EntryInfo;
|
||||
import io.gitlab.jfronny.libjf.config.api.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.impl.gui.EntryInfoWidgetBuilder;
|
||||
import io.gitlab.jfronny.libjf.gson.GsonHidden;
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
|
||||
public class JfConfigClient implements ClientModInitializer {
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
for (Config config : ConfigHolder.getConfigs().values()) {
|
||||
LibJf.LOGGER.info("Registring config UI for " + config.modid);
|
||||
EntryInfoWidgetBuilder.initConfig(config);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
package io.gitlab.jfronny.libjf.config.entry;
|
||||
package io.gitlab.jfronny.libjf.config.impl.entry;
|
||||
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import io.gitlab.jfronny.libjf.config.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.JfConfig;
|
||||
import io.gitlab.jfronny.libjf.config.impl.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.api.JfConfig;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
|
||||
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
|
|
@ -1,8 +1,8 @@
|
|||
package io.gitlab.jfronny.libjf.config.entry;
|
||||
package io.gitlab.jfronny.libjf.config.impl.entry;
|
||||
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import io.gitlab.jfronny.libjf.config.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.JfConfig;
|
||||
import io.gitlab.jfronny.libjf.config.impl.ConfigHolder;
|
||||
import io.gitlab.jfronny.libjf.config.api.JfConfig;
|
||||
import io.gitlab.jfronny.libjf.unsafe.DynamicEntry;
|
||||
import io.gitlab.jfronny.libjf.unsafe.UltraEarlyInit;
|
||||
|
||||
|
@ -13,5 +13,6 @@ public class JfConfigUnsafe implements UltraEarlyInit {
|
|||
ConfigHolder.registerConfig(s.modId(), s.instance().getClass());
|
||||
LibJf.LOGGER.info("Registering config for " + s.modId());
|
||||
});
|
||||
LibJf.LOGGER.info("Finished LibJF config entrypoint");
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.gui;
|
||||
package io.gitlab.jfronny.libjf.config.impl.gui;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
|
@ -1,78 +1,62 @@
|
|||
package io.gitlab.jfronny.libjf.config;
|
||||
package io.gitlab.jfronny.libjf.config.impl.gui;
|
||||
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import io.gitlab.jfronny.libjf.config.entry.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.api.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.impl.Config;
|
||||
import io.gitlab.jfronny.libjf.config.impl.EntryInfo;
|
||||
import io.gitlab.jfronny.libjf.gson.GsonHidden;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.gui.widget.*;
|
||||
import net.minecraft.text.*;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import net.minecraft.util.Formatting;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/** Based on https://github.com/TeamMidnightDust/MidnightLib which is based on https://github.com/Minenash/TinyConfig
|
||||
* Credits to TeamMidnightDust and Minenash */
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class Config {
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class EntryInfoWidgetBuilder {
|
||||
private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)");
|
||||
private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)");
|
||||
|
||||
public final List<EntryInfo> entries = new ArrayList<>();
|
||||
public Path path;
|
||||
public final String modid;
|
||||
public final Class<?> configClass;
|
||||
|
||||
public Config(String modid, Class<?> config) {
|
||||
this.modid = modid;
|
||||
configClass = config;
|
||||
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
|
||||
|
||||
for (Field field : config.getFields()) {
|
||||
EntryInfo info = new EntryInfo();
|
||||
info.field = field;
|
||||
if (field.isAnnotationPresent(io.gitlab.jfronny.libjf.config.entry.Entry.class))
|
||||
public static void initConfig(Config config) {
|
||||
for (EntryInfo info : config.entries) {
|
||||
if (info.field.isAnnotationPresent(Entry.class) || info.field.isAnnotationPresent(GsonHidden.class))
|
||||
try {
|
||||
info.defaultValue = field.get(null);
|
||||
} catch (IllegalAccessException ignored) {}
|
||||
entries.add(info);
|
||||
initEntry(config, info);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
try {
|
||||
LibJf.GSON.fromJson(Files.newBufferedReader(path), config); }
|
||||
catch (Exception e) { write(); }
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public void initClient(EntryInfo info) {
|
||||
if (!(info.field.isAnnotationPresent(io.gitlab.jfronny.libjf.config.entry.Entry.class) || info.field.isAnnotationPresent(GsonHidden.class))) return;
|
||||
private static void initEntry(Config config, EntryInfo info) {
|
||||
if (!(info.field.isAnnotationPresent(io.gitlab.jfronny.libjf.config.api.Entry.class) || info.field.isAnnotationPresent(GsonHidden.class))) return;
|
||||
Class<?> type = info.field.getType();
|
||||
io.gitlab.jfronny.libjf.config.entry.Entry e = info.field.getAnnotation(Entry.class);
|
||||
io.gitlab.jfronny.libjf.config.api.Entry e = info.field.getAnnotation(Entry.class);
|
||||
info.width = e != null ? e.width() : 0;
|
||||
|
||||
if (e == null) return;
|
||||
|
||||
if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true);
|
||||
else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(),false);
|
||||
else if (type == String.class) textField(info, String::length, null, Math.min(e.min(),0), Math.max(e.max(),1),true);
|
||||
if (type == int.class) textField(config, info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true);
|
||||
else if (type == double.class) textField(config, info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(),false);
|
||||
else if (type == String.class) textField(config, info, String::length, null, Math.min(e.min(),0), Math.max(e.max(),1),true);
|
||||
else if (type == boolean.class) {
|
||||
Function<Object,Text> func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED);
|
||||
Function<Object, Text> func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED);
|
||||
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
|
||||
info.value = !(Boolean) info.value;
|
||||
button.setMessage(func.apply(info.value));
|
||||
}, func);
|
||||
} else if (type.isEnum()) {
|
||||
List<?> values = Arrays.asList(info.field.getType().getEnumConstants());
|
||||
Function<Object,Text> func = value -> new TranslatableText(modid + ".jfconfig." + "enum." + type.getSimpleName() + "." + info.value.toString());
|
||||
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object,Text>>( button -> {
|
||||
Function<Object,Text> func = value -> new TranslatableText(config.modid + ".jfconfig." + "enum." + type.getSimpleName() + "." + info.value.toString());
|
||||
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
|
||||
int index = values.indexOf(info.value) + 1;
|
||||
info.value = values.get(index >= values.size()? 0 : index);
|
||||
button.setMessage(func.apply(info.value));
|
||||
|
@ -86,7 +70,7 @@ public class Config {
|
|||
}
|
||||
}
|
||||
|
||||
private void textField(EntryInfo info, Function<String,Number> f, Pattern pattern, double min, double max, boolean cast) {
|
||||
private static void textField(Config config, EntryInfo info, Function<String,Number> f, Pattern pattern, double min, double max, boolean cast) {
|
||||
boolean isNumber = pattern != null;
|
||||
info.widget = (BiFunction<TextFieldWidget, ButtonWidget, Predicate<String>>) (t, b) -> s -> {
|
||||
s = s.trim();
|
||||
|
@ -108,7 +92,7 @@ public class Config {
|
|||
info.tempValue = s;
|
||||
t.setEditableColor(inLimits? 0xFFFFFFFF : 0xFFFF7777);
|
||||
info.inLimits = inLimits;
|
||||
b.active = entries.stream().allMatch(e -> e.inLimits);
|
||||
b.active = config.entries.stream().allMatch(e -> e.inLimits);
|
||||
|
||||
if (inLimits)
|
||||
info.value = isNumber? value : s;
|
||||
|
@ -116,14 +100,4 @@ public class Config {
|
|||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
public void write() {
|
||||
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
|
||||
try {
|
||||
if (!Files.exists(path)) Files.createFile(path);
|
||||
Files.write(path, LibJf.GSON.toJson(configClass.getDeclaredConstructor().newInstance()).getBytes());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.gui;
|
||||
package io.gitlab.jfronny.libjf.config.impl.gui;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
|
@ -1,9 +1,9 @@
|
|||
package io.gitlab.jfronny.libjf.config.gui;
|
||||
package io.gitlab.jfronny.libjf.config.impl.gui;
|
||||
|
||||
import io.gitlab.jfronny.libjf.LibJf;
|
||||
import io.gitlab.jfronny.libjf.config.Config;
|
||||
import io.gitlab.jfronny.libjf.config.entry.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.EntryInfo;
|
||||
import io.gitlab.jfronny.libjf.config.impl.Config;
|
||||
import io.gitlab.jfronny.libjf.config.api.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.impl.EntryInfo;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-base",
|
||||
"id": "libjf-config-v0",
|
||||
"name": "LibJF Base",
|
||||
"version": "${version}",
|
||||
"authors": [
|
||||
|
@ -14,18 +14,22 @@
|
|||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"modmenu": [
|
||||
"io.gitlab.jfronny.libjf.config.ModMenu"
|
||||
"io.gitlab.jfronny.libjf.config.impl.ModMenu"
|
||||
],
|
||||
"client": [
|
||||
"io.gitlab.jfronny.libjf.config.entry.JfConfigClient"
|
||||
"io.gitlab.jfronny.libjf.config.impl.entry.JfConfigClient"
|
||||
],
|
||||
"libjf:preEarly": [
|
||||
"io.gitlab.jfronny.libjf.config.entry.JfConfigUnsafe"
|
||||
"io.gitlab.jfronny.libjf.config.impl.entry.JfConfigUnsafe"
|
||||
],
|
||||
"preLaunch": [
|
||||
"io.gitlab.jfronny.libjf.config.entry.JfConfigSafe"
|
||||
"io.gitlab.jfronny.libjf.config.impl.entry.JfConfigSafe"
|
||||
]
|
||||
},
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
"modmenu": {
|
||||
"badges": ["library"],
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package io.gitlab.jfronny.libjf.config.test;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.JfConfig;
|
||||
import io.gitlab.jfronny.libjf.config.entry.Entry;
|
||||
import io.gitlab.jfronny.libjf.config.api.JfConfig;
|
||||
import io.gitlab.jfronny.libjf.config.api.Entry;
|
||||
import io.gitlab.jfronny.libjf.gson.GsonHidden;
|
||||
|
||||
public class TestConfig implements JfConfig {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-config-v0-testmod",
|
||||
"version": "${version}",
|
||||
"version": "1.0",
|
||||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"libjf:config": [
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
"io.gitlab.jfronny.libjf.data.manipulation.impl.ResourcePackHookPatch"
|
||||
]
|
||||
},
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
"modmenu": {
|
||||
"parent": "libjf",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-data-manipulation-v0-testmod",
|
||||
"version": "${version}",
|
||||
"version": "1.0",
|
||||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"main": [
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
"license": "MIT",
|
||||
"environment": "*",
|
||||
"mixins": ["libjf-data-v0.mixins.json"],
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
"modmenu": {
|
||||
"parent": "libjf",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-data-v0-testmod",
|
||||
"version": "${version}",
|
||||
"version": "1.0",
|
||||
"environment": "*"
|
||||
}
|
|
@ -15,7 +15,7 @@ public class MinecraftClientMixin {
|
|||
* @reason The social interactions service will not work in dev envs and only produces log spam
|
||||
*/
|
||||
@Overwrite
|
||||
private UserApiService createSocialInteractionsService(YggdrasilAuthenticationService yggdrasilAuthenticationService, RunArgs runArgs) {
|
||||
private UserApiService createUserApiService(YggdrasilAuthenticationService yggdrasilAuthenticationService, RunArgs runArgs) {
|
||||
return new NoOpUserApi();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
]
|
||||
},
|
||||
"mixins": ["libjf-devutil-v0.mixins.json"],
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
"modmenu": {
|
||||
"parent": "libjf",
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package io.gitlab.jfronny.libjf.unsafe;
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
|
||||
import net.fabricmc.loader.ModContainer;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.fabricmc.loader.metadata.EntrypointMetadata;
|
||||
import net.fabricmc.loader.api.ModContainer;
|
||||
import net.fabricmc.loader.impl.ModContainerImpl;
|
||||
import net.fabricmc.loader.impl.metadata.EntrypointMetadata;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
|
@ -46,9 +46,8 @@ public class DynamicEntry {
|
|||
|
||||
private static ReferenceArrayList<EntrypointContainer> getEntrypointTargets(final String entrypoint) {
|
||||
final ReferenceArrayList<EntrypointContainer> entrypoints = ReferenceArrayList.wrap(new EntrypointContainer[1], 0);
|
||||
|
||||
for (final ModContainer mod : (Collection<ModContainer>) (Object) FabricLoader.getInstance().getAllMods()) {
|
||||
final List<EntrypointMetadata> modEntrypoints = mod.getInfo().getEntrypoints(entrypoint);
|
||||
for (final ModContainer mod : FabricLoader.getInstance().getAllMods()) {
|
||||
final List<EntrypointMetadata> modEntrypoints = ((ModContainerImpl)mod).getInfo().getEntrypoints(entrypoint);
|
||||
|
||||
if (modEntrypoints != null) {
|
||||
for (final EntrypointMetadata metadata : modEntrypoints) {
|
||||
|
|
|
@ -7,7 +7,7 @@ import io.gitlab.jfronny.libjf.unsafe.asm.BakedAsmConfig;
|
|||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
||||
import org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy;
|
||||
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
@ -35,7 +35,7 @@ public class MixinPlugin implements IMixinConfigPlugin {
|
|||
Unsafe unsafe = (Unsafe) unsafeField.get(null);
|
||||
|
||||
AsmTransformer.INSTANCE = (AsmTransformer) unsafe.allocateInstance(AsmTransformer.class);
|
||||
AsmTransformer.INSTANCE.delegate = (FabricMixinTransformerProxy) mixinTransformerField.get(delegate);
|
||||
AsmTransformer.INSTANCE.delegate = (IMixinTransformer) mixinTransformerField.get(delegate);
|
||||
AsmTransformer.INSTANCE.asmConfigs = new HashSet<>();
|
||||
DynamicEntry.execute(LibJf.MOD_ID + ":asm", AsmConfig.class, s -> {
|
||||
LibJf.LOGGER.info("Discovered LibJF asm plugin in " + s.modId());
|
||||
|
|
|
@ -7,19 +7,37 @@ import net.fabricmc.loader.api.MappingResolver;
|
|||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy;
|
||||
import org.spongepowered.asm.mixin.MixinEnvironment;
|
||||
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
|
||||
import org.spongepowered.asm.mixin.transformer.ext.IExtensionRegistry;
|
||||
import org.spongepowered.asm.transformers.MixinClassWriter;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class AsmTransformer extends FabricMixinTransformerProxy {
|
||||
public class AsmTransformer implements IMixinTransformer {
|
||||
public static AsmTransformer INSTANCE;
|
||||
public static final MappingResolver MAPPING_RESOLVER = FabricLoader.getInstance().getMappingResolver();
|
||||
public static final String INTERMEDIARY = "intermediary";
|
||||
public FabricMixinTransformerProxy delegate;
|
||||
public IMixinTransformer delegate;
|
||||
public Set<AsmConfig> asmConfigs;
|
||||
private AsmConfig currentConfig = null;
|
||||
|
||||
@Override
|
||||
public void audit(MixinEnvironment environment) {
|
||||
delegate.audit(environment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> reload(String mixinClass, ClassNode classNode) {
|
||||
return delegate.reload(mixinClass, classNode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean computeFramesForClass(MixinEnvironment environment, String name, ClassNode classNode) {
|
||||
return delegate.computeFramesForClass(environment, name, classNode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transformClassBytes(String name, String transformedName, byte[] classBytes) {
|
||||
classBytes = delegate.transformClassBytes(name, transformedName, classBytes);
|
||||
|
@ -55,9 +73,39 @@ public class AsmTransformer extends FabricMixinTransformerProxy {
|
|||
return null;
|
||||
}
|
||||
classBytes = writer.toByteArray();
|
||||
//MixinEnvironment.getCurrentEnvironment();
|
||||
return classBytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transformClass(MixinEnvironment environment, String name, byte[] classBytes) {
|
||||
LibJf.LOGGER.error("transformClass called");
|
||||
return delegate.transformClass(environment, name, classBytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean transformClass(MixinEnvironment environment, String name, ClassNode classNode) {
|
||||
LibJf.LOGGER.error("transformClass called");
|
||||
return delegate.transformClass(environment, name, classNode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] generateClass(MixinEnvironment environment, String name) {
|
||||
LibJf.LOGGER.error("generateClass called");
|
||||
return delegate.generateClass(environment, name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean generateClass(MixinEnvironment environment, String name, ClassNode classNode) {
|
||||
LibJf.LOGGER.error("generateClass called");
|
||||
return delegate.generateClass(environment, name, classNode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IExtensionRegistry getExtensions() {
|
||||
return delegate.getExtensions();
|
||||
}
|
||||
|
||||
public static boolean isClassUnmoddable(String className, AsmConfig config) {
|
||||
if (className.replace('/', '.').startsWith("org.objectweb.asm")
|
||||
//|| className.startsWith("net.fabricmc.loader")
|
||||
|
|
|
@ -42,7 +42,7 @@ public class InterfaceImplTargetPatch implements Patch {
|
|||
INTERFACES.put(klazz.name, Set.copyOf(INTERFACES.get(klazz.name)));
|
||||
for (String s : INTERFACES.get(klazz.name)) {
|
||||
String n = s.replace('/', '.');
|
||||
if (AsmTransformer.INSTANCE.isClassUnmoddable(n, AsmTransformer.INSTANCE.getCurrentConfig()))
|
||||
if (AsmTransformer.isClassUnmoddable(n, AsmTransformer.INSTANCE.getCurrentConfig()))
|
||||
continue;
|
||||
try {
|
||||
InterfaceImplTargetPatch.class.getClassLoader().loadClass(n);
|
||||
|
@ -66,7 +66,7 @@ public class InterfaceImplTargetPatch implements Patch {
|
|||
INTERFACES.put(n, Set.copyOf(INTERFACES.get(n)));
|
||||
for (String s : INTERFACES.get(n)) {
|
||||
String nn = s.replace('/', '.');
|
||||
if (AsmTransformer.INSTANCE.isClassUnmoddable(nn, AsmTransformer.INSTANCE.getCurrentConfig()))
|
||||
if (AsmTransformer.isClassUnmoddable(nn, AsmTransformer.INSTANCE.getCurrentConfig()))
|
||||
continue;
|
||||
try {
|
||||
scanInterfaces(InterfaceImplTargetPatch.class.getClassLoader().loadClass(nn));
|
||||
|
|
|
@ -15,6 +15,10 @@
|
|||
"libjf": "io.gitlab.jfronny.libjf.unsafe.JfLanguageAdapter"
|
||||
},
|
||||
"mixins": ["libjf-unsafe-v0.mixins.json"],
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
"modmenu": {
|
||||
"parent": "libjf",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "libjf-unsafe-v0-testmod",
|
||||
"version": "${version}",
|
||||
"version": "1.0",
|
||||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"libjf:asm": [
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"icon": "assets/libjf/icon.png",
|
||||
"environment": "*",
|
||||
"depends": {
|
||||
"fabricloader": ">=0.11.3",
|
||||
"fabricloader": ">=0.12.0",
|
||||
"minecraft": "*"
|
||||
},
|
||||
"custom": {
|
||||
|
|
Loading…
Reference in New Issue