Browse docs
Server Exports
Server-side exports provided by sky_jobs_base for dispatch, tablet app registration, and more.
Dispatch
createDispatch(title, message, coords, jobs, meta)
- Purpose: Creates a dispatch entry and broadcasts it to all on-duty members of the target jobs.
- Arguments:
title(string) — dispatch title. Required.message(string) — dispatch description.coords(vector3 | table) — location{x, y, z}. Required.jobs(string | string[]) — job name or array of job names.meta(table?) — optional metadata:source(number?) — source player ID.sourceId(string?) — additional source identifier.category(string?) — dispatch category.
- Returns:
table | nil— the dispatch entry on success,nilon validation failure.
local dispatch = exports["sky_jobs_base"]:createDispatch(
"Bank Robbery",
"Silent alarm triggered at Pacific Standard",
vector3(235.0, 216.0, 106.0),
{ "police" },
{ category = "robbery", source = source }
)
if dispatch then
print("Dispatch created:", dispatch.id)
end
Dispatch Entry Structure
| Field | Type | Description |
|---|---|---|
id | string | Unique dispatch identifier |
title | string | Dispatch title |
message | string | Dispatch description |
coords | table | Location {x, y, z} |
jobs | table | Target job names |
status | string | "active" on creation |
createdAt | number | Timestamp |
HasDispatch(sourceKey, sourceId)
- Purpose: Checks if an active dispatch exists for the given source.
- Arguments:
sourceKey(string) — source identifier key.sourceId(string) — source ID value.
- Returns:
boolean—trueif a non-done dispatch exists.
local exists = exports["sky_jobs_base"]:HasDispatch("player", "license:abc123")
if exists then
print("Active dispatch already exists")
end
Gallery
takeServerImage(rawDataUrl, cameraMetadata)
- Purpose: Uploads a base64 image to the configured image provider.
- Arguments:
rawDataUrl(string) — base64-encoded image data URL.cameraMetadata(table) — metadata about the camera/capture context.
- Returns:
boolean—trueon success,falseon failure.table | string— on success:{ data = { url, id, image_id } }. On failure: error message.
local ok, result = exports["sky_jobs_base"]:takeServerImage(imageData, {
type = "bodycam",
timestamp = os.time()
})
if ok then
print("Uploaded:", result.data.url)
end
External Garage Integration
These exports allow third-party garage systems to register and unregister vehicles so the trunk inventory and prop system works for externally-spawned job vehicles.
registerExternalVehicle(plate, jobName, model, netId, ownerSource, trunkCapacity)
- Purpose: Registers an externally-spawned vehicle in the sky_jobs_base vehicle tracking system. This enables trunk inventory, prop placement, and all trunk-related server callbacks for the vehicle.
- Arguments:
plate(string) — the vehicle license plate. Required.jobName(string) — the job this vehicle belongs to (e.g."ambulance","police"). Required.model(string?) — vehicle model name (e.g."ambulance"). Defaults to"unknown".netId(number?) — network ID of the spawned vehicle entity.ownerSource(number?) — server ID of the player who spawned the vehicle.trunkCapacity(number?) — trunk weight capacity. Defaults to50.
- Returns:
boolean—trueon success,falseif plate or jobName is missing.
-- After spawning the vehicle on the server:
local plate = GetVehicleNumberPlateText(vehicle)
local netId = NetworkGetNetworkIdFromEntity(vehicle)
exports["sky_jobs_base"]:registerExternalVehicle(
plate,
"ambulance",
"ambulance",
netId,
source,
80
)
External vehicles are not stored in the database. They only exist in memory and will be cleaned up on resource restart. Your garage system is responsible for its own persistence.
unregisterExternalVehicle(plate)
- Purpose: Removes an externally-registered vehicle from the tracking system. Call this when the vehicle is despawned or parked by the external garage.
- Arguments:
plate(string) — the vehicle license plate. Required.
- Returns:
boolean—trueon success,falseif plate is invalid.
exports["sky_jobs_base"]:unregisterExternalVehicle(plate)
Full Usage Example
-- When spawning the vehicle
RegisterNetEvent("mygarage:vehicleSpawned", function(plate, model, netId)
exports["sky_jobs_base"]:registerExternalVehicle(
plate, "ambulance", model, netId, source, 80
)
end)
-- When despawning / parking the vehicle
RegisterNetEvent("mygarage:vehicleDespawned", function(plate)
exports["sky_jobs_base"]:unregisterExternalVehicle(plate)
end)
-- After the vehicle entity exists on the client
local vehicle = NetToVeh(netId)
exports["sky_jobs_base"]:registerExternalTrunkVehicle(vehicle)
-- When despawning
exports["sky_jobs_base"]:unregisterExternalTrunkVehicle(vehicle)
Salary
These exports allow external resources (e.g. AFK scripts) to temporarily pause and resume salary payouts for a player, preventing paycheck farming.
pausePlayerSalary(playerId)
- Purpose: Pauses salary payouts for the given player. While paused, the player will not receive any automatic salary payments.
- Arguments:
playerId(number) — the server ID of the player. Required.
- Returns:
boolean—trueon success,falseif the player ID is invalid.
exports["sky_jobs_base"]:pausePlayerSalary(playerId)
resumePlayerSalary(playerId)
- Purpose: Resumes salary payouts for the given player after they were paused.
- Arguments:
playerId(number) — the server ID of the player. Required.
- Returns:
boolean—trueon success,falseif the player ID is invalid.
exports["sky_jobs_base"]:resumePlayerSalary(playerId)
isPlayerSalaryPaused(playerId)
- Purpose: Checks whether salary payouts are currently paused for the given player.
- Arguments:
playerId(number) — the server ID of the player.
- Returns:
boolean—trueif paused,falseotherwise.
local paused = exports["sky_jobs_base"]:isPlayerSalaryPaused(playerId)
Usage Example
-- When a player goes AFK
AddEventHandler("sky_afk:playerAFK", function(playerId)
exports["sky_jobs_base"]:pausePlayerSalary(playerId)
end)
-- When a player returns from AFK
AddEventHandler("sky_afk:playerReturned", function(playerId)
exports["sky_jobs_base"]:resumePlayerSalary(playerId)
end)
The pause state is stored in memory and automatically cleared when the player disconnects. No database changes are needed.
Support
Need help? Our support team is always ready to assist
Join Discord