From f4f467f6fe20b28ad48ae47aca58af00402965f4 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:32:17 +0200 Subject: [PATCH] Fix 1.21 config being wrong: fix 1.21 config updater and automatically repair previously broken config version: - Allow 1.21 enchantment in enchantment book - Add unit repair of mace with breeze rod Also version up --- build.gradle.kts | 2 +- .../alexcrea/cuanvil/update/UpdateUtils.java | 10 +++- .../alexcrea/cuanvil/update/Update_1_21.java | 24 ++++---- .../xyz/alexcrea/cuanvil/update/Version.java | 48 ++++++++++++++++ .../cuanvil/update/plugin/PUpdate_1_6_2.java | 56 +++++++++++++++++++ .../cuanvil/update/plugin/PluginUpdates.java | 39 +++++++++++++ src/main/kotlin/io/delilaheve/CustomAnvil.kt | 4 ++ .../packet/PacketManagerSelector.kt | 2 +- src/main/resources/config.yml | 2 +- src/main/resources/plugin.yml | 2 +- 10 files changed, 173 insertions(+), 16 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/update/Version.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_6_2.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java diff --git a/build.gradle.kts b/build.gradle.kts index d8ed4d9..28cb586 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ plugins { } group = "xyz.alexcrea" -version = "1.6.1" +version = "1.6.2" repositories { // EcoEnchants diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java index 93ae0d5..93d37aa 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java +++ b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java @@ -10,7 +10,13 @@ import java.util.List; public class UpdateUtils { public static final String MINECRAFT_VERSION_PATH = "lowMinecraftVersion"; - public static int[] currentMinecraftVersion(){ + public static Version currentMinecraftVersion(){ + String versionString = Bukkit.getServer().getBukkitVersion().split("-")[0]; + return Version.fromString(versionString); + } + + @Deprecated + public static int[] currentMinecraftVersionArray(){ String versionString = Bukkit.getServer().getBukkitVersion().split("-")[0]; return UpdateUtils.readVersionFromString(versionString); } @@ -25,7 +31,7 @@ public class UpdateUtils { return versionParts; } - static void addToStringList(FileConfiguration config, String path, String... toAdd){ + public static void addToStringList(FileConfiguration config, String path, String... toAdd){ List groups = new ArrayList<>(config.getStringList(path)); groups.addAll(Arrays.asList(toAdd)); config.set(path, groups); diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java b/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java index 859e2e8..3211497 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java +++ b/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java @@ -10,22 +10,21 @@ import static xyz.alexcrea.cuanvil.update.UpdateUtils.addToStringList; // It will be replaced by a better system later. public class Update_1_21 { + private static final Version V1_21 = new Version(1, 21); + public static void handleUpdate(){ // Assume if version path is not null then it's 1.21 String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH); if(oldVersion != null){ - int[] versionParts = UpdateUtils.readVersionFromString(oldVersion); + Version version = Version.fromString(oldVersion); // Test 1.21 - if((versionParts[0] >= 1) && (versionParts[1] >= 21)){ - return; - } + if(V1_21.greaterEqual(version)) return; } - - int[] versionParts = UpdateUtils.currentMinecraftVersion(); + Version current = UpdateUtils.currentMinecraftVersion(); // Test 1.21 - if((versionParts[0] >= 1) && (versionParts[1] >= 21)){ + if(current.greaterEqual(V1_21)){ doUpdate(); } @@ -37,6 +36,7 @@ public class Update_1_21 { FileConfiguration baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig(); FileConfiguration groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig(); FileConfiguration conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig(); + FileConfiguration unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); // Add mace to groups groupConfig.set("mace.type", "include"); @@ -46,13 +46,13 @@ public class Update_1_21 { // Add new enchant conflicts addToStringList(conflictConfig, "restriction_density.enchantments", "density"); - addToStringList(conflictConfig, "restriction_density.notAffectedGroups", "mace"); + addToStringList(conflictConfig, "restriction_density.notAffectedGroups", "mace", "enchanted_book"); addToStringList(conflictConfig, "restriction_breach.enchantments", "breach"); - addToStringList(conflictConfig, "restriction_breach.notAffectedGroups", "mace"); + addToStringList(conflictConfig, "restriction_breach.notAffectedGroups", "mace", "enchanted_book"); addToStringList(conflictConfig, "restriction_wind_burst.enchantments", "wind_burst"); - addToStringList(conflictConfig, "restriction_wind_burst.notAffectedGroups", "mace"); + addToStringList(conflictConfig, "restriction_wind_burst.notAffectedGroups", "mace", "enchanted_book"); // Add mace to conflicts addToStringList(conflictConfig, "restriction_fire_aspect.notAffectedGroups", "mace"); @@ -77,6 +77,9 @@ public class Update_1_21 { baseConfig.set("enchant_values.wind_burst.item", 4); baseConfig.set("enchant_values.wind_burst.book", 2); + // Add unit repair for mace + unitConfig.set("breeze_rod.mace", 0.25); + // Set version string as 1.21 baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, "1.21"); @@ -84,6 +87,7 @@ public class Update_1_21 { ConfigHolder.DEFAULT_CONFIG.saveToDisk(true); ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true); ConfigHolder.CONFLICT_HOLDER.saveToDisk(true); + ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true); // imply reload of CONFLICT_HOLDER // We also do not need to reload base config as there is no object related to it. diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/Version.java b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java new file mode 100644 index 0000000..ffa8660 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java @@ -0,0 +1,48 @@ +package xyz.alexcrea.cuanvil.update; + +import javax.annotation.Nonnull; + +public record Version(int major, int minor, int patch) { + + public Version(int major, int minor){ + this(major, minor, 0); + } + public Version(int major){ + this(major, 0, 0); + } + + public static Version fromString(@Nonnull String versionString){ + String[] partialVersion = versionString.split("\\."); + int[] versionParts = new int[]{0, 0, 0}; + + for (int i = 0; i < Math.min(3, partialVersion.length); i++) { + versionParts[i] = Integer.parseInt(partialVersion[i]); + } + return new Version(versionParts[0], versionParts[1], versionParts[2]); + } + + public boolean greaterThan(@Nonnull Version other){ + return this.major > other.major || (this.major == other.major && + (this.minor > other.minor || (this.minor == other.minor && + this.patch > other.patch))); + } + + public boolean greaterEqual(@Nonnull Version other){ + return this.major > other.major || (this.major == other.major && + (this.minor > other.minor || (this.minor == other.minor && + this.patch >= other.patch))); + } + + public boolean lesserThan(@Nonnull Version other){ + return this.major < other.major || (this.major == other.major && + (this.minor < other.minor || (this.minor == other.minor && + this.patch < other.patch))); + } + + public boolean lesserEqual(@Nonnull Version other){ + return this.major < other.major || (this.major == other.major && + (this.minor < other.minor || (this.minor == other.minor && + this.patch <= other.patch))); + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_6_2.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_6_2.java new file mode 100644 index 0000000..d004d2d --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_6_2.java @@ -0,0 +1,56 @@ +package xyz.alexcrea.cuanvil.update.plugin; + +import io.delilaheve.CustomAnvil; +import org.bukkit.configuration.file.FileConfiguration; +import xyz.alexcrea.cuanvil.config.ConfigHolder; + +import javax.annotation.Nonnull; +import java.util.Set; + +import static xyz.alexcrea.cuanvil.update.UpdateUtils.addToStringList; + +public class PUpdate_1_6_2 { + + private static final String[] toUpdate = new String[] {"restriction_density", "restriction_breach", "restriction_wind_burst"}; + + public static void handleUpdate(@Nonnull Set toSave) { + FileConfiguration config = ConfigHolder.CONFLICT_HOLDER.getConfig(); + + boolean conflictUpdated = false; + for (String restriction : toUpdate) { + if(!config.isConfigurationSection(restriction)) continue; + String path = restriction + ".notAffectedGroups"; + + boolean contained = false; + for (String value : config.getStringList(path)) { + if(value.equalsIgnoreCase("enchanted_book")) { + contained = true; + break; + } + } + + if(!contained){ + addToStringList(config, path, "enchanted_book"); + conflictUpdated = true; + } + } + + if(conflictUpdated){ + toSave.add(ConfigHolder.CONFLICT_HOLDER); + + // May not be the most efficient for later revision, maybe move to PluginUpdates + ConfigHolder.CONFLICT_HOLDER.reload(); + } + + // Then we add the unit repair + config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); + String unitRepairPath = "breeze_rod.mace"; + if(!config.isConfigurationSection(unitRepairPath)){ + config.set(unitRepairPath, 0.25); + + toSave.add(ConfigHolder.UNIT_REPAIR_HOLDER); + } + + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java new file mode 100644 index 0000000..cc0901b --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java @@ -0,0 +1,39 @@ +package xyz.alexcrea.cuanvil.update.plugin; + +import io.delilaheve.CustomAnvil; +import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.update.Version; + +import javax.annotation.Nonnull; +import java.util.HashSet; +import java.util.Set; + +public class PluginUpdates { + + private static final String CONFIG_VERSION_PATH = "configVersion"; + + public static void handlePluginUpdate(){ + String versionString = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(CONFIG_VERSION_PATH); + Version current = versionString == null ? new Version(0) : Version.fromString(versionString); + + Set toSave = new HashSet<>(); + + if(new Version(1, 6, 2).greaterThan(current)){ + PUpdate_1_6_2.handleUpdate(toSave); + + finishConfiguration("1.6.2", toSave); + } + + } + + private static void finishConfiguration(@Nonnull String newVersion, @Nonnull Set toSave) { + CustomAnvil.instance.getLogger().info("Configuration file updated to " + newVersion); + ConfigHolder.DEFAULT_CONFIG.getConfig().set(CONFIG_VERSION_PATH, newVersion); + + toSave.add(ConfigHolder.DEFAULT_CONFIG); + for (ConfigHolder configHolder : toSave) { + configHolder.saveToDisk(true); + } + } + +} diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt index 935a104..cbeb5cd 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -16,6 +16,7 @@ import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant import xyz.alexcrea.cuanvil.listener.ChatEventListener import xyz.alexcrea.cuanvil.update.PluginSetDefault import xyz.alexcrea.cuanvil.update.Update_1_21 +import xyz.alexcrea.cuanvil.update.plugin.PluginUpdates import xyz.alexcrea.cuanvil.util.Metrics import java.io.File import java.io.FileReader @@ -136,6 +137,9 @@ class CustomAnvil : JavaPlugin() { // temporary: handle 1.21 update Update_1_21.handleUpdate() + // plugin configuration updates + PluginUpdates.handlePluginUpdate() + // Register enchantment of compatible plugin and load configuration change. DependencyManager.handleCompatibilityConfig() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt index 0d66070..8c251dc 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt @@ -21,7 +21,7 @@ object PacketManagerSelector { NoPacketManager() private val versionSpecificManager: PacketManagerBase? get() { - val versionParts = UpdateUtils.currentMinecraftVersion() + val versionParts = UpdateUtils.currentMinecraftVersionArray() if (versionParts[0] != 1) return null return when (versionParts[1]) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 09f142c..462866d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -283,4 +283,4 @@ debug_log_verbose: false # ProtocoLib may also be used if the server is in an "unsupported" version even if this option is disabled. force_protocolib: false -configVersion: 1.4.5 +configVersion: 1.6.2 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c7f2a01..5cb7359 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ main: io.delilaheve.CustomAnvil name: CustomAnvil prefix: "Custom Anvil" -version: 1.6.1 +version: 1.6.2 folia-supported: true description: Allow to customise anvil mechanics api-version: 1.16