Skip to content

Commit 4d239cd

Browse files
RaycomsThodor12
andcommitted
Pathfinding improvements for bridges (#11698)
* Removed old pathfinding debug config Add new pathfinding config, allowing high max node limits at the sake of performance Improved pathfinding to make citizens better at finding bridges * Prevent random buildings containing stash or postbox * Update src/main/resources/assets/minecolonies/lang/manual_en_us.json Co-authored-by: Thom van den Akker <thodor20@gmail.com> --------- Co-authored-by: Raycoms <ray.neiheiser@gmail.com> Co-authored-by: Thom van den Akker <thodor20@gmail.com>
1 parent 74a3295 commit 4d239cd

8 files changed

Lines changed: 26 additions & 95 deletions

File tree

src/main/java/com/minecolonies/api/colony/managers/interfaces/ICommonRegisteredStructureManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.minecolonies.api.colony.IColony;
44
import com.minecolonies.api.colony.buildingextensions.IBuildingExtension;
55
import com.minecolonies.api.colony.buildings.ICommonBuilding;
6+
import com.minecolonies.api.colony.buildings.ModBuildings;
67
import com.minecolonies.api.entity.citizen.AbstractEntityCitizen;
78
import com.minecolonies.api.util.Log;
89
import com.minecolonies.api.util.WorldUtil;
@@ -162,7 +163,7 @@ default BlockPos getRandomBuilding(Predicate<B> filterPredicate)
162163
final List<B> allowedBuildings = new ArrayList<>();
163164
for (final B building : getBuildings().values())
164165
{
165-
if (filterPredicate.test(building))
166+
if (building.getBuildingType() != ModBuildings.stash.get() && building.getBuildingType() != ModBuildings.postBox.get() && filterPredicate.test(building))
166167
{
167168
allowedBuildings.add(building);
168169
}

src/main/java/com/minecolonies/api/configuration/ServerConfiguration.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,8 @@ public class ServerConfiguration extends AbstractConfiguration
106106
* ------------------- ######## Pathfinding Settings ######## ------------------- *
107107
* ------------------------------------------------------------------------------ */
108108

109-
public final IntValue pathfindingDebugVerbosity;
110-
public final IntValue pathfindingMaxThreadCount;
111109
public final IntValue minimumRailsToPath;
110+
public final DoubleValue pathNodeLimitMultiplier;
112111

113112
/* --------------------------------------------------------------------------------- *
114113
* ------------------- ######## Request System Settings ######## ------------------- *
@@ -199,11 +198,8 @@ public ServerConfiguration(final Builder builder)
199198
debugInventories = defineBoolean("debuginventories", false);
200199
blueprintBuildMode = defineBoolean("blueprintbuildmode", false);
201200

202-
swapToCategory("pathfinding");
203-
204-
pathfindingDebugVerbosity = defineInteger("pathfindingdebugverbosity", 0, 0, 10);
201+
pathNodeLimitMultiplier = defineDouble("pathNodeLimitMultiplier", 1, 1, 4);
205202
minimumRailsToPath = defineInteger("minimumrailstopath", 8, 5, 100);
206-
pathfindingMaxThreadCount = defineInteger("pathfindingmaxthreadcount", 1, 1, 10);
207203

208204
swapToCategory("requestSystem");
209205

src/main/java/com/minecolonies/core/entity/ai/workers/production/EntityAIWorkLumberjack.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.minecolonies.api.util.*;
1111
import com.minecolonies.api.util.constant.ColonyConstants;
1212
import com.minecolonies.api.util.constant.Constants;
13-
import com.minecolonies.core.MineColonies;
1413
import com.minecolonies.core.colony.buildings.AbstractBuilding;
1514
import com.minecolonies.core.colony.buildings.modules.BuildingModules;
1615
import com.minecolonies.core.colony.buildings.modules.ItemListModule;
@@ -774,16 +773,6 @@ private boolean mineIfEqualsBlockTag(List<BlockPos> blockPositions, TagKey<Block
774773
{
775774
for (BlockPos currentPos : blockPositions)
776775
{
777-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() > 0)
778-
{
779-
Log.getLogger()
780-
.info(String.format("Check Leaves Pos(%d, %d, %d) is %s: %s",
781-
currentPos.getX(),
782-
currentPos.getY(),
783-
currentPos.getZ(),
784-
tag.toString(),
785-
world.getBlockState(currentPos).is(tag)));
786-
}
787776
if (world.getBlockState(currentPos).is(tag))
788777
{
789778
mineBlock(currentPos);

src/main/java/com/minecolonies/core/entity/pathfinding/Pathfinding.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.minecolonies.core.entity.pathfinding;
22

33
import com.minecolonies.api.util.Log;
4-
import com.minecolonies.core.MineColonies;
54
import com.minecolonies.core.entity.pathfinding.pathjobs.AbstractPathJob;
65
import org.jetbrains.annotations.NotNull;
76

@@ -48,7 +47,7 @@ public static ThreadPoolExecutor getExecutor()
4847
{
4948
if (executor == null)
5049
{
51-
executor = new ThreadPoolExecutor(1, MineColonies.getConfig().getServer().pathfindingMaxThreadCount.get(), 10, TimeUnit.SECONDS, jobQueue, new MinecoloniesThreadFactory());
50+
executor = new ThreadPoolExecutor(1, 1, 10, TimeUnit.SECONDS, jobQueue, new MinecoloniesThreadFactory());
5251
}
5352
return executor;
5453
}

src/main/java/com/minecolonies/core/entity/pathfinding/PathingOptions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class PathingOptions
4040
/**
4141
* Additional cost of swimming - base 1.
4242
*/
43-
public double swimCost = 2D;
43+
public double swimCost = 4D;
4444

4545
/**
4646
* Additional cost of cave air.

src/main/java/com/minecolonies/core/entity/pathfinding/pathjobs/AbstractPathJob.java

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@
4343
import java.util.*;
4444
import java.util.concurrent.Callable;
4545

46-
import static com.minecolonies.api.util.constant.PathingConstants.*;
46+
import static com.minecolonies.api.util.constant.PathingConstants.HALF_A_BLOCK;
47+
import static com.minecolonies.api.util.constant.PathingConstants.MAX_JUMP_HEIGHT;
4748
import static com.minecolonies.core.entity.pathfinding.PathingOptions.MAX_COST;
49+
4850
/**
4951
* Abstract class for Jobs that run in the multithreaded path finder.
5052
*/
@@ -53,7 +55,7 @@ public abstract class AbstractPathJob implements Callable<Path>, IPathJob
5355
/**
5456
* Maximium amount of nodes explored
5557
*/
56-
public static final int MAX_NODES = 5000;
58+
public static final int MAX_NODES = 8000;
5759

5860
/**
5961
* Start position to path from.
@@ -201,6 +203,8 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, int ran
201203
{
202204
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
203205
}
206+
207+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
204208
}
205209

206210
/**
@@ -231,6 +235,8 @@ protected AbstractPathJob(final Level actualWorld, final LevelReader chunkCache,
231235
{
232236
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
233237
}
238+
239+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
234240
}
235241

236242
/**
@@ -254,12 +260,15 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul
254260

255261
// Max nodes in relation to the box area
256262
final int xDiff = Math.max(1, Math.abs(start.getX() - end.getX()));
257-
// Higher limit for Y changes, as Y is more difficult to traverse(jump/drop costs)
258-
final int yDiff = Math.max(1, Math.abs((start.getY() - end.getY()))) * 5;
263+
final int yDiff = Math.max(1, Math.abs((start.getY() - end.getY())));
259264
final int zDiff = Math.max(1, Math.abs((start.getZ() - end.getZ())));
260265

261-
this.maxNodes =
262-
Math.min(MAX_NODES, 300 + Math.max(Math.max(Math.max(2, xDiff / 10) * yDiff * zDiff, xDiff * Math.max(2, yDiff / 10) * zDiff), xDiff * yDiff * Math.max(2, zDiff / 10)));
266+
final int directDistance = xDiff + yDiff + zDiff;
267+
final int corridorRadius = Math.min(20, 3 + directDistance / 20);
268+
final int corridorVolume = directDistance * corridorRadius * corridorRadius;
269+
final int estimate = 300 + directDistance * 16 + corridorVolume * 2;
270+
this.maxNodes = Math.min(MAX_NODES, estimate);
271+
263272
nodesToVisit = new PriorityQueue<>(maxNodes / 4);
264273
this.start = new BlockPos(start);
265274

@@ -273,6 +282,8 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul
273282
{
274283
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
275284
}
285+
286+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
276287
}
277288

278289
/**
@@ -590,14 +601,8 @@ private boolean reevaluteHeuristic(final MNode node, final boolean reaches)
590601
return false;
591602
}
592603

593-
// When reaching and never having done a heuristic rebalance and we did explore a high cost assume that we found a possibly too expensive path
594-
if (reaches && maxCost > 20 && visitedLevel == 1 && totalNodesVisited < maxNodes * 0.5)
595-
{
596-
costPerEstimation *= 0.7;
597-
}
598-
599604
// Detect an overstimating heuristic(not guranteed, but can check the found path)
600-
if (costPerEstimation < 0.9 || (costPerEstimation > 1.2 && !reaches))
605+
if (costPerEstimation < 0.9 || (costPerEstimation > 1.2 && !reaches) || visitedLevel == 1)
601606
{
602607
// Overshoot a bit
603608
costPerEstimation *= costPerEstimation < 1 ? 0.9 : 1.1;
@@ -1220,8 +1225,6 @@ else if (p.isOnRails() && points.length > pathLength + 1)
12201225
node = node.parent;
12211226
}
12221227

1223-
doDebugPrinting(points);
1224-
12251228
if (points.length > 1)
12261229
{
12271230
result.costPerDist = targetNode.getCost() / BlockPosUtil.distManhattan(start, targetNode.x, targetNode.y, targetNode.z);
@@ -1793,12 +1796,6 @@ protected void handleDebugOptions(final MNode node)
17931796
if (debugDrawEnabled)
17941797
{
17951798
addNodeToDebug(node);
1796-
1797-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() == DEBUG_VERBOSITY_FULL)
1798-
{
1799-
Log.getLogger().info(String.format("Examining node [%d,%d,%d] ; c=%f ; h=%f",
1800-
node.x, node.y, node.z, node.getCost(), node.getHeuristic()));
1801-
}
18021799
}
18031800
}
18041801

@@ -1836,29 +1833,6 @@ private void handleDebugPathReach(final MNode bestNode)
18361833
}
18371834
}
18381835

1839-
/**
1840-
* Turns on debug printing.
1841-
*
1842-
* @param points the points to print.
1843-
*/
1844-
private void doDebugPrinting(@NotNull final Node[] points)
1845-
{
1846-
if (debugDrawEnabled)
1847-
{
1848-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() > DEBUG_VERBOSITY_NONE)
1849-
{
1850-
Log.getLogger().info("Path found:");
1851-
1852-
for (@NotNull final Node p : points)
1853-
{
1854-
Log.getLogger().info(String.format("Step: [%d,%d,%d]", p.x, p.y, p.z));
1855-
}
1856-
1857-
Log.getLogger().info(String.format("Total Nodes Visited %d / %d", totalNodesVisited, totalNodesAdded));
1858-
}
1859-
}
1860-
}
1861-
18621836
/**
18631837
* Adds a node to the debug view
18641838
*

src/main/java/com/minecolonies/core/entity/pathfinding/pathjobs/PathJobEscapeWater.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,14 @@
33
import com.minecolonies.api.colony.IColony;
44
import com.minecolonies.api.entity.citizen.AbstractEntityCitizen;
55
import com.minecolonies.api.util.BlockPosUtil;
6-
import com.minecolonies.api.util.Log;
7-
import com.minecolonies.core.MineColonies;
86
import com.minecolonies.core.entity.pathfinding.MNode;
97
import com.minecolonies.core.entity.pathfinding.PathingOptions;
108
import com.minecolonies.core.entity.pathfinding.SurfaceType;
119
import com.minecolonies.core.entity.pathfinding.pathresults.PathResult;
1210
import net.minecraft.core.BlockPos;
1311
import net.minecraft.world.entity.Mob;
1412
import net.minecraft.world.level.Level;
15-
import net.minecraft.world.level.pathfinder.Path;
1613
import org.jetbrains.annotations.NotNull;
17-
import org.jetbrains.annotations.Nullable;
18-
19-
import static com.minecolonies.api.util.constant.PathingConstants.DEBUG_VERBOSITY_NONE;
2014

2115
/**
2216
* Job that handles moving away from something.
@@ -62,24 +56,6 @@ public PathJobEscapeWater(
6256
}
6357
}
6458

65-
/**
66-
* Perform the search.
67-
*
68-
* @return Path of a path to the given location, a best-effort, or null.
69-
*/
70-
@Nullable
71-
@Override
72-
protected Path search()
73-
{
74-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() > DEBUG_VERBOSITY_NONE)
75-
{
76-
Log.getLogger().info(String.format("Pathfinding from [%d,%d,%d] away from [%d,%d,%d]",
77-
start.getX(), start.getY(), start.getZ(), avoid.getX(), avoid.getY(), avoid.getZ()));
78-
}
79-
80-
return super.search();
81-
}
82-
8359
/**
8460
* For MoveAwayFromLocation we want our heuristic to weight.
8561
*

src/main/resources/assets/minecolonies/lang/manual_en_us.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,8 @@
252252
"minecolonies.config.pathfindingdebugdraw.comment": "Show pathfinding paths (might be laggy).",
253253
"minecolonies.config.minimumrailstopath": "Minimum Rails",
254254
"minecolonies.config.minimumrailstopath.comment": "Minimum number of consecutive rails for citizens to use them.",
255-
"minecolonies.config.pathfindingdebugverbosity": "Pathfinding Debug Verbosity",
256-
"minecolonies.config.pathfindingdebugverbosity.comment": "Verbosity of pathfinding debug messages.",
257-
"minecolonies.config.pathfindingmaxthreadcount": "Pathfinding Max Thread Count",
258-
"minecolonies.config.pathfindingmaxthreadcount.comment": "Amount of additional threads to be used for pathfinding.",
259-
"minecolonies.config.pathfindingmaxnodes": "Pathfinding Max Nodes",
260-
"minecolonies.config.pathfindingmaxnodes.comment": "Max amount of nodes (positions) to map during pathfinding. Lowering increases performance, but might lead to pathing glitches.",
255+
"minecolonies.config.pathNodeLimitMultiplier": "Pathfinding Node Limit",
256+
"minecolonies.config.pathNodeLimitMultiplier.comment": "Increases the pathfinding node limit by the given factor, enabling citizens to search a bigger area at the cost of performance (offthread) for more accurate pathfinding.",
261257
"minecolonies.config.enabledebuglogging": "Enable Debug Logging",
262258
"minecolonies.config.enabledebuglogging.comment": "Should the request system show debug information in the debug.log? Useful if malfunctioning.",
263259
"minecolonies.config.maximalretries": "Maximal Retries",

0 commit comments

Comments
 (0)