diff --git a/FS25_ADSmartPickup/adFieldWork.lua b/FS25_ADSmartPickup/adFieldWork.lua index 057ab1d..f0d2f1d 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -1320,6 +1320,7 @@ function ADFieldWork.stopAllAssignments(adEnv) for _, assignment in ipairs(list) do pcall(stopAd, assignment.vehicle) pcall(ADCpBridge.stop, assignment.vehicle) + ADHitch.stow(assignment.vehicle, "stop alt") ADFieldWork.release(assignment) -- puljeredskab: sættes af på sin plads og traktoren kører hjem (i stedet for almindelig parkering) local okPool, pooled = pcall(ADHitch.returnHome, adEnv, assignment.vehicle) @@ -1332,6 +1333,7 @@ function ADFieldWork.stopAll(adEnv, fieldId) for _, assignment in ipairs(ADFieldJobs.assignmentsFor(fieldId)) do pcall(stopAd, assignment.vehicle) ADCpBridge.stop(assignment.vehicle) + ADHitch.stow(assignment.vehicle, "marken stoppet") local wasFetching = assignment.phase == "fetching" ADFieldWork.release(assignment) local okHome, pooled = pcall(ADHitch.returnHome, adEnv, assignment.vehicle) diff --git a/FS25_ADSmartPickup/adFlowWagons.lua b/FS25_ADSmartPickup/adFlowWagons.lua index ad5eed2..43f3dfd 100644 --- a/FS25_ADSmartPickup/adFlowWagons.lua +++ b/FS25_ADSmartPickup/adFlowWagons.lua @@ -371,6 +371,7 @@ end -- Én traktor hjem (fra et stoppet/slettet flow): tøm først, så parkering. function ADFlowWagons.homeVehicle(adEnv, vehicle, runName) waiting[vehicle] = nil + ADHitch.stow(vehicle, "flowet stoppet") if fetching[vehicle] ~= nil then fetching[vehicle] = nil ADHitch.cancel(vehicle) diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index fc4f50a..ec36918 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -237,6 +237,65 @@ local function isImplementPark(adEnv, vehicle, markerId) end -- Efter påkobling: fold foldbare redskaber sammen til vejen (CP folder selv ud på marken). +-- Klar til vej: s = {turnedOn, lowered, unfolded, canFold} -> liste af "turnOff" | "raise" | "fold" +function ADHitch.stowActions(s) + local actions = {} + if s.turnedOn then table.insert(actions, "turnOff") end + if s.lowered then table.insert(actions, "raise") end + if s.unfolded and s.canFold then table.insert(actions, "fold") end + return actions +end + +-- Alle redskaber på maskinen (også forrest og bag et andet redskab): {object, attacher, jointDescIndex} +local function allImplements(vehicle, list) + list = list or {} + if vehicle == nil or vehicle.getAttachedImplements == nil then return list end + for _, implement in ipairs(vehicle:getAttachedImplements()) do + if implement.object ~= nil then + table.insert(list, {object = implement.object, attacher = vehicle, jointDescIndex = implement.jointDescIndex}) + allImplements(implement.object, list) + end + end + return list +end + +-- Stop af mark/flow: sluk, løft og fold alle redskaber til transport. -> antal redskaber der fik noget gjort +function ADHitch.stowForTransport(vehicle) + local count = 0 + for _, item in ipairs(allImplements(vehicle)) do + local object = item.object + local foldDirection = object.spec_foldable ~= nil and -(object.spec_foldable.turnOnFoldDirection or 1) or nil + local actions = ADHitch.stowActions({ + turnedOn = object.getIsTurnedOn ~= nil and object:getIsTurnedOn(), + lowered = object.getIsLowered ~= nil and object:getIsLowered(true), + unfolded = object.getIsUnfolded ~= nil and object:getIsUnfolded() and foldDirection ~= nil, + canFold = foldDirection ~= nil and object.setFoldDirection ~= nil + and (object.getIsFoldAllowed == nil or object:getIsFoldAllowed(foldDirection, false)), + }) + for _, action in ipairs(actions) do + if action == "turnOff" and object.setIsTurnedOn ~= nil then + pcall(object.setIsTurnedOn, object, false) + elseif action == "raise" and item.attacher.setJointMoveDown ~= nil and item.jointDescIndex ~= nil then + pcall(item.attacher.setJointMoveDown, item.attacher, item.jointDescIndex, false) + elseif action == "fold" then + pcall(object.setFoldDirection, object, foldDirection) + end + end + if #actions > 0 then count = count + 1 end + end + return count +end + +-- Som stowForTransport, men logget og pcall'et (til stop-vejene). +function ADHitch.stow(vehicle, why) + local ok, count = pcall(ADHitch.stowForTransport, vehicle) + if not ok then + Logging.warning(ADHitch.LOG_PREFIX .. "'%s': kunne ikke gøre redskaber klar til vej: %s", vehicleName(vehicle), tostring(count)) + elseif count > 0 then + Logging.info(ADHitch.LOG_PREFIX .. "'%s': %d redskab(er) slukket, løftet og foldet (%s)", vehicleName(vehicle), count, tostring(why)) + end +end + function ADHitch.foldForTransport(vehicle) for _, implement in ipairs(ADHitch.rearImplementsOf(vehicle)) do local object = implement.object diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index 91bd946..53581f3 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -1203,6 +1203,7 @@ function ADRunsController.stopAllAndPark(adEnv) if ADFieldSilos ~= nil and ADFieldSilos.stopAll ~= nil then pcall(ADFieldSilos.stopAll, adEnv) end if ADFieldJobs ~= nil and ADFieldJobs.setPaused ~= nil then ADFieldJobs.setPaused(true) end for _, vehicle in ipairs(toPark) do + if ADHitch ~= nil and ADHitch.stow ~= nil and ADRunsController.getRunForVehicle(vehicle) == nil then ADHitch.stow(vehicle, "stop alt") end -- flow-traktor: tøm vognen, sæt den af på sin plads og kør hjem (ADFlowWagons klarer hele turen) local okHome, pooled = false, false if ADFlowWagons ~= nil and ADRunsController.getRunForVehicle(vehicle) ~= nil then diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 6db9152..7de2bc4 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.54.0.0 + 1.55.0.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adHitch.lua b/tests/test_adHitch.lua index 80eb635..76a8103 100644 --- a/tests/test_adHitch.lua +++ b/tests/test_adHitch.lua @@ -115,5 +115,10 @@ check("afkobl: redskab bagpå -> forsøg", H.detachStep(1, false), "attempt") check("afkobl: forsøgt, sidder der stadig -> forsøg igen", H.detachStep(1, true), "attempt") check("afkobl: forsøgt, intet bagpå -> færdig", H.detachStep(0, true), "done") check("afkobl: intet bagpå fra start", H.detachStep(0, false), "nothing") +-- transport ved stop: sluk, løft, fold (in-game 29/9: redskaber kørte udfoldet hjem efter stop) +check("transport: tændt+sænket+udfoldet", table.concat(H.stowActions({turnedOn = true, lowered = true, unfolded = true, canFold = true}), ","), "turnOff,raise,fold") +check("transport: allerede klar", #H.stowActions({}), 0) +check("transport: kan ikke foldes -> kun sluk/løft", table.concat(H.stowActions({turnedOn = true, lowered = true, unfolded = true, canFold = false}), ","), "turnOff,raise") +check("transport: kun udfoldet", table.concat(H.stowActions({unfolded = true, canFold = true}), ","), "fold") print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)