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.
General Settings
Section titled โGeneral Settingsโ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 zonesConfig.DebugPlayerLoad = false -- Debug player load eventsDepartment Definition
Section titled โDepartment Definitionโ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.DepartmentDefination = { mr_police = { label = 'Mission Row Police Department', shortLabel = 'MRPD', jobs = { 'police' } }, sherif = { label = 'Sherif Department', shortLabel = 'Sherif', jobs = { 'sherif' } }}Department Features
Section titled โDepartment Featuresโ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.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... }}Feature Configurations
Section titled โFeature ConfigurationsโDuty System
Section titled โDuty Systemโ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 }}Personal Locker
Section titled โPersonal LockerโpersonalLocker = { coords = vec3(-1035.43, -766.2, 18.87), size = vec3(1, 1, 1), rotation = 0, weight = 1000 * 100, -- 100kg slots = 100,}Armory System
Section titled โArmory Systemโ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 }}Loadout Packages
Section titled โLoadout PackagesโPre-built gear sets that officers can purchase. Supports clothing assignment, pricing, and grade restrictions.
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 } }}Vehicle Garage
Section titled โVehicle Garageโ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" },}Jail & Utils
Section titled โJail & UtilsโThis is the largest feature block, containing drag, cuff, take-in/take-out vehicle, and jail systems.
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 },}Evidence
Section titled โ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)}Spike System
Section titled โSpike Systemโ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 }, },}Megaphone System
Section titled โMegaphone Systemโ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}Prop System
Section titled โProp Systemโ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 }}Shooting Range
Section titled โShooting Rangeโ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}Driving Parkour
Section titled โDriving Parkourโ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}Headcloth System
Section titled โHeadcloth Systemโ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}Global Systems
Section titled โGlobal SystemsโThese systems are configured globally and apply across all departments.
Jail & Prison Jobs
Section titled โJail & Prison Jobsโ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 valuesConfig.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' }, },}Cuff Configuration
Section titled โCuff Configurationโ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 cuffedend
Config.OnUnCuff = function() -- Called when a player is uncuffedend
Config.OnCuffLoop = function() -- Called every tick while cuffedendEvidence System
Section titled โEvidence Systemโ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 }}GSR & Taser
Section titled โ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, }}Shield System
Section titled โ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) },}Headcloth (Head Bag) Settings
Section titled โHeadcloth (Head Bag) Settingsโ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}Clothing Outfits
Section titled โClothing OutfitsโDefine clothing loadouts per model (male/female) with grade restrictions:
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 } },}Language / Localization
Section titled โLanguage / LocalizationโAll display text is in the Config.Language table. Edit values directly to translate:
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}