Realistic physical slurry pipe system for Farming Simulator 2025.
Replaces vanilla "drive into a trigger and fill" mechanics with a tactile system where you physically connect tanker fill arms or pipe chains, run a PTO-driven pump, build pressure, control flow direction, and watch slurry move through real plumbing — with a slurry that actually thickens, crusts and blocks if you neglect it.
Plumbing & transfer
LIQUIDMANURE and DIGESTATE; transfers
automatically pick whichever fill type is actually present, and mixed deposits merge into
the type already held.Pumps & pressure
vacuum (stored ±bar pressure model with a gauge), HVP high-volume
pump, conduit pump station, and openTop passive vessels (e.g. nurse tanks).cabDirectionConfigIndex). An optional changeover-lever animation
(directionAnimation) shows the handle move, synced in multiplayer.<animations> — rear spreader
valves (spreaderValveAnimation) open and close with the SPS spreader valve, and
coupler clamp/valve animations can be referenced by name
(connectorAnimationName / valveAnimationName) instead of re-authored — poses
restore from savegames and sync to every player automatically.Slurry that behaves like slurry
<extraFillTypeCategory>.Spreading
The supported way to add SPS to your own mod is the embedded path below. You do not edit the SPS mod. Adding files inside the SPS folder is an internal mechanism used only for the fleet SPS ships itself; doing it to add your own content will cause multiplayer issues.
Add a single block to your own vehicle, placeable or map. No SPS-side files, no manifest entry. Players with SPS installed get integration automatically; players without SPS see your mod work normally. Self-contained, with no conflicts against other mods of the same vehicle.
| Your content | Block to add | Where |
|---|---|---|
| Slurry tankers, dribble bars, nurse tanks, pump trailers | <slurryPipeSystem> | inside <vehicle> |
| Fertiliser / herbicide sprayers | <sprayerPipeSystem> | inside <vehicle> |
| Slurry stores, pits, lagoons | <slurryPipeSystem> | inside <placeable> |
| Liquid-fertiliser source tanks | <sprayerPipeSystem> | inside <placeable> |
| Map water sources (lakes/ponds) | an SPS_waterNodes node tree | in the map i3d, under the terrain root |
See the setup guides listed in the documentation map below.
Watch the whole process end to end before (or instead of) reading:
Your vehicle does not have to use a vanilla type name. A custom type declared in your modDesc works as long as it descends from one of the vanilla tanker or sprayer types:
<vehicleTypes>
<type name="myTanker" parent="manureBarrel" className="Vehicle"
filename="$dataS/scripts/vehicles/Vehicle.lua">
<specialization name="waterTrailer"/>
</type>
</vehicleTypes>
SPS walks the parent chain, so any descendant of manureBarrel, manureTrailer,
selfPropelledManureBarrel, sprayer or selfPropelledSprayer — at any depth — receives
the full SPS behaviour. (Added in 1.0.1.4; earlier versions required the exact vanilla
type names.)
Even a type that descends from none of these still works (1.0.1.5+): a vehicle
carrying an embedded <slurryPipeSystem> block receives the tanker behaviour per-vehicle
when it registers, whatever its type — the block in your XML is the authority. Descending from
the matching vanilla family is still recommended (it is what the type means in vanilla,
and other slurry-aware mods may key on it too).
How SPS ships support for its own stock fleet: files inside the SPS folder plus a
spsConfigManifest.xml entry, matched by config path. This requires modifying the SPS mod
and is not a supported way to add your own content — use the embedded path instead.
FS25_SlurryPipeSystem/
├── modDesc.xml
├── SPS_README_01_Tanker_and_Spreader.md ← tanker / dribble-bar setup (embedded)
├── SPS_README_02_Fert_Sprayer.md ← sprayer setup (embedded)
├── SPS_README_03_Placeables.md ← store / pit / source-tank setup (embedded)
├── SPS_README_04_Map_Water.md ← map water sources (embedded, map i3d)
├── SlurryPipeSystem_SlurryGuide.md ← player guide: thickness, crust, mixing, blockages
├── RELEASE_NOTES_V1.0.1.6.md ← changes in this release
├── RELEASE_NOTES_V*.md ← previous releases
│
├── configs/
│ ├── spsConfigManifest.xml ← bundled (SPS-internal) fleet list
│ ├── couplerAnimations.xml ← coupler animation library (shared)
│ ├── spsColors.xml ← pipe colour palette
│ ├── data/ ← stock fleet bundled configs
│ │ ├── vehicles/<vendor>/<model>/{fillPoints.xml, nodeTree.i3d}
│ │ └── placeables/<vendor>/<model>/{fillPoints.xml, nodeTree.i3d}
│ └── mods/ ← third-party fleet bundled configs (internal)
│ └── <FS25_ModFolderName>/...
│
├── water/ ← optional external water nodes (SPS-internal)
│ ├── spsWaterManifest.xml
│ └── <mapFolder>/SPS_waterNodes.i3d
│
├── i3d/ ← SPS visual assets
│ ├── pipes/slurryPipe.i3d ← slurry pipe mesh and rig
│ ├── pipes/sprayerPipe.i3d ← sprayer pipe mesh
│ ├── nodes/spsPivot.i3d ← chain pivot helper
│ └── dockingStation/dockingStation.i3d ← docking station building
│
└── scripts/ ← Lua source
├── init.lua ← entry point (loaded last)
├── debug/
│ └── SPSDebugConfig.lua / SlurryDebug.lua ← channel-gated debug registry + markers
├── manager/
│ ├── SlurryPipeManager.lua ← singleton manager (core)
│ └── SPSM_Chains / SPSM_Couplers / SPSM_Flow / SPSM_Pressure /
│ SPSM_Consistency / SPSM_Stores / SPSM_Spreader / SPSM_Sprayers /
│ SPSM_FrontMount / SPSM_IBC .lua
│ ← domain modules of the manager
├── events/
│ └── SPSEvents.lua ← network events
├── chains/
│ └── SPSPipeChain.lua / SPSChainActivatable.lua
├── couplers/
│ ├── SPSPipeVisual.lua / SPSPipeActivatable.lua / SPSCouplerAnimator.lua
│ └── SPSPumpControlActivatable.lua / SPSOutsideControlActivatable.lua
├── blockage/
│ └── SPSBlockageActivatable.lua / SPSBlockageEvent.lua
├── shearBolt/
│ └── SPSShearBolt.lua / SPSShearBoltActivatable.lua / SPSShearBoltEvent.lua
├── agitators/
│ ├── SlurryAgitatorEvent.lua
│ └── SPSFixedAgitator / SPSFixedAgitatorShaft / SPSFixedAgitatorActivatable /
│ SPSFixedAgitatorEvent .lua ← fixed PTO agitator placeable system
├── separator/
│ └── SPSSeparator.lua / SPSSeparatorActivatable.lua / SPSSeparatorEvent.lua
├── buyStation/
│ └── SPSBuyStationActivatable.lua / SPSBuyStationEvent.lua
├── hud/
│ └── SPSSpreaderHUD.lua ← (+ SPSConduitHUDExtension.lua, source()'d)
├── herbFertSprayer/ ← fertiliser / herbicide sprayer support
│ ├── SPSSprayerPumpControl.lua / SPSSprayerEvents.lua
│ └── SPSSprayerPipeVisual.lua / SPSSprayerPipeActivatable.lua
├── water/
│ └── SPSWaterPlaneManager.lua ← map water detection
├── util/
│ └── SlurryNodeUtil.lua / SlurryTractorCapability.lua / SPSCrustVegetation.lua
├── settings/
│ └── SPSSettingsMenuExtension.lua ← in-game settings page (source()'d late)
└── overrides/
├── ManureBarrelOverride.lua / PlaceableOverride.lua
└── SPSSlurryTankExtensions.lua / SPSChainBondPersistence.lua
| If you want to... | Read / watch this |
|---|---|
| Add SPS to a slurry tanker or dribble bar | SPS_README_01_Tanker_and_Spreader.md · video: vac tanker setup |
| Add SPS to a fertiliser / herbicide sprayer | SPS_README_02_Fert_Sprayer.md |
| Add SPS to a store, pit or liquid source tank | SPS_README_03_Placeables.md · video: placeable setup |
| Add water sources to a map | SPS_README_04_Map_Water.md |
| Understand thickness, crust, mixing and blockages in play | SlurryPipeSystem_SlurryGuide.md |
<slurryPipeSystem> / <sprayerPipeSystem> inside a vehicle or placeable XML are detected
before any manifest lookup. The manifest is only consulted when no embedded block is present.
A third-party retexture of a vehicle can ship its own embedded block and get SPS integration
without affecting other instances of the same base vehicle, and without touching SPS.
Coupler clamp and valve animations are defined in the SPS-bundled
configs/couplerAnimations.xml. A coupling references an animation by integer id
(connectorAnimation / valveAnimation), and SPS resolves that animation's named part nodes
under the coupling's mount node and drives them. To use a shipped animation you name your
clamp/valve sub-objects to match the part names that id expects (the file lists them).
You can also define your own animations without touching SPS: put a
<couplerAnimations> block inside your embedded <slurryPipeSystem> /
<sprayerPipeSystem>, using the same format as the shipped file. Config-local ids are
checked before the shared library, so a local id overrides a shipped one of the same number.
See the placeable guide §7 for the block format.
For the bundled fleet, each manifest entry has a path that must match the tail of the
runtime configFileName Giants reports (stock = data/vehicles/..., mods =
mods/<FS25_ModFolderName>/...). Case-insensitive but otherwise exact — no fuzzy matching.
The bundled fillPoints.xml location is auto-derived from the path (drop the filename,
prepend configs/, append fillPoints.xml), overridable with a configFolder attribute.
Coupling-to-coupling transfers and discharge effects use whatever fill type is present in the source. A nurse tanker carrying digestate piped to a digestate-accepting store works exactly like the liquidmanure equivalent.
Oscar Mods — design, code, art.
Contributions, bug reports, and modder-side embedded integrations welcome.
Lua
100.0%
Realistic physical slurry pipe system for Farming Simulator 2025.
Replaces vanilla "drive into a trigger and fill" mechanics with a tactile system where you physically connect tanker fill arms or pipe chains, run a PTO-driven pump, build pressure, control flow direction, and watch slurry move through real plumbing — with a slurry that actually thickens, crusts and blocks if you neglect it.
Plumbing & transfer
LIQUIDMANURE and DIGESTATE; transfers
automatically pick whichever fill type is actually present, and mixed deposits merge into
the type already held.Pumps & pressure
vacuum (stored ±bar pressure model with a gauge), HVP high-volume
pump, conduit pump station, and openTop passive vessels (e.g. nurse tanks).cabDirectionConfigIndex). An optional changeover-lever animation
(directionAnimation) shows the handle move, synced in multiplayer.<animations> — rear spreader
valves (spreaderValveAnimation) open and close with the SPS spreader valve, and
coupler clamp/valve animations can be referenced by name
(connectorAnimationName / valveAnimationName) instead of re-authored — poses
restore from savegames and sync to every player automatically.Slurry that behaves like slurry
<extraFillTypeCategory>.Spreading
The supported way to add SPS to your own mod is the embedded path below. You do not edit the SPS mod. Adding files inside the SPS folder is an internal mechanism used only for the fleet SPS ships itself; doing it to add your own content will cause multiplayer issues.
Add a single block to your own vehicle, placeable or map. No SPS-side files, no manifest entry. Players with SPS installed get integration automatically; players without SPS see your mod work normally. Self-contained, with no conflicts against other mods of the same vehicle.
| Your content | Block to add | Where |
|---|---|---|
| Slurry tankers, dribble bars, nurse tanks, pump trailers | <slurryPipeSystem> | inside <vehicle> |
| Fertiliser / herbicide sprayers | <sprayerPipeSystem> | inside <vehicle> |
| Slurry stores, pits, lagoons | <slurryPipeSystem> | inside <placeable> |
| Liquid-fertiliser source tanks | <sprayerPipeSystem> | inside <placeable> |
| Map water sources (lakes/ponds) | an SPS_waterNodes node tree | in the map i3d, under the terrain root |
See the setup guides listed in the documentation map below.
Watch the whole process end to end before (or instead of) reading:
Your vehicle does not have to use a vanilla type name. A custom type declared in your modDesc works as long as it descends from one of the vanilla tanker or sprayer types:
<vehicleTypes>
<type name="myTanker" parent="manureBarrel" className="Vehicle"
filename="$dataS/scripts/vehicles/Vehicle.lua">
<specialization name="waterTrailer"/>
</type>
</vehicleTypes>
SPS walks the parent chain, so any descendant of manureBarrel, manureTrailer,
selfPropelledManureBarrel, sprayer or selfPropelledSprayer — at any depth — receives
the full SPS behaviour. (Added in 1.0.1.4; earlier versions required the exact vanilla
type names.)
Even a type that descends from none of these still works (1.0.1.5+): a vehicle
carrying an embedded <slurryPipeSystem> block receives the tanker behaviour per-vehicle
when it registers, whatever its type — the block in your XML is the authority. Descending from
the matching vanilla family is still recommended (it is what the type means in vanilla,
and other slurry-aware mods may key on it too).
How SPS ships support for its own stock fleet: files inside the SPS folder plus a
spsConfigManifest.xml entry, matched by config path. This requires modifying the SPS mod
and is not a supported way to add your own content — use the embedded path instead.
FS25_SlurryPipeSystem/
├── modDesc.xml
├── SPS_README_01_Tanker_and_Spreader.md ← tanker / dribble-bar setup (embedded)
├── SPS_README_02_Fert_Sprayer.md ← sprayer setup (embedded)
├── SPS_README_03_Placeables.md ← store / pit / source-tank setup (embedded)
├── SPS_README_04_Map_Water.md ← map water sources (embedded, map i3d)
├── SlurryPipeSystem_SlurryGuide.md ← player guide: thickness, crust, mixing, blockages
├── RELEASE_NOTES_V1.0.1.6.md ← changes in this release
├── RELEASE_NOTES_V*.md ← previous releases
│
├── configs/
│ ├── spsConfigManifest.xml ← bundled (SPS-internal) fleet list
│ ├── couplerAnimations.xml ← coupler animation library (shared)
│ ├── spsColors.xml ← pipe colour palette
│ ├── data/ ← stock fleet bundled configs
│ │ ├── vehicles/<vendor>/<model>/{fillPoints.xml, nodeTree.i3d}
│ │ └── placeables/<vendor>/<model>/{fillPoints.xml, nodeTree.i3d}
│ └── mods/ ← third-party fleet bundled configs (internal)
│ └── <FS25_ModFolderName>/...
│
├── water/ ← optional external water nodes (SPS-internal)
│ ├── spsWaterManifest.xml
│ └── <mapFolder>/SPS_waterNodes.i3d
│
├── i3d/ ← SPS visual assets
│ ├── pipes/slurryPipe.i3d ← slurry pipe mesh and rig
│ ├── pipes/sprayerPipe.i3d ← sprayer pipe mesh
│ ├── nodes/spsPivot.i3d ← chain pivot helper
│ └── dockingStation/dockingStation.i3d ← docking station building
│
└── scripts/ ← Lua source
├── init.lua ← entry point (loaded last)
├── debug/
│ └── SPSDebugConfig.lua / SlurryDebug.lua ← channel-gated debug registry + markers
├── manager/
│ ├── SlurryPipeManager.lua ← singleton manager (core)
│ └── SPSM_Chains / SPSM_Couplers / SPSM_Flow / SPSM_Pressure /
│ SPSM_Consistency / SPSM_Stores / SPSM_Spreader / SPSM_Sprayers /
│ SPSM_FrontMount / SPSM_IBC .lua
│ ← domain modules of the manager
├── events/
│ └── SPSEvents.lua ← network events
├── chains/
│ └── SPSPipeChain.lua / SPSChainActivatable.lua
├── couplers/
│ ├── SPSPipeVisual.lua / SPSPipeActivatable.lua / SPSCouplerAnimator.lua
│ └── SPSPumpControlActivatable.lua / SPSOutsideControlActivatable.lua
├── blockage/
│ └── SPSBlockageActivatable.lua / SPSBlockageEvent.lua
├── shearBolt/
│ └── SPSShearBolt.lua / SPSShearBoltActivatable.lua / SPSShearBoltEvent.lua
├── agitators/
│ ├── SlurryAgitatorEvent.lua
│ └── SPSFixedAgitator / SPSFixedAgitatorShaft / SPSFixedAgitatorActivatable /
│ SPSFixedAgitatorEvent .lua ← fixed PTO agitator placeable system
├── separator/
│ └── SPSSeparator.lua / SPSSeparatorActivatable.lua / SPSSeparatorEvent.lua
├── buyStation/
│ └── SPSBuyStationActivatable.lua / SPSBuyStationEvent.lua
├── hud/
│ └── SPSSpreaderHUD.lua ← (+ SPSConduitHUDExtension.lua, source()'d)
├── herbFertSprayer/ ← fertiliser / herbicide sprayer support
│ ├── SPSSprayerPumpControl.lua / SPSSprayerEvents.lua
│ └── SPSSprayerPipeVisual.lua / SPSSprayerPipeActivatable.lua
├── water/
│ └── SPSWaterPlaneManager.lua ← map water detection
├── util/
│ └── SlurryNodeUtil.lua / SlurryTractorCapability.lua / SPSCrustVegetation.lua
├── settings/
│ └── SPSSettingsMenuExtension.lua ← in-game settings page (source()'d late)
└── overrides/
├── ManureBarrelOverride.lua / PlaceableOverride.lua
└── SPSSlurryTankExtensions.lua / SPSChainBondPersistence.lua
| If you want to... | Read / watch this |
|---|---|
| Add SPS to a slurry tanker or dribble bar | SPS_README_01_Tanker_and_Spreader.md · video: vac tanker setup |
| Add SPS to a fertiliser / herbicide sprayer | SPS_README_02_Fert_Sprayer.md |
| Add SPS to a store, pit or liquid source tank | SPS_README_03_Placeables.md · video: placeable setup |
| Add water sources to a map | SPS_README_04_Map_Water.md |
| Understand thickness, crust, mixing and blockages in play | SlurryPipeSystem_SlurryGuide.md |
<slurryPipeSystem> / <sprayerPipeSystem> inside a vehicle or placeable XML are detected
before any manifest lookup. The manifest is only consulted when no embedded block is present.
A third-party retexture of a vehicle can ship its own embedded block and get SPS integration
without affecting other instances of the same base vehicle, and without touching SPS.
Coupler clamp and valve animations are defined in the SPS-bundled
configs/couplerAnimations.xml. A coupling references an animation by integer id
(connectorAnimation / valveAnimation), and SPS resolves that animation's named part nodes
under the coupling's mount node and drives them. To use a shipped animation you name your
clamp/valve sub-objects to match the part names that id expects (the file lists them).
You can also define your own animations without touching SPS: put a
<couplerAnimations> block inside your embedded <slurryPipeSystem> /
<sprayerPipeSystem>, using the same format as the shipped file. Config-local ids are
checked before the shared library, so a local id overrides a shipped one of the same number.
See the placeable guide §7 for the block format.
For the bundled fleet, each manifest entry has a path that must match the tail of the
runtime configFileName Giants reports (stock = data/vehicles/..., mods =
mods/<FS25_ModFolderName>/...). Case-insensitive but otherwise exact — no fuzzy matching.
The bundled fillPoints.xml location is auto-derived from the path (drop the filename,
prepend configs/, append fillPoints.xml), overridable with a configFolder attribute.
Coupling-to-coupling transfers and discharge effects use whatever fill type is present in the source. A nurse tanker carrying digestate piped to a digestate-accepting store works exactly like the liquidmanure equivalent.
Oscar Mods — design, code, art.
Contributions, bug reports, and modder-side embedded integrations welcome.
Lua
100.0%