A framework bridge for FiveM resources in the Prodigy Studios ecosystem. Instead of writing support for multiple frameworks, inventories, or phone systems directly in each script, resources use prp-bridge to get a unified API that is independent of the underlying tech stack.
- Place
prp-bridgein yourresourcesfolder. - Add
ensure prp-bridgetoserver.cfgbefore any resources that depend on it. - Configure
config.lua(see section below). - Start the server.
BridgeConfig = {
VersionCheck = true, -- check resource version on start
Debug = false, -- enable debug logging
-- Framework selection
FrameWork = "qbx_core", -- qbx_core | qb-core | es_extended | nd_core
-- External systems
Inventory = "ox_inventory", -- ox_inventory | origen_inventory | tgiann_inventory
Phone = "lb-phone", -- lb-phone | yseries | yphone | yflip | npwd | roadphone | 17mov_phone | gksphone
Target = "ox_target", -- ox_target | qb-target | sleepless_interact
Medical = "qbx_medical", -- qbx_medical | esx_ambulancejob | nd_ambulance
Dispatch = "ps-dispatch", -- ps-dispatch | origen_police | cd_dispatch | rcore_dispatch
VehicleKeys = "qbx_vehiclekeys", -- qbx_vehiclekeys | cd_garage | mVehicle | okokGarage | wasabi_carlock | mrnewbvehiclekeys | Renewed-Vehiclekeys | ...
VehicleFuel = "ox_fuel", -- ox_fuel | LegacyFuel | cdn-fuel | lc_fuel | qb-fuel | Renewed-Fuel
Minigames = "prp-minigames",
-- Group command
Group = {
CommandEnabled = true,
CommandName = "group",
},
-- Cooldown admin command
Cooldowns = {
AdminCommandEnabled = true,
AdminCommandName = "cooldowns",
AdminCommandRestriction = "group.admin",
},
-- UniQueue system
Uniqueue = {
MaxOverTimePriority = 30,
AddOverTimePriorityTime = 150, -- seconds between priority increments
HoldQueuesOnStartTime = 0, -- ms to hold all queues after server start
PoliceStrengthPerPlayer = 1,
PoliceJobs = { "lspd", "police", "bsco" },
},
-- Loot rarity weights
LootRarityWeights = {
["COMMON"] = 800,
["RARE"] = 150,
["EPIC"] = 45,
["LEGENDARY"] = 5,
},
}The modules/ folder contains implementations for external resources. Each category has its own subfolder:
modules/
├── fw/ # frameworks (qbx_core, qb-core, es_extended, nd_core)
├── inv/ # inventories (ox_inventory, origen_inventory, tgiann_inventory)
├── target/ # targeting (ox_target, qb-target, sleepless_interact)
├── dispatch/ # dispatch (ps-dispatch, origen_police, cd_dispatch, rcore_dispatch)
├── medical/ # medical (qbx_medical, esx_ambulancejob, nd_ambulance)
├── phone/ # phones (lb-phone, yseries, yphone, npwd, ...)
├── vkeys/ # vehicle keys
├── vfuel/ # vehicle fuel
├── minigames/ # minigames
├── log/ # Discord logging
└── sound/ # sound system
Each module is loaded automatically based on the values in BridgeConfig. The selected module exposes a unified API available through the global bridge table.
For instructions on adding a new framework or system, see docs/how-to-add-new-module.md.
Manages player access to specific criminal activities. Data is persistent - stored in the database (criminal_allowlists table).
Server exports
| Function | Description |
|---|---|
GetAllowlist(stateId) |
Returns the allowlist table for a character |
HasAllowlist(stateId, allowlist) |
Checks whether a character has the given allowlist |
AddAllowlist(src, stateId, allowlist) |
Grants an allowlist to a character |
RemoveAllowlist(src, stateId, allowlist) |
Revokes an allowlist from a character |
Client export
| Function | Description |
|---|---|
IsAllowlisted(allowlist) |
Checks whether the local player has the given allowlist |
Admin commands: /add_allowlist, /remove_allowlist
Attaches non-networked objects to a player or vehicle (skeleton bones). Supports animations and particle effects (PTFX).
Server exports
| Function | Description |
|---|---|
RegisterObject(data) |
Registers an object template |
UnregisterObject(objectName) |
Removes a registered template |
CreateAttachObject(src, objectName, weaponData?) |
Attaches an object to a player; returns objectId |
RemoveAttachObject(src, objectId) |
Detaches an object from a player |
GetObjectsOnPlayer(src) |
Returns a list of objects attached to the player |
ClearPlayerObjects(src, objectName?) |
Removes player's attached objects |
CreateVehTempAttachObject(entity, objectData) |
Attaches an object to a vehicle |
RemoveVehTempAttachObject(entity, objectId) |
Detaches an object from a vehicle |
ClearVehTempAttachObjects(entity) |
Removes all objects from a vehicle |
Client export
| Function | Description |
|---|---|
GetObjectHandle(objectId) |
Returns the entity handle of an attached object |
ObjectData structure
{
objectName = "string", -- unique name (required)
modelHash = number | string, -- model hash or name
offset = vector3,
rotation = vector3,
boneId = number | string,
disableCollision = boolean,
completelyDisableCollision = boolean,
isWeapon = boolean?,
dict = string?, -- animation dictionary
anim = string?, -- animation name
ptfxAsset = string?,
ptfxName = string?,
ptfxOffset = vector3?,
ptfxRot = vector3?,
ptfxScale = number?,
ptfxColor = vector3?,
}Global and per-character cooldown management.
Server exports
| Function | Description |
|---|---|
startGlobalCooldown(key, minutes) |
Starts a server-wide cooldown |
startCooldownByIdentifier(identifier, key, minutes, allChars) |
Starts a per-character cooldown |
startCooldownByPlayerId(playerId, key, minutes, allChars) |
Starts a cooldown by player ID |
isCooldownActive(key) |
Checks whether a global cooldown is active |
isCooldownActiveForIdentifier(identifier, key) |
Checks a character's cooldown |
When a cooldown finishes, the server emits the event prp-bridge:cooldowns:finished.
Admin command: /cooldowns (cooldown management menu)
A simple player grouping system for shared activities. Groups integrate with UniQueue and support invitations.
Server exports
| Function | Description |
|---|---|
CreateGroup(leaderSrc) |
Creates a group; returns the group object |
GetGroupFromMember(src) |
Returns a group by player ID |
GetGroupFromMemberByIdentifier(identifier) |
Returns a group by character identifier |
GetGroupByUuid(uuid) |
Returns a group by UUID |
GetGroupByPartyUuid(partyUuid) |
Returns the group associated with a UniQueue party |
GetGroupIdFromMember(src) |
Returns the group UUID for a player |
GetGroupPlayerIds(uuid) |
Returns a list of player IDs in the group |
Group object methods
group:getUuid()
group:getPartyUuid()
group:setLeader(src)
group:getLeader() -- { identifier, src, characterName }
group:addMember(src)
group:removeMember(src)
group:getMembers()
group:getMembersCount()
group:getMembersPlayerIds()
group:isSrcAMember(src)
group:isSrcALeader(src)
group:setActivity({ activityId, activityName })
group:getActivity()
group:clearActivity()
group:triggerEvent(eventName, ...)
group:isAnyoneOnline()
group:disband()
group:isInviting() / group:toggleInviting()
group:addPendingInvite(inviteUuid, targetSrc)
group:removePendingInvite(inviteUuid)
group:isPendingInviteValid(inviteUuid, targetSrc)
group:createUniqueueParty(partyType)
group:enterUniqueue(queueName)Command: /group
Places peds on the map with context menu interactions. Uses the ox_lib point system and the configured targeting system.
Client exports
| Function | Description |
|---|---|
AddPedInteraction(id, payload) |
Creates a ped interaction point |
RemovePedInteraction(id) |
Removes an interaction point |
PedInteractionPayload structure
{
model = number | string, -- ped model
coords = vector3,
heading = number,
radius = number, -- interaction activation radius
options = table, -- target options (same format as bridge.target)
component = { -- optional outfit
componentId, drawableId, textureId, paletteId
},
anim = { -- optional ped animation
animDict, anim, blendIn, blendOut, duration, flag, playback,
lockX, lockY, lockZ
},
scenario = string?, -- task scenario (alternative to anim)
weapon = number?, -- weapon hash to give the ped
}An interactive utility for manually placing props on the map (e.g. by an admin or an activity script).
Client export
-- Returns vector4(x, y, z, heading) or nil if cancelled
exports["prp-bridge"]:PropPlacer(model, forceGround?, allowedMaterials?, maxDistance?)Controls during placement:
- Scroll - rotate
- E - confirm placement
- Backspace - cancel
- H (debug mode) - display the surface material hash
Registers locations where players can sell items. Internally uses an inventory stash system.
Server exports
| Function | Description |
|---|---|
RegisterSellShop(id, payload) |
Registers a sell shop location |
OpenSellShop(src, id) |
Opens the shop for a player |
Client-side playback of .ogg audio files. Available through the unified bridge API:
bridge.sound.play(soundName, volume?)
bridge.sound.playSpatial(soundName, coords, volume?, maxDistance?)Place audio files in the sounds/ folder as *.ogg.
Queues players (or groups) for structured activities, enforces police presence requirements, and manages priorities.
Server exports
| Function | Description |
|---|---|
CreateQueue(name, type, requiredPolicePower, maxConcurrentTasks, cooldown) |
Creates a queue |
CreateParty(type) |
Creates a party ("civ" or "crime") |
GetQueue(name) |
Returns a queue by name |
GetQueuesByType(type) |
Returns all queues of a given type |
GetParty(uuid) |
Returns a party by UUID |
GetPartiesByType(type) |
Returns all parties of a given type |
GetPartiesFromPlayer(identifier) |
Returns all parties a player belongs to |
Selected queue and party methods
-- Queue
queue:setExecFunction(func) -- callback triggered when a party is dequeued
queue:setCheckFunction(func) -- validation callback (can the party enter?)
queue:add(party)
queue:remove(party)
queue:setBlocked(bool)
queue:setCooldown(seconds)
queue:clearCooldown()
-- Party
party:addMember(identifier)
party:removeMember(identifier)
party:getMembers()
party:setPriority(priority)
party:addOverTimePrio() -- grants priority for long wait times
party:destroy()Admin commands:
/uni_findplayer, /uni_setprio, /uni_rmfromque, /uni_setblocked, /uni_setcooldown, /uni_clearcooldown, /uni_totalblock, /uni_cleartask, /uni_devmode
prp-bridge is licensed under the GNU Lesser General Public License v3.0 or later (LGPL-3.0-or-later).
This resource is built on top of ox_lib (Copyright © 2025 Overextended), which is distributed under the same license. In accordance with the LGPL-3.0 terms and the ox_lib NOTICE, the following conditions apply:
- Credit must be given to the original authors and a link to the original project must be provided.
- Any modifications to the original work must be documented.
- The full LGPL-3.0 license text must be included with any distribution.
- This project must remain available under the LGPL-3.0 or a compatible open-source license.
- All existing copyright and licensing notices must be preserved.