Skip to content

Retro Police

All configuration is done in three open files: config.lua, config_framework.lua, and config_inventory.lua. This page covers the main config.lua in detail.


config.lua
Config.InteractionType = "target" -- "target" or "textui"
Config.Target = "ox_target" -- ox_target, qb-target (used when InteractionType = "target")
Config.TextUI = { -- (used when InteractionType = "textui")
interactionKey = 38, -- E key (control ID)
interactionDistance = 1.5,
visibleDistance = 4.0,
}
Config.DebugTargets = false -- Show target debug zones
Config.DebugPlayerLoad = false -- Debug player load events

Departments are the core organizational unit. Each department has a unique identifier, a display label, and a list of jobs that can access it.

config.lua
Config.DepartmentDefination = {
mr_police = {
label = 'Mission Row Police Department',
shortLabel = 'MRPD',
jobs = { 'police' }
},
sherif = {
label = 'Sherif Department',
shortLabel = 'Sherif',
jobs = { 'sherif' }
}
}

Each department entry in Config.Departments specifies which features to activate and their per-department settings. Features listed in the features array must have a matching config block below.

config.lua
Config.Departments = {
{
connectedDepartment = 'mr_police', --> Config.DepartmentDefination
features = {
"dutySystem",
"personalLocker",
"armorySystem",
"loadoutPackages",
"vehicleGarage",
"jailAndUtils",
"evidence",
"spikeSystem",
"megaphoneSystem", -- ONLY PMA-VOICE
"propSystem",
"shootingRange",
"drivingParkour",
"headclothSystem"
},
-- Feature configs follow below...
}
}

config.lua:dutySystem
dutySystem = {
coords = vec3(-1037.99, -764.78, 19.05), -- Interaction Zone
size = vec3(1, 1, 1), -- For target size vector3
rotation = 0, -- For target rotation
useClotheLoadout = true, -- Allow officers to pick a clothing loadout
loadouts = { "police" }, -- References Config.LoadoutOutfits keys
useItemLoadout = true, -- Allow saving/loading item loadouts
itemLoadoutBlacklistToWhitelist = false, -- Blacklist to Whitelist selector
itemLoadoutBlacklistIgnore = true, -- Ignore items selector
itemLoadoutBlacklist = { "phone" }, -- Blacklist item list
itemLoadoutLimit = nil, -- Max different items in a loadout (nil = no limit | 5 = limit 5 loadouts)
useDutyControl = true, -- Toggle on/off duty at this location
dutyControl = {
coords = vec3(-1037.99, -764.78, 19.05), -- Interaction Zone
size = vec3(1, 1, 1), -- For target size vector3
rotation = 0, -- For target rotation
}
}
config.lua:personalLocker
personalLocker = {
coords = vec3(-1035.43, -766.2, 18.87),
size = vec3(1, 1, 1),
rotation = 0,
weight = 1000 * 100, -- 100kg
slots = 100,
}
config.lua:armorySystem
armorySystem = {
coords = vec3(-1034.31, -769.15, 18.14), -- Interaction Zone
size = vec3(1, 1, 1), -- For target size vector3
rotation = 0, -- For target rotation
shopItems = {
{ name = 'water', price = 10 }, -- Item name, Item price
{ name = 'phone', price = 1 }, -- Item name, Item price
}
}

Pre-built gear sets that officers can purchase. Supports clothing assignment, pricing, and grade restrictions.

config.lua:loadoutPackages
loadoutPackages = {
coords = vec3(-1037.99, -764.78, 19.05), -- Interaction Zone
size = vec3(1, 1, 1), -- For target size vector3
rotation = 0, -- For target rotation
packages = {
{
label = "Police Officer", -- Package Label
items = {
{ name = "weapon_pistol", count = 1 }, -- Item name, Item count
{ name = "radio", count = 1 }, -- Item name, Item count
},
clothing = 'police.[Trooper Tan]', -- Config.LoadoutOutfits key.[Outfit Name]
price = 1000,
payType = "bank", -- or "cash"
gradeRequired = 0 -- nil for no restriction
}
}
}
config.lua:vehicleGarage
vehicleGarage = {
vehiclePutCoords = vec3(-1040.54, -769.8, 19.05), -- Vehicle store coords
vehicleSpawnCoords = vec4(-1040.53, -769.8, 19.05, 148.53), -- Vehicle spawn coords (vec4 or vec4[])
visibleDistance = 4, -- Marker visible distance
interactionDistance = 1.5, -- Interaction distance
payType = 'cash', -- Payment type ("bank" or "cash")
showMarker = true, -- Show marker
plateFormat = "PO%s", -- Plate number format (nil for default)
perPlayerLimit = 5, -- Max active vehicles per player (nil = unlimited)
spawnList = Config.GeneralVehicleSpawnList
}
-- Vehicle spawn list example:
Config.GeneralVehicleSpawnList = {
{ model = "police", label = "Police Cruiser", price = 10, grade = 0 },
{ model = "police2", label = "Police Cruiser 2" },
}

