feat: autoload-bil løsner stropperne 25 m før aflæsningsmålet (ladet passerer triggeren før markøren) (v1.12.11.0)

This commit is contained in:
2026-09-23 15:02:32 +02:00
parent a6e17d4f36
commit 0d1e82983a
3 changed files with 87 additions and 1 deletions
+53
View File
@@ -25,6 +25,10 @@ ADOutbound.NOTIFICATION_MS = 8000
-- spawnet, forkert farm, ...): kilden udelukkes for varen i EMPTY_SOURCE_TTL_MS og turen afsluttes.
ADOutbound.EMPTY_SOURCE_MS = 30000
ADOutbound.EMPTY_SOURCE_TTL_MS = 300000
-- Autoload-bil på vej til aflæsning: stropperne løsnes så mange meter FØR markøren. Markøren står
-- hvor næsen stopper, og en lastbils lad har passeret salgstriggeren dér; AutoDrive løsner selv
-- først ved markøren ("AL unload = center"), hvilket er for sent for en lastbil.
ADOutbound.UNSTRAP_BEFORE_M = 25
-- køretøj -> {run, trip, sources, queue, visited, current, lastFill, noProgressMs, spawn, done}
local trips = setmetatable({}, {__mode = "k"})
@@ -570,6 +574,43 @@ function ADOutbound.beforeLoadUpdate(adEnv, task, dt)
return false
end
local function distanceToWayPoint(adEnv, vehicle, wayPointId)
local wayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId)
if wayPoint == nil or vehicle.rootNode == nil then
return nil
end
local x, _, z = getWorldTranslation(vehicle.rootNode)
local dx, dz = wayPoint.x - x, wayPoint.z - z
return math.sqrt(dx * dx + dz * dz)
end
-- Aflæsningskørsel (UnloadAtDestinationTask.update): autoload-bil med tur -> stropper af
-- UNSTRAP_BEFORE_M før målet, én gang pr. tur. Ændrer aldrig opgaven (returnerer altid false).
function ADOutbound.beforeUnloadUpdate(adEnv, task, dt)
local vehicle = task.vehicle
local state = trips[vehicle]
if state == nil or state.unstrapped or task.destinationID ~= state.trip.targetWayPointId then
return false
end
local _, hasAutoload = getVehicleCapacity(adEnv, vehicle)
if not hasAutoload then
state.unstrapped = true
return false
end
local distance = distanceToWayPoint(adEnv, vehicle, task.destinationID)
if distance == nil or distance > ADOutbound.UNSTRAP_BEFORE_M then
return false
end
state.unstrapped = true
for _, unit in ipairs(task.trailers or {}) do
if unit.setAllTensionBeltsActive ~= nil then
pcall(unit.setAllTensionBeltsActive, unit, false, false)
end
end
Logging.info(ADOutbound.LOG_PREFIX .. "'%s': stropper løsnet %.0f m før %s", tostring(vehicle:getName()), distance, tostring(state.trip.targetName))
return false
end
-- true = opsamlingsrunden fortsætter til næste kilde (original finished springes over).
function ADOutbound.beforeLoadFinished(adEnv, task)
local vehicle = task.vehicle
@@ -661,4 +702,16 @@ function ADOutbound.install(adEnv)
return originalFinished(self)
end
end
local unloadTask = adEnv.UnloadAtDestinationTask
if unloadTask ~= nil and unloadTask.update ~= nil then
local originalUnloadUpdate = unloadTask.update
unloadTask.update = function(self, dt)
local okUnload, err = pcall(ADOutbound.beforeUnloadUpdate, adEnv, self, dt)
if not okUnload then
Logging.warning(ADOutbound.LOG_PREFIX .. "fejl ved strop-løsning, AutoDrive fortsætter selv: %s", tostring(err))
end
return originalUnloadUpdate(self, dt)
end
end
end
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.12.10.0</version>
<version>1.12.11.0</version>
<title>
<en>AD Smart Pickup</en>
</title>