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
+27 -8
View File
@@ -132,20 +132,39 @@ function ADSupplyPlanner.isWaitMarker(marker)
end
-- candidates: {{marker, x, z}}; claims: {[marker.id] = køretøj}. Nærmeste punkt der er
-- ledigt eller allerede reserveret af dette køretøj. nil hvis alle er optaget.
function ADSupplyPlanner.pickNearestFreeWaitPoint(candidates, claims, x, z, vehicle)
local best, bestDistance = nil, nil
-- ledigt (eller allerede reserveret af dette køretøj) og som isReachable(candidate)
-- godkender (valgfri; AutoDrive slukker sig selv, hvis den sendes mod et punkt uden rute).
-- nil hvis intet punkt duer. Nåelighed tjekkes kun for de punkter der er i spil, nærmeste først.
function ADSupplyPlanner.pickNearestFreeWaitPoint(candidates, claims, x, z, vehicle, isReachable)
local free = {}
for _, candidate in ipairs(candidates) do
local owner = claims[candidate.marker.id]
if owner == nil or owner == vehicle then
local dx, dz = candidate.x - x, candidate.z - z
local distance = dx * dx + dz * dz
if bestDistance == nil or distance < bestDistance then
best, bestDistance = candidate, distance
end
table.insert(free, {candidate = candidate, distance = dx * dx + dz * dz})
end
end
return best
table.sort(free, function(a, b) return a.distance < b.distance end)
for _, entry in ipairs(free) do
if isReachable == nil or isReachable(entry.candidate) then
return entry.candidate
end
end
return nil
end
-- Så stor en andel af målets kapacitet skal være fri, før en rest der er større end
-- det, kan afleveres (en 700.000 l-vogn kan aldrig tømme HELE resten i en 300.000 l-stald).
ADSupplyPlanner.WAIT_RETURN_FREE_FRACTION = 0.5
-- Kan den ventende køre hjem? Ja når hele resten passer, eller når målet er mindst
-- WAIT_RETURN_FREE_FRACTION tomt. capacity nil = kun hele resten tæller.
function ADSupplyPlanner.canUnloadRest(freeSpace, rest, capacity)
local needed = rest
if capacity ~= nil and capacity > 0 then
needed = math.min(rest, capacity * ADSupplyPlanner.WAIT_RETURN_FREE_FRACTION)
end
return freeSpace >= needed
end
-- needs: {{fillType, level, capacity[, litersPerMinute]}, ...}. Returnerer NY liste,