From 1c5dc25afdebc3b3248618f3eb937051661728d7 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Mon, 15 Apr 2024 19:50:16 +0200 Subject: [PATCH 01/14] Distance option to prevent new towns to block old towns expansion. --- .../bukkit/config/ConfigNodes.java | 9 ++++++ .../bukkit/towny/TownySettings.java | 4 +++ .../bukkit/towny/object/TownyWorld.java | 28 ++++++++++++++++++- .../bukkit/towny/utils/AreaSelectionUtil.java | 3 +- .../bukkit/towny/utils/OutpostUtil.java | 2 ++ .../bukkit/towny/utils/ProximityUtil.java | 10 +++++-- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index ef8903a69b..05afb24379 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1105,6 +1105,15 @@ public enum ConfigNodes { "# Put in other words: the buffer area around every claim that no other town can claim into.", "# Does not affect towns which are in the same nation.", "# This will prevent town encasement to a certain degree."), + CLAIMING_MIN_PLOT_DISTANCE_FROM_OLDER_TOWN_PLOT( + "claiming.distance_rules.min_plot_distance_from_older_town_plot", + "5", + "", + "# Minimum number of plots any towns plot must be from the next older town's own plots.", + "# It work exactly as min_plot_distance_from_town_plot except that only the new town need to leave this space to the older one.", + "# Only higher value than min_plot_distance_from_town_plot will have an effect.", + "# Does not affect towns which are in the same nation.", + "# This will prevent old town to be blocked in there expansion by new town to a certain degree."), CLAIMING_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK( "claiming.distance_rules.min_distance_from_town_homeblock", "5", diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java index f0a7997af0..d0ae77d1c7 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/TownySettings.java @@ -2569,6 +2569,10 @@ public static int getMinDistanceFromTownPlotblocks() { return getInt(ConfigNodes.CLAIMING_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT); } + public static int getMinDistanceFromOlderTownPlotblocks() { + return getInt(ConfigNodes.CLAIMING_MIN_PLOT_DISTANCE_FROM_OLDER_TOWN_PLOT); + } + public static int getMaxDistanceForTownMerge() { return getInt(ConfigNodes.GTOWN_SETTINGS_MAX_DISTANCE_FOR_MERGE); } diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index d39827c98c..5fd6847511 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -29,6 +29,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.function.Predicate; public class TownyWorld extends TownyObject { private UUID uuid; @@ -875,14 +876,17 @@ public int getMinDistanceFromOtherTownsPlots(Coord key) { * * @param key - Coord to check from. * @param homeTown Players town + * @param isConcernedTown Predicate to filter out towns that should not be considered. * @return the closest distance to another towns nearest plot. */ - public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { + private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull Predicate isConcernedTown) { final int keyX = key.getX(); final int keyZ = key.getZ(); double minSqr = -1; for (Town town : getTowns().values()) { + if (!isConcernedTown.test(town)) continue; + if (homeTown != null) // If the townblock either: the town is the same as homeTown OR // both towns are in the same nation (and this is set to ignore distance in the config,) skip over the proximity filter. @@ -906,6 +910,28 @@ public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { } return minSqr == -1 ? Integer.MAX_VALUE : (int) Math.ceil(Math.sqrt(minSqr)); } + + /** + * Checks the distance from a another town's plots. + * + * @param key - Coord to check from. + * @param homeTown Players town + * @return the closest distance to another towns nearest plot. + */ + public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { + return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> true); + } + + /** + * Checks the distance from a another town's plots. + * + * @param key - Coord to check from. + * @param homeTown Players town + * @return the closest distance to another older towns nearest plot. + */ + public int getMinDistanceFromOtherOlderTownsPlots(Coord key, Town homeTown) { + return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> t.getRegistered() < homeTown.getRegistered()); + } /** diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java index 42bb6ef9e2..eabec56de2 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java @@ -336,7 +336,8 @@ public static List filterInvalidProximityTownBlocks(List List out = new ArrayList<>(); for (WorldCoord worldCoord : selection) - if (worldCoord.getTownyWorld().getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks()) { + if (worldCoord.getTownyWorld().getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() && + worldCoord.getTownyWorld().getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks()) { out.add(worldCoord); } else { TownyMessaging.sendDebugMsg("AreaSelectionUtil:filterInvalidProximity - Coord: " + worldCoord + " too close to another town." ); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java index bca7641e0b..933e3d3583 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java @@ -68,8 +68,10 @@ public static boolean OutpostTests(Town town, Resident resident, TownyWorld worl } // Outposts can have a minimum required distance from other towns' townblocks. int minDistance = world.getMinDistanceFromOtherTownsPlots(key, isPlotSetOutpost ? town : null); + int minDistanceOlder = world.getMinDistanceFromOtherOlderTownsPlots(key, isPlotSetOutpost ? town : null); // Outposts can have a minimum required distance from other outposts. if (minDistance < TownySettings.getMinDistanceFromTownPlotblocks() || + minDistanceOlder < TownySettings.getMinDistanceFromOlderTownPlotblocks() || minDistance < TownySettings.getMinDistanceForOutpostsFromPlot()) throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock"))); 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 8717102f44..932d20cc3d 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 @@ -31,11 +31,13 @@ public static void allowTownHomeBlockOrThrow(TownyWorld world, Coord key, @Nulla return; if (newTown) { // Tests run only when there is a new town involved. - if (TownySettings.getMinDistanceFromTownPlotblocks() > 0 || TownySettings.getNewTownMinDistanceFromTownPlots() > 0) { + if (TownySettings.getMinDistanceFromTownPlotblocks() > 0 || + TownySettings.getMinDistanceFromOlderTownPlotblocks() > 0 || + TownySettings.getNewTownMinDistanceFromTownPlots() > 0) { // Sometimes new towns have special min. distances from other towns. int minDistance = TownySettings.getNewTownMinDistanceFromTownPlots(); if (minDistance <= 0) - minDistance = TownySettings.getMinDistanceFromTownPlotblocks(); + minDistance = Math.max(TownySettings.getMinDistanceFromTownPlotblocks(), TownySettings.getMinDistanceFromOlderTownPlotblocks()); // throws when a new town is being made to close to another town's land. if (world.getMinDistanceFromOtherTownsPlots(key) < minDistance) @@ -86,6 +88,10 @@ public static void allowTownClaimOrThrow(TownyWorld world, WorldCoord townBlockT if (world.getMinDistanceFromOtherTownsPlots(townBlockToClaim, town) < TownySettings.getMinDistanceFromTownPlotblocks()) throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock"))); + // Check distance to other older townblocks. + if (world.getMinDistanceFromOtherOlderTownsPlots(townBlockToClaim, town) < TownySettings.getMinDistanceFromOlderTownPlotblocks()) + throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock"))); + // Check adjacent claims rules. testAdjacentClaimsRulesOrThrow(townBlockToClaim, town, outpost); From 761250f5b6d20f194a425786f01a5f8f437ae515 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Mon, 15 Apr 2024 20:40:39 +0200 Subject: [PATCH 02/14] Fix potential NullPpointerExecption on homeTown. --- .../java/com/palmergames/bukkit/towny/object/TownyWorld.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 5fd6847511..d843baaf4b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -930,7 +930,7 @@ public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { * @return the closest distance to another older towns nearest plot. */ public int getMinDistanceFromOtherOlderTownsPlots(Coord key, Town homeTown) { - return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> t.getRegistered() < homeTown.getRegistered()); + return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> homeTown == null || t.getRegistered() < homeTown.getRegistered()); } From 4b3954ff1f159333089a244f84d99eff3d77188f Mon Sep 17 00:00:00 2001 From: HydrolienF <71718798+HydrolienF@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:57:47 +0200 Subject: [PATCH 03/14] Update Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java Co-authored-by: LlmDl --- .../main/java/com/palmergames/bukkit/config/ConfigNodes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index 05afb24379..2bc61777f9 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1113,7 +1113,8 @@ public enum ConfigNodes { "# It work exactly as min_plot_distance_from_town_plot except that only the new town need to leave this space to the older one.", "# Only higher value than min_plot_distance_from_town_plot will have an effect.", "# Does not affect towns which are in the same nation.", - "# This will prevent old town to be blocked in there expansion by new town to a certain degree."), + "# This will prevent old towns from being unable to expand outwards towards newer towns, which might have tried to claim-block them."), + CLAIMING_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK( "claiming.distance_rules.min_distance_from_town_homeblock", "5", From 2328876ef1e0ebd4a3fc9547e1ea121d55364c95 Mon Sep 17 00:00:00 2001 From: HydrolienF <71718798+HydrolienF@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:58:08 +0200 Subject: [PATCH 04/14] Update Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java Co-authored-by: LlmDl --- .../main/java/com/palmergames/bukkit/config/ConfigNodes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index 2bc61777f9..410c958944 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1109,7 +1109,8 @@ public enum ConfigNodes { "claiming.distance_rules.min_plot_distance_from_older_town_plot", "5", "", - "# Minimum number of plots any towns plot must be from the next older town's own plots.", + "# Minimum number of plots required between a town and any nearby, older town.", + "# It work exactly as min_plot_distance_from_town_plot except that only the new town need to leave this space to the older one.", "# Only higher value than min_plot_distance_from_town_plot will have an effect.", "# Does not affect towns which are in the same nation.", From 8c1474dbe2fabdfacb77306929da234add7f8736 Mon Sep 17 00:00:00 2001 From: HydrolienF <71718798+HydrolienF@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:58:31 +0200 Subject: [PATCH 05/14] Update Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java Co-authored-by: LlmDl --- .../main/java/com/palmergames/bukkit/config/ConfigNodes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index 410c958944..e29c896f0f 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1111,7 +1111,8 @@ public enum ConfigNodes { "", "# Minimum number of plots required between a town and any nearby, older town.", - "# It work exactly as min_plot_distance_from_town_plot except that only the new town need to leave this space to the older one.", + "# It works exactly as min_plot_distance_from_town_plot except that is only affects towns created newer than already-existing towns.", + "# Only higher value than min_plot_distance_from_town_plot will have an effect.", "# Does not affect towns which are in the same nation.", "# This will prevent old towns from being unable to expand outwards towards newer towns, which might have tried to claim-block them."), From eb7f6376475bb976856e617339b0bdc996553bc5 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Tue, 16 Apr 2024 19:19:52 +0200 Subject: [PATCH 06/14] Make requested changes in #7364 - Inverse the logic of the predicate to isIgnorableTown. - Move public methods upper than the private one. - Move predicate test - Remove a non necessary anymore ==null test. --- .../bukkit/towny/object/TownyWorld.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index d843baaf4b..953160da73 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -876,21 +876,44 @@ public int getMinDistanceFromOtherTownsPlots(Coord key) { * * @param key - Coord to check from. * @param homeTown Players town - * @param isConcernedTown Predicate to filter out towns that should not be considered. * @return the closest distance to another towns nearest plot. */ - private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull Predicate isConcernedTown) { + public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { + return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> false); + } + + /** + * Checks the distance from a another older town's plots. + * It have the same behavior than {@link #getMinDistanceFromOtherTownsPlots(Coord, Town)} + * but it will only consider towns that are older than the homeTown. + * + * @param key - Coord to check from. + * @param homeTown Players town + * @return the closest distance to another older towns nearest plot. + */ + public int getMinDistanceFromOtherOlderTownsPlots(Coord key, Town homeTown) { + return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> t.getRegistered() > homeTown.getRegistered()); + } + + /** + * Checks the distance from a another town's plots. + * + * @param key - Coord to check from. + * @param homeTown Players town + * @param isIgnorableTown Predicate to filter out towns that should not be considered. + * @return the closest distance to another towns nearest plot. + */ + private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull Predicate isIgnorableTown) { final int keyX = key.getX(); final int keyZ = key.getZ(); double minSqr = -1; for (Town town : getTowns().values()) { - if (!isConcernedTown.test(town)) continue; - if (homeTown != null) - // If the townblock either: the town is the same as homeTown OR + // If the townblock either: the town is the same as homeTown OR is ignorable OR // both towns are in the same nation (and this is set to ignore distance in the config,) skip over the proximity filter. if (homeTown.getUUID().equals(town.getUUID()) + || isIgnorableTown.test(town) || (TownySettings.isMinDistanceIgnoringTownsInSameNation() && homeTown.hasNation() && town.hasNation() && town.getNationOrNull().equals(homeTown.getNationOrNull())) || (TownySettings.isMinDistanceIgnoringTownsInAlliedNation() && homeTown.isAlliedWith(town))) continue; @@ -910,28 +933,6 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } return minSqr == -1 ? Integer.MAX_VALUE : (int) Math.ceil(Math.sqrt(minSqr)); } - - /** - * Checks the distance from a another town's plots. - * - * @param key - Coord to check from. - * @param homeTown Players town - * @return the closest distance to another towns nearest plot. - */ - public int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown) { - return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> true); - } - - /** - * Checks the distance from a another town's plots. - * - * @param key - Coord to check from. - * @param homeTown Players town - * @return the closest distance to another older towns nearest plot. - */ - public int getMinDistanceFromOtherOlderTownsPlots(Coord key, Town homeTown) { - return getMinDistanceFromOtherTownsPlots(key, homeTown, t -> homeTown == null || t.getRegistered() < homeTown.getRegistered()); - } /** From af3aa6ec46c035dd2576c6d1246cee4d497f7e1a Mon Sep 17 00:00:00 2001 From: LlmDl Date: Tue, 30 Apr 2024 11:07:34 -0500 Subject: [PATCH 07/14] Clean up the code, add in a new lang string to specify why newer claims are blocked. Extracts a few methods to keep things more readable. --- .../bukkit/config/ConfigNodes.java | 11 +++---- .../bukkit/towny/object/TownyWorld.java | 33 +++++++++++++------ .../bukkit/towny/utils/AreaSelectionUtil.java | 11 +++++-- .../bukkit/towny/utils/OutpostUtil.java | 7 ++-- .../bukkit/towny/utils/ProximityUtil.java | 2 +- Towny/src/main/resources/lang/en-US.yml | 1 + 6 files changed, 43 insertions(+), 22 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java index e29c896f0f..3c5e6cca73 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java +++ b/Towny/src/main/java/com/palmergames/bukkit/config/ConfigNodes.java @@ -1109,14 +1109,11 @@ public enum ConfigNodes { "claiming.distance_rules.min_plot_distance_from_older_town_plot", "5", "", - "# Minimum number of plots required between a town and any nearby, older town.", - - "# It works exactly as min_plot_distance_from_town_plot except that is only affects towns created newer than already-existing towns.", - - "# Only higher value than min_plot_distance_from_town_plot will have an effect.", - "# Does not affect towns which are in the same nation.", + "# The minimum number of plots required between a town and older towns. Must be higher than min_plot_distance_from_town_plot.", + "# Does not affect towns which are in the same nation when min_distances_ignored_for_towns_in_same_nation is set to true.", + "# Does not affect towns which are in the allied when min_distances_ignored_for_towns_in_allied_nation is set to true.", + "# This works exactly as min_plot_distance_from_town_plot except that it only affects towns created newer than already-existing towns.", "# This will prevent old towns from being unable to expand outwards towards newer towns, which might have tried to claim-block them."), - CLAIMING_MIN_DISTANCE_FROM_TOWN_HOMEBLOCK( "claiming.distance_rules.min_distance_from_town_homeblock", "5", diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 953160da73..afc330c1a9 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -6,6 +6,7 @@ import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.object.TownyPermission.ActionType; import com.palmergames.bukkit.towny.object.metadata.CustomDataField; +import com.palmergames.bukkit.towny.utils.CombatUtil; import com.palmergames.util.MathUtil; import com.palmergames.util.StringMgmt; @@ -909,14 +910,9 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull double minSqr = -1; for (Town town : getTowns().values()) { - if (homeTown != null) - // If the townblock either: the town is the same as homeTown OR is ignorable OR - // both towns are in the same nation (and this is set to ignore distance in the config,) skip over the proximity filter. - if (homeTown.getUUID().equals(town.getUUID()) - || isIgnorableTown.test(town) - || (TownySettings.isMinDistanceIgnoringTownsInSameNation() && homeTown.hasNation() && town.hasNation() && town.getNationOrNull().equals(homeTown.getNationOrNull())) - || (TownySettings.isMinDistanceIgnoringTownsInAlliedNation() && homeTown.isAlliedWith(town))) - continue; + if (homeTown != null && townSkippedByProximityFilter(town, homeTown, isIgnorableTown)) + continue; + for (TownBlock b : town.getTownBlocks()) { if (!b.getWorld().equals(this)) continue; @@ -933,8 +929,25 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } return minSqr == -1 ? Integer.MAX_VALUE : (int) Math.ceil(Math.sqrt(minSqr)); } - - + + /** + * Skip over the proximity filter if the town is any one of the following: + * the same as homeTown OR is ignorable for a reason set in the Predicate + * OR both towns are in the same nation OR both towns are in allied nations + * (and nation/alliednations are set to ignore distance in the config.) + * + * @param town Town we are testing against. + * @param homeTown the Town which is attempting to claim land. + * @param isIgnorableTown Predicate which tests the town variable to see if it can be ignored by the proximity test. + * @return true if town can claim near to homeTown. + */ + private boolean townSkippedByProximityFilter(Town town, Town homeTown, @NotNull Predicate isIgnorableTown) { + return homeTown.equals(town) + || isIgnorableTown.test(town) + || (TownySettings.isMinDistanceIgnoringTownsInSameNation() && CombatUtil.isSameNation(town, homeTown)) + || (TownySettings.isMinDistanceIgnoringTownsInAlliedNation() && homeTown.isAlliedWith(town)); + } + /** * Returns the distance to the closest townblock * from the given coord, for the give town. diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java index eabec56de2..8e05471a7e 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java @@ -11,6 +11,7 @@ import com.palmergames.bukkit.towny.object.TownBlock; import com.palmergames.bukkit.towny.object.TownBlockOwner; import com.palmergames.bukkit.towny.object.TownBlockType; +import com.palmergames.bukkit.towny.object.TownyWorld; import com.palmergames.bukkit.towny.object.Translatable; import com.palmergames.bukkit.towny.object.WorldCoord; import com.palmergames.bukkit.util.BiomeUtil; @@ -336,14 +337,20 @@ public static List filterInvalidProximityTownBlocks(List List out = new ArrayList<>(); for (WorldCoord worldCoord : selection) - if (worldCoord.getTownyWorld().getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() && - worldCoord.getTownyWorld().getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks()) { + if (worldCoordNotTooCloseToOtherTowns(town, worldCoord)) { out.add(worldCoord); } else { TownyMessaging.sendDebugMsg("AreaSelectionUtil:filterInvalidProximity - Coord: " + worldCoord + " too close to another town." ); } return out; } + + private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { + TownyWorld townyWorld = worldCoord.getTownyWorld(); + return townyWorld != null + && townyWorld.getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() + && townyWorld.getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks(); + } /** * Returns a list containing only townblocks that can be claimed. diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java index 933e3d3583..8bf4aeb254 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/OutpostUtil.java @@ -68,13 +68,16 @@ public static boolean OutpostTests(Town town, Resident resident, TownyWorld worl } // Outposts can have a minimum required distance from other towns' townblocks. int minDistance = world.getMinDistanceFromOtherTownsPlots(key, isPlotSetOutpost ? town : null); - int minDistanceOlder = world.getMinDistanceFromOtherOlderTownsPlots(key, isPlotSetOutpost ? town : null); // Outposts can have a minimum required distance from other outposts. if (minDistance < TownySettings.getMinDistanceFromTownPlotblocks() || - minDistanceOlder < TownySettings.getMinDistanceFromOlderTownPlotblocks() || minDistance < TownySettings.getMinDistanceForOutpostsFromPlot()) throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock"))); + // Newer towns can be prevented from claiming near to older towns. + if (!isPlotSetOutpost && + world.getMinDistanceFromOtherOlderTownsPlots(key, town) < TownySettings.getMinDistanceFromOlderTownPlotblocks()) + throw new TownyException(Translatable.of("msg_too_close3", Translatable.of("townblock"))); + return true; } 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 932d20cc3d..25b889da2c 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 @@ -90,7 +90,7 @@ public static void allowTownClaimOrThrow(TownyWorld world, WorldCoord townBlockT // Check distance to other older townblocks. if (world.getMinDistanceFromOtherOlderTownsPlots(townBlockToClaim, town) < TownySettings.getMinDistanceFromOlderTownPlotblocks()) - throw new TownyException(Translatable.of("msg_too_close2", Translatable.of("townblock"))); + throw new TownyException(Translatable.of("msg_too_close3", Translatable.of("townblock"))); // Check adjacent claims rules. testAdjacentClaimsRulesOrThrow(townBlockToClaim, town, outpost); diff --git a/Towny/src/main/resources/lang/en-US.yml b/Towny/src/main/resources/lang/en-US.yml index 9a15f444fd..01bcf90ccb 100644 --- a/Towny/src/main/resources/lang/en-US.yml +++ b/Towny/src/main/resources/lang/en-US.yml @@ -1229,6 +1229,7 @@ msg_save_success: 'Database saved.' msg_load_success: 'Database loaded.' msg_err_cannot_afford_to_set_outpost: 'Your town does not have enough funds to set this townblock to an outpost.' msg_too_close2: 'This area is too close to another town''s %s.' +msg_too_close3: 'This area is too close to %s claimed by a town older than yours.' homeblock: 'homeblock' townblock: 'townblock' outpost: 'outpost' From e5363fbe265b8a047388afc269d7216a4211c2c3 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Fri, 7 Jun 2024 14:42:31 +0200 Subject: [PATCH 08/14] new distances functions to test. --- .../bukkit/towny/object/TownyWorld.java | 27 +++++++++++++++++++ .../bukkit/towny/utils/AreaSelectionUtil.java | 9 +++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index afc330c1a9..0f77557acd 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -930,6 +930,33 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull return minSqr == -1 ? Integer.MAX_VALUE : (int) Math.ceil(Math.sqrt(minSqr)); } + public boolean worldCoordNotTooCloseToOtherTowns(Coord key, Town homeTown) { + final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + final int keyX = key.getX(); + final int keyZ = key.getZ(); + + for(Town town : getTowns().values()){ + if (homeTown != null && townSkippedByProximityFilter(town, homeTown, t -> false)) // No skip with the predicate here because it will be done later by the map. + continue; + + for (TownBlock b : town.getTownBlocks()) { + if (!b.getWorld().equals(this)) continue; + + final int tbX = b.getX(); + final int tbZ = b.getZ(); + + if (keyX == tbX && keyZ == tbZ) + continue; + + final double distSqr = MathUtil.distanceSquared((double) tbX - keyX, (double) tbZ - keyZ); + // If there is a town that is too close, return false. + if (minDistances.entrySet().stream().anyMatch(entry -> distSqr >= entry.getKey() && !entry.getValue().test(town))) + return false; + } + } + return true; + } + /** * Skip over the proximity filter if the town is any one of the following: * the same as homeTown OR is ignorable for a reason set in the Predicate diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java index 8e05471a7e..e51965eb1f 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java @@ -345,11 +345,16 @@ public static List filterInvalidProximityTownBlocks(List return out; } + // private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { + // TownyWorld townyWorld = worldCoord.getTownyWorld(); + // return townyWorld != null + // && townyWorld.getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() + // && townyWorld.getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks(); + // } private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { TownyWorld townyWorld = worldCoord.getTownyWorld(); return townyWorld != null - && townyWorld.getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() - && townyWorld.getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks(); + && townyWorld.worldCoordNotTooCloseToOtherTowns(worldCoord, town); } /** From 0bf47da8d5382092bdd28e425524080d177881d4 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Sat, 8 Jun 2024 21:46:21 +0200 Subject: [PATCH 09/14] back to Java 8 --- .../com/palmergames/bukkit/towny/object/TownyWorld.java | 5 ++++- .../palmergames/bukkit/towny/utils/AreaSelectionUtil.java | 6 ------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 0f77557acd..9900b77e29 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -931,7 +931,10 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } public boolean worldCoordNotTooCloseToOtherTowns(Coord key, Town homeTown) { - final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + // final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + final Map> minDistances = new HashMap<>(); + minDistances.put(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false); + minDistances.put(TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); final int keyX = key.getX(); final int keyZ = key.getZ(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java index e51965eb1f..6d919ecf7b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java @@ -345,12 +345,6 @@ public static List filterInvalidProximityTownBlocks(List return out; } - // private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { - // TownyWorld townyWorld = worldCoord.getTownyWorld(); - // return townyWorld != null - // && townyWorld.getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() - // && townyWorld.getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks(); - // } private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { TownyWorld townyWorld = worldCoord.getTownyWorld(); return townyWorld != null From cf10d3c37f532cb99054718343638f6c5099bd56 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Wed, 19 Jun 2024 10:44:13 +0200 Subject: [PATCH 10/14] Back to Java 8 & remove commented code --- .../com/palmergames/bukkit/towny/object/TownyWorld.java | 5 ++++- .../palmergames/bukkit/towny/utils/AreaSelectionUtil.java | 6 ------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 0f77557acd..9900b77e29 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -931,7 +931,10 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } public boolean worldCoordNotTooCloseToOtherTowns(Coord key, Town homeTown) { - final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + // final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + final Map> minDistances = new HashMap<>(); + minDistances.put(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false); + minDistances.put(TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); final int keyX = key.getX(); final int keyZ = key.getZ(); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java index e51965eb1f..6d919ecf7b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/AreaSelectionUtil.java @@ -345,12 +345,6 @@ public static List filterInvalidProximityTownBlocks(List return out; } - // private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { - // TownyWorld townyWorld = worldCoord.getTownyWorld(); - // return townyWorld != null - // && townyWorld.getMinDistanceFromOtherTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromTownPlotblocks() - // && townyWorld.getMinDistanceFromOtherOlderTownsPlots(worldCoord, town) >= TownySettings.getMinDistanceFromOlderTownPlotblocks(); - // } private static boolean worldCoordNotTooCloseToOtherTowns(Town town, WorldCoord worldCoord) { TownyWorld townyWorld = worldCoord.getTownyWorld(); return townyWorld != null From 644aaba7fe023ab65de39bdf6d5fa1ff8aba0e50 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Wed, 19 Jun 2024 10:59:46 +0200 Subject: [PATCH 11/14] Java 17 --- .../java/com/palmergames/bukkit/towny/object/TownyWorld.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 9900b77e29..0f77557acd 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -931,10 +931,7 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } public boolean worldCoordNotTooCloseToOtherTowns(Coord key, Town homeTown) { - // final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); - final Map> minDistances = new HashMap<>(); - minDistances.put(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false); - minDistances.put(TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); final int keyX = key.getX(); final int keyZ = key.getZ(); From aa4e001d5a9f0ea943e58f79131282a03cdce71a Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Wed, 19 Jun 2024 11:40:23 +0200 Subject: [PATCH 12/14] Fix map possible duplicate key and test predicate only if usefull --- .../com/palmergames/bukkit/towny/object/TownyWorld.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java index 0f77557acd..95fda2adcc 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/object/TownyWorld.java @@ -931,7 +931,13 @@ private int getMinDistanceFromOtherTownsPlots(Coord key, Town homeTown, @NotNull } public boolean worldCoordNotTooCloseToOtherTowns(Coord key, Town homeTown) { - final Map> minDistances = Map.of(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false, TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + final Map> minDistances = new HashMap<>(); + if(TownySettings.getMinDistanceFromTownPlotblocks() > 0){ + minDistances.put(TownySettings.getMinDistanceFromTownPlotblocks(), t -> false); + } + if (TownySettings.getMinDistanceFromOlderTownPlotblocks() > TownySettings.getMinDistanceFromTownPlotblocks()){ + minDistances.put(TownySettings.getMinDistanceFromOlderTownPlotblocks(), t -> t.getRegistered() > homeTown.getRegistered()); + } final int keyX = key.getX(); final int keyZ = key.getZ(); From ac0339f76ebd3e2697f70e025bcd0443f853aa28 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Wed, 19 Jun 2024 11:40:32 +0200 Subject: [PATCH 13/14] 1st try with tests --- .../bukkit/towny/object/TownyWorldTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java b/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java new file mode 100644 index 0000000000..a0fe3f0353 --- /dev/null +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java @@ -0,0 +1,50 @@ +package com.palmergames.bukkit.towny.object; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import com.palmergames.bukkit.towny.TownySettings; +import com.palmergames.bukkit.towny.command.TownyCommand; +import be.seeseemelk.mockbukkit.MockBukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.bukkit.Location; + +class TownyWorldTest { + + @BeforeAll + static void init() { + MockBukkit.getOrCreateMock(); + TownySettings.loadDefaultConfig(); + } + + @BeforeEach + void reset() { + // TownySettings.getConfig().set(ConfigNodes.X.getRoot(), 0); + } + + @Test + void testTownCreationWithNoOtherTown() { + TownyWorld world = new TownyWorld("world"); + Town town = new Town("testTown"); + town.setWorld(world); + + // Player testTownOwnerPlayer = MockBukkit.getOrCreateMock().addPlayer("testTownOwner"); + // Resident testTownOwner = new Resident(testTownOwnerPlayer.getName()); + // town.setMayor(testTownOwner); + // add a claim to the town + // town.addClaim(new TownBlock(town, new WorldCoord(town.getWorld(), 0, 0))); + // Towny plugin = MockBukkit.load(Towny.class); + // Player player = null; + // new TownClaim(plugin, player, town, List.of(new WorldCoord("world", 0, 0)), false, true, false, false); + assertTrue(world.hasTowns()); + assertTrue(world.worldCoordNotTooCloseToOtherTowns(new Coord(0, 0), town)); + // TownyCommand.onCommand(testTownOwnerPlayer, @NotNull Command cmd, @NotNull String label, String[] args); + // Run command to claim a townblock + // testTownOwnerPlayer.teleport(new Location(MockBukkit.getOrCreateMock().getWorld("world"), 1, 0, 1)); + // testTownOwnerPlayer.performCommand("town claim"); + } +} From 4f20b15b905475e6cff92e668456754d21af9020 Mon Sep 17 00:00:00 2001 From: HydrolienF Date: Tue, 20 Aug 2024 18:01:15 +0200 Subject: [PATCH 14/14] Simple test with min claim distance. It's not working for now because townBlock.setTown(...) try to use the pugins, witch is null. --- .../bukkit/towny/object/TownyWorldTest.java | 63 ++++++++++++------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java b/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java index a0fe3f0353..0c4fc0794b 100644 --- a/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java +++ b/Towny/src/test/java/com/palmergames/bukkit/towny/object/TownyWorldTest.java @@ -1,17 +1,15 @@ package com.palmergames.bukkit.towny.object; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.UUID; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import com.palmergames.bukkit.config.ConfigNodes; import com.palmergames.bukkit.towny.TownySettings; -import com.palmergames.bukkit.towny.command.TownyCommand; import be.seeseemelk.mockbukkit.MockBukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.bukkit.Location; class TownyWorldTest { @@ -19,11 +17,7 @@ class TownyWorldTest { static void init() { MockBukkit.getOrCreateMock(); TownySettings.loadDefaultConfig(); - } - - @BeforeEach - void reset() { - // TownySettings.getConfig().set(ConfigNodes.X.getRoot(), 0); + // new Towny(); } @Test @@ -32,19 +26,40 @@ void testTownCreationWithNoOtherTown() { Town town = new Town("testTown"); town.setWorld(world); - // Player testTownOwnerPlayer = MockBukkit.getOrCreateMock().addPlayer("testTownOwner"); - // Resident testTownOwner = new Resident(testTownOwnerPlayer.getName()); - // town.setMayor(testTownOwner); - // add a claim to the town - // town.addClaim(new TownBlock(town, new WorldCoord(town.getWorld(), 0, 0))); - // Towny plugin = MockBukkit.load(Towny.class); - // Player player = null; - // new TownClaim(plugin, player, town, List.of(new WorldCoord("world", 0, 0)), false, true, false, false); assertTrue(world.hasTowns()); assertTrue(world.worldCoordNotTooCloseToOtherTowns(new Coord(0, 0), town)); - // TownyCommand.onCommand(testTownOwnerPlayer, @NotNull Command cmd, @NotNull String label, String[] args); - // Run command to claim a townblock - // testTownOwnerPlayer.teleport(new Location(MockBukkit.getOrCreateMock().getWorld("world"), 1, 0, 1)); - // testTownOwnerPlayer.performCommand("town claim"); } + + @ParameterizedTest + @CsvSource({"0,0, 0,0,0,false", "0,1, 0,0,0,true", "0,1, 1,0,0,false", "0,1, 0,1,0,false", "0,1, 0,0,1,false", "0,2, 1,0,0,true", + "0,2, 0,1,0,true", "0,2, 0,0,1,true"}) + void testTownCreationWithOneOtherTown(int x, int z, int minDistanceBetweenHomeblocks, int minPlotDistanceFromTownPlot, + int minPlotDistanceFromOlderTownPlot, boolean expected) { + TownySettings.getConfig().set(ConfigNodes.CLAIMING_MIN_DISTANCE_BETWEEN_HOMEBLOCKS.getRoot(), minDistanceBetweenHomeblocks); + TownySettings.getConfig().set(ConfigNodes.CLAIMING_MIN_PLOT_DISTANCE_FROM_TOWN_PLOT.getRoot(), minPlotDistanceFromTownPlot); + TownySettings.getConfig().set(ConfigNodes.CLAIMING_MIN_PLOT_DISTANCE_FROM_OLDER_TOWN_PLOT.getRoot(), + minPlotDistanceFromOlderTownPlot); + TownyWorld world = new TownyWorld("world"); + Town oldTown = new Town("oldTown"); + oldTown.setUUID(UUID.randomUUID()); + oldTown.setWorld(world); + TownBlock townBlock = new TownBlock(0, 0, world); + // townBlock.setTown(oldTown); + // Upper line throws: + // java.lang.IllegalStateException: Attempted to use getPlugin() while the plugin is null, are you shading Towny? If you do not + // understand this message, join the Towny discord using https://discord.com/invite/gnpVs5m and ask for support. + // at com.palmergames.bukkit.towny.Towny.getPlugin(Towny.java:764) + // at com.palmergames.bukkit.towny.TownyUniverse.(TownyUniverse.java:100) + // at com.palmergames.bukkit.towny.TownyUniverse.getInstance(TownyUniverse.java:106) + // at com.palmergames.bukkit.towny.object.TownBlock.setTown(TownBlock.java:79) + // at com.palmergames.bukkit.towny.object.TownBlock.setTown(TownBlock.java:68) + + Town newTown = new Town("newTown"); + newTown.setUUID(UUID.randomUUID()); + newTown.setWorld(world); + + + assertEquals(expected, world.worldCoordNotTooCloseToOtherTowns(new Coord(x, z), newTown)); + } + }