package me.lethunderhawk.custom.item.abstraction.migration; import me.lethunderhawk.custom.item.abstraction.definition.ItemDefinition; import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance; import me.lethunderhawk.custom.item.abstraction.instance.ItemInstanceReader; import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry; import me.lethunderhawk.custom.item.abstraction.visual.ItemRenderer; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; public final class MigrationService { /** * Migrates a single stack. * Returns the migrated stack or the original if no migration was needed. */ public ItemStack migrate(ItemStack original) { if (original == null) return null; ItemInstance current = ItemInstanceReader.read(original); if (current == null) return original; ItemDefinition latest = CustomItemRegistry.get(current.itemId()); if (latest == null) { return original; } if (current.version() == latest.getVersion()) { return original; } // --- Ensure correct material --- ItemStack stack = original; if (!latest.getVisual().isHead() && stack.getType() != latest.getVisual().getMaterial()) { stack = stack.withType(latest.getVisual().getMaterial()); } // --- Create migrated instance --- ItemInstance migrated = new ItemInstance(latest); migrated.data().putAll(current.data()); migrated.setVersion(latest.getVersion()); // --- Render --- ItemRenderer.renderInto(stack, migrated); return stack; } public void migratePlayer(Player player) { ItemStack[] contents = player.getInventory().getContents(); boolean changed = false; for (int i = 0; i < contents.length; i++) { ItemStack item = contents[i]; if (item == null || item.isEmpty()) continue; ItemInstance before = ItemInstanceReader.read(item); if (before == null) continue; int oldVersion = before.version(); ItemStack migrated = migrate(item); contents[i] = migrated; ItemInstance after = ItemInstanceReader.read(migrated); if (after != null && after.version() != oldVersion) { player.sendMessage( "Migrated " + after.itemId() + " from v" + oldVersion + " to v" + after.version() ); changed = true; } } if (changed) { player.getInventory().setContents(contents); player.updateInventory(); } } }