fix: rute-tjek begge veje før Wait-omdirigering; hjem ved halv-tomt mål (v1.7.2.0)

In-game 2026-09-22 21:37: Fastrac omdirigeret til 'Cow Wait' uden vejnet dertil ->
AutoDrive 'cannot reach' + StopAndDisableADTask (AD slukket i stalden). Nu:
ADGraphManager:getPathTo + pathFromTo (rene opslag) skal ende i hhv. Wait-punkt og
mål, ellers næste punkt; intet nåeligt = som i dag + advarsel.

700.000 l-vogn i 300.000 l-stald kunne aldrig opfylde 'hele resten passer':
ADSupplyPlanner.canUnloadRest = fri >= min(rest, 50 % af kapacitet).
This commit is contained in:
2026-09-22 21:44:55 +02:00
parent a4a761fabc
commit b8da94a254
7 changed files with 112 additions and 18 deletions
+24 -4
View File
@@ -60,6 +60,23 @@ local function getVehiclePosition(vehicle)
return x, z
end
-- Ender ruten i målet? (AutoDrive returnerer tom/afkortet liste når der ingen vej er.)
local function pathReaches(path, wayPointId)
return path ~= nil and #path > 0 and path[#path].id == wayPointId
end
-- Findes der vejnet fra køretøjet til Wait-punktet OG fra Wait-punktet hjem til målet?
-- Sendes AutoDrive mod et punkt uden rute, viser den "cannot reach" og slukker sig selv.
-- getPathTo/pathFromTo er rene opslag uden bivirkninger.
local function hasRouteBothWays(adEnv, vehicle, waitWayPointId, homeWayPointId)
local graph = adEnv.ADGraphManager
if graph.getPathTo == nil or graph.pathFromTo == nil then
return true
end
return pathReaches(graph:getPathTo(vehicle, waitWayPointId), waitWayPointId)
and pathReaches(graph:pathFromTo(waitWayPointId, homeWayPointId), homeWayPointId)
end
local function redirect(task, destinationID)
task.destinationID = destinationID
task.state = ADUnloadWait.STATE_DRIVING
@@ -90,11 +107,14 @@ local function startWaiting(adEnv, task)
end
local x, z = getVehiclePosition(vehicle)
local candidate = x ~= nil and ADSupplyPlanner.pickNearestFreeWaitPoint(getWaitCandidates(adEnv), claims, x, z, vehicle) or nil
local isReachable = function(candidate)
return hasRouteBothWays(adEnv, vehicle, candidate.marker.id, task.destinationID)
end
local candidate = x ~= nil and ADSupplyPlanner.pickNearestFreeWaitPoint(getWaitCandidates(adEnv), claims, x, z, vehicle, isReachable) or nil
if candidate == nil then
if not warnedNoWaitPoint[vehicle] then
warnedNoWaitPoint[vehicle] = true
Logging.warning(ADUnloadWait.LOG_PREFIX .. "'%s' har %.0f l rest, og målet er fuldt — intet ledigt Wait-punkt (markør i en mappe med 'Wait' i navnet), så AutoDrive venter ved målet", tostring(vehicle:getName()), rest)
Logging.warning(ADUnloadWait.LOG_PREFIX .. "'%s' har %.0f l rest, og målet er fuldt — intet ledigt Wait-punkt med vejnet til OG fra målet (markør i en mappe med 'Wait' i navnet), så AutoDrive venter ved målet", tostring(vehicle:getName()), rest)
end
return
end
@@ -118,8 +138,8 @@ local function updateWaiting(adEnv, task, wait)
release(vehicle)
return
end
local free = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType)
if free == nil or free < rest then
local free, capacity = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType)
if free == nil or not ADSupplyPlanner.canUnloadRest(free, rest, capacity) then
return
end
local home = wait.homeDestinationID