diff --git a/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/AuctionsMenu.java b/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/AuctionsMenu.java index 06602da..754c927 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/AuctionsMenu.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/AuctionsMenu.java @@ -3,23 +3,19 @@ package com.badbones69.crazyauctions.api.guis.types; import com.badbones69.crazyauctions.Methods; import com.badbones69.crazyauctions.api.builders.ItemBuilder; import com.badbones69.crazyauctions.api.enums.Category; -import com.badbones69.crazyauctions.api.enums.Messages; -import com.badbones69.crazyauctions.api.enums.Reasons; import com.badbones69.crazyauctions.api.enums.ShopType; import com.badbones69.crazyauctions.api.enums.misc.Files; import com.badbones69.crazyauctions.api.enums.misc.Keys; -import com.badbones69.crazyauctions.api.events.AuctionCancelledEvent; import com.badbones69.crazyauctions.api.guis.Holder; import com.badbones69.crazyauctions.api.guis.HolderManager; import com.badbones69.crazyauctions.api.GuiManager; +import com.badbones69.crazyauctions.currency.VaultSupport; import com.badbones69.crazyauctions.tasks.InventoryManager; import com.badbones69.crazyauctions.tasks.objects.Auction; import com.ryderbelserion.vital.paper.util.scheduler.FoliaRunnable; import io.papermc.paper.persistence.PersistentDataContainerView; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -30,7 +26,7 @@ import java.util.UUID; public class AuctionsMenu extends Holder { - private List items; + private List items; private List options; private int maxPages; @@ -71,8 +67,6 @@ public class AuctionsMenu extends Holder { @Override public final Holder build() { - Methods.updateAuction(); - if (this.target != null) { this.options.add("WhatIsThis.Viewing"); } else { @@ -144,10 +138,10 @@ public class AuctionsMenu extends Holder { } } - for (final ItemStack item : getPageItems(this.items, getPage(), getSize())) { + for (final Auction item : getPageItems(this.items, getPage(), getSize())) { int slot = this.inventory.firstEmpty(); - this.inventory.setItem(slot, item); + this.inventory.setItem(slot, item.getItemBuilder(this.shopType).build()); } this.player.openInventory(this.inventory); @@ -178,7 +172,6 @@ public class AuctionsMenu extends Holder { final Player player = (Player) event.getWhoClicked(); FileConfiguration config = Files.config.getConfiguration(); - FileConfiguration data = Files.data.getConfiguration(); if (container.has(Keys.auction_button.getNamespacedKey())) { String type = container.getOrDefault(Keys.auction_button.getNamespacedKey(), PersistentDataType.STRING, menu.target == null ? "Refresh" : ""); @@ -272,59 +265,13 @@ public class AuctionsMenu extends Holder { } } + final UUID uuid = player.getUniqueId(); - - /*if (!data.contains("Items")) return; - - final ConfigurationSection section = data.getConfigurationSection("Items"); - - if (section == null) return; - - final String auction_id = container.getOrDefault(Keys.auction_item.getNamespacedKey(), PersistentDataType.STRING, ""); - - final ConfigurationSection auction = section.getConfigurationSection(auction_id); + final Auction auction = this.userManager.getAuctionById(uuid, container.getOrDefault(Keys.auction_store_id.getNamespacedKey(), PersistentDataType.STRING, "")); if (auction == null) return; - final UUID uuid = player.getUniqueId(); - - if (player.hasPermission("crazyauctions.admin") || player.hasPermission("crazyauctions.force-end")) { - if (event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) { - int num = 1; - - for (;data.contains("OutOfTime/Cancelled." + num); num++); - - String seller = auction.getString("Seller"); - - Player sellerPlayer = Methods.getPlayer(seller); - - if (Methods.isOnline(seller) && sellerPlayer != null) { - sellerPlayer.sendMessage(Messages.ADMIN_FORCE_CANCELLED_TO_PLAYER.getMessage(player)); - } - - AuctionCancelledEvent auctionCancelledEvent = new AuctionCancelledEvent((sellerPlayer != null ? sellerPlayer : Methods.getOfflinePlayer(seller)), Methods.fromBase64(auction.getString("Item")), Reasons.ADMIN_FORCE_CANCEL); - this.server.getPluginManager().callEvent(auctionCancelledEvent); - - data.set("OutOfTime/Cancelled." + num + ".Seller", section.getString("Seller")); - data.set("OutOfTime/Cancelled." + num + ".Name", section.getString("Name")); - data.set("OutOfTime/Cancelled." + num + ".Full-Time", section.getLong("Full-Time")); - data.set("OutOfTime/Cancelled." + num + ".StoreID", section.getInt("StoreID")); - data.set("OutOfTime/Cancelled." + num + ".Item", auction.getString("Item")); - data.set("Items." + auction_id, null); - - Files.data.save(); - - player.sendMessage(Messages.ADMIN_FORCE_CANCELLED.getMessage(player)); - - menu.click(player); - - GuiManager.openShop(player, HolderManager.getShopType(player), HolderManager.getShopCategory(player), menu.getPage()); - - return; - } - } - - if (auction.getString("Seller", "").equalsIgnoreCase(uuid.toString())) { + if (uuid.toString().equalsIgnoreCase(auction.getUuid().toString())) { String itemName = config.getString("Settings.GUISettings.OtherSettings.Your-Item.Item"); String name = config.getString("Settings.GUISettings.OtherSettings.Your-Item.Name"); @@ -348,9 +295,13 @@ public class AuctionsMenu extends Holder { return; } - long cost = auction.getLong("Price"); + final long price = auction.getPrice(); - if (this.plugin.getSupport().getMoney(player) < cost) { + if (price == 0L) return; + + final VaultSupport support = this.plugin.getSupport(); + + if (support.getMoney(player) < price) { String itemName = config.getString("Settings.GUISettings.OtherSettings.Cant-Afford.Item"); String name = config.getString("Settings.GUISettings.OtherSettings.Cant-Afford.Name"); @@ -373,8 +324,10 @@ public class AuctionsMenu extends Holder { return; } - if (auction.getBoolean("Biddable")) { - if (uuid.toString().equalsIgnoreCase(auction.getString("TopBidder"))) { + final String auction_id = auction.getId(); + + if (auction.isBiddable()) { + if (uuid.toString().equalsIgnoreCase(auction.getUuid().toString())) { String itemName = config.getString("Settings.GUISettings.OtherSettings.Top-Bidder.Item"); String name = config.getString("Settings.GUISettings.OtherSettings.Top-Bidder.Name"); @@ -401,24 +354,26 @@ public class AuctionsMenu extends Holder { menu.click(player); GuiManager.openBidding(player, auction_id); - } else { - menu.click(player); - GuiManager.openBuying(player, auction_id); - }*/ + return; + } + + menu.click(player); + + GuiManager.openBuying(player, auction_id); } private void getItems() { - final List auctions = this.plugin.getUserManager().getAuctions(); + this.userManager.getAuctions().forEach(((uuid, auctions) -> { + auctions.forEach(auction -> { + final ItemBuilder itemBuilder = auction.getItemBuilder(this.shopType); - auctions.forEach(auction -> { - final ItemBuilder itemBuilder = auction.getItemBuilder(this.shopType); + if (this.category != null && this.category != Category.NONE && !this.category.getItems().contains(itemBuilder.getMaterial())) { + return; + } - if (this.category != null && this.category != Category.NONE && !this.category.getItems().contains(itemBuilder.getMaterial())) { - return; - } - - this.items.add(itemBuilder.build()); - }); + this.items.add(auction); + }); + })); } } \ No newline at end of file diff --git a/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/CurrentMenu.java b/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/CurrentMenu.java index 991a5e1..ab39763 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/CurrentMenu.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/api/guis/types/CurrentMenu.java @@ -10,6 +10,7 @@ import com.badbones69.crazyauctions.api.events.AuctionCancelledEvent; import com.badbones69.crazyauctions.api.guis.Holder; import com.badbones69.crazyauctions.api.guis.HolderManager; import com.badbones69.crazyauctions.api.GuiManager; +import com.badbones69.crazyauctions.tasks.objects.Auction; import io.papermc.paper.persistence.PersistentDataContainerView; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; @@ -20,40 +21,28 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; import java.util.ArrayList; import java.util.List; -import java.util.Locale; -import java.util.UUID; public class CurrentMenu extends Holder { - private List items; - private List options; - private FileConfiguration config; - private FileConfiguration data; + private List options; public CurrentMenu(final Player player, final String title, final int size, final int page) { super(player, title, size, page); - this.items = new ArrayList<>(); - this.options = new ArrayList<>(); - this.config = Files.config.getConfiguration(); - this.data = Files.data.getConfiguration(); + this.options = new ArrayList<>(); } public CurrentMenu() {} @Override public final Holder build() { - Methods.updateAuction(); - this.options.addAll(List.of( "Back", "WhatIsThis.CurrentItems" )); - getItems(); - for (final String key : this.options) { if (!this.config.contains("Settings.GUISettings.OtherSettings." + key)) { continue; @@ -76,10 +65,10 @@ public class CurrentMenu extends Holder { this.inventory.setItem(slot - 1, itemBuilder.build()); } - for (final ItemStack item : getPageItems(this.items, getPage(), getSize())) { + for (final Auction item : getPageItems(this.userManager.getAuctions().get(this.player.getUniqueId()), getPage(), getSize())) { int slot = this.inventory.firstEmpty(); - this.inventory.setItem(slot, item); + this.inventory.setItem(slot, item.getItemBuilder().build()); } this.player.openInventory(this.inventory); @@ -125,7 +114,7 @@ public class CurrentMenu extends Holder { return; } - String id = container.getOrDefault(Keys.auction_item.getNamespacedKey(), PersistentDataType.STRING, ""); + String id = container.getOrDefault(Keys.auction_number.getNamespacedKey(), PersistentDataType.STRING, ""); final FileConfiguration data = Files.data.getConfiguration(); @@ -176,57 +165,4 @@ public class CurrentMenu extends Holder { GuiManager.openPlayersCurrentList(player, 1); } - - private void getItems() { - final ConfigurationSection section = this.data.getConfigurationSection("Items"); - - if (section == null) return; - - final UUID uuid = this.player.getUniqueId(); - - for (String key : section.getKeys(false)) { - final ConfigurationSection auction = section.getConfigurationSection(key); - - if (auction == null) continue; - - final String seller = auction.getString("Seller", ""); - - if (seller.isEmpty()) continue; - - if (!seller.equalsIgnoreCase(uuid.toString())) continue; - - final String item = auction.getString("Item", ""); - - if (item.isEmpty()) continue; - - final ItemBuilder itemBuilder = ItemBuilder.convertItemStack(item); - - if (itemBuilder == null) { - this.plugin.getLogger().warning("The item with store id " + auction.getString("StoreID", "current_menu") + " obtained from your data.yml could not be converted!"); - - continue; - } - - final long price = auction.getLong("Price"); - - final String priceFormat = String.format(Locale.ENGLISH, "%,d", price); - - final String time = Methods.convertToTime(auction.getLong("Time-Till-Expire")); - - final List lore = new ArrayList<>(itemBuilder.getUpdatedLore()); - - lore.add(" "); - - for (final String line : this.config.getStringList("Settings.GUISettings.CurrentLore")) { - lore.add(line.replace("%Time%", time).replace("%time%", time).replace("%price%", priceFormat).replace("%Price%", priceFormat)); - } - - itemBuilder.setLore(lore); - - itemBuilder.addInteger(auction.getInt("StoreID"), Keys.auction_id.getNamespacedKey()); - itemBuilder.addString(auction.getName(), Keys.auction_item.getNamespacedKey()); - - this.items.add(itemBuilder.build()); - } - } } \ No newline at end of file diff --git a/paper/src/main/java/com/badbones69/crazyauctions/tasks/UserManager.java b/paper/src/main/java/com/badbones69/crazyauctions/tasks/UserManager.java index eccf66e..34b55d5 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/tasks/UserManager.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/tasks/UserManager.java @@ -9,13 +9,17 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; public class UserManager { private final CrazyAuctions plugin = CrazyAuctions.getPlugin(); + private final Map> auctions = new HashMap<>(); + public void addAuction(final Player player, final ItemStack itemStack, final long price, final boolean isBiddable) { final FileConfiguration data = Files.data.getConfiguration(); final FileConfiguration config = Files.config.getConfiguration(); @@ -31,7 +35,7 @@ public class UserManager { if (section == null) return; - addItem(itemStack, price, isBiddable, config, section); + addItem(itemStack, uuid, price, isBiddable, config, section); return; } @@ -44,17 +48,17 @@ public class UserManager { if (section == null) return; - addItem(itemStack, price, isBiddable, config, section); + addItem(itemStack, uuid, price, isBiddable, config, section); } - public final List getAuctions() { - final List auctions = new ArrayList<>(); + public final void updateAuctionsCache() { + this.auctions.clear(); final FileConfiguration data = Files.data.getConfiguration(); final ConfigurationSection section = data.getConfigurationSection("active_auctions"); - if (section == null) return auctions; + if (section == null) return; for (String key : section.getKeys(false)) { final ConfigurationSection player = section.getConfigurationSection(key); @@ -66,20 +70,27 @@ public class UserManager { if (auction == null) continue; - auctions.add(new Auction(key, auction.getString("name"), - number, - auction.getString("item"), - auction.getString("store_id"), - auction.getLong("price"), - auction.getLong("time.expire"), - auction.getLong("time.full"), - auction.getString("status.top_bidder.uuid", "None"), - auction.getString("status.top_bidder.name", "None"), - auction.getBoolean("status.biddable", false))); + addCache(key, auction); } } + } - return auctions; + public final Map> getAuctions() { + return this.auctions; + } + + public final Auction getAuctionById(final UUID uuid, final String store_id) { + Auction key = null; + + for (final Auction auction : this.auctions.get(uuid)) { + if (!auction.getStoreID().equals(store_id)) continue; + + key = auction; + + break; + } + + return key; } public void migrateAuctions() { @@ -148,7 +159,7 @@ public class UserManager { * @param config the config.yml * @param section the section in the data.yml */ - private void addItem(final ItemStack itemStack, final long price, final boolean isBiddable, final FileConfiguration config, final ConfigurationSection section) { + private void addItem(final ItemStack itemStack, final String uuid, final long price, final boolean isBiddable, final FileConfiguration config, final ConfigurationSection section) { section.set("item", Methods.toBase64(itemStack)); section.set("store_id", UUID.randomUUID().toString().replace("-", "").substring(0, 8)); section.set("price", price); @@ -165,6 +176,36 @@ public class UserManager { section.set("status.top_bidder.name", "None"); section.set("status.biddable", isBiddable); + addCache(uuid, section); + Files.data.save(); } + + private void addCache(final String uuid, final ConfigurationSection section) { + final Auction new_auction = new Auction(uuid, section.getString("name"), + section.getName(), + section.getString("item"), + section.getString("store_id"), + section.getLong("price"), + section.getLong("time.expire"), + section.getLong("time.full"), + section.getString("status.top_bidder.uuid", "None"), + section.getString("status.top_bidder.name", "None"), + section.getBoolean("status.biddable") + ); + + final UUID fromString = UUID.fromString(uuid); + + if (this.auctions.containsKey(fromString)) { + final List auctions = this.auctions.get(fromString); + + auctions.add(new_auction); + + this.auctions.put(fromString, auctions); + } else { + this.auctions.put(fromString, new ArrayList<>() {{ + add(new_auction); + }}); + } + } } \ No newline at end of file diff --git a/paper/src/main/java/com/badbones69/crazyauctions/tasks/objects/Auction.java b/paper/src/main/java/com/badbones69/crazyauctions/tasks/objects/Auction.java index 1f81fce..86a910d 100644 --- a/paper/src/main/java/com/badbones69/crazyauctions/tasks/objects/Auction.java +++ b/paper/src/main/java/com/badbones69/crazyauctions/tasks/objects/Auction.java @@ -91,7 +91,7 @@ public class Auction { public final ItemBuilder getItemBuilder(final ShopType shopType) { final FileConfiguration configuration = Files.config.getConfiguration(); - final ItemBuilder itemBuilder = ItemBuilder.convertItemStack(this.itemStack); + final ItemBuilder itemBuilder = ItemBuilder.convertItemStack(this.itemStack.clone()); final String priceFormat = String.format(Locale.ENGLISH, "%,d", this.price); @@ -103,29 +103,59 @@ public class Auction { if (shopType == ShopType.BID && isBiddable()) { for (final String line : configuration.getStringList("Settings.GUISettings.Bidding")) { - String newLine = line.replace("%TopBid%", priceFormat).replace("%topbid%", priceFormat); + String newLine = line.replace("%TopBid%", priceFormat) + .replace("%topbid%", priceFormat); - newLine = line.replace("%Seller%", getName()).replace("%seller%", getName()); + newLine = line.replace("%Seller%", getName()) + .replace("%seller%", getName()); - newLine = line.replace("%TopBidder%", getBidderName()).replace("%topbid%", getBidderName()); + newLine = line.replace("%TopBidder%", getBidderName()) + .replace("%topbid%", getBidderName()); - lore.add(newLine.replace("%Time%", time).replace("%time%", time)); + lore.add(newLine.replace("%Time%", time) + .replace("%time%", time)); } } else { for (final String line : configuration.getStringList("Settings.GUISettings.SellingItemLore")) { - String newLine = line.replace("%TopBid%", priceFormat).replace("%topbid%", priceFormat); + String newLine = line.replace("%TopBid%", priceFormat) + .replace("%topbid%", priceFormat); - newLine = line.replace("%Seller%", getName()).replace("%seller%", getName()); + newLine = line.replace("%Seller%", getName()) + .replace("%seller%", getName()); - lore.add(newLine.replace("%Time%", time).replace("%time%", time).replace("%price%", priceFormat).replace("%Price%", priceFormat)); + lore.add(newLine.replace("%Time%", time) + .replace("%time%", time) + .replace("%price%", priceFormat).replace("%Price%", priceFormat)); } } - itemBuilder.setLore(lore); + itemBuilder.setLore(lore) + .addString(getStoreID(), Keys.auction_store_id.getNamespacedKey()); - itemBuilder.addString(getStoreID(), Keys.auction_id.getNamespacedKey()); - itemBuilder.addString(String.valueOf(getUuid()), Keys.auction_uuid.getNamespacedKey()); - itemBuilder.addString(getId(), Keys.auction_item.getNamespacedKey()); + return itemBuilder; + } + + public final ItemBuilder getItemBuilder() { + final FileConfiguration configuration = Files.config.getConfiguration(); + + final ItemBuilder itemBuilder = ItemBuilder.convertItemStack(this.itemStack.clone()); + + final String priceFormat = String.format(Locale.ENGLISH, "%,d", this.price); + + final String time = Methods.convertToTime(getTimeTillExpire()); + + final List lore = new ArrayList<>(itemBuilder.getUpdatedLore()); + + lore.add(" "); + + for (final String line : configuration.getStringList("Settings.GUISettings.CurrentLore")) { + lore.add(line.replace("%Time%", time).replace("%time%", time) + .replace("%price%", priceFormat) + .replace("%Price%", priceFormat)); + } + + itemBuilder.setLore(lore) + .addString(getStoreID(), Keys.auction_store_id.getNamespacedKey());; return itemBuilder; }