From 2154b890050f772e18c41acadec1d364fc8693e1 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Mon, 1 Aug 2011 18:05:01 -0500 Subject: [PATCH] Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value. --- lib/iConomy.jar | Bin 0 -> 174371 bytes src/com/massivecraft/factions/Conf.java | 42 ++++-- src/com/massivecraft/factions/Econ.java | 128 ++++++++++++++++++ src/com/massivecraft/factions/FPlayer.java | 51 +++++-- src/com/massivecraft/factions/Factions.java | 2 + .../factions/commands/FBaseCommand.java | 27 ++++ .../factions/commands/FCommandCreate.java | 8 +- .../commands/FCommandDescription.java | 7 +- .../factions/commands/FCommandHome.java | 13 +- .../factions/commands/FCommandInvite.java | 7 +- .../factions/commands/FCommandJoin.java | 5 + .../factions/commands/FCommandKick.java | 5 + .../factions/commands/FCommandLeave.java | 2 +- .../factions/commands/FCommandList.java | 5 + .../factions/commands/FCommandMap.java | 12 ++ .../factions/commands/FCommandOpen.java | 7 +- .../factions/commands/FCommandOwner.java | 5 + .../factions/commands/FCommandPower.java | 9 +- .../factions/commands/FCommandSethome.java | 7 +- .../factions/commands/FCommandShow.java | 21 ++- .../factions/commands/FCommandTag.java | 5 + .../factions/commands/FCommandTitle.java | 7 +- .../factions/commands/FCommandUnclaim.java | 28 +++- .../factions/commands/FCommandUnclaimall.java | 29 +++- .../factions/commands/FRelationCommand.java | 8 +- .../listeners/FactionsPlayerListener.java | 11 +- .../listeners/FactionsServerListener.java | 39 ++++++ src/plugin.yml | 1 + 28 files changed, 451 insertions(+), 40 deletions(-) create mode 100644 lib/iConomy.jar create mode 100644 src/com/massivecraft/factions/Econ.java create mode 100644 src/com/massivecraft/factions/listeners/FactionsServerListener.java diff --git a/lib/iConomy.jar b/lib/iConomy.jar new file mode 100644 index 0000000000000000000000000000000000000000..0826420b26a498107d4f267d2f31c05167e7940b GIT binary patch literal 174371 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 literal 0 HcmV?d00001 diff --git a/src/com/massivecraft/factions/Conf.java b/src/com/massivecraft/factions/Conf.java index a5911cc4..1bd773aa 100644 --- a/src/com/massivecraft/factions/Conf.java +++ b/src/com/massivecraft/factions/Conf.java @@ -23,12 +23,12 @@ public class Conf { public static ChatColor colorParameter = ChatColor.DARK_AQUA; // Power - public static double powerPlayerMax = 10; - public static double powerPlayerMin = -10; + public static double powerPlayerMax = 10.0; + public static double powerPlayerMin = -10.0; public static double powerPerMinute = 0.2; // Default health rate... it takes 5 min to heal one power - public static double powerPerDeath = 4; // A death makes you lose 4 power + public static double powerPerDeath = 4.0; // A death makes you lose 4 power public static boolean powerRegenOffline = false; // does player power regenerate even while they're offline? - public static double powerFactionMax = 0; // if greater than 0, the cap on how much power a faction can have (additional power from players beyond that will act as a "buffer" of sorts) + public static double powerFactionMax = 0.0; // if greater than 0, the cap on how much power a faction can have (additional power from players beyond that will act as a "buffer" of sorts) public static String prefixAdmin = "**"; public static String prefixMod = "*"; @@ -59,7 +59,7 @@ public class Conf { public static boolean allowNoSlashCommand = true; - public static double autoLeaveAfterDaysOfInactivity = 14; + public static double autoLeaveAfterDaysOfInactivity = 14.0; public static boolean homesEnabled = true; public static boolean homesMustBeInClaimedTerritory = true; @@ -68,7 +68,7 @@ public class Conf { public static boolean homesTeleportCommandEnabled = true; public static boolean homesTeleportAllowedFromEnemyTerritory = true; public static boolean homesTeleportAllowedFromDifferentWorld = true; - public static double homesTeleportAllowedEnemyDistance = 32; + public static double homesTeleportAllowedEnemyDistance = 32.0; public static boolean homesTeleportIgnoreEnemiesIfInOwnTerritory = true; public static boolean disablePVPBetweenNeutralFactions = false; @@ -79,7 +79,7 @@ public class Conf { public static boolean claimsCanBeUnconnectedIfOwnedByOtherFaction = true; public static int claimsRequireMinFactionMembers = 1; - public static double considerFactionsReallyOfflineAfterXMinutes = 0; + public static double considerFactionsReallyOfflineAfterXMinutes = 0.0; public static double territoryShieldFactor = 0.3; public static boolean territoryDenyBuild = true; @@ -133,6 +133,32 @@ public class Conf { public static Set territoryDenyUseageMaterialsWhenOffline = EnumSet.noneOf(Material.class); public static transient Set safeZoneNerfedCreatureTypes = EnumSet.noneOf(CreatureType.class); + + // Economy settings + public static boolean econIConomyEnabled = false; + public static double econCostClaimWilderness = 30.0; + public static double econCostClaimFromFactionBonus = 30.0; + public static double econClaimAdditionalMultiplier = 0.5; + public static double econClaimRefundMultiplier = 0.7; + public static double econCostCreate = 100.0; + public static double econCostOwner = 15.0; + public static double econCostSethome = 30.0; + public static double econCostJoin = 0.0; + public static double econCostLeave = 0.0; + public static double econCostKick = 0.0; + public static double econCostInvite = 0.0; + public static double econCostHome = 0.0; + public static double econCostTag = 0.0; + public static double econCostDesc = 0.0; + public static double econCostTitle = 0.0; + public static double econCostList = 0.0; + public static double econCostMap = 0.0; + public static double econCostPower = 0.0; + public static double econCostShow = 0.0; + public static double econCostOpen = 0.0; + public static double econCostAlly = 0.0; + public static double econCostEnemy = 0.0; + public static double econCostNeutral = 0.0; public static Set worldsNoClaiming = new HashSet(); public static Set worldsNoPowerLoss = new HashSet(); @@ -182,7 +208,7 @@ public class Conf { // track players with admin access who have enabled "admin bypass" mode, and should therefore be able to build anywhere // not worth saving between server restarts, I think public static transient Set adminBypassPlayers = Collections.synchronizedSet(new HashSet()); - + // -------------------------------------------- // // Persistance // -------------------------------------------- // diff --git a/src/com/massivecraft/factions/Econ.java b/src/com/massivecraft/factions/Econ.java new file mode 100644 index 00000000..f8052aa5 --- /dev/null +++ b/src/com/massivecraft/factions/Econ.java @@ -0,0 +1,128 @@ +package com.massivecraft.factions; + +import org.bukkit.event.Event; + +import com.massivecraft.factions.listeners.FactionsServerListener; + +import com.iConomy.*; +import com.iConomy.system.*; + + +public class Econ { + private static iConomy iConomyPlugin; + + public static void monitorPlugins() { + Factions.instance.getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, new FactionsServerListener(), Event.Priority.Monitor, Factions.instance); + Factions.instance.getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_DISABLE, new FactionsServerListener(), Event.Priority.Monitor, Factions.instance); + } + + public static void iConomySet(iConomy instance) { + iConomyPlugin = instance; + } + + public static boolean iConomyHooked() { + return iConomyPlugin != null; + } + + // If economy is enabled in conf.json, and we're successfully hooked into an economy plugin + public static boolean enabled() { + return Conf.econIConomyEnabled && iConomyPlugin != null; + } + + // mainly for internal use, for a little less code repetition + public static Holdings getIconomyHoldings(String playerName) { + if (!enabled()) { + return null; + } + + Account account = iConomy.getAccount(playerName); + if (account == null) { + return null; + } + Holdings holdings = account.getHoldings(); + return holdings; + } + + + // format money string based on server's set currency type, like "24 gold" or "$24.50" + public static String moneyString(double amount) { + return iConomy.format(amount); + } + + // whether a player can afford specified amount + public static boolean canAfford(String playerName, double amount) { + // if Economy support is not enabled, they can certainly afford to pay nothing + if (!enabled()) { + return true; + } + + Holdings holdings = getIconomyHoldings(playerName); + if (holdings == null) { + return false; + } + + return holdings.hasEnough(amount); + } + + // deduct money from their account; returns true if successful + public static boolean deductMoney(String playerName, double amount) { + if (!enabled()) { + return true; + } + + Holdings holdings = getIconomyHoldings(playerName); + if (holdings == null || !holdings.hasEnough(amount)) { + return false; + } + + holdings.subtract(amount); + return true; + } + + // add money to their account; returns true if successful + public static boolean addMoney(String playerName, double amount) { + if (!enabled()) { + return true; + } + + Holdings holdings = getIconomyHoldings(playerName); + if (holdings == null) { + return false; + } + + holdings.add(amount); + return true; + } + + + // calculate the cost for claiming land + public static double calculateClaimCost(int ownedLand, boolean takingFromAnotherFaction) { + if (!enabled()) { + return 0.0; + } + + // basic claim cost, plus land inflation cost, minus the potential bonus given for claiming from another faction + return Conf.econCostClaimWilderness + + (Conf.econCostClaimWilderness * Conf.econClaimAdditionalMultiplier * ownedLand) + - (takingFromAnotherFaction ? Conf.econCostClaimFromFactionBonus: 0); + } + + // calculate refund amount for unclaiming land + public static double calculateClaimRefund(int ownedLand) { + return calculateClaimCost(ownedLand - 1, false) * Conf.econClaimRefundMultiplier; + } + + // calculate value of all owned land + public static double calculateTotalLandValue(int ownedLand) { + double amount = 0; + for (int x = 0; x < ownedLand; x++) { + amount += calculateClaimCost(x, false); + } + return amount; + } + + // calculate refund amount for all owned land + public static double calculateTotalLandRefund(int ownedLand) { + return calculateTotalLandValue(ownedLand) * Conf.econClaimRefundMultiplier; + } +} diff --git a/src/com/massivecraft/factions/FPlayer.java b/src/com/massivecraft/factions/FPlayer.java index 7d757020..49cb74fe 100644 --- a/src/com/massivecraft/factions/FPlayer.java +++ b/src/com/massivecraft/factions/FPlayer.java @@ -434,7 +434,7 @@ public class FPlayer { // Actions // ------------------------------- - public void leave() { + public void leave(boolean makePay) { Faction myFaction = this.getFaction(); if (this.getRole() == Role.ADMIN && myFaction.getFPlayers().size() > 1) { @@ -446,7 +446,27 @@ public class FPlayer { sendMessage("You cannot leave until your power is positive."); return; } - + + // if economy is enabled and they're not on the bypass list, make 'em pay + if (makePay && Econ.enabled() && !Conf.adminBypassPlayers.contains(this.playerName)) { + double cost = Conf.econCostLeave; + // pay up + if (cost > 0.0) { + String costString = Econ.moneyString(cost); + if (!Econ.deductMoney(this.getName(), cost)) { + sendMessage("It costs "+costString+" to leave your faction, which you can't currently afford."); + return; + } + sendMessage("You have paid "+costString+" to leave your faction."); + } + // wait... we pay you to leave? + else if (cost < 0.0) { + String costString = Econ.moneyString(-cost); + Econ.addMoney(this.getName(), -cost); + sendMessage("You have been paid "+costString+" for leaving your faction."); + } + } + if (myFaction.isNormal()) { myFaction.sendMessage(this.getNameAndRelevant(myFaction) + Conf.colorSystem + " left your faction."); } @@ -502,7 +522,8 @@ public class FPlayer { return false; } - if (myFaction.getLandRounded() >= myFaction.getPowerRounded()) { + int ownedLand = myFaction.getLandRounded(); + if (ownedLand >= myFaction.getPowerRounded()) { sendMessage("You can't claim more land! You need more power!"); return false; } @@ -527,10 +548,7 @@ public class FPlayer { return false; } - if (otherFaction.isNone()) { - myFaction.sendMessage(this.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some new land :D"); - } else { //if (otherFaction.isNormal()) { - + if (otherFaction.isNormal()) { if ( ! otherFaction.hasLandInflation()) { // TODO more messages WARN current faction most importantly sendMessage(this.getRelationColor(otherFaction)+otherFaction.getTag()+Conf.colorSystem+" owns this land and is strong enough to keep it."); @@ -541,12 +559,29 @@ public class FPlayer { sendMessage("You must start claiming land at the border of the territory."); return false; } + } + // if economy is enabled and they're not on the bypass list, make 'em pay + if (Econ.enabled() && !Conf.adminBypassPlayers.contains(this.playerName)) { + double cost = Econ.calculateClaimCost(ownedLand, otherFaction.isNormal()); + String costString = Econ.moneyString(cost); + if (!Econ.deductMoney(this.playerName, cost)) { + sendMessage("Claiming this land will cost "+costString+", which you can't currently afford."); + return false; + } + sendMessage("You have paid "+costString+" to claim this land."); + } + + // announce success + if (otherFaction.isNormal()) { // ASDF claimed some of your land 450 blocks NNW of you. // ASDf claimed some land from FACTION NAME otherFaction.sendMessage(this.getNameAndRelevant(otherFaction)+Conf.colorSystem+" stole some of your land :O"); myFaction.sendMessage(this.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some land from "+otherFaction.getTag(myFaction)); } + else { + myFaction.sendMessage(this.getNameAndRelevant(myFaction)+Conf.colorSystem+" claimed some new land :D"); + } Board.setFactionAt(myFaction, flocation); return true; @@ -687,7 +722,7 @@ public class FPlayer { for (FPlayer fplayer : FPlayer.getAll()) { if (now - fplayer.getLastLoginTime() > toleranceMillis) { - fplayer.leave(); + fplayer.leave(false); } } } diff --git a/src/com/massivecraft/factions/Factions.java b/src/com/massivecraft/factions/Factions.java index 4cad945e..40403d3e 100644 --- a/src/com/massivecraft/factions/Factions.java +++ b/src/com/massivecraft/factions/Factions.java @@ -147,6 +147,8 @@ public class Factions extends JavaPlugin { setupPermissions(); integrateEssentialsChat(); + Econ.monitorPlugins(); + // Register events PluginManager pm = this.getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_CHAT, this.playerListener, Event.Priority.Highest, this); diff --git a/src/com/massivecraft/factions/commands/FBaseCommand.java b/src/com/massivecraft/factions/commands/FBaseCommand.java index 4df12573..c97667ad 100644 --- a/src/com/massivecraft/factions/commands/FBaseCommand.java +++ b/src/com/massivecraft/factions/commands/FBaseCommand.java @@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; @@ -234,6 +235,32 @@ public class FBaseCommand { return false; } + // if economy is enabled and they're not on the bypass list, make 'em pay; returns true unless person can't afford the cost + public boolean payForCommand(double cost) { + if (!Econ.enabled() || this.me == null || cost == 0.0 || Conf.adminBypassPlayers.contains(me.getName())) { + return true; + } + + String desc = this.helpDescription.toLowerCase(); + + // pay up + if (cost > 0.0) { + String costString = Econ.moneyString(cost); + if (!Econ.deductMoney(me.getName(), cost)) { + sendMessage("It costs "+costString+" to "+desc+", which you can't currently afford."); + return false; + } + sendMessage("You have paid "+costString+" to "+desc+"."); + } + // wait... we pay you to use this command? + else { + String costString = Econ.moneyString(-cost); + Econ.addMoney(me.getName(), -cost); + sendMessage("You have been paid "+costString+" to "+desc+"."); + } + return true; + } + public static final List aliasTrue = new ArrayList(Arrays.asList("true", "yes", "y", "ok", "on", "+")); public static final List aliasFalse = new ArrayList(Arrays.asList("false", "no", "n", "off", "-")); diff --git a/src/com/massivecraft/factions/commands/FCommandCreate.java b/src/com/massivecraft/factions/commands/FCommandCreate.java index bd512e14..e833af6c 100644 --- a/src/com/massivecraft/factions/commands/FCommandCreate.java +++ b/src/com/massivecraft/factions/commands/FCommandCreate.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import org.bukkit.command.CommandSender; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; @@ -51,7 +52,12 @@ public class FCommandCreate extends FBaseCommand { sendMessage(tagValidationErrors); return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostCreate)) { + return; + } + Faction faction = Faction.create(); faction.setTag(tag); me.setRole(Role.ADMIN); diff --git a/src/com/massivecraft/factions/commands/FCommandDescription.java b/src/com/massivecraft/factions/commands/FCommandDescription.java index 8040da19..c45049e5 100644 --- a/src/com/massivecraft/factions/commands/FCommandDescription.java +++ b/src/com/massivecraft/factions/commands/FCommandDescription.java @@ -29,7 +29,12 @@ public class FCommandDescription extends FBaseCommand { if ( ! assertMinRole(Role.MODERATOR)) { return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostDesc)) { + return; + } + me.getFaction().setDescription(TextUtil.implode(parameters)); // Broadcast the description to everyone diff --git a/src/com/massivecraft/factions/commands/FCommandHome.java b/src/com/massivecraft/factions/commands/FCommandHome.java index cba1ab46..a3483c22 100644 --- a/src/com/massivecraft/factions/commands/FCommandHome.java +++ b/src/com/massivecraft/factions/commands/FCommandHome.java @@ -58,9 +58,9 @@ public class FCommandHome extends FBaseCommand { // if player is not in a safe zone or their own faction territory, only allow teleport if no enemies are nearby if ( - Conf.homesTeleportAllowedEnemyDistance > 0 - && !faction.isSafeZone() - && (!me.isInOwnTerritory() || (me.isInOwnTerritory() && !Conf.homesTeleportIgnoreEnemiesIfInOwnTerritory)) + Conf.homesTeleportAllowedEnemyDistance > 0 + && !faction.isSafeZone() + && (!me.isInOwnTerritory() || (me.isInOwnTerritory() && !Conf.homesTeleportIgnoreEnemiesIfInOwnTerritory)) ) { Location loc = player.getLocation(); World w = loc.getWorld(); @@ -91,7 +91,12 @@ public class FCommandHome extends FBaseCommand { return; } } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostHome)) { + return; + } + player.teleport(myFaction.getHome()); } diff --git a/src/com/massivecraft/factions/commands/FCommandInvite.java b/src/com/massivecraft/factions/commands/FCommandInvite.java index ffd3a742..3b17c6dc 100644 --- a/src/com/massivecraft/factions/commands/FCommandInvite.java +++ b/src/com/massivecraft/factions/commands/FCommandInvite.java @@ -45,7 +45,12 @@ public class FCommandInvite extends FBaseCommand { sendMessage("You might want to: " + new FCommandKick().getUseageTemplate(false)); return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostInvite)) { + return; + } + myFaction.invite(you); you.sendMessage(me.getNameAndRelevant(you)+Conf.colorSystem+" invited you to "+myFaction.getTag(you)); diff --git a/src/com/massivecraft/factions/commands/FCommandJoin.java b/src/com/massivecraft/factions/commands/FCommandJoin.java index d984e20c..338f31b2 100644 --- a/src/com/massivecraft/factions/commands/FCommandJoin.java +++ b/src/com/massivecraft/factions/commands/FCommandJoin.java @@ -54,6 +54,11 @@ public class FCommandJoin extends FBaseCommand { return; } + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostJoin)) { + return; + } + me.sendMessage(Conf.colorSystem+"You successfully joined "+faction.getTag(me)); faction.sendMessage(me.getNameAndRelevant(faction)+Conf.colorSystem+" joined your faction."); diff --git a/src/com/massivecraft/factions/commands/FCommandKick.java b/src/com/massivecraft/factions/commands/FCommandKick.java index 667f10cf..4b95faf3 100644 --- a/src/com/massivecraft/factions/commands/FCommandKick.java +++ b/src/com/massivecraft/factions/commands/FCommandKick.java @@ -57,6 +57,11 @@ public class FCommandKick extends FBaseCommand { } } + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostKick)) { + return; + } + yourFaction.sendMessage(me.getNameAndRelevant(yourFaction)+Conf.colorSystem+" kicked "+you.getNameAndRelevant(yourFaction)+Conf.colorSystem+" from the faction! :O"); you.sendMessage(me.getNameAndRelevant(you)+Conf.colorSystem+" kicked you from "+yourFaction.getTag(you)+Conf.colorSystem+"! :O"); if (yourFaction != myFaction) { diff --git a/src/com/massivecraft/factions/commands/FCommandLeave.java b/src/com/massivecraft/factions/commands/FCommandLeave.java index 306bb881..a8d6dab2 100644 --- a/src/com/massivecraft/factions/commands/FCommandLeave.java +++ b/src/com/massivecraft/factions/commands/FCommandLeave.java @@ -26,7 +26,7 @@ public class FCommandLeave extends FBaseCommand { return; } - me.leave(); + me.leave(true); } } diff --git a/src/com/massivecraft/factions/commands/FCommandList.java b/src/com/massivecraft/factions/commands/FCommandList.java index 98a62517..e789d541 100644 --- a/src/com/massivecraft/factions/commands/FCommandList.java +++ b/src/com/massivecraft/factions/commands/FCommandList.java @@ -36,6 +36,11 @@ public class FCommandList extends FBaseCommand { FactionList.remove(Faction.getSafeZone()); FactionList.remove(Faction.getWarZone()); + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostList)) { + return; + } + int page = 1; if (parameters.size() > 0) { try { diff --git a/src/com/massivecraft/factions/commands/FCommandMap.java b/src/com/massivecraft/factions/commands/FCommandMap.java index 6f567bed..71b95612 100644 --- a/src/com/massivecraft/factions/commands/FCommandMap.java +++ b/src/com/massivecraft/factions/commands/FCommandMap.java @@ -3,6 +3,7 @@ package com.massivecraft.factions.commands; import org.bukkit.command.CommandSender; import com.massivecraft.factions.Board; +import com.massivecraft.factions.Conf; import com.massivecraft.factions.FLocation; @@ -27,6 +28,12 @@ public class FCommandMap extends FBaseCommand { String mapAutoUpdating = parameters.get(0); if (parseBool(mapAutoUpdating)) { // Turn on + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostMap)) { + return; + } + me.setMapAutoUpdating(true); sendMessage("Map auto update ENABLED."); @@ -38,6 +45,11 @@ public class FCommandMap extends FBaseCommand { sendMessage("Map auto update DISABLED."); } } else { + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostMap)) { + return; + } + showMap(); } } diff --git a/src/com/massivecraft/factions/commands/FCommandOpen.java b/src/com/massivecraft/factions/commands/FCommandOpen.java index 782be865..5a378f70 100644 --- a/src/com/massivecraft/factions/commands/FCommandOpen.java +++ b/src/com/massivecraft/factions/commands/FCommandOpen.java @@ -27,7 +27,12 @@ public class FCommandOpen extends FBaseCommand { if ( ! assertMinRole(Role.MODERATOR)) { return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostOpen)) { + return; + } + Faction myFaction = me.getFaction(); myFaction.setOpen( ! me.getFaction().getOpen()); diff --git a/src/com/massivecraft/factions/commands/FCommandOwner.java b/src/com/massivecraft/factions/commands/FCommandOwner.java index 0ba17535..0b1b5860 100644 --- a/src/com/massivecraft/factions/commands/FCommandOwner.java +++ b/src/com/massivecraft/factions/commands/FCommandOwner.java @@ -94,6 +94,11 @@ public class FCommandOwner extends FBaseCommand { return; } + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostOwner)) { + return; + } + myFaction.setPlayerAsOwner(playerName, flocation); me.sendMessage("You have added "+playerName+" to the owner list for this claimed land."); } diff --git a/src/com/massivecraft/factions/commands/FCommandPower.java b/src/com/massivecraft/factions/commands/FCommandPower.java index e675f4b8..a8d29dfe 100644 --- a/src/com/massivecraft/factions/commands/FCommandPower.java +++ b/src/com/massivecraft/factions/commands/FCommandPower.java @@ -36,7 +36,7 @@ public class FCommandPower extends FBaseCommand { } target = findFPlayer(parameters.get(0), false); } else if (!(sender instanceof Player)) { - sendMessage("From the command line, you must specify a player (f power )."); + sendMessage("From the console, you must specify a player (f power )."); return; } else { target = me; @@ -45,7 +45,12 @@ public class FCommandPower extends FBaseCommand { if (target == null) { return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostPower)) { + return; + } + sendMessage(target.getNameAndRelevant(me)+Conf.colorChrome+" - Power / Maxpower: "+Conf.colorSystem+target.getPowerRounded()+" / "+target.getPowerMaxRounded()); } diff --git a/src/com/massivecraft/factions/commands/FCommandSethome.java b/src/com/massivecraft/factions/commands/FCommandSethome.java index bcbbc5ce..9a1d77d8 100644 --- a/src/com/massivecraft/factions/commands/FCommandSethome.java +++ b/src/com/massivecraft/factions/commands/FCommandSethome.java @@ -55,7 +55,12 @@ public class FCommandSethome extends FBaseCommand { me.sendMessage("Sorry, your faction home can only be set inside your own claimed territory."); return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostSethome)) { + return; + } + myFaction.setHome(player.getLocation()); myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" set the home for your faction. You can now use:"); diff --git a/src/com/massivecraft/factions/commands/FCommandShow.java b/src/com/massivecraft/factions/commands/FCommandShow.java index 01926859..251db260 100644 --- a/src/com/massivecraft/factions/commands/FCommandShow.java +++ b/src/com/massivecraft/factions/commands/FCommandShow.java @@ -6,6 +6,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; import com.massivecraft.factions.struct.Role; @@ -45,7 +46,12 @@ public class FCommandShow extends FBaseCommand { if (faction == null) { return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostShow)) { + return; + } + Collection admins = faction.getFPlayersWhereRole(Role.ADMIN); Collection mods = faction.getFPlayersWhereRole(Role.MODERATOR); Collection normals = faction.getFPlayersWhereRole(Role.NORMAL); @@ -62,7 +68,18 @@ public class FCommandShow extends FBaseCommand { sendMessage(Conf.colorChrome+"Joining: "+Conf.colorSystem+"invitation is required"); } sendMessage(Conf.colorChrome+"Land / Power / Maxpower: "+Conf.colorSystem+ faction.getLandRounded()+" / "+faction.getPowerRounded()+" / "+faction.getPowerMaxRounded()); - + + // show the land value + if (Econ.enabled()) { + double value = Econ.calculateTotalLandValue(faction.getLandRounded()); + double refund = value * Conf.econClaimRefundMultiplier; + if (value > 0) { + String stringValue = Econ.moneyString(value); + String stringRefund = (refund > 0.0) ? (" ("+Econ.moneyString(refund)+" depreciated)") : ""; + sendMessage(Conf.colorChrome+"Total land value: " + Conf.colorSystem + stringValue + stringRefund); + } + } + String listpart; // List relation diff --git a/src/com/massivecraft/factions/commands/FCommandTag.java b/src/com/massivecraft/factions/commands/FCommandTag.java index fa6fa353..71c51ffd 100644 --- a/src/com/massivecraft/factions/commands/FCommandTag.java +++ b/src/com/massivecraft/factions/commands/FCommandTag.java @@ -48,6 +48,11 @@ public class FCommandTag extends FBaseCommand { return; } + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostTag)) { + return; + } + Faction myFaction = me.getFaction(); String oldtag = myFaction.getTag(); diff --git a/src/com/massivecraft/factions/commands/FCommandTitle.java b/src/com/massivecraft/factions/commands/FCommandTitle.java index c2b8d3a5..690a92ba 100644 --- a/src/com/massivecraft/factions/commands/FCommandTitle.java +++ b/src/com/massivecraft/factions/commands/FCommandTitle.java @@ -40,7 +40,12 @@ public class FCommandTitle extends FBaseCommand { if ( ! canIAdministerYou(me, you)) { return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + if (!payForCommand(Conf.econCostTitle)) { + return; + } + you.setTitle(title); // Inform diff --git a/src/com/massivecraft/factions/commands/FCommandUnclaim.java b/src/com/massivecraft/factions/commands/FCommandUnclaim.java index 1577856c..ae21ddcd 100644 --- a/src/com/massivecraft/factions/commands/FCommandUnclaim.java +++ b/src/com/massivecraft/factions/commands/FCommandUnclaim.java @@ -2,6 +2,7 @@ package com.massivecraft.factions.commands; import com.massivecraft.factions.Board; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.FLocation; import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; @@ -69,10 +70,31 @@ public class FCommandUnclaim extends FBaseCommand { sendMessage("You don't own this land."); return; } - + + String moneyBack = ""; + if (Econ.enabled()) { + double refund = Econ.calculateClaimRefund(myFaction.getLandRounded()); + // a real refund + if (refund > 0.0) { + Econ.addMoney(player.getName(), refund); + moneyBack = " They received a refund of "+Econ.moneyString(refund)+"."; + } + // wait, you're charging people to unclaim land? outrageous + else if (refund < 0.0) { + if (!Econ.deductMoney(player.getName(), -refund)) { + sendMessage("Unclaiming this land will cost "+Econ.moneyString(-refund)+", which you can't currently afford."); + return; + } + moneyBack = " It cost them "+Econ.moneyString(refund)+"."; + } + // no refund + else { + moneyBack = ""; + } + } + Board.removeAt(flocation); - - myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" unclaimed some land."); + myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" unclaimed some land."+moneyBack); } } diff --git a/src/com/massivecraft/factions/commands/FCommandUnclaimall.java b/src/com/massivecraft/factions/commands/FCommandUnclaimall.java index d8a62757..8fdb103f 100644 --- a/src/com/massivecraft/factions/commands/FCommandUnclaimall.java +++ b/src/com/massivecraft/factions/commands/FCommandUnclaimall.java @@ -2,6 +2,7 @@ package com.massivecraft.factions.commands; import com.massivecraft.factions.Board; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.Faction; import com.massivecraft.factions.struct.Role; @@ -28,11 +29,33 @@ public class FCommandUnclaimall extends FBaseCommand { if ( ! assertMinRole(Role.MODERATOR)) { return; } - + Faction myFaction = me.getFaction(); - + + String moneyBack = ""; + if (Econ.enabled()) { + double refund = Econ.calculateTotalLandRefund(myFaction.getLandRounded()); + // a real refund + if (refund > 0.0) { + Econ.addMoney(player.getName(), refund); + moneyBack = " They received a refund of "+Econ.moneyString(refund)+"."; + } + // wait, you're charging people to unclaim land? outrageous + else if (refund < 0.0) { + if (!Econ.deductMoney(player.getName(), -refund)) { + sendMessage("Unclaiming all faction land will cost "+Econ.moneyString(-refund)+", which you can't currently afford."); + return; + } + moneyBack = " It cost them "+Econ.moneyString(refund)+"."; + } + // no refund + else { + moneyBack = ""; + } + } + Board.unclaimAll(myFaction.getId()); - myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" unclaimed ALL of your factions land."); + myFaction.sendMessage(me.getNameAndRelevant(myFaction)+Conf.colorSystem+" unclaimed ALL of your factions land."+moneyBack); } } diff --git a/src/com/massivecraft/factions/commands/FRelationCommand.java b/src/com/massivecraft/factions/commands/FRelationCommand.java index bf5dfeeb..4001d361 100644 --- a/src/com/massivecraft/factions/commands/FRelationCommand.java +++ b/src/com/massivecraft/factions/commands/FRelationCommand.java @@ -46,7 +46,13 @@ public class FRelationCommand extends FBaseCommand { sendMessage("Nope! You can't declare a relation to yourself :)"); return; } - + + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay + double cost = whishedRelation.isAlly() ? Conf.econCostAlly : (whishedRelation.isEnemy() ? Conf.econCostEnemy : Conf.econCostNeutral); + if (!payForCommand(cost)) { + return; + } + myFaction.setRelationWish(otherFaction, whishedRelation); Relation currentRelation = myFaction.getRelation(otherFaction); ChatColor currentRelationColor = currentRelation.getColor(); diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 11bd1edf..3c6cb9f8 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -21,6 +21,7 @@ import org.bukkit.event.player.PlayerRespawnEvent; import com.massivecraft.factions.Board; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; import com.massivecraft.factions.FLocation; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; @@ -159,13 +160,14 @@ public class FactionsPlayerListener extends PlayerListener{ if (me.autoClaimEnabled()) { Faction myFaction = me.getFaction(); - FLocation flocation = new FLocation(me); + Faction otherFaction = Board.getFactionAt(to); + double cost = Econ.calculateClaimCost(myFaction.getLandRounded(), otherFaction.isNormal()); if (me.getRole().value < Role.MODERATOR.value) { me.sendMessage("You must be "+Role.MODERATOR+" to claim land."); me.enableAutoClaim(false); } - else if (Conf.worldsNoClaiming.contains(flocation.getWorldName())) { + else if (Conf.worldsNoClaiming.contains(to.getWorldName())) { me.sendMessage("Sorry, this world has land claiming disabled."); me.enableAutoClaim(false); } @@ -173,6 +175,11 @@ public class FactionsPlayerListener extends PlayerListener{ me.sendMessage("You can't claim more land! You need more power!"); me.enableAutoClaim(false); } + else if (!Econ.canAfford(player.getName(), cost)) { + String costString = Econ.moneyString(cost); + me.sendMessage("Claiming this land will cost "+costString+", which you can't currently afford."); + me.enableAutoClaim(false); + } else me.attemptClaim(false); } diff --git a/src/com/massivecraft/factions/listeners/FactionsServerListener.java b/src/com/massivecraft/factions/listeners/FactionsServerListener.java new file mode 100644 index 00000000..2e7f9460 --- /dev/null +++ b/src/com/massivecraft/factions/listeners/FactionsServerListener.java @@ -0,0 +1,39 @@ +package com.massivecraft.factions.listeners; + +import org.bukkit.plugin.Plugin; +import org.bukkit.event.server.ServerListener; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; + +import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Econ; +import com.massivecraft.factions.Factions; + +import com.iConomy.*; + + +public class FactionsServerListener extends ServerListener { + @Override + public void onPluginDisable(PluginDisableEvent event) { + if (Econ.iConomyHooked()) { + if (event.getPlugin().getDescription().getName().equals("iConomy")) { + Econ.iConomySet(null); + Factions.log("Un-hooked from iConomy."); + } + } + } + + @Override + public void onPluginEnable(PluginEnableEvent event) { + if (!Econ.iConomyHooked()) { + Plugin iConomy = Factions.instance.getServer().getPluginManager().getPlugin("iConomy"); + + if (iConomy != null) { + if (iConomy.isEnabled() && iConomy.getClass().getName().equals("com.iConomy.iConomy")) { + Econ.iConomySet((iConomy)iConomy); + Factions.log("Hooked into iConomy, "+(Conf.econIConomyEnabled ? "and interface is enabled" : "but interface is currently disabled (\"econIConomyEnabled\": false)")+"."); + } + } + } + } +} \ No newline at end of file diff --git a/src/plugin.yml b/src/plugin.yml index 362e1e7e..1ad3cb16 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -8,6 +8,7 @@ softdepend: - HeroChat - iChat - LocalAreaChat + - iConomy commands: f: description: All of the Factions commands