From 3beb5b880032fd010a39b916e37010407819b3df Mon Sep 17 00:00:00 2001 From: masterdraco Date: Fri, 2 Oct 2026 18:06:02 +0200 Subject: [PATCH] fix: marker uden jordstykke-kobling findes via jordstykket under midtpunktet (v1.62.8) --- CHANGELOG.md | 1 + FS25_ADSmartPickup/adFields.lua | 40 ++++++++++++++++++++++++++------- FS25_ADSmartPickup/modDesc.xml | 2 +- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3b5f4b..0f2a4f3 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.8** Rettet: fanen Marker viste "0 af 0" på kort, hvor markerne ikke er koblet til et jordstykke (Chipping Norton). Ejeren findes nu via jordstykket under markens midtpunkt. Loggen skriver én linje med antal marker, ejede og ukoblede. - **1.62.7** Nyt: konsolkommandoen `spuSellBlock` slår salgssteder fra og til (pr. savegame). Et salgssted, der er slået fra, bruges hverken til udkørsel eller i priserne. Til stationer, hvor aflæsningen går i stå, fx "Market Price Liquid Fill Station". - **1.62.6** Pålæsningsdiagnosen logger kun, når en trigger med varen er inden for 20 m (køretøjer der holder ved Wait-punkter eller marker gav falske meldinger). - Manualerne understreger nu, at parkering og hentning af redskaber kun virker ved at bakke: ruten til `P ` og `Connect P ` skal slutte som en bakrute. diff --git a/FS25_ADSmartPickup/adFields.lua b/FS25_ADSmartPickup/adFields.lua index a5c0a38..e058eee 100644 --- a/FS25_ADSmartPickup/adFields.lua +++ b/FS25_ADSmartPickup/adFields.lua @@ -178,15 +178,29 @@ local function missionSettings() } end -local function fieldOwner(field) - local farmland = field.farmland or (field.getFarmland ~= nil and field:getFarmland()) or nil - if farmland == nil then return nil end - if farmland.id ~= nil and g_farmlandManager ~= nil and g_farmlandManager.getFarmlandOwner ~= nil then - return g_farmlandManager:getFarmlandOwner(farmland.id) - end - return farmland.farmId +-- Jordstykket under markens midtpunkt (reserve når marken ikke er koblet til et jordstykke). +local function farmlandIdAtCenter(field) + if g_farmlandManager == nil or g_farmlandManager.getFarmlandIdAtWorldPosition == nil then return nil end + local verts = ADFields.readPolygon(field) + if #verts == 0 then return nil end + local sx, sz = 0, 0 + for _, v in ipairs(verts) do sx, sz = sx + v.x, sz + v.z end + local ok, id = pcall(g_farmlandManager.getFarmlandIdAtWorldPosition, g_farmlandManager, sx / #verts, sz / #verts) + return ok and type(id) == "number" and id > 0 and id or nil end +-- Gården der ejer marken. Nogle kort kobler ikke markerne til et jordstykke (Chipping Norton, in-game 2/10: +-- fanen Marker stod på "0 af 0") — så bruges jordstykket under markens midtpunkt. +function ADFields.fieldOwner(field) + local farmland = field.farmland or (field.getFarmland ~= nil and field:getFarmland()) or nil + local farmlandId = farmland ~= nil and farmland.id or farmlandIdAtCenter(field) + if farmlandId ~= nil and g_farmlandManager ~= nil and g_farmlandManager.getFarmlandOwner ~= nil then + return g_farmlandManager:getFarmlandOwner(farmlandId) + end + return farmland ~= nil and farmland.farmId or nil +end +local fieldOwner = ADFields.fieldOwner + local function isOnField(x, z) local y = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, x, 1, z) return FSDensityMapUtil.getFieldDataAtWorldPosition(x, y, z) and true or false @@ -546,12 +560,15 @@ local function newOwnedScan(farmId) for _, field in pairs(g_fieldManager ~= nil and (g_fieldManager:getFields() or g_fieldManager.fields) or {}) do table.insert(all, field) end - local scan = {owned = true, queue = {}, head = 1, tail = 0, result = {}} + local scan = {owned = true, queue = {}, head = 1, tail = 0, result = {}, total = #all, unlinked = 0, farmId = farmId} for start = 1, #all, 25 do push(scan, function() for index = start, math.min(start + 24, #all) do local field = all[index] local id = field.getId ~= nil and field:getId() or field.fieldId + if field.farmland == nil and (field.getFarmland == nil or field:getFarmland() == nil) then + scan.unlinked = scan.unlinked + 1 + end if id ~= nil and fieldOwner(field) == farmId then table.insert(scan.result, {id = id, field = field}) end @@ -568,6 +585,13 @@ local function finishOwnedScan(scan) for id in pairs(ADFields.cache) do if not ids[id] then ADFields.cache[id] = nil end end + -- diagnose: kun når tællingen ændrer sig (scanningen kører hvert OWNED_REFRESH_MS) + local summary = string.format("marker: %d i alt, %d ejet af gård %s, %d uden jordstykke-kobling", + scan.total or 0, #scan.result, tostring(scan.farmId), scan.unlinked or 0) + if summary ~= ADFields.lastOwnedSummary then + ADFields.lastOwnedSummary = summary + Logging.info("ADSmartPickup: " .. summary) + end ADFields.order = scan.result ADFields.ownedDone = true ADFields.listCache = nil diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 8c69ecb..1ed33db 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.62.7.0 + 1.62.8.0 <en>AD Smart Pickup</en>