From 608cb4f19c4cee058a40795ed92910f01d328869 Mon Sep 17 00:00:00 2001 From: Plan3t Date: Tue, 17 Feb 2026 14:25:58 +0100 Subject: [PATCH] Fix batch faction claims to resolve adjacency transitively --- .../mcprotector/service/FactionService.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mcprotector/service/FactionService.java b/src/main/java/com/mcprotector/service/FactionService.java index cd2598c..9d764c0 100644 --- a/src/main/java/com/mcprotector/service/FactionService.java +++ b/src/main/java/com/mcprotector/service/FactionService.java @@ -15,7 +15,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.ChunkPos; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -317,17 +320,32 @@ public static int toggleFactionChunks(CommandSourceStack source, Iterable pendingClaims = new ArrayList<>(); for (ChunkPos chunk : chunks) { if (data.unclaimChunk(chunk, faction.get().getId())) { WebmapBridge.updateClaim(chunk, Optional.empty(), player.level().dimension().location().toString()); unclaimed++; continue; } - if (data.claimChunk(chunk, faction.get().getId())) { + pendingClaims.add(chunk); + } + + boolean progress; + do { + progress = false; + Iterator iterator = pendingClaims.iterator(); + while (iterator.hasNext()) { + ChunkPos chunk = iterator.next(); + if (!data.claimChunk(chunk, faction.get().getId())) { + continue; + } WebmapBridge.updateClaim(chunk, faction, player.level().dimension().location().toString()); claimed++; + progress = true; + iterator.remove(); } - } + } while (progress && !pendingClaims.isEmpty()); + if (claimed == 0 && unclaimed == 0) { source.sendFailure(Component.literal("No chunks were updated.")); return 0;