Migrate to FabricLoader 0.12.0

This commit is contained in:
JFronny 2021-10-06 19:01:48 +02:00
parent 9024376f8c
commit e50daa1b80
No known key found for this signature in database
GPG Key ID: BEC5ACBBD4EE17E5
35 changed files with 222 additions and 136 deletions

View File

@ -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) {

View File

@ -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

View File

@ -12,7 +12,7 @@
"license": "MIT",
"environment": "*",
"depends": {
"fabricloader": ">=0.11.3",
"fabricloader": ">=0.12.0",
"minecraft": "*"
},
"custom": {

View File

@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"id": "libjf-base-testmod",
"version": "${version}",
"version": "1.0",
"environment": "*"
}

View File

@ -1,4 +0,0 @@
package io.gitlab.jfronny.libjf.config;
public interface JfConfig {
}

View File

@ -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;

View File

@ -0,0 +1,4 @@
package io.gitlab.jfronny.libjf.config.api;
public interface JfConfig {
}

View File

@ -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) {
}
}
}
}
}

View File

@ -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();
}
}
}

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config;
package io.gitlab.jfronny.libjf.config.impl;
import com.google.common.collect.ImmutableMap;

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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");
}
}

View File

@ -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;

View File

@ -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();
}
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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"],

View File

@ -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 {

View File

@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "libjf-config-v0-testmod",
"version": "${version}",
"version": "1.0",
"environment": "*",
"entrypoints": {
"libjf:config": [

View File

@ -17,6 +17,10 @@
"io.gitlab.jfronny.libjf.data.manipulation.impl.ResourcePackHookPatch"
]
},
"depends": {
"fabricloader": ">=0.12.0",
"minecraft": "*"
},
"custom": {
"modmenu": {
"parent": "libjf",

View File

@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "libjf-data-manipulation-v0-testmod",
"version": "${version}",
"version": "1.0",
"environment": "*",
"entrypoints": {
"main": [

View File

@ -12,6 +12,10 @@
"license": "MIT",
"environment": "*",
"mixins": ["libjf-data-v0.mixins.json"],
"depends": {
"fabricloader": ">=0.12.0",
"minecraft": "*"
},
"custom": {
"modmenu": {
"parent": "libjf",

View File

@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"id": "libjf-data-v0-testmod",
"version": "${version}",
"version": "1.0",
"environment": "*"
}

View File

@ -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();
}
}

View File

@ -17,6 +17,10 @@
]
},
"mixins": ["libjf-devutil-v0.mixins.json"],
"depends": {
"fabricloader": ">=0.12.0",
"minecraft": "*"
},
"custom": {
"modmenu": {
"parent": "libjf",

View File

@ -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) {

View File

@ -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());

View File

@ -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")

View File

@ -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));

View File

@ -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",

View File

@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "libjf-unsafe-v0-testmod",
"version": "${version}",
"version": "1.0",
"environment": "*",
"entrypoints": {
"libjf:asm": [

View File

@ -15,7 +15,7 @@
"icon": "assets/libjf/icon.png",
"environment": "*",
"depends": {
"fabricloader": ">=0.11.3",
"fabricloader": ">=0.12.0",
"minecraft": "*"
},
"custom": {