fix(pulje): review v1.50 — egne tømmevogne virkede ikke under høst (global 'implement'), hentning kan afbrydes (høst slut/Stop/spiller), hjemtur ved tømmevogns-fejl, marksilo-lån kan ikke hænge i 'henter' (tidsgrænse, spiller, fejl i start), ingen ekstra parkeringstur med puljevogn, Stop holder en bar mark; regressionstest for fejlagtige globale (v1.50.1.0)
This commit is contained in:
@@ -17,6 +17,7 @@ ADFieldSilos.CARGO_MIN_LITERS = 100 -- rest under dette tæller ikke som last
|
||||
ADFieldSilos.FARM_RADIUS = 100
|
||||
-- Siloer højst så langt fra en nabo hører til samme klynge (Farma-rækker: 15 m mellem siloer, 18 m mellem rækker)
|
||||
ADFieldSilos.CLUSTER_LINK = 60
|
||||
ADFieldSilos.FETCH_TIMEOUT_MS = 300000 -- så længe må en traktor være om at hente en puljevogn
|
||||
ADFieldSilos.MOVING_SPEED = 0.00028 -- m/ms, samme grænse som AutoDrive
|
||||
ADFieldSilos.FILE_NAME = "ADSmartPickup_fieldsilos.xml"
|
||||
ADFieldSilos.ROOT = "ADSmartPickupFieldSilos"
|
||||
@@ -340,7 +341,7 @@ local function fillTypeName(fillType)
|
||||
return desc ~= nil and (desc.title or desc.name) or tostring(fillType)
|
||||
end
|
||||
|
||||
local function dispatchOne(adEnv, order, vehicle, silosById, storesById)
|
||||
local function dispatchOne(adEnv, order, vehicle, silosById, storesById, isPool)
|
||||
local module = vehicle.ad.stateModule
|
||||
module:setMode(adEnv.AutoDrive.MODE_PICKUPANDDELIVER)
|
||||
module:setFirstMarkerByWayPointId(order.siloMarkerId)
|
||||
@@ -349,7 +350,9 @@ local function dispatchOne(adEnv, order, vehicle, silosById, storesById)
|
||||
module:setFillType(order.fillType)
|
||||
module.loopCounter = 1
|
||||
if module.setLoopsDone ~= nil then module:setLoopsDone(0) end
|
||||
ADFieldWork.enableParkAtJobFinished(vehicle)
|
||||
-- puljevogn: ingen AD-parkering — ved turens slut sætter returnHome vognen af og kører traktoren hjem
|
||||
-- (med AD-parkering kørte den først hjem med vognen og så tilbage efter den)
|
||||
if not isPool then ADFieldWork.enableParkAtJobFinished(vehicle) end
|
||||
-- rotation fra: ellers kan modens egne pickup-hooks sende vognen til en anden silo i mappen
|
||||
if ADRunsController ~= nil and ADRunsController.setSetting ~= nil then
|
||||
ADRunsController.setSetting(adEnv, vehicle, "rotateTargets", adEnv.AutoDrive.RT_NONE)
|
||||
@@ -371,7 +374,6 @@ local function dispatchPool(adEnv, order, pair, silosById, storesById)
|
||||
local owner = {siloId = order.siloId, storeId = order.storeId, siloName = silo ~= nil and silo.name or order.siloId,
|
||||
fillType = order.fillType, liters = order.liters, startedMs = nowMs, lastProgressMs = nowMs, lastFill = 0, fetching = true}
|
||||
loans[tractor] = owner
|
||||
ADPool.reserve(owner, {pair.implement.id, pair.tractor.id})
|
||||
ADHitch.fetch(adEnv, tractor, pair.implement.connectId, function(_, ok, detail)
|
||||
ADPool.release(owner)
|
||||
if loans[tractor] ~= owner then return end -- lånet blev afbrudt imens (Stop alt / flow slået fra)
|
||||
@@ -385,8 +387,14 @@ local function dispatchPool(adEnv, order, pair, silosById, storesById)
|
||||
if park ~= nil then ADFieldWork.startAd(adEnv, tractor, adEnv.AutoDrive.MODE_DRIVETO, park, nil) end
|
||||
return
|
||||
end
|
||||
dispatchOne(adEnv, order, tractor, silosById, storesById)
|
||||
local okDispatch, err = pcall(dispatchOne, adEnv, order, tractor, silosById, storesById, true)
|
||||
if not okDispatch then
|
||||
Logging.warning(ADFieldSilos.LOG_PREFIX .. "'%s' kunne ikke starte turen med puljevognen: %s", tostring(ADRuns.vehicleLabel(tractor)), tostring(err))
|
||||
ADFieldSilos.releaseVehicle(adEnv, tractor, "failed")
|
||||
end
|
||||
end)
|
||||
-- reservationen først når hentningen er sat i gang (fejler fetch, er der intet at frigive)
|
||||
ADPool.reserve(owner, {pair.implement.id, pair.tractor.id})
|
||||
Logging.info(ADFieldSilos.LOG_PREFIX .. "'%s' henter puljevognen '%s' til %d l %s i %s", tostring(ADRuns.vehicleLabel(tractor)),
|
||||
tostring(pair.implement.name), math.floor(order.liters), fillTypeName(order.fillType), tostring(silo ~= nil and silo.name or order.siloId))
|
||||
end
|
||||
@@ -395,6 +403,11 @@ local function release(adEnv, vehicle, reason)
|
||||
local loan = loans[vehicle]
|
||||
loans[vehicle] = nil
|
||||
if loan == nil then return end
|
||||
if loan.fetching then
|
||||
-- henter stadig puljevognen: afbryd koblingen og frigiv reservationen
|
||||
if ADHitch ~= nil then ADHitch.cancel(vehicle) end
|
||||
if ADPool ~= nil then ADPool.release(loan) end
|
||||
end
|
||||
if reason == "stuck" or reason == "failed" then
|
||||
local k = ADFieldSiloPlanner.key(loan.siloId, loan.fillType)
|
||||
paused[k] = nowMs + ADFieldSilos.PAUSE_MS
|
||||
@@ -416,6 +429,10 @@ local function release(adEnv, vehicle, reason)
|
||||
end
|
||||
end
|
||||
|
||||
function ADFieldSilos.releaseVehicle(adEnv, vehicle, reason)
|
||||
release(adEnv, vehicle, reason)
|
||||
end
|
||||
|
||||
function ADFieldSilos.stopAll(adEnv)
|
||||
local list = {}
|
||||
for vehicle in pairs(loans) do table.insert(list, vehicle) end
|
||||
@@ -431,8 +448,17 @@ local function checkLoans(adEnv)
|
||||
else
|
||||
local ok, err = pcall(function()
|
||||
local loan = loans[vehicle]
|
||||
-- henter puljevognen: AD holder stille under koblingen — ikke "færdig"
|
||||
if loan.fetching then return end
|
||||
-- henter puljevognen: AD holder stille under koblingen — ikke "færdig"; men spilleren kan overtage,
|
||||
-- og en hentning der ikke bliver færdig (trafik, rute), opgives
|
||||
if loan.fetching then
|
||||
local controlled = vehicle.getIsControlled ~= nil and vehicle:getIsControlled() or false
|
||||
if controlled then
|
||||
release(adEnv, vehicle, "player")
|
||||
elseif nowMs - (loan.startedMs or nowMs) > ADFieldSilos.FETCH_TIMEOUT_MS then
|
||||
release(adEnv, vehicle, "stuck")
|
||||
end
|
||||
return
|
||||
end
|
||||
local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil
|
||||
local fill = fillLevel(adEnv, vehicle)
|
||||
local vehicleState = {
|
||||
|
||||
Reference in New Issue
Block a user