How Integrations Work#
Nothing inside Theme Park knows which framework or inventory you run. Every outside call goes through a small, open bridge file, and the right one is picked on start from the resources that are running. The bridges are not encrypted, so a modified framework is adapted in one place.
Layer | Supported | Without it |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Standalone: every player gets a wallet saved in the database. |
Inventory | ox_inventory · qs-inventory · codem-inventory · core_inventory · tgiann-inventory · qb-inventory | Item prizes go through the framework's own inventory. |
Notifications | qs-interface · ox_lib | The GTA feed above the map. |
HUD | qs-interface — and any HUD you add | Only the radar and the GTA HUD are hidden. |
A framework is never replaced by the standalone wallet behind your back. If ESX or QBCore is running but its bridge fails, or it started after Theme Park, ride and darts payments stay blocked and the console says why — a standalone wallet on a framework server would hand out money from nowhere. Set the prices to 0 if you want the park open while you fix it.
Notifications and the HUD#
Notifications#
Every message to a player — You paid $50 for the ride, That seat is already taken — goes through one function, Notification(msg, kind) in custom/client.lua. It tries qs-interface, then ox_lib, then the GTA feed. kind is info, success, warning or error, and the title is the one set in Settings → General. To use another notification resource, put it at the top of the function:
-- custom/client.lua
function Notification(msg, kind)
if msg == nil or msg == '' then return end
-- Your own resource first:
exports['okokNotify']:Alert(title(), tostring(msg), 5000, kind)
do return end
-- ... the shipped chain (qs-interface, ox_lib, GTA feed) follows
endThe server sends its messages with Notification(src, msg, kind) in custom/server.lua, which hands them to the client function above, so one edit covers both sides.
Hiding the player's HUD#
While the settings panel is open, the radar, the GTA HUD and your HUD resource are hidden, and brought back exactly as they were when it closes. qs-interface is supported out of the box; add yours to QSPark.HudResources in client/custom/hud.lua:
-- client/custom/hud.lua
-- Resource name = function that shows (true) or hides (false) that HUD.
-- Only called while that resource is started.
QSPark.HudResources = {
['qs-interface'] = function(visible)
exports['qs-interface']:ToggleHud(visible)
end,
['my-hud'] = function(visible)
exports['my-hud']:SetVisible(visible)
end,
}Darts Item Prizes#
Item prizes are delivered through server/custom/inventory.lua. For each inventory it knows three things: the item's display name, whether the player has room, and how to hand the items over. The inventory is looked up on every prize, so one that starts after Theme Park is still used.
Before a prize is paid, the script checks that the item exists in your inventory. A tier that names an unknown item is reported in the server console on its first win, and that prize falls back to a money prize of the same tier or to a refund.
To add an inventory that is not on the list, add its name to INVENTORIES and give it a function in each of the three tables:
-- server/custom/inventory.lua
LABEL['my-inventory'] = function(item)
return exports['my-inventory']:GetItemLabel(item) -- nil when unknown
end
CARRY['my-inventory'] = function(src, item, count)
return exports['my-inventory']:CanCarryItem(src, item, count)
end
GIVE['my-inventory'] = function(src, item, count)
-- true only when the items were really added
return exports['my-inventory']:AddItem(src, item, count) and true or false
endStandalone Servers#
With no framework running, every player gets a wallet keyed by their license and saved in qs_themepark_wallets. Cash and bank are one purse there: a price is paid from the account set in the panel first and from the other for the rest, and darts money prizes go into it.
A new wallet starts with 0 cash and 500,000 bank. Change it at the top of custom/standalone/server.lua:
local DEFAULT_MONEY = 0
local DEFAULT_BANK = 500000Without a framework there are no groups, so the dart target creator is opened with the qs-themepark.build ace or a group.admin / group.superadmin ace.
Adapting a Framework Bridge#
Each framework has one server bridge and one client bridge under custom/esx/, custom/qb/ (QBCore and Qbox) and custom/standalone/. The rest of the script only calls these methods:
Server method | Answers |
|---|---|
| Whether payments can be taken now. |
| The player's identifier and character name. |
| Money in the account |
| Used for the build permission. |
Overriding Detection#
The framework and the inventory are picked from the lists in config/config.lua, read from the top: the first started resource wins. A renamed resource is added with its own name on the left:
local frameworks = {
{ ['my-renamed-core'] = 'qb' }, -- a renamed qb-core
{ ['qbx_core'] = 'qb' },
{ ['es_extended'] = 'esx' },
{ ['qb-core'] = 'qb' },
}Move a line up to make it win when two candidates run at once. Never run two inventories.
Languages#
41 translations ship in locales/, one JSON file per language code, covering the help texts, notifications and the settings panel:
Arabic (ar) · Bengali (bn) · Bulgarian (bg) · Catalan (ca) · Chinese (zh) · Croatian (hr) · Czech (cs) · Danish (da) · Dutch (nl) · English (en) · Estonian (et) · Finnish (fi) · French (fr) · German (de) · Greek (el) · Hebrew (he) · Hindi (hi) · Hungarian (hu) · Indonesian (id) · Italian (it) · Japanese (ja) · Korean (ko) · Latvian (lv) · Lithuanian (lt) · Malay (ms) · Norwegian (no) · Persian (fa) · Polish (pl) · Portuguese (pt) · Romanian (ro) · Russian (ru) · Slovak (sk) · Slovenian (sl) · Spanish (es) · Swahili (sw) · Swedish (sv) · Thai (th) · Turkish (tr) · Ukrainian (uk) · Urdu (ur) · Vietnamese (vi)
The language is chosen in Settings → General and changes for everybody at once, no restart. To reword a text, edit its line in the file of your language; a key missing from it is taken from en.json. Help texts may keep GTA key tokens such as ~INPUT_CONTEXT~, which show the key the player actually uses.



