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/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/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/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/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 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 beedd0c..ec0ed16 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -13,8 +13,8 @@ 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 import java.io.FileReader @@ -107,13 +107,15 @@ 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() + MainConfigGui.getInstance().init(this.packetManager) GuiSharedConstant.loadConstants() // Load metrics - val metric = Metrics(this, bstatsPluginId) - MetricsUtil.addCustomMetric(metric) + Metrics(this, bstatsPluginId) // Add commands to reload the plugin prepareCommand() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt index 50ef1c8..151ba6b 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt @@ -6,7 +6,6 @@ import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.gui.config.global.* -import xyz.alexcrea.cuanvil.util.MetricsUtil class ReloadExecutor : CommandExecutor { override fun onCommand(sender: CommandSender, cmd: Command, cmdstr: String, args: Array): 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 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