package io.gitlab.jfronny.respackopts; import io.gitlab.jfronny.libjf.data.WrappedPack; import io.gitlab.jfronny.respackopts.data.*; import io.gitlab.jfronny.respackopts.filters.DirFilterEventImpl; import io.gitlab.jfronny.respackopts.util.RpoCommand; import io.gitlab.jfronny.respackopts.data.entry.*; import io.gitlab.jfronny.respackopts.filters.FileFilterEventImpl; import io.gitlab.jfronny.respackopts.util.GuiFactory; import meteordevelopment.starscript.StandardLib; import meteordevelopment.starscript.Starscript; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.gui.FabricGuiEntry; import net.minecraft.client.MinecraftClient; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.Identifier; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; @Environment(EnvType.CLIENT) public class Respackopts implements ClientModInitializer { public static final Map CONFIG_BRANCH = new HashMap<>(); public static final Map PACK_METAS = new HashMap<>(); public static final Map DISPLAY_NAME_LOOKUP = new HashMap<>(); public static final Map PACK_NAME_LOOKUP = new HashMap<>(); public static Starscript STAR_SCRIPT; public static final Identifier CONF_ID = new Identifier(RpoModInfo.ID, "conf.json"); public static final Set SAVE_ACTIONS = new HashSet<>(); public static GuiFactory factory = new GuiFactory(); public static boolean forcePackReload = false; static { try { STAR_SCRIPT = new Starscript(); } catch (Throwable e) { FabricGuiEntry.displayCriticalError(new Exception("Respackopts could not initialize Starscript. Expect issues with packs that use it", e), false); } StandardLib.init(STAR_SCRIPT); } public static String getId(WrappedPack pack) { return PACK_NAME_LOOKUP.get(pack.getName()); } public static boolean hasCapability(WrappedPack pack, PackCapability capability) { String id = getId(pack); if (id == null) return false; return PACK_METAS.get(id).capabilities.contains(capability); } @Override public void onInitializeClient() { try { Files.createDirectories(RpoModInfo.CONF_DIR); } catch (IOException e) { RpoModInfo.LOGGER.error("Could not initialize config directory", e); } if (RpoModInfo.CONFIG.debugLogs) SAVE_ACTIONS.add(() -> RpoModInfo.LOGGER.info("Save")); SAVE_ACTIONS.add(() -> { for (Map.Entry e : CONFIG_BRANCH.entrySet()) { STAR_SCRIPT.set(sanitizeString(e.getKey()), () -> e.getValue().buildStarscript()); } }); DirFilterEventImpl.init(); FileFilterEventImpl.init(); if (RpoModInfo.CONFIG.debugCommands) RpoCommand.register(); } public static void save() { if (RpoModInfo.CONFIG.debugLogs) RpoModInfo.LOGGER.info("Saving configs"); for (Map.Entry e : CONFIG_BRANCH.entrySet()) { try (Writer writer = Files.newBufferedWriter(RpoModInfo.CONF_DIR.resolve(e.getKey() + ".json"))) { RpoModInfo.GSON.toJson(e.getValue(), writer); writer.flush(); } catch (IOException ex) { RpoModInfo.LOGGER.error("Could not save config", ex); } } for (Runnable action : SAVE_ACTIONS) { action.run(); } } public static void load(String id) { Path q = RpoModInfo.CONF_DIR.resolve(id + ".json"); if (Files.exists(q)) { if (RpoModInfo.CONFIG.debugLogs) RpoModInfo.LOGGER.info("Loading configs for: " + id); try (Reader reader = Files.newBufferedReader(q)) { ConfigBranch b = RpoModInfo.GSON.fromJson(reader, ConfigBranch.class); if (CONFIG_BRANCH.containsKey(id)) CONFIG_BRANCH.get(id).sync(b, SyncMode.CONF_LOAD); STAR_SCRIPT.set(sanitizeString(id), b::buildStarscript); } catch (IOException e) { RpoModInfo.LOGGER.error("Failed to load " + id, e); } } } public static String sanitizeString(String s) { // This trims whitespace/underscores and removes non-alphabetical or underscore characters // ^ = start of string // $ = end of string // * = zero or more times // [\\s_] = whitespace or underscores // | = or // [^a-zA-Z_] = not character or underscore return s.replaceAll("[^a-zA-Z_]|^[\\s_]*|[\\s_]*$", ""); } public static CompletableFuture forceReloadResources() { if (RpoModInfo.CONFIG.debugLogs) RpoModInfo.LOGGER.info("Forcing resource reload"); return CompletableFuture.allOf(MinecraftClient.getInstance().reloadResources(), reloadData()); } public static CompletableFuture reloadData() { IntegratedServer is = MinecraftClient.getInstance().getServer(); if (is != null) { is.getDataPackManager().scanPacks(); return is.reloadResources(is.getDataPackManager().getEnabledNames()); } return CompletableFuture.completedFuture(null); } }