This is the largest feature block, containing drag, cuff, take-in/take-out vehicle, and jail systems.

config.lua:jailAndUtils
jailAndUtils = {
enableDragSystem = true, -- Enable drag system
enableTakeinTakeoutVehicleSystem = true, -- Enable take-in/take-out vehicle system
enableCuffSystem = true, -- Enable cuff system
enableJailSystem = true, -- Enable jail system
dragSystem = {
command = "drag_police", -- Command to drag player
-- shortcutKey = "F6", -- Optional key binding
},
takeinTakeoutVehicleSystem = {
command = "takevehicle_police", -- Command to take-in/take-out vehicle
useSeatSelectorOption = true, -- Use seat selector option
-- shortcutKey = "F7", -- Optional key binding
},
cuffSystem = {
command = "cuff_police", -- Command to cuff player
item_needs_cuff = "phone", -- Optional item required to cuff
-- item_needs_uncuff = "phone", -- Optional item required to uncuff
item_remove = true, -- Remove item on use
-- shortcutKey = "F9", -- Optional key binding
cuffProgressDuration = { -- Duration per cuff type (ms)
front = 3000,
back = 3000,
},
},
jailSystem = {
command = "jail_police", -- Command to jail player
-- shortcutKey = "F10", -- Optional key binding
},
}
config.lua:evidence
evidence = {
processZones = {
vec3(-1043.04, -763.71, 19.16),
vec3(-1043.96, -765.37, 19.19)
},
deleteEvidenceGrade = 1 -- Minimum grade to delete evidence (or false)
}
config.lua:spikeSystem
spikeSystem = {
usageLimit = 5, -- Max spikes (nil = unlimited)
limitUsingPerPlayer = true, -- Per-player or per-department limit
deleteTime = 1000 * 60 * 60, -- Auto-delete after 1 hour (nil = never)
usageType = "command", -- "command" or "item"
usageDefinition = "spikes", -- Command or item name
onUseRemove = true, -- Remove item on use (item mode only)
restrictions = {
allowDeployInVehicle = false, -- Allow deploying spikes from a vehicle
perUsageCD = 1000, -- Cooldown between deployments (ms)
usingProgress = 2000, -- Progress bar duration (ms or nil)
onGround = true -- Must be on ground
},
remoteType = {
boxModel = 'rs_police_scase', -- Remote spike box model
maxDistance = 100.0, -- Max distance to deploy spikes (Make sure you stay within the OneSync range)
warningDuration = 60000, -- Warning duration (ms)
keys = {
cancel = 73, -- X key
activate = 191, -- ENTER key
},
},
}
config.lua:megaphoneSystem
megaphoneSystem = {
command = "p_megaphone", -- Command to use megaphone
-- shortcutKey = "LALT", -- Optional key binding
onlyAbleUseInVehicle = true, -- Only able to use in vehicle
strictVehicleCheck = true, -- Auto-off when exiting vehicle
useBetweenCd = 5000, -- Cooldown between uses (ms)
-- usageDurationLimit = 10000, -- Max usage duration (ms)
-- ableExportFunctions = true -- Enable exports for other scripts
}
config.lua:propSystem
propSystem = {
command = "p_prop", -- Command to use prop placer
deleteOnLogout = false, -- Delete props on logout
useBetweenCd = 3500, -- Cooldown between uses (ms)
spawnLimit = 20, -- Max props per player (nil = unlimited)
openMenuPreChecks = function(framework) return true end,
onDeploy = function(framework, prop) return true end,
onRemove = function(framework, prop) return true end,
propList = {
{ label = "Cone 1", model = `prop_mp_cone_01` },
{ label = "Barrier 1", model = `prop_barrier_work05` },
{ label = "Evidence Police Tape", model = `rs_police_ptape` },
{ label = "Evidence Marker", model = 'rs_police_evmarker', variations = 20 },
-- ... more props
}
}
config.lua:shootingRange
shootingRange = {
command = "shootingrange", -- Command to use shooting range
maxDistance = 200.0, -- Max distance to use shooting range
showLeaderboards = true, -- Show leaderboards
uiType = "advanced", -- "default" or "advanced"
practiceDuration = 60000, -- 1 minute duration (in ms)
targetModel = `prop_range_target_01`, -- Target model
rangeCoords = {
vec4(-1653.1, 62.81, 62.87, 244.09),
vec4(-1654.18, 60.34, 62.88, 243.4),
},
targetOffsets = {
head = { pos = vec3(0.0, -0.04, -0.7), rot = vec3(0.0, 0.0, 0.0) },
body = { pos = vec3(0.0, -0.04, -1.2), rot = vec3(0.0, 0.0, 0.0) }
},
hitAreaMultiplier = 1.0, -- Hit calculations area multiplier
}
config.lua:drivingParkour
drivingParkour = {
command = "drivingparkour", -- Command to use Driving Parkour
cancelCommand = "cancelparkour", -- Command to cancel it
uiType = "advanced", -- "drawtext" or "advanced"
startProximityDistance = 10.0, -- Must be this close to start
props = {
start = `r_p_barrel_start`, -- Start props
checkpoint = `r_p_barrel_checkpoint` -- Checkpoint props
},
defaultGateWidth = 6.0, -- Default props gap
routeMarkerEnabled = true, -- Show 3d markers
}
config.lua:headclothSystem
headclothSystem = {
usageType = "command", -- "command" or "item"
usageDefinition = "headbag", -- Command name or item name
onUseRemove = true, -- Remove item on use (item mode)
-- shortcutKey = "LALT", -- Optional key binding
}

These systems are configured globally and apply across all departments.

config.lua:Prison System
Config.JailCoords = vec3(1691.43, 2564.47, 45.56)
Config.JailExitCoords = vec3(1846.19, 2585.89, 45.67)
Config.JailZoneDistance = 100 -- To detect escape must be higher values
Config.JailTimeInterval = 1000 * 60 -- 1 minute per jail tick
Config.PrisonJobs = {
enabled = true, -- Enable prison jobs
advancedVersion = false, -- Manual release via prison phone target
minigame_needed = true, -- Minigame needed to jobs
minigame_difficulty = 'easy', -- 'easy', 'medium', 'hard'
timeReduction = 1, -- Minutes reduced per completed task
cooldown = 10000, -- Cooldown between tasks (ms)
shitCleaning = {
enabled = true,
progressDuration = 8000,
locations = { vec3(1702.13, 2551.9, 44.56), --[[ ... ]] },
},
groundCleaning = { enabled = true, --[[ similar to above ]] },
cooking = { enabled = true, progressDuration = 15000 },
cafeteria = {
enabled = true,
coords = vec3(1716.26, 2554.38, 43.78),
payType = 'cash',
items = {
{ name = 'bread', label = 'Bread', price = 5, icon = 'fas fa-bread-slice' },
{ name = 'water', label = 'Water', price = 3, icon = 'fas fa-bottle-water' },
},
},
inventoryClear = {
enabled = true, -- Enable inventory clear
returnable = false, -- Return items to player after release
returnCoords = vec3(1846.76, 2583.64, 45.69),
excludeItems = { 'phone', 'id_card' },
},
}
config.lua:Cuff Settings
Config.CuffBreakMinigame = {
enable = true, -- Enable cuff break minigame
iterations = 2, -- Number of iterations
difficulty = 'hard', -- 'easy', 'medium', 'hard'
}
Config.CuffDisableKeys = { 24, 25, 47, 58, 140, 141, 142, 263, 264 }
Config.CuffPropOffset = {
front = { pos = vec3(-0.056, 0.008, 0.073), rot = vec3(-2.82, 75.07, -357.51) },
back = { pos = vec3(-0.021, 0.049, 0.035), rot = vec3(41.7, 126.49, -63.94) },
}
Config.OnCuff = function()
-- Called when a player is cuffed
end
Config.OnUnCuff = function()
-- Called when a player is uncuffed
end
Config.OnCuffLoop = function()
-- Called every tick while cuffed
end
config.lua:Evidence Config
Config.EvidenceConfig = {
evidenceCreationSystem = {
enable = true,
item = "evidence_bag", -- Evidence item
showWeaponName = true, -- Reveal the name of the fired weapon
disableSpamDamage = true, -- Disable spam damage
pickupDuration = 5000, -- Pickup evidence duration (ms)
deleteEvidenceAfter = 30 * 60 * 1000, -- 30 minutes
pickupReq = true, -- Requires flashlight
creationTypes = { "blood", "bullet", "vehicle_fragment" },
playerNameReveals = {
["blood"] = true, -- Always reveal identity
["bullet"] = 60, -- 60% chance
["vehicle_fragment"] = false,
},
},
evidenceProcessingSystem = {
enable = true,
processDuration = 5000,
},
evidenceAutoDeleteSystemDB = {
enable = true,
deleteEvidenceAfter = 30 -- Days
}
}
config.lua:GSR & Taser
Config.GSRSystem = {
enable = true,
autoCleanDuration = 2, -- Hours
cleanCommand = "gsrclean", -- Command to clean gsr
testCommand = "gsrtest", -- Command to test gsr
testCommandJobs = { "police", "sherif" },
blacklistJobs = { "police", "sherif" },
}
Config.TaserSystem = {
enable = true,
stunTime = { 5000, 8000 }, -- Random range in ms (or single number)
stunWeapons = {
[`WEAPON_STUNGUN`] = true,
}
}
config.lua:Shield System
Config.Shields = {
enabled = true,
models = {
[1] = { model = 'rs_police_shield1', durability = 0 }, -- 0 = indestructible
[2] = { model = 'rs_police_shield2', durability = 1000, durabilityType = 'prop_damage', damagePerHit = 50 }, -- durabilityType: "collision_off" or "prop_damage"
},
items = {
{ item = "police_shield", variation = 1 },
{ item = "police_shield_light", variation = 2 },
},
allowedWeaponGroups = { `GROUP_UNARMED`, `GROUP_PISTOL` },
keys = {
cancel = 73, -- X key
toggleLight = 74, -- H key (variation 2 only)
},
}
config.lua:Headcloth
Config.HeadclothSystem = {
propModel = 'rs_police_headbag1',
propBone = 31086, -- SKEL_Head
propOffset = vec3(-0.59, -0.04, -0.02),
propRotation = vec3(2.9, 87.5, -182.5),
fadeInDuration = 500, -- NUI effect (ms)
fadeOutDuration = 400, -- NUI effect (ms)
disabledControls = { 199, 200, 21, 22 }, -- Pause, Sprint, Jump
}

