diff --git a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java index d7dfd60..a87b727 100644 --- a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java +++ b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java @@ -107,9 +107,6 @@ public class Listeners implements Listener { } Player player = (Player) event.getWhoClicked(); - if (player.hasPermission("playervaults.bypassblockeditems")) { - return; - } Inventory clickedInventory = event.getClickedInventory(); if (clickedInventory != null) { @@ -119,7 +116,13 @@ public class Listeners implements Listener { String inventoryTitle = event.getView().getTitle(); String title = Lang.VAULT_TITLE.toString().replace("%number", String.valueOf(num)).replace("%p", info.getVaultName()); if (((inventoryTitle.equalsIgnoreCase(title)) || event.getCurrentItem() != null)) { - if (event.getCurrentItem() != null && PlayerVaults.getInstance().isBlockedMaterial(event.getCurrentItem().getType())) { + try { + event.getCurrentItem().toString(); + } catch (Exception e) { + player.sendMessage(Lang.TITLE.toString() + Lang.BLOCKED_BAD_ITEM); + event.setCancelled(true); + } + if (!player.hasPermission("playervaults.bypassblockeditems") && event.getCurrentItem() != null && PlayerVaults.getInstance().isBlockedMaterial(event.getCurrentItem().getType())) { event.setCancelled(true); player.sendMessage(Lang.TITLE.toString() + Lang.BLOCKED_ITEM.toString().replace("%m", event.getCurrentItem().getType().name())); } diff --git a/src/main/java/com/drtshock/playervaults/translations/Lang.java b/src/main/java/com/drtshock/playervaults/translations/Lang.java index eb1fc86..84bc413 100644 --- a/src/main/java/com/drtshock/playervaults/translations/Lang.java +++ b/src/main/java/com/drtshock/playervaults/translations/Lang.java @@ -53,7 +53,8 @@ public enum Lang { LOCKED("vaults-locked", "&cVaults are currently locked while conversion occurs. Please try again in a moment!"), HELP("help", "/pv "), BLOCKED_ITEM("blocked-item", "&6%m &cis blocked from vaults"), - SIGNS_DISABLED("signs-disabled", "&cVault signs are currently disabled."); + SIGNS_DISABLED("signs-disabled", "&cVault signs are currently disabled."), + BLOCKED_BAD_ITEM("blocked-bad-item", "&cThis item is not allowed in a vault."); private static YamlConfiguration LANG; private final String path; diff --git a/src/main/java/com/drtshock/playervaults/vaultmanagement/Base64Serialization.java b/src/main/java/com/drtshock/playervaults/vaultmanagement/Base64Serialization.java index cd471c9..7e6fd2d 100644 --- a/src/main/java/com/drtshock/playervaults/vaultmanagement/Base64Serialization.java +++ b/src/main/java/com/drtshock/playervaults/vaultmanagement/Base64Serialization.java @@ -19,6 +19,7 @@ package com.drtshock.playervaults.vaultmanagement; +import com.drtshock.playervaults.PlayerVaults; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -36,20 +37,37 @@ public class Base64Serialization { public static String toBase64(Inventory inventory, int size) { try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); + ByteArrayOutputStream finalOutputStream = new ByteArrayOutputStream(); + ByteArrayOutputStream temporaryOutputStream = new ByteArrayOutputStream(); + BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(temporaryOutputStream); + int failedItems = 0; // Write the size of the inventory dataOutput.writeInt(size); // Save every element in the list for (int i = 0; i < inventory.getSize(); i++) { - dataOutput.writeObject(inventory.getItem(i)); + try { + dataOutput.writeObject(inventory.getItem(i)); + } catch (Exception ignored) { + failedItems++; + temporaryOutputStream.reset(); + } finally { + if (temporaryOutputStream.size() == 0) { + dataOutput.writeObject(null); + } + finalOutputStream.write(temporaryOutputStream.toByteArray()); + temporaryOutputStream.reset(); + } + } + + if (failedItems > 0) { + PlayerVaults.getInstance().getLogger().severe("Failed to save " + failedItems + " invalid items to vault"); } // Serialize that array dataOutput.close(); - return Base64Coder.encodeLines(outputStream.toByteArray()); + return Base64Coder.encodeLines(finalOutputStream.toByteArray()); } catch (Exception e) { throw new IllegalStateException("Cannot into itemstacksz!", e); } diff --git a/src/main/resources/lang/bulgarian.yml b/src/main/resources/lang/bulgarian.yml index 938296d..33aae8b 100644 --- a/src/main/resources/lang/bulgarian.yml +++ b/src/main/resources/lang/bulgarian.yml @@ -31,4 +31,5 @@ conversion-background: "&fЗапочнахме конвертирането на vaults-locked: "&cСейфовете са заключени докато тече конвертиране. Моля, опитайте пак по-късно!" help: "/pv <номер>" blocked-item: "&6%m &cне може да се слага в сейфове." -signs-disabled: "&cVault signs are currently disabled." \ No newline at end of file +signs-disabled: "&cVault signs are currently disabled." +blocked-bad-item: "&cThis item is not allowed in a vault." \ No newline at end of file diff --git a/src/main/resources/lang/dutch.yml b/src/main/resources/lang/dutch.yml index b17dae2..035f6a7 100644 --- a/src/main/resources/lang/dutch.yml +++ b/src/main/resources/lang/dutch.yml @@ -31,4 +31,5 @@ conversion-background: "&fHet converteren is naar de achtergrond geplaatst. Chec vaults-locked: "&cVaults zijn op dit moment op slot terwijl het wordt geconverteerd. Probeer het later opnieuw!" help: "/pv " blocked-item: "&6%m &cis geblokkeer van vaults." -signs-disabled: "&cVault signs are currently disabled." \ No newline at end of file +signs-disabled: "&cVault signs are currently disabled." +blocked-bad-item: "&cThis item is not allowed in a vault." \ No newline at end of file diff --git a/src/main/resources/lang/english.yml b/src/main/resources/lang/english.yml index 1940650..71116e0 100644 --- a/src/main/resources/lang/english.yml +++ b/src/main/resources/lang/english.yml @@ -31,4 +31,5 @@ conversion-background: "&fConversion has been forked to the background. See cons vaults-locked: "&cVaults are currently locked while conversion occurs. Please try again in a moment!" help: "/pv " blocked-item: "&6%m &cis blocked from vaults." -signs-disabled: "&cVault signs are currently disabled." \ No newline at end of file +signs-disabled: "&cVault signs are currently disabled." +blocked-bad-item: "&cThis item is not allowed in a vault." \ No newline at end of file diff --git a/src/main/resources/lang/russian.yml b/src/main/resources/lang/russian.yml index 3da56b0..959115e 100644 --- a/src/main/resources/lang/russian.yml +++ b/src/main/resources/lang/russian.yml @@ -31,4 +31,5 @@ conversion-background: "&fКонвертирование просходит в vaults-locked: "&cХранилища сейчас заблокированы, пока конвертируются. Пожалуйста, попробуйте чуть позже!" help: "/pv <номер>" blocked-item: "&cПредмет «&6%m&c» &cзаблокирован хранилищем." -signs-disabled: "&cVault signs are currently disabled." \ No newline at end of file +signs-disabled: "&cVault signs are currently disabled." +blocked-bad-item: "&cThis item is not allowed in a vault." \ No newline at end of file diff --git a/src/main/resources/lang/turkish.yml b/src/main/resources/lang/turkish.yml index 58e7378..87e83e5 100644 --- a/src/main/resources/lang/turkish.yml +++ b/src/main/resources/lang/turkish.yml @@ -31,4 +31,5 @@ conversion-background: "&fDönüşüm, arka plana aktarıldı. Detaylar için ko vaults-locked: "&cDönüşüm gerçekleştiğinde kasalar kilitlenir. Lütfen biraz sonra tekrar deneyin!" help: "/pv " blocked-item: "&6%m &cdepoda barındırılamaz!" -signs-disabled: "&cVault signs are currently disabled." \ No newline at end of file +signs-disabled: "&cVault signs are currently disabled." +blocked-bad-item: "&cThis item is not allowed in a vault." \ No newline at end of file