diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyEconomyHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyEconomyHandler.java index 438870324d..5956c3ab8c 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownyEconomyHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownyEconomyHandler.java @@ -285,6 +285,8 @@ public static boolean setBalance(String accountName, double amount, World world) * @return string containing the formatted balance */ public static String getFormattedBalance(double balance) { + if (!isActive()) + return String.valueOf(balance); String formattedBalance = economy.getFormattedBalance(balance); if (formattedBalance != null) { diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/BaseCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/BaseCommand.java index 393b05d30c..b46d0c15d0 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/BaseCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/BaseCommand.java @@ -1,6 +1,7 @@ package com.palmergames.bukkit.towny.command; import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.TownyEconomyHandler; import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.exceptions.NoPermissionException; import com.palmergames.bukkit.towny.exceptions.ResidentNPCException; @@ -390,4 +391,8 @@ public static void catchNPCResident(Resident resident) throws ResidentNPCExcepti if (resident.isNPC()) throw new ResidentNPCException(); } + + public static String prettyMoney(double cost) { + return TownyEconomyHandler.getFormattedBalance(cost); + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java index 94b7a37309..59d61a0f62 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/NationCommand.java @@ -945,8 +945,9 @@ public static void newNation(CommandSender sender, String name, Town capitalTown // If it isn't free to make a nation, send a confirmation. if (!noCharge && TownyEconomyHandler.isActive()) { // Test if they can pay. - if (!capitalTown.getAccount().canPayFromHoldings(TownySettings.getNewNationPrice())) - throw new TownyException(Translatable.of("msg_no_funds_new_nation2", TownySettings.getNewNationPrice())); + double cost = TownySettings.getNewNationPrice(); + if (!capitalTown.getAccount().canPayFromHoldings(cost)) + throw new TownyException(Translatable.of("msg_no_funds_new_nation2", cost)); final String finalName = filteredName; Confirmation.runOnAccept(() -> { @@ -959,9 +960,9 @@ public static void newNation(CommandSender sender, String name, Town capitalTown TownyMessaging.sendGlobalMessage(Translatable.of("msg_new_nation", sender.getName(), StringMgmt.remUnderscore(finalName))); }) - .setCost(new ConfirmationTransaction(TownySettings::getNewNationPrice, capitalTown.getAccount(), "New Nation Cost", - Translatable.of("msg_no_funds_new_nation2", TownySettings.getNewNationPrice()))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(TownySettings.getNewNationPrice()))) + .setCost(new ConfirmationTransaction(TownySettings::getNewNationPrice, capitalTown, "New Nation Cost", + Translatable.of("msg_no_funds_new_nation2", cost))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(sender); // Or, it is free, so just make the nation. @@ -1973,11 +1974,12 @@ private static void nationSetMapColor(CommandSender sender, Nation nation, Strin if (!TownySettings.getNationColorsMap().containsKey(color)) throw new TownyException(Translatable.of("msg_err_invalid_nation_map_color", TownySettings.getNationColorsMap().keySet().toString())); - if (TownySettings.getNationSetMapColourCost() > 0) + double cost = TownySettings.getNationSetMapColourCost(); + if (cost > 0) Confirmation .runOnAccept(() -> setNationMapColor(nation, color, admin, sender)) - .setTitle(Translatable.of("msg_confirm_purchase", TownySettings.getNationSetMapColourCost())) - .setCost(new ConfirmationTransaction(()-> TownySettings.getNationSetMapColourCost(), nation.getAccount(), "Cost of setting nation map color.")) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) + .setCost(new ConfirmationTransaction(() -> cost, nation, "Cost of setting nation map color.")) .sendTo(sender); else setNationMapColor(nation, color, admin, sender); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java index a67ce9d134..c040373a89 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/PlotCommand.java @@ -588,12 +588,12 @@ private void tryPlotSetType(Player player, Resident resident, TownBlock townBloc // Test if we can pay first to throw an exception. if (cost > 0 && TownyEconomyHandler.isActive() && !resident.getAccount().canPayFromHoldings(cost)) - throw new TownyException(Translatable.of("msg_err_cannot_afford_plot_set_type_cost", townBlockType, TownyEconomyHandler.getFormattedBalance(cost))); + throw new TownyException(Translatable.of("msg_err_cannot_afford_plot_set_type_cost", townBlockType, prettyMoney(cost))); // Handle payment via a confirmation to avoid suprise costs. if (cost > 0 && TownyEconomyHandler.isActive()) { Confirmation.runOnAccept(() -> { - TownyMessaging.sendMsg(resident, Translatable.of("msg_plot_set_cost", TownyEconomyHandler.getFormattedBalance(cost), townBlockType)); + TownyMessaging.sendMsg(resident, Translatable.of("msg_plot_set_cost", prettyMoney(cost), townBlockType)); try { townBlock.setType(townBlockType, resident); @@ -604,9 +604,9 @@ private void tryPlotSetType(Player player, Resident resident, TownBlock townBloc BukkitTools.fireEvent(new PlayerChangePlotTypeEvent(townBlockType, oldType, townBlock, player)); TownyMessaging.sendMsg(player, Translatable.of("msg_plot_set_type", townBlockType)); }) - .setCost(new ConfirmationTransaction(() -> cost, resident.getAccount(), String.format("Plot set to %s", townBlockType), - Translatable.of("msg_err_cannot_afford_plot_set_type_cost", townBlockType, TownyEconomyHandler.getFormattedBalance(cost)))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(cost))) + .setCost(new ConfirmationTransaction(() -> cost, resident, String.format("Plot set to %s", townBlockType), + Translatable.of("msg_err_cannot_afford_plot_set_type_cost", townBlockType, prettyMoney(cost)))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(BukkitTools.getPlayerExact(resident.getName())); // No cost or economy so no confirmation. @@ -648,20 +648,20 @@ public void parsePlotSetOutpost(Player player, Resident resident, TownBlock town // Throws a TownyException with message if outpost should not be set. OutpostUtil.OutpostTests(town, resident, townyWorld, key, resident.isAdmin(), true); - if (TownyEconomyHandler.isActive() && TownySettings.getOutpostCost() > 0) { + if (TownySettings.getOutpostCost() > 0) { // Create a confirmation for setting outpost. Confirmation.runOnAccept(() -> { // Set the outpost spawn and display feedback. town.addOutpostSpawn(player.getLocation()); - TownyMessaging.sendMsg(player, Translatable.of("msg_plot_set_cost", TownyEconomyHandler.getFormattedBalance(TownySettings.getOutpostCost()), Translatable.of("outpost"))); + TownyMessaging.sendMsg(player, Translatable.of("msg_plot_set_cost", prettyMoney(TownySettings.getOutpostCost()), Translatable.of("outpost"))); }) - .setCost(new ConfirmationTransaction(() -> TownySettings.getOutpostCost(), town.getAccount(), "PlotSetOutpost", Translatable.of("msg_err_cannot_afford_to_set_outpost"))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(TownySettings.getOutpostCost()))) + .setCost(new ConfirmationTransaction(() -> TownySettings.getOutpostCost(), town, "PlotSetOutpost", Translatable.of("msg_err_cannot_afford_to_set_outpost"))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(TownySettings.getOutpostCost()))) .sendTo(player); } else { // Set the outpost spawn and display feedback with no cost confirmation. town.addOutpostSpawn(player.getLocation()); - TownyMessaging.sendMsg(player, Translatable.of("msg_plot_set_cost", TownyEconomyHandler.getFormattedBalance(TownySettings.getOutpostCost()), Translatable.of("outpost"))); + TownyMessaging.sendMsg(player, Translatable.of("msg_plot_set_cost", prettyMoney(TownySettings.getOutpostCost()), Translatable.of("outpost"))); } } @@ -994,7 +994,7 @@ public void setPlotForSale(Resident resident, WorldCoord worldCoord, double forS if (forSale != -1) { Translatable message = TownyEconomyHandler.isActive() - ? Translatable.of("msg_plot_for_sale_amount", resident.getName(), worldCoord.toString(), TownyEconomyHandler.getFormattedBalance(townBlock.getPlotPrice())) + ? Translatable.of("msg_plot_for_sale_amount", resident.getName(), worldCoord.toString(), prettyMoney(townBlock.getPlotPrice())) : Translatable.of("msg_plot_for_sale", resident.getName(), worldCoord.toString()); TownyMessaging.sendPrefixedTownMessage(townBlock.getTownOrNull(), message); @@ -1342,7 +1342,7 @@ public void parsePlotGroupForSale(String[] split, Resident resident, TownBlock t group.save(); Translatable message = TownyEconomyHandler.isActive() - ? Translatable.of("msg_player_put_group_up_for_sale_amount", player.getName(), group.getName(), TownyEconomyHandler.getFormattedBalance(group.getPrice())) + ? Translatable.of("msg_player_put_group_up_for_sale_amount", player.getName(), group.getName(), prettyMoney(group.getPrice())) : Translatable.of("msg_player_put_group_up_for_sale", player.getName(), group.getName()); TownyMessaging.sendPrefixedTownMessage(town, message); @@ -1576,7 +1576,7 @@ public void parsePlotGroupSetTownBlockType(String[] split, Resident resident, To double cost = type.getCost() * plotGroupTownBlocks.size(); // Test if we can pay first to throw an exception. if (cost > 0 && TownyEconomyHandler.isActive() && !resident.getAccount().canPayFromHoldings(cost)) - throw new TownyException(Translatable.of("msg_err_cannot_afford_plot_set_type_cost", type, TownyEconomyHandler.getFormattedBalance(cost))); + throw new TownyException(Translatable.of("msg_err_cannot_afford_plot_set_type_cost", type, prettyMoney(cost))); // Handle payment via a confirmation to avoid suprise costs. if (cost > 0 && TownyEconomyHandler.isActive()) { @@ -1584,7 +1584,7 @@ public void parsePlotGroupSetTownBlockType(String[] split, Resident resident, To if (townBlock.getPlotObjectGroup() == null) return; - TownyMessaging.sendMsg(resident, Translatable.of("msg_plot_set_cost", TownyEconomyHandler.getFormattedBalance(cost), type)); + TownyMessaging.sendMsg(resident, Translatable.of("msg_plot_set_cost", prettyMoney(cost), type)); for (TownBlock tb : townBlock.getPlotObjectGroup().getTownBlocks()) { try { @@ -1597,11 +1597,9 @@ public void parsePlotGroupSetTownBlockType(String[] split, Resident resident, To } TownyMessaging.sendMsg(player, Translatable.of("msg_set_group_type_to_x", type)); }) - .setCost(new ConfirmationTransaction(() -> type.getCost() * plotGroupTownBlocks.size(), - resident.getAccount(), - String.format("Plot group (" + plotGroupTownBlocks.size() + ") set to %s", type), - Translatable.of("msg_err_cannot_afford_plot_set_type_cost", type, TownyEconomyHandler.getFormattedBalance(cost)))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(cost))) + .setCost(new ConfirmationTransaction(() -> cost, resident, String.format("Plot group (%s) set to %s", plotGroupTownBlocks.size(), type), + Translatable.of("msg_err_cannot_afford_plot_set_type_cost", type, prettyMoney(cost)))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(BukkitTools.getPlayerExact(resident.getName())); // No cost or economy so no confirmation. } else { @@ -1837,7 +1835,7 @@ private void continuePlotClaimProcess(List selection, Resident resid PlotGroup group = tb.getPlotObjectGroup(); if (TownyEconomyHandler.isActive() && (!resident.getAccount().canPayFromHoldings(group.getPrice()))) - throw new TownyException(Translatable.of("msg_no_funds_claim_plot_group", group.getTownBlocks().size(), TownyEconomyHandler.getFormattedBalance(group.getPrice()))); + throw new TownyException(Translatable.of("msg_no_funds_claim_plot_group", group.getTownBlocks().size(), prettyMoney(group.getPrice()))); // Add the confirmation for claiming a plot group. Confirmation.runOnAccept(() -> { @@ -1849,7 +1847,7 @@ private void continuePlotClaimProcess(List selection, Resident resid // Execute the plot claim. new PlotClaim(Towny.getPlugin(), player, resident, coords, true, false, true).start(); }) - .setTitle(Translatable.of("msg_plot_group_claim_confirmation", group.getTownBlocks().size()).append(" ").append(TownyEconomyHandler.getFormattedBalance(group.getPrice())).append(". ").append(Translatable.of("are_you_sure_you_want_to_continue"))) + .setTitle(Translatable.of("msg_plot_group_claim_confirmation", group.getTownBlocks().size()).append(" ").append(prettyMoney(group.getPrice())).append(". ").append(Translatable.of("are_you_sure_you_want_to_continue"))) .sendTo(player); return; @@ -1877,7 +1875,7 @@ private void continuePlotClaimProcess(List selection, Resident resid throw new TownyException(Translatable.of("msg_max_plot_own", maxPlots)); if (TownyEconomyHandler.isActive() && (!resident.getAccount().canPayFromHoldings(cost))) - throw new TownyException(Translatable.of("msg_no_funds_claim_plot", TownyEconomyHandler.getFormattedBalance(cost))); + throw new TownyException(Translatable.of("msg_no_funds_claim_plot", prettyMoney(cost))); if (cost != 0) { final List finalSelection = selection; @@ -1885,7 +1883,7 @@ private void continuePlotClaimProcess(List selection, Resident resid // Start the claim task new PlotClaim(plugin, player, resident, finalSelection, true, false, false).start(); }) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(cost))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(player); } else { // Start the claim task diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java index 88e191a5ee..ffad445da4 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/ResidentCommand.java @@ -389,7 +389,7 @@ private void parseResidentJail(Player player, String[] split) throws TownyExcept TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_unable_to_pay_bail")); } }) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(cost))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(player); } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java index 1f1ec4efbb..e92976ff3a 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownCommand.java @@ -1042,7 +1042,7 @@ private void townPlots(CommandSender sender, String[] args) throws TownyExceptio String plotTypeLine = translator.of("msg_town_plots_type_line", type.getFormattedName(), residentOwned, typeCache.getNumTownBlocks(type, CacheType.FORSALE), typeCache.getNumTownBlocks(type, CacheType.ALL)); if (TownyEconomyHandler.isActive()) - plotTypeLine += translator.of("msg_town_plots_type_line_revenue", TownyEconomyHandler.getFormattedBalance(residentOwned * type.getTax(town))); + plotTypeLine += translator.of("msg_town_plots_type_line_revenue", prettyMoney(residentOwned * type.getTax(town))); out.add(plotTypeLine); } out.add(Translatable.of("msg_town_plots_revenue_disclaimer").forLocale(player)); @@ -1175,7 +1175,7 @@ public void listTowns(CommandSender sender, String[] split) throws TownyExceptio Translatable spawnCost = Translatable.of("msg_spawn_cost_free"); if (TownyEconomyHandler.isActive()) - spawnCost = Translatable.of("msg_spawn_cost", TownyEconomyHandler.getFormattedBalance(town.getSpawnCost())); + spawnCost = Translatable.of("msg_spawn_cost", prettyMoney(town.getSpawnCost())); townName = townName.hoverEvent(HoverEvent.showText(Translatable.of("msg_click_spawn", town).append("\n").append(spawnCost).locale(sender).component())); output.add(Pair.pair(town.getUUID(), townName)); @@ -1419,7 +1419,7 @@ private static void townToggleNeutral(CommandSender sender, boolean admin, Town // If they setting neutral status on send a message confirming they paid something, if they did. if (peacefulState && TownyEconomyHandler.isActive() && cost > 0) { town.getAccount().withdraw(cost, "Peaceful Town Cost"); - TownyMessaging.sendMsg(sender, Translatable.of("msg_you_paid", TownyEconomyHandler.getFormattedBalance(cost))); + TownyMessaging.sendMsg(sender, Translatable.of("msg_you_paid", prettyMoney(cost))); } // Set the toggle setting. @@ -2258,12 +2258,12 @@ public static void townSetName(CommandSender sender, String[] split, Town town) if(TownyEconomyHandler.isActive() && TownySettings.getTownRenameCost() > 0) { if (!town.getAccount().canPayFromHoldings(TownySettings.getTownRenameCost())) - throw new TownyException(Translatable.of("msg_err_no_money", TownyEconomyHandler.getFormattedBalance(TownySettings.getTownRenameCost()))); + throw new TownyException(Translatable.of("msg_err_no_money", prettyMoney(TownySettings.getTownRenameCost()))); final Town finalTown = town; final String finalName = name; Confirmation.runOnAccept(() -> townRename(sender, finalTown, finalName)) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(TownySettings.getTownRenameCost()))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(TownySettings.getTownRenameCost()))) .sendTo(sender); } else { townRename(sender, town, name); @@ -2413,8 +2413,8 @@ public static void townSetMapColor(CommandSender sender, String[] split, Town to if (TownySettings.getTownSetMapColourCost() > 0) Confirmation .runOnAccept(()-> setTownMapColor(town, color)) - .setTitle(Translatable.of("msg_confirm_purchase", TownySettings.getTownSetMapColourCost())) - .setCost(new ConfirmationTransaction(()-> TownySettings.getTownSetMapColourCost(), town.getAccount(), "Cost of setting town map color.")) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(TownySettings.getTownSetMapColourCost()))) + .setCost(new ConfirmationTransaction(TownySettings::getTownSetMapColourCost, town, "Cost of setting town map color.")) .sendTo(sender); else setTownMapColor(town, color); @@ -2435,7 +2435,7 @@ public static void townSetTaxPercent(CommandSender sender, String[] split, Town town.setMaxPercentTaxAmount(Double.parseDouble(split[1])); - TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_town_set_tax_max_percent_amount", sender.getName(), TownyEconomyHandler.getFormattedBalance(town.getMaxPercentTaxAmount()))); + TownyMessaging.sendPrefixedTownMessage(town, Translatable.of("msg_town_set_tax_max_percent_amount", sender.getName(), prettyMoney(town.getMaxPercentTaxAmount()))); } private static void parseTownBaltop(Player player, Town town) throws TownyException { @@ -2447,7 +2447,7 @@ private static void parseTownBaltop(Player player, Town town) throws TownyExcept int i = 0; for (Resident res : residents) - sb.append(Translatable.of("msg_baltop_book_format", ++i, res.getName(), TownyEconomyHandler.getFormattedBalance(res.getAccount().getCachedBalance())).forLocale(player) + "\n"); + sb.append(Translatable.of("msg_baltop_book_format", ++i, res.getName(), prettyMoney(res.getAccount().getCachedBalance())).forLocale(player) + "\n"); ItemStack book = BookFactory.makeBook("Town Baltop", town.getName(), sb.toString()); plugin.getScheduler().run(player, () -> player.openBook(book)); @@ -2472,7 +2472,7 @@ else if (TownySettings.isBonusBlocksPerTownLevel() && TownySettings.getMaxBonusB if (split.length == 0 || !split[0].equalsIgnoreCase("bonus")) { TownyMessaging.sendMessage(sender, ChatTools.formatTitle("/town buy")); String line = Colors.Yellow + "[Purchased Bonus] " + Colors.Green + "Cost: " + Colors.LightGreen + "%s" + Colors.Gray + " | " + Colors.Green + "Max: " + Colors.LightGreen + "%d"; - TownyMessaging.sendMessage(sender, String.format(line, TownyEconomyHandler.getFormattedBalance(town.getBonusBlockCost()), TownySettings.getMaxPurchasedBlocks(town))); + TownyMessaging.sendMessage(sender, String.format(line, prettyMoney(town.getBonusBlockCost()), TownySettings.getMaxPurchasedBlocks(town))); if (TownySettings.getPurchasedBonusBlocksIncreaseValue() != 1.0) TownyMessaging.sendMessage(sender, Colors.Green + "Cost Increase per TownBlock: " + Colors.LightGreen + "+" + new DecimalFormat("##.##%").format(TownySettings.getPurchasedBonusBlocksIncreaseValue()-1)); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("", "/town buy", "bonus [n]", "")); @@ -2514,16 +2514,16 @@ public static void townBuyBonusTownBlocks(Town town, int inputN, CommandSender s double cost = town.getBonusBlockCostN(n); // Test if the town can pay and throw economy exception if not. if (!town.getAccount().canPayFromHoldings(cost)) - throw new TownyException(Translatable.of("msg_no_funds_to_buy", n, Translatable.of("bonus_townblocks"), TownyEconomyHandler.getFormattedBalance(cost))); + throw new TownyException(Translatable.of("msg_no_funds_to_buy", n, Translatable.of("bonus_townblocks"), prettyMoney(cost))); Confirmation.runOnAccept(() -> { town.addPurchasedBlocks(n); - TownyMessaging.sendMsg(sender, Translatable.of("msg_buy", n, Translatable.of("bonus_townblocks"), TownyEconomyHandler.getFormattedBalance(cost))); + TownyMessaging.sendMsg(sender, Translatable.of("msg_buy", n, Translatable.of("bonus_townblocks"), prettyMoney(cost))); town.save(); }) - .setCost(new ConfirmationTransaction(() -> cost, town.getAccount(), String.format("Town Buy Bonus (%d)", n), - Translatable.of("msg_no_funds_to_buy", n, Translatable.of("bonus_townblocks"), TownyEconomyHandler.getFormattedBalance(cost)))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(cost))) + .setCost(new ConfirmationTransaction(() -> cost, town, String.format("Town Buy Bonus (%d)", n), + Translatable.of("msg_no_funds_to_buy", n, Translatable.of("bonus_townblocks"), prettyMoney(cost)))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) .sendTo(sender); } @@ -2587,8 +2587,9 @@ public static void newTown(Player player, String name, Resident resident, boolea } // Test if the resident can afford the town. - if (!resident.getAccount().canPayFromHoldings(TownySettings.getNewTownPrice())) - throw new TownyException(Translatable.of("msg_no_funds_new_town2", (resident.getName().equals(player.getName()) ? Translatable.of("msg_you") : resident.getName()), TownySettings.getNewTownPrice())); + double cost = TownySettings.getNewTownPrice(); + if (!resident.getAccount().canPayFromHoldings(cost)) + throw new TownyException(Translatable.of("msg_no_funds_new_town2", (resident.getName().equals(player.getName()) ? Translatable.of("msg_you") : resident.getName()), cost)); // Send a confirmation before taking their money and throwing the PreNewTownEvent. final String finalName = name; @@ -2603,9 +2604,9 @@ public static void newTown(Player player, String name, Resident resident, boolea } }) .setCancellableEvent(new PreNewTownEvent(player, name, spawnLocation)) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(TownySettings.getNewTownPrice()))) - .setCost(new ConfirmationTransaction(TownySettings::getNewTownPrice, resident.getAccount(), "New Town Cost", - Translatable.of("msg_no_funds_new_town2", (resident.getName().equals(player.getName()) ? Translatable.of("msg_you") : resident.getName()), TownySettings.getNewTownPrice()))) + .setTitle(Translatable.of("msg_confirm_purchase", prettyMoney(cost))) + .setCost(new ConfirmationTransaction(() -> cost, resident, "New Town Cost", + Translatable.of("msg_no_funds_new_town2", (resident.getName().equals(player.getName()) ? Translatable.of("msg_you") : resident.getName()), prettyMoney(cost)))) .sendTo(player); } @@ -2751,7 +2752,7 @@ public static void townRename(CommandSender sender, Town town, String newName) { double renameCost = TownySettings.getTownRenameCost(); if (TownyEconomyHandler.isActive() && renameCost > 0 && !town.getAccount().withdraw(renameCost, String.format("Town renamed to: %s", newName))) { - TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_no_money", TownyEconomyHandler.getFormattedBalance(renameCost))); + TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_no_money", prettyMoney(renameCost))); return; } @@ -3637,7 +3638,7 @@ else if (finalSelection.size() == 1) if (!town.getAccount().canPayFromHoldings(blockCost)) { double missingAmount = blockCost - town.getAccount().getHoldingBalance(); - throw new TownyException(Translatable.of("msg_no_funds_claim2", finalSelection.size(), TownyEconomyHandler.getFormattedBalance(blockCost), TownyEconomyHandler.getFormattedBalance(missingAmount), new DecimalFormat("#").format(missingAmount))); + throw new TownyException(Translatable.of("msg_no_funds_claim2", finalSelection.size(), prettyMoney(blockCost), prettyMoney(missingAmount), new DecimalFormat("#").format(missingAmount))); } town.getAccount().withdraw(blockCost, String.format("Town Claim (%d) by %s", finalSelection.size(), player.getName())); @@ -3721,19 +3722,19 @@ public static void parseTownUnclaimCommand(Player player, String[] split) throws if (TownyEconomyHandler.isActive() && TownySettings.getClaimRefundPrice() < 0) { double cost = Math.abs(TownySettings.getClaimRefundPrice() * selection.size()); if (!town.getAccount().canPayFromHoldings(cost)) { - TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_your_town_cannot_afford_unclaim", TownyEconomyHandler.getFormattedBalance(cost))); + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_your_town_cannot_afford_unclaim", prettyMoney(cost))); return; } List finalSelection = selection; Confirmation.runOnAccept(()-> { if (!town.getAccount().canPayFromHoldings(cost)) { - TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_your_town_cannot_afford_unclaim", TownyEconomyHandler.getFormattedBalance(cost))); + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_your_town_cannot_afford_unclaim", prettyMoney(cost))); return; } // Set the area to unclaim plugin.getScheduler().runAsync(new TownClaim(plugin, player, town, finalSelection, false, false, false)); }) - .setTitle(Translatable.of("confirmation_unclaiming_costs", TownyEconomyHandler.getFormattedBalance(cost))) + .setTitle(Translatable.of("confirmation_unclaiming_costs", prettyMoney(cost))) .sendTo(player); return; } @@ -3751,7 +3752,7 @@ private static void parseTownUnclaimAllCommand(Player player, Town town, Residen if (TownyEconomyHandler.isActive() && TownySettings.getClaimRefundPrice() < 0) { int numTownBlocks = town.getTownBlocks().size() - (town.hasHomeBlock() ? 1 : 0); - String formattedCost = TownyEconomyHandler.getFormattedBalance(Math.abs(TownySettings.getClaimRefundPrice() * numTownBlocks)); + String formattedCost = prettyMoney(Math.abs(TownySettings.getClaimRefundPrice() * numTownBlocks)); // Unclaiming will cost the player money because of a negative refund price. Have them confirm the cost. Confirmation .runOnAcceptAsync(new TownClaim(plugin, player, town, null, false, false, false)) @@ -3825,11 +3826,11 @@ private void parseTownTakeoverClaimCommand(Player player) throws TownyException throw new TownyException(Translatable.of("msg_err_another_plugin_cancelled_takeover")); double cost = TownySettings.getTakeoverClaimPrice(); - String costSlug = !TownyEconomyHandler.isActive() || cost <= 0 ? Translatable.of("msg_spawn_cost_free").forLocale(player) : TownyEconomyHandler.getFormattedBalance(cost); + String costSlug = !TownyEconomyHandler.isActive() || cost <= 0 ? Translatable.of("msg_spawn_cost_free").forLocale(player) : prettyMoney(cost); String townName = wc.getTownOrNull().getName(); Confirmation.runOnAccept(() -> Bukkit.getScheduler().runTask(plugin, new TownClaim(plugin, player, town, Arrays.asList(wc), false, true, false))) .setTitle(Translatable.of("confirmation_you_are_about_to_take_over_a_claim", townName, costSlug)) - .setCost(new ConfirmationTransaction(() -> cost, town.getAccount(), "Takeover Claim (" + wc.toString() + ") from " + townName + ".")) + .setCost(new ConfirmationTransaction(() -> cost, town, "Takeover Claim (" + wc.toString() + ") from " + townName + ".")) .sendTo(player); } @@ -3972,10 +3973,6 @@ private static double[] getMergeCosts(Town remainingTown, Town succumbingTown, b return mergeCost; } - private static String prettyMoney(double cost) { - return TownyEconomyHandler.getFormattedBalance(cost); - } - private static void sendTownMergeRequest(CommandSender sender, Town remainingTown, Town succumbingTown, double cost) { TownyMessaging.sendMsg(sender, Translatable.of("msg_town_merge_request_sent", succumbingTown.getName())); TownyMessaging.sendMsg(succumbingTown.getMayor(), Translatable.of("msg_town_merge_request_received", remainingTown.getName(), sender.getName(), remainingTown.getName())); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java index fe6bd9fff1..75d7f6932f 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/command/TownyCommand.java @@ -412,10 +412,10 @@ public List getTownyPrices(Town town, Translator translator) { nation = town.getNationOrNull(); output.add(ChatTools.formatTitle(translator.of("towny_prices_title"))); - output.add(translator.of("towny_prices_town_nation", getMoney(TownySettings.getNewTownPrice()), getMoney(TownySettings.getNewNationPrice()))); - output.add(translator.of("towny_prices_reclaim", getMoney(TownySettings.getEcoPriceReclaimTown()))); + output.add(translator.of("towny_prices_town_nation", prettyMoney(TownySettings.getNewTownPrice()), prettyMoney(TownySettings.getNewNationPrice()))); + output.add(translator.of("towny_prices_reclaim", prettyMoney(TownySettings.getEcoPriceReclaimTown()))); if (town != null) { - output.add(translator.of("towny_prices_upkeep", getMoney(TownySettings.getTownUpkeepCost(town)), getMoney(TownySettings.getNationUpkeepCost(nation)))); + output.add(translator.of("towny_prices_upkeep", prettyMoney(TownySettings.getTownUpkeepCost(town)), prettyMoney(TownySettings.getNationUpkeepCost(nation)))); output.add(translator.of("towny_prices_upkeep_based_on", (TownySettings.isUpkeepByPlot() ? translator.of("towny_prices_upkeep_num_plots") : translator.of("towny_prices_upkeep_town_level")))); String upkeepformula; if (TownySettings.isNationUpkeepPerPlot()) @@ -426,36 +426,36 @@ else if (TownySettings.isNationUpkeepPerTown()) upkeepformula = translator.of("towny_prices_upkeep_nation_level"); output.add(translator.of("towny_prices_nation_upkeep_based_on", upkeepformula)); if (town.isOverClaimed() && TownySettings.getUpkeepPenalty() > 0) - output.add(translator.of("towny_prices_overclaimed_upkeep", getMoney(TownySettings.getTownPenaltyUpkeepCost(town)))); + output.add(translator.of("towny_prices_overclaimed_upkeep", prettyMoney(TownySettings.getTownPenaltyUpkeepCost(town)))); if (TownySettings.getUpkeepPenalty() > 0 ) output.add(translator.of("towny_prices_overclaimed_based_on", (TownySettings.isUpkeepPenaltyByPlot() ? translator.of("towny_prices_overclaimed_num_plots") : translator.of("towny_prices_overclaimed_flat_cost")), TownySettings.getUpkeepPenalty())); - output.add(translator.of("towny_prices_town_merge", getMoney(TownySettings.getBaseCostForTownMerge()), getMoney(town.getTownBlockCost()/2))); - output.add(translator.of("towny_prices_claiming_townblock", getMoney(town.getTownBlockCost()) + + output.add(translator.of("towny_prices_town_merge", prettyMoney(TownySettings.getBaseCostForTownMerge()), prettyMoney(town.getTownBlockCost()/2))); + output.add(translator.of("towny_prices_claiming_townblock", prettyMoney(town.getTownBlockCost()) + (Double.valueOf(TownySettings.getClaimPriceIncreaseValue()).equals(1.0) ? "" : translator.of("towny_prices_claiming_townblock_increase", new DecimalFormat("##.##%").format(TownySettings.getClaimPriceIncreaseValue()-1))))); - output.add(translator.of("towny_prices_claiming_outposts", getMoney(TownySettings.getOutpostCost()))); + output.add(translator.of("towny_prices_claiming_outposts", prettyMoney(TownySettings.getOutpostCost()))); } if (town == null) - output.add(translator.of("towny_prices_upkeep", getMoney(TownySettings.getTownUpkeep()), getMoney(TownySettings.getNationUpkeep()))); + output.add(translator.of("towny_prices_upkeep", prettyMoney(TownySettings.getTownUpkeep()), prettyMoney(TownySettings.getNationUpkeep()))); if (town != null) { output.add(translator.of("towny_prices_townname", town.getFormattedName())); - output.add(translator.of("towny_prices_price_plot", getMoney(town.getPlotPrice()),getMoney(TownySettings.getOutpostCost()))); - output.add(translator.of("towny_prices_price_shop", getMoney(town.getCommercialPlotPrice()), getMoney(town.getEmbassyPlotPrice()))); + output.add(translator.of("towny_prices_price_plot", prettyMoney(town.getPlotPrice()),prettyMoney(TownySettings.getOutpostCost()))); + output.add(translator.of("towny_prices_price_shop", prettyMoney(town.getCommercialPlotPrice()), prettyMoney(town.getEmbassyPlotPrice()))); - output.add(translator.of("towny_prices_taxes_plot", (town.isTaxPercentage()? town.getTaxes() + "%" : getMoney(town.getTaxes())), getMoney(town.getPlotTax()))); - output.add(translator.of("towny_prices_taxes_shop", getMoney(town.getCommercialPlotTax()), getMoney(town.getEmbassyPlotTax()))); - output.add(translator.of("towny_prices_town_neutral_tax", getMoney(TownySettings.getTownNeutralityCost(town)))); + output.add(translator.of("towny_prices_taxes_plot", (town.isTaxPercentage()? town.getTaxes() + "%" : prettyMoney(town.getTaxes())), prettyMoney(town.getPlotTax()))); + output.add(translator.of("towny_prices_taxes_shop", prettyMoney(town.getCommercialPlotTax()), prettyMoney(town.getEmbassyPlotTax()))); + output.add(translator.of("towny_prices_town_neutral_tax", prettyMoney(TownySettings.getTownNeutralityCost(town)))); output.add(translator.of("towny_prices_plots")); List townBlockTypes = new ArrayList<>(TownBlockTypeHandler.getTypes().values()); for (int i = 0; i < townBlockTypes.size(); i++) { if (i == townBlockTypes.size() - 1) - output.add(translator.of("towny_prices_type_single", townBlockTypes.get(i).getFormattedName(), getMoney(townBlockTypes.get(i).getCost()))); + output.add(translator.of("towny_prices_type_single", townBlockTypes.get(i).getFormattedName(), prettyMoney(townBlockTypes.get(i).getCost()))); else { output.add(translator.of("towny_prices_type_double", - townBlockTypes.get(i).getFormattedName(), getMoney(townBlockTypes.get(i).getCost()), - townBlockTypes.get(i+1).getFormattedName(), getMoney(townBlockTypes.get(i+1).getCost()) + townBlockTypes.get(i).getFormattedName(), prettyMoney(townBlockTypes.get(i).getCost()), + townBlockTypes.get(i+1).getFormattedName(), prettyMoney(townBlockTypes.get(i+1).getCost()) )); i++; @@ -464,16 +464,12 @@ else if (TownySettings.isNationUpkeepPerTown()) if (nation != null) { output.add(translator.of("towny_prices_nationname", nation.getFormattedName())); - output.add(translator.of("towny_prices_nation_tax", (nation.isTaxPercentage() ? nation.getTaxes() + "%" : getMoney(nation.getTaxes())), getMoney(TownySettings.getNationNeutralityCost(nation)))); + output.add(translator.of("towny_prices_nation_tax", (nation.isTaxPercentage() ? nation.getTaxes() + "%" : prettyMoney(nation.getTaxes())), prettyMoney(TownySettings.getNationNeutralityCost(nation)))); } } return output; } - - private String getMoney(double cost) { - return TownyEconomyHandler.getFormattedBalance(cost); - } - + public List getTopBankBalance(final List governments) { final int maxListing = TownySettings.getTownyTopSize(); final List output = new ArrayList<>(); @@ -488,7 +484,7 @@ public List getTopBankBalance(final List governments) { if (maxListing != -1 && index > maxListing) { break; } - output.add(String.format(Colors.LightGray + "%-20s " + Colors.Gold + "|" + Colors.Blue + " %s", gov.getFormattedName(), getMoney(gov.getAccount().getCachedBalance()))); + output.add(String.format(Colors.LightGray + "%-20s " + Colors.Gold + "|" + Colors.Blue + " %s", gov.getFormattedName(), prettyMoney(gov.getAccount().getCachedBalance()))); } return output; } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationHandler.java b/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationHandler.java index f93c5b4c85..25ddd466c1 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationHandler.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationHandler.java @@ -141,9 +141,9 @@ public static void acceptConfirmation(CommandSender sender) { // Determine the cost, done in this phase in case the cost could be manipulated before confirming. transaction.supplyCost(); double cost = transaction.getCost(); + Account payee = transaction.getPayee(); // Can they pay the cost? - if (cost > 0) { - Account payee = transaction.getPayee(); + if (cost > 0 && payee != null) { if (!payee.canPayFromHoldings(cost)) { TownyMessaging.sendErrorMsg(sender, transaction.getInsufficientFundsMessage()); TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_you_need_x_to_pay", cost)); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationTransaction.java b/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationTransaction.java index 490f9b8f43..da0b6927ee 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationTransaction.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/confirmations/ConfirmationTransaction.java @@ -2,7 +2,10 @@ import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; + import com.palmergames.bukkit.towny.TownyEconomyHandler; +import com.palmergames.bukkit.towny.object.EconomyHandler; import com.palmergames.bukkit.towny.object.Translatable; import com.palmergames.bukkit.towny.object.economy.Account; @@ -17,15 +20,15 @@ public class ConfirmationTransaction { * A transaction which must succeed for a Confirmation to complete. * * @param costSupplier cost of the transaction. - * @param payee Account which will have to pay. + * @param townyObject EconomyHandler which will have to pay, this will be a Resident, Town or Nation. * @param loggedMessage The message logged in the money.csv file. * @param insufficientFundsMessage Transatable which will display the cannot pay message. */ - public ConfirmationTransaction(Supplier costSupplier, Account payee, String loggedMessage, Translatable insufficientFundsMessage) { + public ConfirmationTransaction(Supplier costSupplier, EconomyHandler townyObject, String loggedMessage, Translatable insufficientFundsMessage) { this.costSupplier = costSupplier; - this.payee = payee; this.loggedMessage = loggedMessage; this.insufficientFundsMessage = insufficientFundsMessage; + this.payee = !TownyEconomyHandler.isActive() ? null : townyObject.getAccount(); } /** @@ -33,14 +36,14 @@ public ConfirmationTransaction(Supplier costSupplier, Account payee, Str * Uses the default no money error message. * * @param costSupplier cost of the transaction. - * @param payee Account which will have to pay. + * @param townyObject EconomyHandler which will have to pay, this will be a Resident, Town or Nation. * @param loggedMessage The message logged in the money.csv file. */ - public ConfirmationTransaction(Supplier costSupplier, Account payee, String loggedMessage) { + public ConfirmationTransaction(Supplier costSupplier, EconomyHandler townyObject, String loggedMessage) { this.costSupplier = costSupplier; - this.payee = payee; this.loggedMessage = loggedMessage; this.insufficientFundsMessage = null; + this.payee = !TownyEconomyHandler.isActive() ? null : townyObject.getAccount(); } public void supplyCost() { @@ -51,6 +54,7 @@ public double getCost() { return cost; } + @Nullable public Account getPayee() { return payee; } @@ -62,4 +66,38 @@ public String getLoggedMessage() { public Translatable getInsufficientFundsMessage() { return insufficientFundsMessage != null ? insufficientFundsMessage : Translatable.of("msg_err_no_money", TownyEconomyHandler.getFormattedBalance(getCost())); } + + /** + * A transaction which must succeed for a Confirmation to complete. + * + * @deprecated since 0.100.0.10 use {@link #ConfirmationTransaction(Supplier, EconomyHandler, String, Translatable)} instead. + * @param costSupplier cost of the transaction. + * @param payee Account which will have to pay. + * @param loggedMessage The message logged in the money.csv file. + * @param insufficientFundsMessage Transatable which will display the cannot pay message. + */ + @Deprecated + public ConfirmationTransaction(Supplier costSupplier, Account payee, String loggedMessage, Translatable insufficientFundsMessage) { + this.costSupplier = costSupplier; + this.payee = payee; + this.loggedMessage = loggedMessage; + this.insufficientFundsMessage = insufficientFundsMessage; + } + + /** + * A transaction which must succeed for a Confirmation to complete. + * Uses the default no money error message. + * + * @deprecated since 0.100.0.10 use {@link #ConfirmationTransaction(Supplier, EconomyHandler, String)} instead. + * @param costSupplier cost of the transaction. + * @param payee Account which will have to pay. + * @param loggedMessage The message logged in the money.csv file. + */ + @Deprecated + public ConfirmationTransaction(Supplier costSupplier, Account payee, String loggedMessage) { + this.costSupplier = costSupplier; + this.payee = payee; + this.loggedMessage = loggedMessage; + this.insufficientFundsMessage = null; + } } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java index e2fb73ebf1..506d7a9a19 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/TownRuinUtil.java @@ -153,14 +153,11 @@ public static void processRuinedTownReclaimRequest(Player player) { if (TownySettings.getTownRuinsMinDurationHours() - getTimeSinceRuining(town) > 0) throw new TownyException(Translatable.of("msg_err_cannot_reclaim_town_yet", TownySettings.getTownRuinsMinDurationHours() - getTimeSinceRuining(town))); - if (TownyEconomyHandler.isActive() && townReclaimCost > 0) { - Confirmation.runOnAccept(() -> reclaimTown(resident, town)) - .setCost(new ConfirmationTransaction(() -> townReclaimCost, resident.getAccount(), "Cost of town reclaim.", Translatable.of("msg_insuf_funds"))) - .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(townReclaimCost))) - .sendTo(player); - } else { - reclaimTown(resident, town); - } + //Ask them to confirm they want to reclaim the town. + Confirmation.runOnAccept(() -> reclaimTown(resident, town)) + .setCost(new ConfirmationTransaction(() -> townReclaimCost, resident, "Cost of town reclaim.", Translatable.of("msg_insuf_funds"))) + .setTitle(Translatable.of("msg_confirm_purchase", TownyEconomyHandler.getFormattedBalance(townReclaimCost))) + .sendTo(player); } catch (TownyException e) { TownyMessaging.sendErrorMsg(player, e.getMessage(player)); }