diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index e6ab82f..984e189 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -107,6 +107,35 @@ local function redirect(task, destinationID) task.vehicle.ad.drivePathModule:setPathTo(destinationID) end +-- køretøj -> AD's oprindelige 2. markør (waypoint-id) mens der læsses af i en silo +local pendingTargetRestore = setmetatable({}, {__mode = "k"}) + +-- Aflæsning ved en ANDEN destination end AD's mål: AD tipper kun når vognen er tæt på +-- AD's egen 2. markør (getDistanceToUnloadPosition), så den skiftes midlertidigt til +-- siloen og gendannes når opgaven er færdig. +local function redirectForUnload(task, destinationID) + local vehicle = task.vehicle + local stateModule = vehicle.ad.stateModule + local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil + if current ~= nil and current.id ~= destinationID and stateModule.setSecondMarkerByWayPointId ~= nil then + pendingTargetRestore[vehicle] = pendingTargetRestore[vehicle] or current.id + stateModule:setSecondMarkerByWayPointId(destinationID) + end + redirect(task, destinationID) +end + +local function restoreTarget(vehicle) + local homeId = pendingTargetRestore[vehicle] + if homeId == nil then + return + end + pendingTargetRestore[vehicle] = nil + local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil + if stateModule ~= nil and stateModule.setSecondMarkerByWayPointId ~= nil then + stateModule:setSecondMarkerByWayPointId(homeId) + end +end + local function release(vehicle) local wait = waits[vehicle] if wait ~= nil and claims[wait.waitMarker.id] == vehicle then @@ -197,7 +226,7 @@ local function updateWaiting(adEnv, task, wait, dt) local isReachable = function(markerId) return hasRouteTo(adEnv, vehicle, markerId) end - ADLoadSwap.tryFromWait(adEnv, task, wait, dt, redirect, release, isReachable) + ADLoadSwap.tryFromWait(adEnv, task, wait, dt, redirectForUnload, release, isReachable) end return end @@ -224,6 +253,16 @@ function ADUnloadWait.releaseInactive() release(vehicle) end end + for vehicle in pairs(pendingTargetRestore) do + local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil + if stateModule == nil or stateModule.isActive == nil or not stateModule:isActive() then + restoreTarget(vehicle) + end + end +end + +function ADUnloadWait.getPendingTargetRestore(vehicle) + return pendingTargetRestore[vehicle] end -- Hvem holder hvor (GUI'ets Wait-puljer-visning). Sorteret på mappe, dernæst markør-id. @@ -286,6 +325,7 @@ function ADUnloadWait.install(adEnv) if originalFinished ~= nil then task.finished = function(self) release(self.vehicle) + restoreTarget(self.vehicle) return originalFinished(self) end end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index f4d77c5..20195c9 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.11.8.0 + 1.11.9.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index 174f16d..b9568a5 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -469,6 +469,9 @@ end -- traktor der holder ved stalden (markør 30) med rest-læs halm på vognen local function makeUnloadingVehicle(name, node, x, restStraw) local vehicle = makeSupplyDriver(markerByIndex(21), markerByIndex(30), {TMR, STRAW}) + vehicle.ad.stateModule.secondMarkerId = 30 + vehicle.ad.stateModule.setSecondMarkerByWayPointId = function(self, id) self.secondMarkerId = id end + vehicle.ad.stateModule.getSecondMarker = function(self) return markerByIndex(self.secondMarkerId) end vehicle.getName = function() return name end vehicle.rootNode = node nodePositions[node] = {x = x, z = 10} @@ -830,6 +833,9 @@ UnloadTask.update(st, ADLoadSwap.CHECK_INTERVAL_MS + 1) check("S1 omdirigeret til halmladen", st.destinationID, 21) check("S1 logget bytte", countLogsSince(1, "bytter læs") >= 1, true) check("S1 Wait-punkt frigivet", FS25_AutoDrive.AutoDrive.getSetting("rotateTargets", sv), RT_ONLYPICKUP) +check("S1 AD's mål peger midlertidigt på siloen (ellers tipper AD ikke)", sv.ad.stateModule.secondMarkerId, 21) +UnloadTask.finished(st) +check("S1 mål gendannet efter aflæsning", sv.ad.stateModule.secondMarkerId, 30) -- S2: målet mangler IKKE et fuldt læs af TMR -> bliv ved Wait buildSwapWorld()