From 6d3cd32705d65d3f3bd159015cba68e49fa91b37 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:38:34 +0200 Subject: [PATCH 1/4] Fix issue with init of main config gui. --- .../java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java | 4 +--- src/main/kotlin/io/delilaheve/CustomAnvil.kt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java index 9b8fb90..db5e835 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java @@ -24,11 +24,9 @@ public class MainConfigGui extends ChestGui { private MainConfigGui() { super(3, "\u00A78Anvil Config", CustomAnvil.instance); - - init(CustomAnvil.instance.packetManager); } - private void init(PacketManager packetManager) { + public void init(PacketManager packetManager) { Pattern pattern = new Pattern( "000000000", "012304567", diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt index beedd0c..ea4dcf3 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -108,7 +108,7 @@ class CustomAnvil : JavaPlugin() { if (!success) return // Load gui constants //TODO maybe something better later - MainConfigGui.getInstance() + MainConfigGui.getInstance().init(this.packetManager) GuiSharedConstant.loadConstants() // Load metrics From a9c65dfddc5ca8ff92917dfa7cca95e262d7725e Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Fri, 14 Jun 2024 19:14:46 +0200 Subject: [PATCH 2/4] Add support for 1.21 --- .../enchant/EnchantmentProperties.java | 6 +- .../alexcrea/cuanvil/update/UpdateUtils.java | 29 ++++++ .../alexcrea/cuanvil/update/Update_1_21.java | 98 +++++++++++++++++++ src/main/kotlin/io/delilaheve/CustomAnvil.kt | 4 + 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/EnchantmentProperties.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/EnchantmentProperties.java index 3651e87..1137feb 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/EnchantmentProperties.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/EnchantmentProperties.java @@ -7,7 +7,9 @@ public enum EnchantmentProperties { BANE_OF_ARTHROPODS(EnchantmentRarity.UNCOMMON), BINDING_CURSE(EnchantmentRarity.VERY_RARE), BLAST_PROTECTION(EnchantmentRarity.RARE), + BREACH(EnchantmentRarity.RARE), CHANNELING(EnchantmentRarity.VERY_RARE), + DENSITY(EnchantmentRarity.UNCOMMON), DEPTH_STRIDER(EnchantmentRarity.RARE), EFFICIENCY(EnchantmentRarity.COMMON), FLAME(EnchantmentRarity.RARE), @@ -42,7 +44,9 @@ public enum EnchantmentProperties { SWEEPING_EDGE(EnchantmentRarity.RARE), THORNS(EnchantmentRarity.VERY_RARE), UNBREAKING(EnchantmentRarity.UNCOMMON), - VANISHING_CURSE(EnchantmentRarity.VERY_RARE); + VANISHING_CURSE(EnchantmentRarity.VERY_RARE), + WIND_BURST(EnchantmentRarity.RARE), + ; private final EnchantmentRarity rarity; diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java new file mode 100644 index 0000000..6448ced --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java @@ -0,0 +1,29 @@ +package xyz.alexcrea.cuanvil.update; + +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UpdateUtils { + public final static String MINECRAFT_VERSION_PATH = "lowMinecraftVersion"; + + static int[] readVersionFromString(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 versionParts; + } + + 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 new file mode 100644 index 0000000..dca039a --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java @@ -0,0 +1,98 @@ +package xyz.alexcrea.cuanvil.update; + +import io.delilaheve.CustomAnvil; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import xyz.alexcrea.cuanvil.config.ConfigHolder; + +import static xyz.alexcrea.cuanvil.update.UpdateUtils.addToStringList; + +// This is a temporary class that aim to handle 1.21 update. +// It will be replaced by a better system later. +public class Update_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); + + // Test 1.21 + if((versionParts[0] >= 1) && (versionParts[1] >= 21)){ + return; + } + } + + String versionString = Bukkit.getServer().getBukkitVersion().split("-")[0]; + int[] versionParts = UpdateUtils.readVersionFromString(versionString); + + // Test 1.21 + if((versionParts[0] >= 1) && (versionParts[1] >= 21)){ + doUpdate(); + } + + } + + private static void doUpdate() { + CustomAnvil.instance.getLogger().info("Updating config to support 1.21 ..."); + + FileConfiguration baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig(); + FileConfiguration groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig(); + FileConfiguration conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig(); + + // Add mace to groups + groupConfig.set("mace.type", "include"); + addToStringList(groupConfig, "mace.items", "mace"); + + addToStringList(groupConfig, "can_unbreak.groups", "mace"); + + // Add new enchant conflicts + addToStringList(conflictConfig, "restriction_density.enchantments", "density"); + addToStringList(conflictConfig, "restriction_density.notAffectedGroups", "mace"); + + addToStringList(conflictConfig, "restriction_breach.enchantments", "breach"); + addToStringList(conflictConfig, "restriction_breach.notAffectedGroups", "mace"); + + addToStringList(conflictConfig, "restriction_wind_burst.enchantments", "wind_burst"); + addToStringList(conflictConfig, "restriction_wind_burst.notAffectedGroups", "mace"); + + // Add mace to conflicts + addToStringList(conflictConfig, "restriction_fire_aspect.notAffectedGroups", "mace"); + addToStringList(conflictConfig, "restriction_smite.notAffectedGroups", "mace"); + addToStringList(conflictConfig, "restriction_bane_of_arthropods.notAffectedGroups", "mace"); + + addToStringList(conflictConfig, "mace_enchant_conflict.enchantments", "density", "breach", "smite", "bane_of_arthropods"); + conflictConfig.set("mace_enchant_conflict.maxEnchantmentBeforeConflict", 1); + + // Add level limit + baseConfig.set("enchant_limits.density", 5); + baseConfig.set("enchant_limits.breach", 4); + baseConfig.set("enchant_limits.wind_burst", 3); + + // Add enchant values + baseConfig.set("enchant_values.density.item", 1); + baseConfig.set("enchant_values.density.book", 1); + + baseConfig.set("enchant_values.breach.item", 4); + baseConfig.set("enchant_values.breach.book", 2); + + baseConfig.set("enchant_values.wind_burst.item", 4); + baseConfig.set("enchant_values.wind_burst.book", 2); + + // Set version string as 1.21 + baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, "1.21"); + + // Save + ConfigHolder.DEFAULT_CONFIG.saveToDisk(true); + ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true); + ConfigHolder.CONFLICT_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. + ConfigHolder.ITEM_GROUP_HOLDER.reload(); + + CustomAnvil.instance.getLogger().info("Updating Done !"); + + } + +} diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt index ea4dcf3..75fcbfa 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -13,6 +13,7 @@ import xyz.alexcrea.cuanvil.listener.ChatEventListener import xyz.alexcrea.cuanvil.packet.NoProtocoLib import xyz.alexcrea.cuanvil.packet.PacketManager import xyz.alexcrea.cuanvil.packet.ProtocoLibWrapper +import xyz.alexcrea.cuanvil.update.Update_1_21 import xyz.alexcrea.cuanvil.util.Metrics import xyz.alexcrea.cuanvil.util.MetricsUtil import java.io.File @@ -107,6 +108,9 @@ class CustomAnvil : JavaPlugin() { val success = ConfigHolder.loadConfig() if (!success) return + // temporary: handle 1.21 update + Update_1_21.handleUpdate() + // Load gui constants //TODO maybe something better later MainConfigGui.getInstance().init(this.packetManager) GuiSharedConstant.loadConstants() From 97bf57b8aa08f9bd26e881f2d3199c0f383675b4 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Fri, 14 Jun 2024 19:18:50 +0200 Subject: [PATCH 3/4] Remove custom metric --- .../alexcrea/cuanvil/config/ConfigHolder.java | 7 +- .../config/list/UnitRepairElementListGui.java | 2 - .../gui/config/settings/BoolSettingsGui.java | 2 - .../gui/config/settings/DoubleSettingGui.java | 2 - .../settings/EnchantCostSettingsGui.java | 2 - .../gui/config/settings/IntSettingsGui.java | 2 - .../gui/config/settings/ItemSettingGui.java | 2 - src/main/kotlin/io/delilaheve/CustomAnvil.kt | 4 +- .../cuanvil/command/ReloadExecutor.kt | 4 - .../xyz/alexcrea/cuanvil/util/MetricsUtil.kt | 160 ------------------ 10 files changed, 2 insertions(+), 185 deletions(-) delete mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt diff --git a/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java b/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java index eb74480..8999b8b 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java +++ b/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java @@ -7,7 +7,6 @@ import org.bukkit.configuration.file.YamlConfiguration; import xyz.alexcrea.cuanvil.group.EnchantConflictManager; import xyz.alexcrea.cuanvil.group.ItemGroupManager; import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager; -import xyz.alexcrea.cuanvil.util.MetricsUtil; import java.io.File; import java.io.IOException; @@ -28,11 +27,7 @@ public abstract class ConfigHolder { UNIT_REPAIR_HOLDER = new UnitRepairHolder(); CUSTOM_RECIPE_HOLDER = new CustomAnvilCraftHolder(); - boolean result = reloadAllFromDisk(true); - if (result) { - MetricsUtil.INSTANCE.testIfConfigIsDefault(); - } - return result; + return reloadAllFromDisk(true); } public static boolean reloadAllFromDisk(boolean hardfail) { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java index 3a571f2..88b59f0 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java @@ -17,7 +17,6 @@ import xyz.alexcrea.cuanvil.gui.config.settings.DoubleSettingGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.util.CasedStringUtil; -import xyz.alexcrea.cuanvil.util.MetricsUtil; import java.util.ArrayList; import java.util.Arrays; @@ -85,7 +84,6 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui): Boolean { @@ -45,9 +44,6 @@ class ReloadExecutor : CommandExecutor { UnitRepairConfigGui.INSTANCE.reloadValues() CustomRecipeConfigGui.INSTANCE.reloadValues() - // & update metric - MetricsUtil.testIfConfigIsDefault() - return true } catch (e: Exception) { e.printStackTrace() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt deleted file mode 100644 index 3d080f1..0000000 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt +++ /dev/null @@ -1,160 +0,0 @@ -package xyz.alexcrea.cuanvil.util - -import io.delilaheve.CustomAnvil -import io.delilaheve.util.ConfigOptions -import org.bukkit.configuration.ConfigurationSection -import xyz.alexcrea.cuanvil.config.ConfigHolder - -object MetricsUtil { - - private const val baseConfigHash = 1000387384 - private const val enchantLimitsConfigHash = -275034280 - private const val enchantValuesConfigHash = -17048020 - private const val enchantConflictConfigHash = 546475833 - private const val itemGroupsConfigHash = 1406650190 - private const val unitRepairItemConfigHash = 536871958 - private const val customAnvilCraftConfigHash = 0 - private const val baseConfigPieName = "isDefaultBaseConfig" - private const val enchantLimitsConfigPieName = "isDefaultEnchantLimitsConfig" - private const val enchantValuesConfigPieName = "isDefaultEnchantValuesConfig" - private const val enchantConflictConfigPieName = "isDefaultEnchantConflictConfig" - private const val itemGroupsConfigPieName = "isDefaultItemGroupsConfig" - private const val unitRepairItemConfigPieName = "isDefaultUnitRepairItemConfig" - private const val customAnvilCraftConfigPieName = "isDefaultCustomAnvilCraftConfig" - private var isDefaultBaseConfig = true - private var isDefaultEnchantLimitsConfig = true - private var isDefaultEnchantValuesConfig = true - private var isDefaultEnchantConflictConfig = true - private var isDefaultItemGroupsConfig = true - private var isDefaultUnitRepairItemConfig = true - private var isDefaultCustomAnvilCraftConfig = true - - /** - * Get hash of a key, value a pair of a configuration section - */ - private fun getHashFromKey(section: ConfigurationSection, key: String): Int { - // Key is assumend to exist - val resultHash = if (section.isConfigurationSection(key)) { - val sectionResult = getConfigurationHash(section.getConfigurationSection(key)!!) - key.hashCode() xor sectionResult - } else { - key.hashCode() xor section.getString(key).hashCode() - } - return resultHash.hashCode() - } - - /** - * Get hash of a configuration section - */ - private fun getConfigurationHash(section: ConfigurationSection): Int { - var resultHash = 0 - for (key in section.getKeys(false)) { - resultHash = resultHash xor getHashFromKey(section, key) - } - return resultHash - } - - /** - * Get hash value of the default config - */ - private fun testBaseConfig(defaultConfig: ConfigurationSection): Int { - var result = 0 - for (key in ConfigOptions.getBasicConfigKeys()) { - result = result xor getHashFromKey(defaultConfig, key) - } - return result - } - - /** - * Test if the used configuration is the default config - */ - fun testIfConfigIsDefault() { - // Calculate hash of config - val baseConfig = testBaseConfig(ConfigHolder.DEFAULT_CONFIG.config) - val limitEnchantConfig = getHashFromKey(ConfigHolder.DEFAULT_CONFIG.config, ConfigOptions.ENCHANT_LIMIT_ROOT) - val enchantValueConfig = getHashFromKey(ConfigHolder.DEFAULT_CONFIG.config, ConfigOptions.ENCHANT_VALUES_ROOT) - val enchantConflictConfig = getConfigurationHash(ConfigHolder.CONFLICT_HOLDER.config) - val itemGroupConfig = getConfigurationHash(ConfigHolder.ITEM_GROUP_HOLDER.config) - val unitRepairConfig = getConfigurationHash(ConfigHolder.UNIT_REPAIR_HOLDER.config) - val customRecipeConfig = getConfigurationHash(ConfigHolder.CUSTOM_RECIPE_HOLDER.config) - // Test if default - isDefaultBaseConfig = baseConfigHash == baseConfig - isDefaultEnchantLimitsConfig = enchantLimitsConfigHash == limitEnchantConfig - isDefaultEnchantValuesConfig = enchantValuesConfigHash == enchantValueConfig - isDefaultEnchantConflictConfig = enchantConflictConfigHash == enchantConflictConfig - isDefaultItemGroupsConfig = itemGroupsConfigHash == itemGroupConfig - isDefaultUnitRepairItemConfig = unitRepairItemConfigHash == unitRepairConfig - isDefaultCustomAnvilCraftConfig = customAnvilCraftConfigHash == customRecipeConfig - // If not default and debug flag active, print the hash. - if (ConfigOptions.debugLog) { - if (!isDefaultBaseConfig) { - CustomAnvil.log("baseConfig: $baseConfig") - } - if (!isDefaultEnchantLimitsConfig) { - CustomAnvil.log("limitEnchantConfig: $limitEnchantConfig") - } - if (!isDefaultEnchantValuesConfig) { - CustomAnvil.log("enchantValueConfig: $enchantValueConfig") - } - if (!isDefaultEnchantConflictConfig) { - CustomAnvil.log("enchantConflictConfig: $enchantConflictConfig") - } - if (!isDefaultItemGroupsConfig) { - CustomAnvil.log("itemGroupConfig: $itemGroupConfig") - } - if (!isDefaultUnitRepairItemConfig) { - CustomAnvil.log("unitRepairConfig: $unitRepairConfig") - } - if (!isDefaultCustomAnvilCraftConfig) { - CustomAnvil.log("customRecipeConfig: $customRecipeConfig") - } - } - - } - - fun notifyChange(holder: ConfigHolder, path: String) { - if (ConfigHolder.DEFAULT_CONFIG.equals(holder)) { - if (path.startsWith(ConfigOptions.ENCHANT_LIMIT_ROOT + ".")) { - isDefaultEnchantLimitsConfig = false - } else if (path.startsWith(ConfigOptions.ENCHANT_VALUES_ROOT + ".")) { - isDefaultEnchantValuesConfig = false - } else { - isDefaultBaseConfig = false - } - } else if (ConfigHolder.CONFLICT_HOLDER.equals(holder)) { - isDefaultEnchantConflictConfig = false - } else if (ConfigHolder.ITEM_GROUP_HOLDER.equals(holder)) { - isDefaultItemGroupsConfig = false - } else if (ConfigHolder.UNIT_REPAIR_HOLDER.equals(holder)) { - isDefaultUnitRepairItemConfig = false - } else if (ConfigHolder.CUSTOM_RECIPE_HOLDER.equals(holder)) { - isDefaultCustomAnvilCraftConfig = false - } - - } - - fun addCustomMetric(metric: Metrics) { - metric.addCustomChart(Metrics.SimplePie(baseConfigPieName) { - isDefaultBaseConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(enchantLimitsConfigPieName) { - isDefaultEnchantLimitsConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(enchantValuesConfigPieName) { - isDefaultEnchantValuesConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(enchantConflictConfigPieName) { - isDefaultEnchantConflictConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(itemGroupsConfigPieName) { - isDefaultItemGroupsConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(unitRepairItemConfigPieName) { - isDefaultUnitRepairItemConfig.toString() - }) - metric.addCustomChart(Metrics.SimplePie(customAnvilCraftConfigPieName) { - isDefaultCustomAnvilCraftConfig.toString() - }) - - } -} \ No newline at end of file From 62760ca6bb1c6c4d6223e767dd077f393629990b Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Fri, 14 Jun 2024 19:25:25 +0200 Subject: [PATCH 4/4] Version up --- README.md | 2 +- build.gradle.kts | 2 +- src/main/resources/plugin.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fa5e3f3..1e498b9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Custom Anvil **Custom Anvil** is a plugin that allows server administrators to customise every aspect of the anvil's mechanics. -It is expected to work on 1.18 to 1.20.6 minecraft servers running spigot or paper. +It is expected to work on 1.18 to 1.21 minecraft servers running spigot or paper. (the plugin support of 1.16.5 to 1.17.1 is experimental an may encounter issues) **Custom Anvil** was previously named **Unsafe Enchants+**. diff --git a/build.gradle.kts b/build.gradle.kts index fc26f38..99960e6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "xyz.alexcrea" -version = "1.4.7" +version = "1.4.8" repositories { mavenCentral() diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 76af25d..dbd2af4 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.4.7 +version: 1.4.8 description: Allow to customise anvil mechanics api-version: 1.16 load: POSTWORLD