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:
@@ -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
|
||||
|
||||
@@ -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,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>
|
||||
|
||||
Reference in New Issue
Block a user