GroupeZ Docs
Development

Custom Economy

Create custom economy implementations for zAuctionHouse

zAuctionHouse supports custom economy implementations. This allows you to integrate any currency system with the auction house.

Requirements

Your plugin must load before zAuctionHouse. Add the following to your plugin.yml:

loadbefore:
  - zAuctionHouse

AuctionEconomy Interface

To create a custom economy, implement the AuctionEconomy interface:

public interface AuctionEconomy {

    String getName();

    String getDisplayName();

    String getSymbol();

    String getFormat();

    default String format(String priceAsString, long amount) {
        return getFormat().replace("%price%", priceAsString).replace("%s%", amount > 1 ? "s" : "");
    }

    CompletableFuture<BigDecimal> get(OfflinePlayer offlinePlayer);

    CompletableFuture<Boolean> has(OfflinePlayer offlinePlayer, BigDecimal price);

    default boolean hasSync(Player player, BigDecimal price) {
        return has(player, price).join();
    }

    void deposit(OfflinePlayer offlinePlayer, BigDecimal value, String reason);

    void withdraw(OfflinePlayer offlinePlayer, BigDecimal value, String reason);

    String getDepositReason();

    String getWithdrawReason();

    @Nullable
    String getPermission();

    PriceFormat getPriceFormat();

    boolean isAutoClaim();

    boolean mustBeOnline();

    BigDecimal getMaxPrice(ItemType itemType);

    BigDecimal getMinPrice(ItemType itemType);

    TaxConfiguration getTaxConfiguration();
}

Registering Your Economy

Register your economy using the AuctionLoadEconomyEvent. This event provides access to the EconomyManager which allows you to register your custom economy.

import fr.maxlego08.zauctionhouse.api.event.AuctionLoadEconomyEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public class EconomyListener implements Listener {

    private final MyEconomy myEconomy;

    public EconomyListener(MyEconomy myEconomy) {
        this.myEconomy = myEconomy;
    }

    @EventHandler
    public void onLoadEconomy(AuctionLoadEconomyEvent event) {
        boolean success = event.getEconomyManager().registerEconomy(this.myEconomy);
        if (success) {
            // Economy registered successfully
        }
    }
}

Example: Vault Economy

Here's a complete example integrating Vault as a custom economy:

import fr.maxlego08.zauctionhouse.api.economy.AuctionEconomy;
import fr.maxlego08.zauctionhouse.api.economy.PriceFormat;
import fr.maxlego08.zauctionhouse.api.economy.TaxConfiguration;
import fr.maxlego08.zauctionhouse.api.item.ItemType;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.OfflinePlayer;
import org.bukkit.plugin.RegisteredServiceProvider;

import java.math.BigDecimal;
import java.util.concurrent.CompletableFuture;

public class VaultEconomy implements AuctionEconomy {

    private final Economy economy;

    public VaultEconomy() {
        RegisteredServiceProvider<Economy> provider =
            Bukkit.getServicesManager().getRegistration(Economy.class);
        this.economy = provider != null ? provider.getProvider() : null;
    }

    @Override
    public String getName() {
        return "vault";
    }

    @Override
    public String getDisplayName() {
        return "Money";
    }

    @Override
    public String getSymbol() {
        return "$";
    }

    @Override
    public String getFormat() {
        return "%price%$";
    }

    @Override
    public CompletableFuture<BigDecimal> get(OfflinePlayer offlinePlayer) {
        return CompletableFuture.completedFuture(
            BigDecimal.valueOf(this.economy.getBalance(offlinePlayer))
        );
    }

    @Override
    public CompletableFuture<Boolean> has(OfflinePlayer offlinePlayer, BigDecimal price) {
        return CompletableFuture.completedFuture(
            this.economy.has(offlinePlayer, price.doubleValue())
        );
    }

    @Override
    public void deposit(OfflinePlayer offlinePlayer, BigDecimal value, String reason) {
        this.economy.depositPlayer(offlinePlayer, value.doubleValue());
    }

    @Override
    public void withdraw(OfflinePlayer offlinePlayer, BigDecimal value, String reason) {
        this.economy.withdrawPlayer(offlinePlayer, value.doubleValue());
    }

    @Override
    public String getDepositReason() {
        return "zAuctionHouse sale";
    }

    @Override
    public String getWithdrawReason() {
        return "zAuctionHouse purchase";
    }

    @Override
    public String getPermission() {
        return null;
    }

    @Override
    public PriceFormat getPriceFormat() {
        return PriceFormat.FORMATTED;
    }

    @Override
    public boolean isAutoClaim() {
        return true;
    }

    @Override
    public boolean mustBeOnline() {
        return false;
    }

    @Override
    public BigDecimal getMaxPrice(ItemType itemType) {
        return BigDecimal.valueOf(1000000000);
    }

    @Override
    public BigDecimal getMinPrice(ItemType itemType) {
        return BigDecimal.ONE;
    }

    @Override
    public TaxConfiguration getTaxConfiguration() {
        return TaxConfiguration.empty();
    }
}

Main Plugin Class

import org.bukkit.plugin.java.JavaPlugin;

public class MyPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        VaultEconomy vaultEconomy = new VaultEconomy();
        getServer().getPluginManager().registerEvents(
            new EconomyListener(vaultEconomy),
            this
        );
    }
}

On this page

GroupeZ MCP

Documentation in your AI

MCP lets your AI search GroupeZ documentation and read current examples to help you configure your plugins.

Read-only · No documentation API key needed

1. Copy the server URL

Transport: HTTP (Streamable HTTP). Authentication: none. Your tool uses its own model and subscription limits.

  1. Open Plugins in ChatGPT on the web, then + → Add custom MCP server.
  2. Name it ‘GroupeZ Documentation’, paste the URL above and choose ‘No authentication’. Create and install the plugin.
  3. In a conversation, type @ and select the plugin before asking. If needed, enable search, get_page and list_pages in its settings.
Official setup guide

3. Ask a question

Use GroupeZ MCP to help me create a zMenu inventory. Search relevant pages, read the examples and cite your sources.
Other clients and troubleshooting

For clients using mcpServers, adapt this example to their format:

{
  "mcpServers": {
    "groupez-docs": {
      "url": ""
    }
  }
}

Available tools are search, get_page and list_pages. Refresh the connector’s tools after updates. If your AI cannot access them, check that the connector is enabled in the conversation and your account allows custom MCP servers. Opening the URL in a browser is not an MCP test.