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:
2026-09-27 15:18:50 +02:00
parent 331d192f78
commit 9348443f61
3 changed files with 111 additions and 25 deletions
+83 -24
View File
@@ -1072,6 +1072,29 @@ end
-- Pr. tildelt traktor: validér, skriv AD-tilstand, start. Afviste traktorer springes over
-- og logges med årsag (samme nøgle som fanen viser).
-- Start én traktor i et run: valider, anvend run'et og start AutoDrive. Returnerer resultat-posten.
function ADRunsController.startVehicle(adEnv, run, vehicle)
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason, missingBuilding = validation.missingBuilding}
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))
return result
end
local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle)
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
if ok then
ADRunsController.runningRuns[run.id] = true
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]))
or ("markør " .. tostring(second ~= nil and second.id or run.targetWayPointId))
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' startet mod %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), target)
else
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))
end
return result
end
function ADRunsController.startRun(adEnv, runId)
local run = ADRuns.getRun(ADRunsController.store, runId)
local results = {}
@@ -1079,38 +1102,71 @@ function ADRunsController.startRun(adEnv, runId)
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 result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason, missingBuilding = validation.missingBuilding}
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))
end
if validation.ok then
local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle)
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
if ok then
started = started + 1
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]))
or ("markør " .. tostring(second ~= nil and second.id or run.targetWayPointId))
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' startet mod %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), target)
else
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))
end
end
table.insert(results, result)
table.insert(results, ADRunsController.startVehicle(adEnv, run, vehicle))
end
end
if started > 0 then
ADRunsController.runningRuns[runId] = true
end
return results
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 —
-- den stoppes, så den ikke fortsætter uden run. Returnerer true hvis den blev stoppet.
function ADRunsController.stopIfRunning(vehicle, reason)
@@ -1327,6 +1383,9 @@ function ADRunsController.save()
pcall(ADFieldJobs.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
end
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.41.0.0</version>
<version>1.41.1.0</version>
<title>
<en>AD Smart Pickup</en>
</title>