fix: løst stationsopslag (40 m, uanset retning) for stalde og fabrikker — mælketank ved siden af markøren genkendes (v1.12.21.0)
This commit is contained in:
@@ -168,6 +168,26 @@ function ADSmartPickup.getUnloadStationAtWayPointId(adEnv, wayPointId, farmId)
|
||||
return wayPoint ~= nil and getUnloadStationAtMarker(adEnv, wayPoint, farmId) or nil
|
||||
end
|
||||
|
||||
-- Løst opslag: nærmeste læssestation inden for maxDistance, uanset køreretning og "bag næsen".
|
||||
-- Til stalde og fabrikker (mælketank ved siden af markøren); siloer skal bruge det strenge
|
||||
-- opslag, ellers rammes nabosiloen i tætte rækker.
|
||||
function ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, maxDistance)
|
||||
local wayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId)
|
||||
if wayPoint == nil then
|
||||
return nil
|
||||
end
|
||||
local best, bestDistance = nil, maxDistance or ADSmartPickup.MAX_MARKER_TO_TRIGGER_DISTANCE
|
||||
for _, station in pairs(g_currentMission.storageSystem:getLoadingStations()) do
|
||||
if g_currentMission.accessHandler:canFarmAccess(farmId, station) then
|
||||
local closest = getDistancesToTriggers(station.loadTriggers, LOAD_TRIGGER_NODE_FIELDS, wayPoint, nil)
|
||||
if closest < bestDistance then
|
||||
best, bestDistance = station, closest
|
||||
end
|
||||
end
|
||||
end
|
||||
return best
|
||||
end
|
||||
|
||||
-- Siloens EGET indhold. Udvidelses-siloer (isExtension) deler lager med naboer
|
||||
-- inden for storageRadius, så stationens niveau er en nabo-sum — eget lager er
|
||||
-- det tal spilleren ser på siloen og giver en præcis "mindst først"-rangering.
|
||||
|
||||
@@ -141,6 +141,19 @@ function ADSources.identify(adEnv, wayPointId, farmId)
|
||||
if placeable ~= nil and placeable.getHusbandryFillLevel ~= nil then
|
||||
return {kind = "husbandry", placeable = placeable, station = station, wayPointId = wayPointId, name = getPlaceableName(placeable, markerName)}
|
||||
end
|
||||
-- Det strenge opslag (trigger bag næsen) passer til silorækker; en mælketank eller fabrik ligger
|
||||
-- ofte ved siden af markøren. Løst opslag inden for 40 m — men aldrig for siloer.
|
||||
if placeable == nil and ADSmartPickup.getLoadStationNearWayPointId ~= nil then
|
||||
local loose = ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, ADSources.MAX_DISTANCE)
|
||||
local loosePlaceable = loose ~= nil and loose.owningPlaceable or nil
|
||||
if loosePlaceable ~= nil and loosePlaceable.spec_silo == nil then
|
||||
if getProductionPoint(loosePlaceable) ~= nil then
|
||||
return {kind = "factory", placeable = loosePlaceable, station = loose, wayPointId = wayPointId, name = getPlaceableName(loosePlaceable, markerName)}
|
||||
elseif loosePlaceable.getHusbandryFillLevel ~= nil then
|
||||
return {kind = "husbandry", placeable = loosePlaceable, station = loose, wayPointId = wayPointId, name = getPlaceableName(loosePlaceable, markerName)}
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Rene pallefabrikker (halmvarer, bageri ...) har ingen læssestation: find dem på afstand
|
||||
-- til pallespawneren; dernæst objektlagre.
|
||||
local factory = findPlaceableNear(wayPoint, farmId, isProductionPoint)
|
||||
@@ -164,6 +177,10 @@ function ADSources.explainMarker(adEnv, wayPointId, farmId)
|
||||
end
|
||||
local station = ADSmartPickup.getLoadStationAtWayPointId(adEnv, wayPointId, farmId)
|
||||
if station == nil then
|
||||
local loose = ADSmartPickup.getLoadStationNearWayPointId ~= nil and ADSmartPickup.getLoadStationNearWayPointId(adEnv, wayPointId, farmId, ADSources.MAX_DISTANCE) or nil
|
||||
if loose ~= nil and loose.owningPlaceable ~= nil and loose.owningPlaceable.spec_silo ~= nil then
|
||||
return string.format("nærmeste læssestation inden for 40 m er en silo ('%s'), som kræver at markøren står i køresporet med triggeren bag næsen", getPlaceableName(loose.owningPlaceable, "?"))
|
||||
end
|
||||
local factory = findPlaceableNear(wayPoint, farmId, isProductionPoint)
|
||||
local storage = findPlaceableNear(wayPoint, farmId, isObjectStorage)
|
||||
if factory == nil and storage == nil then
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.12.20.0</version>
|
||||
<version>1.12.21.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
@@ -1097,6 +1097,15 @@ check("W15 kører hjem", orphanTask.destinationID, 30)
|
||||
check("W15 AD's mål gendannet", orphan.ad.stateModule.secondMarkerId, 30)
|
||||
testVehicles = {}
|
||||
|
||||
-- N1: løst opslag (stald/fabrik): nærmeste læssestation inden for maxDistance, uanset retning og "bag næsen"
|
||||
-- (in-game 23/9: mælketankens trigger lå ved siden af markøren, 20+ m væk -> "ingen læssestation")
|
||||
resetWorld()
|
||||
addMarker(1, "cow 1 milk", "Milk", 0, 0, -30, 0) -- kører mod +x; tanken ligger 25 m til siden
|
||||
table.insert(stations, makeStation(101, 0, 25, {[WHEAT] = 1}))
|
||||
check("N1 strengt opslag finder intet", ADSmartPickup.getLoadStationAtWayPointId(FS25_AutoDrive, 1, 1), nil)
|
||||
check("N1 løst opslag finder tanken", ADSmartPickup.getLoadStationNearWayPointId(FS25_AutoDrive, 1, 1, 40), stations[1])
|
||||
check("N1 uden for afstanden -> nil", ADSmartPickup.getLoadStationNearWayPointId(FS25_AutoDrive, 1, 1, 20), nil)
|
||||
|
||||
-- X: udkørsel koblet på getNextPickup-wrap'en og Wait-logikken
|
||||
resetWorld()
|
||||
addMarker(1, "Suger Load", "Pickup points", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 1000}))
|
||||
|
||||
@@ -347,5 +347,17 @@ loadAt[11] = {owningPlaceable = nil}
|
||||
wayPoints[11] = {id = 11, x = 2000, z = 2000}; table.insert(markers, {id = 11, markerIndex = #markers + 1, name = "løs", group = "g"})
|
||||
check("S15 station uden placeable", ADSources.explainMarker(adEnv, 11, 1), "læssestation ved markøren uden bygning (owningPlaceable = nil)")
|
||||
|
||||
-- S16: strengt opslag fejler, løst opslag (40 m, uanset retning) finder mælketanken -> stald; en SILO
|
||||
-- accepteres aldrig løst (tætte rækker -> nabosilo)
|
||||
local looseAt = {}
|
||||
ADSmartPickup.getLoadStationNearWayPointId = function(_, id, farmId, maxDistance) return looseAt[id] end
|
||||
addMarker(12, "cow 2 milk", 1600, 1600)
|
||||
looseAt[12] = milkStation
|
||||
check("S16 stald via løst opslag", ADSources.identify(adEnv, 12, 1).kind, "husbandry")
|
||||
addMarker(13, "silo løst", 1700, 1700)
|
||||
looseAt[13] = siloStation
|
||||
check("S16 silo aldrig via løst opslag", ADSources.identify(adEnv, 13, 1), nil)
|
||||
check("S16 forklaring nævner den løse station", ADSources.explainMarker(adEnv, 13, 1):find("silo", 1, true) ~= nil, true)
|
||||
|
||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
|
||||
Reference in New Issue
Block a user