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:
@@ -32,6 +32,13 @@ function ADFlowWagons.startAction(s)
|
||||
return "fetch"
|
||||
end
|
||||
|
||||
-- Hvorfor "wait" (til loggen). s som startAction.
|
||||
function ADFlowWagons.waitReason(s)
|
||||
if s.tractorBusy then return "tractorBusy" end
|
||||
if s.wagonAttached then return "wagonAttached" end
|
||||
return "wagonReserved"
|
||||
end
|
||||
|
||||
-- Ingen husket vogn: gæt ud fra parkeringsnavnet — en ledig vogn hvis parkering indeholder flowets navn, helst med
|
||||
-- traktorens nummer til sidst ("Cow Food 3" -> "P Cow Food vogn 3"). candidates = {{id, parkName}}, taken = {[id]=true}
|
||||
function ADFlowWagons.guessWagon(runName, tractorNumber, candidates, taken)
|
||||
@@ -58,16 +65,10 @@ function ADFlowWagons.ownerOf(runs, wagonId)
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Holdes vognen af et flow der ikke er stoppet? (så må puljen ikke låne den)
|
||||
-- Holdes vognen af et flow? Flowets vogn er flowets, også når flowet er stoppet — puljen, markarbejde og
|
||||
-- marksilo må ikke låne den (in-game 29/9: marksilo lånte Cow Food-traktoren med vognen på efter stop).
|
||||
function ADFlowWagons.isHeld(runs, wagonId)
|
||||
for _, run in ipairs(runs or {}) do
|
||||
if not run.stopped then
|
||||
for _, id in pairs(run.wagons or {}) do
|
||||
if id == wagonId then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
return ADFlowWagons.ownerOf(runs, wagonId) ~= nil
|
||||
end
|
||||
|
||||
-- Et tjek af om bygningen mangler: -> ny tæller, væk?
|
||||
@@ -147,9 +148,23 @@ local function connectOf(adEnv, wagon)
|
||||
end
|
||||
|
||||
-- Traktorer i stoppede flows er ledige i puljen; traktorer i kørende flows aldrig.
|
||||
-- s = {hasRun, stopped, carriesFlowWagon, homeTrip} -> må puljen/markarbejde/marksilo låne traktoren?
|
||||
function ADFlowWagons.tractorFree(s)
|
||||
if not s.hasRun then return true end
|
||||
return s.stopped == true and not s.carriesFlowWagon and not s.homeTrip
|
||||
end
|
||||
|
||||
function ADFlowWagons.isFreeTractor(vehicle)
|
||||
local run = ADRunsController.getRunForVehicle(vehicle)
|
||||
return run == nil or run.stopped == true
|
||||
local carries = false
|
||||
if run ~= nil then
|
||||
for _, implement in ipairs(ADHitch.rearImplementsOf(vehicle)) do
|
||||
local wagonId = ADRunsController.getVehicleId(implement.object)
|
||||
if wagonId ~= nil and ADFlowWagons.ownerOf(runs(), wagonId) ~= nil then carries = true end
|
||||
end
|
||||
end
|
||||
return ADFlowWagons.tractorFree({hasRun = run ~= nil, stopped = run ~= nil and run.stopped == true,
|
||||
carriesFlowWagon = carries, homeTrip = emptying[vehicle] ~= nil or homing[vehicle] ~= nil})
|
||||
end
|
||||
|
||||
-- Holder flowet noget: en traktor henter/venter på sin vogn eller har en vogn bagpå (til Stop-knappen).
|
||||
@@ -209,6 +224,16 @@ function ADFlowWagons.abortHomeTripOnStart(s)
|
||||
return s.emptying == true or s.flowHoming == true
|
||||
end
|
||||
|
||||
-- Hvilken af isPoolBusy's grunde (til loggen).
|
||||
function ADFlowWagons.busyWhy(vehicle, tractorId)
|
||||
if ADFieldJobs ~= nil and ADFieldJobs.state.assignments[tractorId] ~= nil then return "markopgave" end
|
||||
if ADFieldSilos ~= nil and ADFieldSilos.isLoaned(vehicle) then return "lånt af marksilo" end
|
||||
if ADPool ~= nil and ADPool.isReturning(vehicle) then return "sætter redskab af" end
|
||||
if ADCpBridge ~= nil and ADCpBridge.isWorking(vehicle) then return "Courseplay kører" end
|
||||
if emptying[vehicle] ~= nil then return "tømmer vognen" end
|
||||
return "?"
|
||||
end
|
||||
|
||||
-- Lånt ud af puljen: markarbejde, marksilo-lån, på hjemtur eller Courseplay kører den.
|
||||
function ADFlowWagons.isPoolBusy(vehicle, tractorId)
|
||||
return (ADFieldJobs ~= nil and ADFieldJobs.state.assignments[tractorId] ~= nil)
|
||||
@@ -238,19 +263,23 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle)
|
||||
end
|
||||
local wagon = wagonId ~= nil and findAnyVehicle(wagonId) or nil
|
||||
local connectId = wagon ~= nil and connectOf(adEnv, wagon) or nil
|
||||
local action = ADFlowWagons.startAction({
|
||||
local startState = {
|
||||
tractorBusy = ADFlowWagons.isPoolBusy(vehicle, tractorId),
|
||||
hasRear = #ADHitch.rearImplementsOf(vehicle) > 0, wagonId = wagonId, wagonExists = wagon ~= nil,
|
||||
hasConnect = connectId ~= nil,
|
||||
wagonAttached = wagon ~= nil and wagon.getAttacherVehicle ~= nil and wagon:getAttacherVehicle() ~= nil,
|
||||
wagonBusy = wagonId ~= nil and ADPool.isReserved(wagonId),
|
||||
})
|
||||
}
|
||||
local action = ADFlowWagons.startAction(startState)
|
||||
if action == "start" then return false end
|
||||
ADRunsController.runningRuns[run.id] = true
|
||||
if action == "wait" then
|
||||
if waiting[vehicle] == nil then
|
||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' venter på sin vogn (i brug andetsteds)", tostring(run.name),
|
||||
tostring(ADRuns.vehicleLabel(vehicle)))
|
||||
local holder = wagon ~= nil and wagon.getAttacherVehicle ~= nil and wagon:getAttacherVehicle() or nil
|
||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' venter på sin vogn (%s: %s)", tostring(run.name),
|
||||
tostring(ADRuns.vehicleLabel(vehicle)), ADFlowWagons.waitReason(startState),
|
||||
startState.tractorBusy and ADFlowWagons.busyWhy(vehicle, tractorId)
|
||||
or (holder ~= nil and ("sidder på " .. tostring(ADRuns.vehicleLabel(holder)))) or "reserveret af puljen")
|
||||
end
|
||||
waiting[vehicle] = run.id
|
||||
return true, {vehicle = vehicle, ok = true, reason = "waitingWagon"}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.53.2.0</version>
|
||||
<version>1.54.0.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
Reference in New Issue
Block a user