diff --git a/FS25_ADSmartPickup/adOutbound.lua b/FS25_ADSmartPickup/adOutbound.lua index 3fd84ac..30215ba 100644 --- a/FS25_ADSmartPickup/adOutbound.lua +++ b/FS25_ADSmartPickup/adOutbound.lua @@ -191,7 +191,8 @@ function ADOutbound.buildPlanInput(adEnv, run, vehicle) for _, wayPointId in ipairs(run.sourceWayPointIds or {}) do local source = ADSources.identify(adEnv, wayPointId, farmId) if source == nil then - warnOnce(adEnv, vehicle, "source:" .. tostring(wayPointId), string.format("run '%s': kilde-markør %s er ikke en fabrik, silo eller objektlager (inden for 40 m)", tostring(run.name), tostring(wayPointId))) + local explanation = ADSources.explainMarker ~= nil and ADSources.explainMarker(adEnv, wayPointId, farmId) or "?" + warnOnce(adEnv, vehicle, "source:" .. tostring(wayPointId), string.format("run '%s': kilde-markør %s er ikke en fabrik, silo, stald eller objektlager — %s", tostring(run.name), tostring(wayPointId), explanation)) else clearWarning(vehicle, "source:" .. tostring(wayPointId)) table.insert(sources, source) diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index cc6899e..0b6ca79 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -143,10 +143,16 @@ function ADRunsController.getRunTargets(run) return run.targetWayPointId ~= nil and {run.targetWayPointId} or {} end +local function isWaitWayPoint(adEnv, wayPointId) + local marker = adEnv.ADGraphManager.getMapMarkerByWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(wayPointId) or nil + return marker ~= nil and ADSupplyPlanner ~= nil and ADSupplyPlanner.isWaitMarker ~= nil and ADSupplyPlanner.isWaitMarker(marker) +end + +-- Wait-markører er ventepladser og aldrig mål, selv om de ligger inden for staldens trigger-rækkevidde. local function getTargetStations(adEnv, run, farmId) local stations = {} for _, wayPointId in ipairs(ADRunsController.getRunTargets(run)) do - local station = ADSmartPickup.getUnloadStationAtWayPointId(adEnv, wayPointId, farmId) + local station = not isWaitWayPoint(adEnv, wayPointId) and ADSmartPickup.getUnloadStationAtWayPointId(adEnv, wayPointId, farmId) or nil if station ~= nil then table.insert(stations, {wayPointId = wayPointId, station = station}) end @@ -861,7 +867,8 @@ end function ADRunsController.getTargetMarkers(adEnv, farmId) local entries = {} for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do - local station = ADSmartPickup.getUnloadStationAtWayPointId(adEnv, marker.id, farmId) + local isWait = ADSupplyPlanner ~= nil and ADSupplyPlanner.isWaitMarker ~= nil and ADSupplyPlanner.isWaitMarker(marker) + local station = not isWait and ADSmartPickup.getUnloadStationAtWayPointId(adEnv, marker.id, farmId) or nil local kind = station ~= nil and getTargetKind(station) or nil if kind ~= nil then table.insert(entries, {marker = marker, kind = kind}) diff --git a/FS25_ADSmartPickup/adSources.lua b/FS25_ADSmartPickup/adSources.lua index 84be2df..19d1d84 100644 --- a/FS25_ADSmartPickup/adSources.lua +++ b/FS25_ADSmartPickup/adSources.lua @@ -156,6 +156,33 @@ function ADSources.identify(adEnv, wayPointId, farmId) return nil end +-- Til advarslen "kilde-markør X er ikke …": hvad opslaget faktisk ser ved markøren. +function ADSources.explainMarker(adEnv, wayPointId, farmId) + local wayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId) + if wayPoint == nil then + return "markøren har intet waypoint (slettet?)" + end + local station = ADSmartPickup.getLoadStationAtWayPointId(adEnv, wayPointId, farmId) + if station == nil then + local factory = findPlaceableNear(wayPoint, farmId, isProductionPoint) + local storage = findPlaceableNear(wayPoint, farmId, isObjectStorage) + if factory == nil and storage == nil then + return "ingen læssestation ved markøren, og ingen fabrik/objektlager inden for 40 m" + end + return string.format("ingen læssestation ved markøren; nærmeste bygning: %s", getPlaceableName(factory or storage, "?")) + end + local placeable = station.owningPlaceable + if placeable == nil then + return "læssestation ved markøren uden bygning (owningPlaceable = nil)" + end + local kind = "ukendt bygningstype" + if getProductionPoint(placeable) ~= nil then kind = "fabrik" + elseif placeable.spec_silo ~= nil then kind = "silo" + elseif placeable.getHusbandryFillLevel ~= nil then kind = "stald" + elseif placeable.spec_objectStorage ~= nil then kind = "objektlager" end + return string.format("læssestation ved markøren hører til '%s' (%s)", getPlaceableName(placeable, "?"), kind) +end + local function isPalletVehicle(vehicle) return vehicle ~= nil and (vehicle.spec_pallet ~= nil or vehicle.isPallet == true) end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index b7ac4f0..5c6a740 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.12.19.0 + 1.12.20.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adRunsController.lua b/tests/test_adRunsController.lua index cbe2c17..183a684 100644 --- a/tests/test_adRunsController.lua +++ b/tests/test_adRunsController.lua @@ -442,6 +442,20 @@ ADRunsController.startRun(adEnv, sugar.id) check("C18 rigtig last -> målet", sugarVehicle.ad.stateModule.secondMarkerId, 77) ADUnloadWait = nil; ADLoadSwap = nil +-- C19: Wait-markører er aldrig mål — heller ikke når de står inden for 40 m af staldens trigger +buildWorld() +-- staldens station med bygning; Wait-markøren ligger i triggerens rækkevidde og "mangler mere" end 94 +local barnPlaceable = {getHusbandryFillLevel = function() return 0 end} +unloadAt[94].owningPlaceable = barnPlaceable +addMarker(400, "Cow Wait", "Cow Wait", 5005, 0); unloadAt[400] = {accepts = {[STRAW] = 300000, [TMR] = 300000}, levels = {}, owningPlaceable = barnPlaceable} +local targetNames = {} +for _, marker in ipairs(ADRunsController.getTargetMarkers(adEnv, 1)) do table.insert(targetNames, marker.name) end +check("C19 Wait-markør ikke i mål-listen", table.concat(targetNames, ","):find("Cow Wait", 1, true), nil) +local waitTargetRun = ADRunsController.createRun("Wait som mål") +ADRunsController.updateRun(waitTargetRun.id, {targetWayPointIds = {94, 400}}) +local waitVehicle = makeVehicle("vehicleW", "W", {STRAW, TMR}, 20000, 5000, 0) +check("C19 chooseTarget springer Wait over", ADRunsController.chooseTarget(adEnv, ADRuns.getRun(ADRunsController.store, waitTargetRun.id), waitVehicle), 94) + -- C-out: udkørsels-runs — oprettelse, kilder, produkter, validering, start, status local BASKET = 7 FILL_TYPE_NAMES[BASKET] = "STRAW_BASKET"; FILL_TYPE_INDEX["STRAW_BASKET"] = BASKET diff --git a/tests/test_adSources.lua b/tests/test_adSources.lua index 45d796a..2844e54 100644 --- a/tests/test_adSources.lua +++ b/tests/test_adSources.lua @@ -340,5 +340,12 @@ check("S14 bulk", products14[1].isPallet, false) check("S14 isPalletAt stald = bulk", ADSources.isPalletAt(source14, MILK), false) check("S14 kilde-markør i listen", ADRunsController ~= nil and true or true, true) +-- S15: forklaring af en markør til advarslen (hvad opslaget ser) +check("S15 forklaring stald", ADSources.explainMarker(adEnv, 10, 1), "læssestation ved markøren hører til 'Kostald' (stald)") +check("S15 forklaring ingen station", ADSources.explainMarker(adEnv, 4, 1), "ingen læssestation ved markøren, og ingen fabrik/objektlager inden for 40 m") +loadAt[11] = {owningPlaceable = nil} +wayPoints[11] = {id = 11, x = 2000, z = 2000}; table.insert(markers, {id = 11, markerIndex = #markers + 1, name = "løs", group = "g"}) +check("S15 station uden placeable", ADSources.explainMarker(adEnv, 11, 1), "læssestation ved markøren uden bygning (owningPlaceable = nil)") + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)