Any Prop.
Any Safe. Any Bench.
rde_props_interact turns any placed rde_props prop into an interactive RP object — a lockable stash with crack mechanics and passcodes, or a crafting station with full recipe systems and minigame skillchecks. Zero modifications to rde_props core, drop-in, drop-out.
Overview
Place a safe → configure it as a lockable stash → players can crack it, enter a passcode, or own it exclusively. Place a table → configure it as a crafting station → assign recipes and skillchecks. No other prop system does this natively for ox_core.
How It Works
- Listens to
AddStateBagChangeHandler('rde_prop_', ...)— detects when rde_props spawns or updates a prop - Checks if that prop has interact data in its own separate DB table
- If yes → attaches options via
ox_target:addLocalEntitydirectly to the same entity — options appear in the same menu as rde_props' Info/Delete - Auto-configure: if the model matches a configured auto-stash or auto-crafting entry, it's configured automatically on placement
Quick Start
ensure oxmysql
ensure ox_core
ensure ox_lib
ensure ox_inventory
ensure ox_target
ensure rde_props
ensure rde_props_interact
Config.PropsStatebagPrefix must exactly match rde_props' own Config.StatebagPrefix (default: rde_prop_ with an underscore).
Stash System
Stash ID is bound to the Prop ID — never to coordinates — so it survives every reload. Auto-stash models configure themselves the moment they're placed.
Config.AutoStashModels = {
['prop_safety_case_01'] = {
slots = 10,
maxWeight = 5000,
lockType = RDE_INTERACT.LOCK.OWNER,
crackDiff = RDE_INTERACT.CRACK.MEDIUM,
},
}
Crafting System
Config.RecipeSets['weed_table'] = {
label = '🌿 Weed Processing Table',
recipes = {
{
id = 'baggy_weed_small',
inputs = { ['dry_cannabis'] = 3, ['empty_baggy'] = 1 },
output = { item = 'baggy_weed_small', count = 1 },
time = 6000,
skillCheck = 'easy',
},
},
}
Lock & Crack System
| Lock Type | Who can open |
|---|---|
| owner | The player whose identifier is stored as owner |
| job / group | Any player with the specified ox_core job/group |
| passcode | Anyone with the correct numeric code |
| Crack Difficulty | Progressbar | Skillchecks |
|---|---|---|
| Easy | 5s | 1 check, large zone |
| Hard | 20s | 3 checks, tight zones |
Developer API
AddEventHandler('rde_interact:sync', function(propId, data)
-- data = { type = 'stash'|'crafting', metadata = {...} }
end)
Common Pitfalls
StateBag prefix mismatch
The root fix in v1.0.5: the addon's internal prefix was rde_prop: (colon) while rde_props actually uses rde_prop_ (underscore) — target options silently never appeared.
Fix: corrected to match exactly. Always verify Config.PropsStatebagPrefix against rde_props' own config.
Options appeared in a separate ox_target menu
Using addBoxZone created a second, separate zone instead of extending the existing one.
Fix (v1.0.5): switched to addLocalEntity — interact options now appear in the same menu as rde_props' own options.
Passcode always says wrong
Passcodes set before v1.0.5 may have been double-hashed.
Fix: delete and re-configure the prop's passcode to reset it cleanly.
FAQ
Does removing this addon break rde_props?
No — rde_props runs exactly as before with zero errors if rde_props_interact is removed.
Where is stash content stored?
ox_inventory stores it under the stash ID rde_prop_{propId} — deleting the prop's interact config doesn't clear the stash contents automatically.
Changelog
Root fix: StateBag prefix corrected to underscore. Switched addBoxZone → addLocalEntity so options share rde_props' menu.
3-stage entity-finding retry, passcode hashing, crack cooldowns, police alert on attempt not just success.