diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index 9d6f1b3..3385029 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -394,7 +394,14 @@ local function applyRunToVehicle(adEnv, run, vehicle, ingredients) -- bliver en silo der tager varen; næste tur sætter choosePickup målet tilbage til run'ets. local targetId = ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId local dump = ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId) - stateModule:setSecondMarkerByWayPointId(dump ~= nil and dump.marker.id or targetId) + stateModule:setSecondMarkerByWayPointId(targetId) + if dump ~= nil then + if ADUnloadWait ~= nil and ADUnloadWait.setDumpTarget ~= nil then + ADUnloadWait.setDumpTarget(vehicle, dump.marker.id) + else + stateModule:setSecondMarkerByWayPointId(dump.marker.id) + end + end local loadMarker = findNearestLoadMarker(adEnv, vehicle, farmId) if loadMarker ~= nil then stateModule:setFirstMarkerByWayPointId(loadMarker.id) diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index d5d12c2..ed4edf9 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -623,6 +623,10 @@ local function chooseRunTarget(adEnv, driver) if run == nil or ADRunsController.chooseTarget == nil or #ADRunsController.getRunTargets(run) < 1 then return end + -- Er AD's mål midlertidigt en silo (forkert last læsses af), må det ikke røres nu. + if ADUnloadWait ~= nil and ADUnloadWait.getPendingTargetRestore ~= nil and ADUnloadWait.getPendingTargetRestore(driver) ~= nil then + return + end local stateModule = driver.ad.stateModule local targetId = ADRunsController.chooseTarget(adEnv, run, driver) local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index 984e189..d35d2d8 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -265,6 +265,19 @@ function ADUnloadWait.getPendingTargetRestore(vehicle) return pendingTargetRestore[vehicle] end +-- Ved Start med forkert last: AD's mål peger på siloen indtil aflæsningen er færdig; +-- det oprindelige mål gendannes af finished-hook'en. +function ADUnloadWait.setDumpTarget(vehicle, dumpWayPointId) + local stateModule = vehicle.ad.stateModule + local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil + if current ~= nil and current.id ~= dumpWayPointId then + pendingTargetRestore[vehicle] = pendingTargetRestore[vehicle] or current.id + end + if stateModule.setSecondMarkerByWayPointId ~= nil then + stateModule:setSecondMarkerByWayPointId(dumpWayPointId) + end +end + -- Hvem holder hvor (GUI'ets Wait-puljer-visning). Sorteret på mappe, dernæst markør-id. -- Vognens indhold (største enhed) og evt. Wait-tilstand — til overblikket i fanen. function ADUnloadWait.hasRouteBothWays(adEnv, vehicle, toWayPointId, homeWayPointId) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 20195c9..1742338 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.11.9.0 + 1.11.10.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index b9568a5..d7f2c40 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -964,6 +964,35 @@ UnloadTask.update(tw, ADLoadSwap.CHECK_INTERVAL_MS + 1) check("V2 fra Wait til silo selv uden manglende vare", tw.destinationID, 21) waitBarnCapacity[STRAW] = 50000 +-- V3: Start med forkert last -> AD's mål = silo; første getNextPickup må IKKE sætte run-målet tilbage, +-- og efter aflæsningen (finished) gendannes run-målet +buildCowWorld() +table.insert(unloadStations, stations[2]) -- halmladen tager halm +stations[2].unloadTriggers = {{exactFillRootNode = 121}} +stations[2].getIsFillTypeSupported = function(_, fillType) return fillType == STRAW end +stations[2].getFreeCapacity = function() return 100000 end +stations[2].owningPlaceable = {spec_silo = {storages = {{getFillLevel = function() return 0 end}}}} +local v3 = makeSupplyDriver(markerByIndex(21), markerByIndex(30), {TMR, STRAW}) +v3.uniqueId = "vehicleV3"; v3.carriable = {TMR}; v3.trailers = {level = 4000, capacity = 8000}; v3.rootNode = 571; nodePositions[571] = {x = 0, z = 0} +v3.units = {{object = {getFillUnitFillLevel = function() return 4000 end, getFillUnitFillType = function() return STRAW end}, fillUnitIndex = 1}} +v3.ad.stateModule.secondMarkerId = 30 +v3.ad.stateModule.setSecondMarkerByWayPointId = function(self, id) self.secondMarkerId = id end +v3.ad.stateModule.getSecondMarker = function(self) return markerByIndex(self.secondMarkerId) end +cowLevels[STRAW] = nil -- stald 1 tager i denne test kun TMR +unloadStations[1].getIsFillTypeSupported = function(_, fillType) return fillType == TMR end +testVehicles = {v3} +ADRunsController.store = ADRuns.newStore() +local v3Run = ADRunsController.createRun("TMR only") +ADRunsController.updateRun(v3Run.id, {targetWayPointId = 30, ingredientMode = "manual", ingredients = {"FORAGE"}}) +ADRunsController.assignVehicle(v3Run.id, v3) +ADUnloadWait.setDumpTarget(v3, 21) -- som Start gør ved forkert last +check("V3 AD's mål = silo", v3.ad.stateModule.secondMarkerId, 21) +manager:getNextPickup(v3, false) +check("V3 getNextPickup rører ikke målet mens silo-aflæsning er undervejs", v3.ad.stateModule.secondMarkerId, 21) +UnloadTask.finished({vehicle = v3}) +check("V3 mål gendannet efter aflæsning", v3.ad.stateModule.secondMarkerId, 30) +ADRunsController.store = ADRuns.newStore() + -- ==== E: eksponerede opslag (bruges af runs-controller og læs-bytte) ==== local eDriver = buildCowWorld() check("E1 aflæsningsstation ved waypoint", ADSmartPickup.getUnloadStationAtWayPointId(FS25_AutoDrive, 30, 1), unloadStations[1])