fix: Wait-markører aldrig mål i forsynings-runs; kilde-advarsel forklarer hvad opslaget ser ved markøren (v1.12.20.0)

This commit is contained in:
2026-09-23 18:00:42 +02:00
parent cc0a9f4157
commit 034286f69e
6 changed files with 60 additions and 4 deletions
+2 -1
View File
@@ -191,7 +191,8 @@ function ADOutbound.buildPlanInput(adEnv, run, vehicle)
for _, wayPointId in ipairs(run.sourceWayPointIds or {}) do for _, wayPointId in ipairs(run.sourceWayPointIds or {}) do
local source = ADSources.identify(adEnv, wayPointId, farmId) local source = ADSources.identify(adEnv, wayPointId, farmId)
if source == nil then 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 else
clearWarning(vehicle, "source:" .. tostring(wayPointId)) clearWarning(vehicle, "source:" .. tostring(wayPointId))
table.insert(sources, source) table.insert(sources, source)
+9 -2
View File
@@ -143,10 +143,16 @@ function ADRunsController.getRunTargets(run)
return run.targetWayPointId ~= nil and {run.targetWayPointId} or {} return run.targetWayPointId ~= nil and {run.targetWayPointId} or {}
end 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 function getTargetStations(adEnv, run, farmId)
local stations = {} local stations = {}
for _, wayPointId in ipairs(ADRunsController.getRunTargets(run)) do 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 if station ~= nil then
table.insert(stations, {wayPointId = wayPointId, station = station}) table.insert(stations, {wayPointId = wayPointId, station = station})
end end
@@ -861,7 +867,8 @@ end
function ADRunsController.getTargetMarkers(adEnv, farmId) function ADRunsController.getTargetMarkers(adEnv, farmId)
local entries = {} local entries = {}
for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do 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 local kind = station ~= nil and getTargetKind(station) or nil
if kind ~= nil then if kind ~= nil then
table.insert(entries, {marker = marker, kind = kind}) table.insert(entries, {marker = marker, kind = kind})
+27
View File
@@ -156,6 +156,33 @@ function ADSources.identify(adEnv, wayPointId, farmId)
return nil return nil
end 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) local function isPalletVehicle(vehicle)
return vehicle ~= nil and (vehicle.spec_pallet ~= nil or vehicle.isPallet == true) return vehicle ~= nil and (vehicle.spec_pallet ~= nil or vehicle.isPallet == true)
end end
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107"> <modDesc descVersion="107">
<author>masterdraco</author> <author>masterdraco</author>
<version>1.12.19.0</version> <version>1.12.20.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>
+14
View File
@@ -442,6 +442,20 @@ ADRunsController.startRun(adEnv, sugar.id)
check("C18 rigtig last -> målet", sugarVehicle.ad.stateModule.secondMarkerId, 77) check("C18 rigtig last -> målet", sugarVehicle.ad.stateModule.secondMarkerId, 77)
ADUnloadWait = nil; ADLoadSwap = nil 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 -- C-out: udkørsels-runs — oprettelse, kilder, produkter, validering, start, status
local BASKET = 7 local BASKET = 7
FILL_TYPE_NAMES[BASKET] = "STRAW_BASKET"; FILL_TYPE_INDEX["STRAW_BASKET"] = BASKET FILL_TYPE_NAMES[BASKET] = "STRAW_BASKET"; FILL_TYPE_INDEX["STRAW_BASKET"] = BASKET
+7
View File
@@ -340,5 +340,12 @@ check("S14 bulk", products14[1].isPallet, false)
check("S14 isPalletAt stald = bulk", ADSources.isPalletAt(source14, MILK), 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) 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")) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
os.exit(failures == 0 and 0 or 1) os.exit(failures == 0 and 0 or 1)