From 4a283b086f979387d39560b01f8641ce323b2e29 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 23 Sep 2026 18:06:04 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20l=C3=B8st=20stationsopslag=20(40=20m,=20?= =?UTF-8?q?uanset=20retning)=20for=20stalde=20og=20fabrikker=20=E2=80=94?= =?UTF-8?q?=20m=C3=A6lketank=20ved=20siden=20af=20mark=C3=B8ren=20genkende?= =?UTF-8?q?s=20(v1.12.21.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adSmartPickup.lua | 20 ++++++++++++++++++++ FS25_ADSmartPickup/adSources.lua | 17 +++++++++++++++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adSmartPickup.lua | 9 +++++++++ tests/test_adSources.lua | 12 ++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index 0dd84ca..1bafcdf 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -168,6 +168,26 @@ function ADSmartPickup.getUnloadStationAtWayPointId(adEnv, wayPointId, farmId) return wayPoint ~= nil and getUnloadStationAtMarker(adEnv, wayPoint, farmId) or nil end +-- Løst opslag: nærmeste læssestation inden for maxDistance, uanset køreretning og "bag næsen". +-- Til stalde og fabrikker (mælketank ved siden af markøren); siloer skal bruge det strenge +-- opslag, ellers rammes nabosiloen i tætte rækker. +function ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, maxDistance) + local wayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId) + if wayPoint == nil then + return nil + end + local best, bestDistance = nil, maxDistance or ADSmartPickup.MAX_MARKER_TO_TRIGGER_DISTANCE + for _, station in pairs(g_currentMission.storageSystem:getLoadingStations()) do + if g_currentMission.accessHandler:canFarmAccess(farmId, station) then + local closest = getDistancesToTriggers(station.loadTriggers, LOAD_TRIGGER_NODE_FIELDS, wayPoint, nil) + if closest < bestDistance then + best, bestDistance = station, closest + end + end + end + return best +end + -- Siloens EGET indhold. Udvidelses-siloer (isExtension) deler lager med naboer -- inden for storageRadius, så stationens niveau er en nabo-sum — eget lager er -- det tal spilleren ser på siloen og giver en præcis "mindst først"-rangering. diff --git a/FS25_ADSmartPickup/adSources.lua b/FS25_ADSmartPickup/adSources.lua index 19d1d84..c6f6f5d 100644 --- a/FS25_ADSmartPickup/adSources.lua +++ b/FS25_ADSmartPickup/adSources.lua @@ -141,6 +141,19 @@ function ADSources.identify(adEnv, wayPointId, farmId) if placeable ~= nil and placeable.getHusbandryFillLevel ~= nil then return {kind = "husbandry", placeable = placeable, station = station, wayPointId = wayPointId, name = getPlaceableName(placeable, markerName)} end + -- Det strenge opslag (trigger bag næsen) passer til silorækker; en mælketank eller fabrik ligger + -- ofte ved siden af markøren. Løst opslag inden for 40 m — men aldrig for siloer. + if placeable == nil and ADSmartPickup.getLoadStationNearWayPointId ~= nil then + local loose = ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, ADSources.MAX_DISTANCE) + local loosePlaceable = loose ~= nil and loose.owningPlaceable or nil + if loosePlaceable ~= nil and loosePlaceable.spec_silo == nil then + if getProductionPoint(loosePlaceable) ~= nil then + return {kind = "factory", placeable = loosePlaceable, station = loose, wayPointId = wayPointId, name = getPlaceableName(loosePlaceable, markerName)} + elseif loosePlaceable.getHusbandryFillLevel ~= nil then + return {kind = "husbandry", placeable = loosePlaceable, station = loose, wayPointId = wayPointId, name = getPlaceableName(loosePlaceable, markerName)} + end + end + end -- Rene pallefabrikker (halmvarer, bageri ...) har ingen læssestation: find dem på afstand -- til pallespawneren; dernæst objektlagre. local factory = findPlaceableNear(wayPoint, farmId, isProductionPoint) @@ -164,6 +177,10 @@ function ADSources.explainMarker(adEnv, wayPointId, farmId) end local station = ADSmartPickup.getLoadStationAtWayPointId(adEnv, wayPointId, farmId) if station == nil then + local loose = ADSmartPickup.getLoadStationNearWayPointId ~= nil and ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, ADSources.MAX_DISTANCE) or nil + if loose ~= nil and loose.owningPlaceable ~= nil and loose.owningPlaceable.spec_silo ~= nil then + return string.format("nærmeste læssestation inden for 40 m er en silo ('%s'), som kræver at markøren står i køresporet med triggeren bag næsen", getPlaceableName(loose.owningPlaceable, "?")) + end local factory = findPlaceableNear(wayPoint, farmId, isProductionPoint) local storage = findPlaceableNear(wayPoint, farmId, isObjectStorage) if factory == nil and storage == nil then diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 5c6a740..7de5a80 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.12.20.0 + 1.12.21.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index 6812c3f..f84b62f 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -1097,6 +1097,15 @@ check("W15 kører hjem", orphanTask.destinationID, 30) check("W15 AD's mål gendannet", orphan.ad.stateModule.secondMarkerId, 30) testVehicles = {} +-- N1: løst opslag (stald/fabrik): nærmeste læssestation inden for maxDistance, uanset retning og "bag næsen" +-- (in-game 23/9: mælketankens trigger lå ved siden af markøren, 20+ m væk -> "ingen læssestation") +resetWorld() +addMarker(1, "cow 1 milk", "Milk", 0, 0, -30, 0) -- kører mod +x; tanken ligger 25 m til siden +table.insert(stations, makeStation(101, 0, 25, {[WHEAT] = 1})) +check("N1 strengt opslag finder intet", ADSmartPickup.getLoadStationAtWayPointId(FS25_AutoDrive, 1, 1), nil) +check("N1 løst opslag finder tanken", ADSmartPickup.getLoadStationNearWayPointId(FS25_AutoDrive, 1, 1, 40), stations[1]) +check("N1 uden for afstanden -> nil", ADSmartPickup.getLoadStationNearWayPointId(FS25_AutoDrive, 1, 1, 20), nil) + -- X: udkørsel koblet på getNextPickup-wrap'en og Wait-logikken resetWorld() addMarker(1, "Suger Load", "Pickup points", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 1000})) diff --git a/tests/test_adSources.lua b/tests/test_adSources.lua index 2844e54..5dbb00c 100644 --- a/tests/test_adSources.lua +++ b/tests/test_adSources.lua @@ -347,5 +347,17 @@ 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)") +-- S16: strengt opslag fejler, løst opslag (40 m, uanset retning) finder mælketanken -> stald; en SILO +-- accepteres aldrig løst (tætte rækker -> nabosilo) +local looseAt = {} +ADSmartPickup.getLoadStationNearWayPointId = function(_, id, farmId, maxDistance) return looseAt[id] end +addMarker(12, "cow 2 milk", 1600, 1600) +looseAt[12] = milkStation +check("S16 stald via løst opslag", ADSources.identify(adEnv, 12, 1).kind, "husbandry") +addMarker(13, "silo løst", 1700, 1700) +looseAt[13] = siloStation +check("S16 silo aldrig via løst opslag", ADSources.identify(adEnv, 13, 1), nil) +check("S16 forklaring nævner den løse station", ADSources.explainMarker(adEnv, 13, 1):find("silo", 1, true) ~= nil, true) + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)