fix(navne): navnefilen skrives i spillets gem-hook — FS25 genskriver savegame-mappen og slettede ADSmartPickup_names.xml; startkø (én traktor ad gangen) forberedt (v1.41.1.0)
This commit is contained in:
@@ -1072,27 +1072,18 @@ end
|
|||||||
|
|
||||||
-- Pr. tildelt traktor: validér, skriv AD-tilstand, start. Afviste traktorer springes over
|
-- Pr. tildelt traktor: validér, skriv AD-tilstand, start. Afviste traktorer springes over
|
||||||
-- og logges med årsag (samme nøgle som fanen viser).
|
-- og logges med årsag (samme nøgle som fanen viser).
|
||||||
function ADRunsController.startRun(adEnv, runId)
|
-- Start én traktor i et run: valider, anvend run'et og start AutoDrive. Returnerer resultat-posten.
|
||||||
local run = ADRuns.getRun(ADRunsController.store, runId)
|
function ADRunsController.startVehicle(adEnv, run, vehicle)
|
||||||
local results = {}
|
|
||||||
if run == nil then
|
|
||||||
return results
|
|
||||||
end
|
|
||||||
local vehiclesById = getFarmVehiclesById(adEnv)
|
|
||||||
local started = 0
|
|
||||||
for _, vehicleId in ipairs(run.vehicleIds) do
|
|
||||||
local vehicle = vehiclesById[vehicleId]
|
|
||||||
if vehicle ~= nil then
|
|
||||||
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
|
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
|
||||||
local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason, missingBuilding = validation.missingBuilding}
|
local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason, missingBuilding = validation.missingBuilding}
|
||||||
if not validation.ok then
|
if not validation.ok then
|
||||||
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' sprunget over (%s)", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), tostring(validation.reason))
|
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' sprunget over (%s)", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), tostring(validation.reason))
|
||||||
|
return result
|
||||||
end
|
end
|
||||||
if validation.ok then
|
|
||||||
local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle)
|
local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle)
|
||||||
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
|
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
|
||||||
if ok then
|
if ok then
|
||||||
started = started + 1
|
ADRunsController.runningRuns[run.id] = true
|
||||||
local second = vehicle.ad.stateModule.getSecondMarker ~= nil and vehicle.ad.stateModule:getSecondMarker() or nil
|
local second = vehicle.ad.stateModule.getSecondMarker ~= nil and vehicle.ad.stateModule:getSecondMarker() or nil
|
||||||
local target = run.kind == "outbound" and ("kilde " .. tostring(run.sourceWayPointIds[1]))
|
local target = run.kind == "outbound" and ("kilde " .. tostring(run.sourceWayPointIds[1]))
|
||||||
or ("markør " .. tostring(second ~= nil and second.id or run.targetWayPointId))
|
or ("markør " .. tostring(second ~= nil and second.id or run.targetWayPointId))
|
||||||
@@ -1101,16 +1092,81 @@ function ADRunsController.startRun(adEnv, runId)
|
|||||||
result.ok, result.reason = false, "error"
|
result.ok, result.reason = false, "error"
|
||||||
Logging.warning(ADRunsController.LOG_PREFIX .. "run '%s': kunne ikke starte '%s': %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), tostring(err))
|
Logging.warning(ADRunsController.LOG_PREFIX .. "run '%s': kunne ikke starte '%s': %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), tostring(err))
|
||||||
end
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function ADRunsController.startRun(adEnv, runId)
|
||||||
|
local run = ADRuns.getRun(ADRunsController.store, runId)
|
||||||
|
local results = {}
|
||||||
|
if run == nil then
|
||||||
|
return results
|
||||||
end
|
end
|
||||||
table.insert(results, result)
|
local vehiclesById = getFarmVehiclesById(adEnv)
|
||||||
|
for _, vehicleId in ipairs(run.vehicleIds) do
|
||||||
|
local vehicle = vehiclesById[vehicleId]
|
||||||
|
if vehicle ~= nil then
|
||||||
|
table.insert(results, ADRunsController.startVehicle(adEnv, run, vehicle))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if started > 0 then
|
|
||||||
ADRunsController.runningRuns[runId] = true
|
|
||||||
end
|
|
||||||
return results
|
return results
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- ---- Start alle i kø ----
|
||||||
|
-- Én traktor ad gangen med STAGGER_MS mellemrum: ellers kører de sammen fra parkeringspladsen (in-game 27/9).
|
||||||
|
ADRunsController.STAGGER_MS = 10000
|
||||||
|
ADRunsController.startQueue = {}
|
||||||
|
local staggerTimerMs = 0
|
||||||
|
|
||||||
|
function ADRunsController.clearStartQueue()
|
||||||
|
ADRunsController.startQueue = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Lægger alle traktorer i flows der ikke kører i kø; ugyldige (fx uden vogn) springes over med det samme.
|
||||||
|
-- Returnerer {queued, alreadyRunning, skipped = {resultater}}.
|
||||||
|
function ADRunsController.queueStartAll(adEnv)
|
||||||
|
local summary = {queued = 0, alreadyRunning = 0, skipped = {}}
|
||||||
|
local vehiclesById = getFarmVehiclesById(adEnv)
|
||||||
|
local queue = {}
|
||||||
|
for _, run in ipairs(ADRunsController.store.runs) do
|
||||||
|
if #run.vehicleIds > 0 then
|
||||||
|
if ADRunsController.getRunStatus(adEnv, run).isRunning then
|
||||||
|
summary.alreadyRunning = summary.alreadyRunning + 1
|
||||||
|
else
|
||||||
|
for _, vehicleId in ipairs(run.vehicleIds) do
|
||||||
|
local vehicle = vehiclesById[vehicleId]
|
||||||
|
if vehicle ~= nil then
|
||||||
|
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
|
||||||
|
if validation.ok then
|
||||||
|
table.insert(queue, {runId = run.id, vehicleId = vehicleId})
|
||||||
|
else
|
||||||
|
table.insert(summary.skipped, {vehicle = vehicle, ok = false, reason = validation.reason, missingBuilding = validation.missingBuilding})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ADRunsController.startQueue = queue
|
||||||
|
ADRunsController.startQueueTotal = #queue
|
||||||
|
staggerTimerMs = ADRunsController.STAGGER_MS -- første startes ved næste tick
|
||||||
|
summary.queued = #queue
|
||||||
|
return summary
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Starter næste traktor i køen, når der er gået STAGGER_MS siden forrige.
|
||||||
|
function ADRunsController.processStartQueue(adEnv, dt)
|
||||||
|
if #ADRunsController.startQueue == 0 then return end
|
||||||
|
staggerTimerMs = staggerTimerMs + (dt or 0)
|
||||||
|
if staggerTimerMs < ADRunsController.STAGGER_MS then return end
|
||||||
|
staggerTimerMs = 0
|
||||||
|
local item = table.remove(ADRunsController.startQueue, 1)
|
||||||
|
local run = ADRuns.getRun(ADRunsController.store, item.runId)
|
||||||
|
local vehicle = run ~= nil and getFarmVehiclesById(adEnv)[item.vehicleId] or nil
|
||||||
|
if run ~= nil and vehicle ~= nil and not isVehicleActive(vehicle) then
|
||||||
|
ADRunsController.startVehicle(adEnv, run, vehicle)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- En kørende traktor der fjernes fra sit run (eller hvis run slettes) kører run'ets job —
|
-- En kørende traktor der fjernes fra sit run (eller hvis run slettes) kører run'ets job —
|
||||||
-- den stoppes, så den ikke fortsætter uden run. Returnerer true hvis den blev stoppet.
|
-- den stoppes, så den ikke fortsætter uden run. Returnerer true hvis den blev stoppet.
|
||||||
function ADRunsController.stopIfRunning(vehicle, reason)
|
function ADRunsController.stopIfRunning(vehicle, reason)
|
||||||
@@ -1327,6 +1383,9 @@ function ADRunsController.save()
|
|||||||
pcall(ADFieldJobs.save)
|
pcall(ADFieldJobs.save)
|
||||||
end
|
end
|
||||||
if ADFieldSilos ~= nil then pcall(ADFieldSilos.save) end
|
if ADFieldSilos ~= nil then pcall(ADFieldSilos.save) end
|
||||||
|
-- navnefilen skal skrives under spillets gem: FS25 genskriver savegame-mappen, og filer ingen skriver
|
||||||
|
-- under gemningen forsvinder (in-game 27/9: ADSmartPickup_names.xml blev slettet ved første gem)
|
||||||
|
if ADNames ~= nil and ADNames.byId ~= nil then pcall(ADNames.save) end
|
||||||
return saved
|
return saved
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -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.41.0.0</version>
|
<version>1.41.1.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -836,5 +836,32 @@ do
|
|||||||
check("SA isRunning ryddet", ADRunsController.getRunStatus(adEnv, ADRuns.getRun(ADRunsController.store, runA.id)).isRunning, false)
|
check("SA isRunning ryddet", ADRunsController.getRunStatus(adEnv, ADRuns.getRun(ADRunsController.store, runA.id)).isRunning, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- C20: Start alle i kø — én traktor ad gangen med STAGGER_MS mellemrum (in-game 27/9: ellers kører de
|
||||||
|
-- sammen på parkeringspladsen); pause ophæves
|
||||||
|
do
|
||||||
|
buildWorld()
|
||||||
|
local q1 = makeVehicle("vehicleQ1", "Q1", {STRAW, TMR}, 1000000, 100, 0)
|
||||||
|
local q2 = makeVehicle("vehicleQ2", "Q2", {STRAW, TMR}, 1000000, 110, 0)
|
||||||
|
local q3 = makeVehicle("vehicleQ3", "Q3", {}, 0, 120, 0) -- ingen vogn -> springes over, ikke i kø
|
||||||
|
local qrun = ADRunsController.createRun("Kø")
|
||||||
|
ADRunsController.updateRun(qrun.id, {targetWayPointIds = {94}})
|
||||||
|
ADRunsController.assignVehicle(qrun.id, q1)
|
||||||
|
ADRunsController.assignVehicle(qrun.id, q2)
|
||||||
|
ADRunsController.assignVehicle(qrun.id, q3)
|
||||||
|
local summary = ADRunsController.queueStartAll(adEnv)
|
||||||
|
check("C20 to i kø", summary.queued, 2)
|
||||||
|
check("C20 en sprunget over", #summary.skipped, 1)
|
||||||
|
check("C20 intet startet før første tick", (q1.started or 0) + (q2.started or 0), 0)
|
||||||
|
ADRunsController.processStartQueue(adEnv, 0)
|
||||||
|
check("C20 første startes straks", (q1.started or 0) + (q2.started or 0), 1)
|
||||||
|
ADRunsController.processStartQueue(adEnv, ADRunsController.STAGGER_MS - 1)
|
||||||
|
check("C20 næste venter mellemrummet", (q1.started or 0) + (q2.started or 0), 1)
|
||||||
|
ADRunsController.processStartQueue(adEnv, 1)
|
||||||
|
check("C20 næste efter mellemrummet", (q1.started or 0) + (q2.started or 0), 2)
|
||||||
|
check("C20 kø tom", #ADRunsController.startQueue, 0)
|
||||||
|
check("C20 run markeret kørende", ADRunsController.runningRuns[qrun.id], true)
|
||||||
|
end
|
||||||
|
|
||||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||||
os.exit(failures == 0 and 0 or 1)
|
os.exit(failures == 0 and 0 or 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user