Raycast Placement.
Non-Networked Entities.
rde_props is the foundation of the RDE prop ecosystem — mouse-based raycast placement with full X/Y/Z rotation, three speed modes, and real-time StateBag sync. Props spawn as local non-networked entities, so there's no GTA entity-limit overhead even at thousands placed.
Overview
rde_props is the core placement layer of an open prop ecosystem. Pair it with rde_props_interact to turn any placed prop into a lockable stash or crafting station — zero modifications to rde_props core required.
CreateObject with network=false) — no GTA networked entity overhead, no entity limit. Sync happens exclusively via StateBags broadcasting only delta changes.
Why this over generic prop scripts
| Generic Prop Scripts | rde_props |
|---|---|
| Mouse-based placement | Raycast-based |
| 3D rotation (all axes) | X, Y, Z with speed modes |
| Real-time sync | Polling → StateBag, instant |
| Item-based props | ox_inventory integration |
| Stash & crafting layer | Via the rde_props_interact addon |
Quick Start
ensure oxmysql
ensure ox_core
ensure ox_lib
ensure ox_inventory
ensure ox_target
ensure rde_props
The rde_props table auto-creates on first start. Open the placement menu with /props.
Controls
| Action | Key |
|---|---|
| Confirm placement | Left Mouse / ENTER |
| Cancel | Right Mouse / BACKSPACE |
| Rotate Z axis | ← → / Numpad 4/6 |
| Rotate X axis | ↑ ↓ / Arrow Keys |
| Height adjust | Mouse Scroll / Numpad +/- |
| Fast / Precise mode | SHIFT / ALT (hold) |
| Toggle collision | G |
Item Integration
['bench_prop'] = {
label = 'Bench',
weight = 1000,
client = {
prop = 'prop_bench_01a',
event = 'rde_props:placeItemProp',
name = 'Wooden Bench',
}
},
The item is removed when placement starts and returned automatically on cancel. Item-placed props are pickupable by anyone; admin-placed props are permanent.
Developer API
| Event | Side | Notes |
|---|---|---|
| rde_props:reloadProps | Server | Reload all props from database |
| rde_props:deleteProp | Server | Delete a specific prop by ID |
| rde_props:openMenu | Client | Open the prop menu programmatically |
Performance
| Props in World | Client FPS Impact | Sync Overhead |
|---|---|---|
| 500 | <2% | <1ms |
| 2000 | ~3–5% | <2ms |
Keep enableLOD = true and raise updateTickRate on servers with very high prop counts.
Common Pitfalls
collision = false or true logic bomb
A Lua truthiness bug in StartPlacement and placeFromItem meant the collision flag always evaluated true regardless of what was passed.
Fix (v1.0.1): corrected the boolean logic — collision now respects the actual configured value.
Double StateBag + TriggerClientEvent broadcast
toggleCollision and toggleAdmin fired both a StateBag update and a manual TriggerClientEvent for the same data.
Fix (v1.0.1): removed the duplicate manual broadcast — UpdateStatebag() alone is now the single sync path.
FAQ
Do I need rde_props_interact?
No — it's a fully optional addon. rde_props works standalone as a pure placement system.
Can regular players pick up admin-placed props?
No — only item-placed props are pickupable by anyone. Admin-placed props are permanent.
Changelog
Fixed collision logic bomb, fixed double-broadcast in toggleCollision/toggleAdmin, fixed Wait() inside a NetEvent handler.
Complete rewrite — mouse raycast placement, full 3D rotation, speed modes, ox_target integration, StateBag sync.