diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3d85b4a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,54 @@ +name: Publish Release +on: + push: + branches: + - main + workflow_dispatch: + inputs: + logLevel: + description: 'Log Level' + required: false + default: 'warning' + +jobs: + publish: + runs-on: ubuntu-latest + if: "contains(github.event.commits[0].message, '[build]')" + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Validate Gradle Wrapper + uses: gradle/actions/wrapper-validation@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 17 + check-latest: true + + - name: Gradle Properties Import. + id: properties + shell: bash + run: cat gradle.properties >> $GITHUB_ENV + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Assemble + run: + ./gradlew assemble --stacktrace + + - name: Publish + env: + HANGAR_KEY: ${{ secrets.HANGAR_KEY }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + COMMIT_MESSAGE: ${{ join(github.event.commits.*.message, '
* ') }} + run: ./gradlew modrinth publishAllPublicationsToHangar --stacktrace + + - name: Maven Publish + env: + gradle_username: ${{ secrets.GRADLE_USERNAME }} + gradle_password: ${{ secrets.GRADLE_PASSWORD }} + run: ./gradlew publish --stacktrace \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 8221632..722a330 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,40 +1,3 @@ -import org.gradle.kotlin.dsl.support.uppercaseFirstChar - plugins { `root-plugin` -} - -tasks { - assemble { - val jarsDir = File("$rootDir/jars") - - doFirst { - delete(jarsDir) - - jarsDir.mkdirs() - } - - subprojects.filter { it.name == "paper" || it.name == "fabric" }.forEach { project -> - dependsOn(":${project.name}:build") - - doLast { - runCatching { - val file = File("$jarsDir/${project.name.uppercaseFirstChar().lowercase()}") - - file.mkdirs() - - copy { - from(project.layout.buildDirectory.file("libs/${rootProject.name}-${project.version}.jar")) - into(file) - } - }.onSuccess { - // Delete to save space on jenkins. - delete(project.layout.buildDirectory.get()) - delete(rootProject.layout.buildDirectory.get()) - }.onFailure { - println("Failed to copy file out of build folder into jars directory: Likely does not exist.") - } - } - } - } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f2103b1..f1e71ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ issues = https://github.com/Crazy-Crew/CrazyAuctions/issues group = com.badbones69.crazyauctions description = Auction off items in style. -version = 1.4 +version = 1.4.1 apiVersion = 1.20 mcVersion = 1.20.4 diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts index 7eee8f8..6564196 100644 --- a/paper/build.gradle.kts +++ b/paper/build.gradle.kts @@ -28,6 +28,13 @@ dependencies { tasks { assemble { dependsOn(reobfJar) + + doLast { + copy { + from(reobfJar.get()) + into(rootProject.projectDir.resolve("jars")) + } + } } runServer { @@ -40,7 +47,7 @@ tasks { url("https://ci.lucko.me/job/TinyVault/lastSuccessfulBuild/artifact/build/libs/Vault.jar") - url("https://download.luckperms.net/1532/bukkit/loader/LuckPerms-Bukkit-5.4.119.jar") + url("https://download.luckperms.net/1544/bukkit/loader/LuckPerms-Bukkit-5.4.131.jar") } minecraftVersion("1.20.4") diff --git a/paper/libs/Cluster-6.5.jar b/paper/libs/Cluster-6.5.jar deleted file mode 100644 index 1eeeccd..0000000 Binary files a/paper/libs/Cluster-6.5.jar and /dev/null differ diff --git a/paper/run/config/paper-global.yml b/paper/run/config/paper-global.yml index d28ab73..21524ef 100644 --- a/paper/run/config/paper-global.yml +++ b/paper/run/config/paper-global.yml @@ -122,6 +122,7 @@ unsupported-settings: allow-headless-pistons: false allow-permanent-block-break-exploits: false allow-piston-duplication: false + allow-tripwire-disarming-exploits: false allow-unsafe-end-portal-teleportation: false compression-format: ZLIB perform-username-validation: true diff --git a/paper/run/config/paper-world-defaults.yml b/paper/run/config/paper-world-defaults.yml index 25301f2..c8b662a 100644 --- a/paper/run/config/paper-world-defaults.yml +++ b/paper/run/config/paper-world-defaults.yml @@ -236,6 +236,7 @@ environment: min: 20 enabled: true generate-flat-bedrock: false + locate-structures-outside-world-border: false max-block-ticks: 65536 max-fluid-ticks: 65536 nether-ceiling-void-damage-height: disabled diff --git a/paper/src/main/java/com/badbones69/crazyauctions/CrazyAuctions.java b/paper/src/main/java/com/badbones69/crazyauctions/CrazyAuctions.java index 9afe167..e08cdd9 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/CrazyAuctions.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/CrazyAuctions.java @@ -13,8 +13,12 @@ import com.badbones69.crazyauctions.currency.VaultSupport; import org.bukkit.command.CommandExecutor; import org.bukkit.command.PluginCommand; import org.bukkit.command.TabCompleter; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; + +import java.util.Base64; import java.util.Timer; import java.util.TimerTask; @@ -50,6 +54,33 @@ public class CrazyAuctions extends JavaPlugin { this.crazyManager = new CrazyManager(); this.fileManager.setup(); + + FileConfiguration configuration = FileManager.Files.DATA.getFile(); + + if (configuration.contains("OutOfTime/Cancelled")) { + for (String key : configuration.getConfigurationSection("OutOfTime/Cancelled").getKeys(false)) { + final ItemStack itemStack = configuration.getItemStack("OutOfTime/Cancelled." + key + ".Item"); + + if (itemStack != null) { + configuration.set("OutOfTime/Cancelled." + key + ".Item", Base64.getEncoder().encodeToString(itemStack.serializeAsBytes())); + + FileManager.Files.DATA.saveFile(); + } + } + } + + if (configuration.contains("Items")) { + for (String key : configuration.getConfigurationSection("Items").getKeys(false)) { + final ItemStack itemStack = configuration.getItemStack("Items." + key + ".Item"); + + if (itemStack != null) { + configuration.set("Items." + key + ".Item", Base64.getEncoder().encodeToString(itemStack.serializeAsBytes())); + + FileManager.Files.DATA.saveFile(); + } + } + } + this.crazyManager.load(); getServer().getPluginManager().registerEvents(new GuiListener(), this); diff --git a/paper/src/main/java/com/badbones69/crazyauctions/api/builders/ItemBuilder.java b/paper/src/main/java/com/badbones69/crazyauctions/api/builders/ItemBuilder.java index d59b5f4..a665f2b 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/api/builders/ItemBuilder.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/api/builders/ItemBuilder.java @@ -5,7 +5,6 @@ import com.badbones69.crazyauctions.Methods; import com.badbones69.crazyauctions.api.support.PluginSupport; import com.badbones69.crazyauctions.api.support.SkullCreator; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.ryderbelserion.cluster.utils.DyeUtils; import io.th0rgal.oraxen.api.OraxenItems; import me.clip.placeholderapi.PlaceholderAPI; import net.minecraft.nbt.TagParser; @@ -36,6 +35,8 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -48,7 +49,7 @@ import java.util.stream.Collectors; public class ItemBuilder { @NotNull - private final CrazyAuctions plugin = CrazyAuctions.get(); + private static final CrazyAuctions plugin = CrazyAuctions.get(); // Items private Material material = Material.STONE; @@ -583,10 +584,10 @@ public class ItemBuilder { } else { this.potionType = getPotionType(PotionEffectType.getByName(metaData)).getEffectType(); - this.potionColor = DyeUtils.getColor(metaData); - this.armorColor = DyeUtils.getColor(metaData); - this.mapColor = DyeUtils.getColor(metaData); - this.fireworkColor = DyeUtils.getColor(metaData); + this.potionColor = getColor(metaData); + this.armorColor = getColor(metaData); + this.mapColor = getColor(metaData); + this.fireworkColor = getColor(metaData); } } else if (type.contains("#")) { String[] section = type.split("#"); @@ -1183,7 +1184,7 @@ public class ItemBuilder { try { for (PatternType pattern : PatternType.values()) { if (option.equalsIgnoreCase(pattern.name()) || value.equalsIgnoreCase(pattern.getIdentifier())) { - DyeColor color = DyeUtils.getDyeColor(value); + DyeColor color = getDyeColor(value); if (color != null) itemBuilder.addPattern(new Pattern(color, pattern)); break; } @@ -1385,7 +1386,7 @@ public class ItemBuilder { for (PatternType pattern : PatternType.values()) { if (split[0].equalsIgnoreCase(pattern.name()) || split[0].equalsIgnoreCase(pattern.getIdentifier())) { - DyeColor color = DyeUtils.getDyeColor(split[1]); + DyeColor color = getDyeColor(split[1]); if (color != null) addPattern(new Pattern(color, pattern)); @@ -1394,4 +1395,67 @@ public class ItemBuilder { } } catch (Exception ignored) {} } + + public static @Nullable DyeColor getDyeColor(@NotNull final String value) { + if (value.isEmpty()) return null; + + Color color = getColor(value); + + if (color == null) { + plugin.getLogger().severe(value + " is not a valid color."); + + return null; + } + + return DyeColor.getByColor(color); + } + + private static final Map colors = createMap(); + + private static Map createMap() { + Map map = new HashMap<>(); + map.put("AQUA", Color.AQUA); + map.put("BLACK", Color.BLACK); + map.put("BLUE", Color.BLUE); + map.put("FUCHSIA", Color.FUCHSIA); + map.put("GRAY", Color.GRAY); + map.put("GREEN", Color.GREEN); + map.put("LIME", Color.LIME); + map.put("MAROON", Color.MAROON); + map.put("NAVY", Color.NAVY); + map.put("OLIVE", Color.OLIVE); + map.put("ORANGE", Color.ORANGE); + map.put("PURPLE", Color.PURPLE); + map.put("RED", Color.RED); + map.put("SILVER", Color.SILVER); + map.put("TEAL", Color.TEAL); + map.put("WHITE", Color.WHITE); + map.put("YELLOW", Color.YELLOW); + return map; + } + + public static Color getColor(String color) { + if (color != null && !color.isBlank()) { + Color mappedColor = (Color)colors.get(color.toUpperCase()); + if (mappedColor != null) { + return mappedColor; + } else { + try { + String[] rgb = color.split(","); + if (rgb.length != 3) { + return null; + } else { + int red = Integer.parseInt(rgb[0]); + int green = Integer.parseInt(rgb[1]); + int blue = Integer.parseInt(rgb[2]); + return Color.fromRGB(red, green, blue); + } + } catch (ArrayIndexOutOfBoundsException | NumberFormatException var6) { + return null; + } + } + } else { + return null; + } + } } \ No newline at end of file diff --git a/paper/src/main/java/com/badbones69/crazyauctions/commands/AuctionCommand.java b/paper/src/main/java/com/badbones69/crazyauctions/commands/AuctionCommand.java index 0e92135..673c6bb 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/commands/AuctionCommand.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/commands/AuctionCommand.java @@ -22,6 +22,7 @@ import org.bukkit.permissions.PermissionAttachmentInfo; import org.jetbrains.annotations.NotNull; import org.yaml.snakeyaml.error.YAMLException; import java.util.ArrayList; +import java.util.Base64; import java.util.HashMap; import java.util.Random; import java.util.logging.Level; @@ -131,7 +132,7 @@ public class AuctionCommand implements CommandExecutor { ItemStack stack = item.clone(); stack.setAmount(amount); - data.set("Items." + num + ".Item", stack); + data.set("Items." + num + ".Item", Base64.getEncoder().encodeToString(stack.serializeAsBytes())); } Files.DATA.saveFile(); @@ -406,7 +407,7 @@ public class AuctionCommand implements CommandExecutor { ItemStack stack = item.clone(); stack.setAmount(amount); - data.set("Items." + num + ".Item", stack); + data.set("Items." + num + ".Item", Base64.getEncoder().encodeToString(stack.serializeAsBytes())); Files.DATA.saveFile(); diff --git a/paper/src/main/java/com/badbones69/crazyauctions/controllers/GuiListener.java b/paper/src/main/java/com/badbones69/crazyauctions/controllers/GuiListener.java index 3dc93d6..0522757 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/controllers/GuiListener.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/controllers/GuiListener.java @@ -27,6 +27,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -65,7 +66,10 @@ public class GuiListener implements Listener { if (data.contains("Items")) { for (String i : data.getConfigurationSection("Items").getKeys(false)) { List lore = new ArrayList<>(); - if (data.getItemStack("Items." + i + ".Item") != null && (cat.getItems().contains(data.getItemStack("Items." + i + ".Item").getType()) || cat == Category.NONE)) { + + ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item")))); + + if (itemBuilder != null && data.contains("Items." + i + ".Item") && (cat.getItems().contains(itemBuilder.getItemStack().getType()) || cat == Category.NONE)) { if (data.getBoolean("Items." + i + ".Biddable")) { if (sell == ShopType.BID) { String seller = data.getString("Items." + i + ".Seller"); @@ -74,8 +78,6 @@ public class GuiListener implements Listener { lore.add(l.replace("%TopBid%", Methods.getPrice(i, false)).replace("%topbid%", Methods.getPrice(i, false)).replace("%Seller%", seller).replace("%seller%", seller).replace("%TopBidder%", topbidder).replace("%topbidder%", topbidder).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire")))); } - ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item")); - itemBuilder.setLore(lore); items.add(itemBuilder.build()); @@ -88,11 +90,7 @@ public class GuiListener implements Listener { lore.add(l.replace("%Price%", String.format(Locale.ENGLISH, "%,d", Long.parseLong(Methods.getPrice(i, false)))).replace("%price%", String.format(Locale.ENGLISH, "%,d", Long.parseLong(Methods.getPrice(i, false)))).replace("%Seller%", data.getString("Items." + i + ".Seller")).replace("%seller%", data.getString("Items." + i + ".Seller")).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire")))); } - ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item")); - - if (itemBuilder.getUpdatedLore().isEmpty()) { - lore.forEach(itemBuilder::addLore); - } + itemBuilder.setLore(lore); items.add(itemBuilder.build()); @@ -256,9 +254,9 @@ public class GuiListener implements Listener { lore.add(l.replace("%Price%", Methods.getPrice(i, false)).replace("%price%", Methods.getPrice(i, false)).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire")))); } - ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item")); + ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item")))); - lore.forEach(itemBuilder::addLore); + itemBuilder.setLore(lore); items.add(itemBuilder.build()); @@ -293,9 +291,9 @@ public class GuiListener implements Listener { lore.add(l.replace("%Price%", Methods.getPrice(i, true)).replace("%price%", Methods.getPrice(i, true)).replace("%Time%", Methods.convertToTime(data.getLong("OutOfTime/Cancelled." + i + ".Full-Time"))).replace("%time%", Methods.convertToTime(data.getLong("OutOfTime/Cancelled." + i + ".Full-Time")))); } - ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("OutOfTime/Cancelled." + i + ".Item")); + ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item")))); - lore.forEach(itemBuilder::addLore); + itemBuilder.setLore(lore); items.add(itemBuilder.build()); @@ -393,7 +391,7 @@ public class GuiListener implements Listener { } } - ItemStack item = data.getItemStack("Items." + ID + ".Item"); + ItemStack item = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))); List lore = new ArrayList<>(); for (String l : config.getStringList("Settings.GUISettings.SellingItemLore")) { lore.add(l.replace("%Price%", Methods.getPrice(ID, false)).replace("%price%", Methods.getPrice(ID, false)).replace("%Seller%", data.getString("Items." + ID + ".Seller")).replace("%seller%", data.getString("Items." + ID + ".Seller")).replace("%Time%", Methods.convertToTime(data.getLong("Items." + l + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + l + ".Time-Till-Expire")))); @@ -401,7 +399,7 @@ public class GuiListener implements Listener { ItemBuilder itemBuilder = ItemBuilder.convertItemStack(item); - lore.forEach(itemBuilder::addLore); + itemBuilder.setLore(lore); inv.setItem(4, itemBuilder.build()); @@ -470,9 +468,9 @@ public class GuiListener implements Listener { } } - ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item")); + ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item")))); - lore.forEach(itemBuilder::addLore); + itemBuilder.setLore(lore); items.add(itemBuilder.build()); @@ -545,7 +543,7 @@ public class GuiListener implements Listener { FileConfiguration data = Files.DATA.getFile(); String seller = data.getString("Items." + ID + ".Seller"); String topbidder = data.getString("Items." + ID + ".TopBidder"); - ItemStack item = data.getItemStack("Items." + ID + ".Item"); + ItemStack item = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))); List lore = new ArrayList<>(); for (String l : config.getStringList("Settings.GUISettings.Bidding")) { @@ -554,7 +552,7 @@ public class GuiListener implements Listener { ItemBuilder itemBuilder = ItemBuilder.convertItemStack(item); - lore.forEach(itemBuilder::addLore); + itemBuilder.setLore(lore); return itemBuilder.build(); } @@ -661,7 +659,7 @@ public class GuiListener implements Listener { return; } - Bukkit.getPluginManager().callEvent(new AuctionNewBidEvent(player, data.getItemStack("Items." + ID + ".Item"), bid)); + Bukkit.getPluginManager().callEvent(new AuctionNewBidEvent(player, ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))), bid)); data.set("Items." + ID + ".Price", bid); data.set("Items." + ID + ".TopBidder", player.getName()); HashMap placeholders = new HashMap<>(); @@ -810,12 +808,12 @@ public class GuiListener implements Listener { sellerPlayer.sendMessage(Messages.ADMIN_FORCE_CANCELLED_TO_PLAYER.getMessage()); } - AuctionCancelledEvent event = new AuctionCancelledEvent((sellerPlayer != null ? sellerPlayer : Bukkit.getOfflinePlayer(seller)), data.getItemStack("Items." + i + ".Item"), Reaons.ADMIN_FORCE_CANCEL); + AuctionCancelledEvent event = new AuctionCancelledEvent((sellerPlayer != null ? sellerPlayer : Bukkit.getOfflinePlayer(seller)), ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))), Reaons.ADMIN_FORCE_CANCEL); Bukkit.getPluginManager().callEvent(event); data.set("OutOfTime/Cancelled." + num + ".Seller", data.getString("Items." + i + ".Seller")); data.set("OutOfTime/Cancelled." + num + ".Full-Time", data.getLong("Items." + i + ".Full-Time")); data.set("OutOfTime/Cancelled." + num + ".StoreID", data.getInt("Items." + i + ".StoreID")); - data.set("OutOfTime/Cancelled." + num + ".Item", data.getItemStack("Items." + i + ".Item")); + data.set("OutOfTime/Cancelled." + num + ".Item", data.getString("Items." + ID + ".Item")); data.set("Items." + i, null); Files.DATA.saveFile(); player.sendMessage(Messages.ADMIN_FORCE_CANCELLED.getMessage()); @@ -944,7 +942,8 @@ public class GuiListener implements Listener { return; } - ItemStack i = data.getItemStack("Items." + ID + ".Item"); + ItemStack i = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))); + plugin.getServer().getPluginManager().callEvent(new AuctionBuyEvent(player, i, cost)); plugin.getSupport().removeMoney(player, cost); plugin.getSupport().addMoney(Methods.getOfflinePlayer(seller), cost); @@ -1006,14 +1005,14 @@ public class GuiListener implements Listener { int ID = data.getInt("Items." + i + ".StoreID"); if (id == ID) { player.sendMessage(Messages.CANCELLED_ITEM.getMessage()); - AuctionCancelledEvent event = new AuctionCancelledEvent(player, data.getItemStack("Items." + i + ".Item"), Reaons.PLAYER_FORCE_CANCEL); + AuctionCancelledEvent event = new AuctionCancelledEvent(player, ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item"))), Reaons.PLAYER_FORCE_CANCEL); Bukkit.getPluginManager().callEvent(event); int num = 1; for (; data.contains("OutOfTime/Cancelled." + num); num++) ; data.set("OutOfTime/Cancelled." + num + ".Seller", data.getString("Items." + i + ".Seller")); data.set("OutOfTime/Cancelled." + num + ".Full-Time", data.getLong("Items." + i + ".Full-Time")); data.set("OutOfTime/Cancelled." + num + ".StoreID", data.getInt("Items." + i + ".StoreID")); - data.set("OutOfTime/Cancelled." + num + ".Item", data.getItemStack("Items." + i + ".Item")); + data.set("OutOfTime/Cancelled." + num + ".Item", data.getString("Items." + i + ".Item")); data.set("Items." + i, null); Files.DATA.saveFile(); playClick(player); @@ -1070,7 +1069,7 @@ public class GuiListener implements Listener { player.sendMessage(Messages.INVENTORY_FULL.getMessage()); break; } else { - player.getInventory().addItem(data.getItemStack("OutOfTime/Cancelled." + i + ".Item")); + player.getInventory().addItem(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item")))); data.set("OutOfTime/Cancelled." + i, null); } } @@ -1103,8 +1102,7 @@ public class GuiListener implements Listener { if (id == ID) { if (!Methods.isInvFull(player)) { player.sendMessage(Messages.GOT_ITEM_BACK.getMessage()); - ItemStack IT = data.getItemStack("OutOfTime/Cancelled." + i + ".Item"); - player.getInventory().addItem(IT); + player.getInventory().addItem(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item")))); data.set("OutOfTime/Cancelled." + i, null); Files.DATA.saveFile(); playClick(player);