# Creating & Using Containers

Containers are shared, slot-based inventories that can be created dynamically or pre-defined for vehicles, world drops, fridges, etc. They support the same clean method API as player inventories.

***

## Creating a Container

Use the `create_container` export **from the server** to create any container:

```lua
local data, err = exports.list_inventory:create_container("world", "fridge", {
    owner = "house_7",
    coords = vector3(123.4, 456.7, 789.0),
    persist = true
})
```

#### Params

| Name       | Type     | Description                                  |
| ---------- | -------- | -------------------------------------------- |
| `category` | `string` | Logical group (`world`, `vehicle`, etc.)     |
| `subtype`  | `string` | Container type (`fridge`, `drop`, etc.)      |
| `options`  | `table`  | Metadata: `owner`, `coords`, `persist`, etc. |

***

## Getting a Container

Use `get_container(id)` to retrieve an active container object:

```lua
local container = exports.list_inventory:get_container("trunk:ABC123")
if not container then return end
```

Once retrieved, you can use any container method:

```lua
container:add_item("bandage", 2)
```

***

## Container Methods

All container objects support these public methods:

* `add_item(id, amount, metadata)`
* `remove_item(lookup, amount)`
* `split_item(slot, amount)`
* `get_items()` / `get_item(lookup)`
* `has_item(lookup, amount)`
* `clear_items()`
* `save()` / `sync()`
* `get_data(key)` / `set_data(key, value)`

***

## Default Container Types

Container types and defaults are defined in `data/containers.lua`. You can modify these or add your own.

#### Vehicles

| Type       | Default Slots | Category  |
| ---------- | ------------- | --------- |
| `trunk`    | 100           | `vehicle` |
| `glovebox` | 10            | `vehicle` |
| `trailer`  | 120           | `vehicle` |

#### Loot & Drops

| Type      | Default Slots | Category | Extras                    |
| --------- | ------------- | -------- | ------------------------- |
| `drop`    | 200           | `loot`   | Bag prop, outlines red    |
| `airdrop` | 50            | `loot`   | Crate prop, outlines blue |

#### Storage Containers

| Type          | Default Slots | Category  | Notes                       |
| ------------- | ------------- | --------- | --------------------------- |
| `desk_fridge` | 5             | `storage` | quality\_preservation = 1.5 |
| `mini_fridge` | 40            | `storage` | quality\_preservation = 2.0 |
| `fridge`      | 40            | `storage` | prevent\_spoil = true       |

You can define props, outline styles, and special logic like spoilage blocking or preservation multipliers.

***

## Temporary Drops

Drop containers (category `loot`, subtype `drop`) are temporary. When emptied, they are:

* Deleted from server memory
* Removed from the client UI

These are handled internally when a player drops an item however you could make one if you want too, why not? Who said you cant.

```lua
local coords = GetEntityCoords(GetPlayerPed(source))
exports.list_inventory:create_container("loot", "drop", {
    owner = "drop_" .. source,
    coords = coords,
    persist = false
})
```

***

## Notes

* Containers use **slot limits**, not weights
* Some types (like fridges) can prevent degradation or slow it if enabled
* If a persistent container already exists for an `owner`, it will be loaded instead of recreated
* You can define **your own** container types freely, provided ones are purely example

Stay slotted, stay chill.™
