fix(stald): foder-trigger søges i spec_husbandryFood (feedingTrough findes ikke i FS25) når stationen er uden noder — hønsehus; diagnose-log af feltnavne (v1.19.4.0)
This commit is contained in:
@@ -72,6 +72,22 @@ local function getKind(placeable)
|
||||
return nil
|
||||
end
|
||||
|
||||
local logHusbandryFoodOnce
|
||||
ADBuildings.findTriggerNodes = function(root, maxDepth) return ADSupplyPlanner.findTriggerNodes(root, maxDepth) end
|
||||
|
||||
-- Diagnose én gang pr. stald: hvilke felter foderdataene har, når ingen trigger-node blev fundet.
|
||||
local loggedFood = setmetatable({}, {__mode = "k"})
|
||||
logHusbandryFoodOnce = function(placeable)
|
||||
if loggedFood[placeable] then return end
|
||||
loggedFood[placeable] = true
|
||||
local keys = {}
|
||||
for key, value in pairs(placeable.spec_husbandryFood or {}) do table.insert(keys, tostring(key) .. ":" .. type(value)) end
|
||||
table.sort(keys)
|
||||
if Logging ~= nil and Logging.info ~= nil then
|
||||
Logging.info(ADBuildings.LOG_PREFIX .. "stald '%s' har ingen aflæsnings-trigger; spec_husbandryFood-felter: %s", getName(placeable, "?"), table.concat(keys, ", "))
|
||||
end
|
||||
end
|
||||
|
||||
-- Trigger-noder pr. bygning: læsse (loadTriggers.triggerNode, pallespawner, objektlager) og
|
||||
-- aflæsning (unloadTriggers exactFillRootNode/triggerNode/aiNode).
|
||||
-- loadGroups: én gruppe noder pr. læssepunkt (mælketank, gyllebeholder ...), så hvert punkt får sin
|
||||
@@ -104,11 +120,15 @@ local function collectNodes(placeable, loadStations, unloadStations)
|
||||
end
|
||||
if #nodes > 0 then table.insert(loadGroups, nodes) end
|
||||
end
|
||||
-- staldens foderkrybbe (hønsehus: kun krybben, ingen trigger i aflæsningsstationen)
|
||||
local food = placeable.spec_husbandryFood
|
||||
local trough = food ~= nil and food.feedingTrough or nil
|
||||
local troughNode = trough ~= nil and (trough.exactFillRootNode or trough.triggerNode) or nil
|
||||
if troughNode ~= nil then table.insert(unloadNodes, troughNode) end
|
||||
-- stald uden aflæsningsnoder i stationen (hønsehus: kun foder-triggeren) -> søg i staldens foderdata
|
||||
if #unloadNodes == 0 and placeable.getHusbandryFillLevel ~= nil then
|
||||
for _, node in ipairs(ADSupplyPlanner.findTriggerNodes(placeable.spec_husbandryFood)) do
|
||||
table.insert(unloadNodes, node)
|
||||
end
|
||||
if #unloadNodes == 0 then
|
||||
logHusbandryFoodOnce(placeable)
|
||||
end
|
||||
end
|
||||
-- stald med egne pallespawnere (hønsehus: æg, fårestald: uld) — én læssegruppe pr. spawner
|
||||
local husbandryPallets = placeable.spec_husbandryPallets
|
||||
local seenSpawners = {}
|
||||
|
||||
@@ -167,9 +167,10 @@ local function getLoadStationAtMarker(adEnv, wayPoint, farmId)
|
||||
return getClosestStation(adEnv, g_currentMission.storageSystem:getLoadingStations(), "loadTriggers", LOAD_TRIGGER_NODE_FIELDS, wayPoint, farmId)
|
||||
end
|
||||
|
||||
-- Staldes foderkrybbe (spec_husbandryFood.feedingTrough, samme tippe-trigger som AutoDrive bruger) står
|
||||
-- ikke altid i aflæsningsstationens unloadTriggers — hønsehuset har KUN krybben. Opslaget får derfor en
|
||||
-- proxy pr. krybbe der peger på staldens station (eller en minimal station). Caches i UNLOAD_CACHE_MS.
|
||||
-- En stalds foder-trigger står ikke altid i aflæsningsstationens unloadTriggers (hønsehuset har kun
|
||||
-- foder-triggeren under spec_husbandryFood; feltstien varierer). Står stationen uden trigger-noder, søges
|
||||
-- foderdataene, og opslaget får en proxy med de fundne noder, der peger på staldens station (eller en
|
||||
-- minimal station). Caches i UNLOAD_CACHE_MS.
|
||||
ADSmartPickup.UNLOAD_CACHE_MS = 1000
|
||||
local unloadCache = {list = nil, time = -math.huge}
|
||||
|
||||
@@ -191,16 +192,18 @@ local function getUnloadCandidates()
|
||||
end
|
||||
local placeables = g_currentMission.placeableSystem ~= nil and g_currentMission.placeableSystem.placeables or {}
|
||||
for _, placeable in pairs(placeables) do
|
||||
local food = placeable.spec_husbandryFood
|
||||
local trough = food ~= nil and food.feedingTrough or nil
|
||||
local node = trough ~= nil and (trough.exactFillRootNode or trough.triggerNode) or nil
|
||||
if node ~= nil then
|
||||
local station = byPlaceable[placeable] or {
|
||||
local ownStation = byPlaceable[placeable]
|
||||
local ownHasNodes = ownStation ~= nil and ownStation.unloadTriggers ~= nil and #ADSupplyPlanner.findTriggerNodes(ownStation.unloadTriggers, 1) > 0
|
||||
local foodNodes = (placeable.getHusbandryFillLevel ~= nil and not ownHasNodes) and ADSupplyPlanner.findTriggerNodes(placeable.spec_husbandryFood) or {}
|
||||
if #foodNodes > 0 then
|
||||
local triggers = {}
|
||||
for _, foodNode in ipairs(foodNodes) do table.insert(triggers, {exactFillRootNode = foodNode}) end
|
||||
local station = ownStation or {
|
||||
owningPlaceable = placeable,
|
||||
-- spillets adgangstjek kalder getOwnerFarmId på stationen
|
||||
getOwnerFarmId = function() return placeable.getOwnerFarmId ~= nil and placeable:getOwnerFarmId() or placeable.ownerFarmId end,
|
||||
}
|
||||
table.insert(list, setmetatable({unloadTriggers = {{exactFillRootNode = node}}}, {__index = station}))
|
||||
table.insert(list, setmetatable({unloadTriggers = triggers}, {__index = station}))
|
||||
end
|
||||
end
|
||||
unloadCache.list, unloadCache.time = list, now or -math.huge
|
||||
|
||||
@@ -296,3 +296,30 @@ function ADSupplyPlanner.resolveIngredients(state, selected)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
-- Trigger-noder (exactFillRootNode/triggerNode) i indlejrede tabeller, fx en stalds foderdata hvor feltstien
|
||||
-- varierer mellem FS-versioner og mods (hønsehuset har kun foder-triggeren, ikke i aflæsningsstationen).
|
||||
-- Højst maxDepth niveauer (standard 3); løkker og placeable-referencer følges ikke.
|
||||
local SKIP_KEYS = {owningPlaceable = true, placeable = true, owner = true, parent = true, vehicle = true, target = true, mission = true}
|
||||
|
||||
function ADSupplyPlanner.findTriggerNodes(root, maxDepth)
|
||||
local nodes, seen = {}, {}
|
||||
local function visit(value, depth)
|
||||
if type(value) ~= "table" or seen[value] or depth > (maxDepth or 3) then
|
||||
return
|
||||
end
|
||||
seen[value] = true
|
||||
for _, field in ipairs({"exactFillRootNode", "triggerNode"}) do
|
||||
local node = rawget(value, field)
|
||||
if node ~= nil and type(node) ~= "boolean" then table.insert(nodes, node) end
|
||||
end
|
||||
for key, child in pairs(value) do
|
||||
if type(child) == "table" and not SKIP_KEYS[key] then
|
||||
visit(child, depth + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
visit(root, 0)
|
||||
return nodes
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.19.3.0</version>
|
||||
<version>1.19.4.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
Reference in New Issue
Block a user