Search in sources :

Example 1 with ShopPurchaseEvent

use of com.iridium.iridiumskyblock.api.ShopPurchaseEvent in project IridiumSkyblock by Iridium-Development.

the class ShopManager method buy.

/**
 * Buys an item for the Player in the shop.
 * He might not have enough money to do so.
 *
 * @param player   The player which wants to buy the item
 * @param shopItem The item which is requested
 * @param amount   The amount of the item which is requested
 */
public void buy(Player player, ShopItem shopItem, int amount) {
    BuyCost buyCost = shopItem.buyCost;
    double vaultCost = calculateCost(amount, shopItem.defaultAmount, buyCost.vault);
    int crystalCost = (int) calculateCost(amount, shopItem.defaultAmount, buyCost.crystals);
    final Optional<Island> island = IridiumSkyblockAPI.getInstance().getUser(player).getIsland();
    if (!island.isPresent()) {
        player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().noIsland.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
        return;
    }
    boolean canPurchase = PlayerUtils.canPurchase(player, island.get(), crystalCost, vaultCost);
    if (!canPurchase) {
        player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotAfford.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
        IridiumSkyblock.getInstance().getShop().failSound.play(player);
        return;
    }
    ShopPurchaseEvent shopPurchaseEvent = new ShopPurchaseEvent(player, shopItem, amount);
    Bukkit.getPluginManager().callEvent(shopPurchaseEvent);
    if (shopPurchaseEvent.isCancelled())
        return;
    if (shopItem.command == null) {
        // Add item to the player Inventory
        if (!IridiumSkyblock.getInstance().getShop().dropItemWhenFull && !InventoryUtils.hasEmptySlot(player.getInventory())) {
            player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().inventoryFull.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
            return;
        }
        ItemStack itemStack = shopItem.type.parseItem();
        itemStack.setAmount(amount);
        if (shopItem.displayName != null && !shopItem.displayName.isEmpty()) {
            ItemMeta itemMeta = itemStack.getItemMeta();
            itemMeta.setDisplayName(StringUtils.color(shopItem.displayName));
            itemStack.setItemMeta(itemMeta);
        }
        for (ItemStack dropItem : player.getInventory().addItem(itemStack).values()) {
            player.getWorld().dropItem(player.getEyeLocation(), dropItem);
        }
    } else {
        // Run the command
        String command = shopItem.command.replace("%player%", player.getName()).replace("%amount%", String.valueOf(amount));
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
    }
    // Only run the withdrawing function when the user can buy it.
    PlayerUtils.pay(player, island.get(), crystalCost, vaultCost);
    IridiumSkyblock.getInstance().getShop().successSound.play(player);
    player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().successfullyBought.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix).replace("%amount%", String.valueOf(amount)).replace("%item%", StringUtils.color(shopItem.name)).replace("%vault_cost%", String.valueOf(vaultCost)).replace("%crystal_cost%", String.valueOf(crystalCost))));
}
Also used : BuyCost(com.iridium.iridiumskyblock.shop.ShopItem.BuyCost) ShopPurchaseEvent(com.iridium.iridiumskyblock.api.ShopPurchaseEvent) ItemStack(org.bukkit.inventory.ItemStack) Island(com.iridium.iridiumskyblock.database.Island) ItemMeta(org.bukkit.inventory.meta.ItemMeta)

Aggregations

ShopPurchaseEvent (com.iridium.iridiumskyblock.api.ShopPurchaseEvent)1 Island (com.iridium.iridiumskyblock.database.Island)1 BuyCost (com.iridium.iridiumskyblock.shop.ShopItem.BuyCost)1 ItemStack (org.bukkit.inventory.ItemStack)1 ItemMeta (org.bukkit.inventory.meta.ItemMeta)1