MigrationService.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package me.lethunderhawk.custom.item.abstraction.migration;
  2. import me.lethunderhawk.custom.item.abstraction.definition.ItemDefinition;
  3. import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance;
  4. import me.lethunderhawk.custom.item.abstraction.instance.ItemInstanceReader;
  5. import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry;
  6. import me.lethunderhawk.custom.item.abstraction.visual.ItemRenderer;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.inventory.ItemStack;
  9. public final class MigrationService {
  10. /**
  11. * Migrates a single stack.
  12. * Returns the migrated stack or the original if no migration was needed.
  13. */
  14. public ItemStack migrate(ItemStack original) {
  15. if (original == null) return null;
  16. ItemInstance current = ItemInstanceReader.read(original);
  17. if (current == null) return original;
  18. ItemDefinition latest = CustomItemRegistry.get(current.itemId());
  19. if (latest == null) {
  20. return original;
  21. }
  22. if (current.version() == latest.getVersion()) {
  23. return original;
  24. }
  25. // --- Ensure correct material ---
  26. ItemStack stack = original;
  27. if (!latest.getVisual().isHead()
  28. && stack.getType() != latest.getVisual().getMaterial()) {
  29. stack = stack.withType(latest.getVisual().getMaterial());
  30. }
  31. // --- Create migrated instance ---
  32. ItemInstance migrated = new ItemInstance(latest);
  33. migrated.data().putAll(current.data());
  34. migrated.setVersion(latest.getVersion());
  35. // --- Render ---
  36. ItemRenderer.renderInto(stack, migrated);
  37. return stack;
  38. }
  39. public void migratePlayer(Player player) {
  40. ItemStack[] contents = player.getInventory().getContents();
  41. boolean changed = false;
  42. for (int i = 0; i < contents.length; i++) {
  43. ItemStack item = contents[i];
  44. if (item == null || item.isEmpty()) continue;
  45. ItemInstance before = ItemInstanceReader.read(item);
  46. if (before == null) continue;
  47. int oldVersion = before.version();
  48. ItemStack migrated = migrate(item);
  49. contents[i] = migrated;
  50. ItemInstance after = ItemInstanceReader.read(migrated);
  51. if (after != null && after.version() != oldVersion) {
  52. player.sendMessage(
  53. "Migrated " + after.itemId() +
  54. " from v" + oldVersion +
  55. " to v" + after.version()
  56. );
  57. changed = true;
  58. }
  59. }
  60. if (changed) {
  61. player.getInventory().setContents(contents);
  62. player.updateInventory();
  63. }
  64. }
  65. }