diff --git a/FS25_ADSmartPickup/adCpBridge.lua b/FS25_ADSmartPickup/adCpBridge.lua index b806b91..6c1571a 100644 --- a/FS25_ADSmartPickup/adCpBridge.lua +++ b/FS25_ADSmartPickup/adCpBridge.lua @@ -93,7 +93,9 @@ end local function sprayerNames(object) local unitIndex = object:getSprayerFillUnitIndex() 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)) end local supported = {} @@ -104,17 +106,29 @@ local function sprayerNames(object) if name ~= nil then supported[name] = true end end end - return filledName, supported + return filledName, supported, level, capacity end local function sprayRole(object) if object.spec_sprayer == nil or object.getSprayerFillUnitIndex == nil then return nil end - local ok, role, roles, filledRole = pcall(function() - local filledName, supported = sprayerNames(object) - return ADCpBridge.sprayRolesFor(filledName, supported) + local ok, role, roles, filledRole, wrongFillDumpable = pcall(function() + local filledName, supported, level, capacity = sprayerNames(object) + local r, rs, fr = ADCpBridge.sprayRolesFor(filledName, supported) + return r, rs, fr, ADCpBridge.isDumpable(level, capacity) 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 -- 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 if object.spec_sprayer ~= nil and object.getSprayerFillUnitIndex ~= nil then pcall(function() - local filledName = sprayerNames(object) + local filledName, _, level, capacity = sprayerNames(object) 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 level = object:getFillUnitFillLevel(unit) or 0 object:addFillUnitFillLevel(object:getOwnerFarmId(), unit, -level, object:getFillUnitFillType(unit), ToolType.UNDEFINED, nil) liters, name = liters + level, filledName end) @@ -142,7 +156,7 @@ function ADCpBridge.getSpecs(vehicle) for _, name in ipairs(ADCpBridge.SPECS) do if object[name] ~= nil then specs[name] = true 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 if vehicle.getCanStartCpCombineUnloader ~= nil then local ok, can = pcall(vehicle.getCanStartCpCombineUnloader, vehicle) diff --git a/FS25_ADSmartPickup/adFieldFleet.lua b/FS25_ADSmartPickup/adFieldFleet.lua index 50f1d73..d89b535 100644 --- a/FS25_ADSmartPickup/adFieldFleet.lua +++ b/FS25_ADSmartPickup/adFieldFleet.lua @@ -50,7 +50,10 @@ local function sortCandidates(candidates, role, x, z, requiredWidth, accept) 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 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 widthReason, widthArgs = reason, args end diff --git a/FS25_ADSmartPickup/adFieldWork.lua b/FS25_ADSmartPickup/adFieldWork.lua index 2e81aae..9e55522 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -129,7 +129,7 @@ function ADFieldWork.getRigs(adEnv) controlled = isControlledByPlayer(vehicle), width = ADCpBridge.getWorkWidth(vehicle), x = x, z = z, -- 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 == "seeder" then diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index d2b415a..178fccd 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.32.3.0 + 1.32.4.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adCpBridge.lua b/tests/test_adCpBridge.lua index bbc7af4..3acbcf3 100644 --- a/tests/test_adCpBridge.lua +++ b/tests/test_adCpBridge.lua @@ -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 ukrudtssprøjte", (ADCpBridge.sprayRolesFor(nil, {HERBICIDE = true, WATER = true})), "weeder") 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 local list = ADCpBridge.harvestFruitSet({fruitTypes = {3, 5}}) diff --git a/tests/test_adFieldFleet.lua b/tests/test_adFieldFleet.lua index 6d49ab9..10aaf71 100644 --- a/tests/test_adFieldFleet.lua +++ b/tests/test_adFieldFleet.lua @@ -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 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") +-- 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 local sprayA = {id = "sprøjte", role = "fertilizer"}