Skip to content

Custom Car Stickers

Printers are not placed by default. Join with command.decaladmin permission, and use:

In-game command
/decalkioskplace

Check Config.Production.kiosk.enabled, ensure the resource name is still rs_car_stickers, and confirm that its streamed kiosk model loads. Stations placed successfully are restored from the database on restart.


Confirm that your installed target provider is detected (ox_target or qb-target) or switch to an in-world prompt.

config.lua
Config.Production.stationInteraction = 'prompt' -- or 'both'

The normal target mode also falls back to the Press E prompt when no supported target resource is running. Stand close enough to the kiosk.


Look directly at the affected kiosk and run:

Administrator command
/decalkioskcalibrate

Use H to cycle through adjustments, the mouse wheel to change the selected value, Shift for fine control, Ctrl for coarse control, Enter to save, and Back to cancel. Calibration is stored for each station.


Browsing the library is allowed away from a workstation. Creating, publishing, and printing require a configured printer. Verify you are at a station and have an inventory provider active. Also check publishing/printing prices and the inventoryโ€™s capacity for the new item.

config.lua
Config.Production.enabled = true

Check that the correct item definitions were merged into your inventory.

InventoryEssential setting
ox_inventoryvehicle_sticker uses stack = false, consume = 0
qb-inventoryvehicle_sticker uses unique = true

A printed sticker includes its own serial and design metadata. Non-unique qb-inventory items can merge incorrectly, so the script refuses unsafe printing configurations.


Confirm that vehicle_sticker is usable in your inventory and that rs_car_stickers starts after it. For ox_inventory, keep the included client export definition:

ox_inventory item entry
client = { export = 'rs_car_stickers.UseSticker' }

For qb-inventory, use the included install/qb_inventory_items.lua definition. You can also try /usesticker while near an eligible parked vehicle.


The production flow validates direct ownership on the server. Having vehicle keys, entering someone elseโ€™s car, or sharing garage access does not make a player the legal owner for sticker editing.

Check the framework ownership table mapping under Config.Persistence.adapters, especially if using a custom garage. Standalone installs require a custom ownership resolver. Job and gang vehicles have their own authorized workflows.


Saved stickers should be restored when the owned vehicle is recreated. Confirm:

  1. OneSync and oxmysql are running before the resource.
  2. The vehicle is correctly recognized as owned, with the expected plate.
  3. Config.Persistence.enabled, autoHydrate, and nearbyHydrate remain enabled.
  4. The garage has finished creating the vehicle and assigning the correct plate.

If a custom garage still does not restore artwork, connect its spawn event using bridge/garage_server.lua or bridge/garage_client.lua. Use decalgarage for authorized diagnostics.


Some repair resources clear GTAโ€™s native decals. The built-in repair recovery detects common cases. For custom repair scripts, call this after the repair finishes:

Client integration
exports['rs_car_stickers']:NotifyVehicleRepaired(vehicle, 'repair finished')

You can also configure existing repair-event listeners in Config.RepairRecovery.bridgeEvents. Do not edit or override another resourceโ€™s repair natives unnecessarily.


The nearby observer renderer has distance, vehicle-count, and texture-atlas limits. Confirm that Config.Observer.enabled is enabled and that both players are reasonably close to the same vehicle. The editor owner and nearby viewers use different rendering paths.

config.lua โ€” defaults
Config.Observer.enabled = true
Config.Observer.renderDistance = 110.0
Config.Observer.maxTrackedVehicles = 20

Avoid increasing performance limits blindly; test changes with several decorated vehicles and connected players.


Check the HTTPS host against Config.Images / Config.Observer.allowedImageHosts. The default permitted host is i.ibb.co. For your own image CDN, add its hostname to the allowlist. Remote URLs must also meet image-size and rendering budgets.

config.lua โ€” example
Config.Images = {
allowedImageHosts = { 'i.ibb.co', 'cdn.yourserver.example' },
}

Publishing may also fail if an external image cannot be decoded or exceeds snapshot limits. Simplify the design, reduce resolution, and retry. The editable draft remains available.


The supported sticker renderer uses static artwork. Animated GIF/video material is not supported. Large decals also use planar placement and may not perfectly follow curved bodywork; several coordinated stickers usually work better than one oversized wrap.


The default Config.Production.shops table is empty. Add a shop with coordinates, radius, and permitted job/grade settings. A mechanic must meet duty and job requirements when configured, and customer vehicle services require temporary owner approval.


Ensure the relevant feature is enabled in Config.Production.gangs or Config.Production.jobStickers.

  • Gang template creation is limited to recognized leaders; ESX and custom gang scripts need a bridge/gang_server.lua adapter.
  • Job templates depend on configured jobs, duty, models, and job authorization. External {callsign} and {phone} values require integration in bridge/job_server.lua.

Use /decaladmin with the command.decaladmin ACE. Staff can review sticker designs, applied stickers, version histories, and moderation records. Ban controls additionally require rs_vehicle_decal.admin.ban.

server.cfg
add_ace group.admin command.decaladmin allow
add_ace group.admin rs_vehicle_decal.admin.ban allow

No. The resource creates and upgrades its own SQL tables on startup. Make sure your oxmysql database user has permission to create and alter tables. Back up all sticker, decal, and kiosk tables before major upgrades.