fix: marker uden jordstykke-kobling findes via jordstykket under midtpunktet (v1.62.8)

This commit is contained in:
2026-10-02 18:06:02 +02:00
parent bb287a8154
commit 3beb5b8800
3 changed files with 34 additions and 9 deletions
+1
View File
@@ -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 — 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.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). - **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 <navn>` og `Connect P <navn>` skal slutte som en bakrute. - Manualerne understreger nu, at parkering og hentning af redskaber kun virker ved at bakke: ruten til `P <navn>` og `Connect P <navn>` skal slutte som en bakrute.
+30 -6
View File
@@ -178,14 +178,28 @@ local function missionSettings()
} }
end end
local function fieldOwner(field) -- 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 farmland = field.farmland or (field.getFarmland ~= nil and field:getFarmland()) or nil
if farmland == nil then return nil end local farmlandId = farmland ~= nil and farmland.id or farmlandIdAtCenter(field)
if farmland.id ~= nil and g_farmlandManager ~= nil and g_farmlandManager.getFarmlandOwner ~= nil then if farmlandId ~= nil and g_farmlandManager ~= nil and g_farmlandManager.getFarmlandOwner ~= nil then
return g_farmlandManager:getFarmlandOwner(farmland.id) return g_farmlandManager:getFarmlandOwner(farmlandId)
end end
return farmland.farmId return farmland ~= nil and farmland.farmId or nil
end end
local fieldOwner = ADFields.fieldOwner
local function isOnField(x, z) local function isOnField(x, z)
local y = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, x, 1, z) local y = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, x, 1, z)
@@ -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 for _, field in pairs(g_fieldManager ~= nil and (g_fieldManager:getFields() or g_fieldManager.fields) or {}) do
table.insert(all, field) table.insert(all, field)
end 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 for start = 1, #all, 25 do
push(scan, function() push(scan, function()
for index = start, math.min(start + 24, #all) do for index = start, math.min(start + 24, #all) do
local field = all[index] local field = all[index]
local id = field.getId ~= nil and field:getId() or field.fieldId 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 if id ~= nil and fieldOwner(field) == farmId then
table.insert(scan.result, {id = id, field = field}) table.insert(scan.result, {id = id, field = field})
end end
@@ -568,6 +585,13 @@ local function finishOwnedScan(scan)
for id in pairs(ADFields.cache) do for id in pairs(ADFields.cache) do
if not ids[id] then ADFields.cache[id] = nil end if not ids[id] then ADFields.cache[id] = nil end
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.order = scan.result
ADFields.ownedDone = true ADFields.ownedDone = true
ADFields.listCache = nil ADFields.listCache = nil
+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.62.7.0</version> <version>1.62.8.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>