Skip to content

Commit 673013c

Browse files
someaddonsRaycomsThodor12
authored
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 7c433f7 commit 673013c

8 files changed

Lines changed: 26 additions & 93 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 & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,8 @@ public class ServerConfiguration extends AbstractConfiguration
104104
* ------------------- ######## Pathfinding Settings ######## ------------------- *
105105
* ------------------------------------------------------------------------------ */
106106

107-
public final ForgeConfigSpec.IntValue pathfindingDebugVerbosity;
108-
public final ForgeConfigSpec.IntValue pathfindingMaxThreadCount;
109107
public final ForgeConfigSpec.IntValue minimumRailsToPath;
108+
public final ForgeConfigSpec.DoubleValue pathNodeLimitMultiplier;
110109

111110
/* --------------------------------------------------------------------------------- *
112111
* ------------------- ######## Request System Settings ######## ------------------- *
@@ -196,9 +195,8 @@ protected ServerConfiguration(final ForgeConfigSpec.Builder builder)
196195

197196
swapToCategory(builder, "pathfinding");
198197

199-
pathfindingDebugVerbosity = defineInteger(builder, "pathfindingdebugverbosity", 0, 0, 10);
200198
minimumRailsToPath = defineInteger(builder, "minimumrailstopath", 8, 5, 100);
201-
pathfindingMaxThreadCount = defineInteger(builder, "pathfindingmaxthreadcount", 1, 1, 10);
199+
pathNodeLimitMultiplier = defineDouble(builder, "pathNodeLimitMultiplier", 1, 1, 4);
202200

203201
swapToCategory(builder, "requestSystem");
204202

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;
@@ -775,16 +774,6 @@ private boolean mineIfEqualsBlockTag(List<BlockPos> blockPositions, TagKey<Block
775774
{
776775
for (BlockPos currentPos : blockPositions)
777776
{
778-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() > 0)
779-
{
780-
Log.getLogger()
781-
.info(String.format("Check Leaves Pos(%d, %d, %d) is %s: %s",
782-
currentPos.getX(),
783-
currentPos.getY(),
784-
currentPos.getZ(),
785-
tag.toString(),
786-
world.getBlockState(currentPos).is(tag)));
787-
}
788777
if (world.getBlockState(currentPos).is(tag))
789778
{
790779
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
@@ -44,8 +44,10 @@
4444
import java.util.*;
4545
import java.util.concurrent.Callable;
4646

47-
import static com.minecolonies.api.util.constant.PathingConstants.*;
47+
import static com.minecolonies.api.util.constant.PathingConstants.HALF_A_BLOCK;
48+
import static com.minecolonies.api.util.constant.PathingConstants.MAX_JUMP_HEIGHT;
4849
import static com.minecolonies.core.entity.pathfinding.PathingOptions.MAX_COST;
50+
4951
/**
5052
* Abstract class for Jobs that run in the multithreaded path finder.
5153
*/
@@ -54,7 +56,7 @@ public abstract class AbstractPathJob implements Callable<Path>, IPathJob
5456
/**
5557
* Maximium amount of nodes explored
5658
*/
57-
public static final int MAX_NODES = 5000;
59+
public static final int MAX_NODES = 8000;
5860

5961
/**
6062
* Start position to path from.
@@ -202,6 +204,8 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, int ran
202204
{
203205
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
204206
}
207+
208+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
205209
}
206210

207211
/**
@@ -232,6 +236,8 @@ protected AbstractPathJob(final Level actualWorld, final LevelReader chunkCache,
232236
{
233237
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
234238
}
239+
240+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
235241
}
236242

237243
/**
@@ -255,12 +261,15 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul
255261

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

262-
this.maxNodes =
263-
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)));
267+
final int directDistance = xDiff + yDiff + zDiff;
268+
final int corridorRadius = Math.min(20, 3 + directDistance / 20);
269+
final int corridorVolume = directDistance * corridorRadius * corridorRadius;
270+
final int estimate = 300 + directDistance * 16 + corridorVolume * 2;
271+
this.maxNodes = Math.min(MAX_NODES, estimate);
272+
264273
nodesToVisit = new PriorityQueue<>(maxNodes / 4);
265274
this.start = new BlockPos(start);
266275

@@ -274,6 +283,8 @@ public AbstractPathJob(final Level world, @NotNull final BlockPos start, @NotNul
274283
{
275284
heuristicMod = 1 + navigator.getAvgHeuristicModifier();
276285
}
286+
287+
this.maxNodes = (int) (maxNodes * MineColonies.getConfig().getServer().pathNodeLimitMultiplier.get());
277288
}
278289

279290
/**
@@ -591,14 +602,8 @@ private boolean reevaluteHeuristic(final MNode node, final boolean reaches)
591602
return false;
592603
}
593604

594-
// 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
595-
if (reaches && maxCost > 20 && visitedLevel == 1 && totalNodesVisited < maxNodes * 0.5)
596-
{
597-
costPerEstimation *= 0.7;
598-
}
599-
600605
// Detect an overstimating heuristic(not guranteed, but can check the found path)
601-
if (costPerEstimation < 0.9 || (costPerEstimation > 1.2 && !reaches))
606+
if (costPerEstimation < 0.9 || (costPerEstimation > 1.2 && !reaches) || visitedLevel == 1)
602607
{
603608
// Overshoot a bit
604609
costPerEstimation *= costPerEstimation < 1 ? 0.9 : 1.1;
@@ -1215,8 +1220,6 @@ else if (p.isOnRails() && points.length > pathLength + 1)
12151220
node = node.parent;
12161221
}
12171222

1218-
doDebugPrinting(points);
1219-
12201223
if (points.length > 1)
12211224
{
12221225
result.costPerDist = targetNode.getCost() / BlockPosUtil.distManhattan(start, targetNode.x, targetNode.y, targetNode.z);
@@ -1788,12 +1791,6 @@ protected void handleDebugOptions(final MNode node)
17881791
if (debugDrawEnabled)
17891792
{
17901793
addNodeToDebug(node);
1791-
1792-
if (MineColonies.getConfig().getServer().pathfindingDebugVerbosity.get() == DEBUG_VERBOSITY_FULL)
1793-
{
1794-
Log.getLogger().info(String.format("Examining node [%d,%d,%d] ; c=%f ; h=%f",
1795-
node.x, node.y, node.z, node.getCost(), node.getHeuristic()));
1796-
}
17971794
}
17981795
}
17991796

@@ -1831,29 +1828,6 @@ private void handleDebugPathReach(final MNode bestNode)
18311828
}
18321829
}
18331830

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

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)