From 4f7e204cd5c782031432003268635c490638490e Mon Sep 17 00:00:00 2001 From: Coldsmiles Date: Tue, 20 Oct 2026 22:42:47 +0800 Subject: [PATCH] Match legacy vouchers by display and lore --- .../cn/infstar/magicgem/item/ItemCodec.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/cn/infstar/magicgem/item/ItemCodec.java b/src/main/java/cn/infstar/magicgem/item/ItemCodec.java index db01075..9f381d1 100644 --- a/src/main/java/cn/infstar/magicgem/item/ItemCodec.java +++ b/src/main/java/cn/infstar/magicgem/item/ItemCodec.java @@ -171,19 +171,34 @@ public final class ItemCodec { String display = meta.getDisplayName(); if (display == null || display.isBlank()) return Optional.empty(); String normalizedDisplay = strip(display); + List itemLore = meta.getLore() == null ? List.of() : meta.getLore().stream().map(this::strip).toList(); + GemDefinition best = null; + int bestScore = 0; for (GemDefinition gem : registry.all()) { if (gem.display() == null || gem.display().isBlank() || gem.material() != item.getType()) continue; if (!strip(gem.display()).equals(normalizedDisplay)) continue; - plugin.getLogger().info("检测到缺少旧版标识的宝石物品,已按显示名称迁移:" + gem.name()); - meta.getPersistentDataContainer().set(gemNameKey, PersistentDataType.STRING, gem.name()); - meta.getPersistentDataContainer().set(dataVersionKey, PersistentDataType.INTEGER, 1); - item.setItemMeta(meta); - NBT.modify(item, nbt -> { - nbt.setString(LegacyItemMigrator.GEM_NAME_KEY, gem.name()); - }); - return Optional.of(gem); + int score = 1; + for (String tip : gem.tips()) { + String expected = strip(tip); + if (!expected.isBlank() && itemLore.stream().anyMatch(expected::equals)) score++; + } + if (score > bestScore) { + best = gem; + bestScore = score; + } } - return Optional.empty(); + if (best == null) return Optional.empty(); + // A display-only match is accepted for legacy items, while matching Lore + // selects the correct denomination when several gems share one display. + plugin.getLogger().info("检测到缺少旧版标识的宝石物品,已按显示名和 Lore 迁移:" + best.name()); + meta.getPersistentDataContainer().set(gemNameKey, PersistentDataType.STRING, best.name()); + meta.getPersistentDataContainer().set(dataVersionKey, PersistentDataType.INTEGER, 1); + item.setItemMeta(meta); + GemDefinition migrated = best; + NBT.modify(item, nbt -> { + nbt.setString(LegacyItemMigrator.GEM_NAME_KEY, migrated.name()); + }); + return Optional.of(best); } public Map embedded(ItemStack item) {