DEV Community

MandoExee
MandoExee

Posted on

Auctionhouse [i hope]

#ai

// Advanced Auction House Plugin (Spigot/Paper)
// Features:
// - /ah sell
// - /ah browse (GUI)
// - Click item to preview
// - Confirm GUI before buying
// NOTE: Still simplified (no economy or saving yet)

package com.example.auctionhouse;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.*;

public class AuctionHousePlugin extends JavaPlugin implements Listener {

private Map<Integer, AuctionItem> auctions = new HashMap<>();
private int currentId = 0;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    getLogger().info("AuctionHouse enabled!");
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (!(sender instanceof Player)) return true;
    Player player = (Player) sender;

    if (command.getName().equalsIgnoreCase("ah")) {
        if (args.length == 0) {
            openBrowseGUI(player);
            return true;
        }

        if (args[0].equalsIgnoreCase("sell")) {
            if (args.length < 2) {
                player.sendMessage("Usage: /ah sell <price>");
                return true;
            }

            double price;
            try {
                price = Double.parseDouble(args[1]);
            } catch (Exception e) {
                player.sendMessage("Invalid price.");
                return true;
            }

            ItemStack item = player.getInventory().getItemInMainHand();
            if (item == null || item.getType() == Material.AIR) {
                player.sendMessage("Hold an item.");
                return true;
            }

            currentId++;
            auctions.put(currentId, new AuctionItem(currentId, player.getUniqueId(), item.clone(), price));
            player.getInventory().setItemInMainHand(null);
            player.sendMessage("Listed with ID: " + currentId);
        }

        if (args[0].equalsIgnoreCase("browse")) {
            openBrowseGUI(player);
        }
    }
    return true;
}

private void openBrowseGUI(Player player) {
    Inventory inv = Bukkit.createInventory(null, 54, "Auction House");

    for (AuctionItem a : auctions.values()) {
        ItemStack item = a.item.clone();
        ItemMeta meta = item.getItemMeta();
        List<String> lore = new ArrayList<>();
        lore.add("Price: $" + a.price);
        lore.add("ID: " + a.id);
        lore.add("Click to preview");
        meta.setLore(lore);
        item.setItemMeta(meta);

        inv.addItem(item);
    }

    player.openInventory(inv);
}

private void openPreviewGUI(Player player, AuctionItem a) {
    Inventory inv = Bukkit.createInventory(null, 27, "Preview Item " + a.id);

    inv.setItem(13, a.item);

    ItemStack buy = new ItemStack(Material.LIME_WOOL);
    ItemMeta buyMeta = buy.getItemMeta();
    buyMeta.setDisplayName("Confirm Buy");
    buy.setItemMeta(buyMeta);
    inv.setItem(15, buy);

    player.openInventory(inv);
}

private void openConfirmGUI(Player player, AuctionItem a) {
    Inventory inv = Bukkit.createInventory(null, 27, "Confirm Purchase " + a.id);

    ItemStack confirm = new ItemStack(Material.GREEN_WOOL);
    ItemMeta cMeta = confirm.getItemMeta();
    cMeta.setDisplayName("YES BUY");
    confirm.setItemMeta(cMeta);

    ItemStack cancel = new ItemStack(Material.RED_WOOL);
    ItemMeta xMeta = cancel.getItemMeta();
    xMeta.setDisplayName("CANCEL");
    cancel.setItemMeta(xMeta);

    inv.setItem(11, confirm);
    inv.setItem(15, cancel);

    player.openInventory(inv);
}

@EventHandler
public void onClick(InventoryClickEvent e) {
    if (!(e.getWhoClicked() instanceof Player)) return;
    Player player = (Player) e.getWhoClicked();

    String title = e.getView().getTitle();
    ItemStack clicked = e.getCurrentItem();
    if (clicked == null) return;

    if (title.equals("Auction House")) {
        e.setCancelled(true);

        if (clicked.hasItemMeta() && clicked.getItemMeta().hasLore()) {
            List<String> lore = clicked.getItemMeta().getLore();
            for (String line : lore) {
                if (line.startsWith("ID: ")) {
                    int id = Integer.parseInt(line.replace("ID: ", ""));
                    if (auctions.containsKey(id)) {
                        openPreviewGUI(player, auctions.get(id));
                    }
                }
            }
        }
    }

    if (title.startsWith("Preview Item")) {
        e.setCancelled(true);

        if (clicked.getType() == Material.LIME_WOOL) {
            int id = Integer.parseInt(title.split(" ")[2]);
            openConfirmGUI(player, auctions.get(id));
        }
    }

    if (title.startsWith("Confirm Purchase")) {
        e.setCancelled(true);
        int id = Integer.parseInt(title.split(" ")[2]);

        if (clicked.getType() == Material.GREEN_WOOL) {
            AuctionItem a = auctions.get(id);
            player.getInventory().addItem(a.item);
            auctions.remove(id);
            player.sendMessage("Purchased!");
            player.closeInventory();
        }

        if (clicked.getType() == Material.RED_WOOL) {
            player.closeInventory();
        }
    }
}

static class AuctionItem {
    int id;
    UUID owner;
    ItemStack item;
    double price;

    public AuctionItem(int id, UUID owner, ItemStack item, double price) {
        this.id = id;
        this.owner = owner;
        this.item = item;
        this.price = price;
    }
}
Enter fullscreen mode Exit fullscreen mode

}

Top comments (0)