# Owned Storage Usage Guide
Owned storage covers the `owned:locker` and `owned:garage` extension command
groups. These modules store unlock lists rather than physical item or vehicle
instances.
Use these modules for virtual arsenal and virtual garage unlocks. Use
[Locker Usage Guide](/server-modules/locker) and
[Garage Usage Guide](/server-modules/garage) for physical inventory and stored
vehicle instances.
## Owned Locker Model
```json
{
"items": ["FirstAidKit"],
"weapons": ["arifle_MX_F"],
"magazines": ["30Rnd_65x39_caseless_black_mag"],
"backpacks": ["B_AssaultPack_rgr"]
}
```
Supported owned locker categories:
- `items`
- `weapons`
- `magazines`
- `backpacks`
New owned lockers are created with default unlocks from the Rust model.
## Owned Garage Model
```json
{
"cars": ["B_Quadbike_01_F"],
"armor": [],
"helis": [],
"planes": [],
"naval": [],
"other": []
}
```
Supported owned garage categories:
- `cars`
- `armor`
- `helis`
- `planes`
- `naval`
- `other`
The durable `owned:garage:remove` command currently accepts `heli` for the
helicopter category. Add, get, and hot remove accept `helis`.
New owned garages are created with default unlocks from the Rust model.
## Owned Locker Commands
|
Command
|
Arguments
|
Returns
|
owned:locker:create
|
uid
|
Full owned locker JSON.
|
owned:locker:fetch
|
uid
|
Full owned locker JSON.
|
owned:locker:get
|
uid
,
category
|
Category classname array JSON.
|
owned:locker:add
|
uid
,
category
,
classnames_json
|
Updated category array JSON.
|
owned:locker:remove
|
uid
,
category
,
classname
|
Updated category array JSON.
|
owned:locker:delete
|
uid
|
OK
.
|
owned:locker:exists
|
uid
|
true
or
false
.
|
## Owned Garage Commands
|
Command
|
Arguments
|
Returns
|
owned:garage:create
|
uid
|
Full owned garage JSON.
|
owned:garage:fetch
|
uid
|
Full owned garage JSON.
|
owned:garage:get
|
uid
,
category
|
Category classname array JSON.
|
owned:garage:add
|
uid
,
category
,
classnames_json
|
Updated category array JSON.
|
owned:garage:remove
|
uid
,
category
,
classname
|
Updated category array JSON.
|
owned:garage:delete
|
uid
|
OK
.
|
owned:garage:exists
|
uid
|
true
or
false
.
|
## Add Virtual Arsenal Unlocks
```sqf
private _classes = ["arifle_MX_F", "hgun_P07_F"];
private _result = "forge_server" callExtension ["owned:locker:add", [
getPlayerUID player,
"weapons",
toJSON _classes
]];
```
## Add Virtual Garage Unlocks
```sqf
private _classes = ["B_Quadbike_01_F", "B_MRAP_01_F"];
private _result = "forge_server" callExtension ["owned:garage:add", [
getPlayerUID player,
"cars",
toJSON _classes
]];
```
## Remove an Unlock
```sqf
"forge_server" callExtension ["owned:locker:remove", [
getPlayerUID player,
"weapons",
"arifle_MX_F"
]];
"forge_server" callExtension ["owned:garage:remove", [
getPlayerUID player,
"cars",
"B_Quadbike_01_F"
]];
```
## Hot-State Commands
Both owned storage modules support hot state.
Owned locker:
|
Command
|
Arguments
|
Returns
|
owned:locker:hot:init
|
uid
|
Full owned locker JSON.
|
owned:locker:hot:fetch
|
uid
|
Full owned locker JSON.
|
owned:locker:hot:get
|
uid
,
category
|
Category array JSON.
|
owned:locker:hot:override
|
uid
,
locker_json
|
Full owned locker JSON.
|
owned:locker:hot:save
|
uid
|
Current hot owned locker JSON and async durable save.
|
owned:locker:hot:remove
|
uid
|
OK
.
|
Owned garage:
|
Command
|
Arguments
|
Returns
|
owned:garage:hot:init
|
uid
|
Full owned garage JSON.
|
owned:garage:hot:fetch
|
uid
|
Full owned garage JSON.
|
owned:garage:hot:get
|
uid
,
category
|
Category array JSON.
|
owned:garage:hot:override
|
uid
,
garage_json
|
Full owned garage JSON.
|
owned:garage:hot:add
|
uid
,
category
,
classnames_json
|
Updated category array JSON.
|
owned:garage:hot:remove_item
|
uid
,
category
,
classname
|
Updated category array JSON.
|
owned:garage:hot:save
|
uid
|
Current hot owned garage JSON and async durable save.
|
owned:garage:hot:remove
|
uid
|
OK
.
|
## Error Handling
```sqf
private _payload = _result select 0;
if (_payload find "Error:" == 0) exitWith {
systemChat format ["Owned storage error: %1", _payload];
};
```