π RDE IPL | Native GTA Interior Property System for FiveM ox_core | Void-Proof Teleports | Routing Buckets | Nostr-Logged | 65 IPLs | Production-Ready
Built by Red Dragon Elite | Free Forever | No Paywalls | No Legacy
π Installation β’ βοΈ Configuration β’ π¬ Commands β’ π Nostr Logging β’ π‘ Exports β’ π Troubleshooting β’ π Website β’ π Terminal
If you're on v1.0.0-alpha and your players saw a double "Property exited" notification every time they left a property β this is the fix. The server was calling
Notify(src, 'property_exited')immediately afterremovePlayer(), while the client'sexitInstancehandler was already showing the exact same notification after the teleport completed. Two sources, same message, every single exit. v1.0.1 removes the server-side duplicate. The client notification is the correct one anyway β it fires after the teleport, not before.
| # | Fix | Severity | Impact |
|---|---|---|---|
| #1 | Removed redundant Notify(src, 'property_exited') from server-side exitProperty event β client's exitInstance handler already shows the same notification after teleport completes |
π High | Players saw the "Property exited" notification twice on every exit |
Drop-in replacement β same config, same DB schema, same exports.
git pull+ resource restart is all you need.
Every other IPL/property script either drops players into the void, charges money for it, runs on legacy frameworks, or is an escrow nightmare.
We said no.
| β Other IPL Scripts | β rde_ipl |
|---|---|
| Teleports you into the void | Streaming-safe teleport: freeze β RequestCollision β settle β unfreeze |
| No interior exit | ox_target sphere zone INSIDE the property β "Exit Property" right where you spawn |
| Single map marker, same blip for everything | Per-IPL hand-picked blip sprites (bunker β military, submarine β π’, FIB β FBI icon) |
| Discord webhooks (deletable, bannable) | Decentralized Nostr logging β permanent & uncensorable |
| ESX / QBCore bloat | ox_core only β the future, not the past |
| One global instance, players see each other | Routing buckets β every property is a private dimension |
| Static property list, no DB | Full CRUD β create, buy, sell, delete, customize, persist |
| Paid or escrow | 100% free forever β RDE Black Flag |
| No admin tools | Triple admin: ACE + ox_core groups + Steam ID whitelist |
| Hard-coded coords, no validation | Coord validator on startup + client-side guard β no more void drops |
- π 65 Native IPLs β Apartments, Offices, Bunkers, Nightclubs, Casino, Yachts, Cayo Perico, North Yankton, Aircraft Carrier, UFO β all hand-picked
- π StreamingSafeTeleport() β RequestCollisionAtCoord β NewLoadSceneStart β collision settle β SetEntityCoords. Players never fall through the map.
- π― Interior Exit Zone β ox_target sphere spawns inside the property on enter, removed on exit. No more
/exitpropertyhunting. - π‘ Statebag-First β GlobalState syncs all properties to every client. One source of truth.
- π Routing Buckets β each property instance gets its own bucket. Guests see only who's in their dimension.
- πΊοΈ Per-IPL Map Blips β every IPL has a hand-picked sprite/color/scale. Bunker gets military grey, FIB gets FBI icon, Submarine gets ship sprite. Can be disabled per-entry with
blip = false. - π¨ Interior Customization β Apartments, Offices, Nightclubs with selectable themes β swap IPL variants on the fly.
- π° Dual Money System β ox_inventory item or ox_core bank account. Fees and sell discounts configurable.
- π‘οΈ Triple Admin Security β ACE permissions, ox_core groups, Steam ID whitelist β any combination, configurable priority.
- π Nostr Logging β purchase, sale, enter, exit, admin actions, security violations β all decentralized and cryptographically signed.
- π Multilanguage β EN / DE out of the box, add any language in minutes.
- β‘ Rate Limiting β per-player per-action windows on all destructive events.
- π Coord Validator β startup check catches
(0,0,0)entries and identicalcoords/exitCoordsbefore any player gets voided. - π Performance Metrics β transaction count, revenue, peak concurrent instances, instance duration average.
- π§Ή Auto-Cleanup β empty instances auto-destruct after configurable idle time. Routing buckets freed automatically.
Coming soon β drop a PR with your screenshots!
oxmysql β https://github.com/overextended/oxmysql
ox_lib β https://github.com/overextended/ox_lib
ox_core β https://github.com/overextended/ox_core
ox_target β https://github.com/overextended/ox_target
optional:
ox_inventory β https://github.com/overextended/ox_inventory (only if MoneySystem.Source = 'inventory')
rde_nostr_log β https://github.com/RedDragonElite/rde_nostr_log
cd resources
git clone https://github.com/RedDragonElite/rde_ipl.gitAlready on v1.0.0-alpha? Just
git pullβ no schema migration, no config changes needed. Restart the resource and you're done.
# Dependencies first β order matters!
ensure oxmysql
ensure ox_lib
ensure ox_core
ensure ox_target
ensure ox_inventory # only if MoneySystem.Source = 'inventory'
# Optional: Nostr logging (highly recommended)
ensure rde_nostr_log
# The IPL property system
ensure rde_ipl# server.cfg β grant admin access via ACE
add_ace group.admin rde.ipl.admin allow
add_ace identifier.steam:110000101605859 rde.ipl.admin allowThat's it. No SQL import needed β tables auto-create on first run. You'll see:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RDE | IPL MANAGER v1.0.1-alpha - SERVER READY β
β Interior exit target + per-IPL map blip definitions β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β π¦ IPLs Available: 65 | Properties: 0 β
β π‘οΈ Admin Methods: 3 | Money: inventory β
β π Language: EN | Debug: OFF β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
config.lua is fully self-documented. Key sections:
Config.AdminSystem = {
acePermission = 'rde.ipl.admin',
steamIds = {
'steam:110000101605859', -- Your Steam ID
},
oxGroups = {
['owner'] = 0,
['admin'] = 0,
['superadmin'] = 0
},
-- Check order is configurable
checkOrder = {'ace', 'oxcore', 'steam'}
}Config.MoneySystem = {
Source = 'inventory', -- 'inventory' or 'banking'
InventoryItemName = 'money', -- ox_inventory item name
BankingAccount = 'bank', -- ox_core account name
EnablePurchaseFee = false,
PurchaseFeePercent = 5,
EnableSellDiscount = true,
SellDiscountPercent = 10
}Config.Property = {
MaxPropertiesPerPlayer = 5,
AllowPropertySale = true,
InteractionDistance = 3.0, -- ox_target sphere radius
InteriorExitRadius = 1.5, -- exit zone radius inside property
LockByDefault = true,
MaxPlayersPerInstance = 8,
AutoCleanupTime = 300, -- seconds before empty instance auto-destroys
SaveIntervalSeconds = 300, -- auto-save interval
}Every entry in Config.IPLDatabase can define its own blip:
{
id = 'maze_bank_office',
-- ...
blip = { sprite = 475, color = 29, scale = 0.85 }, -- custom per-IPL
-- or:
blip = false, -- no blip for this property
-- or: omit blip entirely β falls back to Config.BlipSprites[category]
}Sprite IDs: https://docs.fivem.net/docs/game-references/blips/
-- Add to Config.IPLDatabase in config.lua:
{
id = 'my_custom_ipl',
name = 'My Custom Location',
category = 'special',
price = 500000,
ipl = {'custom_ipl_name'},
coords = vector4(x, y, z, heading), -- interior spawn point
exitCoords = vector4(x, y, z, heading), -- exterior exit point
maxOccupancy = 8,
customizable = false,
blip = { sprite = 374, color = 6, scale = 0.85 },
description = 'My custom IPL description'
}coords and exitCoords must never be identical. The coord validator warns on startup if they are, and the client refuses to teleport.
| Command | Description |
|---|---|
/myproperties |
Open your property list |
/exitproperty |
Exit current property (or use interior exit zone) |
| Command | Description |
|---|---|
/ipl |
Open IPL admin control panel (triple-verified) |
/ipldebug |
Dump full client state (debug mode only) |
rde_ipl/
βββ fxmanifest.lua
βββ config.lua β Config + locales (EN/DE) + 65-entry IPL database
βββ README.md
βββ LICENSE
βββ server.lua β DB, instances, routing buckets, events, admin, Nostr
βββ client.lua β IPL loading, streaming-safe teleport, blips, ox_target
All user-facing text lives in Config.Languages inside config.lua. Switch language by changing Config.DefaultLanguage:
Config.DefaultLanguage = 'de' -- 'en' or 'de'Add a new language:
- Copy the
en = { ... }block βxx = { ... } - Translate all values (keep the keys!)
- Set
Config.DefaultLanguage = 'xx'
Currently supported:
| Code | Language |
|---|---|
en |
π¬π§ English |
de |
π©πͺ Deutsch |
rde_ipl ships with first-class rde_nostr_log integration.
Every critical property event is logged to the decentralized Nostr network β permanent, cryptographically signed, uncensorable. No Discord. No rate limits. No single point of failure.
| Event | Nostr Tag |
|---|---|
| Property purchased | property_purchase |
| Property sold | property_sale |
| Player entered property | property_enter |
| Player exited property | property_exit |
| Admin created property | property_created |
| Admin deleted property | property_deleted |
| Admin action (update, teleport) | admin_action |
| Lock toggled | property_lock_toggle |
| Security violation attempt | security_violation |
| Player disconnected inside property | disconnect_in_property |
| Server startup | server_startup |
| Server shutdown | server_shutdown |
-- rde_nostr_log simply not started β zero overhead, zero side effects
-- The system runs normally without it-- Get property by instance ID
local property = exports.rde_ipl:GetProperty(instanceId)
-- Get all properties (full state table)
local all = exports.rde_ipl:GetAllProperties()
-- Get properties owned by identifier
local props = exports.rde_ipl:GetPlayerProperties(identifier)
-- Check if player is inside a property
local inProperty, instanceId = exports.rde_ipl:IsPlayerInProperty(source)
-- Get active instance
local instance = exports.rde_ipl:GetActiveInstance(instanceId)
-- Force evict player from current instance
local success = exports.rde_ipl:EvictPlayer(source)
-- Get performance metrics
local stats = exports.rde_ipl:GetStatistics()Tables auto-create on first run β no SQL import needed.
id INT AUTO_INCREMENT PRIMARY KEY
instance_id VARCHAR(64) UNIQUE NOT NULL
ipl_index INT NOT NULL
owner_identifier VARCHAR(60) NULL
coords TEXT NOT NULL -- vector4 as JSON
price INT NOT NULL
for_sale TINYINT(1) NOT NULL
locked TINYINT(1) NOT NULL
customization TEXT NULL -- JSON
access_list TEXT NULL -- JSON
last_entered VARCHAR(60) NULL
total_visits INT DEFAULT 0
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPid INT AUTO_INCREMENT PRIMARY KEY
instance_id VARCHAR(64) NOT NULL
buyer_identifier VARCHAR(60) NULL
seller_identifier VARCHAR(60) NULL
transaction_type ENUM('purchase','sale','transfer')
amount INT NOT NULL
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMPEnable debug mode: set Config.Statebag.Debug = true in config.lua.
| Command | Description |
|---|---|
/ipldebug |
Full client state dump β loaded IPLs, active instance, zones, blips, metrics |
Server-side debug output includes:
- Per-admin auth method confirmation
- Rate limit hits
- Instance creation/destruction with bucket IDs
- IPL load times
- Coord validator results on startup
- Performance report every 60s
You're on v1.0.0-alpha. The server was sending the notification directly after removePlayer() AND the client was showing it again after the teleport. Update to v1.0.1-alpha. Fixed in #1.
The coord validator caught this at startup β check server console for β IPL entries have INVALID coords warnings. The entry has coords near (0,0,0) which is under the ocean. Fix the vector4 in Config.IPLDatabase.
The property would teleport players to the same spot on enter AND exit. Set coords to the interior spawn point and exitCoords to outside the door.
Configure at least one in Config.AdminSystem:
steamIds = { 'steam:YOUR_STEAM_ID' }
-- or: add_ace group.admin rde.ipl.admin allow in server.cfg- Verify you're in
Config.AdminSystem.steamIdsor have ACErde.ipl.adminor are in anoxGroupsentry - Check server console for
β οΈ [SECURITY] Unauthorized admin attemptβ your identifier will be logged there
The maxOccupancy for that IPL is reached. Check Config.IPLDatabase[x].maxOccupancy and raise it, or wait for a player to exit.
Verify Config.MoneySystem.Source matches your setup:
'inventory'β requiresox_inventoryrunning + item namedConfig.MoneySystem.InventoryItemName'banking'β requires ox_core bank accountConfig.MoneySystem.BankingAccount
[RDE|IPL] Nostr log failed (non-critical): ...
Install rde_nostr_log and ensure it starts before rde_ipl. The property system continues to work normally without it β all log calls are no-ops.
Known alpha limitation: other clients refresh their blips/zones on their next resource init. Will be resolved in v1.1 via StateBag change handler.
ox_core β Player, groups, character management
ox_lib β Context menus, progress bars, notifications, alerts, input dialogs
ox_target β World interaction zones (exterior markers + interior exit zones)
oxmysql β Async database (auto-create tables)
Routing Buckets β Private dimensions per property instance
StateBags β Realtime property state sync across all clients
rde_nostr_log β Decentralized event logging (optional)
PRs are always welcome.
- Fork the repository
- Create a branch:
git checkout -b feature/your-feature - Test on a live server before submitting
- Commit:
git commit -m 'feat: your feature description' - Push:
git push origin feature/your-feature - Open a Pull Request with a clear description
Guidelines:
- β Keep the RDE header in all files
- β Follow RDE OX Standards v2 β ox_core, ox_lib, StateBags, no legacy shims
- β
Run
luac -pon every modified.luafile before pushing - β Test on a live server β especially teleport and IPL loading (void drops are the #1 issue in this script category)
- β
Every IPL entry needs valid, distinct
coordsandexitCoordsβ use the coord validator output - β
New money operations go through
MoneySystem.hasMoney/removeMoney/addMoneyβ never touch ox_inventory or ox_core accounts directly - β
New admin events get
AdminSystem.isAdmin(src)+RDELog.securityViolation(src, ...)on fail β no exceptions - β
StreamingSafeTeleport()is the only teleport function β neverSetEntityCoordsnaked - β No Wait() inside NetEvents β always wrap in CreateThread
- β No string concat in SQL β prepared statements only
- β No ESX, no QBCore, no legacy shims
- β No telemetry, no paywalls
RDE Black Flag Source License v6.66
###################################################################################
# #
# .:: RED DRAGON ELITE (RDE) - BLACK FLAG SOURCE LICENSE v6.66 ::. #
# #
# PROJECT: RDE_IPL (NATIVE GTA INTERIOR PROPERTY SYSTEM FOR FIVEM OX_CORE) #
# ARCHITECT: .:: RDE β§ Shin [β³ αα
α±αα
αΎαα αααα
β½] ::. | https://rd-elite.com #
# ORIGIN: https://github.com/RedDragonElite #
# #
# WARNING: THIS CODE IS PROTECTED BY DIGITAL VOODOO AND PURE HATRED FOR LEAKERS #
# #
# [ THE RULES OF THE GAME ] #
# #
# 1. // THE "FUCK GREED" PROTOCOL (FREE USE) #
# You are free to use, edit, and abuse this code on your server. #
# Learn from it. Break it. Fix it. That is the hacker way. #
# Cost: 0.00β¬. If you paid for this, you got scammed by a rat. #
# #
# 2. // THE TEBEX KILL SWITCH (COMMERCIAL SUICIDE) #
# Listen closely, you parasites: #
# If I find this script on any paid store, Patreon, or "Premium Pack": #
# > I will DMCA your store into oblivion. #
# > I will publicly shame your community on Nostr. Permanently. #
# > I hope every teleport lands you 300 meters under the ocean. #
# SELLING FREE WORK IS THEFT. AND I AM THE JUDGE. #
# #
# 3. // THE CREDIT OATH #
# Keep this header. If you remove my name, you admit you have no skill. #
# You can add "Edited by [YourName]", but never erase the original creator. #
# Don't be a skid. Respect the architecture. #
# #
# 4. // THE CURSE OF THE COPY-PASTE #
# This code implements streaming-safe teleports, routing buckets, #
# per-IPL blip systems, and triple-layer admin auth. If you copy-paste #
# without understanding, you WILL drop players into the void. #
# Don't come crying to my DMs. RTFM. #
# #
# -------------------------------------------------------------------------- #
# "We build the future on the graves of paid resources." #
# "REJECT MODERN MEDIOCRITY. EMBRACE RDE SUPERIORITY." #
# -------------------------------------------------------------------------- #
###################################################################################
TL;DR:
- β Free forever β use it, edit it, learn from it
- β Keep the header β credit where it's due
- β Don't sell it β commercial use = instant DMCA + public shaming on Nostr
- β Don't be a skid β copy-paste without reading will void your players
| Resource | Description |
|---|---|
| rde_nostr_log | Decentralized FiveM logging via Nostr β replace Discord forever |
| rde_doors | Full door system β lockpick, passcode, group auth, sliding/automatic |
| rde_elevators | Elevator system with statebag sync and per-floor access |
| rde_aipd | Next-gen AI Police & Crime System β StateBag-synced, Nostr-logged |
| awesome-ox-rde | Curated list of the best ox_core resources |
| π Website | rd-elite.com |
| π Nostr Terminal | rd-elite.com/Files/NOSTR/Terminal |
| π GitHub | github.com/RedDragonElite |
| π£ Nostr | npub1wr4e24zn6zzjqx8kvnelfvktf0pu6l2gx4gvw06zead2eqyn23sq9tsd94 |
Before opening an issue:
- β Read this README fully β especially Troubleshooting
- β Check server console for coord validator warnings on startup
- β Include your server console output and F8 client logs
- β Don't open issues without logs β we can't help without them
Made with π₯ and void-proof engineering by Red Dragon Elite
The future is ours. We are already inside.
REJECT MODERN MEDIOCRITY. EMBRACE RDE SUPERIORITY.
RDE FOREVER. SYSTEM FAILURE. β‘777β‘