Define clothing loadouts per model (male/female) with grade restrictions:

config.lua:LoadoutOutfits
Config.LoadoutOutfits = {
police = {
[joaat("mp_m_freemode_01")] = { -- Male
{
name = "Short Sleeve",
outfitData = {
["pants"] = { item = 24, texture = 0 },
["arms"] = { item = 19, texture = 0 },
["t-shirt"] = { item = 58, texture = 0 },
["torso2"] = { item = 55, texture = 0 },
["shoes"] = { item = 51, texture = 0 },
-- ... more components
},
grades = { 0, 1, 2, 3, 4 },
},
},
[joaat("mp_f_freemode_01")] = { -- Female
-- Same structure as male
}
},
}

All display text is in the Config.Language table. Edit values directly to translate:

config.lua:Language
Config.Language = {
dutySystem = {
dutyControl = "Duty On/Off",
wearLoadout = "Wear Loadout",
itemLoadout = "Item Loadout",
dutyOn = "You are now on duty!",
dutyOff = "You are now off duty!",
-- ...
},
personalLocker = { openPersonalLocker = "Open Personal Locker" },
armorySystem = { openArmory = "Open Armory" },
vehicleGarage = { openVehicleGarage = "[E] Vehicle Garage" },
jailAndUtils = { ... },
shields = { ... },
evidence = { ... },
gsrSystem = { ... },
spikeSystem = { ... },
shootingRange = { ... },
drivingParkour = { ... },
propSystem = { ... },
-- See config.lua for the full reference
}