Browse docs

Server Exports

Server-side exports provided by the Sky Police Job resource.

Dispatch

Create a dispatch for the MDT Tablet.

exports["sky_jobs_base"]:createDispatch(
    "Suspicious activity", -- title
    "Caller reports suspicious behavior near Legion Square.", -- description
    GetEntityCoords(PlayerPedId()), -- coords (vector3)
    { "police", "sheriff" } -- jobs
)

Restraints

These are compatibility forwards to the shared sky_jobs_base interaction system. Police jobs from Config.Jobs are registered automatically. For any other job resource, call registerInteractionJobs from a server script before using these exports. The acting player's job, duty policy, target distance/state, and configured item requirements are validated server-side; calling a Police Job export does not bypass them.

See the Sky Jobs Base server exports for registration, permissions, and the preferred shared exports.

Police keeps compatibility forwards for cuffs, zipties, and escort. Leg restraints and head bags are owned exclusively by Jobs Base; call the corresponding sky_jobs_base exports directly.

cuffPlayer(sourceId, targetId, cuffType?, options?)

  • Purpose: Applies cuffs or zipties to a target player from another resource.
  • Arguments:
    • sourceId (number): The server ID of the acting player.
    • targetId (number): The server ID of the target player.
    • cuffType (string?): "cuffs" (default) or "zipties".
    • options (table?):
      • ignoreItemCheck (boolean?) — skip the restraint item requirement and consumption.
      • allowSelf (boolean?) — allow sourceId == targetId.
  • Returns: boolean, string?true on success, otherwise false and a reason key.
local success, reason = exports["sky_policejob"]:cuffPlayer(sourceId, targetId, "cuffs", {
    ignoreItemCheck = false,
    allowSelf = false
})

uncuffPlayer(sourceId, targetId, options?)

  • Purpose: Removes cuffs or zipties from a target player.
  • Returns: boolean, string?.
local success, reason = exports["sky_policejob"]:uncuffPlayer(sourceId, targetId)

cutZipties(sourceId, targetId, options?)

  • Purpose: Cuts zipties from a target player.
  • Returns: boolean, string?.
local success, reason = exports["sky_policejob"]:cutZipties(sourceId, targetId)

isPlayerCuffed(targetId)

  • Purpose: Reports whether the target player is currently restrained.
  • Returns: boolean.
local cuffed = exports["sky_policejob"]:isPlayerCuffed(targetId)

Escort

escortToggle(sourceId, targetId)

  • Purpose: Starts or stops escorting the target player.
  • Returns: boolean, string?.
local success, reason = exports["sky_policejob"]:escortToggle(sourceId, targetId)

escortPutInVehicle(sourceId, targetId, netId?, seat?)

  • Purpose: Places the escorted player into a vehicle. Without netId the closest valid vehicle is used.
  • Returns: boolean, string?.
local success, reason = exports["sky_policejob"]:escortPutInVehicle(sourceId, targetId)

escortTakeOutVehicle(sourceId, targetId)

  • Purpose: Takes the escorted player out of a vehicle.
  • Returns: boolean, string?.
local success, reason = exports["sky_policejob"]:escortTakeOutVehicle(sourceId, targetId)

Jail

isPlayerInPrison(playerId)

  • Purpose: Reports whether the player is currently serving a jail sentence.
  • Returns: boolean.
local imprisoned = exports["sky_policejob"]:isPlayerInPrison(playerId)

Devices and tracking

GetCctvCameras(jobName?)

  • Purpose: Returns the deployed CCTV cameras, optionally filtered to one police job.
  • Returns: table — camera records.
local cameras = exports["sky_policejob"]:GetCctvCameras("police")

GetSpeedcamCameras()

  • Purpose: Returns the deployed speed cameras.
  • Returns: table — camera records.
local speedcams = exports["sky_policejob"]:GetSpeedcamCameras()

GetMapTrackers()

  • Purpose: Returns the currently broadcast GPS trackers and ankle monitors (the data shown on the police map).
  • Returns: table — tracker records.
local trackers = exports["sky_policejob"]:GetMapTrackers()

GetWheelClampOnVehicle(vehicleOrNetId, plate?)

  • Purpose: Returns the wheel clamp attached to a vehicle, resolved by entity/net ID or plate.
  • Returns: table | nil{ attached = true, netId, plate, wheelBone } or nil when no clamp is attached.
local clamp = exports["sky_policejob"]:GetWheelClampOnVehicle(netId)
if clamp then
    print(clamp.plate, clamp.wheelBone)
end

Usable items

useItem(source, itemName, payload?)

  • Purpose: Triggers a registered Police-specific usable-item handler for a player. Use this when your inventory or another resource wants to run a Police item such as gps_tracker without going through RegisterUsableItem. Shared restraint items belong to sky_jobs_base.
  • Returns: booleantrue when a handler ran successfully; prints an English debug message when no handler is registered for the item.
