Exports and events

Vehicle cleaned

Listen for this from your own resource to run anything you want when a vehicle is fully cleaned — give a reward, log it, play an effect:

AddEventHandler('PressureWasherV2:VehicleCleaned', function()
    -- the vehicle finished its last stage
end)

How synchronisation works

Worth knowing if you are integrating:

  • Cable attach/detach and spray start/stop are relayed through the server to every client, so other players see the hose, the jet and the foam
  • Vehicle dirt is a native, synced state. The player doing the cleaning drives it and everyone sees the result
  • Van doors are read straight off the vehicle's own door state, so every client agrees on whether a van is open without any syncing of our own
  • On disconnect, a player's spray is stopped and their cable removed for everyone

Money

All money is resolved server-side. The client only ever names which washer it is working from. If you are adding your own payout, do it server-side too and validate against the player's real job.

Custom foam artwork

CustomTexture is off and the stock splatter is what ships. A custom image does work — it was built, shipped and then dropped because it looked worse in game, not because it failed. The findings, kept so nobody rediscovers them:

  • A resource cannot register a new decal type. The IDs live in decals.dat inside common.rpf and no data_file mounter exposes it
  • decals.dat does ship a block of MARKER slots (9100-9123) declared with no diffuse map. Those exist for a script to fill at runtime with PatchDecalDiffuseMap, which is what Rockstar's own mission scripts do
  • It only works on those empty slots. Patching a normal type like 1030 or 1040 does nothing — no error, no change — their texture is baked in and resolved at load
  • Patching is per decal type, not per texture: fxdecal_splatter_mist is shared by blood, mud, paint and water, but patching type 1040 leaves the other three alone
  • Only the diffuse map can be patched; there is no equivalent for the normal, so foam keeps the stock water-splatter normal
  • Avoid 9120-9122 (camera-rotate flag) and 9105/9109/9113/9114 (they do not exist)
  • Each slot holds one texture, so variety means patching several slots
  • A texture patch outlives the resource that made it, so the script un-patches on resource stop — and only once the last foam mark has gone, because a decal samples its texture when it renders

Turning it back on needs the ytd in a stream/ folder, plus CustomTextureDict and a CustomTextureSlots list of { slot, textureName } pairs.

Can't find what you need? Ask on Discord — response in under 5 hours.