Integrations — Camera | Quasar Store | Quasar Store
Documentation
Integrations
Frameworks and inventories supported by the Camera script and how each is detected: ESX, QBCore, Qbox, standalone, ox_inventory, qs-inventory, qb-inventory, plus notifications, HUD, prompts, quests, photo hosting and languages.
Camera never talks to your framework or inventory directly. Each one is reached through a small bridge file, and the right bridge is picked at start by looking at what is already running. The console line qs-camera v2.0.0 started (esx / ox) says which two it chose.
Layer
Supported
Without it
Framework
es_extended · qb-core · qbx_core
Standalone: players are recognised by their license and named by their FiveM name.
Detection reads two small tables at the top of shared/config.lua. The left side is a resource name, the right side the bridge it uses. If your framework or inventory runs under another name, add it:
Detection only sees resources that are already started, so anything you want found must be above ensure qs-camera in server.cfg. Run only one inventory from the list: with two started at once, which one wins is not guaranteed.
Messages — You loaded a new roll of film, Nobody is close enough — and the progress bars for repairing and loading film use qs-interface when it is running and ox_lib otherwise. Both are plain functions in client/custom/framework/<your framework>.lua — SendTextMessage and ProgressBar — so another notification resource is a few lines:
lua
-- client/custom/framework/esx.lua (or qb.lua / standalone.lua)functionSendTextMessage(msg, kind)-- kind is 'success', 'error' or 'inform'
exports['my-notify']:Show(msg, kind)
end
While a viewfinder, an album or the board editor is on screen, your HUD is hidden, and it comes back once nothing needs the screen any more. Which HUDs are hidden is a list in client/custom/hud.lua. qs-interface ships in it, and adding yours is one entry:
An entry for a resource that is not running is skipped, so a list of several HUDs costs nothing. A hook that throws is caught and reported in F8, and never leaves a player stuck behind a camera.
The [E] Take down and [E] Board prompts on walls and boards are drawn by DrawText3D in client/custom/prompt.lua. Replace its body to draw them your own way. It is called every frame while the player stands in range, so a text UI that is shown and hidden — rather than drawn each frame — needs to remember whether it is already on screen.
Items become usable through your framework and inventory on their own, with one exception: ox_inventory calls an export named in the item's definition. That is the server = { export = 'qs-camera.useItem' } line in every ox_inventory definition on Inventory Items — leave it out and the item cannot be used.
Whatever the route, the server checks that the player really holds the item in that slot before anything happens, and ignores a second use of the same item within a third of a second.
With qs-inventory running, Camera gives every player five quests. They live in server/custom/missions.lua, which you may edit — titles, descriptions, rewards and levels.
Quest
Goal
Shocking Experience
Get shocked when a camera gives out on you.
Camera Repairman
Bring a broken camera back to life.
Camera Enthusiast
Take at least 20 photos — digital photos and printed cards both count.
The two cameras upload differently, which is worth knowing when something fails:
Digital photos
Instant cards
Who uploads
The player's game, through screenshot-basic.
The server, after the card is composed on the player's screen.
Where to
DEFAULT_WEBHOOK — Fivemanage or a Discord webhook ending in ?wait=true.
The same DEFAULT_WEBHOOK.
Checked
The answer must be a valid web address.
The address must belong to a host on the Uploads list, and the image must be under about 3 MB.
The Uploads list in the settings panel holds cdn.discordapp.com, media.discordapp.net and *.fivemanage.com by default. Keep it that way unless the service you upload to answers with a different address; an empty list accepts any https host.
Supporting a framework or inventory that is not on the list is deliberately small: one copied file per side, plus one line.
Copy the closest bridge
Inventories live in server/custom/inventory/ and client/custom/inventory/; frameworks in server/custom/framework/ and client/custom/framework/. None of them is encrypted. Copy the one nearest to yours — ox.lua, say — and name it after your resource.
Change the calls inside
Each bridge only runs when it is the chosen one, and fills four functions with your resource's own exports:
Add your resource to the inventories (or frameworks) table in shared/config.lua with the id you guarded on — ['my-inventory'] = 'myinv'.
Your inventory must keep metadata on items — every photo, camera and album lives there. If writing the bridge is more than you want to take on, send us the name of the resource.
Choose one in /cameraconfig → General → Language; it applies to every player at once, interface included. Any text missing from a language falls back to English. The language files are not encrypted, so any wording can be changed in its JSON file.