fix(flows): tømning ved stop giver ikke længere 10 min ved et fuldt mål — 45 s ved målet uden at læsset falder -> silo, ellers parkering med last; Wait-pulje/læs-bytte slået fra under tømning (v1.55.1.0)
This commit is contained in:
@@ -105,6 +105,14 @@ end
|
||||
-- -> "home" | "target" | "dump" | "wait" | "giveUp"
|
||||
ADFlowWagons.EMPTY_MIN_LITERS = 100
|
||||
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_NEAR_M = 40 -- m fra aflæsningsmarkøren tæller som "ved målet"
|
||||
|
||||
-- s = {nearTarget, sinceChangeMs}
|
||||
function ADFlowWagons.isStalled(s)
|
||||
return s.nearTarget == true and (s.sinceChangeMs or 0) >= ADFlowWagons.EMPTY_STALL_MS
|
||||
end
|
||||
|
||||
function ADFlowWagons.emptyStep(stage, s)
|
||||
local cargo = s.cargo or 0
|
||||
if stage == "start" then
|
||||
@@ -112,6 +120,7 @@ function ADFlowWagons.emptyStep(stage, s)
|
||||
return s.hasTarget and "target" or "dump"
|
||||
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.adActive then return "wait" end
|
||||
if cargo < ADFlowWagons.EMPTY_MIN_LITERS then return "home" end
|
||||
if stage == "target" then return "dump" end
|
||||
@@ -363,6 +372,7 @@ local function startDump(adEnv, vehicle, state)
|
||||
return
|
||||
end
|
||||
state.stage, state.since = "dump", nowMs
|
||||
state.markerId, state.markerName, state.lastCargo = marker.id, marker.name, nil
|
||||
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",
|
||||
tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(marker.name))
|
||||
@@ -384,7 +394,8 @@ function ADFlowWagons.homeVehicle(adEnv, vehicle, runName)
|
||||
local cargo, fillType = cargoOf(adEnv, vehicle)
|
||||
local action = ADFlowWagons.emptyStep("start", {cargo = cargo, hasTarget = target ~= nil})
|
||||
if action == "home" then return goHome(adEnv, vehicle) end
|
||||
local state = {stage = action, since = nowMs, runName = runName}
|
||||
local state = {stage = action, since = nowMs, runName = runName,
|
||||
markerId = target ~= nil and target.id or nil, markerName = target ~= nil and target.name or nil}
|
||||
emptying[vehicle] = state
|
||||
if action == "target" then
|
||||
ADFieldWork.startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DELIVERTO, target.id, nil, fillType)
|
||||
@@ -412,6 +423,20 @@ function ADFlowWagons.sendHome(adEnv, run)
|
||||
end
|
||||
end
|
||||
|
||||
-- Står traktoren ved tømningens markør, uden at læsset er faldet i EMPTY_STALL_MS?
|
||||
local function stalledAt(adEnv, vehicle, state, cargo)
|
||||
if state.lastCargo == nil or cargo < state.lastCargo - 1 then
|
||||
state.lastCargo, state.changedAt = cargo, nowMs
|
||||
end
|
||||
local wayPoint = state.markerId ~= nil and adEnv.ADGraphManager:getWayPointById(state.markerId) or nil
|
||||
local near = false
|
||||
if wayPoint ~= nil and vehicle.rootNode ~= nil then
|
||||
local x, _, z = getWorldTranslation(vehicle.rootNode)
|
||||
near = math.sqrt((x - wayPoint.x) ^ 2 + (z - wayPoint.z) ^ 2) <= ADFlowWagons.EMPTY_NEAR_M
|
||||
end
|
||||
return ADFlowWagons.isStalled({nearTarget = near, sinceChangeMs = nowMs - (state.changedAt or nowMs)})
|
||||
end
|
||||
|
||||
local function tickEmptying(adEnv)
|
||||
local list = {}
|
||||
for vehicle, state in pairs(emptying) do table.insert(list, {vehicle = vehicle, state = state}) end
|
||||
@@ -423,8 +448,13 @@ local function tickEmptying(adEnv)
|
||||
if controlled then
|
||||
emptying[vehicle] = nil -- spilleren har overtaget
|
||||
else
|
||||
local stalled = stalledAt(adEnv, vehicle, state, cargo)
|
||||
local action = ADFlowWagons.emptyStep(state.stage, {cargo = cargo, adActive = module ~= nil and module:isActive(),
|
||||
elapsedMs = nowMs - state.since})
|
||||
elapsedMs = nowMs - state.since, stalled = stalled})
|
||||
if stalled and action ~= "wait" then
|
||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' kan ikke aflæsse ved %s (fuldt?) — videre", tostring(ADRuns.vehicleLabel(vehicle)),
|
||||
tostring(state.markerName))
|
||||
end
|
||||
if action == "home" then
|
||||
goHome(adEnv, vehicle)
|
||||
elseif action == "dump" then
|
||||
|
||||
@@ -295,6 +295,12 @@ function ADUnloadWait.beforeUpdate(adEnv, task, dt)
|
||||
if ADOutbound ~= nil and ADOutbound.isOutboundVehicle ~= nil and ADOutbound.isOutboundVehicle(task.vehicle) then
|
||||
return
|
||||
end
|
||||
-- Tømning efter stop (ADFlowWagons): ingen Wait-pulje eller læs-bytte — den skal tømme og hjem
|
||||
-- (in-game 29/9: Goat Food blev sendt til Cow Wait efter Stop alt)
|
||||
if ADFlowWagons ~= nil and ADFlowWagons.isEmptying ~= nil and ADFlowWagons.isEmptying(task.vehicle) then
|
||||
if waits[task.vehicle] ~= nil then release(task.vehicle) end
|
||||
return
|
||||
end
|
||||
pcall(debugAtTarget, adEnv, task, dt)
|
||||
local wait = waits[task.vehicle]
|
||||
if wait ~= nil then
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.55.0.0</version>
|
||||
<version>1.55.1.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
@@ -98,5 +98,12 @@ check("ledig: stoppet flow, tømmer/kører hjem", W.tractorFree({hasRun = true,
|
||||
check("vent-årsag: traktor optaget", W.waitReason({tractorBusy = true}), "tractorBusy")
|
||||
check("vent-årsag: vogn på en anden", W.waitReason({wagonAttached = true}), "wagonAttached")
|
||||
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)
|
||||
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: 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å, lige ankommet", W.isStalled({nearTarget = true, sinceChangeMs = 5000}), false)
|
||||
check("i stå: på vej (langt væk)", W.isStalled({nearTarget = false, sinceChangeMs = 999999}), false)
|
||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
|
||||
Reference in New Issue
Block a user