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
+32 -8
View File
@@ -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
+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>