exports["sky_policejob"]:useItem(source, "gps_tracker")

Manual tablet registry exports

When Config.PoliceTablet.autoFillFromDatabase.citizens = false and/or Config.PoliceTablet.autoFillFromDatabase.vehicles = false, other scripts can manage the manual tablet registry entries through server exports.

If the matching autofill setting is still enabled, these exports return:

{
    success = false,
    error = "auto_fill_enabled"
}

Citizens

Create a manual citizen profile entry.

server.lua
local result = exports["sky_policejob"]:RegisterCitizen({
    identifier = "char1:abcd",
    name = "Max Mustermann",
    gender = "male",
    dob = "1999-04-15",
    job = "Unemployed",
    tags = { "Wanted" },
    notes = {
        { title = "Note", text = "Manual record" }
    },
    fingerprint = "FP-12345",
    dna = "DNA-12345"
})

Update an existing manual citizen profile entry.

server.lua
local result = exports["sky_policejob"]:UpdateCitizen({
    identifier = "char1:abcd",
    name = "Max Mustermann",
    image_url = "https://example.com/citizen.png",
    tags = { "Wanted", "VIP" }
})

Read or delete a manual citizen profile entry.

server.lua
local citizen = exports["sky_policejob"]:GetCitizen("char1:abcd")
local deleted = exports["sky_policejob"]:DeleteCitizen("char1:abcd")

Supported citizen payload fields:

  • identifier
  • name
  • gender
  • dob
  • job
  • image_url or url
  • image_id
  • tags
  • notes
  • fingerprint
  • dna

Vehicles

Create a manual vehicle profile entry.

server.lua
local result = exports["sky_policejob"]:RegisterVehicle({
    plate = "B-EMS-12",
    model = "ambulance",
    owner_name = "Sky Medical",
    owner_identifier = "society:ambulance",
    color = {
        primary = "white",
        secondary = "red"
    }
})

Update an existing manual vehicle profile entry.

server.lua
local result = exports["sky_policejob"]:UpdateVehicle({
    plate = "B-EMS-12",
    tags = { "Fleet" },
    cases = { "CASE-1024" },
    notes = {
        { title = "Storage", text = "Assigned to EMS fleet" }
    }
})

Read or delete a manual vehicle profile entry.

server.lua
local vehicle = exports["sky_policejob"]:GetVehicle("B-EMS-12")
local deleted = exports["sky_policejob"]:DeleteVehicle("B-EMS-12")

Supported vehicle payload fields:

  • plate
  • model
  • ownerName or owner_name
  • ownerIdentifier or owner_identifier
  • color
  • image_url or url
  • image_id
  • tags
  • notes
  • cases

Weapons

Create or update a weapon entry in the weapon registry used by the tablet and the weapon checks.

server.lua
local result = exports["sky_policejob"]:RegisterWeapon({
    serialNumber = "SN-4815-1623",
    model = "WEAPON_PISTOL",
    weaponType = "Pistol",
    manufacturer = "Hawk & Little",
    caliber = "9mm",
    ownerIdentifier = "char1:abcd",
    ownerName = "Max Mustermann",
    registrationStatus = "valid",
    expiresAt = "2027-01-01"
})

if result.success then
    print(result.data.weapon.serial_number)
end

Supported weapon payload fields:

  • serialNumber or serial_number (required)
  • model (required)
  • weaponType or weapon_type
  • manufacturer
  • caliber
  • ownerIdentifier or owner_identifier
  • ownerName or owner_name
  • registrationStatus or registration_statusvalid, expired, revoked, lost_stolen, or evidence_hold
  • registeredAt or registered_at (YYYY-MM-DD)
  • expiresAt or expires_at (YYYY-MM-DD)

Salary

Pause or resume salary payouts for police employees. These exports are provided by sky_jobs_base and work for all job types.

pausePlayerSalary(playerId)

  • Purpose: Pauses salary payouts for the given player.
  • Returns: booleantrue on success.

resumePlayerSalary(playerId)

  • Purpose: Resumes salary payouts for the given player.
  • Returns: booleantrue on success.

isPlayerSalaryPaused(playerId)

  • Purpose: Checks whether salary payouts are currently paused.
  • Returns: booleantrue if paused.
exports["sky_jobs_base"]:pausePlayerSalary(playerId)
exports["sky_jobs_base"]:resumePlayerSalary(playerId)
local paused = exports["sky_jobs_base"]:isPlayerSalaryPaused(playerId)
See the Sky Jobs Base Server Exports for full documentation and usage examples.

Support

Need help? Our support team is always ready to assist

Join Discord