diff --git a/src/main/java/one/oth3r/sit/Sit.java b/src/main/java/one/oth3r/sit/Sit.java index 9d0d444..8138f2a 100644 --- a/src/main/java/one/oth3r/sit/Sit.java +++ b/src/main/java/one/oth3r/sit/Sit.java @@ -9,7 +9,7 @@ public class Sit implements ModInitializer { @Override public void onInitialize() { - FileData.loadFiles(true); + FileData.loadFiles(); Events.registerCommon(); } } \ No newline at end of file diff --git a/src/main/java/one/oth3r/sit/file/CustomFile.java b/src/main/java/one/oth3r/sit/file/CustomFile.java new file mode 100644 index 0000000..fb2d279 --- /dev/null +++ b/src/main/java/one/oth3r/sit/file/CustomFile.java @@ -0,0 +1,90 @@ +package one.oth3r.sit.file; + +import net.fabricmc.loader.api.FabricLoader; +import one.oth3r.sit.utl.Data; +import one.oth3r.sit.utl.Utl; +import org.jetbrains.annotations.NotNull; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +public interface CustomFile > { + + void reset(); + + /** + * saves the current instance to file + */ + default void save() { + if (!getFile().exists()) { + Data.LOGGER.info(String.format("Creating new `%s`", getFile().getName())); + } + try (BufferedWriter writer = Files.newBufferedWriter(getFile().toPath(), StandardCharsets.UTF_8)) { + writer.write(Utl.getGson().toJson(this)); + } catch (Exception e) { + Data.LOGGER.error(String.format("ERROR SAVING '%s`: %s", getFile().getName(), e.getMessage())); + } + } + + /** + * loads the file to the current instance using updateFromReader() + */ + default void load() { + File file = getFile(); + if (!file.exists()) fileNotExist(); + // try reading the file + try (BufferedReader reader = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) { + updateFromReader(reader); + } catch (Exception e) { + Data.LOGGER.error(String.format("ERROR LOADING '%s`: %s", file.getName(),e.getMessage())); + } + } + + default void updateFromReader(BufferedReader reader) { + // try to read the json + T file; + try { + file = Utl.getGson().fromJson(reader, getFileClass()); + } catch (Exception e) { + throw new NullPointerException(); + } + // throw null if the fileData is null or version is null + if (file == null) throw new NullPointerException(); + + // update the instance + updateToNewFile(file); + } + + @NotNull + Class getFileClass(); + + void updateToNewFile(T newFile); + + /** + * logic for the file not existing when loading, defaults to saving + */ + default void fileNotExist() { + // try to make the config directory + try { + Files.createDirectories(Paths.get(getDirectory())); + } catch (Exception e) { + Data.LOGGER.error("Failed to create config directory. Canceling all config loading..."); + return; + } + save(); + } + + String getFileName(); + + default String getDirectory() { + return FabricLoader.getInstance().getConfigDir().toFile()+"/"; + } + + default File getFile() { + return new File(getDirectory()+getFileName()); + } +} diff --git a/src/main/java/one/oth3r/sit/file/FileData.java b/src/main/java/one/oth3r/sit/file/FileData.java index 9ffefd2..3e0e515 100644 --- a/src/main/java/one/oth3r/sit/file/FileData.java +++ b/src/main/java/one/oth3r/sit/file/FileData.java @@ -16,7 +16,7 @@ public class FileData { private static ServerConfig serverConfig = new ServerConfig(); public static ServerConfig getServerConfig() { - return new ServerConfig(serverConfig); + return serverConfig; } public static void setServerConfig(ServerConfig newServerConfig) { @@ -29,7 +29,7 @@ public class FileData { private static SittingConfig sittingConfig = new SittingConfig(); public static SittingConfig getSittingConfig() { - return new SittingConfig(sittingConfig); + return sittingConfig; } public static void setSittingConfig(SittingConfig newSittingConfig) { @@ -80,11 +80,11 @@ public class FileData { /** * loads all config files to memory - * @param tryLegacy try to load the legacy file, usually only used on server startup */ - public static void loadFiles(boolean tryLegacy) { - ServerConfig.load(tryLegacy); - SittingConfig.load(); + public static void loadFiles() { + getServerConfig().load(); + + getSittingConfig().load(); // if loading file and is on supported server on client, send the new settings over if (Data.isClient() && Data.isSupportedServer()) { Utl.sendSettingsPackets(); diff --git a/src/main/java/one/oth3r/sit/file/ServerConfig.java b/src/main/java/one/oth3r/sit/file/ServerConfig.java index 614212c..a1a0cb6 100644 --- a/src/main/java/one/oth3r/sit/file/ServerConfig.java +++ b/src/main/java/one/oth3r/sit/file/ServerConfig.java @@ -1,18 +1,23 @@ package one.oth3r.sit.file; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import net.minecraft.util.Hand; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Utl; +import org.jetbrains.annotations.NotNull; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.nio.charset.StandardCharsets; +import java.io.FileInputStream; +import java.lang.reflect.Type; import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Properties; -public class ServerConfig { +public class ServerConfig implements CustomFile { @SerializedName("version") private Double version = 2.0; @@ -126,54 +131,237 @@ public class ServerConfig { } } - - - public static File getFile() { - return new File(Data.CONFIG_DIR+"server-config.json"); + @Override + public void reset() { + updateToNewFile(new ServerConfig()); } - /** - * loads the directionhud Config file to Data.config - */ - public static void load(boolean tryLegacy) { + @Override + public @NotNull Class getFileClass() { + return ServerConfig.class; + } + + @Override + public void updateToNewFile(ServerConfig newFile) { + this.version = newFile.version; + this.lang = newFile.lang; + this.keepActive = newFile.keepActive; + this.sitWhileSeated = newFile.sitWhileSeated; + this.presetBlocks = newFile.presetBlocks; + this.customEnabled = newFile.customEnabled; + this.customBlocks = newFile.customBlocks; + this.blacklistedBlocks = newFile.blacklistedBlocks; + } + + @Override + public String getFileName() { + return "server-config.json"; + } + + @Override + public String getDirectory() { + return Data.CONFIG_DIR; + } + + @Override + public void fileNotExist() { + CustomFile.super.fileNotExist(); + // try checking the old/legacy config directory for the file + if (Legacy.getLegacyFile().exists()) { + Data.LOGGER.info("Updating Sit!.properties to sit!/config.json"); + Legacy.run(); + } + } + + protected static class Legacy { + /** + * gets the legacy file, from the old directory for fabric, and the same one for spigot + */ + public static File getLegacyFile() { + // strip the new directory + return new File(Data.CONFIG_DIR.substring(0, Data.CONFIG_DIR.length()-5)+"Sit!.properties"); + } + + /** + * updates the old Sit!.properties to config.json + */ + public static void run() { + // shouldn't happen, only call if the file exists + File file = getLegacyFile(); + if (!file.exists()) return; + + // update to the new system + try (FileInputStream fileStream = new FileInputStream(file)) { + Properties properties = new Properties(); + properties.load(fileStream); + String ver = (String) properties.computeIfAbsent("version", a -> String.valueOf(new ServerConfig().getVersion())); + + // if the old version system (v1.0) remove "v" + if (ver.contains("v")) ver = ver.substring(1); + + loadVersion(properties,Double.parseDouble(ver)); - File file = getFile(); - if (!file.exists()) { - // try to make the config directory - try { - Files.createDirectories(Paths.get(Data.CONFIG_DIR)); } catch (Exception e) { - Data.LOGGER.error("Failed to create config directory. Canceling all config loading..."); - return; + Data.LOGGER.error("Error loading legacy config file: {}", e.getMessage()); } - // if loading from legacy, try checking the old config directory for the file - if (tryLegacy && Updater.ServerConfigFile.Legacy.getLegacyFile().exists()) { - Data.LOGGER.info("Updating Sit!.properties to sit!/config.json"); - Updater.ServerConfigFile.Legacy.run(); + + // delete the old file + try { + Files.delete(file.toPath()); + Data.LOGGER.info("Deleted " + file.getName()); + } catch (Exception e) { + Data.LOGGER.error("Failed to delete the old Sit! config."); } - save(); } - try (BufferedReader reader = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) { - Updater.ServerConfigFile.run(reader); - } catch (Exception e) { - Data.LOGGER.error(String.format("ERROR LOADING '%s`: %s", file.getName(),e.getMessage())); + /** + * converts the legacy hand requirement enum to the new one + * @param requirement the old string + */ + private static HandSetting.SittingRequirement handRequirementUpdater(String requirement) { + return switch (requirement) { + case "restrictive" -> HandSetting.SittingRequirement.FILTER; + case "none" -> HandSetting.SittingRequirement.NONE; + default -> HandSetting.SittingRequirement.EMPTY; + }; } - // save after loading - save(); - } - /** - * saves Data.config to config.json - */ - public static void save() { - if (!getFile().exists()) { - Data.LOGGER.info(String.format("Creating new `%s`", getFile().getName())); + /** + * gets a list of custom blocks from the legacy way of entering custom sit blocks + */ + private static ArrayList getCustomBlocks(ArrayList fix) { + //eg. minecraft:campfire|.46|1|lit=false + ArrayList out = new ArrayList<>(); + for (String entry : fix) { + String[] split = entry.split("\\|"); + // skip if not the right size + if (split.length < 3 || split.length > 4) continue; + // if the other entries aren't correct, skip + if (!Utl.Num.isNum(split[2])) continue; + + // make the block states list if possible + ArrayList blockstates = new ArrayList<>(); + // if there are blockstates + if (split.length == 4) { + blockstates.addAll(Arrays.asList(split[3].split(","))); + } + + // add if everything is A-OK + out.add(new CustomBlock( + new ArrayList<>(Arrays.asList(split[0])), + new ArrayList<>(),blockstates,Double.parseDouble(split[1]))); + } + return out; } - try (BufferedWriter writer = Files.newBufferedWriter(getFile().toPath(), StandardCharsets.UTF_8)) { - writer.write(Utl.getGson().toJson(FileData.getServerConfig())); - } catch (Exception e) { - Data.LOGGER.info(String.format("ERROR SAVING '%s`: %s", getFile().getName(), e.getMessage())); + + private static ArrayList getFilterList(ArrayList whitelist, ArrayList blacklist) { + ArrayList out = new ArrayList<>(whitelist); + // add a ! in front of every entry of the blacklist + out.addAll(blacklist.stream().map(e -> "!"+e).toList()); + return out; + } + + public static void loadVersion(Properties properties, double version) { + try { + Type listType = new TypeToken>() {}.getType(); + ServerConfig defaultConfig = new ServerConfig(); + + // load the latest config + ServerConfig serverConfig = new ServerConfig( + 2.0, + (String) properties.computeIfAbsent("lang", a -> defaultConfig.getLang()), + Boolean.parseBoolean((String) properties.computeIfAbsent("keep-active", a -> String.valueOf(defaultConfig.isKeepActive()))), + Boolean.parseBoolean((String) properties.computeIfAbsent("sit-while-seated", a -> String.valueOf(defaultConfig.canSitWhileSeated()))), + new PresetBlocks( + Boolean.parseBoolean((String) properties.computeIfAbsent("stairs", a -> String.valueOf(defaultConfig.getPresetBlocks().isStairs()))), + Boolean.parseBoolean((String) properties.computeIfAbsent("slabs", a -> String.valueOf(defaultConfig.getPresetBlocks().isSlabs()))), + Boolean.parseBoolean((String) properties.computeIfAbsent("carpets", a -> String.valueOf(defaultConfig.getPresetBlocks().isCarpets()))), + Boolean.parseBoolean((String) properties.computeIfAbsent("full-blocks", a -> String.valueOf(defaultConfig.getPresetBlocks().isFullBlocks()))) + ), + Boolean.parseBoolean((String) properties.computeIfAbsent("custom", a -> String.valueOf(defaultConfig.isCustomEnabled()))), + getCustomBlocks(new Gson().fromJson((String) + properties.computeIfAbsent("custom-blocks", a -> "[]"), listType)), + new ArrayList<>() + ); + + SittingConfig defaultSittingConfig = new SittingConfig(); + + SittingConfig sittingConfig = new SittingConfig(); + // * filters are flipped because the way they work are flipped + try { + sittingConfig = new SittingConfig( + 1.0, true, Boolean.parseBoolean((String) properties.computeIfAbsent("hand.sitting", a -> String.valueOf(defaultSittingConfig.canSitWithHand()))), + new HandSetting( + handRequirementUpdater((String) properties.computeIfAbsent("hand.main.requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.MAIN_HAND).getSittingRequirement()))), + new HandSetting.Filter( + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isBlock()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isFood()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isUsable()))), + getFilterList( + new Gson().fromJson((String) properties.computeIfAbsent("hand.main.whitelist", a -> "[]"), listType), + new Gson().fromJson((String) properties.computeIfAbsent("hand.main.blacklist", a -> "[]"), listType) + ), + new ArrayList<>() + ) + ), + new HandSetting( + handRequirementUpdater((String) properties.computeIfAbsent("hand.off.requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.OFF_HAND).getSittingRequirement()))), + new HandSetting.Filter( + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isBlock()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isFood()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isUsable()))), + getFilterList( + new Gson().fromJson((String) properties.computeIfAbsent("hand.off.whitelist", a -> "[]"), listType), + new Gson().fromJson((String) properties.computeIfAbsent("hand.off.blacklist", a -> "[]"), listType) + ), + new ArrayList<>() + ) + ) + ); + } catch (JsonSyntaxException ignored) {} + + // load an older version + if (version == 1.0) { + try { + sittingConfig = new SittingConfig( + 1.0, true, defaultSittingConfig.canSitWithHand(), + new HandSetting( + handRequirementUpdater((String) properties.computeIfAbsent("main-hand-requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.MAIN_HAND).getSittingRequirement()))), + new HandSetting.Filter( + !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isBlock()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isFood()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isUsable()))), + getFilterList( + new Gson().fromJson((String) properties.computeIfAbsent("main-hand-whitelist", a -> "[]"), listType), + new Gson().fromJson((String) properties.computeIfAbsent("main-hand-blacklist", a -> "[]"), listType) + ), + new ArrayList<>() + ) + ), + new HandSetting( + handRequirementUpdater((String) properties.computeIfAbsent("off-hand-requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.OFF_HAND).getSittingRequirement()))), + new HandSetting.Filter( + !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isBlock()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isFood()))), + !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isUsable()))), + getFilterList( + new Gson().fromJson((String) properties.computeIfAbsent("off-hand-whitelist", a -> "[]"), listType), + new Gson().fromJson((String) properties.computeIfAbsent("off-hand-blacklist", a -> "[]"), listType) + ), + new ArrayList<>() + ) + ) + ); + } catch (JsonSyntaxException ignored) {} + } + + FileData.setServerConfig(serverConfig); + FileData.setSittingConfig(sittingConfig); + serverConfig.save(); + sittingConfig.save(); + } catch (Exception e) { + Data.LOGGER.error("Error loading legacy config: {}", e.getMessage()); + } } } } diff --git a/src/main/java/one/oth3r/sit/file/SittingConfig.java b/src/main/java/one/oth3r/sit/file/SittingConfig.java index e268174..c3409fe 100644 --- a/src/main/java/one/oth3r/sit/file/SittingConfig.java +++ b/src/main/java/one/oth3r/sit/file/SittingConfig.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName; import net.minecraft.util.Hand; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Utl; +import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -12,7 +13,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; -public class SittingConfig { +public class SittingConfig implements CustomFile { @SerializedName("version") private Double version = 1.0; @@ -36,11 +37,7 @@ public class SittingConfig { } public SittingConfig(SittingConfig sittingConfig) { - this.version = sittingConfig.version; - this.enabled = sittingConfig.enabled; - this.handSitting = sittingConfig.handSitting; - this.mainHand = sittingConfig.mainHand; - this.offHand = sittingConfig.offHand; + updateToNewFile(sittingConfig); } public Double getVersion() { @@ -75,38 +72,32 @@ public class SittingConfig { return offHand; } - public static File getFile() { - return new File(Data.CONFIG_DIR+"sitting-config.json"); + @Override + public void reset() { + updateToNewFile(new SittingConfig()); } - /** - * loads the Config file to Data - */ - public static void load() { - - File file = getFile(); - if (!file.exists()) save(); - // try reading the file - try (BufferedReader reader = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) { - Updater.SittingConfigFile.run(reader); - } catch (Exception e) { - Data.LOGGER.error(String.format("ERROR LOADING '%s`: %s", file.getName(),e.getMessage())); - } - // save after loading - save(); + @Override + public @NotNull Class getFileClass() { + return SittingConfig.class; } - /** - * saves Data.config to config.json - */ - public static void save() { - if (!getFile().exists()) { - Data.LOGGER.info(String.format("Creating new `%s`", getFile().getName())); - } - try (BufferedWriter writer = Files.newBufferedWriter(getFile().toPath(), StandardCharsets.UTF_8)) { - writer.write(Utl.getGson().toJson(FileData.getSittingConfig())); - } catch (Exception e) { - Data.LOGGER.error(String.format("ERROR SAVING '%s`: %s", getFile().getName(), e.getMessage())); - } + @Override + public void updateToNewFile(SittingConfig newFile) { + this.version = newFile.version; + this.enabled = newFile.enabled; + this.handSitting = newFile.handSitting; + this.mainHand = newFile.mainHand; + this.offHand = newFile.offHand; + } + + @Override + public String getFileName() { + return "sitting-config.json"; + } + + @Override + public String getDirectory() { + return Data.CONFIG_DIR; } } diff --git a/src/main/java/one/oth3r/sit/file/Updater.java b/src/main/java/one/oth3r/sit/file/Updater.java deleted file mode 100644 index a42d0cb..0000000 --- a/src/main/java/one/oth3r/sit/file/Updater.java +++ /dev/null @@ -1,298 +0,0 @@ -package one.oth3r.sit.file; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonSyntaxException; -import com.google.gson.reflect.TypeToken; -import net.minecraft.util.Hand; -import one.oth3r.sit.utl.Data; -import one.oth3r.sit.utl.Utl; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.util.*; - -public class Updater { - - public static class SittingConfigFile { - - /** - * runs the updater from the file reader and sets the loaded settings when finished - * @param reader the file reader - * @throws NullPointerException if the file is null - */ - public static void run(BufferedReader reader) - throws NullPointerException { - // try to read the json - SittingConfig sittingConfig; - try { - sittingConfig = Utl.getGson().fromJson(reader, SittingConfig.class); - } catch (Exception e) { - throw new NullPointerException(); - } - - // throw null if the fileData is null or version is null - if (sittingConfig == null) throw new NullPointerException(); - - // get the file version - Double version = sittingConfig.getVersion(); - - // if there's no version, throw - if (version == null) throw new NullPointerException(); - - // update the config (using the non-null version) - sittingConfig = update(sittingConfig); - - // set the config in the mod data - FileData.setSittingConfig(sittingConfig); - } - - /** - * updates the file - */ - public static SittingConfig update(SittingConfig old) { - SittingConfig serverConfig = new SittingConfig(old); - return serverConfig; - } - } - - public static class ServerConfigFile { - public static final double VERSION = 1.0; - - /** - * runs the updater from the file reader and sets the loaded settings when finished - * @param reader the file reader - * @throws NullPointerException if the file is null - */ - public static void run(BufferedReader reader) - throws NullPointerException { - // try to read the json - ServerConfig serverConfig; - try { - serverConfig = Utl.getGson().fromJson(reader, ServerConfig.class); - } catch (Exception e) { - throw new NullPointerException(); - } - - // throw null if the fileData is null or version is null - if (serverConfig == null) throw new NullPointerException(); - - // get the file version - Double version = serverConfig.getVersion(); - - // if there's no version, throw - if (version == null) throw new NullPointerException(); - - // update the config (using the non-null version) - serverConfig = update(serverConfig); - - // set the config in the mod data - FileData.setServerConfig(serverConfig); - } - - /** - * updates the file - */ - public static ServerConfig update(ServerConfig old) { - ServerConfig serverConfig = new ServerConfig(old); - return serverConfig; - } - - public static class Legacy { - - /** - * gets the legacy file, from the old directory for fabric, and the same one for spigot - */ - public static File getLegacyFile() { - // strip the new directory - return new File(Data.CONFIG_DIR.substring(0, Data.CONFIG_DIR.length()-5)+"Sit!.properties"); - } - - /** - * updates the old Sit!.properties to config.json - */ - public static void run() { - // shouldn't happen, only call if the file exists - File file = getLegacyFile(); - if (!file.exists()) return; - - // update to the new system - try (FileInputStream fileStream = new FileInputStream(file)) { - Properties properties = new Properties(); - properties.load(fileStream); - String ver = (String) properties.computeIfAbsent("version", a -> String.valueOf(VERSION)); - - // if the old version system (v1.0) remove "v" - if (ver.contains("v")) ver = ver.substring(1); - - loadVersion(properties,Double.parseDouble(ver)); - - } catch (Exception e) { - Data.LOGGER.error("Error loading legacy config file: {}", e.getMessage()); - } - - // delete the old file - try { - Files.delete(file.toPath()); - Data.LOGGER.info("Deleted " + file.getName()); - } catch (Exception e) { - Data.LOGGER.error("Failed to delete the old Sit! config."); - } - } - - /** - * converts the legacy hand requirement enum to the new one - * @param requirement the old string - */ - private static HandSetting.SittingRequirement handRequirementUpdater(String requirement) { - return switch (requirement) { - case "restrictive" -> HandSetting.SittingRequirement.FILTER; - case "none" -> HandSetting.SittingRequirement.NONE; - default -> HandSetting.SittingRequirement.EMPTY; - }; - } - - /** - * gets a list of custom blocks from the legacy way of entering custom sit blocks - */ - private static ArrayList getCustomBlocks(ArrayList fix) { - //eg. minecraft:campfire|.46|1|lit=false - ArrayList out = new ArrayList<>(); - for (String entry : fix) { - String[] split = entry.split("\\|"); - // skip if not the right size - if (split.length < 3 || split.length > 4) continue; - // if the other entries aren't correct, skip - if (!Utl.Num.isNum(split[2])) continue; - - // make the block states list if possible - ArrayList blockstates = new ArrayList<>(); - // if there are blockstates - if (split.length == 4) { - blockstates.addAll(Arrays.asList(split[3].split(","))); - } - - // add if everything is A-OK - out.add(new CustomBlock( - new ArrayList<>(Arrays.asList(split[0])), - new ArrayList<>(),blockstates,Double.parseDouble(split[1]))); - } - return out; - } - - private static ArrayList getFilterList(ArrayList whitelist, ArrayList blacklist) { - ArrayList out = new ArrayList<>(whitelist); - // add a ! in front of every entry of the blacklist - out.addAll(blacklist.stream().map(e -> "!"+e).toList()); - return out; - } - - public static void loadVersion(Properties properties, double version) { - try { - Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - Type listType = new TypeToken>() {}.getType(); - ServerConfig defaultConfig = new ServerConfig(); - - // load the latest config - ServerConfig serverConfig = new ServerConfig( - 2.0, - (String) properties.computeIfAbsent("lang", a -> defaultConfig.getLang()), - Boolean.parseBoolean((String) properties.computeIfAbsent("keep-active", a -> String.valueOf(defaultConfig.isKeepActive()))), - Boolean.parseBoolean((String) properties.computeIfAbsent("sit-while-seated", a -> String.valueOf(defaultConfig.isSitWhileSeated()))), - new ServerConfig.PresetBlocks( - Boolean.parseBoolean((String) properties.computeIfAbsent("stairs", a -> String.valueOf(defaultConfig.getPresetBlocks().isStairs()))), - Boolean.parseBoolean((String) properties.computeIfAbsent("slabs", a -> String.valueOf(defaultConfig.getPresetBlocks().isSlabs()))), - Boolean.parseBoolean((String) properties.computeIfAbsent("carpets", a -> String.valueOf(defaultConfig.getPresetBlocks().isCarpets()))), - Boolean.parseBoolean((String) properties.computeIfAbsent("full-blocks", a -> String.valueOf(defaultConfig.getPresetBlocks().isFullBlocks()))) - ), - Boolean.parseBoolean((String) properties.computeIfAbsent("custom", a -> String.valueOf(defaultConfig.isCustomEnabled()))), - getCustomBlocks(new Gson().fromJson((String) - properties.computeIfAbsent("custom-blocks", a -> "[]"), listType)), - new ArrayList<>() - ); - - SittingConfig defaultSittingConfig = new SittingConfig(); - - SittingConfig sittingConfig = null; - // * filters are flipped because the way they work are flipped - try { - sittingConfig = new SittingConfig( - 1.0, true, Boolean.parseBoolean((String) properties.computeIfAbsent("hand.sitting", a -> String.valueOf(defaultSittingConfig.canSitWithHand()))), - new HandSetting( - handRequirementUpdater((String) properties.computeIfAbsent("hand.main.requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.MAIN_HAND).getSittingRequirement()))), - new HandSetting.Filter( - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isBlock()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isFood()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.main.usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isUsable()))), - getFilterList( - new Gson().fromJson((String) properties.computeIfAbsent("hand.main.whitelist", a -> "[]"), listType), - new Gson().fromJson((String) properties.computeIfAbsent("hand.main.blacklist", a -> "[]"), listType) - ), - new ArrayList<>() - ) - ), - new HandSetting( - handRequirementUpdater((String) properties.computeIfAbsent("hand.off.requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.OFF_HAND).getSittingRequirement()))), - new HandSetting.Filter( - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isBlock()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isFood()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("hand.off.usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isUsable()))), - getFilterList( - new Gson().fromJson((String) properties.computeIfAbsent("hand.off.whitelist", a -> "[]"), listType), - new Gson().fromJson((String) properties.computeIfAbsent("hand.off.blacklist", a -> "[]"), listType) - ), - new ArrayList<>() - ) - ) - ); - } catch (JsonSyntaxException ignored) {} - - // load an older version - if (version == 1.0) { - try { - sittingConfig = new SittingConfig( - 1.0, true, defaultSittingConfig.canSitWithHand(), - new HandSetting( - handRequirementUpdater((String) properties.computeIfAbsent("main-hand-requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.MAIN_HAND).getSittingRequirement()))), - new HandSetting.Filter( - !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isBlock()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isFood()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("main-hand-usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.MAIN_HAND).getFilter().isUsable()))), - getFilterList( - new Gson().fromJson((String) properties.computeIfAbsent("main-hand-whitelist", a -> "[]"), listType), - new Gson().fromJson((String) properties.computeIfAbsent("main-hand-blacklist", a -> "[]"), listType) - ), - new ArrayList<>() - ) - ), - new HandSetting( - handRequirementUpdater((String) properties.computeIfAbsent("off-hand-requirement", a -> String.valueOf(defaultSittingConfig.getHand(Hand.OFF_HAND).getSittingRequirement()))), - new HandSetting.Filter( - !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-block", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isBlock()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-food", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isFood()))), - !Boolean.parseBoolean((String) properties.computeIfAbsent("off-hand-usable", a -> String.valueOf(!defaultSittingConfig.getHand(Hand.OFF_HAND).getFilter().isUsable()))), - getFilterList( - new Gson().fromJson((String) properties.computeIfAbsent("off-hand-whitelist", a -> "[]"), listType), - new Gson().fromJson((String) properties.computeIfAbsent("off-hand-blacklist", a -> "[]"), listType) - ), - new ArrayList<>() - ) - ) - ); - } catch (JsonSyntaxException ignored) {} - } - - FileData.setServerConfig(serverConfig); - FileData.setSittingConfig(sittingConfig); - ServerConfig.save(); - SittingConfig.save(); - } catch (Exception e) { - Data.LOGGER.error("Error loading legacy config: {}", e.getMessage()); - } - } - } - } -} diff --git a/src/main/java/one/oth3r/sit/utl/Events.java b/src/main/java/one/oth3r/sit/utl/Events.java index 8e1ba77..42c6362 100644 --- a/src/main/java/one/oth3r/sit/utl/Events.java +++ b/src/main/java/one/oth3r/sit/utl/Events.java @@ -55,7 +55,7 @@ public class Events { // set the sitting config to the new value FileData.setSittingConfig(config); // save the changes to the file - SittingConfig.save(); + config.save(); // send the changes to the server Utl.sendSettingsPackets(); diff --git a/src/main/java/one/oth3r/sit/utl/Logic.java b/src/main/java/one/oth3r/sit/utl/Logic.java index 089b0b8..46bd757 100644 --- a/src/main/java/one/oth3r/sit/utl/Logic.java +++ b/src/main/java/one/oth3r/sit/utl/Logic.java @@ -139,7 +139,7 @@ public class Logic { * reloads the config files */ public static void reload() { - FileData.loadFiles(false); + FileData.loadFiles(); } }