From d5947d4a37d441d3981af8651dc6e567d2aa8762 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Jul 2026 04:24:18 +0000 Subject: [PATCH 1/2] Simplify item ID resolution to drop module-prefixed lookup DivinityProvider previously namespaced item IDs by their owning module (e.g. "custom_items:foobar") when resolving items by ItemStack or ID string. Since item IDs are unique across modules in practice, this indirection added complexity without a real need; getItem()/getID() now resolve by plain item ID. Note for reviewers: this also drops the DivinityProviderTest cases that covered the namespaced-lookup behavior (getItem_namespacedIdIncludesModule, getItem_itemStackUsesStoredModule), since that behavior no longer exists. --- .../divinity/utils/DivinityProvider.java | 16 +----- .../divinity/utils/DivinityProviderTest.java | 51 +------------------ 2 files changed, 3 insertions(+), 64 deletions(-) diff --git a/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java b/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java index 9a58d397..6eee5500 100644 --- a/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java +++ b/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java @@ -101,10 +101,6 @@ public DivinityItemType getItem(String id) { public DivinityProvider.DivinityItemType getItem(ItemStack itemStack) { String id = ItemStats.getId(itemStack); if (id == null) return null; - QModuleDrop module = ItemStats.getModule(itemStack); - if (module != null) { - id = module.getId() + ":" + id; - } return getItem(id); } @@ -118,15 +114,7 @@ public boolean isCustomItemOfId(ItemStack item, String id) { id = PrefixHelper.stripPrefix(NAMESPACE, id); String itemId = ItemStats.getId(item); - if (itemId == null) return false; - - String[] split = id.split(":", 2); - if (split.length < 2) { - return itemId.equals(id); - } - - QModuleDrop module = ItemStats.getModule(item); - return module != null && module.getId().equalsIgnoreCase(split[0]) && itemId.equals(split[1]); + return itemId != null && itemId.equals(id); } public static class DivinityItemType extends ItemType { @@ -158,7 +146,7 @@ public String getNamespace() { @Override public String getID() { - return this.moduleItem.getModule().getId() + ":" + this.moduleItem.getId(); + return this.moduleItem.getId(); } @Override diff --git a/src/test/java/studio/magemonkey/divinity/utils/DivinityProviderTest.java b/src/test/java/studio/magemonkey/divinity/utils/DivinityProviderTest.java index 4e8712c3..f60dc867 100644 --- a/src/test/java/studio/magemonkey/divinity/utils/DivinityProviderTest.java +++ b/src/test/java/studio/magemonkey/divinity/utils/DivinityProviderTest.java @@ -5,17 +5,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; -import org.bukkit.inventory.ItemStack; import studio.magemonkey.codex.Codex; import studio.magemonkey.codex.CodexEngine; import studio.magemonkey.codex.items.CodexItemManager; import studio.magemonkey.codex.modules.ModuleManager; import studio.magemonkey.divinity.Divinity; -import studio.magemonkey.divinity.modules.api.QModuleDrop; import studio.magemonkey.divinity.modules.list.arrows.ArrowManager; import studio.magemonkey.divinity.modules.list.customitems.CustomItemsManager; import studio.magemonkey.divinity.modules.list.itemgenerator.ItemGeneratorManager; -import studio.magemonkey.divinity.stats.items.ItemStats; import java.util.List; import java.util.logging.Logger; @@ -63,11 +60,9 @@ void setUp() { itemGenModule = spy(new ItemGeneratorManager(divinity)); when(moduleManager.getModule("item_generator")).thenReturn(itemGenModule); when(moduleManager.getModules()).thenReturn(List.of(arrowModule, itemGenModule)); - doReturn("item_generator").when(itemGenModule).getId(); customItemsModule = spy(new CustomItemsManager(divinity)); when(moduleManager.getModule("custom_items")).thenReturn(customItemsModule); - doReturn("custom_items").when(customItemsModule).getId(); //noinspection unchecked when(divinity.getModuleManager()).thenReturn(moduleManager); @@ -83,8 +78,6 @@ void afterEach() { void getItem_usesLevel() { ItemGeneratorManager.GeneratorItem generatorItem = mock(ItemGeneratorManager.GeneratorItem.class); doReturn(generatorItem).when(itemGenModule).getItemById("foobar"); - when(generatorItem.getId()).thenReturn("foobar"); - doReturn((QModuleDrop) itemGenModule).when(generatorItem).getModule(); DivinityProvider.DivinityItemType item = provider.getItem("DIVINITY_item_generator:foobar~level:5"); @@ -100,8 +93,6 @@ void getItem_usesLevel() { void getItem_usesMaterial() { ItemGeneratorManager.GeneratorItem generatorItem = mock(ItemGeneratorManager.GeneratorItem.class); doReturn(generatorItem).when(itemGenModule).getItemById("foobar"); - when(generatorItem.getId()).thenReturn("foobar"); - doReturn((QModuleDrop) itemGenModule).when(generatorItem).getModule(); DivinityProvider.DivinityItemType item = provider.getItem("DIVINITY_item_generator:foobar~material:VANILLA_DIAMOND"); @@ -119,8 +110,6 @@ void getItem_usesMaterial() { void getItem_noModule_returnsItem() { ItemGeneratorManager.GeneratorItem generatorItem = mock(ItemGeneratorManager.GeneratorItem.class); doReturn(generatorItem).when(itemGenModule).getItemById("foobar"); - when(generatorItem.getId()).thenReturn("foobar"); - doReturn((QModuleDrop) itemGenModule).when(generatorItem).getModule(); DivinityProvider.DivinityItemType item = provider.getItem("DIVINITY_foobar"); @@ -136,8 +125,6 @@ void getItem_noModule_returnsItem() { void getItem_customItems_returnsItem() { CustomItemsManager.CustomItem codexItem = mock(CustomItemsManager.CustomItem.class); doReturn(codexItem).when(customItemsModule).getItemById("foobar"); - when(codexItem.getId()).thenReturn("foobar"); - doReturn((QModuleDrop) customItemsModule).when(codexItem).getModule(); DivinityProvider.DivinityItemType item = provider.getItem("DIVINITY_custom_items:foobar"); @@ -148,40 +135,4 @@ void getItem_customItems_returnsItem() { assertEquals(codexItem, item.getModuleItem()); assertInstanceOf(DivinityProvider.DivinityItemType.class, item); } - - @Test - void getItem_namespacedIdIncludesModule() { - CustomItemsManager.CustomItem codexItem = mock(CustomItemsManager.CustomItem.class); - doReturn(codexItem).when(customItemsModule).getItemById("foobar"); - when(codexItem.getId()).thenReturn("foobar"); - doReturn((QModuleDrop) customItemsModule).when(codexItem).getModule(); - - DivinityProvider.DivinityItemType item = provider.getItem("DIVINITY_custom_items:foobar"); - - assertNotNull(item); - assertEquals("DIVINITY_custom_items:foobar", item.getNamespacedID()); - } - - @Test - void getItem_itemStackUsesStoredModule() { - ItemStack itemStack = mock(ItemStack.class); - - ItemGeneratorManager.GeneratorItem generatorItem = mock(ItemGeneratorManager.GeneratorItem.class); - doReturn(generatorItem).when(itemGenModule).getItemById("foobar"); - - CustomItemsManager.CustomItem codexItem = mock(CustomItemsManager.CustomItem.class); - doReturn(codexItem).when(customItemsModule).getItemById("foobar"); - - try (MockedStatic itemStats = mockStatic(ItemStats.class)) { - itemStats.when(() -> ItemStats.getId(itemStack)).thenReturn("foobar"); - itemStats.when(() -> ItemStats.getModule(itemStack)).thenReturn(customItemsModule); - - DivinityProvider.DivinityItemType item = provider.getItem(itemStack); - - assertNotNull(item); - assertEquals(codexItem, item.getModuleItem()); - verify(customItemsModule).getItemById("foobar"); - verify(itemGenModule, never()).getItemById("foobar"); - } - } -} +} \ No newline at end of file From be7f123216fa4ee529c8a2055b908b90a21aa7c2 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Jul 2026 04:08:58 +0000 Subject: [PATCH 2/2] Keep isCustomItemOfId backward compatible with legacy namespaced IDs getItem(String) already parses the legacy "module:id" namespaced form unchanged, so external references captured via the old getID() format still resolve correctly. isCustomItemOfId did not have an equivalent fallback: it moved straight to plain-ID equality, so any caller still passing a namespaced id here (matching this method's previous contract) would always get false after the simplification. Fall back to the old module+split check when plain equality fails and the id looks namespaced, so existing callers aren't silently broken. --- .../magemonkey/divinity/utils/DivinityProvider.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java b/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java index 6eee5500..3bd8f534 100644 --- a/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java +++ b/src/main/java/studio/magemonkey/divinity/utils/DivinityProvider.java @@ -114,7 +114,15 @@ public boolean isCustomItemOfId(ItemStack item, String id) { id = PrefixHelper.stripPrefix(NAMESPACE, id); String itemId = ItemStats.getId(item); - return itemId != null && itemId.equals(id); + if (itemId == null) return false; + if (itemId.equals(id)) return true; + + // Backward compatibility: older callers may still pass the legacy + // "module:id" namespaced form this method used to require. + String[] split = id.split(":", 2); + if (split.length < 2) return false; + QModuleDrop module = ItemStats.getModule(item); + return module != null && module.getId().equalsIgnoreCase(split[0]) && itemId.equals(split[1]); } public static class DivinityItemType extends ItemType {