Factions3/src/main/java/com/massivecraft/factions/integration/Econ.java

271 lines
7.5 KiB
Java
Raw Normal View History

package com.massivecraft.factions.integration;
import java.util.HashSet;
import java.util.Set;
2013-04-22 09:37:53 +02:00
import com.massivecraft.factions.EconomyParticipator;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
2013-04-22 09:37:53 +02:00
import com.massivecraft.factions.entity.Faction;
2011-10-12 17:25:01 +02:00
import com.massivecraft.factions.util.RelationUtil;
2014-06-04 14:02:23 +02:00
import com.massivecraft.massivecore.money.Money;
2011-10-10 01:21:05 +02:00
public class Econ
{
2013-04-19 09:50:33 +02:00
// -------------------------------------------- //
// STATE
// -------------------------------------------- //
public static boolean isEnabled()
{
return MConf.get().econEnabled && Money.enabled();
}
2013-04-19 09:50:33 +02:00
// -------------------------------------------- //
// UTIL
// -------------------------------------------- //
public static boolean payForAction(double cost, MPlayer usender, String actionDescription)
{
if (!isEnabled()) return true;
2013-04-19 09:50:33 +02:00
if (cost == 0D) return true;
2013-04-25 14:15:25 +02:00
if (usender.isUsingAdminMode()) return true;
2013-04-25 14:15:25 +02:00
Faction usenderFaction = usender.getFaction();
if (MConf.get().bankEnabled && MConf.get().bankFactionPaysCosts && usenderFaction.isNormal())
2013-04-19 09:50:33 +02:00
{
2013-04-25 14:15:25 +02:00
return modifyMoney(usenderFaction, -cost, actionDescription);
2013-04-19 09:50:33 +02:00
}
else
{
2013-04-25 14:15:25 +02:00
return modifyMoney(usender, -cost, actionDescription);
2013-04-19 09:50:33 +02:00
}
}
// -------------------------------------------- //
// ASSORTED
// -------------------------------------------- //
2013-04-22 09:37:53 +02:00
public static void modifyUniverseMoney(Object universe, double delta)
{
if (!isEnabled()) return;
if (MConf.get().econUniverseAccount == null) return;
if (MConf.get().econUniverseAccount.length() == 0) return;
2013-04-22 09:37:53 +02:00
if (!Money.exists(MConf.get().econUniverseAccount)) return;
Money.spawn(MConf.get().econUniverseAccount, null, delta);
}
public static void sendBalanceInfo(MPlayer to, EconomyParticipator about)
{
to.msg("<a>%s's<i> balance is <h>%s<i>.", about.describeTo(to, true), Money.format(Money.get(about)));
}
public static boolean canIControllYou(EconomyParticipator i, EconomyParticipator you)
{
Faction fI = RelationUtil.getFaction(i);
Faction fYou = RelationUtil.getFaction(you);
2011-10-12 17:25:01 +02:00
// This is a system invoker. Accept it.
if (fI == null) return true;
2011-10-12 17:25:01 +02:00
// Bypassing players can do any kind of transaction
if (i instanceof MPlayer && ((MPlayer)i).isUsingAdminMode()) return true;
2011-10-12 17:25:01 +02:00
// You can deposit to anywhere you feel like. It's your loss if you can't withdraw it again.
if (i == you) return true;
2011-10-12 17:25:01 +02:00
// A faction can always transfer away the money of it's members and its own money...
// This will however probably never happen as a faction does not have free will.
// Ohh by the way... Yes it could. For daily rent to the faction.
if (i == fI && fI == fYou) return true;
2011-10-12 17:25:01 +02:00
// Factions can be controlled by those that have permissions
if (you instanceof Faction)
{
if (i instanceof Faction && MPerm.getPermWithdraw().has((Faction)i, fYou)) return true;
if (i instanceof MPlayer && MPerm.getPermWithdraw().has((MPlayer)i, fYou, false)) return true;
}
2011-10-12 17:25:01 +02:00
// Otherwise you may not! ;,,;
return false;
}
2011-10-12 17:25:01 +02:00
public static boolean transferMoney(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount)
{
2013-12-03 20:19:55 +01:00
return transferMoney(from, to, invoker, amount, true);
}
2013-12-03 20:19:55 +01:00
public static boolean transferMoney(EconomyParticipator from, EconomyParticipator to, EconomyParticipator by, double amount, boolean notify)
{
if (!isEnabled()) return false;
2011-10-12 17:25:01 +02:00
// The amount must be positive.
// If the amount is negative we must flip and multiply amount with -1.
if (amount < 0)
{
2011-10-12 17:25:01 +02:00
amount *= -1;
EconomyParticipator temp = from;
from = to;
to = temp;
}
2011-10-12 17:25:01 +02:00
// Check the rights
if ( ! canIControllYou(by, from))
{
by.msg("<h>%s<i> lacks permission to control <h>%s's<i> money.", by.describeTo(by, true), from.describeTo(by));
return false;
}
2011-10-12 17:25:01 +02:00
// Is there enough money for the transaction to happen?
2013-04-22 09:37:53 +02:00
if (Money.get(from) < amount)
2011-10-12 17:25:01 +02:00
{
// There was not enough money to pay
2013-12-03 20:19:55 +01:00
if (by != null && notify)
2013-04-19 09:50:33 +02:00
{
2013-12-03 20:19:55 +01:00
by.msg("<h>%s<b> can't afford to transfer <h>%s<b> to %s<b>.", from.describeTo(by, true), Money.format(amount), to.describeTo(by));
2013-04-19 09:50:33 +02:00
}
2011-10-12 17:25:01 +02:00
return false;
}
// Transfer money
2013-12-03 20:19:55 +01:00
if (Money.move(from, to, by, amount))
2013-04-19 09:50:33 +02:00
{
if (notify)
2013-04-19 09:50:33 +02:00
{
2013-12-03 20:19:55 +01:00
sendTransferInfo(by, from, to, amount);
}
return true;
}
else
2013-04-22 09:37:53 +02:00
{
// if we get here something with the transaction failed
2013-12-03 20:19:55 +01:00
if (by != null && notify)
{
2013-12-03 20:19:55 +01:00
by.msg("Unable to transfer %s<b> to <h>%s<b> from <h>%s<b>.", Money.format(amount), to.describeTo(by), from.describeTo(by, true));
}
return false;
2013-04-22 09:37:53 +02:00
}
}
2014-09-17 13:29:58 +02:00
public static Set<MPlayer> getMPlayers(EconomyParticipator ep)
{
2014-09-17 13:29:58 +02:00
Set<MPlayer> mplayers = new HashSet<MPlayer>();
if (ep == null)
{
// Add nothing
}
else if (ep instanceof MPlayer)
{
2014-09-17 13:29:58 +02:00
mplayers.add((MPlayer)ep);
}
else if (ep instanceof Faction)
{
2014-09-17 13:29:58 +02:00
mplayers.addAll(((Faction)ep).getMPlayers());
}
2014-09-17 13:29:58 +02:00
return mplayers;
}
public static void sendTransferInfo(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount)
{
Set<MPlayer> recipients = new HashSet<MPlayer>();
2014-09-17 13:29:58 +02:00
recipients.addAll(getMPlayers(invoker));
recipients.addAll(getMPlayers(from));
recipients.addAll(getMPlayers(to));
2011-10-12 17:25:01 +02:00
if (invoker == null)
{
for (MPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> was transfered from <h>%s<i> to <h>%s<i>.", Money.format(amount), from.describeTo(recipient), to.describeTo(recipient));
}
}
else if (invoker == from)
{
for (MPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> <h>gave %s<i> to <h>%s<i>.", from.describeTo(recipient, true), Money.format(amount), to.describeTo(recipient));
}
2011-10-12 17:25:01 +02:00
}
else if (invoker == to)
2011-10-12 17:25:01 +02:00
{
for (MPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> <h>took %s<i> from <h>%s<i>.", to.describeTo(recipient, true), Money.format(amount), from.describeTo(recipient));
}
2011-10-12 17:25:01 +02:00
}
else
{
for (MPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> transfered <h>%s<i> from <h>%s<i> to <h>%s<i>.", invoker.describeTo(recipient, true), Money.format(amount), from.describeTo(recipient), to.describeTo(recipient));
}
}
}
public static boolean hasAtLeast(EconomyParticipator ep, double delta, String toDoThis)
{
if (!isEnabled()) return true;
2013-04-22 09:37:53 +02:00
if (Money.get(ep) < delta)
{
if (toDoThis != null && !toDoThis.isEmpty())
2013-04-22 09:37:53 +02:00
{
ep.msg("<h>%s<i> can't afford <h>%s<i> %s.", ep.describeTo(ep, true), Money.format(delta), toDoThis);
2013-04-22 09:37:53 +02:00
}
return false;
}
return true;
}
2013-04-19 09:50:33 +02:00
public static boolean modifyMoney(EconomyParticipator ep, double delta, String actionDescription)
{
if (!isEnabled()) return false;
2013-04-19 09:50:33 +02:00
if (delta == 0) return true;
2011-10-12 17:25:01 +02:00
String You = ep.describeTo(ep, true);
2013-04-19 09:50:33 +02:00
boolean hasActionDesctription = (actionDescription != null && !actionDescription.isEmpty());
2013-12-03 20:19:55 +01:00
if (Money.spawn(ep, null, delta))
{
2013-04-22 09:37:53 +02:00
modifyUniverseMoney(ep, -delta);
if (hasActionDesctription)
2013-04-19 09:50:33 +02:00
{
2013-04-22 09:37:53 +02:00
if (delta > 0)
2013-04-19 09:50:33 +02:00
{
ep.msg("<h>%s<i> gained <h>%s<i> since did %s.", You, Money.format(delta), actionDescription);
2013-04-19 09:50:33 +02:00
}
2013-04-22 09:37:53 +02:00
else
2013-04-19 09:50:33 +02:00
{
ep.msg("<h>%s<i> lost <h>%s<i> since did %s.", You, Money.format(-delta), actionDescription);
2013-04-19 09:50:33 +02:00
}
}
2013-04-22 09:37:53 +02:00
return true;
}
2011-10-12 17:25:01 +02:00
else
{
2013-04-22 09:37:53 +02:00
if (hasActionDesctription)
2011-10-12 17:25:01 +02:00
{
2013-04-22 09:37:53 +02:00
if (delta > 0)
2013-04-19 09:50:33 +02:00
{
ep.msg("<h>%s<i> would have gained <h>%s<i> since did %s, but the deposit failed.", You, Money.format(delta), actionDescription);
2013-04-19 09:50:33 +02:00
}
2013-04-22 09:37:53 +02:00
else
2013-04-19 09:50:33 +02:00
{
ep.msg("<h>%s<i> can't afford <h>%s<i> to %s.", You, Money.format(-delta), actionDescription);
2013-04-19 09:50:33 +02:00
}
2011-10-12 17:25:01 +02:00
}
2013-04-22 09:37:53 +02:00
return false;
}
}
}