From cbc9b2c8e36fad3c21be03e5922d222dacf61684 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 30 Sep 2026 22:15:32 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20p=C3=A5fyldningsmark=C3=B8r=20ved=20stat?= =?UTF-8?q?ionens=20egne=20l=C3=A6ssetriggere=20(langt=20s=C3=A6t=20fik=20?= =?UTF-8?q?anden=20stations=20mark=C3=B8r)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + FS25_ADSmartPickup/adFieldWork.lua | 63 +++++++++++++++++++++++++++++- FS25_ADSmartPickup/modDesc.xml | 2 +- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd2b806..99f8c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ står i [docs/BRUGERMANUAL.md](docs/BRUGERMANUAL.md) (dansk) og [docs/USER_MANUA ## 1.62 — Kæder slås selv til +- **1.62.3** Rettet: påfyldning ved købestation valgte en anden stations markør for lange sæt. AutoDrive vil have markøren togets længde + 3–13 m forbi triggeren, så Puma + Kinze 4900 ventede på frø ved "Market Price Liquid Fill Station" i stedet for "Buying Station Multifruit". Nu vælges den nærmeste markør ved stationens egne læssetriggere; P-, Connect- og Wait-markører springes over. Loggen skriver, hvor et tomt redskab fyldes. - **1.62.2** Kæderne læser fabrikkernes udgange (Sælg / Fordel / Behold). **Fordel:** spillet leverer selv til gårdens fabrikker, så kæden opretter intet flow, og fanen Kæder viser *fordeles af spillet*. **Behold** (spawn eller lager): et flow henter varen ved fabrikken som hidtil. **Sælg på en mellemvare** betyder, at næste led i kæden intet får, så kæden sætter den til Behold og henter den. - **1.62.1** Rettet: udkørsel fra objektlager (fx Sell Egg fra Æglageret) stoppede halvfuld med "spawner ikke … (30 s uden fremdrift)". Lageret deler samme vare i flere grupper (paller med forskellig fyldning), og moden talte kun den første gruppe — når en lille gruppe blev tom, så lageret ud til at vokse. Nu tælles alle grupper. Advarslen viser lager- og vogntal, hvis den alligevel opstår. - **1.62.0** **En kæde er noget du selv slår til:** tændte produktioner er ikke længere automatisk kæder (FS25 tænder nye produktioner som standard — 7 ensilagetårne gav 56 kæder og fik AIO-fabrikkens høproduktion tændt). Fanen **Kæder** har nederst *N tændte produktioner uden kæde* (foldet sammen); **[Kæde til]** gør en produktion til en kæde. En pauset kæde har **[Fjern]**. Ikke-valgte produktioner bruges stadig som kilde. Når en kæde fjernes, slettes dens tomme kædeflows (uden traktor), og mellemled kæden selv tændte slukkes igen. Rettet: kædens flowoversigt manglede traktorerne, så sammenlægning/oprydning kunne ramme et kædeflow med traktor. Udkørsel fra palleskur holder AutoDrive, mens moden tager paller ud. diff --git a/FS25_ADSmartPickup/adFieldWork.lua b/FS25_ADSmartPickup/adFieldWork.lua index b0dcfbb..b169854 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -379,6 +379,10 @@ local function refillPlan(adEnv, fieldId, vehicle, role, x, z) if fillType == nil then return nil end local empty = ADCpBridge.getRefillLevel(vehicle, fillType) <= 0 local refillId = empty and ADFieldWork.findRefillMarker(adEnv, vehicle, fillType, x, z) or nil + if refillId ~= nil then + local marker = adEnv.ADGraphManager:getMapMarkerByWayPointId(refillId) + log(fieldId, "'%s' er tom: fyldes med %s ved %s", ADRuns.vehicleLabel(vehicle), fillTypeName(fillType), tostring(marker ~= nil and marker.name or refillId)) + end return {fillType = fillType, empty = empty, refillId = refillId} end @@ -604,9 +608,64 @@ function ADFieldWork.buyingSupports(station, fillType) return ok and result == true end --- AD-markøren ved stationen: AutoDrives eget opslag (30 m fra triggeren), ellers nærmeste ikke-Wait --- markør inden for 40 m af bygningen ("Liquid Buy Station" står ved tanken, ikke ved triggeren). +-- Parkering, kobling og ventepladser er aldrig en læssemarkør. +local function isServiceMarker(marker) + local name = string.lower(tostring(marker.name or "")) + local group = string.lower(tostring(marker.group or "")) + return string.find(name, "^p ") ~= nil or string.find(name, "^connect ") ~= nil + or string.find(name, "%f[%a]wait%f[%A]") ~= nil or string.find(group, "%f[%a]wait%f[%A]") ~= nil +end + +-- markers = {{id, name, group, x, z}}, points = triggerpositioner {{x, z}} -> id på nærmeste læssemarkør inden for +-- maxDistance m af en af triggerne, ellers nil. +function ADFieldWork.nearestStationMarker(markers, points, maxDistance) + local best, bestDistance = nil, maxDistance * maxDistance + for _, marker in ipairs(markers or {}) do + if not isServiceMarker(marker) then + for _, point in ipairs(points or {}) do + local d = (marker.x - point.x) ^ 2 + (marker.z - point.z) ^ 2 + if d < bestDistance then best, bestDistance = marker.id, d end + end + end + end + return best +end + +ADFieldWork.STATION_MARKER_M = 30 + +-- Stationens læssetriggere i verden (buying-/loading-station) -> {{x, z}}. +local function loadTriggerPoints(station) + local points = {} + for _, trigger in pairs(station.loadTriggers or {}) do + local node = trigger.triggerNode or trigger.aiNode + if node ~= nil then + local ok, x, _, z = pcall(getWorldTranslation, node) + if ok and x ~= nil then table.insert(points, {x = x, z = z}) end + end + end + return points +end + +local function markerList(adEnv) + local list = {} + for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do + local wayPoint = adEnv.ADGraphManager:getWayPointById(marker.id) + if wayPoint ~= nil then + table.insert(list, {id = marker.id, name = marker.name, group = marker.group, x = wayPoint.x, z = wayPoint.z}) + end + end + return list +end + +-- AD-markøren ved stationen: først den nærmeste markør ved stationens EGNE læssetriggere (AutoDrives opslag vil have +-- markøren togets længde + 3..13 m forbi triggeren — et langt sæt fik så en anden stations markør: Puma + Kinze 4900 +-- ventede på frø ved "Market Price Liquid Fill Station", in-game 30/9). Så AutoDrives opslag, ellers nærmeste +-- ikke-Wait markør inden for 40 m af bygningen ("Liquid Buy Station" står ved tanken, ikke ved triggeren). local function markerAtStation(adEnv, vehicle, station, placeable) + local okOwn, ownId = pcall(function() + return ADFieldWork.nearestStationMarker(markerList(adEnv), loadTriggerPoints(station), ADFieldWork.STATION_MARKER_M) + end) + if okOwn and ownId ~= nil then return ownId end local okAd, wayPointId = pcall(function() return adEnv.ADTriggerManager:getMarkerAtStation(station, vehicle, 30) end) if okAd and wayPointId ~= nil and wayPointId > 0 then return wayPointId end local node = placeable ~= nil and placeable.rootNode or nil diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 59d2baf..5f8171b 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.62.2.0 + 1.62.3.0 <en>AD Smart Pickup</en>