diff --git a/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionedItem.java b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionedItem.java index 9160801..475806c 100644 --- a/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionedItem.java +++ b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionedItem.java @@ -27,10 +27,12 @@ import ca.tweetzy.auctionhouse.helpers.MaterialCategorizer; import ca.tweetzy.auctionhouse.settings.Settings; import ca.tweetzy.core.utils.TextUtils; import ca.tweetzy.flight.comp.enums.ServerVersion; +import ca.tweetzy.flight.nbtapi.NBT; import lombok.Getter; import lombok.NonNull; import lombok.Setter; import org.bukkit.Bukkit; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -309,6 +311,15 @@ public class AuctionedItem { return itemStack; } + public ItemStack getCleanItem() { + ItemStack cleaned = this.item.clone(); + NBT.modify(cleaned, nbt -> { + nbt.removeKey("AuctionDupeTracking"); + }); + + return cleaned; + } + public boolean containsValidBid() { return isBidItem() && !this.highestBidder.equals(this.owner); } diff --git a/src/main/java/ca/tweetzy/auctionhouse/commands/CommandSell.java b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandSell.java index bc474ca..35a1c4b 100644 --- a/src/main/java/ca/tweetzy/auctionhouse/commands/CommandSell.java +++ b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandSell.java @@ -30,10 +30,7 @@ import ca.tweetzy.auctionhouse.guis.GUIBundleCreation; import ca.tweetzy.auctionhouse.guis.confirmation.GUIListingConfirm; import ca.tweetzy.auctionhouse.guis.sell.GUISellListingType; import ca.tweetzy.auctionhouse.guis.sell.GUISellPlaceItem; -import ca.tweetzy.auctionhouse.helpers.AuctionCreator; -import ca.tweetzy.auctionhouse.helpers.BundleUtil; -import ca.tweetzy.auctionhouse.helpers.MaterialCategorizer; -import ca.tweetzy.auctionhouse.helpers.PlayerHelper; +import ca.tweetzy.auctionhouse.helpers.*; import ca.tweetzy.auctionhouse.settings.Settings; import ca.tweetzy.core.commands.AbstractCommand; import ca.tweetzy.core.compatibility.XMaterial; @@ -128,6 +125,12 @@ public final class CommandSell extends AbstractCommand { return ReturnType.FAILURE; } + // check if item has dt key + if(Validate.hasDTKey(originalItem)) { + Bukkit.broadcastMessage("has dupe item"); + return ReturnType.FAILURE; + } + // Check for block items if (!AuctionAPI.getInstance().meetsListingRequirements(player, itemToSell)) return ReturnType.FAILURE; @@ -324,7 +327,7 @@ public final class CommandSell extends AbstractCommand { // SCUFFED SHIT if (!auctionedItem.isRequest()) NBT.modify(itemToSell, nbt -> { - nbt.setBoolean("AuctionDupeTracking", true); + nbt.setUUID("AuctionDupeTracking", auctionedItem.getId()); }); auctionedItem.setItem(itemToSell); @@ -364,7 +367,7 @@ public final class CommandSell extends AbstractCommand { AuctionHouse.getInstance().getAuctionPlayerManager().processSell(player); player.closeInventory(); - PlayerUtils.giveItem(player, auctionedItem.getItem()); + PlayerUtils.giveItem(player, auctionedItem.getCleanItem()); auctionPlayer.setItemBeingListed(null); return; } @@ -382,7 +385,7 @@ public final class CommandSell extends AbstractCommand { AuctionHouse.getInstance().getAuctionPlayerManager().processSell(player); if (listingResult != ListingResult.SUCCESS) { - PlayerUtils.giveItem(player, auction.getItem()); + PlayerUtils.giveItem(player, auction.getCleanItem()); auctionPlayer.setItemBeingListed(null); return; } @@ -402,7 +405,6 @@ public final class CommandSell extends AbstractCommand { */ })); } else { -// Bukkit.getScheduler().runTaskLaterAsynchronously(AuctionHouse.getInstance(), () -> { if (auctionPlayer.getPlayer() == null || !auctionPlayer.getPlayer().isOnline()) { return ReturnType.FAILURE; } @@ -425,8 +427,6 @@ public final class CommandSell extends AbstractCommand { AuctionHouse.newChain().sync(player::closeInventory).execute(); }); -// }, Settings.INTERNAL_CREATE_DELAY.getInt()); - } return ReturnType.SUCCESS; diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/confirmation/GUIListingConfirm.java b/src/main/java/ca/tweetzy/auctionhouse/guis/confirmation/GUIListingConfirm.java index c18ec3f..afef474 100644 --- a/src/main/java/ca/tweetzy/auctionhouse/guis/confirmation/GUIListingConfirm.java +++ b/src/main/java/ca/tweetzy/auctionhouse/guis/confirmation/GUIListingConfirm.java @@ -32,6 +32,7 @@ import ca.tweetzy.core.compatibility.XMaterial; import ca.tweetzy.core.utils.PlayerUtils; import ca.tweetzy.core.utils.TextUtils; import ca.tweetzy.flight.utils.QuickItem; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; @@ -67,15 +68,16 @@ public final class GUIListingConfirm extends AuctionBaseGUI { setOnClose(close -> { final AuctionPlayer auctionPlayer = AuctionHouse.getInstance().getAuctionPlayerManager().getPlayer(close.player.getUniqueId()); - if (!this.resulted.contains(close.player.getUniqueId())) + if (!this.resulted.contains(close.player.getUniqueId())) { if (auctionPlayer.getItemBeingListed() != null) { - if (BundleUtil.isBundledItem(auctionedItem.getItem())) PlayerUtils.giveItem(close.player, BundleUtil.extractBundleItems(auctionedItem.getItem())); + if (BundleUtil.isBundledItem(auctionedItem.getItem())) PlayerUtils.giveItem(close.player, BundleUtil.extractBundleItems(auctionedItem.getCleanItem())); else { - PlayerUtils.giveItem(close.player, auctionedItem.getItem()); + PlayerUtils.giveItem(close.player, auctionedItem.getCleanItem()); } auctionPlayer.setItemBeingListed(null); } + } close.player.removeMetadata("AuctionHouseConfirmListing", AuctionHouse.getInstance()); AuctionHouse.getInstance().getAuctionPlayerManager().processSell(close.player); diff --git a/src/main/java/ca/tweetzy/auctionhouse/helpers/Validate.java b/src/main/java/ca/tweetzy/auctionhouse/helpers/Validate.java index de416c7..10be5e9 100644 --- a/src/main/java/ca/tweetzy/auctionhouse/helpers/Validate.java +++ b/src/main/java/ca/tweetzy/auctionhouse/helpers/Validate.java @@ -18,9 +18,24 @@ package ca.tweetzy.auctionhouse.helpers; +import ca.tweetzy.auctionhouse.AuctionHouse; +import ca.tweetzy.core.compatibility.XMaterial; +import ca.tweetzy.flight.nbtapi.NBT; +import lombok.NonNull; import lombok.experimental.UtilityClass; +import org.bukkit.inventory.ItemStack; + +import java.util.UUID; @UtilityClass public final class Validate { + + public boolean hasDTKey(ItemStack stack) { + if (stack == null || stack.getType() == XMaterial.AIR.parseMaterial() || stack.getAmount() == 0) return false; + + final UUID uuid = NBT.get(stack, nbt -> (UUID) nbt.getUUID("AuctionDupeTracking")); + return AuctionHouse.getInstance().getAuctionItemManager().getItem(uuid) != null; + } + } diff --git a/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java b/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java index 1292d50..46c46ff 100644 --- a/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java +++ b/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java @@ -24,6 +24,7 @@ import ca.tweetzy.auctionhouse.guis.GUIAuctionHouse; import ca.tweetzy.auctionhouse.helpers.BundleUtil; import ca.tweetzy.auctionhouse.helpers.PlayerHelper; import ca.tweetzy.auctionhouse.helpers.UpdateChecker; +import ca.tweetzy.auctionhouse.helpers.Validate; import ca.tweetzy.auctionhouse.settings.Settings; import ca.tweetzy.core.compatibility.XMaterial; import ca.tweetzy.core.utils.PlayerUtils; @@ -32,27 +33,30 @@ import ca.tweetzy.flight.comp.Titles; import ca.tweetzy.flight.comp.enums.ServerVersion; import ca.tweetzy.flight.nbtapi.NBT; import ca.tweetzy.flight.utils.Common; +import ca.tweetzy.flight.utils.PlayerUtil; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.Chest; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.*; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; import java.util.List; +import java.util.UUID; /** * The current file has been created by Kiran Hart @@ -97,9 +101,9 @@ public class PlayerListeners implements Listener { for (ItemStack item : player.getInventory().getStorageContents()) { if (item == null || item.getType() == XMaterial.AIR.parseMaterial() || item.getAmount() == 0) continue; - final boolean inventoryContainsListedItem = NBT.get(item, nbt -> (boolean) nbt.getBoolean("AuctionDupeTracking")); + final UUID auctionItemId = NBT.get(item, nbt -> (UUID) nbt.getUUID("AuctionDupeTracking")); - if (inventoryContainsListedItem) { + if (AuctionHouse.getInstance().getAuctionItemManager().getItem(auctionItemId) != null) { player.getInventory().remove(item); Bukkit.getServer().getConsoleSender().sendMessage(Common.colorize("&8[&eAuctionHouse&8] &CRemoving duped item from " + player.getName() + "'s inventory!")); } @@ -214,4 +218,56 @@ public class PlayerListeners implements Listener { event.setResult(stack); } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + final ItemStack item = PlayerUtil.getHand(player); + + if (Validate.hasDTKey(item)) { + event.setCancelled(true); + clearHand(player); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onAuctionItemDrop(PlayerDropItemEvent event) { + final Item item = event.getItemDrop(); + final ItemStack itemStack = item.getItemStack(); + + if (Validate.hasDTKey(itemStack)) + item.remove(); + + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onAuctionItemPlace(BlockPlaceEvent event) { + final Player player = event.getPlayer(); + final ItemStack item = event.getItemInHand(); + + if (Validate.hasDTKey(item)) { + event.setCancelled(true); + clearHand(player); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onAuctionItemPickup(PlayerPickupItemEvent event) { + final Player player = event.getPlayer(); + final Item item = event.getItem(); + final ItemStack itemStack = item.getItemStack(); + + if (Validate.hasDTKey(itemStack)) { + event.setCancelled(true); + clearHand(player); + } + } + + private void clearHand(Player player) { + if (ServerVersion.isServerVersionAbove(ServerVersion.V1_8)) { + player.getInventory().setItemInMainHand(XMaterial.AIR.parseItem()); + } else { + player.getInventory().setItemInHand(XMaterial.AIR.parseItem()); + } + } }