All source projects

MrUltimateLibrary Source

Standalone source project / 68 files

MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.

java

MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/economy/MrLibVaultManager.java

JAVA · Read-only source

package eu.mrneznamy.mrultimatelibrary.economy;

import eu.mrneznamy.mrultimatelibrary.utils.MrLibConsoleSayer;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.ServiceRegisterEvent;

/**
 * Centralized Vault economy manager for all MrLib plugins
 * This allows all plugins to share one Vault integration instead of each having their own
 */
public class MrLibVaultManager implements Listener {
    
    private static MrLibVaultManager instance;
    private MrLibEconomyProvider economy;
    private boolean enabled = false;
    
    private MrLibVaultManager() {
        setupEconomy();
        
        org.bukkit.plugin.Plugin plugin = eu.mrneznamy.mrultimatelibrary.MrUltimateLibrary.getInstance();
        if (plugin != null) {
            Bukkit.getPluginManager().registerEvents(this, plugin);
        }
    }
    
    /**
     * Get the singleton instance of MrLibVaultManager
     */
    public static MrLibVaultManager getInstance() {
        if (instance == null) {
            instance = new MrLibVaultManager();
        }
        return instance;
    }

    @EventHandler
    public void onServiceRegister(ServiceRegisterEvent event) {
        if (enabled) return;

        
        String className = event.getProvider().getService().getName();
        if (className.equals("net.milkbowl.vault.economy.Economy") || 
            className.equals("net.milkbowl.vault2.economy.Economy")) {
            
            MrLibConsoleSayer.MrSay_Info("Economy service registered late: " + className + ". Retrying setup...");
            setupEconomy();
        }
    }
    
    /**
     * Setup Vault economy integration
     */
    private void setupEconomy() {
        if (Bukkit.getPluginManager().getPlugin("Vault") == null && Bukkit.getPluginManager().getPlugin("VaultUnlocked") == null) {
            MrLibConsoleSayer.MrSay_Warning("Vault or VaultUnlocked not found! Economy features will be disabled.");
            return;
        }

        
        try {
            Class<?> clazz = Class.forName("net.milkbowl.vault2.economy.Economy");
            RegisteredServiceProvider<?> rsp = Bukkit.getServicesManager().getRegistration(clazz);
            if (rsp != null) {
                economy = new VaultUnlockedEconomy(rsp.getProvider());
                enabled = true;
                MrLibConsoleSayer.MrSay_Success("VaultUnlocked (v2) economy integration enabled!");
                return;
            }
        } catch (ClassNotFoundException | NoClassDefFoundError ignored) {
            
        }
        
        
        
        try {
            RegisteredServiceProvider<net.milkbowl.vault.economy.Economy> rsp = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
            if (rsp != null) {
                economy = new VaultEconomy(rsp.getProvider());
                enabled = true;
                MrLibConsoleSayer.MrSay_Success("Vault (v1) economy integration enabled!");
                return;
            }
        } catch (NoClassDefFoundError ignored) {}

        MrLibConsoleSayer.MrSay_Warning("No economy provider found! Economy features will be disabled.");
    }

    private interface MrLibEconomyProvider {
        double getBalance(org.bukkit.OfflinePlayer player);
        boolean has(org.bukkit.OfflinePlayer player, double amount);
        boolean withdraw(org.bukkit.OfflinePlayer player, double amount);
        boolean deposit(org.bukkit.OfflinePlayer player, double amount);
        String format(double amount);
        Object getProvider();
    }

    private static class VaultEconomy implements MrLibEconomyProvider {
        private final net.milkbowl.vault.economy.Economy econ;
        public VaultEconomy(net.milkbowl.vault.economy.Economy econ) { this.econ = econ; }
        @Override public double getBalance(org.bukkit.OfflinePlayer player) { return econ.getBalance(player); }
        @Override public boolean has(org.bukkit.OfflinePlayer player, double amount) { return econ.has(player, amount); }
        @Override public boolean withdraw(org.bukkit.OfflinePlayer player, double amount) { return econ.withdrawPlayer(player, amount).transactionSuccess(); }
        @Override public boolean deposit(org.bukkit.OfflinePlayer player, double amount) { return econ.depositPlayer(player, amount).transactionSuccess(); }
        @Override public String format(double amount) { return econ.format(amount); }
        @Override public Object getProvider() { return econ; }
    }

    private static class VaultUnlockedEconomy implements MrLibEconomyProvider {
        private final Object econ;
        private java.lang.reflect.Method getBalanceMethod;
        private java.lang.reflect.Method hasMethod;
        private java.lang.reflect.Method withdrawMethod;
        private java.lang.reflect.Method depositMethod;
        private java.lang.reflect.Method formatMethod;
        private java.lang.reflect.Method responseSuccessMethod;
        private boolean useUUID = false;

        public VaultUnlockedEconomy(Object econ) {
            this.econ = econ;
            try {
                Class<?> clazz = econ.getClass();
                
                
                try {
                    getBalanceMethod = clazz.getMethod("getBalance", java.util.UUID.class);
                    useUUID = true;
                } catch (NoSuchMethodException e) {
                    try {
                        getBalanceMethod = clazz.getMethod("getBalance", org.bukkit.OfflinePlayer.class);
                    } catch (NoSuchMethodException ex) {
                        getBalanceMethod = clazz.getMethod("getBalance", String.class);
                    }
                }

                if (useUUID) {
                    hasMethod = clazz.getMethod("has", java.util.UUID.class, java.math.BigDecimal.class);
                    withdrawMethod = clazz.getMethod("withdraw", java.util.UUID.class, java.math.BigDecimal.class);
                    depositMethod = clazz.getMethod("deposit", java.util.UUID.class, java.math.BigDecimal.class);
                } else {
                    Class<?> paramType = getBalanceMethod.getParameterTypes()[0];
                    hasMethod = clazz.getMethod("has", paramType, java.math.BigDecimal.class);
                    withdrawMethod = clazz.getMethod("withdraw", paramType, java.math.BigDecimal.class);
                    depositMethod = clazz.getMethod("deposit", paramType, java.math.BigDecimal.class);
                }
                
                formatMethod = clazz.getMethod("format", java.math.BigDecimal.class);
                
                
                Class<?> responseClass = withdrawMethod.getReturnType();
                try {
                    responseSuccessMethod = responseClass.getMethod("isSuccess");
                } catch (NoSuchMethodException e) {
                    responseSuccessMethod = responseClass.getMethod("transactionSuccess");
                }
            } catch (Exception e) {
                MrLibConsoleSayer.MrSay_Error("Failed to initialize VaultUnlocked reflection: " + e.getMessage());
                e.printStackTrace();
            }
        }

