fix(flows): tømning bruger aldrig marksiloer; kan en silo ikke tage imod, prøves den næste (op til 3) før parkering med last (v1.60.6.0)
This commit is contained in:
@@ -229,6 +229,17 @@ function ADFieldSilos.collectBuildings(adEnv)
|
|||||||
return silos, stores, byId
|
return silos, stores, byId
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Marksiloernes placeables som sæt (til at udelukke dem som tømmested — de er til markens høst).
|
||||||
|
function ADFieldSilos.fieldSiloPlaceableSet(adEnv)
|
||||||
|
local set = {}
|
||||||
|
local silos, _, byId = ADFieldSilos.collectBuildings(adEnv)
|
||||||
|
for _, silo in ipairs(silos or {}) do
|
||||||
|
local building = byId[silo.id]
|
||||||
|
if building ~= nil and building.placeable ~= nil then set[building.placeable] = true end
|
||||||
|
end
|
||||||
|
return set
|
||||||
|
end
|
||||||
|
|
||||||
local function trailerInfo(adEnv, vehicle)
|
local function trailerInfo(adEnv, vehicle)
|
||||||
local capacity, carries, cargo = 0, {}, nil
|
local capacity, carries, cargo = 0, {}, nil
|
||||||
for _, unit in ipairs(adEnv.AutoDrive.getAllDischargeableUnits(vehicle) or {}) do
|
for _, unit in ipairs(adEnv.AutoDrive.getAllDischargeableUnits(vehicle) or {}) do
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ ADFlowWagons.EMPTY_MIN_LITERS = 100
|
|||||||
ADFlowWagons.EMPTY_TIMEOUT_MS = 600000
|
ADFlowWagons.EMPTY_TIMEOUT_MS = 600000
|
||||||
ADFlowWagons.EMPTY_STALL_MS = 45000 -- ved målet uden at læsset falder så længe = målet er fuldt
|
ADFlowWagons.EMPTY_STALL_MS = 45000 -- ved målet uden at læsset falder så længe = målet er fuldt
|
||||||
ADFlowWagons.EMPTY_NEAR_M = 40 -- m fra aflæsningsmarkøren tæller som "ved målet"
|
ADFlowWagons.EMPTY_NEAR_M = 40 -- m fra aflæsningsmarkøren tæller som "ved målet"
|
||||||
|
ADFlowWagons.MAX_DUMP_ATTEMPTS = 3 -- siloer der prøves før vognen parkeres med last
|
||||||
|
|
||||||
-- s = {nearTarget, sinceChangeMs}
|
-- s = {nearTarget, sinceChangeMs}
|
||||||
function ADFlowWagons.isStalled(s)
|
function ADFlowWagons.isStalled(s)
|
||||||
@@ -145,7 +146,11 @@ function ADFlowWagons.emptyStep(stage, s)
|
|||||||
return s.hasTarget and "target" or "dump"
|
return s.hasTarget and "target" or "dump"
|
||||||
end
|
end
|
||||||
if (s.elapsedMs or 0) >= ADFlowWagons.EMPTY_TIMEOUT_MS then return "giveUp" end
|
if (s.elapsedMs or 0) >= ADFlowWagons.EMPTY_TIMEOUT_MS then return "giveUp" end
|
||||||
if s.stalled and cargo >= ADFlowWagons.EMPTY_MIN_LITERS then return stage == "target" and "dump" or "giveUp" end
|
if s.stalled and cargo >= ADFlowWagons.EMPTY_MIN_LITERS then
|
||||||
|
if stage == "target" then return "dump" end
|
||||||
|
-- silo der ikke kunne tage imod: prøv den næste (op til MAX_DUMP_ATTEMPTS)
|
||||||
|
return (s.dumpAttempts or 0) < ADFlowWagons.MAX_DUMP_ATTEMPTS and "dump" or "giveUp"
|
||||||
|
end
|
||||||
if s.adActive then return "wait" end
|
if s.adActive then return "wait" end
|
||||||
if cargo < ADFlowWagons.EMPTY_MIN_LITERS then return "home" end
|
if cargo < ADFlowWagons.EMPTY_MIN_LITERS then return "home" end
|
||||||
if stage == "target" then return "dump" end
|
if stage == "target" then return "dump" end
|
||||||
@@ -404,7 +409,11 @@ local function startDump(adEnv, vehicle, state)
|
|||||||
local isReachable = function(markerId)
|
local isReachable = function(markerId)
|
||||||
return ADUnloadWait == nil or ADUnloadWait.hasRouteTo == nil or ADUnloadWait.hasRouteTo(adEnv, vehicle, markerId)
|
return ADUnloadWait == nil or ADUnloadWait.hasRouteTo == nil or ADUnloadWait.hasRouteTo(adEnv, vehicle, markerId)
|
||||||
end
|
end
|
||||||
local ok, marker, why = pcall(ADLoadSwap.findDumpMarker, adEnv, vehicle, fillType, cargo, nil, isReachable, nil, nil, true)
|
-- marksiloer er ikke tømmesteder (de er til markens høst); siloer der allerede fejlede springes over
|
||||||
|
local okSet, fieldSilos = pcall(function() return ADFieldSilos ~= nil and ADFieldSilos.fieldSiloPlaceableSet(adEnv) or nil end)
|
||||||
|
state.triedMarkers = state.triedMarkers or {}
|
||||||
|
local ok, marker, why = pcall(ADLoadSwap.findDumpMarker, adEnv, vehicle, fillType, cargo, nil, isReachable,
|
||||||
|
okSet and fieldSilos or nil, state.triedMarkers, true)
|
||||||
if not ok or marker == nil then
|
if not ok or marker == nil then
|
||||||
Logging.warning(ADFlowWagons.LOG_PREFIX .. "'%s' har stadig %d l %s — intet sted at aflæsse (%s); parkeres med last",
|
Logging.warning(ADFlowWagons.LOG_PREFIX .. "'%s' har stadig %d l %s — intet sted at aflæsse (%s); parkeres med last",
|
||||||
tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(ok and why or marker))
|
tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(ok and why or marker))
|
||||||
@@ -413,6 +422,8 @@ local function startDump(adEnv, vehicle, state)
|
|||||||
end
|
end
|
||||||
state.stage, state.since = "dump", nowMs
|
state.stage, state.since = "dump", nowMs
|
||||||
state.markerId, state.markerName, state.lastCargo = marker.id, marker.name, nil
|
state.markerId, state.markerName, state.lastCargo = marker.id, marker.name, nil
|
||||||
|
state.dumpAttempts = (state.dumpAttempts or 0) + 1
|
||||||
|
state.triedMarkers[marker.id] = true
|
||||||
ADFieldWork.startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DELIVERTO, marker.id, nil, fillType)
|
ADFieldWork.startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DELIVERTO, marker.id, nil, fillType)
|
||||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' aflæsser resten (%d l %s) ved %s før parkering",
|
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' aflæsser resten (%d l %s) ved %s før parkering",
|
||||||
tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(marker.name))
|
tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(marker.name))
|
||||||
@@ -551,7 +562,7 @@ local function tickEmptying(adEnv)
|
|||||||
else
|
else
|
||||||
local stalled = stalledAt(adEnv, vehicle, state, cargo)
|
local stalled = stalledAt(adEnv, vehicle, state, cargo)
|
||||||
local action = ADFlowWagons.emptyStep(state.stage, {cargo = cargo, adActive = module ~= nil and module:isActive(),
|
local action = ADFlowWagons.emptyStep(state.stage, {cargo = cargo, adActive = module ~= nil and module:isActive(),
|
||||||
elapsedMs = nowMs - state.since, stalled = stalled})
|
elapsedMs = nowMs - state.since, stalled = stalled, dumpAttempts = state.dumpAttempts})
|
||||||
if stalled and action ~= "wait" then
|
if stalled and action ~= "wait" then
|
||||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' kan ikke aflæsse ved %s (fuldt?) — videre", tostring(ADRuns.vehicleLabel(vehicle)),
|
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' kan ikke aflæsse ved %s (fuldt?) — videre", tostring(ADRuns.vehicleLabel(vehicle)),
|
||||||
tostring(state.markerName))
|
tostring(state.markerName))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
<modDesc descVersion="107">
|
<modDesc descVersion="107">
|
||||||
<author>masterdraco</author>
|
<author>masterdraco</author>
|
||||||
<version>1.60.5.0</version>
|
<version>1.60.6.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ check("vent-årsag: vogn på en anden", W.waitReason({wagonAttached = true}), "w
|
|||||||
check("vent-årsag: vogn reserveret", W.waitReason({wagonBusy = true}), "wagonReserved")
|
check("vent-årsag: vogn reserveret", W.waitReason({wagonBusy = true}), "wagonReserved")
|
||||||
-- tømning går i stå ved et fuldt mål (in-game 29/9: fåre-/BGA-vogne stod 10 min ved fuldt mål efter Stop alt)
|
-- tømning går i stå ved et fuldt mål (in-game 29/9: fåre-/BGA-vogne stod 10 min ved fuldt mål efter Stop alt)
|
||||||
check("tøm: står ved fuldt mål -> silo", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = true}), "dump")
|
check("tøm: står ved fuldt mål -> silo", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = true}), "dump")
|
||||||
check("tøm: står ved silo uden at tømme -> giv op", W.emptyStep("dump", {cargo = 5000, adActive = true, stalled = true}), "giveUp")
|
check("tøm: står ved silo uden at tømme -> næste silo", W.emptyStep("dump", {cargo = 5000, adActive = true, stalled = true, dumpAttempts = 1}), "dump")
|
||||||
|
check("tøm: 3 siloer prøvet -> giv op", W.emptyStep("dump", {cargo = 5000, adActive = true, stalled = true, dumpAttempts = W.MAX_DUMP_ATTEMPTS}), "giveUp")
|
||||||
check("tøm: kører mod målet (ikke i stå) -> vent", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = false}), "wait")
|
check("tøm: kører mod målet (ikke i stå) -> vent", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = false}), "wait")
|
||||||
check("i stå: tæt på, uændret længe", W.isStalled({nearTarget = true, sinceChangeMs = W.EMPTY_STALL_MS}), true)
|
check("i stå: tæt på, uændret længe", W.isStalled({nearTarget = true, sinceChangeMs = W.EMPTY_STALL_MS}), true)
|
||||||
check("i stå: tæt på, lige ankommet", W.isStalled({nearTarget = true, sinceChangeMs = 5000}), false)
|
check("i stå: tæt på, lige ankommet", W.isStalled({nearTarget = true, sinceChangeMs = 5000}), false)
|
||||||
|
|||||||
Reference in New Issue
Block a user