diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index d52f9ab..9a4670e 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -47,13 +47,21 @@ function ADRunsController.getFarmVehicles(adEnv) return result end -function ADRunsController.findVehicleById(adEnv, vehicleId) +-- Ét map pr. kald i stedet for at genscanne getFarmVehicles pr. vehicleId — startRun/stopRun/ +-- getRunStatus/load slår flere id'er op pr. kald, og GUI'et kalder getRunStatus hvert sekund. +local function getFarmVehiclesById(adEnv) + local byId = {} for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do - if ADRunsController.getVehicleId(vehicle) == vehicleId then - return vehicle + local id = ADRunsController.getVehicleId(vehicle) + if id ~= nil then + byId[id] = vehicle end end - return nil + return byId +end + +function ADRunsController.findVehicleById(adEnv, vehicleId) + return getFarmVehiclesById(adEnv)[vehicleId] end function ADRunsController.getRunForVehicle(vehicle) @@ -182,13 +190,18 @@ end -- ---- Start / Stop ---- -- AD gemmer indstillinger som INDEKS i values; useFolders er global, rotateTargets pr. køretøj. +-- Er indstillingen køretøjs-specifik, men køretøjet mangler sin egen settings-tabel, skrives +-- der IKKE til den globale tabel — det ville ødelægge AD's globale default for alle køretøjer. local function setSetting(adEnv, vehicle, settingName, value) local global = adEnv.AutoDrive.settings[settingName] if global == nil then return end local setting = global - if global.isVehicleSpecific and vehicle.ad.settings ~= nil and vehicle.ad.settings[settingName] ~= nil then + if global.isVehicleSpecific then + if vehicle.ad.settings == nil or vehicle.ad.settings[settingName] == nil then + return + end setting = vehicle.ad.settings[settingName] end for index, candidate in ipairs(setting.values) do @@ -247,8 +260,9 @@ function ADRunsController.startRun(adEnv, runId) if run == nil then return results end + local vehiclesById = getFarmVehiclesById(adEnv) for _, vehicleId in ipairs(run.vehicleIds) do - local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) + 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} @@ -277,8 +291,9 @@ function ADRunsController.stopRun(adEnv, runId) if run == nil then return stopped end + local vehiclesById = getFarmVehiclesById(adEnv) for _, vehicleId in ipairs(run.vehicleIds) do - local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) + local vehicle = vehiclesById[vehicleId] if vehicle ~= nil and isVehicleActive(vehicle) then vehicle:stopAutoDrive() stopped = stopped + 1 @@ -289,8 +304,9 @@ end function ADRunsController.getRunStatus(adEnv, run) local running = 0 + local vehiclesById = getFarmVehiclesById(adEnv) for _, vehicleId in ipairs(run.vehicleIds) do - local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) + local vehicle = vehiclesById[vehicleId] if vehicle ~= nil and isVehicleActive(vehicle) then running = running + 1 end @@ -345,9 +361,10 @@ function ADRunsController.load(adEnv) return end ADRunsController.store = store + local vehiclesById = getFarmVehiclesById(adEnv) for _, run in ipairs(store.runs) do for _, vehicleId in ipairs(run.vehicleIds) do - if ADRunsController.findVehicleById(adEnv, vehicleId) == nil then + if vehiclesById[vehicleId] == nil then Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': køretøj %s findes ikke (endnu) i dette savegame", tostring(run.name), tostring(vehicleId)) end end diff --git a/tests/test_adRunsController.lua b/tests/test_adRunsController.lua index b57497c..eed3793 100644 --- a/tests/test_adRunsController.lua +++ b/tests/test_adRunsController.lua @@ -231,5 +231,19 @@ ADRunsController.installSaveHook() ItemSystem.save() check("C9 save-hook kaldes før ItemSystem.save", hooked, true) +-- C11: vogn uden egen ad.settings-tabel (ingen rotateTargets pr. køretøj) -> den +-- køretøjs-specifikke indstilling skrives IKKE til den globale settings-tabel +adEnv.AutoDrive.settings.rotateTargets.current = 1 +adEnv.AutoDrive.settings.useFolders.current = 1 +local settingsRun = ADRunsController.createRun("Settings Test") +ADRunsController.updateRun(settingsRun.id, {targetWayPointId = 94, loops = 1}) +local noSettings = makeVehicle("vehicleH", "Uden AD-settings", {STRAW}, 500000, 200, 0) +noSettings.ad.settings = {} +ADRunsController.assignVehicle(settingsRun.id, noSettings) +ADRunsController.startRun(adEnv, settingsRun.id) +check("C11 global rotateTargets urørt", adEnv.AutoDrive.settings.rotateTargets.current, 1) +check("C11 useFolders global stadig skrevet", adEnv.AutoDrive.settings.useFolders.current, 2) +check("C11 køretøjet startet", noSettings.started, 1) + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)