Skip to content

RedDragonElite/rde_ipl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ”₯ ULTIMATE IPL PROPERTY SYSTEM V1.0.1-ALPHA - Built on ox_core & Routing Buckets! 🏠

πŸ‰ rde_ipl

Version License FiveM ox_core Nostr Quality

🏠 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

image

πŸš‘ Hotfix Notice β€” v1.0.1-alpha (Mandatory if on v1.0.0-alpha)

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 after removePlayer(), while the client's exitInstance handler 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.

What changed in v1.0.1-alpha

# 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.


πŸ”₯ Why This Destroys Every Other IPL Script

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

🎯 Key Features

  • 🏠 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 /exitproperty hunting.
  • πŸ“‘ 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 identical coords/exitCoords before 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.

πŸ“Έ Screenshots

Coming soon β€” drop a PR with your screenshots!


πŸ“¦ Dependencies

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

πŸš€ Installation

Step 1: Clone or download

cd resources
git clone https://github.com/RedDragonElite/rde_ipl.git

Already on v1.0.0-alpha? Just git pull β€” no schema migration, no config changes needed. Restart the resource and you're done.

Step 2: Add to server.cfg

# 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

Step 3: Configure ACE permissions

# server.cfg β€” grant admin access via ACE
add_ace group.admin rde.ipl.admin allow
add_ace identifier.steam:110000101605859 rde.ipl.admin allow

Step 4: Start your server

That'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                            β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

βš™οΈ Configuration

config.lua is fully self-documented. Key sections:

Admin System

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'}
}

Money System

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
}

Property Settings

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
}

Per-IPL Blip Override

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/

Adding a Custom IPL

-- 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.


πŸ’¬ Commands

Player Commands

Command Description
/myproperties Open your property list
/exitproperty Exit current property (or use interior exit zone)

Admin Commands

Command Description
/ipl Open IPL admin control panel (triple-verified)
/ipldebug Dump full client state (debug mode only)

πŸ—‚ Folder Structure

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

🌍 Locales

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:

  1. Copy the en = { ... } block β†’ xx = { ... }
  2. Translate all values (keep the keys!)
  3. Set Config.DefaultLanguage = 'xx'

Currently supported:

Code Language
en πŸ‡¬πŸ‡§ English
de πŸ‡©πŸ‡ͺ Deutsch

πŸ‰ Nostr Logging

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.

Events logged automatically

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

Disable Nostr completely

-- rde_nostr_log simply not started β†’ zero overhead, zero side effects
-- The system runs normally without it

πŸ“‘ Exports

Server

-- 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()

πŸ—„ Database

Tables auto-create on first run β€” no SQL import needed.

rde_iplproperties

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_TIMESTAMP

rde_ipl_transactions

id                 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_TIMESTAMP

πŸ”§ Debug Commands

Enable 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

πŸ› Troubleshooting

"Property exited" notification appears twice

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.

Player spawns underground / falls through the map

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.

coords and exitCoords IDENTICAL warning on startup

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.

"No admin methods configured" warning

Configure at least one in Config.AdminSystem:

steamIds = { 'steam:YOUR_STEAM_ID' }
-- or: add_ace group.admin rde.ipl.admin allow in server.cfg

/ipl not opening admin menu

  1. Verify you're in Config.AdminSystem.steamIds or have ACE rde.ipl.admin or are in an oxGroups entry
  2. Check server console for ⚠️ [SECURITY] Unauthorized admin attempt β€” your identifier will be logged there

Can't enter property β€” "instance full"

The maxOccupancy for that IPL is reached. Check Config.IPLDatabase[x].maxOccupancy and raise it, or wait for a player to exit.

Money not deducting

Verify Config.MoneySystem.Source matches your setup:

  • 'inventory' β†’ requires ox_inventory running + item named Config.MoneySystem.InventoryItemName
  • 'banking' β†’ requires ox_core bank account Config.MoneySystem.BankingAccount

Nostr logger not connecting

[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.

Properties not showing on map after someone buys

Known alpha limitation: other clients refresh their blips/zones on their next resource init. Will be resolved in v1.1 via StateBag change handler.


πŸ“š Tech Stack

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)

🀝 Contributing

PRs are always welcome.

  1. Fork the repository
  2. Create a branch: git checkout -b feature/your-feature
  3. Test on a live server before submitting
  4. Commit: git commit -m 'feat: your feature description'
  5. Push: git push origin feature/your-feature
  6. 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 -p on every modified .lua file 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 coords and exitCoords β€” 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 β€” never SetEntityCoords naked
  • ❌ 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

πŸ“œ License

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

⚑ Related Projects

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

🌐 Community & Support

🌍 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⚑

Website Nostr Terminal

About

🏠 Native GTA interior property system for FiveM ox_core | πŸš€ Void-proof teleports | 🌐 Routing buckets | πŸ—ΊοΈ 65 IPLs | πŸ‰ Nostr-logged | ⚑ Free forever

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages