> For the complete documentation index, see [llms.txt](https://rtx-dev.gitbook.io/rtxdev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rtx-dev.gitbook.io/rtxdev/rtx-housing-system/guides/how-to-add-new-furniture.md).

# How to add new Furniture

This guide explains how to add **new furniture** to RTX Housing System.

Furniture configuration is located in:

```
configs/furniture.lua
```

You will usually update up to 3 sections:

* `Config.Furnitures` (categories + subcategories + object lists)
* `Config.FurnitureData` (price + interactable settings per object)
* `Config.StealableObjects` (optional, robbery mode)

{% stepper %}
{% step %}

### Add furniture to the menu (Config.Furnitures)

`Config.Furnitures` is the menu structure:

* Category (example: `bedroom`, `kitchen`)
* Subcategory (example: `beds`, `wardrobes`)
* Objects (list of spawnable props)

Category structure:

* `label` → name shown in UI
* `icon` → FontAwesome icon (example: `fa-bed`)
* `id` → **unique number** (also the **order** in the menu)
* `subcategory` → table of subcategories

{% hint style="info" %}
ID rules:

* `id` must be **unique**
* `id` controls the **display order** (1 = first category, 2 = second, ...)
  {% endhint %}

Subcategory structure:

* `label` → name shown in UI
* `objects` → list of furniture objects

{% hint style="info" %}
Key rules:

* Category key (example `["bedroom"]`) must be **unique**
* Subcategory key (example `["beds"]`) must be **unique inside the category**
* Use **object model names**, not hashes
  {% endhint %}

<details>

<summary><strong>Example: Category + Subcategories (click to expand)</strong></summary>

```lua
Config.Furnitures = {
    ["bedroom"] = {
        label = "Bedroom",
        icon = "fa-bed",
        id = 1, -- MUST be unique + menu order
        subcategory = {
            ["beds"] = {
                label = "Beds",
                objects = {
                    {object = "hei_heist_bed_double_08"},
                    {object = "v_res_tt_bed"},
                    {object = "apa_mp_h_yacht_bed_01"},
                },
            },
            ["wardrobes"] = {
                label = "Wardrobes",
                objects = {
                    {object = "v_res_m_armoire"},
                    {object = "v_res_m_armoirmove"},
                },
            },
        },
    },
}
```

</details>
{% endstep %}

{% step %}

### Create a NEW category

To create a new category:

* Choose a **unique key** (example: `office`)
* Choose a new **unique `id`** (example: next number after your last category)
* Add subcategories

<details>

<summary><strong>Example: New category "Office" (click to expand)</strong></summary>

```lua
["office"] = {
    label = "Office",
    icon = "fa-briefcase",
    id = 10, -- unique + order
    subcategory = {
        ["desks"] = {
            label = "Desks",
            objects = {
                {object = "v_res_mddesk"},
                {object = "xm_prop_x17_desk_01a"},
            },
        },
        ["chairs"] = {
            label = "Office Chairs",
            objects = {
                {object = "prop_off_chair_04b"},
                {object = "prop_off_chair_05"},
            },
        },
    },
},
```

</details>
{% endstep %}

{% step %}

### Add furniture into an existing subcategory

To add a new prop into an existing subcategory, add a new object entry.

✅ Use model name:

```lua
{object = "prop_tv_stand_01"},
```

❌ Do NOT use hash:

```lua
{object = 123456789}
```

{% endstep %}

{% step %}

### Add furniture settings (Config.FurnitureData)

`Config.FurnitureData` controls:

* `price`
* whether the object is `interactable`
* what `interactabletype` it is
* what text is shown for interaction (`interactabletext`)

Interactable types:

* `storage`
* `sink`
* `wardrobe`
* `safe`
* `camera`
* `solar`
* `bathtub`
* `kitchen`

{% hint style="info" %}
Index rule: The index/key in `Config.FurnitureData` is the **object model name**.
{% endhint %}

<details>

<summary><strong>Example: FurnitureData entry (click to expand)</strong></summary>

```lua
Config.FurnitureData = {
    ["prop_tv_stand_01"] = {
        price = 250,
        interactable = false,
    },

    ["v_res_m_armoire"] = {
        price = 500,
        interactable = true,
        interactabletype = "wardrobe",
        interactabletext = "Open Wardrobe",
    },

    ["prop_ld_int_safe_01"] = {
        price = 1500,
        interactable = true,
        interactabletype = "safe",
        interactabletext = "Open Safe",
    },
}
```

</details>

Tips:

* If the object is **not interactable**, set:
  * `interactable = false`
* If it is interactable, choose a valid `interactabletype` and set a short UI text.
  {% endstep %}

{% step %}

### Make furniture stealable (Robbery Mode)

To make an object stealable, add it to:

```lua
Config.StealableObjects
```

{% hint style="info" %}
Index rule: The index/key is the **object model name**.
{% endhint %}

Fields:

* `sellprice` → money player gets after selling
* `inhand` → if true, object is carried in hand when stolen

<details>

<summary><strong>Example: StealableObjects entry (click to expand)</strong></summary>

```lua
Config.StealableObjects = {
    ["prop_tv_stand_01"] = {sellprice = 200, inhand = true},
    ["v_res_m_armoire"] = {sellprice = 350, inhand = false},
}
```

</details>
{% endstep %}

{% step %}

### Restart & test

Restart the resource:

```
restart rtx_housing
```

1. Enter a property and open the furniture menu
2. Verify:

* category order is correct (by `id`)
* furniture spawns properly
* interactables work (wardrobe/storage/safe etc.)
* stealable objects work in robbery mode (if enabled)
  {% endstep %}
  {% endstepper %}

{% hint style="warning" %}
Common mistakes:

* Duplicate category `id` (menu order breaks)
* Duplicate keys (category/subcategory overrides previous one)
* Using an object name that does not exist (prop won’t spawn)
* Using hash instead of model name
* Forgetting to add `Config.FurnitureData` entry (price/interactions missing)
  {% endhint %}

### How to add furniture images

Furniture images are stored in:

`rtx_housing/html/img/furnitures`

You have two options:

#### 1) Add image manually

* Add `.webp` image with the same name as the object
* Example:

```
prop_tv_stand_01.webp
```

***

#### 2) Use in-game screenshot tool (recommended)

Enable in config:

```lua
Config.FurnitureSystem = {
	screenshot = true, -- DEV ONLY
}
```

#### Commands

* Generate all furniture images:

```
/furnscreenall
```

* Generate single furniture image:

```
/furnscreen objectname
```

Example:

```
/furnscreen prop_tv_stand_01
```

{% hint style="warning" %}
Warning

* Generated images are saved to: `rtx_housing/images` Move them into: `rtx_housing/html/img/furnitures`
* Screenshot tool is for development only. Disable it on live server.
  {% endhint %}

## Need help?

If you want, **we can add the furniture for you** (category + data + robbery).\
Contact us on Discord: <https://discord.gg/rtxdev>
