fix(forsyning): rest ved fuldt mål køres til run'ets andet mål med mest plads før Wait; staldes læssestationer er aldrig kilde for halm/foder (kun output) (v1.18.6.0)

This commit is contained in:
2026-09-24 18:07:24 +02:00
parent 2d6d2c31a5
commit a281600760
6 changed files with 97 additions and 9 deletions
+20
View File
@@ -272,7 +272,27 @@ end
-- En fabriks læssestation udleverer også dens INPUTS (fx halm i en TMR-fabrik).
-- Dem stjæler vi aldrig — fabrikken ville løbe tør for det, den skal bruge.
-- Outputs (og varer der både er input og output i en kæde) må gerne hentes.
-- En STALDS læssestation udleverer kun staldens produktion. Den kan dog "have" halm/foder/vand
-- (strøelse, trug, udvidelseslagre inden for storageRadius) — dem henter vi aldrig dér.
local HUSBANDRY_OUTPUTS = {MILK = true, GOATMILK = true, BUFFALOMILK = true, SHEEPMILK = true, LIQUIDMANURE = true, MANURE = true, DIGESTATE = true, EGG = true, WOOL = true}
local function isProtectedHusbandryInput(station, fillTypes)
local placeable = station.owningPlaceable
if placeable == nil or placeable.getHusbandryFillLevel == nil or g_fillTypeManager == nil then
return false
end
for _, fillType in ipairs(fillTypes) do
if not HUSBANDRY_OUTPUTS[tostring(g_fillTypeManager:getFillTypeNameByIndex(fillType))] then
return true
end
end
return false
end
local function isProtectedProductionInput(station, fillTypes)
if isProtectedHusbandryInput(station, fillTypes) then
return true
end
local productionPoint = getProductionPoint(station)
if productionPoint == nil or productionPoint.productions == nil then
return false
+32
View File
@@ -119,6 +119,27 @@ local function isAtUnloadTarget(adEnv, vehicle)
end
-- Står køretøjet ved målet med rest-læs, som målet ikke kan tage? Så find et Wait-punkt.
ADUnloadWait.MIN_FREE_FOR_OTHER_TARGET = 1000
-- Det af run'ets ANDRE mål der tager varen og har mest fri plads (≥ MIN_FREE_FOR_OTHER_TARGET) og vej.
local function findOtherTargetForRest(adEnv, vehicle, fillType, currentId)
local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle ~= nil and ADRunsController.getRunForVehicle(vehicle) or nil
if run == nil or (run.kind or "supply") ~= "supply" or vehicle.ad.stateModule.setSecondMarkerByWayPointId == nil then
return nil
end
local best, bestFree = nil, ADUnloadWait.MIN_FREE_FOR_OTHER_TARGET - 1
for _, targetId in ipairs(ADRunsController.getRunTargets(run)) do
if targetId ~= currentId then
local free = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType, false, targetId)
if free ~= nil and free > bestFree and hasRouteTo(adEnv, vehicle, targetId) then
local marker = adEnv.ADGraphManager.getMapMarkerByWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(targetId) or nil
best, bestFree = {id = targetId, name = marker ~= nil and marker.name or tostring(targetId)}, free
end
end
end
return best, bestFree
end
local function startWaiting(adEnv, task)
local vehicle = task.vehicle
-- Kun "fremme ved målet". At AD stadig regner vognen som aflæssende (isActiveAtTrigger)
@@ -157,6 +178,17 @@ local function startWaiting(adEnv, task)
return
end
-- Run med flere mål: resten køres til det af run'ets andre mål der har mest plads til varen,
-- før der ventes (en 2,4M l-vogn kan ellers aldrig komme af med resten ved én svinesti)
local other, otherFree = findOtherTargetForRest(adEnv, vehicle, fillType, target.id)
if other ~= nil then
vehicle.ad.stateModule:setSecondMarkerByWayPointId(other.id)
redirect(task, other.id)
Logging.info(ADUnloadWait.LOG_PREFIX .. "'%s': %s er fuld — resten (%.0f l %s) køres til %s (%.0f l fri)", tostring(ADRuns.vehicleLabel(vehicle)), tostring(target.name), rest,
g_fillTypeManager ~= nil and tostring(g_fillTypeManager:getFillTypeNameByIndex(fillType)) or tostring(fillType), tostring(other.name), otherFree)
return
end
local isReachable = function(candidate)
return hasRouteBothWays(adEnv, vehicle, candidate.marker.id, task.destinationID)
end
+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.18.5.0</version>
<version>1.18.6.0</version>
<title>
<en>AD Smart Pickup</en>
</title>