fix(pulje): flow-vogne holdes altid af deres flow (også stoppet), stoppet flow-traktor kun ledig solo; markredskaber kun bag traktorer (butikskategori tractors*, ikke lastbil/Unimog); præcis venteårsag i loggen (v1.54.0.0)

This commit is contained in:
2026-09-29 14:09:12 +02:00
parent acbbe04a11
commit f472f5dd80
5 changed files with 91 additions and 20 deletions
+23 -3
View File
@@ -35,6 +35,19 @@ function ADPool.powerOk(tractorHp, neededHp)
return tractorHp >= neededHp
end
-- Butikskategori: markredskaber kun bag traktorer (tractorsS/M/L …) — ikke lastbil/Unimog, læssere o.l.
-- Tømmevogne må alle trække. Ukendt kategori tillades (intet må gå i stå på manglende data).
ADPool.ANY_PULLER_ROLES = {unloader = true}
function ADPool.categoryOk(category, role)
if category == nil or ADPool.ANY_PULLER_ROLES[role] then return true end
return tostring(category):lower():find("^tractors") ~= nil
end
local function suits(tractor, implement, role)
return ADPool.powerOk(tractor.hp, implement.neededHp) and ADPool.categoryOk(tractor.category, role)
end
-- Markøren "Connect <parkering>" for en parkering (navneregel).
function ADPool.connectFor(parkName, markers)
if type(parkName) ~= "string" then return nil end
@@ -147,7 +160,7 @@ function ADPool.pairFor(role, fieldX, fieldZ, implements, tractors, blocked, acc
end)
local weakest = nil
for _, implement in ipairs(candidates) do
local tractor = nearest(free, implement.x, implement.z, function(t) return ADPool.powerOk(t.hp, implement.neededHp) end)
local tractor = nearest(free, implement.x, implement.z, function(t) return suits(t, implement, role) end)
if tractor ~= nil then return {implement = implement, tractor = tractor} end
if weakest == nil or (implement.neededHp or 0) < (weakest.neededHp or 0) then weakest = implement end
end
@@ -162,7 +175,7 @@ function ADPool.pairAll(role, implements, tractors, blocked)
for _, implement in ipairs(implements or {}) do
if hasRole(implement, role) and not blocked[implement.id] then
local tractor = nearest(tractors or {}, implement.x, implement.z, function(t)
return not used[t.id] and not blocked[t.id] and not t.offNetwork and ADPool.powerOk(t.hp, implement.neededHp)
return not used[t.id] and not blocked[t.id] and not t.offNetwork and suits(t, implement, role)
end)
if tractor ~= nil then
used[tractor.id] = true
@@ -298,6 +311,13 @@ function ADPool.readTractorHp(vehicle)
return item ~= nil and item.specs ~= nil and ADPool.numberOf(item.specs.power) or nil
end
-- Butikskategori (fx "TRACTORSM", "TRUCKS") eller nil.
local function categoryOf(vehicle)
if g_storeManager == nil or vehicle.configFileName == nil then return nil end
local item = g_storeManager:getItemByXMLFilename(vehicle.configFileName)
return item ~= nil and item.categoryName or nil
end
-- Varer og samlet kapacitet i redskabets fyldenheder (tømmevogne).
function ADPool.cargoOf(vehicle)
local carries, capacity = {}, 0
@@ -367,7 +387,7 @@ function ADPool.collect(adEnv, isBusy)
-- uden for AD-vejnettet: den kan ikke køre ud efter redskabet (ville sende redskaber i karantæne)
local networkDistance = ADFieldWork.distanceToNetwork(adEnv, x, z)
table.insert(tractors, {id = id, vehicle = vehicle, name = ADRuns.vehicleLabel(vehicle), x = x, z = z,
hp = tractorHpOf(vehicle), parkId = park.id,
hp = tractorHpOf(vehicle), category = categoryOf(vehicle), parkId = park.id,
offNetwork = networkDistance ~= nil and networkDistance > ADFieldWork.MAX_OFF_NETWORK})
end
end