001/*
002 * PlotSquared, a land and world management plugin for Minecraft.
003 * Copyright (C) IntellectualSites <https://intellectualsites.com>
004 * Copyright (C) IntellectualSites team and contributors
005 *
006 * This program is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
018 */
019package com.plotsquared.bukkit.util;
020
021import com.google.inject.Singleton;
022import com.plotsquared.bukkit.player.BukkitOfflinePlayer;
023import com.plotsquared.bukkit.player.BukkitPlayer;
024import com.plotsquared.core.player.OfflinePlotPlayer;
025import com.plotsquared.core.player.PlotPlayer;
026import com.plotsquared.core.plot.PlotArea;
027import com.plotsquared.core.util.EconHandler;
028import net.milkbowl.vault.economy.Economy;
029import org.bukkit.Bukkit;
030import org.bukkit.OfflinePlayer;
031import org.bukkit.plugin.RegisteredServiceProvider;
032import org.checkerframework.checker.nullness.qual.NonNull;
033
034@Singleton
035public class BukkitEconHandler extends EconHandler {
036
037    private Economy econ;
038
039    private static OfflinePlayer getBukkitOfflinePlayer(PlotPlayer<?> plotPlayer) {
040        return ((BukkitPlayer) plotPlayer).player;
041    }
042
043    @Override
044    public boolean init() {
045        if (this.econ == null) {
046            setupEconomy();
047        }
048        return this.econ != null;
049    }
050
051    private void setupEconomy() {
052        if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) {
053            return;
054        }
055        RegisteredServiceProvider<Economy> economyProvider =
056                Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
057        if (economyProvider != null) {
058            this.econ = economyProvider.getProvider();
059        }
060    }
061
062    @Override
063    public double getMoney(PlotPlayer<?> player) {
064        double bal = super.getMoney(player);
065        if (Double.isNaN(bal)) {
066            return this.econ.getBalance(getBukkitOfflinePlayer(player));
067        }
068        return bal;
069    }
070
071    @Override
072    public void withdrawMoney(PlotPlayer<?> player, double amount) {
073        this.econ.withdrawPlayer(getBukkitOfflinePlayer(player), amount);
074    }
075
076    @Override
077    public void depositMoney(PlotPlayer<?> player, double amount) {
078        this.econ.depositPlayer(getBukkitOfflinePlayer(player), amount);
079    }
080
081    @Override
082    public void depositMoney(OfflinePlotPlayer player, double amount) {
083        this.econ.depositPlayer(((BukkitOfflinePlayer) player).player, amount);
084    }
085
086    @Override
087    public boolean isEnabled(PlotArea plotArea) {
088        return plotArea.useEconomy();
089    }
090
091    @Override
092    public @NonNull String format(double balance) {
093        return this.econ.format(balance);
094    }
095
096    @Override
097    public boolean isSupported() {
098        return true;
099    }
100
101    @Override
102    public double getBalance(PlotPlayer<?> player) {
103        return this.econ.getBalance(getBukkitOfflinePlayer(player));
104    }
105
106}