| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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();
- }
- }
- }
|