        @Override
        public double getBalance(org.bukkit.OfflinePlayer player) {
            try {
                Object param = useUUID ? player.getUniqueId() : (getBalanceMethod.getParameterTypes()[0] == String.class ? player.getName() : player);
                Object result = getBalanceMethod.invoke(econ, param);
                if (result instanceof java.math.BigDecimal) {
                    return ((java.math.BigDecimal) result).doubleValue();
                }
                return (double) result;
            } catch (Exception e) {
                return 0.0;
            }
        }

        @Override
        public boolean has(org.bukkit.OfflinePlayer player, double amount) {
            try {
                Object param = useUUID ? player.getUniqueId() : (hasMethod.getParameterTypes()[0] == String.class ? player.getName() : player);
                return (boolean) hasMethod.invoke(econ, param, java.math.BigDecimal.valueOf(amount));
            } catch (Exception e) {
                return false;
            }
        }

        @Override
        public boolean withdraw(org.bukkit.OfflinePlayer player, double amount) {
            try {
                Object param = useUUID ? player.getUniqueId() : (withdrawMethod.getParameterTypes()[0] == String.class ? player.getName() : player);
                Object response = withdrawMethod.invoke(econ, param, java.math.BigDecimal.valueOf(amount));
                return (boolean) responseSuccessMethod.invoke(response);
            } catch (Exception e) {
                return false;
            }
        }

        @Override
        public boolean deposit(org.bukkit.OfflinePlayer player, double amount) {
            try {
                Object param = useUUID ? player.getUniqueId() : (depositMethod.getParameterTypes()[0] == String.class ? player.getName() : player);
                Object response = depositMethod.invoke(econ, param, java.math.BigDecimal.valueOf(amount));
                return (boolean) responseSuccessMethod.invoke(response);
            } catch (Exception e) {
                return false;
            }
        }

        @Override
        public String format(double amount) {
            try {
                return (String) formatMethod.invoke(econ, java.math.BigDecimal.valueOf(amount));
            } catch (Exception e) {
                return String.format("%.2f", amount);
            }
        }

        @Override
        public Object getProvider() {
            return econ;
        }
    }
    
    /**
     * Check if Vault economy is enabled and available
     */
    public boolean isEnabled() {
        return enabled && economy != null;
    }
    
    /**
     * Get player's balance
     */
    public double getBalance(Player player) {
        if (!isEnabled()) {
            return 0.0;
        }
        
        try {
            return economy.getBalance(player);
        } catch (Exception e) {
            MrLibConsoleSayer.MrSay_Error("Error getting balance for player " + player.getName() + ": " + e.getMessage());
            return 0.0;
        }
    }
    
    /**
     * Check if player has enough money
     */
    public boolean hasEnough(Player player, double amount) {
        if (!isEnabled()) {
            return false;
        }
        
        try {
            return economy.has(player, amount);
        } catch (Exception e) {
            MrLibConsoleSayer.MrSay_Error("Error checking balance for player " + player.getName() + ": " + e.getMessage());
            return false;
        }
    }
    
    /**
     * Deposit money to player's account
     */
    public boolean deposit(org.bukkit.OfflinePlayer player, double amount) {
        if (!isEnabled()) {
            return false;
        }
        
        try {
            return economy.deposit(player, amount);
        } catch (Exception e) {
            MrLibConsoleSayer.MrSay_Error("Error depositing money to player " + player.getName() + ": " + e.getMessage());
            if (e.getMessage() != null && e.getMessage().contains("zip file closed")) {
                MrLibConsoleSayer.MrSay_Error("Database connection issue detected. Try restarting the server.");
            }
            return false;
        }
    }
    
    /**
     * Withdraw money from player's account
     */
    public boolean withdraw(org.bukkit.OfflinePlayer player, double amount) {
        if (!isEnabled()) {
            return false;
        }
        
        try {
            return economy.withdraw(player, amount);
        } catch (Exception e) {
            MrLibConsoleSayer.MrSay_Error("Error withdrawing money from player " + player.getName() + ": " + e.getMessage());
            return false;
        }
    }
    
    /**
     * Format money amount using Vault's currency format
     */
    public String format(double amount) {
        if (!isEnabled()) {
            return String.format("%.2f", amount);
        }
        
        try {
            return economy.format(amount);
        } catch (Exception e) {
            return String.format("%.2f", amount);
        }
    }
    
    /**
     * Get currency symbol/name
     */
    public String getCurrencySymbol() {
        if (!isEnabled()) {
            return "$";
        }
        
        try {
            String formatted = economy.format(1.0);
            
            return formatted.replaceAll("[0-9.,\\s]", "").trim();
        } catch (Exception e) {
            return "$";
        }
    }
    
    /**
     * Get the raw Economy instance (for advanced usage)
     */
    public Object getEconomy() {
        return economy;
    }
}

340 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only