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
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)
+9 -2
View File
@@ -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})
+27
View File
@@ -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
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.12.19.0</version>
<version>1.12.20.0</version>
<title>
<en>AD Smart Pickup</en>
</title>
+14
View File
@@ -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
+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 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)