// 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;
}
}
}
Top comments (0)