fix(bygninger): aflæsningsmarkør springer bygningens egne læssemarkører over når en drop-markør står ≤ 25 m fra triggeren (Sugarbeet Crusher pickup vs drop); siloer uændret (v1.18.5.0)
This commit is contained in:
@@ -8,6 +8,8 @@ ADBuildings = {}
|
||||
|
||||
ADBuildings.LOG_PREFIX = "ADSmartPickup: "
|
||||
ADBuildings.MAX_MARKER_DISTANCE = 40
|
||||
-- en separat drop-markør (≠ bygningens læssemarkør) må højst stå så langt fra aflæsningstriggeren
|
||||
ADBuildings.MAX_DROP_DISTANCE = 25
|
||||
ADBuildings.CACHE_MS = 1000
|
||||
|
||||
local cache = {list = nil, farmId = nil, time = -math.huge}
|
||||
@@ -175,6 +177,50 @@ local function nearestMarker(adEnv, nodes)
|
||||
return {id = best.id, name = tostring(best.name), distance = math.floor(bestDistance + 0.5)}
|
||||
end
|
||||
|
||||
-- Aflæsningsmarkør: nærmeste ikke-Wait-markør ≤ MAX_MARKER_DISTANCE til aflæsningsnoderne — men ikke
|
||||
-- bygningens egne LÆSSEmarkører, når der findes en anden (Sugarbeet Crusher: pickup står tættere på
|
||||
-- aflæsningstriggeren end drop). Kun én fælles markør (AIO Load / Unload) bruges til begge.
|
||||
local function unloadMarkerFor(adEnv, nodes, loadMarkers, allowSkipLoad)
|
||||
if #nodes == 0 then
|
||||
return nil
|
||||
end
|
||||
local isLoad = {}
|
||||
for _, marker in ipairs(loadMarkers or {}) do isLoad[marker.id] = true end
|
||||
local positions = {}
|
||||
for _, node in ipairs(nodes) do
|
||||
local x, z = getNodePosition(node)
|
||||
if x ~= nil then table.insert(positions, {x = x, z = z}) end
|
||||
end
|
||||
local best, bestOther = nil, nil
|
||||
for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do
|
||||
if not ADSupplyPlanner.isWaitMarker(marker) then
|
||||
local wayPoint = adEnv.ADGraphManager:getWayPointById(marker.id)
|
||||
if wayPoint ~= nil then
|
||||
for _, position in ipairs(positions) do
|
||||
local dx, dz = wayPoint.x - position.x, wayPoint.z - position.z
|
||||
local distance = math.sqrt(dx * dx + dz * dz)
|
||||
if distance < ADBuildings.MAX_MARKER_DISTANCE then
|
||||
if best == nil or distance < best.distance then best = {marker = marker, distance = distance} end
|
||||
if not isLoad[marker.id] and (bestOther == nil or distance < bestOther.distance) then
|
||||
bestOther = {marker = marker, distance = distance}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- siloer: altid nærmeste (en fælles markør må ikke erstattes af nabosiloens); ellers kun en "anden"
|
||||
-- markør der står tæt på aflæsningen
|
||||
local chosen = best
|
||||
if allowSkipLoad and bestOther ~= nil and bestOther.distance <= ADBuildings.MAX_DROP_DISTANCE then
|
||||
chosen = bestOther
|
||||
end
|
||||
if chosen == nil then
|
||||
return nil
|
||||
end
|
||||
return {id = chosen.marker.id, name = tostring(chosen.marker.name), distance = math.floor(chosen.distance + 0.5)}
|
||||
end
|
||||
|
||||
-- Silo: den markør hvis STRENGE opslag (trigger bag næsen) rammer siloens læssestation.
|
||||
local function siloLoadMarker(adEnv, farmId, placeable, loadStations)
|
||||
local own = {}
|
||||
@@ -241,7 +287,7 @@ local function build(adEnv, farmId)
|
||||
end
|
||||
table.sort(loadMarkers, function(a, b) return ADBuildings.naturalLess(a.name, b.name) end)
|
||||
end
|
||||
local unloadMarker = nearestMarker(adEnv, unloadNodes)
|
||||
local unloadMarker = unloadMarkerFor(adEnv, unloadNodes, loadMarkers, kind ~= "silo")
|
||||
-- silo der kun kan FYLDES (fx drive-on-bunker der fodrer en biogas-fermentor): aflæsning,
|
||||
-- ingen læssestation -> et forsyningsmål, aldrig en kilde
|
||||
local isFillOnlySilo = kind == "silo" and loadMarkers[1] == nil and #loadGroups == 0 and unloadMarker ~= nil
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.18.4.0</version>
|
||||
<version>1.18.5.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
Reference in New Issue
Block a user