Mods

A mod is a folder. Put files in it at the paths the game knows, and they are laid over your disc when the game starts. Nothing from the disc goes into a mod, so mods can be shared freely.

What a mod can change

A mod, start to finish

Every mod has a mod.ron that names it and says which mod API it was made for. The game provides API0.57.0; a mod runs on any later version with the same major number.

  1. Lay out the folder

    Use only the parts you need. A texture swap is a single PNG.

    my-taxi/
      mod.ron
      textures/<hash>.png       a texture replaced
      normal/<name>.png         its normal map
      vehicles/cab/             a car: glTF + vehicle.ron
      data/iop/english/1433/0.wav
                                a voice line re-recorded
      scripts/main.luau         a script
  2. Describe it

    Dependencies and conflicts are checked when the game loads. A mod that cannot load is switched off and the log says why.

    (
        id: "my-taxi",
        name: "My taxi",
        version: "1.2.0",
        api_version: "0.57.0",
        description: Some("A cleaner black cab."),
        authors: ["Someone"],
        dependencies: [(id: "hd-textures", version: ">=1.0")],
        scripts: ["main.luau"],
    )
  3. Turn it on

    List it in settings.ron, or in the Mods tab of the options menu. A later mod overrides an earlier one.

    mods: ["hd-textures", "my-taxi"],

Scripts, UI and plugins

Scripts are Luau, the fast, sandboxed Lua that Roblox made. They react to the game, place people, props and markers in the world, run missions, and keep their own saved state. They draw windows in the game's own style and register their own hotkeys.

For heavier work a mod can carry a WebAssembly plugin. Plugins run sandboxed, see only their own folder, and can be called from scripts.

A small speedometer script.
-- scripts/main.luau
local format = require("format")

local since = 0

game.on("enter_vehicle", function(name)
    game.show_text("Driving the " .. name, 2)
    since = 0
end)

game.on("tick", function(dt)
    local v = game.vehicle()
    local p = game.player()
    if not (v and p.in_vehicle) then
        return
    end
    since += dt
    if since >= 5 then
        since = 0
        game.show_text(format.speed(v.speed), 1.5)
    end
end)

Server mods

Multiplayer servers run their own mods: WebAssembly components that hear the server's events and act on its world, in a sandbox with nothing else in it. They speak the same vocabulary as game mods: people, street props, markers and interactions.

A server can send its players the client mods it needs, and large ones come from a mod mirror you can host yourself behind any HTTPS proxy.

London RP

The largest example: a roleplay server where characters keep their money, licences and cars between sessions. Players work shifts driving cabs, buses and ambulances, take their driving tests, race for money and answer to players on police duty.

The HD texture pack

The community's AI-upscaled pack, made for PCSX2, works as it is. Import it once and add"hd-textures" to your mods:

getaway-mods import-pcsx2 <the pack's replacements folder>

Texture mods listed after it override its textures, and a generated-materials mod can add normal and roughness maps on top.