FS25_SlurryPipeSystem
Version 1.0.0.9
Architecture
- SlurryPipeManager.lua (12,065 lines) split into a core file plus eight domain
modules (SPSM_Chains, SPSM_Couplers, SPSM_Flow, SPSM_Pressure,
SPSM_Consistency, SPSM_Spreader, SPSM_Sprayers, SPSM_IBC). Pure relocation,
mechanically verified byte-identical to V1.0.0.8. - Scripts folder reorganised into domain folders (debug/, chains/, couplers/,
shearBolt/, blockage/, hud/, events/, agitators/, util/, water/,
herbFertSprayer/, manager/, overrides/, settings/). - New central debug registry (scripts/debug/SPSDebugConfig.lua): one named
on/off channel per file, runtime-switchable via thespsDebugconsole
command. All channels ship OFF.
Performance (dedicated servers)
- Vehicle config lookups were loading and parsing vehicle XML from disk on
every call, from per-tick trigger hooks and per-frame discharge gates — the
reported ~45 km/h speed caps and steering lag on busy servers. Both finders
are now cached per configFileName (negatives included). One disk read per
vehicle model per session.
Multiplayer fixes
- Placeable-side hose disconnects are now owner-keyed (the event carries the
placeable), so every machine resolves the exact coupling — fixes "friend
detaches, still attached on my end until he drives off". - Selling a placeable now broadcasts authoritative disconnects for every live
bond before teardown, and duplicate placeable registration (the stale
"ghost pipe" generation on guests) is guarded out. - New placeable detach-handler registry: chains anchored or bonded to a sold
placeable (animal pens, docking stations) are now fully removed with correct
coupler close animations on every machine; sprayer-pipe disconnects on sell
are broadcast; pending queues referencing the sold placeable are purged.
Future placeables (separator etc.) plug into the same registry. - Disconnect events now log an [SPS MP RX] line on receivers.
Sprayer store system (new)
- SPS xml now controls a store's fill types: coupler-declared types are seeded
into the placeable's Storage at load — no map/base xml edits needed
(storageFillTypeControl="store"opts a modder store out). - Per-coupler
capacity="X": same-type couplers sum into that type's storage
capacity; without it the store's own capacity applies. - Dynamic tank compartments:
fillTypes="ANY"(or a category/name list) plus
capacitymakes a coupler one physical tank — it locks to the first liquid
that flows through it and unlocks only when drained empty, then the type
vanishes from the info panel. Works with basegame and script-mod liquids
(SoilFertilizer etc.). Locked compartments persist in the savegame and sync
to clients (event + join dump). - ANY couplers pre-seed the base "sprayer" category so basegame liquids always
show on the store display; aggregate levels self-heal from older saves. - Connecting picks the coupler nearest the PLAYER when several are in reach —
walk to the tank you want. - Sprayer placeable couplings accept
node="..."(i3dMappings, matching the
slurry placeable schema) as well asmountNodeName.
Robustness
- Map mod folders can be renamed freely: bundled Witcombe config match paths
no longer include the folder name, and both placeable register paths bail
cleanly if a path-matched config finds none of its nodes (wrong placeable). - Water manifest matching is case-insensitive, supports title alternatives
(titles="A;B") and opt-in substring matching (titleContains=); player
folder renames never affected it.