> For the complete documentation index, see [llms.txt](https://visionstore.gitbook.io/visionstore-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://visionstore.gitbook.io/visionstore-docs/scripts/crafting/configuration/models.md).

# Bench props and the screen

Add a new bench prop and line up the 3D screen with /craftingcalibrate (advanced).

`config/models.lua` decides which prop each bench uses and **where the crafting screen sits on it**. You only need it to add a new bench prop or to fine-tune the screen on an existing one.

## Included props

| Key          | Prop                     | Notes                                                                     |
| ------------ | ------------------------ | ------------------------------------------------------------------------- |
| `default`    | `xm3_prop_xm3_bench_04b` | Workbench (Mercenaries DLC, game build 2944+). Used by the Weapons Bench. |
| `workbench2` | `gr_prop_gr_bench_04a`   | Gunsmith workbench (base game). Used by the Tools Bench.                  |
| `tool_bench` | `prop_tool_bench02_ld`   | Tool bench.                                                               |
| `lab_desk`   | `xm_prop_lab_desk_02`    | Lab desk.                                                                 |
| `med_bench`  | `v_med_bench2`           | Medical bench. Used by the Medical Bench.                                 |
| `counter`    | `prop_ff_counter_01`     | Service counter.                                                          |
| `none`       | no prop                  | For a bench that's part of an MLO. Static benches only.                   |

```lua
Config.FallbackModel = 'workbench2'
```

When a prop isn't in a player's game files (for example the default bench on a build older than 2944), the fallback prop is used instead.

## Add a new bench prop

{% stepper %}
{% step %}

### Add an entry

Copy an existing entry in `Config.Models` and give it a new key and model:

```lua
my_bench = {
    model = `prop_my_bench`,
    label = 'My Bench',

    dui = {
        offset   = vec3(-0.05, 0.0, 0.805),
        rotation = vec3(-90.0, 0.0, 0.0), -- lying flat on the bench
        width    = 1.30,
        height   = 0.73125,
        scale    = 1.0,
    },

    camera = {
        offset = vec3(-0.050, -0.580, 2.300),
        target = vec3(-0.040, 0.000, 1.010),
        fov    = 42.0,
    },

    player = {
        offset          = vec3(0.0, -0.85, 0.0),
        heading         = 0.0,
        clearanceRadius = 0.45,
    },

    spotlight = {
        enabled   = true,
        offset    = vec3(0.0, -0.35, 1.85),
        colour    = { 255, 240, 200 },
        range     = 4.0,
        intensity = 2.0,
    },

    placement = {
        groundOffset     = 0.0,
        collisionPadding = 0.05,
        clearance        = 0.15,
    },
},
```

Every offset is **relative to the prop**: +x right, +y forward (away from the player), +z up.

| Block         | What it sets                                                          |
| ------------- | --------------------------------------------------------------------- |
| `dui`         | The crafting screen: offset, rotation, size in metres.                |
| `idle`        | Optional: the small "\[E] Use workbench" banner. Falls back to `dui`. |
| `camera`      | Where the camera sits and what it looks at.                           |
| `player`      | Where the player stands while crafting.                               |
| `spotlight`   | A light over the bench so the screen is readable at night.            |
| `placement`   | Ground offset and collision padding for portable placement.           |
| {% endstep %} |                                                                       |

{% step %}

### Use it on a bench type

In `config/benches.lua`, set `model = 'my_bench'` and restart.
{% endstep %}

{% step %}

### Calibrate it in game

Place the bench, stand at it and run **`/craftingcalibrate`** (staff only):

| Key                 | Action                                  |
| ------------------- | --------------------------------------- |
| Arrow keys          | Adjust the selected value               |
| `[` / `]`           | Previous / next field                   |
| Page Up / Page Down | Switch group (screen / camera / player) |
| Shift / Ctrl        | Bigger / finer steps                    |
| **Enter**           | Print the config block                  |
| Backspace           | Reset to the config values              |
| X                   | Exit                                    |

Press **Enter**, copy the printed block from the F8 console and paste it into your entry in `config/models.lua`.
{% endstep %}
{% endstepper %}

## Screen fixes

If the screen renders mirrored or upside down on a custom prop, flip the axis (globally here, or per model in `Config.Models.<key>.dui.axis`):

```lua
Config.RendererAxis = {
    flipU        = false, -- clicks mirror left/right
    flipV        = false, -- UI upside down / clicks mirror top/bottom
    invertNormal = false, -- panel only visible from behind
}
```

The black sheet behind the screen can be sized in game with **`/craftingbackdrop <metresX> <metresY>`** (run it without numbers to print the current size).

## Idle banners

Benches you're near but not using show a small banner:

```lua
Config.Idle = {
    enabled   = true,
    maxPanels = 3,      -- the nearest benches win
    width     = 512,
    height    = 256,
    backdropX = 1.775,
    backdropY = 1.52,
    distance  = 8.0,    -- stop drawing banners beyond this distance
}
```

## Crafting animation

```lua
Config.BenchAnim = {
    dict   = 'anim@amb@board_room@diagram_blueprints@',
    name   = 'idle_01_amy_skater_01',
    flag   = 1, -- looped
    offset = vec3(-0.85, 0.0, 0.25), -- stand spot when a model has no player.offset
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://visionstore.gitbook.io/visionstore-docs/scripts/crafting/configuration/models.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
