65 Interiors.
Zero Void Drops.
rde_ipl is a native GTA interior property system for ox_core — 65 hand-picked IPLs from apartments to the Cayo Perico compound, each guarded by a streaming-safe teleport sequence and a startup coordinate validator so nobody ever falls through the map.
Overview
Every property instance gets its own routing bucket — a private dimension where guests only see who's actually in their instance. Full CRUD, dual money system (ox_inventory item or ox_core bank account), and auto-cleanup for empty instances.
Why this over other IPL/property scripts
| Other IPL Scripts | rde_ipl |
|---|---|
| Teleports you into the void | Streaming-safe teleport: freeze → RequestCollision → settle → unfreeze |
| No interior exit | ox_target sphere zone right where you spawn |
| One global instance, players see each other | Routing buckets — every property is a private dimension |
| Hard-coded coords, no validation | Coord validator on startup + client-side guard |
Quick Start
ensure oxmysql
ensure ox_lib
ensure ox_core
ensure ox_target
ensure ox_inventory -- only if MoneySystem.Source = 'inventory'
ensure rde_nostr_log -- optional
ensure rde_ipl
add_ace group.admin rde.ipl.admin allow
No SQL import needed — tables auto-create. Console prints a startup banner confirming IPL count and any coordinate validation warnings.
Streaming-Safe Teleport
StreamingSafeTeleport() is the only teleport function used anywhere in the resource — never a naked SetEntityCoords. The sequence: freeze the ped → RequestCollisionAtCoord → NewLoadSceneStart → wait for collision to settle → SetEntityCoords → unfreeze.
coords and exitCoords must never be identical — the coord validator warns on startup if they are, and the client refuses to teleport rather than risk a void drop.
Configuration
{
id = 'my_custom_ipl',
name = 'My Custom Location',
price = 500000,
ipl = {'custom_ipl_name'},
coords = vector4(x, y, z, heading), -- interior spawn
exitCoords = vector4(x, y, z, heading), -- exterior exit
maxOccupancy = 8,
blip = { sprite = 374, color = 6, scale = 0.85 },
}
Every entry can override its own blip sprite/color/scale, or set blip = false to hide it entirely.
Nostr Logging
Purchase, sale, enter, exit, admin actions, lock toggles, security violations, and even server startup/shutdown are logged to rde_nostr_log if it's running. Every log call is a no-op if it isn't.
Exports
| Export | Notes |
|---|---|
| GetProperty(instanceId) | Full state for one instance |
| IsPlayerInProperty(source) | Returns inProperty, instanceId |
| EvictPlayer(source) | Force-evict from current instance |
| GetStatistics() | Transaction count, revenue, peak concurrency |
Common Pitfalls
"Property exited" notification appears twice
The server sent the notification directly after removePlayer() AND the client showed it again after the teleport completed — two sources, same message.
Fix (v1.0.1-alpha): removed the redundant server-side notification. The client one is correct — it fires after teleport, not before.
Player spawns underground / falls through the map
Usually an IPL entry with coords near (0,0,0).
Fix: check server console at startup for "⚠ IPL entries have INVALID coords" warnings and correct the vector4 in Config.IPLDatabase.
FAQ
Can I use bank money instead of an inventory item?
Yes — set Config.MoneySystem.Source = 'banking' to use an ox_core bank account instead of an ox_inventory item.
Do other players in the same instance see each other?
Yes, up to maxOccupancy — routing buckets isolate each property instance from every other instance, not from other players inside the same one.
Changelog
Removed duplicate "Property exited" notification — server-side redundant call eliminated.
Initial release — 65 IPLs, routing buckets, streaming-safe teleport, dual money system, Nostr logging.