From 40d627fd6e031f7683b46ece0311c40cffb3296f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 08:28:26 +0000 Subject: [PATCH 1/6] Initial plan From 717c6c4335665950585fbf9b0b032a31abba8e3f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 08:40:35 +0000 Subject: [PATCH 2/6] Changes before error encountered Co-authored-by: MaksyKun <77341370+MaksyKun@users.noreply.github.com> --- .../manager/listener/ListenerManager.java | 8 ++ .../object/ItemAutoUpdateListener.java | 75 +++++++++++++++++++ .../divinity/modules/api/QModuleDrop.java | 7 ++ .../modules/active_items/settings.yml | 1 + .../resources/modules/arrows/settings.yml | 1 + .../modules/consumables/settings.yml | 1 + .../modules/custom_items/settings.yml | 1 + .../resources/modules/essences/settings.yml | 1 + .../resources/modules/extractor/settings.yml | 1 + .../resources/modules/fortify/settings.yml | 1 + src/main/resources/modules/gems/settings.yml | 1 + .../resources/modules/identify/settings.yml | 1 + .../resources/modules/magic_dust/settings.yml | 1 + .../resources/modules/repair/settings.yml | 1 + src/main/resources/modules/runes/settings.yml | 1 + 15 files changed, 102 insertions(+) create mode 100644 src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java b/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java index dbb20fe1..4f268771 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java @@ -18,6 +18,7 @@ public class ListenerManager implements Loadable { private ItemRequirementListener lisReq; private DynamicStatListener lisDynamic; private ItemUpdaterListener updater; + private ItemAutoUpdateListener autoUpdater; private VanillaWrapperListener lisQuantum; private HookListener hookListener; private GrindstoneListener grindstoneListener; @@ -53,6 +54,9 @@ public void setup() { this.updater = new ItemUpdaterListener(this.plugin); this.updater.registerListeners(); + this.autoUpdater = new ItemAutoUpdateListener(this.plugin); + this.autoUpdater.registerListeners(); + this.hookListener = new HookListener(this.plugin); this.hookListener.registerListeners(); @@ -76,6 +80,10 @@ public void shutdown() { this.lisReq.unregisterListeners(); this.lisReq = null; } + if (this.autoUpdater != null) { + this.autoUpdater.unregisterListeners(); + this.autoUpdater = null; + } if (this.lisQuantum != null) { this.lisQuantum.unregisterListeners(); this.lisQuantum = null; diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java new file mode 100644 index 00000000..79a4f6da --- /dev/null +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java @@ -0,0 +1,75 @@ +package studio.magemonkey.divinity.manager.listener.object; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import studio.magemonkey.codex.manager.IListener; +import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.modules.LeveledItem; +import studio.magemonkey.divinity.modules.ModuleItem; +import studio.magemonkey.divinity.modules.api.QModuleDrop; +import studio.magemonkey.divinity.stats.items.ItemStats; + +public class ItemAutoUpdateListener extends IListener { + + public ItemAutoUpdateListener(@NotNull Divinity plugin) { + super(plugin); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onItemHeld(PlayerItemHeldEvent event) { + Player player = event.getPlayer(); + ItemStack item = player.getInventory().getItem(event.getNewSlot()); + ItemStack updated = updateItem(item); + if (updated != null) { + player.getInventory().setItem(event.getNewSlot(), updated); + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerJoin(PlayerJoinEvent event) { + updateInventory(event.getPlayer()); + } + + private void updateInventory(@NotNull Player player) { + PlayerInventory inv = player.getInventory(); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack updated = updateItem(contents[i]); + if (updated != null) { + inv.setItem(i, updated); + } + } + } + + @Nullable + private ItemStack updateItem(@Nullable ItemStack item) { + if (item == null || item.getType() == Material.AIR) return null; + + QModuleDrop module = ItemStats.getModule(item); + if (module == null || !module.isAutoUpdate()) return null; + + String itemId = ItemStats.getId(item); + if (itemId == null) return null; + + ModuleItem moduleItem = module.getItemById(itemId); + if (moduleItem == null) return null; + + ItemStack updated; + if (moduleItem instanceof LeveledItem) { + int level = ItemStats.getLevel(item); + updated = ((LeveledItem) moduleItem).create(level); + } else { + updated = moduleItem.create(); + } + updated.setAmount(item.getAmount()); + return updated; + } +} diff --git a/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java b/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java index 73cba2eb..ef0dc1e1 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java +++ b/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java @@ -42,6 +42,7 @@ public abstract class QModuleDrop extends QModule { private String itemNameFormat; private List itemLoreFormat; + private boolean autoUpdate; public QModuleDrop(@NotNull Divinity plugin, @NotNull Class clazz) { super(plugin); @@ -61,10 +62,12 @@ protected void loadSettings() { String path = "item-format."; cfg.addMissing(path + "name", ItemTags.PLACEHOLDER_ITEM_NAME); cfg.addMissing(path + "lore", Arrays.asList(ItemTags.PLACEHOLDER_ITEM_LORE)); + cfg.addMissing("auto-update", false); cfg.saveChanges(); this.itemNameFormat = StringUT.color(cfg.getString(path + "name", ItemTags.PLACEHOLDER_ITEM_NAME)); this.itemLoreFormat = StringUT.color(cfg.getStringList(path + "lore")); + this.autoUpdate = cfg.getBoolean("auto-update"); } protected void loadItems() { @@ -107,6 +110,10 @@ public List getItemLoreFormat() { return this.itemLoreFormat; } + public boolean isAutoUpdate() { + return this.autoUpdate; + } + @Nullable public I getItemById(@NotNull String id, @Nullable String sTier) { if (this.items == null || this.items.isEmpty()) return null; diff --git a/src/main/resources/modules/active_items/settings.yml b/src/main/resources/modules/active_items/settings.yml index bc27cd2b..f71d13af 100644 --- a/src/main/resources/modules/active_items/settings.yml +++ b/src/main/resources/modules/active_items/settings.yml @@ -1,4 +1,5 @@ command-aliases: activeitems +auto-update: false item-format: name: '%TIER_COLOR%%ITEM_NAME% %ITEM_LEVEL_ROMAN%' diff --git a/src/main/resources/modules/arrows/settings.yml b/src/main/resources/modules/arrows/settings.yml index 0ee879b1..24c03deb 100644 --- a/src/main/resources/modules/arrows/settings.yml +++ b/src/main/resources/modules/arrows/settings.yml @@ -1,4 +1,5 @@ command-aliases: arrows +auto-update: false settings: allow-infinity-enchant: false diff --git a/src/main/resources/modules/consumables/settings.yml b/src/main/resources/modules/consumables/settings.yml index 827ed926..eaf531f1 100644 --- a/src/main/resources/modules/consumables/settings.yml +++ b/src/main/resources/modules/consumables/settings.yml @@ -1,4 +1,5 @@ command-aliases: consumables,consumes +auto-update: false consuming: allow-on-full-health: true allow-on-full-food: true diff --git a/src/main/resources/modules/custom_items/settings.yml b/src/main/resources/modules/custom_items/settings.yml index e78ad83d..d48e29b6 100644 --- a/src/main/resources/modules/custom_items/settings.yml +++ b/src/main/resources/modules/custom_items/settings.yml @@ -1,4 +1,5 @@ command-aliases: customitems +auto-update: false item-format: name: '%ITEM_NAME%' lore: diff --git a/src/main/resources/modules/essences/settings.yml b/src/main/resources/modules/essences/settings.yml index c7f82bdc..81f78eba 100644 --- a/src/main/resources/modules/essences/settings.yml +++ b/src/main/resources/modules/essences/settings.yml @@ -1,5 +1,6 @@ cfg_version: 1.0 command-aliases: essence,essences +auto-update: false socketing: allow-duplicated-items: true animated-bar: diff --git a/src/main/resources/modules/extractor/settings.yml b/src/main/resources/modules/extractor/settings.yml index ee04205d..dc45bbf4 100644 --- a/src/main/resources/modules/extractor/settings.yml +++ b/src/main/resources/modules/extractor/settings.yml @@ -1,4 +1,5 @@ command-aliases: extractor +auto-update: false extraction: price: GEM: diff --git a/src/main/resources/modules/fortify/settings.yml b/src/main/resources/modules/fortify/settings.yml index ea5b4d2b..577615c9 100644 --- a/src/main/resources/modules/fortify/settings.yml +++ b/src/main/resources/modules/fortify/settings.yml @@ -1,4 +1,5 @@ command-aliases: fortify +auto-update: false format: item-name: as-prefix: false diff --git a/src/main/resources/modules/gems/settings.yml b/src/main/resources/modules/gems/settings.yml index 16d60a97..80c6f0b1 100644 --- a/src/main/resources/modules/gems/settings.yml +++ b/src/main/resources/modules/gems/settings.yml @@ -1,4 +1,5 @@ command-aliases: gems +auto-update: false socketing: allow-duplicated-items: true diff --git a/src/main/resources/modules/identify/settings.yml b/src/main/resources/modules/identify/settings.yml index 277701ff..221fbd5e 100644 --- a/src/main/resources/modules/identify/settings.yml +++ b/src/main/resources/modules/identify/settings.yml @@ -1,4 +1,5 @@ command-aliases: identify,identifying +auto-update: false general: actions-complete: default: diff --git a/src/main/resources/modules/magic_dust/settings.yml b/src/main/resources/modules/magic_dust/settings.yml index 737c7d8f..b69dee99 100644 --- a/src/main/resources/modules/magic_dust/settings.yml +++ b/src/main/resources/modules/magic_dust/settings.yml @@ -1,4 +1,5 @@ command-aliases: magicdust +auto-update: false general: actions-apply: default: diff --git a/src/main/resources/modules/repair/settings.yml b/src/main/resources/modules/repair/settings.yml index adbc861b..fd134dee 100644 --- a/src/main/resources/modules/repair/settings.yml +++ b/src/main/resources/modules/repair/settings.yml @@ -1,4 +1,5 @@ command-aliases: rpgrepair +auto-update: false repair: actions-complete: default: diff --git a/src/main/resources/modules/runes/settings.yml b/src/main/resources/modules/runes/settings.yml index b144e7d2..b93a7f14 100644 --- a/src/main/resources/modules/runes/settings.yml +++ b/src/main/resources/modules/runes/settings.yml @@ -1,4 +1,5 @@ command-aliases: runes +auto-update: false general: stack-levels: false socketing: From 940a40f09bef84e8cbaf2f761c50921c0b328611 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 08:46:56 +0000 Subject: [PATCH 3/6] Implement generic item auto-update listener and config toggles Co-authored-by: MaksyKun <77341370+MaksyKun@users.noreply.github.com> --- .../listener/object/ItemAutoUpdateListener.java | 11 +---------- .../magemonkey/divinity/modules/LeveledItem.java | 8 ++++++++ .../magemonkey/divinity/modules/ModuleItem.java | 7 +++++++ src/main/resources/modules/dismantle/settings.yml | 1 + .../resources/modules/item_generator/settings.yml | 3 ++- src/main/resources/modules/money/settings.yml | 1 + src/main/resources/modules/refine/settings.yml | 1 + 7 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java index 79a4f6da..96655b28 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java @@ -12,7 +12,6 @@ import org.jetbrains.annotations.Nullable; import studio.magemonkey.codex.manager.IListener; import studio.magemonkey.divinity.Divinity; -import studio.magemonkey.divinity.modules.LeveledItem; import studio.magemonkey.divinity.modules.ModuleItem; import studio.magemonkey.divinity.modules.api.QModuleDrop; import studio.magemonkey.divinity.stats.items.ItemStats; @@ -62,14 +61,6 @@ private ItemStack updateItem(@Nullable ItemStack item) { ModuleItem moduleItem = module.getItemById(itemId); if (moduleItem == null) return null; - ItemStack updated; - if (moduleItem instanceof LeveledItem) { - int level = ItemStats.getLevel(item); - updated = ((LeveledItem) moduleItem).create(level); - } else { - updated = moduleItem.create(); - } - updated.setAmount(item.getAmount()); - return updated; + return moduleItem.update(item); } } diff --git a/src/main/java/studio/magemonkey/divinity/modules/LeveledItem.java b/src/main/java/studio/magemonkey/divinity/modules/LeveledItem.java index 50782182..6bf4980f 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/LeveledItem.java +++ b/src/main/java/studio/magemonkey/divinity/modules/LeveledItem.java @@ -132,6 +132,14 @@ public final ItemStack create() { return this.create(-1); } + @NotNull + @Override + public ItemStack update(@NotNull ItemStack item) { + ItemStack updated = this.build(item.clone(), ItemStats.getLevel(item)); + updated.setAmount(item.getAmount()); + return updated; + } + private void updateConfig(@NotNull JYML cfg) { cfg.addMissing("tier", JStrings.DEFAULT); diff --git a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java index b40d17e1..7754d9dc 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java +++ b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java @@ -214,6 +214,13 @@ public ItemStack create() { return this.build(); } + @NotNull + public ItemStack update(@NotNull ItemStack item) { + ItemStack updated = this.build(item.clone()); + updated.setAmount(item.getAmount()); + return updated; + } + @NotNull protected ItemStack build() { return build(this.getMaterial().create()); diff --git a/src/main/resources/modules/dismantle/settings.yml b/src/main/resources/modules/dismantle/settings.yml index 55857d47..259602d2 100644 --- a/src/main/resources/modules/dismantle/settings.yml +++ b/src/main/resources/modules/dismantle/settings.yml @@ -1,4 +1,5 @@ command-aliases: dismantle +auto-update: false general: actions-complete: default: diff --git a/src/main/resources/modules/item_generator/settings.yml b/src/main/resources/modules/item_generator/settings.yml index d7f23fcd..090367b2 100644 --- a/src/main/resources/modules/item_generator/settings.yml +++ b/src/main/resources/modules/item_generator/settings.yml @@ -1,5 +1,6 @@ command-aliases: itemgenerator,itemgen +auto-update: false item-format: name: '%TIER_COLOR%%ITEM_NAME%' lore: - - '%ITEM_LORE%' \ No newline at end of file + - '%ITEM_LORE%' diff --git a/src/main/resources/modules/money/settings.yml b/src/main/resources/modules/money/settings.yml index c0c27296..052f27b1 100644 --- a/src/main/resources/modules/money/settings.yml +++ b/src/main/resources/modules/money/settings.yml @@ -1,4 +1,5 @@ command-aliases: moneymodule +auto-update: false item-format: name: '%ITEM_NAME%' diff --git a/src/main/resources/modules/refine/settings.yml b/src/main/resources/modules/refine/settings.yml index f3e7cc20..a664a27a 100644 --- a/src/main/resources/modules/refine/settings.yml +++ b/src/main/resources/modules/refine/settings.yml @@ -1,4 +1,5 @@ command-aliases: refine +auto-update: false refine: actions-on-success: default: From 08018c12873758f49bcc21c3b98482127b1bb102 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:09:07 +0000 Subject: [PATCH 4/6] Add auto-update override handling for player item changes Co-authored-by: MaksyKun <77341370+MaksyKun@users.noreply.github.com> --- .../object/ItemAutoUpdateListener.java | 101 +++++++++++++++++- .../divinity/modules/api/QModuleDrop.java | 7 ++ .../modules/active_items/settings.yml | 3 +- .../resources/modules/arrows/settings.yml | 1 + .../modules/consumables/settings.yml | 1 + .../modules/custom_items/settings.yml | 1 + .../resources/modules/dismantle/settings.yml | 1 + .../resources/modules/essences/settings.yml | 3 +- .../resources/modules/extractor/settings.yml | 1 + .../resources/modules/fortify/settings.yml | 1 + src/main/resources/modules/gems/settings.yml | 1 + .../resources/modules/identify/settings.yml | 1 + .../modules/item_generator/settings.yml | 1 + .../resources/modules/magic_dust/settings.yml | 1 + src/main/resources/modules/money/settings.yml | 1 + .../resources/modules/refine/settings.yml | 1 + .../resources/modules/repair/settings.yml | 1 + src/main/resources/modules/runes/settings.yml | 1 + 18 files changed, 125 insertions(+), 3 deletions(-) diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java index 96655b28..a122ae97 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java @@ -1,21 +1,30 @@ package studio.magemonkey.divinity.manager.listener.object; +import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.PotionMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import studio.magemonkey.codex.manager.IListener; import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.modules.LeveledItem; import studio.magemonkey.divinity.modules.ModuleItem; import studio.magemonkey.divinity.modules.api.QModuleDrop; import studio.magemonkey.divinity.stats.items.ItemStats; +import java.util.HashSet; + public class ItemAutoUpdateListener extends IListener { public ItemAutoUpdateListener(@NotNull Divinity plugin) { @@ -61,6 +70,96 @@ private ItemStack updateItem(@Nullable ItemStack item) { ModuleItem moduleItem = module.getItemById(itemId); if (moduleItem == null) return null; - return moduleItem.update(item); + ItemStack updated = moduleItem.update(item); + if (module.isAutoUpdateOverrideChanges()) { + return updated; + } + + ItemStack template = createTemplate(moduleItem, item); + if (!hasPlayerItemChanges(item, template)) { + return updated; + } + + return reapplyPlayerChanges(updated, item); + } + + @NotNull + private ItemStack createTemplate(@NotNull ModuleItem moduleItem, @NotNull ItemStack sourceItem) { + if (moduleItem instanceof LeveledItem) { + return ((LeveledItem) moduleItem).create(ItemStats.getLevel(sourceItem)); + } + return moduleItem.create(); + } + + /** + * Detects whether the source item differs from a clean module template in player-modifiable fields: + * display name, lore, enchantments, item flags, item damage and armor/potion color. + */ + private boolean hasPlayerItemChanges(@NotNull ItemStack source, @NotNull ItemStack template) { + if (!source.getEnchantments().equals(template.getEnchantments())) return true; + + ItemMeta sourceMeta = source.getItemMeta(); + ItemMeta templateMeta = template.getItemMeta(); + if (sourceMeta == null || templateMeta == null) return sourceMeta != templateMeta; + + if (sourceMeta.hasDisplayName() != templateMeta.hasDisplayName()) return true; + if (sourceMeta.hasDisplayName() && !sourceMeta.getDisplayName().equals(templateMeta.getDisplayName())) return true; + + if (sourceMeta.hasLore() != templateMeta.hasLore()) return true; + if (sourceMeta.hasLore() && !sourceMeta.getLore().equals(templateMeta.getLore())) return true; + + if (!sourceMeta.getItemFlags().equals(templateMeta.getItemFlags())) return true; + + if (sourceMeta instanceof Damageable && templateMeta instanceof Damageable) { + if (((Damageable) sourceMeta).getDamage() != ((Damageable) templateMeta).getDamage()) return true; + } + + if (sourceMeta instanceof LeatherArmorMeta && templateMeta instanceof LeatherArmorMeta) { + if (!((LeatherArmorMeta) sourceMeta).getColor().equals(((LeatherArmorMeta) templateMeta).getColor())) return true; + } + + if (sourceMeta instanceof PotionMeta && templateMeta instanceof PotionMeta) { + Color sourceColor = ((PotionMeta) sourceMeta).getColor(); + Color templateColor = ((PotionMeta) templateMeta).getColor(); + if (sourceColor == null ? templateColor != null : !sourceColor.equals(templateColor)) return true; + } + + return false; + } + + @NotNull + private ItemStack reapplyPlayerChanges(@NotNull ItemStack updated, @NotNull ItemStack source) { + ItemMeta sourceMeta = source.getItemMeta(); + ItemMeta updatedMeta = updated.getItemMeta(); + if (sourceMeta == null || updatedMeta == null) return updated; + + if (sourceMeta.hasDisplayName()) { + updatedMeta.setDisplayName(sourceMeta.getDisplayName()); + } + + if (sourceMeta.hasLore()) { + updatedMeta.setLore(sourceMeta.getLore()); + } + + updatedMeta.removeItemFlags(updatedMeta.getItemFlags().toArray(new ItemFlag[0])); + updatedMeta.addItemFlags(sourceMeta.getItemFlags().toArray(new ItemFlag[0])); + + if (sourceMeta instanceof Damageable && updatedMeta instanceof Damageable) { + ((Damageable) updatedMeta).setDamage(((Damageable) sourceMeta).getDamage()); + } + + if (sourceMeta instanceof LeatherArmorMeta && updatedMeta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) updatedMeta).setColor(((LeatherArmorMeta) sourceMeta).getColor()); + } + + if (sourceMeta instanceof PotionMeta && updatedMeta instanceof PotionMeta) { + ((PotionMeta) updatedMeta).setColor(((PotionMeta) sourceMeta).getColor()); + } + + updated.setItemMeta(updatedMeta); + new HashSet<>(updated.getEnchantments().keySet()).forEach(updated::removeEnchantment); + source.getEnchantments().forEach((enchantment, level) -> updated.addUnsafeEnchantment(enchantment, level)); + + return updated; } } diff --git a/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java b/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java index ef0dc1e1..e3add36c 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java +++ b/src/main/java/studio/magemonkey/divinity/modules/api/QModuleDrop.java @@ -43,6 +43,7 @@ public abstract class QModuleDrop extends QModule { private String itemNameFormat; private List itemLoreFormat; private boolean autoUpdate; + private boolean autoUpdateOverrideChanges; public QModuleDrop(@NotNull Divinity plugin, @NotNull Class clazz) { super(plugin); @@ -63,11 +64,13 @@ protected void loadSettings() { cfg.addMissing(path + "name", ItemTags.PLACEHOLDER_ITEM_NAME); cfg.addMissing(path + "lore", Arrays.asList(ItemTags.PLACEHOLDER_ITEM_LORE)); cfg.addMissing("auto-update", false); + cfg.addMissing("auto-update-override-changes", false); cfg.saveChanges(); this.itemNameFormat = StringUT.color(cfg.getString(path + "name", ItemTags.PLACEHOLDER_ITEM_NAME)); this.itemLoreFormat = StringUT.color(cfg.getStringList(path + "lore")); this.autoUpdate = cfg.getBoolean("auto-update"); + this.autoUpdateOverrideChanges = cfg.getBoolean("auto-update-override-changes"); } protected void loadItems() { @@ -114,6 +117,10 @@ public boolean isAutoUpdate() { return this.autoUpdate; } + public boolean isAutoUpdateOverrideChanges() { + return this.autoUpdateOverrideChanges; + } + @Nullable public I getItemById(@NotNull String id, @Nullable String sTier) { if (this.items == null || this.items.isEmpty()) return null; diff --git a/src/main/resources/modules/active_items/settings.yml b/src/main/resources/modules/active_items/settings.yml index f71d13af..2e0a7e80 100644 --- a/src/main/resources/modules/active_items/settings.yml +++ b/src/main/resources/modules/active_items/settings.yml @@ -1,5 +1,6 @@ command-aliases: activeitems auto-update: false +auto-update-override-changes: false item-format: name: '%TIER_COLOR%%ITEM_NAME% %ITEM_LEVEL_ROMAN%' @@ -10,4 +11,4 @@ item-format: - '%USER_LEVEL%' - '%USER_CLASS%' - '' - - '%ITEM_LORE%' \ No newline at end of file + - '%ITEM_LORE%' diff --git a/src/main/resources/modules/arrows/settings.yml b/src/main/resources/modules/arrows/settings.yml index 24c03deb..c1818fb7 100644 --- a/src/main/resources/modules/arrows/settings.yml +++ b/src/main/resources/modules/arrows/settings.yml @@ -1,5 +1,6 @@ command-aliases: arrows auto-update: false +auto-update-override-changes: false settings: allow-infinity-enchant: false diff --git a/src/main/resources/modules/consumables/settings.yml b/src/main/resources/modules/consumables/settings.yml index eaf531f1..09bb2407 100644 --- a/src/main/resources/modules/consumables/settings.yml +++ b/src/main/resources/modules/consumables/settings.yml @@ -1,5 +1,6 @@ command-aliases: consumables,consumes auto-update: false +auto-update-override-changes: false consuming: allow-on-full-health: true allow-on-full-food: true diff --git a/src/main/resources/modules/custom_items/settings.yml b/src/main/resources/modules/custom_items/settings.yml index d48e29b6..31e9875a 100644 --- a/src/main/resources/modules/custom_items/settings.yml +++ b/src/main/resources/modules/custom_items/settings.yml @@ -1,5 +1,6 @@ command-aliases: customitems auto-update: false +auto-update-override-changes: false item-format: name: '%ITEM_NAME%' lore: diff --git a/src/main/resources/modules/dismantle/settings.yml b/src/main/resources/modules/dismantle/settings.yml index 259602d2..dd97696c 100644 --- a/src/main/resources/modules/dismantle/settings.yml +++ b/src/main/resources/modules/dismantle/settings.yml @@ -1,5 +1,6 @@ command-aliases: dismantle auto-update: false +auto-update-override-changes: false general: actions-complete: default: diff --git a/src/main/resources/modules/essences/settings.yml b/src/main/resources/modules/essences/settings.yml index 81f78eba..3dc8205a 100644 --- a/src/main/resources/modules/essences/settings.yml +++ b/src/main/resources/modules/essences/settings.yml @@ -1,6 +1,7 @@ cfg_version: 1.0 command-aliases: essence,essences auto-update: false +auto-update-override-changes: false socketing: allow-duplicated-items: true animated-bar: @@ -101,4 +102,4 @@ gui: name: '&c&l&nCancel' lore: [ ] slots: '0' - type: EXIT \ No newline at end of file + type: EXIT diff --git a/src/main/resources/modules/extractor/settings.yml b/src/main/resources/modules/extractor/settings.yml index dc45bbf4..f7ff1c7e 100644 --- a/src/main/resources/modules/extractor/settings.yml +++ b/src/main/resources/modules/extractor/settings.yml @@ -1,5 +1,6 @@ command-aliases: extractor auto-update: false +auto-update-override-changes: false extraction: price: GEM: diff --git a/src/main/resources/modules/fortify/settings.yml b/src/main/resources/modules/fortify/settings.yml index 577615c9..75247948 100644 --- a/src/main/resources/modules/fortify/settings.yml +++ b/src/main/resources/modules/fortify/settings.yml @@ -1,5 +1,6 @@ command-aliases: fortify auto-update: false +auto-update-override-changes: false format: item-name: as-prefix: false diff --git a/src/main/resources/modules/gems/settings.yml b/src/main/resources/modules/gems/settings.yml index 80c6f0b1..095df4ed 100644 --- a/src/main/resources/modules/gems/settings.yml +++ b/src/main/resources/modules/gems/settings.yml @@ -1,5 +1,6 @@ command-aliases: gems auto-update: false +auto-update-override-changes: false socketing: allow-duplicated-items: true diff --git a/src/main/resources/modules/identify/settings.yml b/src/main/resources/modules/identify/settings.yml index 221fbd5e..f665f981 100644 --- a/src/main/resources/modules/identify/settings.yml +++ b/src/main/resources/modules/identify/settings.yml @@ -1,5 +1,6 @@ command-aliases: identify,identifying auto-update: false +auto-update-override-changes: false general: actions-complete: default: diff --git a/src/main/resources/modules/item_generator/settings.yml b/src/main/resources/modules/item_generator/settings.yml index 090367b2..a9295990 100644 --- a/src/main/resources/modules/item_generator/settings.yml +++ b/src/main/resources/modules/item_generator/settings.yml @@ -1,5 +1,6 @@ command-aliases: itemgenerator,itemgen auto-update: false +auto-update-override-changes: false item-format: name: '%TIER_COLOR%%ITEM_NAME%' lore: diff --git a/src/main/resources/modules/magic_dust/settings.yml b/src/main/resources/modules/magic_dust/settings.yml index b69dee99..ed915c9e 100644 --- a/src/main/resources/modules/magic_dust/settings.yml +++ b/src/main/resources/modules/magic_dust/settings.yml @@ -1,5 +1,6 @@ command-aliases: magicdust auto-update: false +auto-update-override-changes: false general: actions-apply: default: diff --git a/src/main/resources/modules/money/settings.yml b/src/main/resources/modules/money/settings.yml index 052f27b1..e5f94508 100644 --- a/src/main/resources/modules/money/settings.yml +++ b/src/main/resources/modules/money/settings.yml @@ -1,5 +1,6 @@ command-aliases: moneymodule auto-update: false +auto-update-override-changes: false item-format: name: '%ITEM_NAME%' diff --git a/src/main/resources/modules/refine/settings.yml b/src/main/resources/modules/refine/settings.yml index a664a27a..52f8a5a4 100644 --- a/src/main/resources/modules/refine/settings.yml +++ b/src/main/resources/modules/refine/settings.yml @@ -1,5 +1,6 @@ command-aliases: refine auto-update: false +auto-update-override-changes: false refine: actions-on-success: default: diff --git a/src/main/resources/modules/repair/settings.yml b/src/main/resources/modules/repair/settings.yml index fd134dee..64cd5d54 100644 --- a/src/main/resources/modules/repair/settings.yml +++ b/src/main/resources/modules/repair/settings.yml @@ -1,5 +1,6 @@ command-aliases: rpgrepair auto-update: false +auto-update-override-changes: false repair: actions-complete: default: diff --git a/src/main/resources/modules/runes/settings.yml b/src/main/resources/modules/runes/settings.yml index b93a7f14..ea6afc9e 100644 --- a/src/main/resources/modules/runes/settings.yml +++ b/src/main/resources/modules/runes/settings.yml @@ -1,5 +1,6 @@ command-aliases: runes auto-update: false +auto-update-override-changes: false general: stack-levels: false socketing: From 7aec490024beaee939e78a02f38d725e3fecfc48 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:25:59 +0000 Subject: [PATCH 5/6] Prevent duplicate attribute modifiers on item auto-update Co-authored-by: MaksyKun <77341370+MaksyKun@users.noreply.github.com> --- .../studio/magemonkey/divinity/modules/ModuleItem.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java index 7754d9dc..99cc082c 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java +++ b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java @@ -282,6 +282,13 @@ protected ItemStack build(@NotNull ItemStack item) { meta.addEnchant(NamespaceResolver.getEnchantment("POWER", "ARROW_DAMAGE"), 1, true); // ARROW_DAMAGE/POWER } + if (meta.hasAttributeModifiers()) { + Set existing = new HashSet<>(meta.getAttributeModifiers().keySet()); + for (Attribute attr : existing) { + meta.removeAttributeModifier(attr); + } + } + for (Map.Entry attribute : this.attributes.entrySet()) { if (attribute != null) { meta.addAttributeModifier(attribute.getKey(), attribute.getValue()); From bc1527488c27a08295283ffc7efd6f7ce3b6a34a Mon Sep 17 00:00:00 2001 From: MaksyKun <77341370+MaksyKun@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:33:54 +0100 Subject: [PATCH 6/6] remove meta that players usually cant modify --- .../listener/object/ItemAutoUpdateListener.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java index a122ae97..8f654ca0 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemAutoUpdateListener.java @@ -105,11 +105,6 @@ private boolean hasPlayerItemChanges(@NotNull ItemStack source, @NotNull ItemSta if (sourceMeta.hasDisplayName() != templateMeta.hasDisplayName()) return true; if (sourceMeta.hasDisplayName() && !sourceMeta.getDisplayName().equals(templateMeta.getDisplayName())) return true; - if (sourceMeta.hasLore() != templateMeta.hasLore()) return true; - if (sourceMeta.hasLore() && !sourceMeta.getLore().equals(templateMeta.getLore())) return true; - - if (!sourceMeta.getItemFlags().equals(templateMeta.getItemFlags())) return true; - if (sourceMeta instanceof Damageable && templateMeta instanceof Damageable) { if (((Damageable) sourceMeta).getDamage() != ((Damageable) templateMeta).getDamage()) return true; } @@ -137,13 +132,6 @@ private ItemStack reapplyPlayerChanges(@NotNull ItemStack updated, @NotNull Item updatedMeta.setDisplayName(sourceMeta.getDisplayName()); } - if (sourceMeta.hasLore()) { - updatedMeta.setLore(sourceMeta.getLore()); - } - - updatedMeta.removeItemFlags(updatedMeta.getItemFlags().toArray(new ItemFlag[0])); - updatedMeta.addItemFlags(sourceMeta.getItemFlags().toArray(new ItemFlag[0])); - if (sourceMeta instanceof Damageable && updatedMeta instanceof Damageable) { ((Damageable) updatedMeta).setDamage(((Damageable) sourceMeta).getDamage()); }