diff --git a/pom.xml b/pom.xml index 6c6537d..3c96b0c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 21 UTF-8 full - 0.2.0 + 0.2.4 2.0.1 2.0.0 2.0.1 diff --git a/src/main/java/net/tfminecraft/simplefactions/managers/FactionManager.java b/src/main/java/net/tfminecraft/simplefactions/managers/FactionManager.java index f73fd1d..307fd70 100644 --- a/src/main/java/net/tfminecraft/simplefactions/managers/FactionManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/managers/FactionManager.java @@ -54,6 +54,7 @@ import net.tfminecraft.simplefactions.government.movement.cause.Cause; import net.tfminecraft.tlibs.TLibs; import net.tfminecraft.denareconomy.DenarEconomy; +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.denareconomy.enums.Accounts; public class FactionManager implements Listener{ @@ -495,8 +496,6 @@ public void time() { } } - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") public void settleIncome() { DailyGuildTransfers buffer = new DailyGuildTransfers(); @@ -555,7 +554,7 @@ public void settleIncome() { buffer, DenarEconomyPlayerBank.INSTANCE, PlayerEconomyManager.get(), - name -> Bukkit.getOfflinePlayer(name).getUniqueId()); + OfflineModifier::playerId); for (Guild g : getAllGuilds()) { g.refreshDividendEligibility(); } diff --git a/src/main/java/net/tfminecraft/simplefactions/managers/PlayerManager.java b/src/main/java/net/tfminecraft/simplefactions/managers/PlayerManager.java index 934fa05..3bfbac3 100644 --- a/src/main/java/net/tfminecraft/simplefactions/managers/PlayerManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/managers/PlayerManager.java @@ -1,7 +1,5 @@ package net.tfminecraft.simplefactions.managers; -import java.util.UUID; - import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; @@ -269,8 +267,6 @@ private ItemStack signedAgreement( return i; } - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") @EventHandler public void earnMoney(PlayerEarnMoneyEvent e) { String playerName = e.getPlayer(); @@ -285,11 +281,7 @@ public void earnMoney(PlayerEarnMoneyEvent e) { } } } - Player online = Bukkit.getPlayerExact(playerName); - UUID playerUuid = online != null - ? online.getUniqueId() - : Bukkit.getOfflinePlayer(playerName).getUniqueId(); - PlayerLedger ledger = PlayerEconomyManager.get().getLedger(playerUuid); + PlayerLedger ledger = PlayerEconomyManager.get().getLedger(playerName); if (gross > 0) { ledger.add(PlayerCashflow.EARNINGS, gross); } diff --git a/src/main/java/net/tfminecraft/simplefactions/mercenary/contract/MercenaryEngagements.java b/src/main/java/net/tfminecraft/simplefactions/mercenary/contract/MercenaryEngagements.java index b633625..bfef86c 100644 --- a/src/main/java/net/tfminecraft/simplefactions/mercenary/contract/MercenaryEngagements.java +++ b/src/main/java/net/tfminecraft/simplefactions/mercenary/contract/MercenaryEngagements.java @@ -5,9 +5,7 @@ import java.util.List; import java.util.UUID; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.simplefactions.guild.Guild; import net.tfminecraft.simplefactions.managers.FactionManager; import net.tfminecraft.simplefactions.objects.Faction; @@ -47,15 +45,8 @@ public static PlayerUuidLookup uuidLookup() { return uuids; } - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") public static PlayerUuidLookup bukkitUuids() { - return name -> { - if (name == null || Bukkit.getServer() == null) return null; - Player online = Bukkit.getPlayerExact(name); - if (online != null) return online.getUniqueId(); - return Bukkit.getOfflinePlayer(name).getUniqueId(); - }; + return OfflineModifier::playerId; } public static List on(War war, Side side) { diff --git a/src/main/java/net/tfminecraft/simplefactions/player/PlayerEconomyManager.java b/src/main/java/net/tfminecraft/simplefactions/player/PlayerEconomyManager.java index cb52cf7..3ec4b41 100644 --- a/src/main/java/net/tfminecraft/simplefactions/player/PlayerEconomyManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/player/PlayerEconomyManager.java @@ -4,9 +4,7 @@ import java.util.Map; import java.util.UUID; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; - +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.simplefactions.SimpleFactions; import net.tfminecraft.simplefactions.player.income.PlayerLedger; @@ -24,14 +22,8 @@ public PlayerLedger getLedger(UUID playerUuid) { return ledgers.computeIfAbsent(playerUuid, ignored -> new PlayerLedger()); } - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") public PlayerLedger getLedger(String playerName) { - if (playerName == null || playerName.isBlank()) { - return new PlayerLedger(); - } - OfflinePlayer offline = Bukkit.getOfflinePlayer(playerName); - UUID uuid = offline.getUniqueId(); + UUID uuid = OfflineModifier.playerId(playerName); if (uuid == null) { return new PlayerLedger(); } diff --git a/src/main/java/net/tfminecraft/simplefactions/utils/Wealth.java b/src/main/java/net/tfminecraft/simplefactions/utils/Wealth.java index e33073c..5544bf0 100644 --- a/src/main/java/net/tfminecraft/simplefactions/utils/Wealth.java +++ b/src/main/java/net/tfminecraft/simplefactions/utils/Wealth.java @@ -4,29 +4,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; import net.tfminecraft.simplefactions.guild.Guild; import net.tfminecraft.simplefactions.managers.FactionManager; import net.tfminecraft.simplefactions.objects.Faction; -import net.tfminecraft.denareconomy.DenarEconomy; +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.denareconomy.enums.Accounts; import net.tfminecraft.simplefactions.managers.RelationManager; public class Wealth { - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") public static double wealth(String player) { - double wealth = 0; - OfflinePlayer op = Bukkit.getOfflinePlayer(player); - if(op.hasPlayedBefore()) { - UUID uuid = op.getUniqueId(); - wealth += DenarEconomy.getMoneyManager().getBalance(Accounts.POUCH, uuid); - wealth += DenarEconomy.getMoneyManager().getBalance(Accounts.BANK, uuid); - } + double wealth = OfflineModifier.balance(player, Accounts.POUCH); + wealth += OfflineModifier.balance(player, Accounts.BANK); Guild guild = FactionManager.getGuildByMember(player); if(guild != null) { if(guild.getLeader().equalsIgnoreCase(player) && guild.isBase()) { diff --git a/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/DenarEconomyPlayerBank.java b/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/DenarEconomyPlayerBank.java index a31b6ff..93a23db 100644 --- a/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/DenarEconomyPlayerBank.java +++ b/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/DenarEconomyPlayerBank.java @@ -2,7 +2,7 @@ import java.util.UUID; -import net.tfminecraft.denareconomy.DenarEconomy; +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.denareconomy.enums.Accounts; public final class DenarEconomyPlayerBank { @@ -12,6 +12,9 @@ public interface PlayerBank { boolean withdrawFromBank(UUID playerUuid, double amount); boolean depositToBank(UUID playerUuid, double amount); + + /** Account id for this name, whether or not they are logged in. */ + UUID resolve(String playerName); } public interface PlayerPouch { @@ -27,54 +30,34 @@ private DenarEconomyPlayerBank() {} public static final class Impl implements PlayerBank, PlayerPouch { private Impl() {} + @Override + public UUID resolve(String playerName) { + return OfflineModifier.playerId(playerName); + } + @Override public double getBankBalance(UUID playerUuid) { - if (playerUuid == null) { - return 0.0; - } - DenarEconomy.getPlayerManager().get(playerUuid); - return DenarEconomy.getMoneyManager().getBalance(Accounts.BANK, playerUuid); + return OfflineModifier.balance(playerUuid, Accounts.BANK); } @Override public boolean withdrawFromBank(UUID playerUuid, double amount) { - return withdraw(playerUuid, amount, Accounts.BANK); + return amount > 0.0 && OfflineModifier.apply(playerUuid, Accounts.BANK, -amount); } @Override public boolean depositToBank(UUID playerUuid, double amount) { - if (playerUuid == null || amount <= 0.0) { - return false; - } - DenarEconomy.getPlayerManager().get(playerUuid); - DenarEconomy.getMoneyManager().changeBal(playerUuid.toString(), amount, Accounts.BANK); - return true; + return amount > 0.0 && OfflineModifier.apply(playerUuid, Accounts.BANK, amount); } @Override public double getPouchBalance(UUID playerUuid) { - if (playerUuid == null) { - return 0.0; - } - DenarEconomy.getPlayerManager().get(playerUuid); - return DenarEconomy.getMoneyManager().getBalance(Accounts.POUCH, playerUuid); + return OfflineModifier.balance(playerUuid, Accounts.POUCH); } @Override public boolean withdrawFromPouch(UUID playerUuid, double amount) { - return withdraw(playerUuid, amount, Accounts.POUCH); - } - - private boolean withdraw(UUID playerUuid, double amount, Accounts account) { - if (playerUuid == null || amount <= 0.0) { - return false; - } - double balance = DenarEconomy.getMoneyManager().getBalance(account, playerUuid); - if (balance < amount) { - return false; - } - DenarEconomy.getMoneyManager().changeBal(playerUuid.toString(), -amount, account); - return true; + return amount > 0.0 && OfflineModifier.apply(playerUuid, Accounts.POUCH, -amount); } } } diff --git a/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepService.java b/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepService.java index 66ba892..a73319e 100644 --- a/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepService.java +++ b/src/main/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepService.java @@ -54,8 +54,9 @@ public void processDailyUpkeep() { continue; } String playerName = VehicleOwnershipQueries.playerNameFromOwner(vehicle.getOwner()); - UUID playerUuid = VehicleOwnershipQueries.resolvePlayerUuid(playerName); + UUID playerUuid = playerBank.resolve(playerName); if (playerUuid == null) { + markUnpaid(vehicle.getUuid(), vehicle.getTypeId(), null, upkeep, now); continue; } chargePlayer(playerUuid, upkeep, vehicle.getTypeId(), vehicle.getUuid(), now); @@ -80,30 +81,7 @@ private void chargePlayer( return; } if (!playerBank.withdrawFromBank(playerUuid, upkeep)) { - maintenanceStore.markUnpaid(vehicleUuid, nowMillis); - persistMaintenance(); - SimpleFactions plugin = SimpleFactions.getInstance(); - if (plugin != null) { - plugin.getLogger().info( - "Vehicle upkeep unpaid for player " - + playerUuid - + " vehicle " - + vehicleTypeId - + " amount " - + upkeep - ); - } - Player online = null; - if (Bukkit.getServer() != null) { - online = Bukkit.getPlayer(playerUuid); - } - if (online != null && online.isOnline()) { - online.sendMessage( - "§cCould not pay vehicle upkeep (" - + vehicleTypeId - + "): insufficient bank balance." - ); - } + markUnpaid(vehicleUuid, vehicleTypeId, playerUuid, upkeep, nowMillis); return; } economyManager.getLedger(playerUuid).add(PlayerCashflow.VEHICLE_UPKEEP, -upkeep); @@ -111,6 +89,38 @@ private void chargePlayer( persistMaintenance(); } + private void markUnpaid( + String vehicleUuid, + String vehicleTypeId, + UUID playerUuid, + double upkeep, + long nowMillis) { + maintenanceStore.markUnpaid(vehicleUuid, nowMillis); + persistMaintenance(); + SimpleFactions plugin = SimpleFactions.getInstance(); + if (plugin != null) { + plugin.getLogger().info( + "Vehicle upkeep unpaid for player " + + playerUuid + + " vehicle " + + vehicleTypeId + + " amount " + + upkeep + ); + } + if (playerUuid == null || Bukkit.getServer() == null) { + return; + } + Player online = Bukkit.getPlayer(playerUuid); + if (online != null && online.isOnline()) { + online.sendMessage( + "§cCould not pay vehicle upkeep (" + + vehicleTypeId + + "): insufficient bank balance." + ); + } + } + private void persistMaintenance() { SimpleFactions plugin = SimpleFactions.getInstance(); if (plugin != null) { diff --git a/src/main/java/net/tfminecraft/simplefactions/vehicles/registry/VehicleOwnershipQueries.java b/src/main/java/net/tfminecraft/simplefactions/vehicles/registry/VehicleOwnershipQueries.java index bf8f24e..578f51c 100644 --- a/src/main/java/net/tfminecraft/simplefactions/vehicles/registry/VehicleOwnershipQueries.java +++ b/src/main/java/net/tfminecraft/simplefactions/vehicles/registry/VehicleOwnershipQueries.java @@ -9,6 +9,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import net.tfminecraft.denareconomy.accounts.OfflineModifier; import net.tfminecraft.simplefactions.loaders.VehiclesConfigLoader; import net.tfminecraft.vehicleframework.data.OwnedVehicleSummary; import net.tfminecraft.vehicleframework.VehicleFramework; @@ -91,18 +92,8 @@ public static int countExcludingIgnoreLimit(List personal) return count; } - // Existing configuration identifies offline profiles by player name, not UUID. - @SuppressWarnings("deprecation") public static UUID resolvePlayerUuid(String playerName) { - if (playerName == null || playerName.isBlank() || Bukkit.getServer() == null) { - return null; - } - Player online = Bukkit.getPlayerExact(playerName); - if (online != null) { - return online.getUniqueId(); - } - OfflinePlayer offline = Bukkit.getOfflinePlayer(playerName); - return offline.getUniqueId(); + return OfflineModifier.playerId(playerName); } public static String resolvePlayerName(UUID playerUuid) { diff --git a/src/test/java/net/tfminecraft/simplefactions/utils/PostSettlementPayoutsTest.java b/src/test/java/net/tfminecraft/simplefactions/utils/PostSettlementPayoutsTest.java index a77e2bd..aa12ce0 100644 --- a/src/test/java/net/tfminecraft/simplefactions/utils/PostSettlementPayoutsTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/utils/PostSettlementPayoutsTest.java @@ -189,5 +189,10 @@ public boolean depositToBank(UUID playerUuid, double amount) { balances.put(playerUuid, balance(playerUuid) + amount); return true; } + + @Override + public UUID resolve(String playerName) { + return null; + } } } diff --git a/src/test/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepServiceTest.java b/src/test/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepServiceTest.java index a847c40..71cf530 100644 --- a/src/test/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepServiceTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/vehicles/maintenance/VehicleUpkeepServiceTest.java @@ -88,6 +88,7 @@ void tearDown() throws IOException { void successfulUpkeepWithdrawsBankAndRecordsLedger() { UUID playerUuid = UUID.randomUUID(); bank.setBalance(playerUuid, 100.0); + bank.remember("Alice", playerUuid); VehicleOwnershipQueries.setSourceForTests( new FakeOwnedInventory().add("vehicle-1", "ironclad", "player_Alice")); @@ -100,10 +101,45 @@ void successfulUpkeepWithdrawsBankAndRecordsLedger() { assertFalse(store.isUnpaid("vehicle-1")); } + @Test + void offlineOwnerIsChargedOnTheResolvedAccount() { + UUID playerUuid = UUID.randomUUID(); + UUID standIn = UUID.randomUUID(); + bank.setBalance(playerUuid, 100.0); + bank.remember("Alice", playerUuid); + VehicleOwnershipQueries.setSourceForTests( + new FakeOwnedInventory().add("vehicle-1", "ironclad", "player_Alice")); + + try (MockedStatic bukkit = mockBukkit("Alice", standIn)) { + service.processDailyUpkeep(); + } + + assertEquals(80.0, bank.getBankBalance(playerUuid)); + assertEquals(0.0, bank.getBankBalance(standIn)); + assertEquals(-20.0, economyManager.getLedger(playerUuid).getAmount(PlayerCashflow.VEHICLE_UPKEEP)); + assertFalse(store.isUnpaid("vehicle-1")); + } + + @Test + void unknownOwnerIsUnpaidInsteadOfChargedToAStandIn() { + UUID standIn = UUID.randomUUID(); + bank.setBalance(standIn, 100.0); + VehicleOwnershipQueries.setSourceForTests( + new FakeOwnedInventory().add("vehicle-1", "ironclad", "player_Alice")); + + try (MockedStatic bukkit = mockBukkit("Alice", standIn)) { + service.processDailyUpkeep(); + } + + assertEquals(100.0, bank.getBankBalance(standIn)); + assertTrue(store.isUnpaid("vehicle-1")); + } + @Test void insufficientBalanceSkipsCharge() { UUID playerUuid = UUID.randomUUID(); bank.setBalance(playerUuid, 10.0); + bank.remember("Alice", playerUuid); VehicleOwnershipQueries.setSourceForTests( new FakeOwnedInventory().add("vehicle-1", "ironclad", "player_Alice")); @@ -120,6 +156,7 @@ void insufficientBalanceSkipsCharge() { void successfulUpkeepClearsExistingUnpaid() { UUID playerUuid = UUID.randomUUID(); bank.setBalance(playerUuid, 100.0); + bank.remember("Alice", playerUuid); store.markUnpaid("vehicle-1", 1L); VehicleOwnershipQueries.setSourceForTests( new FakeOwnedInventory().add("vehicle-1", "ironclad", "player_Alice")); @@ -145,6 +182,7 @@ void hourlyDecayDamagesUnpaidVehicles() { void skipsBerthedVehicles() { UUID playerUuid = UUID.randomUUID(); bank.setBalance(playerUuid, 100.0); + bank.remember("Alice", playerUuid); registry.register(new PlayerVehicleRecord( playerUuid, "vehicle-1", @@ -203,10 +241,24 @@ private DecayCall(String uuid, double fractionOfMax, double minHealthFraction) { private static final class TestPlayerBank implements PlayerBank { private final Map balances = new HashMap<>(); + private final Map names = new HashMap<>(); + void setBalance(UUID playerUuid, double balance) { balances.put(playerUuid, balance); } + void remember(String playerName, UUID playerUuid) { + names.put(playerName.toLowerCase(java.util.Locale.ROOT), playerUuid); + } + + @Override + public UUID resolve(String playerName) { + if (playerName == null) { + return null; + } + return names.get(playerName.toLowerCase(java.util.Locale.ROOT)); + } + @Override public double getBankBalance(UUID playerUuid) { return balances.getOrDefault(playerUuid, 0.0);