fix(markarbejde): forkert vare hældes kun ud som lille rest (≤10 %, ≤2000 l); fuld sprøjte/spreder bruges ikke til en anden opgave (100.000 l gødning blev hældt ud) (v1.32.4.0)

This commit is contained in:
2026-09-26 21:28:17 +02:00
parent a04c16552a
commit 59b6ac1e47
6 changed files with 39 additions and 12 deletions
+23 -9
View File
@@ -93,7 +93,9 @@ end
local function sprayerNames(object) local function sprayerNames(object)
local unitIndex = object:getSprayerFillUnitIndex() local unitIndex = object:getSprayerFillUnitIndex()
local filledName = nil local filledName = nil
if (object:getFillUnitFillLevel(unitIndex) or 0) > 0 then local level = object:getFillUnitFillLevel(unitIndex) or 0
local capacity = object.getFillUnitCapacity ~= nil and (object:getFillUnitCapacity(unitIndex) or 0) or 0
if level > 0 then
filledName = g_fillTypeManager:getFillTypeNameByIndex(object:getFillUnitFillType(unitIndex)) filledName = g_fillTypeManager:getFillTypeNameByIndex(object:getFillUnitFillType(unitIndex))
end end
local supported = {} local supported = {}
@@ -104,17 +106,29 @@ local function sprayerNames(object)
if name ~= nil then supported[name] = true end if name ~= nil then supported[name] = true end
end end
end end
return filledName, supported return filledName, supported, level, capacity
end end
local function sprayRole(object) local function sprayRole(object)
if object.spec_sprayer == nil or object.getSprayerFillUnitIndex == nil then return nil end if object.spec_sprayer == nil or object.getSprayerFillUnitIndex == nil then return nil end
local ok, role, roles, filledRole = pcall(function() local ok, role, roles, filledRole, wrongFillDumpable = pcall(function()
local filledName, supported = sprayerNames(object) local filledName, supported, level, capacity = sprayerNames(object)
return ADCpBridge.sprayRolesFor(filledName, supported) local r, rs, fr = ADCpBridge.sprayRolesFor(filledName, supported)
return r, rs, fr, ADCpBridge.isDumpable(level, capacity)
end) end)
if not ok then return nil end if not ok then return nil end
return role, roles, filledRole return role, roles, filledRole, wrongFillDumpable
end
-- Må en forkert vare hældes ud? Kun en lille rest: højst 10 % af tanken og aldrig over 2.000 l
-- (in-game 26/9: 100.000 l flydende gødning og 4.000 l sprøjtemiddel blev hældt ud for at skifte opgave).
ADCpBridge.MAX_DUMP_LITERS = 2000
ADCpBridge.MAX_DUMP_SHARE = 0.10
function ADCpBridge.isDumpable(level, capacity)
level = level or 0
if level <= 0 then return true end
if level > ADCpBridge.MAX_DUMP_LITERS then return false end
return capacity == nil or capacity <= 0 or level <= capacity * ADCpBridge.MAX_DUMP_SHARE
end end
-- Tøm sprøjten/sprederen for en vare der ikke hører til opgaven (kalk på, skal gøde). FS25 kan ikke -- Tøm sprøjten/sprederen for en vare der ikke hører til opgaven (kalk på, skal gøde). FS25 kan ikke
@@ -124,10 +138,10 @@ function ADCpBridge.emptySprayerIfWrong(vehicle, role)
for _, object in ipairs(collect(vehicle)) do for _, object in ipairs(collect(vehicle)) do
if object.spec_sprayer ~= nil and object.getSprayerFillUnitIndex ~= nil then if object.spec_sprayer ~= nil and object.getSprayerFillUnitIndex ~= nil then
pcall(function() pcall(function()
local filledName = sprayerNames(object) local filledName, _, level, capacity = sprayerNames(object)
if filledName == nil or ADCpBridge.sprayRoleForFillType(filledName) == role then return end if filledName == nil or ADCpBridge.sprayRoleForFillType(filledName) == role then return end
if not ADCpBridge.isDumpable(level, capacity) then return end
local unit = object:getSprayerFillUnitIndex() local unit = object:getSprayerFillUnitIndex()
local level = object:getFillUnitFillLevel(unit) or 0
object:addFillUnitFillLevel(object:getOwnerFarmId(), unit, -level, object:getFillUnitFillType(unit), ToolType.UNDEFINED, nil) object:addFillUnitFillLevel(object:getOwnerFarmId(), unit, -level, object:getFillUnitFillType(unit), ToolType.UNDEFINED, nil)
liters, name = liters + level, filledName liters, name = liters + level, filledName
end) end)
@@ -142,7 +156,7 @@ function ADCpBridge.getSpecs(vehicle)
for _, name in ipairs(ADCpBridge.SPECS) do for _, name in ipairs(ADCpBridge.SPECS) do
if object[name] ~= nil then specs[name] = true end if object[name] ~= nil then specs[name] = true end
end end
if specs.sprayRole == nil then specs.sprayRole, specs.sprayRoles, specs.filledRole = sprayRole(object) end if specs.sprayRole == nil then specs.sprayRole, specs.sprayRoles, specs.filledRole, specs.dumpable = sprayRole(object) end
end end
if vehicle.getCanStartCpCombineUnloader ~= nil then if vehicle.getCanStartCpCombineUnloader ~= nil then
local ok, can = pcall(vehicle.getCanStartCpCombineUnloader, vehicle) local ok, can = pcall(vehicle.getCanStartCpCombineUnloader, vehicle)
+4 -1
View File
@@ -50,7 +50,10 @@ local function sortCandidates(candidates, role, x, z, requiredWidth, accept)
local dx, dz = candidate.x - x, candidate.z - z local dx, dz = candidate.x - x, candidate.z - z
-- spreder med en anden vare på skal tømmes først: kun hvis ingen anden kan -- spreder med en anden vare på skal tømmes først: kun hvis ingen anden kan
local wrongFill = candidate.filledRole ~= nil and candidate.filledRole ~= role local wrongFill = candidate.filledRole ~= nil and candidate.filledRole ~= role
table.insert(usable, {candidate = candidate, distance = dx * dx + dz * dz, wrongFill = wrongFill}) -- fuld af en anden vare: bruges slet ikke til denne opgave (resten hældes kun ud når den er lille)
if not (wrongFill and candidate.dumpable == false) then
table.insert(usable, {candidate = candidate, distance = dx * dx + dz * dz, wrongFill = wrongFill})
end
elseif widthReason == nil then elseif widthReason == nil then
widthReason, widthArgs = reason, args widthReason, widthArgs = reason, args
end end
+1 -1
View File
@@ -129,7 +129,7 @@ function ADFieldWork.getRigs(adEnv)
controlled = isControlledByPlayer(vehicle), controlled = isControlledByPlayer(vehicle),
width = ADCpBridge.getWorkWidth(vehicle), x = x, z = z, width = ADCpBridge.getWorkWidth(vehicle), x = x, z = z,
-- tom spreder kan flere ting (gødning og kalk): alle dens roller -- tom spreder kan flere ting (gødning og kalk): alle dens roller
roles = specs.sprayRoles, filledRole = specs.filledRole, roles = specs.sprayRoles, filledRole = specs.filledRole, dumpable = specs.dumpable,
} }
if role == "harvester" then rig.fruits = ADCpBridge.getHarvestFruits(vehicle) or {} end if role == "harvester" then rig.fruits = ADCpBridge.getHarvestFruits(vehicle) or {} end
if role == "seeder" then if role == "seeder" then
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107"> <modDesc descVersion="107">
<author>masterdraco</author> <author>masterdraco</author>
<version>1.32.3.0</version> <version>1.32.4.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>
+6
View File
@@ -82,6 +82,12 @@ check("SR2 med kalk kan stadig gøde (efter tømning)", r2 and r2.fertilizer, tr
check("SR2 fyldets rolle", f2, "limer") check("SR2 fyldets rolle", f2, "limer")
check("SR2 ukrudtssprøjte", (ADCpBridge.sprayRolesFor(nil, {HERBICIDE = true, WATER = true})), "weeder") check("SR2 ukrudtssprøjte", (ADCpBridge.sprayRolesFor(nil, {HERBICIDE = true, WATER = true})), "weeder")
check("SR2 vandvogn er ingen sprøjte", (ADCpBridge.sprayRolesFor(nil, {WATER = true})), nil) check("SR2 vandvogn er ingen sprøjte", (ADCpBridge.sprayRolesFor(nil, {WATER = true})), nil)
-- SR3: kun en lille rest må hældes ud (100.000 l gødning blev hældt ud in-game 26/9)
check("SR3 tom", ADCpBridge.isDumpable(0, 4000), true)
check("SR3 lille rest 300 af 4000", ADCpBridge.isDumpable(300, 4000), true)
check("SR3 halv tank 2000 af 4000", ADCpBridge.isDumpable(2000, 4000), false)
check("SR3 100000 l aldrig", ADCpBridge.isDumpable(100000, 1000000), false)
check("SR3 over 2000 l aldrig", ADCpBridge.isDumpable(2500, 100000), false)
-- HF: høsterens afgrøder fra skærebordet (liste eller opslag); finsnitter tager ingen -- HF: høsterens afgrøder fra skærebordet (liste eller opslag); finsnitter tager ingen
local list = ADCpBridge.harvestFruitSet({fruitTypes = {3, 5}}) local list = ADCpBridge.harvestFruitSet({fruitTypes = {3, 5}})
+4
View File
@@ -104,6 +104,10 @@ check("FLS tom spreder tager kalkning", F.pick({spreaders[2]}, "limer", 0, 0) an
check("FLS gødskning: tom før nærmere med kalk på", F.pick(spreaders, "fertilizer", 0, 0).id, "tom") check("FLS gødskning: tom før nærmere med kalk på", F.pick(spreaders, "fertilizer", 0, 0).id, "tom")
check("FLS kun kalk-sprederen: bruges (tømmes)", F.pick({spreaders[1]}, "fertilizer", 0, 0).id, "kalk") check("FLS kun kalk-sprederen: bruges (tømmes)", F.pick({spreaders[1]}, "fertilizer", 0, 0).id, "kalk")
check("FLS kalkning: den med kalk på foretrækkes", F.pick(spreaders, "limer", 0, 0).id, "kalk") check("FLS kalkning: den med kalk på foretrækkes", F.pick(spreaders, "limer", 0, 0).id, "kalk")
-- FLS2: fuld af en anden vare (ikke dumpable) bruges slet ikke til opgaven
local fullOther = {id = "fuld", role = "fertilizer", roles = {fertilizer = true, weeder = true}, filledRole = "fertilizer", dumpable = false, enabled = true, x = 0, z = 0, width = 30}
check("FLS2 fuld gødningssprøjte bruges ikke til ukrudt", F.pick({fullOther}, "weeder", 0, 0), nil)
check("FLS2 men gerne til gødning", F.pick({fullOther}, "fertilizer", 0, 0).id, "fuld")
-- FLD: faste maskiner pr. mark -- FLD: faste maskiner pr. mark
local sprayA = {id = "sprøjte", role = "fertilizer"} local sprayA = {id = "sprøjte", role = "fertilizer"}