Shared Configuration (sh_config.lua)

The config/sh_config.lua file is the central configuration file accessible by both the client and the server. It defines framework bridges, base locations, cleaning van attributes, the illegal contract unlock system, task payouts, and tool upgrades.


⚙️ Core Bridges & Settings

return {
  debug = false, -- Enable verbose color-coded console logs for development
  framework = 'qbx', -- Supported: 'qb', 'qbx', 'esx'
  notify = 'ox_lib', -- Supported: 'ox_lib', 'bs-advnotifications'
  interaction = 'ox_target', -- Supported: 'ox_target', 'qb-target', 'qbx-target'
  phone = 'none', -- Supported: '17mov_phone', 'lb_phone', 'none'
  dispatch = 'qb_dispatch', -- Supported: 'qb_dispatch', 'ps_dispatch', 'cd_dispatch', 'none'
  clothingBridge = 'illenium-appearance', -- Supported: 'illenium-appearance', 'qb-clothing', 'esx_skin', 'none'
  vehicleKeys = 'qbx_vehiclekeys', -- Supported: 'qb-vehiclekeys', 'qbx_vehiclekeys', 'qs-vehiclekeys'
 
  jobName = false, -- false for open public job, or string like 'crimescenecleaner' to restrict to hired players
  • debug: When true, prints detailed logs with step indices and state changes ([CRIME-DEBUG]). Set to false in production.
  • framework: Determines which framework bridge from bridge/framework/ to load.
  • interaction: Selects your target system (ox_target, qb-target, or qbx-target).
  • phone: When set to '17mov_phone' or 'lb_phone', sends an anonymous SMS from the fixer when the illegal route is unlocked. Set to 'none' to use default popup notifications instead.
  • dispatch: Integrates with police alert scripts for failed alarm hacking minigames.
  • clothingBridge: Dictates how workwear and hazmat suits are applied and restored upon shift completion.
  • vehicleKeys: Automatically distributes vehicle keys to all active lobby members when the cleaning van is spawned.
  • jobName: If false, any citizen can approach the boss NPC and start working. If set to a string (e.g. 'crimescenecleaner'), only players with that job role can start routes.

⌨️ Commands & Keybinds

  binds = {
    dashboard = {
      key = 'F7',
      label = 'Open Job Dashboard',
    },
    toggleTasks = {
      key = 'F6',
      label = 'Toggle Crime Scene Tasks',
    },
  },
 
  sceneManagerCommand = 'csctaskmanager', -- In-game scene & task creator tool (requires admin ACE)
  bonusManagerCommand = 'cscbonusmanager', -- In-game multiplier event manager (requires admin ACE)
  • binds.dashboard: Default key to toggle the comprehensive NUI job tablet/dashboard.
  • binds.toggleTasks: Default key to toggle the active task checklist HUD during an active route.
  • sceneManagerCommand: Administrative command to manage crime scenes and create 3D minigame tasks in real time (/csctaskmanager).
  • bonusManagerCommand: Administrative command to trigger instant or scheduled payout multipliers (/cscbonusmanager).

📋 Route & Scene Behavior

  job = {
    spawnClearRadius = 5.0,
    scenesPerJob = { min = 4, max = 6 },
    tasksPerScene = { min = 4, max = 6 },
    scene = {
      taskLoadDistance = 150.0,
      outlineRenderDistance = 20.0
    }
  },
 
  lobby = {
    inviteCooldown = 5, -- Seconds cooldown between player invites
  },
  • spawnClearRadius: Safe radius (in meters) checked by the server before spawning the cleaning van to avoid vehicle collisions.
  • scenesPerJob: Number of crime scenes assigned per shift.
  • tasksPerScene: Number of randomized minigames loaded at each crime scene location.
  • scene.taskLoadDistance: Distance (in meters) at which props and task instances spawn into the client world.
  • scene.outlineRenderDistance: Distance at which interactive task outline shaders become visible to players.

🏢 Base Headquarters & Work Vehicle

  base = {
    blip = {
      sprite = 366,
      color = 0x00BFFFFF,
      scale = 0.8,
      label = 'Crime Scene Cleaner Job',
    },
    ped = {
      model = 's_m_y_dwservice_02',
      coords = vec4(844.52, -2118.31, 29.52, 93.47),
    },
    vehicle = {
      model = 'burritocsc',
      spawnCoords = {
        vec4(836.38, -2119.26, 28.35, 174.44),
        vec4(836.62, -2119.59, 28.37, 179.09),
        vec4(828.87, -2118.62, 28.16, 174.93),
      },
      color = {
        primary = 111,
        secondary = 111,
      },
    },
  },
  • base.ped: NPC coordinates and model for the legal cleanup dispatcher.
  • base.vehicle: The bundled burritocsc service van. Spawns with equipment storage where players interact to don their Hazmat Suits.

🕵️ Shady / Illegal Job Route

  illegalJob = {
    requiredCourses = 20, -- Shifts required to unlock
    payoutMultiplier = 2.0, -- 2x payout multiplier
    ped = {
      model = 'g_m_m_chigoon_01',
      coords = vec4(752.06, -1201.81, 23.3, 3.11),
      blip = {
        sprite = 817,
        color = 0x00BFFFFF,
        scale = 0.8,
        label = 'Shady Contact',
      }
    }
  },
  • requiredCourses: How many completed legal cleanup shifts a player must finish before unlocking the anonymous underworld route.
  • payoutMultiplier: Extra reward multiplier applied to illegal mob cleanup payouts (default: 2.0 for 200% earnings).
  • ped: Secluded alleyway location of the Shady Contact fixer NPC.

🛠️ Tasks & Rewards

Every individual minigame configuration defines base payouts, character XP, map blips, and UI tutorial steps:

  tasks = {
    ['clean_blood'] = {
      label = 'Clean Blood',
      description = 'Clean all blood stains from the crime scene.',
      exp = 50,
      payment = 100,
      -- blip and UI tutorial settings...
    },
    ['collect_evidence'] = {
      label = 'Collect Evidence',
      description = 'Gather all evidence from the crime scene.',
      exp = 50,
      payment = 100,
      -- ...
    },
    ['hack_alarm'] = {
      label = 'Hack Alarm',
      description = 'Hack the alarm system at the crime scene.',
      exp = 50,
      payment = 100,
      -- ...
    },
    ['rearrange_furniture'] = {
      label = 'Rearrange Furniture',
      description = 'Put the furniture back in its original place.',
      exp = 50,
      payment = 100,
      -- ...
    },
    ['remove_cctv'] = {
      label = 'Remove CCTV',
      description = 'Remove the CCTV camera from the crime scene.',
      exp = 50,
      payment = 100,
      -- ...
    },
  },

📈 Tool Upgrades System

Players reinvest their hard-earned cash and EXP through the Dashboard Upgrades tab:

  upgrades = {
    {
      id = "clean_blood",
      name = "Detergent Kit",
      description = "Reduces the time needed to clean blood stains.",
      icon = "SprayBottle",
      maxLevel = 3,
      costs = {
        [1] = { xp = 100, cash = 1000 },
        [2] = { xp = 300, cash = 2500 },
        [3] = { xp = 600, cash = 5000 },
      },
      multiplier = { [1] = 0.8, [2] = 0.6, [3] = 0.4 }
    },
    {
      id = "remove_cctv",
      name = "Advanced Screwdriver",
      description = "Increases the speed of unscrewing bolts.",
      icon = "Screwdriver",
      maxLevel = 3,
      -- ...
    },
    {
      id = "hack_alarm",
      name = "Decryptor Tool",
      description = "Increases the time limit for the hacking minigame.",
      icon = "Usb",
      maxLevel = 3,
      -- ...
    },
    {
      id = "rearrange_furniture",
      name = "Lifting Belt",
      description = "Increases the snap tolerance for placing furniture.",
      icon = "Belt",
      maxLevel = 3,
      -- ...
    },
    {
      id = "collect_evidence",
      name = "Magnetic Bag",
      description = "Automatically collects evidence into the bag with a single click.",
      icon = "CubeFocus",
      maxLevel = 1,
      -- ...
    },
  }