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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user