From 49767b568acb14b6e7fb8b0fa2886c749738fd4e Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Fri, 22 Aug 2025 16:03:49 +0100 Subject: [PATCH] fix: fix a specific situation where a merge can fail but take money still --- .../com/plotsquared/core/command/Merge.java | 109 ++++++++++-------- 1 file changed, 62 insertions(+), 47 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/command/Merge.java b/Core/src/main/java/com/plotsquared/core/command/Merge.java index 0e0650836..8169999ed 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Merge.java +++ b/Core/src/main/java/com/plotsquared/core/command/Merge.java @@ -40,6 +40,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.UUID; +import java.util.function.Supplier; @CommandDeclaration(command = "merge", aliases = "m", @@ -116,9 +117,11 @@ public class Merge extends SubCommand { if (direction == null) { player.sendMessage( TranslatableCaption.of("commandconfig.command_syntax"), - TagResolver.resolver("value", Tag.inserting(Component.text( - "/plot merge <" + StringMan.join(values, " | ") + "> [removeroads]" - ))) + TagResolver.resolver( + "value", Tag.inserting(Component.text( + "/plot merge <" + StringMan.join(values, " | ") + "> [removeroads]" + )) + ) ); player.sendMessage( TranslatableCaption.of("help.direction"), @@ -244,54 +247,66 @@ public class Merge extends SubCommand { } java.util.Set uuids = adjacent.getOwners(); boolean isOnline = false; - for (final UUID owner : uuids) { - final PlotPlayer accepter = PlotSquared.platform().playerManager().getPlayerIfExists(owner); - if (!force && accepter == null) { - continue; - } - isOnline = true; - final Direction dir = direction; - Runnable run = () -> { - accepter.sendMessage(TranslatableCaption.of("merge.merge_accepted")); - plot.getPlotModificationManager().autoMerge(dir, maxSize - size, owner, player, terrain); - PlotPlayer plotPlayer = PlotSquared.platform().playerManager().getPlayerIfExists(player.getUUID()); - if (plotPlayer == null) { - accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid")); - return; + if (!force) { + for (final UUID owner : uuids) { + final PlotPlayer accepter = PlotSquared.platform().playerManager().getPlayerIfExists(owner); + if (accepter == null) { + continue; } - if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) { - if (!force && this.econHandler.getMoney(player) < price) { - player.sendMessage( - TranslatableCaption.of("economy.cannot_afford_merge"), - TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) - ); - return; + isOnline = true; + final Direction dir = direction; + Supplier run = () -> { + accepter.sendMessage(TranslatableCaption.of("merge.merge_accepted")); + if (plot.getPlotModificationManager().autoMerge(dir, maxSize - size, owner, player, terrain)) { + PlotPlayer plotPlayer = PlotSquared.platform().playerManager().getPlayerIfExists(player.getUUID()); + if (plotPlayer == null) { + accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid")); + return false; + } + if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) { + if (this.econHandler.getMoney(player) < price) { + player.sendMessage( + TranslatableCaption.of("economy.cannot_afford_merge"), + TagResolver.resolver( + "money", + Tag.inserting(Component.text(this.econHandler.format(price))) + ) + ); + return false; + } + this.econHandler.withdrawMoney(player, price); + player.sendMessage( + TranslatableCaption.of("economy.removed_balance"), + TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) + ); + } + player.sendMessage(TranslatableCaption.of("merge.success_merge")); + eventDispatcher.callPostMerge(player, plot); + return true; } - this.econHandler.withdrawMoney(player, price); - player.sendMessage( - TranslatableCaption.of("economy.removed_balance"), - TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price)))) + player.sendMessage(TranslatableCaption.of("merge.no_available_automerge")); + return false; + }; + if (hasConfirmation(player)) { + CmdConfirm.addPending( + accepter, MINI_MESSAGE.serialize(MINI_MESSAGE + .deserialize( + TranslatableCaption.of("merge.merge_request_confirm").getComponent(player), + TagResolver.builder() + .tag("player", Tag.inserting(Component.text(player.getName()))) + .tag( + "location", + Tag.inserting(Component.text(plot.getWorldName() + " " + plot.getId())) + ) + .build() + )), + run::get ); + } else { + return run.get(); } - player.sendMessage(TranslatableCaption.of("merge.success_merge")); - eventDispatcher.callPostMerge(player, plot); - }; - if (!force && hasConfirmation(player)) { - CmdConfirm.addPending(accepter, MINI_MESSAGE.serialize(MINI_MESSAGE - .deserialize( - TranslatableCaption.of("merge.merge_request_confirm").getComponent(player), - TagResolver.builder() - .tag("player", Tag.inserting(Component.text(player.getName()))) - .tag( - "location", - Tag.inserting(Component.text(plot.getWorldName() + " " + plot.getId())) - ) - .build() - )), - run - ); - } else { - run.run(); + // find first + break; } } if (force || !isOnline) {