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.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 <navn>` og `Connect P <navn>` skal slutte som en bakrute.
+30 -6
View File
@@ -178,14 +178,28 @@ local function missionSettings()
}
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
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)
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.farmId
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)
@@ -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
+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.62.7.0</version>
<version>1.62.8.0</version>
<title>
<en>AD Smart Pickup</en>
</title>