fix: påfyldningsmarkør ved stationens egne læssetriggere (langt sæt fik anden stations markør)

This commit is contained in:
2026-09-30 22:15:32 +02:00
parent 1bda82a270
commit cbc9b2c8e3
3 changed files with 63 additions and 3 deletions
+61 -2
View File
@@ -379,6 +379,10 @@ local function refillPlan(adEnv, fieldId, vehicle, role, x, z)
if fillType == nil then return nil end
local empty = ADCpBridge.getRefillLevel(vehicle, fillType) <= 0
local refillId = empty and ADFieldWork.findRefillMarker(adEnv, vehicle, fillType, x, z) or nil
if refillId ~= nil then
local marker = adEnv.ADGraphManager:getMapMarkerByWayPointId(refillId)
log(fieldId, "'%s' er tom: fyldes med %s ved %s", ADRuns.vehicleLabel(vehicle), fillTypeName(fillType), tostring(marker ~= nil and marker.name or refillId))
end
return {fillType = fillType, empty = empty, refillId = refillId}
end
@@ -604,9 +608,64 @@ function ADFieldWork.buyingSupports(station, fillType)
return ok and result == true
end
-- AD-markøren ved stationen: AutoDrives eget opslag (30 m fra triggeren), ellers nærmeste ikke-Wait
-- markør inden for 40 m af bygningen ("Liquid Buy Station" står ved tanken, ikke ved triggeren).
-- Parkering, kobling og ventepladser er aldrig en læssemarkør.
local function isServiceMarker(marker)
local name = string.lower(tostring(marker.name or ""))
local group = string.lower(tostring(marker.group or ""))
return string.find(name, "^p ") ~= nil or string.find(name, "^connect ") ~= nil
or string.find(name, "%f[%a]wait%f[%A]") ~= nil or string.find(group, "%f[%a]wait%f[%A]") ~= nil
end
-- markers = {{id, name, group, x, z}}, points = triggerpositioner {{x, z}} -> id på nærmeste læssemarkør inden for
-- maxDistance m af en af triggerne, ellers nil.
function ADFieldWork.nearestStationMarker(markers, points, maxDistance)
local best, bestDistance = nil, maxDistance * maxDistance
for _, marker in ipairs(markers or {}) do
if not isServiceMarker(marker) then
for _, point in ipairs(points or {}) do
local d = (marker.x - point.x) ^ 2 + (marker.z - point.z) ^ 2
if d < bestDistance then best, bestDistance = marker.id, d end
end
end
end
return best
end
ADFieldWork.STATION_MARKER_M = 30
-- Stationens læssetriggere i verden (buying-/loading-station) -> {{x, z}}.
local function loadTriggerPoints(station)
local points = {}
for _, trigger in pairs(station.loadTriggers or {}) do
local node = trigger.triggerNode or trigger.aiNode
if node ~= nil then
local ok, x, _, z = pcall(getWorldTranslation, node)
if ok and x ~= nil then table.insert(points, {x = x, z = z}) end
end
end
return points
end
local function markerList(adEnv)
local list = {}
for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do
local wayPoint = adEnv.ADGraphManager:getWayPointById(marker.id)
if wayPoint ~= nil then
table.insert(list, {id = marker.id, name = marker.name, group = marker.group, x = wayPoint.x, z = wayPoint.z})
end
end
return list
end
-- AD-markøren ved stationen: først den nærmeste markør ved stationens EGNE læssetriggere (AutoDrives opslag vil have
-- markøren togets længde + 3..13 m forbi triggeren — et langt sæt fik så en anden stations markør: Puma + Kinze 4900
-- ventede på frø ved "Market Price Liquid Fill Station", in-game 30/9). Så AutoDrives opslag, ellers nærmeste
-- ikke-Wait markør inden for 40 m af bygningen ("Liquid Buy Station" står ved tanken, ikke ved triggeren).
local function markerAtStation(adEnv, vehicle, station, placeable)
local okOwn, ownId = pcall(function()
return ADFieldWork.nearestStationMarker(markerList(adEnv), loadTriggerPoints(station), ADFieldWork.STATION_MARKER_M)
end)
if okOwn and ownId ~= nil then return ownId end
local okAd, wayPointId = pcall(function() return adEnv.ADTriggerManager:getMarkerAtStation(station, vehicle, 30) end)
if okAd and wayPointId ~= nil and wayPointId > 0 then return wayPointId end
local node = placeable ~= nil and placeable.rootNode or nil