From 6aa2e294b43c75862e97a5cd9178c1d540d5f59e Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:52:59 +0200 Subject: [PATCH] Implement gamble shops --- .../conversation/ConversationManager.java | 2 +- .../alttd/playershops/shop/PlayerShop.java | 90 ++++++++++++++----- .../alttd/playershops/shop/ShopAction.java | 1 + 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/alttd/playershops/conversation/ConversationManager.java b/src/main/java/com/alttd/playershops/conversation/ConversationManager.java index 3b85a82..beaead2 100644 --- a/src/main/java/com/alttd/playershops/conversation/ConversationManager.java +++ b/src/main/java/com/alttd/playershops/conversation/ConversationManager.java @@ -71,7 +71,7 @@ public class ConversationManager implements ConversationAbandonedListener { private class ChangeTypePrompt extends FixedSetPrompt { public ChangeTypePrompt() { - super("buy", "sell", "none"); + super("buy", "sell", "none", "gamble"); } public @NotNull Component getPromptMessage(ConversationContext context) { diff --git a/src/main/java/com/alttd/playershops/shop/PlayerShop.java b/src/main/java/com/alttd/playershops/shop/PlayerShop.java index cec445b..fd35c26 100644 --- a/src/main/java/com/alttd/playershops/shop/PlayerShop.java +++ b/src/main/java/com/alttd/playershops/shop/PlayerShop.java @@ -17,42 +17,30 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; +@Getter public class PlayerShop { - @Getter private UUID shopID; - @Getter @Setter // TODO a way to check if the player changed name and update if needed + @Setter // TODO a way to check if the player changed name and update if needed private String ownerName; - @Getter private UUID ownerUUID; - @Getter private ShopType type = ShopType.NONE; - @Getter private final Location signLocation; - @Getter private final Location shopLocation; - @Getter private String server; - @Getter private double price; - @Getter private int amount; - @Getter private double balance; - @Getter private ItemStack itemStack; - @Getter @Setter + @Setter private long lastTransaction; - @Getter @Setter + @Setter private boolean notifiedOwner = false; - @Getter @Setter + @Setter private boolean dirty; - @Getter - private List transactions = new ArrayList<>(); + private final List transactions = new ArrayList<>(); public PlayerShop(Location shopLocation, Location signLocation, Player player) { this(shopLocation, signLocation, player.getUniqueId(), player.getName()); @@ -101,8 +89,7 @@ public class PlayerShop { return (int) (balance / getPrice()); } case GAMBLE -> { - Logger.warn("Tried to call getRemainingStock on unimplemented GAMBLE type"); - return 0; //not implemented since gamble shops don't exist yet + return getInventory().getContents().length; } default -> { return 0; @@ -231,7 +218,7 @@ public class PlayerShop { return switch (getType()) { case SELL -> executeSellTransaction(orders, player); case BUY -> executeBuyTransaction(orders, player); - case GAMBLE -> executeGambleTransaction(orders, player); + case GAMBLE -> executeGambleTransaction(player); default -> TransactionError.NONE; // This should not happen }; } @@ -318,7 +305,44 @@ public class PlayerShop { return TransactionError.NONE; } - private TransactionError executeGambleTransaction(int orders, Player player) { + private TransactionError executeGambleTransaction(Player player) { + ItemStack itemStack = getRandomItem(); + if (itemStack == null) + return null; + + itemStack = itemStack.clone(); + double price = getPrice(); + + int shopItems = InventoryUtils.countItems(getInventory(), itemStack); + if (shopItems < itemStack.getAmount()) + return TransactionError.INSUFFICIENT_FUNDS_SHOP; + + boolean hasFunds = EconomyUtils.hasSufficientFunds(player, price); + if (!hasFunds) + return TransactionError.INSUFFICIENT_FUNDS_PLAYER; + + boolean hasRoom = EconomyUtils.canAcceptFunds(this, price); + if (!hasRoom) + return TransactionError.INVENTORY_FULL_SHOP; + + boolean playerHasRoom = InventoryUtils.hasRoom(player.getInventory(), itemStack); + if (!playerHasRoom) + return TransactionError.INVENTORY_FULL_PLAYER; + + PlayerExchangeShopEvent playerExchangeShopEvent = new PlayerExchangeShopEvent(player, this); + if (Util.callCancellableEvent(playerExchangeShopEvent)) { + return TransactionError.CANCELLED; + } + + if (!addBalance(price)) + return TransactionError.CANCELLED; + + InventoryUtils.removeItem(getInventory(), itemStack); + EconomyUtils.removeFunds(player, price); + InventoryUtils.addItem(player.getInventory(), itemStack); + player.updateInventory(); + + addTransaction(new ShopTransaction(ShopAction.GAMBLE, player.getName(), 1, price)); return TransactionError.NONE; } @@ -388,6 +412,26 @@ public class PlayerShop { transactions.add(transaction); } + private ItemStack getRandomItem() { + if (!isInitialized()) + return null; + if (this.getInventory().isEmpty()) + return null; + ArrayList contents = new ArrayList<>(); + for (ItemStack it : this.getInventory().getContents()) { + if (it != null) { + contents.add(it); + } + + } + if (contents.isEmpty()) + return null; + Collections.shuffle(contents); + + int index = new Random().nextInt(contents.size()); + return contents.get(index); + } + @Override public String toString() { return "Shop: " + this.getShopID() diff --git a/src/main/java/com/alttd/playershops/shop/ShopAction.java b/src/main/java/com/alttd/playershops/shop/ShopAction.java index 9b4fa4e..30890a0 100644 --- a/src/main/java/com/alttd/playershops/shop/ShopAction.java +++ b/src/main/java/com/alttd/playershops/shop/ShopAction.java @@ -3,6 +3,7 @@ package com.alttd.playershops.shop; public enum ShopAction { BUY, SELL, + GAMBLE, CREATE, CANCELLED; }