Config = { -- ══════════════════════════════════════════════════════════════════════════════ -- [[ DEBUG & LOCALE ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Master debug toggle — set false to silence all debug output Debug = false, ---@type boolean Append source file path and line number to debug output EnhancedDebug = true, ---@type boolean Debug output for the inventory module DebugInventory = false, ---@type boolean Debug output for the clothing module DebugClothing = false, ---@type boolean Debug output for the API system DebugAPI = false, ---@type boolean Debug output for environment/world interactions DebugEnviroment = false, ---@type boolean Verbose error mode — makes runtime errors easier to trace ErrorDebug = false, ---@type boolean Debug player load/unload lifecycle only; suppresses all other debug channels DebugPlayerLoad = false, ---@type string[] Active debug channels — remove a string to silence that channel --- Available: PLAYER_LOAD | JOB | CUFFS | NETWORK | INFO | CRITICAL | SUCCESS | ERROR | API | DEBUG | MENU DebugLevel = { 'PLAYER_LOAD', 'JOB', 'CUFFS', 'NETWORK', 'INFO', 'CRITICAL', 'SUCCESS', 'ERROR', 'API', 'DEBUG', 'MENU', }, ---@type string Language for all script text — currently only 'en' is supported Locale = 'en', -- ══════════════════════════════════════════════════════════════════════════════ -- [[ AUTO-DETECTION ]] -- ⚠️ ESX / QBCore / QBOX users can leave every AUTO_DETECT value unchanged. -- ⚠️ Third-party resources: https://documentation.rcore.cz/paid-resources/rcore_prison -- ══════════════════════════════════════════════════════════════════════════════ ---@type any Framework integration constant — leave as AUTO_DETECT unless you need to force a specific framework --- AUTO_DETECT – recommended, detected at runtime --- Framework.ESX – es_extended --- Framework.QBCore – qb-core --- Framework.QBOX – qbx_core --- Framework.NDCore – ND_Core --- STANDALONE – no framework; manual integration required Framework = AUTO_DETECT, ---@type any Inventory integration constant — leave as AUTO_DETECT unless you need to force a specific inventory --- AUTO_DETECT – recommended, detected at runtime --- Inventories.ESX – es_extended | Inventories.QB – qb-inventory | Inventories.PS – ps-inventory --- Inventories.QS – qs-inventory | Inventories.OX – ox_inventory | Inventories.LJ – lj-inventory --- Inventories.MF – mf-inventory | Inventories.CODEM – codem-inventory --- Inventories.TGIANN – tgiann-inventory | Inventories.ORIGEN – origen-inventory --- Inventories.CORE – core_inventory | STANDALONE – manual integration required --- Note: codem/qs-inventory handle money-as-item internally (unsupported edge cases) --- Note: qb-inventory does not support money-as-item by default; use ox_inventory instead --- Note: tgiann-inventory clears items via ClearInventory export; money-as-item unsupported Inventories = AUTO_DETECT, ---@type any Prison map constant — leave as AUTO_DETECT unless you need to force a specific map --- AUTO_DETECT – recommended, detected at runtime --- Map.RCORE | Map.PROMPT (V1) | Map.PROMPT_FULL (V2) | Map.UNCLE | Map.ALCATRAZ --- Map.YBN | Map.DESERTOS | Map.GABZ | STANDALONE – loads data/presets/standalone.lua Map = AUTO_DETECT, ---@type any Interaction system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime --- Interactions.OX – ox_target (do NOT force if using crm-target emulation) --- Interactions.QB – qb-target | Interactions.MV – mv-target --- Interactions.NONE – distance-based [E] prompt | STANDALONE – same as NONE Interactions = Interactions.OX, ---@type any Database connector constant — leave as AUTO_DETECT unless you need to force a specific connector --- AUTO_DETECT – recommended, detected at runtime --- Database.OX – oxmysql | Database.MYSQL_ASYNC – mysql-async | Database.GHMATTI – ghmattimysql --- STANDALONE – no connector found Database = Database.OX, ---@type any Clothing system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime --- Cloth.RCORE – rcore_clothing | Cloth.ESX – skinchanger | Cloth.QB – qb-clothing --- Cloth.IAPPEARANCE | Cloth.TGIANN – tgiann-clothing --- Cloth.CODEM – codem-appearance (Experimental) | Cloth.CRM – crm-appearance (Experimental) --- Cloth.WASABI – fivem-appearance wasabi fork (Experimental) Cloth = AUTO_DETECT, ---@type any Phone resource constant — leave as AUTO_DETECT unless you need to force a specific resource --- AUTO_DETECT – recommended, detected at runtime --- Phones.LB – lb_phone | STANDALONE – phone booths will be non-functional Phones = AUTO_DETECT, ---@type any Notification system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime --- Notifies.BRUTAL – brutal_notify | Notifies.PNOTIFY – qb-pNotify | Notifies.OX – ox_lib --- Notifies.ESX_NOTIFY – esx_notify | Notifies.QBCORE – qb-core | Notifies.ESX – es_extended --- Notifies.MYTHIC – mythic_notify | Notifies.OKOK – okokNotify | Notifies.SPICY_NOTIFY – stNotify --- STANDALONE – uses native notifications bundled in rcore_prison Notifies = Notifies.OX, ---@type any TextUI system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime --- TextUI.RCORE – rcore_prison built-in | TextUI.OX – ox_lib | TextUI.QBCORE – qb-core --- TextUI.ESX – esx_textui | STANDALONE – no TextUI resource found TextUI = TextUI.OX, ---@type any Menu system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime --- Menus.RCORE – rcore_prison built-in | Menus.ESX_CONTEXT – esx_context --- Menus.OX – ox_lib context | Menus.QB – qb-menu | STANDALONE – rcore_prison built-in Menus = Menus.OX, ---@type any Dispatch system constant — leave as AUTO_DETECT unless you need to force a specific system --- AUTO_DETECT – recommended, detected at runtime | STANDALONE – manual integration required --- Dispatches.RCORE | .QS | .PS | .CD | .LB | .CORE | .CODEM --- Dispatches.LOVE_SCRIPTS | .ORIGEN | .TK | .DUSA | .KARTIK --- --- How to test: open txAdmin → Live Console → run `rcore_prison_test_dispatch` --- Requirements: dispatch resource running, logged in as 'police', dispatch starts BEFORE rcore_prison Dispatches = Dispatches.CD, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ADMIN & PERMISSION SETTINGS ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type table Admin group names per framework — members can bypass job checks when AllowAdminGroupsUseJailCommands = true FrameworkAdminGroups = { [Framework.ESX] = { 'superadmin', 'admin' }, [Framework.QBCore] = { 'god', 'admin' }, [Framework.QBOX] = { 'god', 'admin' }, }, ---@type boolean When true, members of FrameworkAdminGroups may use all prison commands regardless of their job AllowAdminGroupsUseJailCommands = false, ---@type boolean Require the officer to be within RestrictDistance of the target inmate to use jail commands RestrictCommandsForDistance = true, ---@type number Maximum distance (metres) between officer and inmate for jail commands to execute RestrictDistance = 10.0, ---@type boolean Register chat auto-complete suggestions for all prison commands RegisterChatSuggestions = true, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PRISONER BEHAVIOUR ]] -- ══════════════════════════════════════════════════════════════════════════════ Prisoners = { ---@type boolean When true, players whose job is in CompanionJobList are not attacked by prison NPCs Companion = true, ---@type number How often the companion job list is refreshed client-side (seconds) CompanionRefreshCycleTime = 1.5, ---@type table Jobs treated as companions — immune to NPC attacks inside prison CompanionJobList = { ['police'] = true, ['sheriff'] = true, ['ambulance'] = true, }, ---@type boolean Strip the player's job when they are jailed (supports ESX and QBCore) RemovePlayerJobWhenJailed = true, ---@type string Job name assigned to the player when RemovePlayerJobWhenJailed fires RemovePlayerSetDefaultJob = 'unemployed', ---@type number Grade index assigned with the default job above RemovePlayerSetDefaultGrade = 1, ---@type table Only jobs listed here are stripped on jail — all others are kept RemoveJobList = { ['police'] = true, ['ambulance'] = true, ['sheriff'] = true, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PLAYER LOAD / UNLOAD EVENTS ]] -- Maps framework-specific events to rcore_prison's internal lifecycle hooks. -- Add extra event strings to any array if your setup fires multiple events. -- ══════════════════════════════════════════════════════════════════════════════ ---@type table PlayerLoad = { [Framework.ESX] = { load = { client = { 'esx:playerLoaded' }, server = { 'esx:playerLoaded' } }, unload = { client = { 'esx:onPlayerLogout' }, server = { 'esx:playerLogout', 'esx:playerDropped' } }, }, [Framework.QBCore] = { load = { client = { 'QBCore:Client:OnPlayerLoaded' }, server = { 'QBCore:Server:OnPlayerLoaded' } }, unload = { client = { 'QBCore:Client:OnPlayerUnload' }, server = { 'QBCore:Server:OnPlayerUnload' } }, }, [Framework.QBOX] = { load = { client = { 'QBCore:Client:OnPlayerLoaded' }, server = { 'QBCore:Server:OnPlayerLoaded' } }, unload = { client = { 'QBCore:Client:OnPlayerUnload', 'qbx_core:client:playerLoggedOut' }, server = { 'QBCore:Server:OnPlayerUnload', 'qbx_core:server:playerLoggedOut' } }, }, [Framework.NDCore] = { load = { client = { 'ND:characterLoaded' }, server = { 'ND:characterLoaded' } }, unload = { client = { 'ND:characterUnloaded' }, server = { 'ND:characterUnloaded' } }, }, }, ---@type table Renamed framework event map — change only the right-hand value if you renamed an event FrameworkEvents = { ['QBCore:Client:OnJobUpdate'] = 'QBCore:Client:OnJobUpdate', ['esx:setJob'] = 'esx:setJob', ['esx_skin:getPlayerSkin'] = 'esx_skin:getPlayerSkin', ['skinchanger:loadSkin'] = 'skinchanger:loadSkin', ['skinchanger:getSkin'] = 'skinchanger:getSkin', ['skinchanger:loadClothes'] = 'skinchanger:loadClothes', ['qb-clothing:client:loadOutfit'] = 'qb-clothing:client:loadOutfit', ['qb-clothing:client:loadPlayerClothing'] = 'qb-clothing:client:loadPlayerClothing', }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ CLOTHING ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Set true to completely disable the clothing system (prisoner outfit will not be applied) DisableClothing = false, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ SENTENCE & TIME ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Allow prisoners to be released while they are in solitary confinement CanPrisonerBeReleasedWhenOnSolitary = true, ---@type any Sentence reduction mode constant --- SentenceTypes.OFFLINE – sentence ticks down even when the prisoner is disconnected --- SentenceTypes.ONLINE – sentence only reduces while the prisoner is on the server ReduceSentenceType = SentenceTypes.ONLINE, ---@type boolean Show remaining jail time on the player's HUD RenderJailTime = true, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ BLIPS & MAP ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Show NPC guard blips on the minimap RenderNPCBlips = false, ---@type boolean When true blips are visible to ALL players; when false only prisoners see them RenderBlipsForEverybody = false, ---@type boolean Show the full prison map overlay for every player; when false only prisoners see it DisplayPrisonMapForEverybody = false, ---@type boolean Render the prison map on the world map (~0.02 ms overhead) DisplayPrisonMap = true, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ NPC JAILING ]] -- ══════════════════════════════════════════════════════════════════════════════ JailByNPCSettings = { ---@type number Distance within which an NPC can jail a nearby player (metres) JailDistance = 10.0, ---@type number Default sentence length issued by NPCs (minutes) JailTime = 60, ---@type number Cooldown before the same ped can jail another player (minutes) ResetPedPool = 5, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ DISPATCH TRIGGERS ]] -- ══════════════════════════════════════════════════════════════════════════════ DispatchSettings = { ---@type boolean Fire a dispatch alert when an escape wall is destroyed — even if no NPC witnessed it InvokeWhenDestroyedWall = true, ---@type boolean Fire a dispatch alert when a prisoner exits the prison boundary after escaping InvokeWhenPlayerEscapePrison = true, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PRISON BREAK / ESCAPE ]] -- ══════════════════════════════════════════════════════════════════════════════ Escape = { ---@type table Per-escape-mod settings keyed by resource/script name ThirdParty = { ["prompt_prison_escape_dlc"] = { Alarm = { ---@type boolean Enable the alarm system for this escape mod Enable = true, ---@type boolean When true the alarm only fires based on TriggerChance UseChance = false, ---@type number Probability the alarm fires when UseChance = true (0–100) TriggerChance = 75, ---@type boolean Delay alarm start after trigger conditions are met AwaitedStartDelay = true, AwaitedStartDelayConfig = { ---@type boolean true = random delay between min/max; false = fixed StrictDelay UseRandomRange = false, ---@type number Fixed delay in seconds (used when UseRandomRange = false) StrictDelay = 8, ---@type number Minimum random delay in seconds (used when UseRandomRange = true) RandomMin = 10, ---@type number Maximum random delay in seconds (used when UseRandomRange = true) RandomMax = 30, }, }, Dispatch = { ---@type boolean Fire a dispatch alert when the player escapes via this mod EnableOnEscape = true, ---@type boolean Fire a dispatch alert when the escaped prisoner leaves the prison perimeter EnableOnFullyReleased = false, ---@type boolean When true the dispatch alert only fires based on TriggerChance UseChance = false, ---@type number Probability dispatch fires when UseChance = true (0–100) TriggerChance = 100, ---@type boolean Delay dispatch after trigger conditions are met AwaitedStartDelay = false, AwaitedStartDelayConfig = { ---@type boolean true = random delay between min/max; false = fixed StrictDelay UseRandomRange = false, ---@type number Fixed delay in seconds (used when UseRandomRange = false) StrictDelay = 5, ---@type number Minimum random delay in seconds (used when UseRandomRange = true) RandomMin = 5, ---@type number Maximum random delay in seconds (used when UseRandomRange = true) RandomMax = 15, }, }, ---@type string Internal resource name of the escape script ScriptName = "prompt_prison_escape", ---@type string Map/DLC name used to identify this escape configuration MapName = "prompt_prison_escape_dlc", ---@type string Escape pathway identifier used internally by the escape script PathWay = "toilets", Dealer = { ---@type boolean Include this escape item in the dealer shop Enable = true, ---@type string Inventory item name required to escape ItemName = "screwdriver", ---@type string Display label shown in the dealer shop ItemLabel = "Screw Driver", ---@type number Price in Config.EconomyItem units Cost = 45, }, }, }, ---@type number Minimum number of online officers required before a prison break can start RequiredPolice = 3, ---@type boolean Enforce the RequiredPolice check before a break attempt is allowed PoliceCheck = false, ---@type boolean Master toggle for the prison break system Enable = true, ---@type { r: number, g: number, b: number, a: number } RGBA colour of the escape interaction marker MarkerColor = { r = 255, g = 0, b = 0, a = 100 }, ---@type number NPC guard view cone angle in degrees ViewCone = 160, ---@type number Distance at which wall destruction state syncs to nearby clients (metres) WallLodSyncDistance = 150, ---@type boolean Automatically re-jail escapees who are caught AutoCatch = true, ---@type number Solitary sentence applied on re-capture when AutoCatch = true (minutes) SolitaryTime = 5, ---@type boolean Block all non-system escape routes (teleport exploits etc.) DisableBugEscape = true, ---@type boolean Clear the inmate stash when they successfully escape WhenEscapeRemoveInmateStash = false, ---@type number How often the out-of-bounds check runs (minutes) BugEscapeCycleTime = 1, ---@type number Distance at which guards can spot players (metres) ViewNPCDistance = 30, ---@type number Time for officers to repair a destroyed wall (seconds) RepairWallTime = 10, ---@type string Keybind for officers to repair destroyed walls RepairWallKey = 'H', ---@type string Keybind for inmates to interact with wire cutters InteractCuttersKey = 'E', ---@type number Automatic reset timer after a break attempt ends (minutes) ResetTime = 30, ---@type boolean Enable automatic state reset after ResetTime elapses EnableAutomaticReset = true, ---@type boolean Require ItemName to be in the inmate's inventory before they can attempt an escape NeedItem = true, ---@type string Inventory item name required to destroy escape walls ItemName = 'wire_cutter', ---@type string[] Jobs that receive a dispatch notification when an escape is attempted NotifyJobs = { 'police', 'leo' }, ---@type boolean Set true to DISABLE patrolling guard NPC spawns in the prison yard DisablePatrollingGuards = false, --- Experimental escape features — use at your own risk Experimental = { ---@type boolean Remove ItemName from inventory after a wall is destroyed RemoveCuttersAfterWallDestroyed = true, ---@type boolean true = 1 cutter covers 2 walls; false = 1 cutter per wall RemoveCuttersAfterSecondWall = true, ---@type boolean Show an active cutting animation/minigame sequence CuttingSequence = false, ---@type number Duration of the cutting sequence before the wall breaks (seconds) CuttingSequenceTime = 15, ---@type boolean Wipe the player's inventory when they successfully escape ClearPlayerInventoryWhenEscape = false, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ GUARDS ]] -- ══════════════════════════════════════════════════════════════════════════════ Guards = { ---@type boolean Jail ALL nearby citizens when any guard NPC is attacked EnableJailAllCitizensWhenAttackedGuard = false, ---@type number Sentence issued for attacking a guard (minutes) JailTime = 20, --- Experimental guard proximity checks Experimental = { ---@type number Radius used to detect if a player is close to a guard ped (metres) DistanceToGuard = 5.0, ---@type number Minimum player movement speed considered as "running into" a guard PlayerMovementSpeed = 0.5, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ STATE BAGS ]] -- ══════════════════════════════════════════════════════════════════════════════ Statebag = { ---@type boolean Use server-side state bags for player state synchronisation ServerPlayersUse = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ SOLITARY CONFINEMENT ]] -- ══════════════════════════════════════════════════════════════════════════════ Solitary = { ---@type number Radius to verify a prisoner is inside their assigned cell (metres) DistanceCheck = 10.0, ---@type number Radius to detect proximity to a guard for infraction checks (metres) GuardDistanceCheck = 10.0, ---@type number Default solitary duration when triggered by attacking a guard (minutes) Time = 3, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ RELEASE ]] -- ══════════════════════════════════════════════════════════════════════════════ Release = { ---@type boolean true = release at exit checkpoint; false = release at prison spawn point AtCheckpoint = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ELECTRICIAN / CIRCUIT MINIGAME ]] -- ══════════════════════════════════════════════════════════════════════════════ Circuit = { ---@type number Lives available per electrician attempt before failure Lifes = 3, ---@type number Circuit difficulty level 1–6 (ignored when EachJobLevelIncreaseDifficulty = true) Difficulty = 1, ---@type table NUI key labels shown on the circuit minigame help screen HelpKeys = { EXIT = 'BACKSPACE', ARROW_UP = 'ArrowUp', ARROW_DOWN = 'ArrowDown', ARROW_LEFT = 'ArrowLeft', ARROW_RIGHT = 'ArrowRight', }, ---@type table GTA control codes mapped to circuit navigation inputs Keybinds = { ['ARROW_UP'] = 172, ['ARROW_DOWN'] = 173, ['LEFT_ARROW'] = 174, ['RIGHT_ARROW'] = 175, ['BACKSPACE'] = 177, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ COMMANDS ]] -- Change the string values to rename commands. Do NOT rename the key names. -- ══════════════════════════════════════════════════════════════════════════════ Commands = { ---@type string Jail a player Jail = 'jail', ---@type string Unjail a player Unjail = 'unjail', ---@type string Start community service for a player Startcs = 'startcs', ---@type string Remove a player from community service Removecs = 'removecs', ---@type string Open the prison officer dashboard (MDT) JailCP = 'jailcp', ---@type string Stop the active prison break alarm StopAlarm = 'stopalarm', ---@type string Send a prisoner to solitary confinement Solitary = 'solitary', ---@type string Remove a prisoner from solitary confinement RemoveSolitary = 'rsolitary', ---@type string Manually reset the prison break state ResetPrisonBreak = 'resetescape', }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ UI POSITIONING ]] -- Note: Text/Subtitles positions apply only to the built-in RCore TextUI. -- ══════════════════════════════════════════════════════════════════════════════ Menu = { ---@type 'top-left'|'top-right'|'bottom-left'|'bottom-right' Context menu anchor Position = 'top-right', }, Helpkeys = { ---@type 'top-left'|'top-right'|'bottom-left'|'bottom-right' Help-key widget anchor Position = 'top-left', }, Text = { ---@type 'top-left'|'top-right'|'bottom-left'|'bottom-right' TextUI anchor Position = 'bottom-right', }, Subtitles = { ---@type 'top-left'|'top-right'|'bottom-left'|'bottom-center'|'bottom-right' Subtitle anchor Position = 'bottom-center', }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ INTERACTION ZONES ]] -- ══════════════════════════════════════════════════════════════════════════════ Zone = { ---@type number Proximity trigger radius for zone interactions (metres) CheckDist = 3.0, ---@type string Key to press when inside an interaction zone InteractKey = 'E', ---@type string Label shown in the help-key widget for zone interactions HelpkeysInteractKeyName = 'E', ---@type vector3 Default collision box size for interaction zones Size = vec3(1.0, 1.0, 1.0), }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ AUTHORISED JOBS (JAIL PERMISSIONS) ]] -- Jobs listed here can use jail/unjail commands by default. -- Grade-level restrictions are configured in Config.RestrictCommands. -- ══════════════════════════════════════════════════════════════════════════════ ---@type table Jobs authorised to jail/unjail players Jobs = { ['police'] = true, ['sheriff'] = true, ['bsco'] = true, ['sahp'] = true, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PRISON JOBS (INMATE WORK ASSIGNMENTS) ]] -- ══════════════════════════════════════════════════════════════════════════════ PrisonJobs = { ---@type number Cooldown before an inmate can accept a new job after finishing/leaving one (minutes) PlayerJobCoolDown = 2, ---@type number Cooldown before a completed job location becomes available again (minutes) ResetJobPoolCooldown = 1, ---@type number Default number of task completions required to finish a job RequiredDelivery = 5, ---@type boolean Highlight the active job target zone (targets only) TargetHighlight = false, ---@type { r: number, g: number, b: number, a: number } RGBA colour of the target highlight TargetHiglightColor = { r = 50, g = 149, b = 1, a = 255 }, ---@type boolean When true RequiredDeliveries table overrides RequiredDelivery per job type SetCustomRequiredDeliveries = true, ---@type table Toggle ox_lib skillCheck minigames per job type --- Custom minigames: modules/base/client/api/cl-jobs.lua Minigame = { Cooking = true, Janitor = true, CleanGround = true, BushTrimming = true, }, Electrician = { ---@type boolean Increase circuit difficulty by 1 level after each completed electrician task EachJobLevelIncreaseDifficulty = true, }, ---@type string Key to abandon the current job assignment LeaveJobKey = 'G', ---@type string Key to interact with a job task DoJobKey = 'E', Stepper = { ---@type string Key to perform a stepper/exercise task DoTask = 'SPACE', ---@type string Key to stop a stepper/exercise task StopTask = 'H', }, ---@type table[] Rewards granted when an inmate successfully completes a job — multiple types can be active simultaneously Rewards = { { type = 'ITEM', list = { { name = 'water', count = 10 }, }, }, { type = 'CREDITS', min = 100, max = 500, }, { type = 'REDUCE_SENTENCE', value = 5, -- Minutes removed from the inmate's sentence }, }, ---@type number Distance at which job interaction zone markers become visible (metres) RenderInteractZoneDistance = 100.0, ---@type number Radius the player must be inside to interact with a task zone (metres) InRadius = 1.5, ---@type table Per-job completion counts (overrides RequiredDelivery when SetCustomRequiredDeliveries = true) RequiredDeliveries = { [JOBS.ELECTRICIAN] = 2, [JOBS.GARDENER] = 2, [JOBS.CLEAN_GROUND] = 1, [JOBS.BUSH_TRIMMING] = 3, [JOBS.COOK] = 1, [JOBS.LAUNDRY] = 3, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PRISON ENVIRONMENT ANNOUNCEMENTS ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Announce yard time to all prisoners PrisonYardAnnoucement = false, ---@type boolean Broadcast a server-wide message when a new prisoner is jailed BroadcastNewPrisoner = false, ---@type boolean Automatically remove cuffs when a player arrives in prison AutoUncuffNewPrisoner = true, ---@type 'SEC'|'MIN'|'HOURS'|'DAYS'|'WEEK'|'MONTHS' Unit used for all sentence durations throughout the script Time = TIMES.MIN, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PHONE BOOTH ]] -- ══════════════════════════════════════════════════════════════════════════════ PhoneBooth = { ---@type boolean Enable prison phone booths Enabled = true, ---@type number Phone number digit length (10 for lb-phone default) Lenght = 10, ---@type string Display format for phone numbers — e.g. '{3}-{3}-{4}' → 555-555-1234 Format = '{3}-{3}-{4}', }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ CHAIRS & BEDS ]] -- ══════════════════════════════════════════════════════════════════════════════ Chairs = { ---@type boolean Enable the sit/lie-on-bed interaction system Enable = false, ---@type number Raycast distance to detect nearby chairs/beds (metres) RaycastDistCheck = 5.0, ---@type number Distance threshold to confirm the player is seated (metres) SeatDistCheck = 1.5, ---@type boolean Show debug markers for all seat positions DebugSeatPos = false, ---@type boolean Gradually heal players who are lying on a bed HealLayingPlayers = true, ---@type number Health restored per heal tick (multiplier) HealModifier = 0.5, ---@type number How often the heal tick fires (minutes) HealLayingPlayersTimeCycle = 1, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ GYM ]] -- Supported stats resources: RTX_GYM -- Custom integration: modules/base/client/api/cl-gym.lua -- ══════════════════════════════════════════════════════════════════════════════ GYM = { ---@type string Key to start/continue an exercise rep DoExerciseKey = 'SPACE', ---@type string Key to stop exercising StopExerciseKey = 'H', ---@type table Skill gain configuration per exercise type --- percentIncrease: animation progress % per rep | time: seconds per rep SkillMap = { [EXERCISE_MAP.CRANKS] = { action = { percentIncrease = 2, time = 4 }, skills = { strength = 0.3, stamina = 0.1 }, }, [EXERCISE_MAP.SITUPS] = { action = { percentIncrease = 8, time = 1 }, skills = { strength = 0.3, stamina = 0.1 }, }, [EXERCISE_MAP.MUSLECHIN] = { action = { percentIncrease = 2, time = 4 }, skills = { strength = 0.3, stamina = 0.1 }, }, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ DASHBOARD UI ]] -- ══════════════════════════════════════════════════════════════════════════════ UI = { ---@type boolean When false, officers can add sentence time by server ID via the dashboard DisableAddSentencePlayerId = false, ---@type boolean When true, officers must provide a reason before adding a sentence AddSentenceReasonRequired = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ MUGSHOT ]] -- ══════════════════════════════════════════════════════════════════════════════ Mugshot = { ---@type boolean Internal API hook for third-party mugshot resources — does NOT take a mugshot automatically Enable = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ OUTFITS ]] -- ══════════════════════════════════════════════════════════════════════════════ Outfits = { ---@type boolean Restore the player's pre-prison outfit when they are released RestorePlayerOutfitOnRelease = true, }, ---@type boolean Enable standalone clothing test mode (development use only) ClothingStandaloneTesting = false, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ECONOMY ]] -- ══════════════════════════════════════════════════════════════════════════════ ---@type string In-prison currency item used by the dealer, canteen, and other systems EconomyItem = 'cigarrete', -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PRISONER ACCOUNTS (IN-PRISON BALANCE) ]] -- ══════════════════════════════════════════════════════════════════════════════ Accounts = { ---@type boolean Enable the in-prison credit account system Enable = true, ---@type boolean Wipe the account balance when the prisoner is released DeleteAccountWhenReleased = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ PROLOG (INTRO SEQUENCE) ]] -- Server events: rcore_prison:server:prologStarted | rcore_prison:server:prologFinished -- Anti-cheat note: listen to those events to apply a temporary freecam bypass. -- ══════════════════════════════════════════════════════════════════════════════ Prolog = { ---@type boolean Enable the cinematic prison-arrival prolog sequence Enable = false, ---@type boolean Reset player cache data when the prolog starts ResetCache = false, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ COMMUNITY SERVICE (COMS / PAROLE) ]] -- ══════════════════════════════════════════════════════════════════════════════ COMS = { ---@type boolean Enable the community-service / parole system Enable = true, ---@type boolean Display remaining parole time on-screen RenderPerollTime = true, Area = { ---@type boolean Allow the active COMS zone to unload and reload dynamically EnableDynamicUnload = false, }, Blip = { ---@type boolean Show a minimap blip for the COMS check-in location enable = false, ---@type number Blip sprite ID sprite = 643, ---@type number Blip colour ID color = 1, ---@type number Blip scale scale = 1.0, }, ---@type table Default COMS check-in location spawned on the map StartLocations = { name = 'Alta - Coms', coords = vector3(236.44, -409.33, 47.92), type = INTERACT_TYPES.COMS, zone = { size = vec3(1, 1, 1), icon = "fa-solid fa-paper-plane", label = 'Community service', }, npc = { coords = vec3(236.44, -409.33, 47.92), heading = 342.26, model = 's_m_m_prisguard_01', }, access = INTERACT_ACCESS_TYPES.ALL, }, ---@type boolean Render the COMS cleanup zone only for players currently on parole RenderAreaOnlyForCOMSCitizens = false, ---@type boolean Disable player movement controls while they perform a cleaning task DisableGameControls = true, ---@type string Key to interact with COMS cleanup props InteractKey = 'E', ---@type number Duration of the cleaning animation (milliseconds) CleaningAnimTime = 10 * 1000, ---@type number Distance at which the COMS zone becomes visible (metres) RenderDistance = 150.0, ---@type number Radius the player must stay within during COMS tasks (metres) InRadius = 100.0, ---@type string[] Prop models spawned as litter/debris for COMS cleanup tasks Models = { 'prop_rub_cardpile_05', 'prop_rub_binbag_03', 'prop_skid_box_06', 'prop_rub_flotsam_01', 'prop_rub_litter_03c', 'prop_rub_binbag_06', 'prop_rub_cardpile_06', }, Outline = { ---@type { x: number, y: number, z: number } RGB colour applied to COMS cleanup prop outlines (x=R, y=G, z=B) color = { x = 250, y = 149, z = 68 }, ---@type number Outline opacity (0–100) opacity = 80, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ INVENTORY IMAGE PATHS ]] -- NUI paths to item image directories for each inventory — used by the dashboard -- ══════════════════════════════════════════════════════════════════════════════ ---@type table NUI image directory paths per inventory resource ImagePath = { [Inventories.OX] = 'nui://ox_inventory/web/images', [Inventories.QB] = 'nui://qb-inventory/html/images', [Inventories.LJ] = 'nui://lj-inventory/html/images', [Inventories.QS] = 'nui://qs-inventory/html/images', [Inventories.PS] = 'nui://ps-inventory/html/images', [Inventories.TGIANN] = 'nui://inventory_images/images', [Inventories.ESX] = '', -- ESX: images load from rcore_prison/modules/nui/web/build/images/items }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ALCATRAZ MAP SETTINGS ]] -- ══════════════════════════════════════════════════════════════════════════════ Alcatraz = { ---@type vector4 Teleport destination when sending a player back to Los Santos from Alcatraz BackToLosSantosPos = vector4(13.7, -2784.97, 2.53, 359.96), ---@type vector4 Teleport destination when returning a player to Alcatraz from Los Santos BackToAlcatrazPos = vector4(3868.583984375, -28.968952178955, 6.7066369056702, 183.09248352051), Visit = { ---@type boolean Allow visits — teleports visitors to the visitation centre and spawns a guard NPC Enable = true, ---@type vector4 Teleport destination when returning a prisoner from visitation to the yard YardPos = vector4(3944.02, 45.33, 22.34, 281.05), ---@type vector4 Teleport destination for entering the visitation room VisitPos = vector4(3864.56, -13.29, 6.71, 92.68), }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ CANTEEN / PRISON SHOP ]] -- ══════════════════════════════════════════════════════════════════════════════ Canteen = { -- Consumables are handled by your inventory/consumables resource, not prison itself — these are just the default items available for purchase in the canteen. -- Consumables are handled by your inventory/consumables resource, not prison itself — these are just the default items available for purchase in the canteen. -- Consumables are handled by your inventory/consumables resource, not prison itself — these are just the default items available for purchase in the canteen. -- Consumables are handled by your inventory/consumables resource, not prison itself — these are just the default items available for purchase in the canteen. -- Consumables are handled by your inventory/consumables resource, not prison itself — these are just the default items available for purchase in the canteen. ---@type { name: string, price: number, label: string }[] Items purchasable with in-prison credits (EconomyItem) CreditItems = { { name = 'water', price = 30, label = 'Water' }, { name = 'fries', price = 7, label = 'Fries' }, { name = 'sprunk', price = 7, label = 'Sprunk' }, { name = 'cigarrete', price = 80, label = 'Cigars' }, }, ---@type boolean Enable the free daily food package for prisoners FreeFoodPackage = true, ---@type number Minimum time between free package claims (minutes) FreeFoodPackageCooldown = 5, ---@type { name: string, count: number, label: string }[] Items included in the free food package FreeFoodPackageItems = { { name = 'water', count = 1, label = 'Water' }, { name = 'sprunk', count = 1, label = 'Sprunk' }, }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ STASH (CONFISCATED ITEMS) ]] -- Confiscated items are held by the lobby guard and returned on release. -- -- ⚠️ Money note: qb-inventory / qs-inventory / codem-inventory store money as an -- account balance — it cannot be stashed like a normal item and may behave -- unexpectedly. Manage money through economy logic, not item stashing. -- ══════════════════════════════════════════════════════════════════════════════ Stash = { ---@type boolean Enable the confiscation/stash system EnableStashing = true, ---@type boolean Return stashed items to the player on release ReturnItemsOnRelease = true, ---@type boolean Block common attempts to retrieve items from the stash early AntiExploit = true, ---@type boolean Keep certain items with the prisoner instead of stashing them (see KeepItems) KeepItemsState = true, ---@type table true = keep with prisoner; false = confiscate to stash KeepItems = { ['bread'] = false, ['water'] = false, ['sludgie']= false, ['money'] = false, -- Non-functional with qs-inventory / qb-inventory / codem-inventory ['cash'] = false, -- Non-functional with qs-inventory / qb-inventory / codem-inventory }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ EXPERIMENTAL FEATURES ]] -- Provided AS-IS — use at your own risk. -- ══════════════════════════════════════════════════════════════════════════════ Experimental = { ---@type boolean Re-apply the prisoner's saved outfit if they die and respawn while inside prison RestoreOutfitWhenDiedInAsPrisoner = true, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ JAIL COMMAND SETTINGS ]] -- ══════════════════════════════════════════════════════════════════════════════ Jail = { ---@type number Radius around the officer used to auto-populate the target field in /jailcp Add Sentence (metres) FetchClosestPlayer = 10.0, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ CIGAR PRODUCTION MINIGAME ]] -- ══════════════════════════════════════════════════════════════════════════════ CigarProduction = { ---@type number Cooldown between reward claims (minutes) RewardCooldown = 5, ---@type number Minimum item quantity rewarded per successful run RewardMin = 1, ---@type number Maximum item quantity rewarded per successful run RewardMax = 10, ---@type string Inventory item name given as a reward RewardItem = 'cigarrete', }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ARROW-KEY MINIGAME (COOKING / LAUNDRY / ETC.) ]] -- ══════════════════════════════════════════════════════════════════════════════ Minigame = { ---@type string Animation dictionary played during the minigame AnimDict = 'anim@amb@business@coc@coc_unpack_cut_left@', ---@type string Animation clip played during the minigame AnimName = 'coke_cut_v5_coccutter', ---@type number Number of arrow-key prompts generated per round Steps = 5, ---@type number Speed at which prompt blocks scroll — must be > 0.02 MoveStep = 0.09, ---@type number Input tolerance window — presses within this range are accepted Tolerance = 0.025, ---@type number Internal timing accumulator for key-press detection TimeAcc = 0.3, ---@type string[] Arrow-key prompt directions used in the minigame Keys = { 'W', 'S', 'A', 'D' }, ---@type table Remap minigame inputs — change only the right-hand values Keybinds = { ['W'] = 'W', ['S'] = 'S', ['A'] = 'A', ['D'] = 'D', }, }, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ NPC SPAWNING ]] -- ⚠️ Do NOT enable unless you understand game-engine NPC placement limitations. -- ══════════════════════════════════════════════════════════════════════════════ ---@type boolean Allow the game engine to spawn NPCs inside the prison area EnableSpawnNPCInsidePrison = true, -- ══════════════════════════════════════════════════════════════════════════════ -- [[ TELEPORT ]] -- ══════════════════════════════════════════════════════════════════════════════ Teleport = { ---@type boolean Teleport the prisoner to the front of the prison on release instead of leaving them at their last position WhenReleasedTeleportPrisonerInFrontOfPrison = true, }, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ RESTRICT ZONES ]] -- Officers must be physically inside one of these zones to execute the listed -- commands. Zone coords are defined per map in data/presets/.lua -- ══════════════════════════════════════════════════════════════════════════════ Config.RestrictZones = { ---@type boolean Enable the restrict-zone system Enable = false, ---@type number Distance to the nearest zone that grants command access (metres) CheckDist = 10.0, ---@type table Commands that require the officer to be inside a RestrictZone Access = { [Config.Commands.Unjail] = true, [Config.Commands.Jail] = true, [Config.Commands.JailCP] = true, }, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ HUD CONTROL ]] -- Controls radar/HUD visibility based on prisoner state. -- Implementation: modules/base/client/api/cl-hud.lua -- ══════════════════════════════════════════════════════════════════════════════ Config.Hud = { ---@type boolean Master toggle — set true to activate HUD state management Enable = false, ---@type table HUD visibility per heartbeat event: true = show, false = hide States = { [HEARTBEAT_EVENTS.PRISONER_LOADED] = false, -- Prisoner reconnected with active sentence [HEARTBEAT_EVENTS.PRISONER_NEW] = false, -- Prisoner jailed for the first time [HEARTBEAT_EVENTS.PRISONER_RELEASED] = true, -- Prisoner released or escaped }, ---@type fun(bool: boolean) Called on every prisoner state change — true = show HUD, false = hide HUD --- Extend with your own HUD resource events as needed. HandleRenderState = function(bool) DisplayRadar(bool) -- Example extension: -- if bool then -- TriggerEvent("your_hud:show") -- else -- TriggerEvent("your_hud:hide") -- end end, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ STATE COMMANDS ]] -- Toggle individual commands on (true) or off (false). -- Disabled commands are never registered with the server. -- ══════════════════════════════════════════════════════════════════════════════ ---@type table Command enabled state map Config.StateCommands = { [Config.Commands.Jail] = true, [Config.Commands.JailCP] = true, [Config.Commands.Unjail] = true, [Config.Commands.Startcs] = true, [Config.Commands.Removecs] = true, [Config.Commands.RemoveSolitary] = true, [Config.Commands.Solitary] = true, [Config.Commands.StopAlarm] = true, [Config.Commands.ResetPrisonBreak] = true, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ RESTRICT COMMANDS (GRADE-BASED ACCESS) ]] -- Restrict specific commands to certain job grades within an authorised job. -- ══════════════════════════════════════════════════════════════════════════════ Config.RestrictCommands = { ---@type boolean Enable grade-based command restrictions Enable = false, ---@type boolean true = check via grade NUMBER (>= GradeNumber); false = check via grade NAME (ListGrades) UseGradeNumbers = false, ---@type number Minimum grade number required for access (only used when UseGradeNumbers = true) GradeNumber = 2, ---@type table> Per-command grade access map — true = access granted, false = denied --- Only used when UseGradeNumbers = false ListGrades = { [Config.Commands.Jail] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, [Config.Commands.JailCP] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, [Config.Commands.Unjail] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, [Config.Commands.Startcs] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, [Config.Commands.Removecs] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, [Config.Commands.RemoveSolitary] = { ['recruit'] = false, ['officer'] = true, ['sergeant'] = true, ['lieutenant'] = true, ['chief'] = true, ['boss'] = true, }, }, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ USEABLE ITEMS ]] -- Items that open UI panels when used from the inventory. -- ══════════════════════════════════════════════════════════════════════════════ ---@type table Inventory item names that trigger built-in UI panels Config.UseableItems = { ---@type string Item name that opens the prison officer tablet/dashboard Tablet = 'prison_tablet', } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ CHAT SUGGESTIONS ]] -- Auto-complete hints shown when typing prison commands in chat. -- Active only when Config.RegisterChatSuggestions = true. -- ══════════════════════════════════════════════════════════════════════════════ Config.ChatSuggestions = { [Config.Commands.Jail] = { { name = _U('CHAT_SUGGESTIONS.JAIL_PLAYER_PARAM'), help = _U('CHAT_SUGGESTIONS.JAIL_PLAYER_HELP_PARAM') }, { name = _U(('CHAT_SUGGESTIONS.TIME_%s'):format(Config.Time)), help = _U(('CHAT_SUGGESTIONS.TIME_%s'):format(Config.Time)) }, }, [Config.Commands.Startcs] = { { name = _U('CHAT_SUGGESTIONS.JAIL_PLAYER_PARAM'), help = _U('CHAT_SUGGESTIONS.JAIL_PLAYER_HELP_PARAM') }, }, [Config.Commands.Unjail] = { { name = _U('CHAT_SUGGESTIONS.UNJAIL_PLAYER_PARAM'), help = _U('CHAT_SUGGESTIONS.UNJAIL_PLAYER_HELP_PARAM') }, }, [Config.Commands.Solitary] = { { name = _U('CHAT_SUGGESTIONS.SOLITARY_PLAYER_PARAM'), help = _U('CHAT_SUGGESTIONS.SOLITARY_PLAYER_HELP_PARAM') }, { name = _U(('CHAT_SUGGESTIONS.TIME_%s'):format(Config.Time)), help = _U(('CHAT_SUGGESTIONS.TIME_%s'):format(Config.Time)) }, }, [Config.Commands.RemoveSolitary] = { { name = _U('CHAT_SUGGESTIONS.REMOVE_SOLITARY_PLAYER_PARAM'), help = _U('CHAT_SUGGESTIONS.REMOVE_SOLITARY_PLAYER_HELP_PARAM') }, }, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ SOUNDS ]] -- Path: modules/base/client/api/cl-prison_alarm.lua -- ══════════════════════════════════════════════════════════════════════════════ Sounds = { ---@type boolean Replace the default prison alarm with a custom audio file UseCustomAlarmSound = false, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ ASSETS ]] -- ══════════════════════════════════════════════════════════════════════════════ Assets = { ---@type boolean Show or hide the stairway security gates EnableGatesOnTopofStairs = true, ---@type boolean Hide solitary cell props from the prison yard UnloadSolitaryCells = false, ---@type boolean Unload perimeter walls when the full Prompt V2 map is loaded UnloadWallsWhenOnFullPrompt = true, } -- ══════════════════════════════════════════════════════════════════════════════ -- [[ NETWORKED ENTITIES ]] -- Props that are networked so all players can see them during job tasks. -- ══════════════════════════════════════════════════════════════════════════════ ---@type table Prop model names that must be networked during prison jobs NetworkedEntities = { ["prop_hedge_trimmer_01"] = true, ["prop_tool_broom"] = true, ["prop_leaf_blower_01"] = true, ["prop_fish_slice_01"] = true, }