From 63afbba1f8137f2edd1fd4d3919e8fc311540626 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Mon, 21 Sep 2026 00:32:59 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20AD=20Smart=20Pickup=20=E2=80=94=20vare-?= =?UTF-8?q?bevidst=20mappe-rotation=20(mindst=20fyldte=20silo=20f=C3=B8rst?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + FS25_ADSmartPickup/adSmartPickup.lua | 186 +++++++++++++++++++++++++++ FS25_ADSmartPickup/icon.dds | Bin 0 -> 131200 bytes FS25_ADSmartPickup/modDesc.xml | 16 +++ README.md | 12 ++ tests/test_adSmartPickup.lua | 138 ++++++++++++++++++++ 6 files changed, 353 insertions(+) create mode 100644 .gitignore create mode 100644 FS25_ADSmartPickup/adSmartPickup.lua create mode 100644 FS25_ADSmartPickup/icon.dds create mode 100644 FS25_ADSmartPickup/modDesc.xml create mode 100644 README.md create mode 100644 tests/test_adSmartPickup.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4c4ffc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua new file mode 100644 index 0000000..ea7eada --- /dev/null +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -0,0 +1,186 @@ +-- AD Smart Pickup +-- Gør AutoDrives mappe-rotation for pålæsning vare-bevidst: i stedet for +-- "næste markør i mappen" vælges den markør, hvis silo har den valgte vare — +-- og blandt dem den med MINDST i (så rester tømmes først og siloer frigives). +-- Findes ingen silo med varen, bruges AutoDrives originale rotation uændret. + +ADSmartPickup = {} + +-- Markøren er dér hvor trækkerens næse stopper; læssetriggeren ligger et +-- vogntog bagved. Siloer tættere end dette regnes som "markørens silo". +ADSmartPickup.MAX_MARKER_TO_TRIGGER_DISTANCE = 40 +-- Under dette niveau regnes siloen som tom (undgår ture efter støv-rester). +ADSmartPickup.MIN_USEFUL_LITERS = 1 +ADSmartPickup.LOG_PREFIX = "ADSmartPickup: " + +local isHooked = false + +-- Cross-mod adgang: FS25-mods er sandboxede; AutoDrives globals ligger +-- i den globale tabel FS25_AutoDrive (zip-navnet). +local function getAutoDriveEnv() + if FS25_AutoDrive ~= nil and FS25_AutoDrive.ADMultipleTargetsManager ~= nil then + return FS25_AutoDrive + end + return nil +end + +local function getFarmId(vehicle) + if vehicle.getOwnerFarmId ~= nil then + local farmId = vehicle:getOwnerFarmId() + if farmId ~= nil and farmId > 0 then + return farmId + end + end + if vehicle.spec_aiVehicle ~= nil and vehicle.spec_aiVehicle.startedFarmId ~= nil and vehicle.spec_aiVehicle.startedFarmId > 0 then + return vehicle.spec_aiVehicle.startedFarmId + end + return nil +end + +local function getWantedFillTypes(driver) + local wanted = {} + local selected = driver.ad.stateModule:getSelectedFillTypes() + if type(selected) == "table" then + for _, fillType in pairs(selected) do + table.insert(wanted, fillType) + end + end + if #wanted == 0 then + local fillType = driver.ad.stateModule:getFillType() + if fillType ~= nil then + table.insert(wanted, fillType) + end + end + return wanted +end + +local function getDistanceToStation(station, x, z) + local closest = math.huge + for _, loadTrigger in pairs(station.loadTriggers or {}) do + local node = loadTrigger.triggerNode + if node ~= nil and entityExists(node) then + local tx, _, tz = getWorldTranslation(node) + closest = math.min(closest, MathUtil.vector2Length(x - tx, z - tz)) + end + end + return closest +end + +local function getStationAtMarker(wayPoint, farmId) + local bestStation = nil + local bestDistance = ADSmartPickup.MAX_MARKER_TO_TRIGGER_DISTANCE + for _, station in pairs(g_currentMission.storageSystem:getLoadingStations()) do + if g_currentMission.accessHandler:canFarmAccess(farmId, station) then + local distance = getDistanceToStation(station, wayPoint.x, wayPoint.z) + if distance < bestDistance then + bestDistance = distance + bestStation = station + end + end + end + return bestStation +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. +local function getOwnStorageLevel(station, fillTypes) + local placeable = station.owningPlaceable + local storages = placeable ~= nil and placeable.spec_silo ~= nil and placeable.spec_silo.storages or nil + if storages == nil then + return 0 + end + local total = 0 + for _, storage in pairs(storages) do + for _, fillType in ipairs(fillTypes) do + total = total + (storage:getFillLevel(fillType) or 0) + end + end + return total +end + +-- Returnerer niveau + om det er siloens eget lager (true) eller kun nabo-lagre (false). +local function getStationFillLevel(station, fillTypes, farmId) + local ownLevel = getOwnStorageLevel(station, fillTypes) + if ownLevel >= ADSmartPickup.MIN_USEFUL_LITERS then + return ownLevel, true + end + -- intet i eget lager: stationen kan stadig læsse fra nabo-lagre + local total = 0 + for _, fillType in ipairs(fillTypes) do + total = total + (station:getFillLevel(fillType, farmId) or 0) + end + return total, false +end + +-- Returnerer markerIndex for mappens mindst fyldte silo der har varen, ellers nil. +function ADSmartPickup.findLeastFilledPickup(adEnv, driver) + local firstMarker = driver.ad.stateModule:getFirstMarker() + if firstMarker == nil or firstMarker.group == nil or firstMarker.group == "All" then + return nil + end + local farmId = getFarmId(driver) + local fillTypes = getWantedFillTypes(driver) + if farmId == nil or #fillTypes == 0 then + return nil + end + + -- siloer med varen i EGET lager går altid forud for dem der kun kan låne fra naboer + local best = {[true] = {level = math.huge}, [false] = {level = math.huge}} + for _, marker in ipairs(adEnv.ADGraphManager:getMapMarkersInGroup(firstMarker.group)) do + local wayPoint = adEnv.ADGraphManager:getWayPointById(marker.id) + local station = wayPoint ~= nil and getStationAtMarker(wayPoint, farmId) or nil + if station ~= nil then + local level, isOwn = getStationFillLevel(station, fillTypes, farmId) + if level >= ADSmartPickup.MIN_USEFUL_LITERS and level < best[isOwn].level then + best[isOwn] = {level = level, marker = marker} + end + end + end + + local choice = best[true].marker ~= nil and best[true] or best[false] + if choice.marker == nil then + return nil + end + return choice.marker.markerIndex, choice.marker.name, choice.level +end + +local function installHook(adEnv) + local manager = adEnv.ADMultipleTargetsManager + local originalGetNextPickup = manager.getNextPickup + + manager.getNextPickup = function(self, driver, forcedSkip) + local ok, markerIndex, markerName, level = pcall(ADSmartPickup.findLeastFilledPickup, adEnv, driver) + if not ok then + Logging.warning(ADSmartPickup.LOG_PREFIX .. "fejl i silo-opslag, bruger AutoDrives rotation: %s", tostring(markerIndex)) + return originalGetNextPickup(self, driver, forcedSkip) + end + if markerIndex == nil then + return originalGetNextPickup(self, driver, forcedSkip) + end + + -- hold AutoDrives egen rotations-tilstand konsistent med vores valg + local groupName = driver.ad.stateModule:getFirstMarker().group + self.pickups[groupName] = self.pickups[groupName] or {} + self.pickups[groupName].lastTarget = markerIndex + self.pickups[groupName].lastVehicle = driver + + Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' -> %s (%.0f l)", tostring(driver:getName()), tostring(markerName), level) + return markerIndex + end + + Logging.info(ADSmartPickup.LOG_PREFIX .. "aktiv (mindst fyldte silo med varen vælges i mappe-rotation)") +end + +function ADSmartPickup:update(dt) + if isHooked then + return + end + local adEnv = getAutoDriveEnv() + if adEnv ~= nil and g_currentMission ~= nil and g_currentMission.storageSystem ~= nil then + installHook(adEnv) + isHooked = true + end +end + +addModEventListener(ADSmartPickup) diff --git a/FS25_ADSmartPickup/icon.dds b/FS25_ADSmartPickup/icon.dds new file mode 100644 index 0000000000000000000000000000000000000000..217412e1904ee48b2ec976491e31755fbf238dc0 GIT binary patch literal 131200 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%0DTcTpn#4{bsJ#E;fQ73 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

?td@6BR1rIv3t408Qlr~PVdf2(2=!x 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 Q0S3lJ#S#tl9_wVme}t1!OaK4? literal 0 HcmV?d00001 diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml new file mode 100644 index 0000000..a052179 --- /dev/null +++ b/FS25_ADSmartPickup/modDesc.xml @@ -0,0 +1,16 @@ + + + masterdraco + 1.0.0.0 + + <en>AD Smart Pickup</en> + + + + + icon.dds + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..f639817 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# FS25_ADSmartPickup + +AutoDrive-tillæg til Farming Simulator 25: når pålæsningsmål roteres i en AD-mappe, køres der +direkte til den silo i mappen, der har den valgte vare — **mindst fyldte først** — i stedet for +at prøve markørerne én efter én. + +- Wrapper `ADMultipleTargetsManager.getNextPickup` (via den globale `FS25_AutoDrive`-tabel); rører ikke AutoDrive-zip'en. +- Siloens eget lager rangeres før nabo-lån (udvidelses-siloer deler lager inden for `storageRadius`). +- Finder den ingen silo med varen, eller fejler et spil-API, bruges AutoDrives originale rotation. +- Kræver i AutoDrive: "Brug mapper" + "Rotér mål: pålæsning" på køretøjet. + +Test: `luajit tests/test_adSmartPickup.lua` · Byg: zip indholdet af `FS25_ADSmartPickup/` til `FS25_ADSmartPickup.zip`. diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua new file mode 100644 index 0000000..d0b13ac --- /dev/null +++ b/tests/test_adSmartPickup.lua @@ -0,0 +1,138 @@ +-- Kør: luajit tests/test_adSmartPickup.lua (fra repo-roden) +-- Mock'er de få FS25-/AutoDrive-API'er moden rører og tester valg-logikken. + +local SUGARBEET, WHEAT = 10, 11 +local logLines = {} + +-- ---- FS25-mocks ---- +MathUtil = {vector2Length = function(x, z) return math.sqrt(x * x + z * z) end} +Logging = { + info = function(fmt, ...) table.insert(logLines, string.format(fmt, ...)) end, + warning = function(fmt, ...) table.insert(logLines, "WARN " .. string.format(fmt, ...)) end, +} +local nodePositions = {} +function entityExists(node) return nodePositions[node] ~= nil end +function getWorldTranslation(node) local p = nodePositions[node]; return p.x, 0, p.z end +local listener +function addModEventListener(l) listener = l end + +local function makeStation(node, x, z, levels, isBroken, ownLevels) + nodePositions[node] = {x = x, z = z} + local placeable = ownLevels ~= nil and {spec_silo = {storages = { + {getFillLevel = function(_, fillType) return ownLevels[fillType] or 0 end}, + }}} or nil + return { + owningPlaceable = placeable, + loadTriggers = {{triggerNode = node}}, + getFillLevel = function(_, fillType) + if isBroken then error("boom") end + return levels[fillType] or 0 + end, + } +end + +local stations = {} +g_currentMission = { + storageSystem = {getLoadingStations = function() return stations end}, + accessHandler = {canFarmAccess = function() return true end}, +} + +-- ---- AutoDrive-mocks ---- +local markers, wayPoints = {}, {} +local function addMarker(index, name, group, x, z) + wayPoints[index] = {x = x, z = z} + table.insert(markers, {id = index, markerIndex = index, name = name, group = group}) +end + +local function resetWorld() + stations, markers, wayPoints, nodePositions, logLines = {}, {}, {}, {}, {} + FS25_AutoDrive.ADMultipleTargetsManager.pickups = {} +end + +FS25_AutoDrive = { + ADMultipleTargetsManager = {pickups = {}, getNextPickup = function() return "ORIGINAL" end}, + ADGraphManager = { + getMapMarkersInGroup = function(_, group) + local result = {} + for _, m in ipairs(markers) do if m.group == group then table.insert(result, m) end end + return result + end, + getWayPointById = function(_, id) return wayPoints[id] end, + }, +} + +local function makeDriver(firstMarker, fillTypes) + return { + getName = function() return "Testtraktor" end, + getOwnerFarmId = function() return 1 end, + ad = {stateModule = { + getFirstMarker = function() return firstMarker end, + getSelectedFillTypes = function() return fillTypes end, + getFillType = function() return fillTypes[1] end, + }}, + } +end + +dofile("FS25_ADSmartPickup/adSmartPickup.lua") +listener:update(16) -- installerer hook'en +local manager = FS25_AutoDrive.ADMultipleTargetsManager + +local failures = 0 +local function check(name, actual, expected) + if actual == expected then + print("OK " .. name) + else + failures = failures + 1 + print(string.format("FAIL %s: forventede %s, fik %s", name, tostring(expected), tostring(actual))) + end +end + +-- 1: vælger mindst fyldte silo med varen; springer tomme og forkert vare over +resetWorld() +addMarker(1, "Silo 1", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 900000})) +addMarker(2, "Silo 2", "Siloer", 500, 0); table.insert(stations, makeStation(102, 500, 15, {[SUGARBEET] = 800000})) +addMarker(3, "Silo 3", "Siloer", 1000, 0); table.insert(stations, makeStation(103, 1000, 15, {[SUGARBEET] = 12000})) +addMarker(4, "Silo 4", "Siloer", 1500, 0); table.insert(stations, makeStation(104, 1500, 15, {[SUGARBEET] = 0})) +addMarker(5, "Fabrik", "Andet", 1000, 5); -- anden mappe, skal ignoreres +check("mindst fyldte med varen vælges", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET}), false), 3) +check("AD-rotationstilstand opdateret", manager.pickups["Siloer"].lastTarget, 3) + +-- 2: ingen silo har varen -> AutoDrives originale rotation +check("fallback når varen ikke findes", manager:getNextPickup(makeDriver(markers[1], {99}), false), "ORIGINAL") + +-- 3: markør uden silo i nærheden ignoreres +resetWorld() +addMarker(1, "Langt væk", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 200, {[SUGARBEET] = 5})) +addMarker(2, "Silo 2", "Siloer", 500, 0); table.insert(stations, makeStation(102, 500, 15, {[SUGARBEET] = 700})) +check("markør uden nær silo ignoreres", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET}), false), 2) + +-- 4: flere valgte varer lægges sammen +resetWorld() +addMarker(1, "Silo 1", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[SUGARBEET] = 100, [WHEAT] = 5000})) +addMarker(2, "Silo 2", "Siloer", 500, 0); table.insert(stations, makeStation(102, 500, 15, {[SUGARBEET] = 3000})) +check("flere varetyper summeres", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET, WHEAT}), false), 2) + +-- 4b: klynge med delt lager — eget indhold slår nabo-sum, også når nabo-summen er mindre +resetWorld() +addMarker(1, "Nabo", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[SUGARBEET] = 800}, false, {})) +addMarker(2, "Ejer stor", "Siloer", 14, 0); table.insert(stations, makeStation(102, 14, 15, {[SUGARBEET] = 900000}, false, {[SUGARBEET] = 500000})) +addMarker(3, "Ejer lille", "Siloer", 28, 0);table.insert(stations, makeStation(103, 28, 15, {[SUGARBEET] = 900000}, false, {[SUGARBEET] = 20000})) +check("eget lager foran nabo-lån, mindst først", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET}), false), 3) + +-- 4c: kun nabo-lån muligt -> bruges stadig +resetWorld() +addMarker(1, "Nabo", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[SUGARBEET] = 800}, false, {})) +check("nabo-lån bruges når ingen ejer varen", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET}), false), 1) + +-- 5: fejl i spil-API -> fallback + advarsel, aldrig crash +resetWorld() +addMarker(1, "Silo 1", "Siloer", 0, 0); table.insert(stations, makeStation(101, 0, 15, {}, true)) +check("fejl giver fallback", manager:getNextPickup(makeDriver(markers[1], {SUGARBEET}), false), "ORIGINAL") +check("fejl logges som advarsel", logLines[#logLines]:sub(1, 4), "WARN") + +-- 6: gruppen "All" og manglende første markør røres ikke +check("gruppe All -> fallback", manager:getNextPickup(makeDriver({group = "All", markerIndex = 1}, {SUGARBEET}), false), "ORIGINAL") +check("ingen første markør -> fallback", manager:getNextPickup(makeDriver(nil, {SUGARBEET}), false), "ORIGINAL") + +print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) +os.exit(failures == 0 and 0 or 1)