diff --git a/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java b/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java index f28e169..4173b00 100644 --- a/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java +++ b/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java @@ -50,7 +50,10 @@ new BukkitRunnable() { @Override public void run() { - items = loadedItems; + items = new ArrayList<>(); + for (DatabaseTreasureChestItem i : loadedItems) { + items.add(i.restoreAfterDeserialization()); + } itemsById = new HashMap<>(); for (DatabaseTreasureChestItem i : items) { itemsById.put(i.getId(), i); @@ -72,7 +75,7 @@ } void addItem(DatabaseTreasureChestItem item) { - item = item.clone(); + item = item.restoreAfterDeserialization(); if (items == null) { items = new ArrayList<>(); itemsById = new HashMap<>(); diff --git a/src/main/java/de/iani/treasurechest/TreasureChest.java b/src/main/java/de/iani/treasurechest/TreasureChest.java index 38e3557..3b47b34 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChest.java +++ b/src/main/java/de/iani/treasurechest/TreasureChest.java @@ -1,6 +1,7 @@ package de.iani.treasurechest; import de.iani.cubesideutils.bukkit.commands.CommandRouter; +import de.iani.cubesideutils.bukkit.items.ItemStacks; import de.iani.playerUUIDCache.CachedPlayer; import de.iani.playerUUIDCache.PlayerUUIDCache; import de.iani.treasurechest.PlayerTreasureChestContent.LoadState; @@ -139,13 +140,14 @@ ArrayList copied = new ArrayList<>(); if (items != null) { for (ItemStack is : items) { + is = ItemStacks.prepareForSerialization(is); if (is != null && is.getAmount() > 0 && is.getType() != Material.AIR) { copied.add(is.clone()); } } items = copied.toArray(new ItemStack[copied.size()]); } - TreasureChestItem item = new TreasureChestItem(displayItem, items, money); + TreasureChestItem item = new TreasureChestItem(ItemStacks.prepareForSerialization(displayItem), items, money); workerThread.addWork(database -> { try { DatabaseTreasureChestItem added = database.addItem(player, item); diff --git a/src/main/java/de/iani/treasurechest/TreasureChestItem.java b/src/main/java/de/iani/treasurechest/TreasureChestItem.java index ea8a78b..c0f0b09 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChestItem.java +++ b/src/main/java/de/iani/treasurechest/TreasureChestItem.java @@ -1,5 +1,6 @@ package de.iani.treasurechest; +import de.iani.cubesideutils.bukkit.items.ItemStacks; import org.bukkit.inventory.ItemStack; public class TreasureChestItem implements Cloneable { @@ -68,4 +69,11 @@ throw new Error(e); } } + + protected void restoreAfterDeserializationInternal() { + displayItem = ItemStacks.restoreAfterDeserialization(displayItem); + for (int i = 0; i < priceItems.length; i++) { + priceItems[i] = ItemStacks.restoreAfterDeserialization(priceItems[i]); + } + } } diff --git a/src/main/java/de/iani/treasurechest/commands/UpdateAllCommand.java b/src/main/java/de/iani/treasurechest/commands/UpdateAllCommand.java index 61911d2..54bc6d9 100644 --- a/src/main/java/de/iani/treasurechest/commands/UpdateAllCommand.java +++ b/src/main/java/de/iani/treasurechest/commands/UpdateAllCommand.java @@ -6,6 +6,7 @@ import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException; import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException; import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException; +import de.iani.cubesideutils.bukkit.items.ItemStacks; import de.iani.cubesideutils.bukkit.updater.DataUpdater; import de.iani.cubesideutils.commands.ArgsParser; import de.iani.treasurechest.Permissions; @@ -87,7 +88,7 @@ boolean changed = false; ItemStack oldStack = i.getDisplayItem(); - ItemStack newStack = DataUpdater.updateItemStack(oldStack); + ItemStack newStack = ItemStacks.prepareForSerialization(DataUpdater.updateItemStack(ItemStacks.restoreAfterDeserialization(oldStack))); if (!Objects.equals(newStack, oldStack)) { i.setDisplayItem(newStack); changed = true; @@ -97,7 +98,7 @@ if (priceItems != null) { for (int j = 0; j < priceItems.length; j++) { oldStack = priceItems[j]; - newStack = DataUpdater.updateItemStack(oldStack); + newStack = ItemStacks.prepareForSerialization(DataUpdater.updateItemStack(ItemStacks.restoreAfterDeserialization(oldStack))); if (!Objects.equals(newStack, oldStack)) { priceItems[j] = newStack; changed = true; diff --git a/src/main/java/de/iani/treasurechest/database/DatabaseTreasureChestItem.java b/src/main/java/de/iani/treasurechest/database/DatabaseTreasureChestItem.java index bf8085d..940195b 100644 --- a/src/main/java/de/iani/treasurechest/database/DatabaseTreasureChestItem.java +++ b/src/main/java/de/iani/treasurechest/database/DatabaseTreasureChestItem.java @@ -26,4 +26,10 @@ public DatabaseTreasureChestItem clone() { return (DatabaseTreasureChestItem) super.clone(); } + + public DatabaseTreasureChestItem restoreAfterDeserialization() { + DatabaseTreasureChestItem clone = clone(); + clone.restoreAfterDeserializationInternal(); + return clone; + } }