This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
ScriptCraft/src/main/java/com/thebrokenrail/scriptcraft/core/ScriptCraftCore.java

55 lines
2.0 KiB
Java

package com.thebrokenrail.scriptcraft.core;
import com.thebrokenrail.scriptcraft.core.quickjs.QuickJSNative;
import com.thebrokenrail.scriptcraft.core.quickjs.QuickJSManager;
import net.fabricmc.loader.api.FabricLoader;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Pattern;
@SuppressWarnings("unused")
public class ScriptCraftCore {
private static final HashMap<String, Bridge> bridges = new HashMap<>();
public static void addBridge(String name, Bridge bridge) {
bridges.put(name, bridge);
}
public static Object useBridge(String name, Object... args) {
QuickJSManager.Task task = new QuickJSManager.Task() {
@Override
protected Object run(QuickJSNative quickjs) {
if (bridges.containsKey(name)) {
return bridges.get(name).use(args);
} else {
throw new RuntimeException("Invalid Bridge: '" + name + '\'');
}
}
};
return QuickJSManager.sendTaskFromQuickJS(task);
}
public static final String NAMESPACE = "scriptcraft";
public static final Pattern MOD_ID_PATTERN = Pattern.compile("[a-z][a-z0-9-_]{1,63}");
public static void init() {
QuickJSManager.init(new QuickJSManager.Task() {
@Override
protected Object run(QuickJSNative quickjs) {
List<ScriptCraftEntrypoint> mods = FabricLoader.getInstance().getEntrypoints(NAMESPACE, ScriptCraftEntrypoint.class);
for (ScriptCraftEntrypoint mod : mods) {
if (MOD_ID_PATTERN.matcher(mod.getModID()).matches()) {
if (mod.shouldAutoLoad()) {
quickjs.run("import '" + mod.getModID() + "';");
}
} else {
throw new RuntimeException("Invalid Mod ID: " + mod.getModID());
}
}
return null;
}
});
}
}