diff --git a/src/main/java/de/fanta/challenges/gravestones/GravestoneListener.java b/src/main/java/de/fanta/challenges/gravestones/GravestoneListener.java index dd5a1a8..8450872 100644 --- a/src/main/java/de/fanta/challenges/gravestones/GravestoneListener.java +++ b/src/main/java/de/fanta/challenges/gravestones/GravestoneListener.java @@ -92,30 +92,37 @@ } String playerUUID = container.get(UUIDKey, PersistentDataType.STRING); if (playerUUID.equals(player.getUniqueId().toString())) { - NamespacedKey InventoryKey = GravestoneUtils.getInventoryKey(); - byte[] inventorybyte = container.get(InventoryKey, PersistentDataType.BYTE_ARRAY); - String yamlstring = GravestoneUtils.decompressString(inventorybyte); - try { - YamlConfiguration conf = new YamlConfiguration(); - conf.loadFromString(yamlstring); - List stacks = (List) conf.getList("inv"); - List fullinvstacklist = new ArrayList<>(); - for (int i = 0; i < stacks.size(); i++) { - ItemStack stack = stacks.get(i); - if (stack != null) { - if (player.getInventory().getItem(i) == null) { - player.getInventory().setItem(i, stack); - } else { - fullinvstacklist.add(stack); - } + ItemStack[] stacks = new ItemStack[0]; + if (container.get(GravestoneUtils.getInventoryBase64Key(), PersistentDataType.BYTE_ARRAY) != null) { + byte[] inventorybyte = container.get(GravestoneUtils.getInventoryBase64Key(), PersistentDataType.BYTE_ARRAY); + String yamlstring = GravestoneUtils.decompressString(inventorybyte); + stacks = GravestoneUtils.createItemArrayFromString(yamlstring); + } else if (container.get(GravestoneUtils.getInventoryKey(), PersistentDataType.BYTE_ARRAY) != null) { + try { + byte[] inventorybyte = container.get(GravestoneUtils.getInventoryKey(), PersistentDataType.BYTE_ARRAY); + String yamlstring = GravestoneUtils.decompressString(inventorybyte); + YamlConfiguration conf = new YamlConfiguration(); + conf.loadFromString(yamlstring); + stacks = conf.getList("inv").toArray(new ItemStack[0]); + } catch (InvalidConfigurationException ex) { + plugin.getLogger().log(Level.SEVERE, "Error while loading yaml Config", e); + } + } + + List fullinvstacklist = new ArrayList<>(); + for (int i = 0; i < stacks.length; i++) { + ItemStack stack = stacks[i]; + if (stack != null) { + if (player.getInventory().getItem(i) == null) { + player.getInventory().setItem(i, stack); + } else { + fullinvstacklist.add(stack); } } - Collection droplist = player.getInventory().addItem(fullinvstacklist.toArray(new ItemStack[0])).values(); - for (ItemStack stack : droplist) { - armorStand.getLocation().getWorld().dropItem(armorStand.getLocation().add(0, 1, 0), stack); - } - } catch (InvalidConfigurationException ex) { - plugin.getLogger().log(Level.SEVERE, "Error while loading yaml Config", e); + } + Collection droplist = player.getInventory().addItem(fullinvstacklist.toArray(new ItemStack[0])).values(); + for (ItemStack stack : droplist) { + armorStand.getLocation().getWorld().dropItem(armorStand.getLocation().add(0, 1, 0), stack); } armorStand.remove(); } else { diff --git a/src/main/java/de/fanta/challenges/gravestones/GravestoneUtils.java b/src/main/java/de/fanta/challenges/gravestones/GravestoneUtils.java index 83c66a2..5ecc265 100644 --- a/src/main/java/de/fanta/challenges/gravestones/GravestoneUtils.java +++ b/src/main/java/de/fanta/challenges/gravestones/GravestoneUtils.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.utils.ChatUtil; +import de.fanta.challenges.utils.ItemStackUtil; import de.iani.cubesideutils.bukkit.items.ItemGroups; import net.kyori.adventure.text.Component; import org.bukkit.Location; @@ -11,12 +12,12 @@ import org.bukkit.block.Block; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Snow; +import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -27,6 +28,8 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.logging.Level; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; @@ -34,6 +37,7 @@ public class GravestoneUtils { private static final NamespacedKey UUIDKey = new NamespacedKey(Challenges.getPlugin(), "uuid_gravestone"); private static final NamespacedKey inventoryKey = new NamespacedKey(Challenges.getPlugin(), "inventory_gravestone"); + private static final NamespacedKey inventoryBase64Key = new NamespacedKey(Challenges.getPlugin(), "inventory_base64_gravestone"); public static byte[] compressString(String s) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -69,21 +73,46 @@ public static String createInventoryString(ItemStack[] inventory) { YamlConfiguration conf = new YamlConfiguration(); + String[] base64Items = new String[inventory.length]; for (int i = 0; i < inventory.length; i++) { ItemStack stack = inventory[i]; - if (stack != null) { - ItemMeta meta = stack.getItemMeta(); - if (meta != null) { - if (meta.hasEnchant(Enchantment.VANISHING_CURSE)) { - inventory[i] = null; - } + if (stack != null && stack.getItemMeta() != null) { + if (stack.getItemMeta().hasEnchant(Enchantment.VANISHING_CURSE)) { + base64Items[i] = null; + } else { + base64Items[i] = ItemStackUtil.getBase64StringFromItemStack(stack); } } } - conf.set("inv", inventory); + conf.set("inv", base64Items); return conf.saveToString(); } + public static ItemStack[] createItemArrayFromString(String yamlstring) { + ItemStack[] inventory = new ItemStack[0]; + + try { + YamlConfiguration conf = new YamlConfiguration(); + conf.loadFromString(yamlstring); + List stacks = conf.getList("inv"); + if (stacks == null) { + return inventory; + } + inventory = new ItemStack[stacks.size()]; + for (int i = 0; i < stacks.size(); i++) { + String base64Item = (String) stacks.get(i); + if (base64Item != null) { + inventory[i] = ItemStackUtil.getItemStackFromBase64(base64Item); + } else { + inventory[i] = null; + } + } + } catch (InvalidConfigurationException ex) { + Challenges.getPlugin().getLogger().log(Level.SEVERE, "Error while loading yaml Config", ex); + } + return inventory; + } + public static void spawnAtBlock(Block block, Player player, byte[] inventoryBytes) { World world = block.getWorld(); @@ -121,7 +150,7 @@ t.getEquipment().setHelmet(itemStack); PersistentDataContainer container = t.getPersistentDataContainer(); container.set(UUIDKey, PersistentDataType.STRING, player.getUniqueId().toString()); - container.set(inventoryKey, PersistentDataType.BYTE_ARRAY, inventoryBytes); + container.set(inventoryBase64Key, PersistentDataType.BYTE_ARRAY, inventoryBytes); }); ChatUtil.sendMessage(player, Component.text("Dein Grabschstein steht bei:", ChatUtil.GREEN).append(Component.text(" (" + player.getLocation().getBlockX() + "/" + player.getLocation().getBlockY() + "/" + player.getLocation().getBlockZ() + ")", ChatUtil.ORANGE))); } @@ -134,4 +163,8 @@ public static NamespacedKey getInventoryKey() { return inventoryKey; } + + public static NamespacedKey getInventoryBase64Key() { + return inventoryBase64Key; + } } diff --git a/src/main/java/de/fanta/challenges/utils/ItemStackUtil.java b/src/main/java/de/fanta/challenges/utils/ItemStackUtil.java new file mode 100644 index 0000000..13254dd --- /dev/null +++ b/src/main/java/de/fanta/challenges/utils/ItemStackUtil.java @@ -0,0 +1,20 @@ +package de.fanta.challenges.utils; + +import org.bukkit.inventory.ItemStack; + +import java.util.Base64; + +public class ItemStackUtil { + + public static String getBase64StringFromItemStack(ItemStack stack) { + if (stack == null) { + return null; + } + return Base64.getEncoder().encodeToString(stack.serializeAsBytes()); + } + + public static ItemStack getItemStackFromBase64(String itemString) { + byte[] itemBytes = Base64.getDecoder().decode(itemString); + return ItemStack.deserializeBytes(itemBytes); + } +}