diff --git a/Towny/pom.xml b/Towny/pom.xml
index 50801769b0..a9a4b0c248 100644
--- a/Towny/pom.xml
+++ b/Towny/pom.xml
@@ -13,7 +13,7 @@
towny
jar
- 0.100.4.12
+ 0.100.4.13
diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
index aadd4ccbd5..af06fe529e 100644
--- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
+++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/ProximityUtil.java
@@ -1,6 +1,7 @@
package com.palmergames.bukkit.towny.utils;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -241,11 +242,29 @@ public static void testTownProximityToNation(Town town, Nation nation) throws To
throw new TownyException(Translatable.of("msg_err_nation_homeblock_in_another_world"));
}
- if (isTownTooFarFromNation(town, capital, nation.getTowns())) {
+ List townsClosestToFarthest = sortTownsClosestToFarthest(nation);
+ if (isTownTooFarFromNation(town, capital, townsClosestToFarthest)) {
throw new TownyException(Translatable.of("msg_err_town_not_close_enough_to_nation", town.getName()));
}
}
+ private static List sortTownsClosestToFarthest(Nation nation) {
+ List sortedTowns = nation.getTowns().stream()
+ .sorted(Comparator.comparingInt(t-> getDistanceFromCapital(t, nation)))
+ .collect(Collectors.toList());
+ return sortedTowns;
+ }
+
+ private static int getDistanceFromCapital(Town town, Nation nation) {
+ TownBlock capitalHomeblock = nation.getCapital().getHomeBlockOrNull();
+ TownBlock townHomeblock = town.getHomeBlockOrNull();
+ if (capitalHomeblock == null || townHomeblock == null)
+ return Integer.MAX_VALUE;
+ if (!capitalHomeblock.getWorld().equals(townHomeblock.getWorld()))
+ return Integer.MAX_VALUE;
+ return (int) MathUtil.distance(capitalHomeblock.getCoord(), townHomeblock.getCoord());
+ }
+
public static List gatherOutOfRangeTowns(Nation nation) {
return gatherOutOfRangeTowns(nation, nation.getCapital());
}
@@ -261,7 +280,7 @@ public static List gatherOutOfRangeTowns(Nation nation, Town capital) {
return removedTowns;
final WorldCoord capitalCoord = capitalHomeBlock.getWorldCoord();
- List townsToCheck = nation.getTowns();
+ List townsToCheck = sortTownsClosestToFarthest(nation);
List localTownsToKeep = new ArrayList<>();
townsToCheck.remove(capital);
localTownsToKeep.add(capital);
@@ -294,7 +313,7 @@ private static List getListOfInRangeTownsFromList(List townsToCheck,
continue;
// Check that the town missing is not missing a homeblock, and that the
// homeblocks are in the same world, and the distance between.
- if (isTownCloseEnoughToNation(town, capital, townsToCheck, validTowns))
+ if (isTownCloseEnoughToNation(town, capital, townsToCheck, validTowns))
allowedTowns.add(town);
}
return allowedTowns;
@@ -319,9 +338,11 @@ private static boolean closeEnoughToOtherNationTowns(Town town, Town newCapital,
return false;
// Try to find at least one town in the nation which is close enough to this town.
- return townsToCheck.stream()
- .filter(t -> !t.equals(town) && !t.isCapital() && validTowns.contains(t))
- .anyMatch(t -> closeEnoughToTown(town, t, maxDistanceFromOtherTowns));
+ for (Town validTown : validTowns) {
+ if (closeEnoughToTown(validTown, town, maxDistanceFromOtherTowns))
+ return true;
+ }
+ return false;
}
public static void removeOutOfRangeTowns(Nation nation) {
diff --git a/Towny/src/main/resources/ChangeLog.txt b/Towny/src/main/resources/ChangeLog.txt
index 2ca62f7aae..f076759746 100644
--- a/Towny/src/main/resources/ChangeLog.txt
+++ b/Towny/src/main/resources/ChangeLog.txt
@@ -10132,4 +10132,6 @@ v0.92.0.11:
- Fix the proximity-to-nation test not removing too-far-away towns in every situation.
- Closes #7668.
- Add message to the plot forsale notification, shown when a player has no claimed townblocks, advising them how to claim a plot.
- - New Language: Hungarian.
\ No newline at end of file
+ - New Language: Hungarian.
+0.100.4.13:
+ - Fix another issue with the proximity-to-nation test.
\ No newline at end of file