feat(lager): lagerture undgår markører andre udkørsels-forløb henter fra (Milk Store læsser af ved 'unload', ikke ved 'Load') (v1.17.5.0)

This commit is contained in:
2026-09-24 04:07:51 +02:00
parent c0f523700e
commit 73e886ee26
8 changed files with 82 additions and 13 deletions
+18 -7
View File
@@ -54,7 +54,23 @@ end
-- Nærmeste silo med plads til resten og vejnet fra traktoren; siloer der allerede har varen
-- foretrækkes. Returnerer marker — eller nil + en forklaring (til loggen).
-- excludedPlaceables (valgfri): {[placeable] = true} der aldrig må vælges (fx udkørslens kilder).
function ADLoadSwap.findDumpMarker(adEnv, vehicle, fillType, rest, homeWayPointId, isReachable, excludedPlaceables)
-- Rækkefølge for aflæsnings-siloer: markører et forløb HENTER fra (avoidMarkers = {[id] = true}) sidst —
-- ellers læsser en lagertur af dér hvor en salgstur skal læsse (samme tank-række); dernæst siloer der
-- allerede har varen, så nærmeste. Returnerer en ny sorteret liste.
function ADLoadSwap.rankDumpCandidates(candidates, avoidMarkers)
local ranked = {}
for _, candidate in ipairs(candidates or {}) do table.insert(ranked, candidate) end
local function avoided(candidate) return avoidMarkers ~= nil and avoidMarkers[candidate.marker.id] == true end
table.sort(ranked, function(a, b)
if avoided(a) ~= avoided(b) then return not avoided(a) end
if a.hasFillType ~= b.hasFillType then return a.hasFillType end
if a.distance ~= b.distance then return a.distance < b.distance end
return a.marker.id < b.marker.id
end)
return ranked
end
function ADLoadSwap.findDumpMarker(adEnv, vehicle, fillType, rest, homeWayPointId, isReachable, excludedPlaceables, avoidMarkers)
if vehicle.rootNode == nil then
return nil, "køretøjet har ingen position"
end
@@ -82,12 +98,7 @@ function ADLoadSwap.findDumpMarker(adEnv, vehicle, fillType, rest, homeWayPointI
end
end
end
table.sort(candidates, function(a, b)
if a.hasFillType ~= b.hasFillType then
return a.hasFillType
end
return a.distance < b.distance
end)
candidates = ADLoadSwap.rankDumpCandidates(candidates, avoidMarkers)
for _, candidate in ipairs(candidates) do
if isReachable(candidate.marker.id) then
return candidate.marker
+2 -1
View File
@@ -200,7 +200,8 @@ local function findStoreMarker(adEnv, vehicle, product, capacity, sources, liter
end
end
local liters = math.max(1, math.min(available, capacity or available))
local marker = ADLoadSwap.findDumpMarker(adEnv, vehicle, product.fillType, liters, nil, isReachable, ADSources.getSourcePlaceables(sources))
local avoid = ADRunsController ~= nil and ADRunsController.getPickupMarkers ~= nil and ADRunsController.getPickupMarkers() or nil
local marker = ADLoadSwap.findDumpMarker(adEnv, vehicle, product.fillType, liters, nil, isReachable, ADSources.getSourcePlaceables(sources), avoid)
if marker == nil then
return nil
end
+11
View File
@@ -136,6 +136,17 @@ function ADRunsController.unassignVehicle(vehicle)
end
end
-- Markører udkørsels-forløb HENTER fra: {[wayPointId] = true}. Lagerture læsser helst ikke af dér.
function ADRunsController.getPickupMarkers()
local result = {}
for _, run in ipairs(ADRunsController.store ~= nil and ADRunsController.store.runs or {}) do
if run.kind == "outbound" then
for _, wayPointId in ipairs(run.sourceWayPointIds or {}) do result[wayPointId] = true end
end
end
return result
end
-- ---- køretøjsnavne ----
ADRunsController.NAME_INTERVAL_MS = 2000
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.17.4.0</version>
<version>1.17.5.0</version>
<title>
<en>AD Smart Pickup</en>
</title>