diff --git a/build.gradle b/build.gradle index b413d07..40efad1 100644 --- a/build.gradle +++ b/build.gradle @@ -87,9 +87,15 @@ repositories { name 'CleanroomMC Maven' url 'https://maven.cleanroommc.com' } + maven { + name 'CurseMaven' + url 'https://curse.cleanroommc.com' + } } + dependencies { + implementation 'curse.maven:resource-mod-loader-945917:5768125+5768126' if (propertyBool('use_asset_mover')) { implementation "com.cleanroommc:assetmover:${propertyString('asset_mover_version')}" } diff --git a/src/main/java/mods/Hileb/shotaasm/impl/ShotaCompiler.java b/src/main/java/mods/Hileb/shotaasm/impl/ShotaCompiler.java index ffb826a..10c8a5d 100644 --- a/src/main/java/mods/Hileb/shotaasm/impl/ShotaCompiler.java +++ b/src/main/java/mods/Hileb/shotaasm/impl/ShotaCompiler.java @@ -39,7 +39,7 @@ public Runnable compile(final ScriptFile file) { return () -> {}; } else return null; } else { - String singleName = file.name().substring(0, file.name().lastIndexOf('.')).replace('.', '_'); + String singleName = file.name().substring(0, file.name().lastIndexOf('.')).replace('.', '_') + file.hashCode(); String name = "mods.Hileb.shotaasm.dynamic." + singleName; StringBuilder builder = new StringBuilder("package mods.Hileb.shotaasm.dynamic;"); for (String s : file.property().get("import")) { @@ -72,7 +72,7 @@ public Runnable compile(final ScriptFile file) { } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException | MalformedURLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Unable to compile for " + file.name(), e); } } } diff --git a/src/main/java/mods/Hileb/shotaasm/impl/rml/ShotaRMLLocator.java b/src/main/java/mods/Hileb/shotaasm/impl/rml/ShotaRMLLocator.java new file mode 100644 index 0000000..0304901 --- /dev/null +++ b/src/main/java/mods/Hileb/shotaasm/impl/rml/ShotaRMLLocator.java @@ -0,0 +1,73 @@ +package mods.Hileb.shotaasm.impl.rml; + +import mods.Hileb.shotaasm.ShotaASM; +import mods.Hileb.shotaasm.ScriptLoader; +import mods.Hileb.shotaasm.api.IScriptLocator; +import mods.Hileb.shotaasm.api.ScriptFile; +import mods.Hileb.shotaasm.api.ShotaContext; + +import net.minecraft.launchwrapper.Launch; +import net.minecraft.util.ResourceLocation; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FilenameUtils; + +import org.apache.logging.log4j.message.FormattedMessage; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +import rml.loader.ResourceModLoader; +import rml.loader.api.mods.module.ModuleType; +import rml.loader.api.mods.ContainerHolder; +import rml.jrx.utils.file.FileHelper; + +public class ShotaRMLLocator implements IScriptLocator { + + @Override + public Collection getScripts() { + final List list = new ArrayList<>(); + + if (ShotaContext.isClassExist("rml.loader.ResourceModLoader")) { + ResourceModLoader.loadModuleFindAssets(ModuleType.valueOf(new ResourceLocation("shotaasm", "shotaasm")), (containerHolder, module, root, file) -> { + String relative = root.relativize(file).toString(); + String name = FilenameUtils.removeExtension(relative).replaceAll("\\\\", "/"); + ResourceLocation key = new ResourceLocation(containerHolder.getContainer().getModId(), name); + + try + { + ScriptFile scriptFile = ScriptFile.create(key.toString().replace(':', '$').replace('/', '$'), new String(FileHelper.getByteSource(file).read())); + scriptFile.data().put("rml_container", containerHolder); + list.add(scriptFile); + } catch (Exception e) { + ErrorHandler.error( + Objects.requireNonNull(module, "module").moduleType, + containerHolder, e, "Could not read file {}", key); + } + }); + } + return list; + } + + private static class ErrorHandler{ + public static void runThrow(Throwable throwable, String msg, Object... args){ + throw new RuntimeException(new FormattedMessage(msg, args).getFormattedMessage(), throwable); + } + + public static boolean isForced(ContainerHolder containerHolder, ModuleType moduleType){ + return containerHolder.hasModule(moduleType) && containerHolder.getModules().get(moduleType).forceLoaded; + } + + public static void error(ModuleType moduleType, ContainerHolder containerHolder, Throwable throwable, String msg, Object... args){ + if (isForced(containerHolder, moduleType)) runThrow(throwable, msg, args); + else ShotaASM.LOGGER.error(new FormattedMessage(msg, args).getFormattedMessage(), throwable); + } + } + +} diff --git a/src/main/resources/META-INF/services/mods.Hileb.shotaasm.api.IScriptLocator b/src/main/resources/META-INF/services/mods.Hileb.shotaasm.api.IScriptLocator index 5f0577e..aad4634 100644 --- a/src/main/resources/META-INF/services/mods.Hileb.shotaasm.api.IScriptLocator +++ b/src/main/resources/META-INF/services/mods.Hileb.shotaasm.api.IScriptLocator @@ -1 +1,2 @@ -mods.Hileb.shotaasm.impl.ShotaScriptLocator \ No newline at end of file +mods.Hileb.shotaasm.impl.ShotaScriptLocator +mods.Hileb.shotaasm.impl.rml.ShotaRMLLocator \ No newline at end of file diff --git a/src/main/resources/modid_at.cfg b/src/main/resources/modid_at.cfg index 3d61d66..e69de29 100644 --- a/src/main/resources/modid_at.cfg +++ b/src/main/resources/modid_at.cfg @@ -1 +0,0 @@ -public net.minecraft.client.Minecraft fileResourcepacks # Example mcp name AT entry \ No newline at end of file diff --git a/src/main/resources/rml.modules b/src/main/resources/rml.modules new file mode 100644 index 0000000..afbf886 --- /dev/null +++ b/src/main/resources/rml.modules @@ -0,0 +1,7 @@ +[ + { + "name" : "shotaasm:shotaasm", + "isFile" : false, + "defaultLocation" : "mods/shotaasm" + } +] \ No newline at end of file