2020-11-24 22:04:13 +01:00
|
|
|
package io.gitlab.jfronny.respackopts;
|
|
|
|
|
2021-08-26 16:00:21 +02:00
|
|
|
import io.gitlab.jfronny.libjf.data.WrappedPack;
|
2021-09-15 18:37:07 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.data.*;
|
2021-09-15 16:45:54 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.filters.DirFilterEventImpl;
|
2021-09-15 15:26:25 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.util.RpoCommand;
|
2021-06-10 16:11:19 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.data.entry.*;
|
2021-09-15 16:45:54 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.filters.FileFilterEventImpl;
|
2021-09-15 15:26:25 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.util.GuiFactory;
|
2021-08-24 17:42:46 +02:00
|
|
|
import meteordevelopment.starscript.StandardLib;
|
|
|
|
import meteordevelopment.starscript.Starscript;
|
2020-11-24 22:04:13 +01:00
|
|
|
import net.fabricmc.api.ClientModInitializer;
|
|
|
|
import net.fabricmc.api.EnvType;
|
|
|
|
import net.fabricmc.api.Environment;
|
2021-08-24 17:42:46 +02:00
|
|
|
import net.fabricmc.loader.gui.FabricGuiEntry;
|
|
|
|
import net.minecraft.client.MinecraftClient;
|
|
|
|
import net.minecraft.server.integrated.IntegratedServer;
|
2021-06-10 13:10:12 +02:00
|
|
|
import net.minecraft.util.Identifier;
|
2020-11-24 22:04:13 +01:00
|
|
|
|
2021-06-10 16:11:19 +02:00
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.Reader;
|
|
|
|
import java.io.Writer;
|
2020-11-24 22:04:13 +01:00
|
|
|
import java.nio.file.Files;
|
|
|
|
import java.nio.file.Path;
|
2021-06-10 16:11:19 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
2021-08-24 17:42:46 +02:00
|
|
|
import java.util.concurrent.CompletableFuture;
|
2020-11-24 22:04:13 +01:00
|
|
|
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
|
|
public class Respackopts implements ClientModInitializer {
|
2021-06-10 13:10:12 +02:00
|
|
|
public static final Map<String, ConfigBranch> CONFIG_BRANCH = new HashMap<>();
|
2021-09-15 15:26:25 +02:00
|
|
|
public static final Map<String, PackMeta> PACK_METAS = new HashMap<>();
|
2021-08-26 16:00:21 +02:00
|
|
|
public static final Map<String, String> DISPLAY_NAME_LOOKUP = new HashMap<>();
|
|
|
|
public static final Map<String, String> PACK_NAME_LOOKUP = new HashMap<>();
|
2021-06-10 13:10:12 +02:00
|
|
|
|
2021-08-24 17:42:46 +02:00
|
|
|
public static Starscript STAR_SCRIPT;
|
2021-09-15 18:37:07 +02:00
|
|
|
public static final Identifier CONF_ID = new Identifier(RpoModInfo.ID, "conf.json");
|
|
|
|
public static final Set<Runnable> SAVE_ACTIONS = new HashSet<>();
|
2021-08-24 17:42:46 +02:00
|
|
|
|
2020-11-24 22:04:13 +01:00
|
|
|
public static GuiFactory factory = new GuiFactory();
|
2021-09-15 16:45:54 +02:00
|
|
|
public static boolean forcePackReload = false;
|
2021-06-10 13:10:12 +02:00
|
|
|
|
|
|
|
static {
|
2021-08-24 17:42:46 +02:00
|
|
|
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);
|
2021-06-10 13:10:12 +02:00
|
|
|
}
|
|
|
|
|
2021-08-26 16:00:21 +02:00
|
|
|
public static String getId(WrappedPack pack) {
|
|
|
|
return PACK_NAME_LOOKUP.get(pack.getName());
|
|
|
|
}
|
|
|
|
|
2021-08-26 18:23:29 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2020-11-24 22:04:13 +01:00
|
|
|
@Override
|
|
|
|
public void onInitializeClient() {
|
2020-12-28 11:31:12 +01:00
|
|
|
try {
|
2021-09-15 18:37:07 +02:00
|
|
|
Files.createDirectories(RpoModInfo.CONF_DIR);
|
2020-12-28 11:31:12 +01:00
|
|
|
} catch (IOException e) {
|
2021-09-15 18:37:07 +02:00
|
|
|
RpoModInfo.LOGGER.error("Could not initialize config directory", e);
|
2020-12-28 11:31:12 +01:00
|
|
|
}
|
2021-09-15 18:37:07 +02:00
|
|
|
if (RpoModInfo.CONFIG.debugLogs)
|
|
|
|
SAVE_ACTIONS.add(() -> RpoModInfo.LOGGER.info("Save"));
|
2021-08-24 17:42:46 +02:00
|
|
|
SAVE_ACTIONS.add(() -> {
|
|
|
|
for (Map.Entry<String, ConfigBranch> e : CONFIG_BRANCH.entrySet()) {
|
|
|
|
STAR_SCRIPT.set(sanitizeString(e.getKey()), () -> e.getValue().buildStarscript());
|
|
|
|
}
|
|
|
|
});
|
2021-09-15 16:45:54 +02:00
|
|
|
DirFilterEventImpl.init();
|
|
|
|
FileFilterEventImpl.init();
|
2021-09-15 18:37:07 +02:00
|
|
|
if (RpoModInfo.CONFIG.debugCommands)
|
|
|
|
RpoCommand.register();
|
2020-11-25 14:28:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void save() {
|
2021-09-15 18:37:07 +02:00
|
|
|
if (RpoModInfo.CONFIG.debugLogs)
|
|
|
|
RpoModInfo.LOGGER.info("Saving configs");
|
2021-06-10 18:28:47 +02:00
|
|
|
for (Map.Entry<String, ConfigBranch> e : CONFIG_BRANCH.entrySet()) {
|
2021-09-15 18:37:07 +02:00
|
|
|
try (Writer writer = Files.newBufferedWriter(RpoModInfo.CONF_DIR.resolve(e.getKey() + ".json"))) {
|
|
|
|
RpoModInfo.GSON.toJson(e.getValue(), writer);
|
2020-11-25 14:28:29 +01:00
|
|
|
writer.flush();
|
2021-06-10 18:28:47 +02:00
|
|
|
} catch (IOException ex) {
|
2021-09-15 18:37:07 +02:00
|
|
|
RpoModInfo.LOGGER.error("Could not save config", ex);
|
2020-11-25 14:28:29 +01:00
|
|
|
}
|
|
|
|
}
|
2021-06-10 13:10:12 +02:00
|
|
|
for (Runnable action : SAVE_ACTIONS) {
|
2020-11-26 20:11:38 +01:00
|
|
|
action.run();
|
|
|
|
}
|
2020-11-25 14:28:29 +01:00
|
|
|
}
|
|
|
|
|
2020-12-20 14:24:48 +01:00
|
|
|
public static void load(String id) {
|
2021-09-15 18:37:07 +02:00
|
|
|
Path q = RpoModInfo.CONF_DIR.resolve(id + ".json");
|
2020-12-20 14:24:48 +01:00
|
|
|
if (Files.exists(q)) {
|
2021-09-15 18:37:07 +02:00
|
|
|
if (RpoModInfo.CONFIG.debugLogs)
|
|
|
|
RpoModInfo.LOGGER.info("Loading configs for: " + id);
|
2021-06-10 13:10:12 +02:00
|
|
|
try (Reader reader = Files.newBufferedReader(q)) {
|
2021-09-15 18:37:07 +02:00
|
|
|
ConfigBranch b = RpoModInfo.GSON.fromJson(reader, ConfigBranch.class);
|
2021-06-10 13:10:12 +02:00
|
|
|
if (CONFIG_BRANCH.containsKey(id))
|
2021-06-10 14:55:03 +02:00
|
|
|
CONFIG_BRANCH.get(id).sync(b, SyncMode.CONF_LOAD);
|
2021-08-24 17:42:46 +02:00
|
|
|
STAR_SCRIPT.set(sanitizeString(id), b::buildStarscript);
|
2021-06-10 14:55:03 +02:00
|
|
|
} catch (IOException e) {
|
2021-09-15 18:37:07 +02:00
|
|
|
RpoModInfo.LOGGER.error("Failed to load " + id, e);
|
2020-12-20 14:24:48 +01:00
|
|
|
}
|
|
|
|
}
|
2020-11-25 14:28:29 +01:00
|
|
|
}
|
2021-07-08 16:27:31 +02:00
|
|
|
|
|
|
|
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_]*$", "");
|
|
|
|
}
|
2021-08-24 17:42:46 +02:00
|
|
|
|
|
|
|
public static CompletableFuture<Void> forceReloadResources() {
|
2021-09-15 18:37:07 +02:00
|
|
|
if (RpoModInfo.CONFIG.debugLogs)
|
|
|
|
RpoModInfo.LOGGER.info("Forcing resource reload");
|
2021-08-24 17:42:46 +02:00
|
|
|
return CompletableFuture.allOf(MinecraftClient.getInstance().reloadResources(),
|
|
|
|
reloadData());
|
|
|
|
}
|
|
|
|
|
|
|
|
public static CompletableFuture<Void> reloadData() {
|
|
|
|
IntegratedServer is = MinecraftClient.getInstance().getServer();
|
|
|
|
if (is != null) {
|
|
|
|
is.getDataPackManager().scanPacks();
|
|
|
|
return is.reloadResources(is.getDataPackManager().getEnabledNames());
|
|
|
|
}
|
|
|
|
return CompletableFuture.completedFuture(null);
|
|
|
|
}
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|