Browse docs

Changelog

Full change history for Sky Crime System.
Before installing or updating, make sure sky_base and sky_jobs_base are up to date.
Read the current version first, then compare every Changed Files and migration note with your installed release. Back up the resource configuration and database before applying an update.
Current

Version 0.12.0

Highlights

  • Improved laboratory and camper management with focused setup tasks, separate management pages and a guided recipe, preparation and final-review flow for production.
  • Improved laboratory and camper treasury transfers so failed or interrupted payments are checked before completion or refunds, and unresolved transfers cannot be paid again automatically.
  • Added independent options to report every accepted shop robbery or pickpocket attempt to the configured dispatch integration, including successful attempts.

Notable Changes

  • Improved Drug and Weapon Creator overviews with consistent navigation, collapsible settings and clearer guides.
  • Improved the Drug Creator live server view with a refresh action, separate plant, camper and laboratory lists, and clearer empty and filtered states.
  • Improved heist editing with expandable objective lists, direct loot creation, combined placement and teleport controls, and navigation from crew guidance to the matching configuration.
  • Added illustrated keycard instructions, contextual element help and expanded planning-map examples for every bundled language.
  • Fixed an issue where cancelling world placement failed to return to the open heist overview or a held Back key caused another navigation.
  • Fixed an issue where old heist refreshes or model loads restored stopped alarms, gas protection, objects or placement work from a previous session.
  • Fixed an issue where failed heist planning refreshes left later refresh requests waiting indefinitely.
  • Fixed an issue where normal loot editing repeatedly reopened the initial cash or gold value prompt or discarded a valid placement.
  • Changed shop safe code entry to allow unlimited wrong combinations and time to enter a code while the player remains eligible and nearby.
  • Fixed an issue where an already issued shop safe code became unusable after the clerk died, and prevented dead clerks from issuing new codes.
  • Improved shop clerk reactions and safe actions by showing missing drill or hack items before an attempt.
  • Fixed an issue where street-sale availability did not update after receiving or removing finished drug products.
  • Fixed an issue where bulk Drug Creator updates failed to refresh campers.
  • Fixed an issue where interrogation features loaded before their initial configuration was ready.

Other Changes

  • Improved Crime HUD cards, action labels and responsive layouts across creators, planning, crafting and hacking interfaces.
  • Improved the feature catalogue by keeping gameplay switches together while retaining detailed options and saved values in their settings pages.
  • Updated bundled translations and the guidance for production, conversion, storage, finances and access.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.11.00.12.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

1. Back up and prepare

These steps update sky_crimesystem from 0.11.0 to 0.12.0. Complete earlier update guides first if you use an older version.

  1. Download and extract 0.12.0.
  2. Back up your database, installed Crime folder, customised configuration and exported Drug, Weapon and Heist Creator content.
  3. Stop the server before replacing files. Complete the Base 1.49.0 update and Jobs Base 1.52.0 update in the same maintenance window.

2. Copy the package files

Inside the installed sky_crimesystem folder:

  1. Delete the old source/ folder and insert the complete new source/ folder, including the built interface and its images.
  2. Replace fxmanifest.lua with the one from the same 0.12.0 package.
  3. Replace the complete config/locales/ folder. Copy any custom wording from your backup into matching new entries, keeping every new key and removing obsolete keys with the old files.
  4. Keep your existing config/config.lua and make the exact changes in the settings step. Keep all other configuration files, heist files, stream assets and inventory images.

3. Keep or configure settings

Required file change: open sky_crimesystem/config/config.lua, find Config.ShopRobbery and remove its codeAttempts = 3, line, or the same line with your customised number. Safe codes no longer have an attempt limit. Keep reservationTimeoutSeconds and the other timeouts: they still apply to their remaining actions.

Using /jobconfig (the default): keep your saved jobs and settings. The obsolete saved shopCodeAttempts option is discarded automatically; do not reset the resource or reimport its defaults. No other setting change is required.

Optional — report every valid robbery start: after startup, open /jobconfig → Crime → Robberies → Shop robberies → Dispatch and enable Always send dispatch (shopDispatchAlways). Configure pickpocketing separately under Robberies → NPC pickpocketing → Dispatch with the same label (pickpocketDispatchAlways), then save. Both default to off, preserving the existing alert policy. Each enabled setting sends one alert at the accepted start; later results do not send a second one.

Only for file-based settings (Config.UseJobConfigurator = false): in the existing Config.ShopRobbery.dispatch table, add always = false, before radius; in the existing Config.Pickpocket.dispatch table, add the same line before radius. Use true for either feature only if you want every accepted start reported. Keep your current radius, duration, priority and jobs in both tables. Do not paste a second dispatch table over customised values.

Existing Drug, Weapon and Heist Creator entries remain saved. No default import or content recreation is required. Money Wash and the Online Heist Hub remain unavailable; this update does not enable them.

4. Database, items and assets

No Crime SQL migration, new inventory item, inventory image or stream-model installation is required for 0.11.0 → 0.12.0. Keep all existing organisations, plants, campers, laboratory stock, treasury history and heist plans. Complete the library database steps from the Jobs Base 1.52.0 guide if they apply to your installation.

Treasury transfers use the existing ledger and require the supported oxmysql transaction provider. If a transfer fails, check the displayed result and server log before trying again. An unresolved transfer deliberately blocks further treasury transfers for that facility; keep its history and ask support to check the exact transaction. Do not delete the ledger, replay the payment or issue a guessed refund.

5. Start and check

  1. Start your database connector, framework and selected providers, then sky_base 1.49.0, sky_jobs_base 1.52.0 and sky_crimesystem 0.12.0. If using the Ambulance integration, start the matching Ambulance resource before Crime.
  2. Resolve the first startup/database error, then reconnect for the updated interface.
  3. Open a saved laboratory and camper. Check their stock and balance, complete one small production order through Produce, and check current orders and management access.
  4. Test one small treasury deposit and withdrawal with the configured currency, confirming both the wallet and facility history.
  5. Open a saved heist, test placement followed by Back, and review its planning/keycard guidance. Test a shop safe with an issued code, including a wrong entry before the correct one. If enabling either new dispatch option, verify one alert per accepted start with a receiving officer.
  6. Receive or remove an enabled finished drug product and confirm its street-sale availability updates. Check the interrogation workflow you use before reopening the server.

Version 0.11.0

Highlights

  • Improved Heist Creator setup with a checklist and clearer navigation that preserves drafts.
  • Improved camper and laboratory management with clearer storage, purchase confirmations and expanded finance filters.
  • Added a dedicated faction camper-purchase permission with optional minimum-grade defaults.

Notable Changes

  • Improved currency presentation across Drug and Weapon prices, finances, refunds, routes and notifications.
  • Moved camper stock interaction into the management interface while preserving stored inventory.
  • Improved finance history with date ranges, income and expense filters, complete matching totals and older pages.
  • Improved laboratory setup guidance, recipe completion and equipment navigation while keeping manager actions restricted.
  • Fixed an issue where expired laboratory grants or stale replies restored access or ownership markers.
  • Fixed an issue where inventory-backed production was blocked by old storage accounting despite available inventory capacity.
  • Improved Drug Creator navigation with collapsible groups, compact actions and direct Plants, Campers and Laboratories pages.
  • Fixed an issue where scoped Weapon default imports omitted required recipes, workshops or catalogue entries.
  • Fixed an issue where moving a sale-route destination left the active buyer at the old position.
  • Fixed an issue where failed pickpocket attempts did not create the configured Jobs Base dispatch incident.
  • Fixed an issue where graffiti without an expiry date was removed during startup cleanup.
  • Added editable Silent, Loud and Disguise approach presets.
  • Improved hacking-device and explosive-charge preparation recipes and shared equipment quantities across linked doors.
  • Fixed an issue where computer screen validation or empty settings tables prevented a valid heist from reopening correctly.
  • Improved creator teleport, world placement and door traversal while preserving drafts and restoring prior collision state.
  • Improved responsive heist editing, graph zoom, dialog focus and keyboard interaction.
  • Added removal of captured intel before a plan closes and leader cancellation of an active preparation before execution.
  • Fixed an issue where completed or alternative objectives left collected loot unavailable at its buyer.
  • Fixed an issue where laser-timer persistence could conflict with concurrent loot payouts.
  • Fixed an issue where heist equipment metadata was lost during partial transfers, raids or failed-transfer restoration.
  • Added illustrated opening-method help, localized planning-map examples and clearer preparation-mission labels.

Other Changes

  • Improved Crime feature discovery and creator shortcuts without changing existing feature switches.
  • Updated Drug Creator and Pacific preset translations, crafting explanations and shared tablet controls.
  • Reduced repeated drug snapshot and storage-catalogue work.
  • Improved personal radio push-to-talk while using the tablet.
  • Removed decorative active indicators from creator and tablet views while retaining useful action and error feedback.
  • Improved gameplay prompts, plant status, robbery and interrogation controls with consistent colours and clearer action layouts.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/functions.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.10.00.11.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

1. Back up and stop the server

Update sky_crimesystem from 0.10.0 to 0.11.0. For an older installation, follow the intervening update guides in version order first.

  1. Download 0.11.0 and extract the ZIP.
  2. Copy your installed sky_crimesystem folder to a backup outside the server's resources folder. Export a backup of your game database too.
  3. Stop the whole server in txAdmin or your hosting panel.
  4. Complete the Base 1.48.0 and Jobs Base 1.51.0 updates during the same maintenance.

2. Copy the new files

Open the installed sky_crimesystem folder and the new download side by side. Copy from the download into the installed folder:

  1. Delete the installed source/ folder, then copy the complete new source/ folder here.
  2. Delete the installed config/locales/ folder, then copy the complete new config/locales/ folder here.
  3. Replace fxmanifest.lua with the new file.
  4. Replace config/heist_exports/heist_4_v1.json with the new copy. This updates the supplied preset file only; do not import it over an existing saved heist.

Keep config/config.lua and the other configuration files. Update config/functions.lua using the next step. If you edited translations, copy your changed wording from the backup into the matching new language entries.

3. Check your settings

Open your installed sky_crimesystem/config/functions.lua and choose the matching case:

  • You never edited this file: replace it with the new config/functions.lua from the download.
  • You edited it and use Jobs Base dispatch: open the old and downloaded files side by side. Find function Config.Functions.SendPickpocketPoliceDispatch(payload) in both. In the installed file, replace that entire function, through its closing end, with the new version. Keep your other functions.
  • You deliberately use another dispatch system for pickpocket alerts: keep your custom dispatch function so the same alert is not sent twice.

This file change fixes pickpocket alerts and is needed even when you use /jobconfig. Your existing config/config.lua, saved factions and heists can stay as they are.

4. Update database and inventory

Crime 0.11.0 needs no manual SQL, new inventory items or extra models. The Base and Jobs Base updates have their own database steps.

Do not run clear.sql, import default factions, or reimport your heists for this update. Existing stock, balances and heist progress are retained. Optional new preparation recipes can be configured later.

5. Start the server and check

  1. Start the server. In server.cfg, keep ensure sky_base before ensure sky_jobs_base, and both before ensure sky_crimesystem. If you use Sky Ambulance with Crime, start sky_ambulancejob before Crime.
  2. Check the server console for startup errors, then reconnect. Open an existing faction, its stock and a saved heist to check that your data is still present.
  3. Only if members should buy campers with faction money: join as the faction boss, open the tablet → Management → Roles, select the member's role, switch on Purchase campers under Permissions, and save. Repeat only for the roles that should be allowed. Boss/co-boss roles with full access already have it. Check one allowed role and one role that should be refused. This setting is in the tablet's Boss Menu.
  4. If you use pickpocketing: test a failed attempt and check that your selected dispatch system receives the alert.

Keep the backup until the checks for your setup pass.

Version 0.10.0

Highlights

  • Added a guided Easy Heist Creator with a setup checklist, a main location, compact settings and an introduction while preserving Advanced configurations.
  • Added Weapon Routes and Weapon Creator with separate system and runtime settings while preserving existing definitions.
  • Added guided interactive workbenches for cooling, bottle blending, plant trimming, moisture checks, dosing, weighing, reactor regulation, filtering, curing, calibration and packaging, with translated controls and keyboard support.
  • Added administrator content previews and confirmed ownership transfers, laboratory resets and complete camper deletion in the Drug Creator.

Notable Changes

Heists

  • Added a crew overview that explains tasks, alternatives, equipment and dependencies before starting a heist.
  • Added undo and redo, resumable unsaved drafts, clearer placement controls and contextual help for heist editing.
  • Added crew and police minimums to Easy setup, with separate online and on-duty police counting and whole-number validation.
  • Added optional security, reconnaissance, transport and event settings to Easy setup, including transport-specific route and cargo guidance.
  • Added reusable cash and gold cart templates with a full-cart value, fill percentage, calculated payout and empty scenery carts.
  • Added a bundled Pacific Standard heist with two required crew members, eight online police, persistent security gas and crew-sized gas-mask preparation.
  • Added timed laser-field hacking and automatically scaled gas-mask preparation when the planned crew changes.
  • Added illustrated galleries for heist elements and clearer links between preparations and their actual blockade or laser targets.
  • Added jewellery display cases to the Creator and synchronized glass breaking with the smash animation, including interrupted attempts and restored plans.
  • Added configurable blockade explosion damage and camera strength, a localized detonator countdown and a single placement animation.
  • Added an administrator preview for placing and cutting glass display cases.
  • Fixed an issue where planning startup or the production screen could fail before callbacks and controls became available.
  • Fixed an issue where transport robberies could fail before a client could initialize the vehicle, lose their active step on restore or fail to complete after a retry.
  • Fixed an issue where failed planning-map removal or safe-keypad requests left the controls busy and prevented a retry.
  • Improved translated heist labels, reconnaissance photo details, command help, grouped security cards and Creator layout at smaller sizes.

Drugs and owned properties

  • Improved production previews by showing station-compatible games and distinguishing weapon assembly from metal processing.
  • Removed hidden production-game deadlines so games continue until completed or cancelled while retaining result validation.
  • Added empty, furnished and fully upgraded purchase presets for laboratories and campers, with independent equipment and upgrade levels.
  • Added optional ownership map icons for laboratories and campers, visible to eligible owners, partners and faction members.
  • Added optional nearby wild-plant outlines with a configurable radius.
  • Added trusted environment surveys so world cultivation accounts for shelter, rain protection, sky exposure and indoor conditions.
  • Fixed an issue where private laboratory entrances could not be lockpicked, while preserving faction assault requirements.
  • Added camper resale through the management interface, using the recorded purchase price and original funding destination.
  • Fixed an issue where camper plates or vehicle keys were lost after streaming, character changes, ownership changes or provider restarts.
  • Fixed an issue where camper-only legacy interior templates appeared as editable laboratory interiors; campers continue to use the fixed Drug Wars interior.
  • Fixed an issue where manual laboratory production was difficult to start and ordinary configured inventory products were missing from drug sales.
  • Fixed an issue where legacy street-sale settings failed to save or French field labels collided during validation.
  • Fixed an issue where Halloween rain and snow were not reflected in cultivation weather.
  • Fixed an issue where disabled Crime tablet apps could still open or accept requests from an already open tablet.

Weapon Routes

  • Added scrap collection with optional props, per-heap remaining parts, refill cooldowns, direct animated pickups and an optional camera-search game.
  • Added staged weapon production with metal processing, pressing and assembly, along with optional table props at production stations.
  • Added updated default production routes and a steel-to-parts example, imported only when a server owner chooses the defaults.
  • Added NPC weapon exchanges with parts, weapon or mixed rewards, optional negotiation, provocation consequences and an administrator reset.
  • Added multi-weapon sales and delivery-contract dialogues with a persistent progress tracker, countdown and confirmed cancellation fee.
  • Improved weapon menus with exact model previews, owned ingredients, linked workshop positions, compact goods cards and shared Creator controls.
  • Fixed an issue where unchanged NPC contacts were recreated during dialogue updates or exchange capacity was checked before consuming inputs.
  • Added registration of missing weapon and material catalog items when the selected inventory supports runtime registration, while preserving existing definitions.
  • Improved the weapon-assembly asset pack by sharing optimized textures and compacting model data while preserving the assembly layout.
  • Improved translated weapon names, default descriptions, validation messages and continued-processing labels without overwriting custom text.

Other Changes

  • Improved Darknet conversation history with bounded loading of older messages, preserved scroll position and protection from delayed responses after switching conversations.
  • Improved laboratory runtime reads and plant processing by loading the selected laboratory and sharing its power/equipment context.
  • Improved reuse and cleanup of graffiti previews and heist presentation surfaces.
  • Added animated reputation-handbook page turns with right-to-left and reduced-motion support.
  • Fixed an issue where Crime shared storage and personal lockers hid weapons from transfer views.
  • Fixed an issue where external radial actions changed an explicit target or omitted vehicle actions when no player was nearby.
  • Fixed an issue where delayed interrogation-state cleanup left a player restrained.
  • Updated the remaining Crime translations, shared tablet headers, form labels, focus and calendar styling.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs_growing.lua
  • sky_crimesystem/config/drugs_market_threat_processing.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/heists/fleeca_legion_square_v1.json
  • sky_crimesystem/config/heists/pacific_standard_v1.json
  • sky_crimesystem/config/inventory/README.md
  • sky_crimesystem/config/inventory/items_qb.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/config/moneywash.lua
  • sky_crimesystem/config/weapons.lua
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.9.00.10.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare

These instructions cover sky_crimesystem 0.9.0 → 0.10.0. Complete earlier migrations first when upgrading from an older version. Back up the database, resource configuration, translations, inventory definitions and saved /jobconfig/Creator data. Test on staging and stop the server before replacing files. Start the framework, database connector and selected inventory, phone, banking, vehicle-key, weather and UI providers first, then sky_base 1.47.0 and sky_jobs_base 1.50.0. Start DOJ 0.5.0 before Police 1.39.0 for their shared court and catalogue workflows, and Ambulance 2.46.0 before Crime 0.10.0 when using the medical integration. Mechanic 1.36.0, Fire 1.18.0, Treasure Hunt 1.1.0 and Pets 1.1.0 follow the libraries. Include only installed resources.

  1. Replace files

Use the complete 0.10.0 customer package. Delete the entire sky_crimesystem/source/ folder and insert the new one, then replace sky_crimesystem/fxmanifest.lua from the same package. Refresh the entire sky_crimesystem/config/locales/ folder and merge custom translations. Merge the listed config files using the exact changes in this guide, refresh the listed built-in heist JSON files and inventory examples, and retain import.sql for manual migrations. Preserve custom locations and saved Creator data. Keep sky_crimesystem/config/moneywash.lua with Config.Moneywash.enabled = false; its delta is a comment change and no activation is required.

  1. Merge settings

In sky_crimesystem/config/config.lua, Config.UseJobConfigurator = true uses saved /jobconfig settings for sky_crimesystem over managed file defaults. Preserve those overrides, including deliberate deactivation. With Config.UseJobConfigurator = false, merge the plaintext values instead. Drug Creator and Heist Creator keep their own saved definitions; copying files does not replace them. Configure settings, install SQL/items/assets and import Creator content as separate actions.

sky_crimesystem/config/config.lua

  1. Config.CommandPermissions.crimeminigame did not exist; add { "god", "superadmin", "admin" }. This is an administrative no-reward preview command, not a new global player entitlement.
  2. Config.HeistDefinitionFiles gains Pacific Standard. Preserve any existing custom entries; shipped list:
Config.HeistDefinitionFiles = {
    "config/heists/fleeca_legion_square_v1.json",
    "config/heists/pacific_standard_v1.json",
}
  1. New Config.HeistPlanning.blockadeExplosionDamageScale = 0.75 and blockadeExplosionCameraShake = 0.15. Both options were previously absent; merge them into the existing HeistPlanning table. These are plaintext, not new Job Configurator keys.
  2. New Config.HeistPlanning.glassCaseTestCommand = "glasscasetest" and full new table:
Config.HeistPlanning.glassCaseTest = {
    cutDuration = 12000,
    completedDisplayDuration = 15000,
    lootHeight = 1.0,
}
  1. Add the previously absent Config.HeistPlanning.jewelCase.animation.impactPhase = 0.15 to the existing animation block. It sets the first glass impact within the animation from 0 to 1. Jewellery cases are now available in the Creator.

Crime continues to use sky_base/config/config.lua → Config.locale. Refresh the supplied Crime locale folder and preserve your selected language.

sky_crimesystem/config/drugs_growing.lua

Add these two new tables to Config.Drugs.Growing, preserving its existing settings. Environment survey settings are plaintext and are not managed by /jobconfig.

Config.Drugs.Growing.environmentSurvey = {
    enabled = true,
    scannerAce = "sky_crimesystem.environment.scan",
    mapRevision = "1",
    intervalSeconds = 15,
    refreshSeconds = 300,
    scanRadius = 15,
    batchSize = 4,
    timeoutSeconds = 10,
    rayLength = 80,
    originHeight = 0.3,
    indoorAirflow = 20,
    indoorTemperature = 21,
    gameHourProvider = function() return nil end,
}

Config.Drugs.Growing.wildPlantHighlight = {
    enabled = false,
    distance = 25.0,
}

Add dedicated ACE only for a trusted maintenance administrator, e.g. add_ace group.admin sky_crimesystem.environment.scan allow in server.cfg. The administrator's connected client in routing bucket 0 automatically scans registered world plant placements within 15 m, up to 4 every 15 s. Existing unknown/unscanned world plants pause growth and environmental water/stress changes. Survey the existing placements before treating the new default as ready, or deliberately set environmentSurvey.enabled = false to preserve the prior outdoor simulation. Samples persist in existing plant metadata, survive restart and remain usable without connected players. Increasing mapRevision after map/MLO/IPL/collision changes or moving plants invalidates prior samples. gameHourProvider returns authoritative game hour in [0,24) if integrated; default nil preserves host-clock seasonal simulation. It does not automatically integrate an arbitrary weather clock.

Managed new keys under Growing are drugWildPlantHighlightEnabled (false) and drugWildPlantHighlightDistance (25.0; supported 1–200 m); saved values override file defaults. Outline radius does not extend harvest reach.

Add RAIN_HALLOWEEN to Config.Drugs.Growing.outdoor.liveWeather.rainTypes: { "RAIN", "THUNDER", "CLEARING", "RAIN_HALLOWEEN" }; add SNOW_HALLOWEEN to Config.Drugs.Growing.outdoor.liveWeather.snowTypes: { "SNOW", "BLIZZARD", "SNOWLIGHT", "XMAS", "SNOW_HALLOWEEN" }. Preserve custom existing members.

sky_crimesystem/config/drugs_market_threat_processing.lua

Add these entries to existing Config.Drugs.Processing.minigames, preserving the existing entries:

batch_cooling = { baseQuality = 68, variance = 22, failBelow = 36 },
bottle_blending = { baseQuality = 66, variance = 24, failBelow = 36 },
seal_pouch = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_jar = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_vacuum = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_brick = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_bottle = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_foil = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_cup = { baseQuality = 70, variance = 20, failBelow = 35 },
seal_sleeve = { baseQuality = 70, variance = 20, failBelow = 35 },

In Config.Drugs.Processing.routes.meth_basic.steps, change the key = "cool" step's minigame from "timing" to "batch_cooling". In Config.Drugs.Processing.routes.lean_bottle.steps, change the key = "blend" step's minigame from "timing" to "bottle_blending". Other shipped step values remain the same. Saved Drug Creator recipe entries retain their existing choices: choose the new minigame in that recipe or explicitly import only the intended replacement default. File changes/restart do not rewrite saved recipes. This is Creator content, not a new global /jobconfig setting.

sky_crimesystem/config/weapons.lua

Config.Weapons.enabled: false → true in the supplied file defaults. Creator.enabled and Runtime.enabled stay true. Saved weaponSystemEnabled, weaponRuntimeEnabled and entry/default overrides remain authoritative after startup. Do not overwrite deliberate deactivation when making the section visible. Review the existing Weapon Routes General, Access, Collection, Production, Market, Contract and Street Sale settings.

Add the previously absent complete plaintext runtime blocks/values:

Config.Weapons.Runtime.collectorVisualModel = "prop_rub_scrap_06"
Config.Weapons.Runtime.collectorVisualVariants = {
    { model = "prop_rub_scrap_06" },
    { model = "prop_rub_carpart_02", pitch = 90 },
    { model = "prop_rub_carpart_04" },
    { model = "w_pi_pistol_mag1", pitch = 90 },
    { model = "w_ar_assaultrifle_mag1", pitch = 90 },
    { model = "w_at_scope_small" },
    { model = "w_at_pi_supp" },
    { model = "prop_ld_ammo_pack_01" },
}
Config.Weapons.Runtime.collectorHighlight = {
    color = { 80, 210, 255, 210 },
    activeColor = { 255, 205, 70, 255 },
    markerSize = 0.10,
    activeMarkerSize = 0.15,
}
Config.Weapons.Runtime.collectorGroundOffsets = { prop_rub_pile_01 = -0.45 }
Config.Weapons.Runtime.collectorPickupDistance = 0.55
Config.Weapons.Runtime.collectorWalkTimeout = 6000
Config.Weapons.Runtime.collectorPickupAnimation = {
    dict = "anim@mp_snowball", clip = "pickup_snowball", duration = 2400,
}

Collection default definition key = "minigame", settingKey = "weaponDefaultCollectionMinigame": default "timing" → "scrap_search"; allowed options add "scrap_search" to timing/precision/pressure. Existing weaponDefaultCollectionUseMinigame = false remains so direct collection is the default. Saved overrides and per-entry choices remain. The visual runtime blocks above are not new configurator keys.

The shipped Config.Weapons.Defaults now contains 26 definitions. Refresh the full default catalog from the new file when desired; it is importable content, never a startup overwrite of existing routes. Four production processor defaults use prop_table_03; three staged weapon defaults end at assembly, without the old final calibration stage. Import affected existing defaults with replacement enabled only after reviewing custom settings; alternatively change their prop/steps in the Creator. Foundation dependencies must be imported with the dependent routes or already exist.

The following new per-entry values are managed by Weapon Creator and saved in its existing data: collector propModel, propCount (default 1, max 12), propRadius (default 0), partsPerHeap (default old minigameRounds or 5, range 1–10); processor propModel (except trade), tradeRewardMode (all/parts/weapons/mixed, default all), tradeAggressionEnabled (true), tradeBlockSeconds (300), tradeNegotiationEnabled (true), tradeNegotiationChance (50), tradeDiscountPercent (20), tradeNegotiationCooldownSeconds (300). Existing entries receive compatible absent-field defaults; original data is retained.

Other saved content changes

  • Shop shopRegisters is no longer a separate settings table; migration attaches the first matching legacy register to shopLocations as registerId, registerX, registerY, registerZ, retains existing embedded values, assigns missing shop IDs and removes shopRegisters from the transformed payload. Only one register per shop is supported. Plaintext Config.ShopRobbery.locations[].registers likewise takes its first register and requires one. Review affected saved shops and use separate shop entries for additional independent registers. Clerk/register/safe placement uses the existing world placement controls. No changed public ShopRobbery default file/table needs replacing beyond source/configurator data.
  • New laboratory/camper Creator fields: purchaseEquipment = false, purchaseUpgradeLevel = 0 (0–5), ownedBlipEnabled = false. Existing tier remains independent. Set per definition; no global Job Configurator setting or SQL schema change. Existing owned assets do not receive grants. Campers use the fixed Drug Wars interior and no longer need a selected interior template. Preserve old saved templates/data; do not delete them as an update step.
  • Heist Creator authoring: gas duration = 0 means persistent until plan closes; crew-mask scaling is explicit per preparation, laser hack settings are per group, crew/police values are integers. Existing custom definitions remain; choose the new controls to adopt the behavior.
  • Storage weapons visibility is a registration capability fixed in both file-based and configurator-based Crime group paths. No grant reset/permission-ID migration is needed.

New weapon contracts remain active until delivery or explicit cancellation at the buyer. Only one contract may be active. Expiry prevents delivery but does not discard the contract. The server calculates a dirty-money cancellation fee of 15% of the agreed value including contract bonus, minimum 1; existing contracts without a recorded fee retain zero. There is no new cancellation-percentage setting.

Optional profiling remains off by default. If support requests it, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, perform a full server restart, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-release-20261014.json with a new filename for each capture. Disable it with setr sky_profiler 0 and another full server restart. This is not a /jobconfig setting; recording and upload do not start automatically.

  1. Database, items and assets

Database

Config.AutoExecuteQuery = true performs the normal Crime schema migration on start and now adds the three lab indexes. Config.HeistPersistence.enabled = true plus .autoMigrate = true controls the separate heist migration and now creates sky_crime_heist_loot_templates. Manual installations need both changes; /jobconfig does not install either.

For manual migrations, open your database management tool, select the active FiveM database, and use its SQL query editor. Create the following new table:

CREATE TABLE IF NOT EXISTS `sky_crime_heist_loot_templates` (
    `id` VARCHAR(64) NOT NULL,
    `label` VARCHAR(80) NOT NULL,
    `loot_type` VARCHAR(8) NOT NULL,
    `full_value` BIGINT UNSIGNED NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Inspect the indexes on sky_crime_drug_equipment:

SHOW INDEX FROM `sky_crime_drug_equipment`;

If no returned row has Key_name = idx_drug_equipment_lab, add that missing index:

ALTER TABLE `sky_crime_drug_equipment` ADD INDEX `idx_drug_equipment_lab` (`lab_id`);

Inspect the indexes on sky_crime_drug_workers:

SHOW INDEX FROM `sky_crime_drug_workers`;

If no returned row has Key_name = idx_drug_workers_lab, add that missing index:

ALTER TABLE `sky_crime_drug_workers` ADD INDEX `idx_drug_workers_lab` (`lab_id`);

Inspect the indexes on sky_crime_drug_plants:

SHOW INDEX FROM `sky_crime_drug_plants`;

If no returned row has Key_name = idx_drug_plants_lab, add that missing index:

ALTER TABLE `sky_crime_drug_plants` ADD INDEX `idx_drug_plants_lab` (`lab_id`);

The shipped import uses MariaDB ADD INDEX IF NOT EXISTS; MySQL installations should inspect information_schema.statistics/SHOW INDEX and run only absent plain ALTERs. Retain all existing rows. There is no new element-image table in the final delta and no new weapon/camper/ownership/environment schema. Retain the existing 0.9.0 batch-retired/index migrations; older installations must complete earlier update instructions.

Items and images

  • Optional QBCore stackable dirty money: the newly supplied black_money item in sky_crimesystem/config/inventory/items_qb.lua; only install if sky_base/config/qb_money.lua uses Config.QBBlackMoney.mode = "item" and item "black_money". One item is one dollar, weight 0, unique false, useable false. Account/marked-bills setups retain their selected mode and should not adopt the optional item needlessly.
  • Image sky_crimesystem/config/inventoryimages/png/black_money.png already exists; use that image if installing the optional QB item. It is not a new image in the tag delta.
  • Weapon/material catalog registration runs on save/import/startup and preserves existing inventory definitions. If the inventory does not support runtime registration (e.g. ox_inventory), define missing items manually from actual selected catalogs/server warning; do not claim all inventories auto-register them. Existing ESX loadout vs item mode and ammo/metadata/provider behavior need the current Base. No forced item conversion or existing-item rewrite.
  • Updated route defaults still require their selected tools, materials and item-based weapon outputs to be available. New/default recipe imports and item installation are separate actions.

If installing the optional QBCore item, copy only this missing entry into the existing QBShared.Items table, then copy sky_crimesystem/config/inventoryimages/png/black_money.png into your inventory image directory:

["black_money"] = {
        name = "black_money",
        label = "Black Money",
        weight = 0,
        type = "item",
        image = "black_money.png",
        unique = false,
        useable = false,
        shouldClose = false,
        description = "Black Money",
},

Assets

The new workbench, gallery, countdown and handbook assets plus optimized weapon models ship through the complete sky_crimesystem/source/ replacement. It removes obsolete source textures. No new Crime stream model, map or inventory-image file outside source is required. Use source and manifest from the same package.

  1. Restart and check

Perform a full server restart and reconnect clients. Start the framework, database connector and selected inventory, phone, banking, vehicle-key, weather and UI providers first, then sky_base 1.47.0 and sky_jobs_base 1.50.0. Start DOJ 0.5.0 before Police 1.39.0 for their shared court and catalogue workflows, and Ambulance 2.46.0 before Crime 0.10.0 when using the medical integration. Mechanic 1.36.0, Fire 1.18.0, Treasure Hunt 1.1.0 and Pets 1.1.0 follow the libraries. Include only installed resources.

Confirm Crime 0.10.0, library readiness, the global loot-template table and all three named laboratory indexes. Check the first startup/database error. Verify saved shops and Creator definitions, visible storage weapons and disabled tablet-app restrictions. On staging, check surveyed world plants and unknown-plant pause, optional outlines and ownership icons for eligible/ineligible players, purchase presets without modifying existing assets, private lockpicking, camper plates/keys/resale and manual drug production/sales. Resume an Easy heist draft, undo/redo an edit and test crew/police conditions, jewellery cases and the Pacific Standard prerequisites. If adopting Weapon Routes, test configured items, scrap refill, one production route, NPC exchange and contract delivery/cancellation with your selected providers.

Version 0.9.0

Highlights

  • Added separate laboratory ownership limits for characters and factions.
  • Added removal of installed laboratory equipment with reusable items returned to storage.
  • Improved drug plant ground placement across growth stages.

Notable Changes

  • Improved laboratory storage interactions to offer the available actions in a menu.
  • Improved camper locking when no enabled vehicle-key provider is available.
  • Improved Drug Creator import previews to distinguish new definitions from existing entries.
  • Improved drug runtime loading to exclude retired batches while retaining their historical data.
  • Improved Heist Creator previews when changing the selected object.
  • Fixed robbery logging errors interrupting the remaining location setup or handover.
  • Fixed cultivated plant harvesting to use the configured drug's output when no explicit harvest profile exists.

Other Changes

  • Improved laboratory updates to preserve active machinery state and avoid duplicate snapshots.
  • Updated supplier configuration guidance to distinguish import templates from saved creator positions.

Changed Files

  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_labs_power_workers.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.8.10.9.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare

These instructions cover sky_crimesystem 0.8.1 → 0.9.0. Complete applicable earlier migrations when upgrading from an older version. Back up the database, resources, framework files, custom configuration/translations and saved /jobconfig/Creator data. Test on staging and stop the server for replacement. Install the coordinated versions for your installed resources. Start the framework, database connector and selected inventory, phone, banking and UI providers first, then Base 1.46.0 and Jobs Base 1.49.0. Start DOJ 0.4.0 before Police 1.38.0 for their shared catalogue and court workflows. Start Ambulance 2.45.0 before Crime 0.9.0 when using their medical integration. Mechanic 1.35.0 and Fire 1.17.0 follow both libraries. Include only installed resources.

  1. Replace files

Use the complete 0.9.0 customer package. Delete the entire sky_crimesystem/source/ folder and insert the new one, then replace sky_crimesystem/fxmanifest.lua from the same package. Refresh the complete sky_crimesystem/config/locales/ tree and merge custom translations. Preserve your selected language. Do not restore an older bootstrap or merge generated interface files.

Merge config/drugs_labs_power_workers.lua and review the updated supplier comments in config/drugs_laboratories.lua. Keep your custom locations and drug settings. Retain the supplied main import.sql for manual updates. Use the complete release package and its matching manifest rather than selected generated interface files.

  1. Merge settings

When Config.UseJobConfigurator = true, saved /jobconfig settings take precedence over the plaintext defaults. Change the effective values in /jobconfig; copying config files does not replace saved jobs, grades, locations or overrides. Keep the saved data and do not reset the configurator. Use /jobconfigimport sky_crimesystem only if you intentionally want to import your edited plaintext configuration, after backing up and reviewing its replacement scope. With Config.UseJobConfigurator = false, merge the settings into the supplied config files instead.

New Config.Drugs.Labs.maxLaboratoriesPerCharacter = 0 and maxLaboratoriesPerFaction = 0 in config/drugs_labs_power_workers.lua retain unlimited ownership. In /jobconfig → Crime → Drug System, use Laboratories per Character (drugMaxLaboratoriesPerCharacter) and Laboratories per Faction (drugMaxLaboratoriesPerFaction), each 0–100. Owned and rented fixed laboratories count; campers and shared access do not. Existing owners keep their data; limits apply when acquiring another laboratory.

Removing installed equipment returns its configured item to laboratory storage and preserves condition, fuel and oil. Active production/busy equipment cannot be removed; starting storage stays, and removing a shelf requires enough remaining storage capacity. No new item definition is required if using the supplied existing equipment catalogue. Custom equipment needs its configured return item.

Supplier entries in Config.Drugs.Laboratories are import templates. After import, move the saved supplier with Set position in Drug Creator; editing the template does not relocate the saved entry. Do not reimport/reset saved locations to move one supplier. Camper manual locking is available only when no enabled key provider owns that workflow; a configured working provider keeps control. Plant grounding retains saved coordinates and supports the bundled growth models. Keep existing heist/drug activation and permissions.

Optional profiling remains off by default. If support requests it, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, perform a full server restart, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-release-20261008.json with a new filename for each capture. Disable it with setr sky_profiler 0 and another full server restart. This is not a /jobconfig setting; no recording or upload starts automatically.

  1. Database, items and assets

SQL: New generated sky_crime_drug_batches.retired is a virtual TINYINT derived from boolean metadata.consumed or metadata.sold; it is not a manually written status or a deletion. Ten indexes cover active batches, sales history, processing/distribution orders, routes, threats, work orders and laboratory ledger reads:

  • sky_crime_drug_batches: idx_drug_batch_retired_lab(retired, lab_id).
  • sky_crime_drug_sales: idx_drug_sale_time(sold_at), idx_drug_sale_market_time(drug_type, sale_channel, sold_at), idx_drug_sale_seller_time(seller, sold_at).
  • sky_crime_drug_processing: idx_drug_processing_status_lab(status, lab_id).
  • sky_crime_drug_distribution: idx_drug_distribution_status_dealer(status, dealer_id).
  • sky_crime_drug_route_runs: idx_drug_route_status_expiry(status, expires_at).
  • sky_crime_drug_threats: idx_drug_threat_type_time(threat_type, created_at).
  • sky_crime_drug_work_orders: idx_drug_work_order_lab_status(lab_id, status).
  • sky_crime_drug_lab_ledger: idx_drug_lab_ledger_time(lab_id, created_at).

With Config.AutoExecuteQuery = true, let the automatic migration finish. In manual mode, execute the matching Existing MariaDB installations; automatic resource migrations apply the same schema. ALTER statements from the current main import.sql before starting Crime. They add the generated column and these indexes to existing tables; confirm them in the database. Use your database's supported syntax. Retain retired batches, sales history, plants, laboratories, production and all creator data. No new heist import is needed for this release. Items: No new published item definitions; existing equipment return/harvest items still need their configured inventory definitions. Assets: No new published stream model, map or inventory-image requirement.

The supplied ADD COLUMN/INDEX IF NOT EXISTS manual syntax is for MariaDB. On MySQL 8, first inspect SHOW COLUMNS and SHOW INDEX for each named table, then add only missing columns/indexes using MySQL-supported ADD COLUMN/ADD INDEX without IF NOT EXISTS. Keep the supplied definitions and generated expression unchanged. Do not execute an unsupported clause or delete an existing column/index to rerun it.

  1. Restart and check

Perform a full server restart to reload changed manifests and file lists, then reconnect clients. Start the framework, database connector and selected inventory, phone, banking and UI providers first, then Base 1.46.0 and Jobs Base 1.49.0. Start DOJ 0.4.0 before Police 1.38.0 for their shared catalogue and court workflows. Start Ambulance 2.45.0 before Crime 0.9.0 when using their medical integration. Mechanic 1.35.0 and Fire 1.17.0 follow both libraries. Include only installed resources. Check actual installed versions and the first startup/database error before testing.

Confirm migration success, the generated retired column and all ten indexes. Check a saved lab's active production and storage, acquire a disposable lab under character/faction limits, and verify shared access/campers do not count. Remove inactive equipment and confirm the returned item's condition/fuel/oil; test busy and insufficient-capacity rejection. Check a saved supplier position after restart, camper lock ownership and plant ground contact through growth. Confirm configured harvest output and an existing robbery/Heist Creator preview. Preserve historical sales and batches.

Version 0.8.1

Highlights

  • Added separate configurable limits for fixed laboratories owned or rented by each character and faction, with unlimited ownership retained by default.
  • Added removal of installed laboratory equipment and additional storage shelves from their interaction menus, returning the installation item to laboratory storage and preserving its condition, fuel and oil for reinstallation.
  • Fixed an issue where Crime failed to initialize when shared dependencies took more than 60 seconds to load.

Notable Changes

  • Improved Crime startup so a failed migration is reported without aborting the entire initializer.
  • Fixed an issue where death and injury handling could register before Ambulance was ready to accept it.
  • Optimized inventory checks when loading drug, contact and market information while retaining fresh checks for player actions.
  • Changed laboratory storage interactions to open a menu with storage access and shelf actions instead of opening the storage immediately.
  • Fixed an issue where growing plant pots rose above their placement surface when their growth model changed.
  • Fixed the Drug Creator import preview so saved entries are correctly marked as existing while their template entries remain selectable.
  • Fixed an issue where invalid saved ATM or shop robbery settings could interrupt Crime System startup and prevent the remaining location editing tools from loading.
  • Fixed an issue where rejected robbery alerts or unsuccessful shop clerk code handoffs could raise an additional logging error.

Other Changes

  • Updated the release package to keep its own dependency bootstrap editable for support.

Changed Files

  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_labs_power_workers.lua
  • sky_crimesystem/config/illegal_business.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.8.00.8.1

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare

These instructions cover sky_crimesystem 0.8.0 → the refreshed 0.8.1 package. If you installed an earlier 0.8.1 download today, download the current 0.8.1 package again and apply these steps. The manifest version stays the same, so the version number alone does not identify the refreshed package. Back up resources, the database, custom configuration, translations and saved Job Configurator/Creator data. Validate on staging and stop the server for replacement. Install the refreshed Base 1.45.1, then Jobs Base 1.48.1, then the matching updates for your installed jobs and Crime. Complete earlier migrations first when upgrading from an older version.

  1. Replace files

Replace sky_crimesystem/fxmanifest.lua, the listed config files and the complete sky_crimesystem/config/locales/ folder from the matching download. Delete the installed sky_crimesystem/source/ folder and reinsert the complete new sky_crimesystem/source/ folder; merge your own configuration separately using the exact changes below. Preserve existing database rows and saved creator entries. The file list is based on the committed shipped resource tree; frontend source, tests, internal docs and output reports are not customer replacement paths.

  1. Merge settings

In sky_crimesystem/config/drugs_labs_power_workers.lua, add Config.Drugs.Labs.maxLaboratoriesPerCharacter and Config.Drugs.Labs.maxLaboratoriesPerFaction. Both fields were absent before this update; both new shipped values are 0, meaning unlimited. Valid values are whole numbers from 0 to 100. Preserve your existing laboratory settings and merge these two fields into the existing table; the complete new shipped table below is a reference, not a request to reset your custom values.

Config.Drugs.Labs = {
    enabled = true,
    maxLaboratoriesPerCharacter = 0, -- Fixed laboratories, owned or rented; 0 = unlimited.
    maxLaboratoriesPerFaction = 0, -- Campers and shared access do not count.
    camperHotVehicleMinutes = 240,
    defaultRentDays = 7,
    rentWarningHours = 24,
    rentExpiredHeatGain = 8,
    camperMoveCooldownMinutes = 30,
    camperMoveHeatGain = 4,
    upgradeCostMultiplier = 1.0,
    ownershipRequired = true,
    storageUnitsPerAmount = 1.0,
    storageOverloadHeatGain = 1.4,
    storageOverloadDecayMultiplier = 1.45,
    cleanlinessDecayPerLifecycle = 1.2,
    odorGainPerLifecycle = 0.9,
    noiseDecayPerLifecycle = 0.8,
    maintenanceDecayPerLifecycle = 0.7,
    dirtyContaminationMultiplier = 1.35,
    dirtyQualityPenalty = 4,
    maintainPaymentAccount = "money",
    rentPaymentAccount = "bank",
    rentDepositMultiplier = 2,
    maximumRentDays = 28,
    seizureHeatThreshold = 96,
    seizureChancePerLifecycle = 4,
    seizureDurationMinutes = 90,
    unusableMaintenanceThreshold = 8,
    recoveryBaseCost = 12000,
    maintainActions = {
        clean = { cost = 180, cleanliness = 30, odor = -8, maintenance = 2, heat = -1 },
        ventilate = { cost = 120, odor = -28, noise = 4, heat = -0.5 },
        repair = { cost = 350, maintenance = 26, cleanliness = 4, heat = -1 },
        sanitize = { cost = 260, cleanliness = 20, odor = -16, maintenance = 4, heat = -1.5 },
    },
    accessRoles = { "owner", "manager", "producer", "storage", "security", "guest" },
    accessCapabilities = { "enter", "storage", "equipment", "workers", "keys", "upgrades" },
    roleCapabilities = {
        owner = { enter = true, storage = true, equipment = true, workers = true, keys = true, upgrades = true },
        manager = { enter = true, storage = true, equipment = true, workers = true, keys = true, upgrades = true },
        producer = { enter = true, storage = true, equipment = true, workers = false, keys = false, upgrades = false },
        storage = { enter = true, storage = true, equipment = false, workers = false, keys = false, upgrades = false },
        security = { enter = true, storage = false, equipment = false, workers = false, keys = false, upgrades = false },
        guest = { enter = true, storage = false, equipment = false, workers = false, keys = false, upgrades = false },
    },
    actionCapabilities = {
        enter = "enter",
        batchStorage = "storage",
        market = "storage",
        route = "storage",
        consume = "storage",
        processing = "equipment",
        placeEquipment = "equipment",
        serviceEquipment = "equipment",
        plantSeed = "equipment",
        maintainPlant = "equipment",
        harvestPlant = "equipment",
        hireWorker = "workers",
        manageKeys = "keys",
        manageUpgrades = "upgrades",
    },
    labTypes = {
        camper = { label = "Camper", slots = 3, storage = 120, power = 500, heatMultiplier = 1.35, mobile = true },
        basement = { label = "Basement", slots = 8, storage = 450, power = 1500, heatMultiplier = 1.0 },
        garage = { label = "Garage", slots = 10, storage = 650, power = 2200, heatMultiplier = 1.08 },
        apartment = { label = "Apartment", slots = 7, storage = 360, power = 1250, heatMultiplier = 0.92 },
        warehouse = { label = "Warehouse", slots = 18, storage = 1400, power = 5500, heatMultiplier = 1.25 },
        industrial = { label = "Industrial Hall", slots = 21, storage = 1750, power = 7200, heatMultiplier = 1.34 },
        bunker = { label = "Bunker", slots = 24, storage = 2200, power = 9000, heatMultiplier = 0.78 },
    },
    tiers = {
        { tier = 1, label = "Starter", cost = 0, slotBonus = 0, storageMultiplier = 1.0, security = 10, qualityBonus = 0, powerBonus = 0 },
        { tier = 2, label = "Improved", cost = 25000, slotBonus = 2, storageMultiplier = 1.25, security = 25, qualityBonus = 2, powerBonus = 250 },
        { tier = 3, label = "Professional", cost = 65000, slotBonus = 4, storageMultiplier = 1.55, security = 45, qualityBonus = 4, powerBonus = 700 },
        { tier = 4, label = "Industrial", cost = 145000, slotBonus = 7, storageMultiplier = 1.9, security = 65, qualityBonus = 7, powerBonus = 1500 },
        { tier = 5, label = "Elite", cost = 325000, slotBonus = 10, storageMultiplier = 2.35, security = 85, qualityBonus = 10, powerBonus = 3500 },
    },
    facilityUpgrades = {
        concealment = { label = "Concealment", maxTier = 4, costs = { 9000, 24000, 52000, 110000 }, heatReduction = 4, raidDefense = 3 },
        hidden_storage = { label = "Hidden Storage", maxTier = 4, costs = { 12000, 32000, 68000, 145000 }, protectedShare = 0.12, storageBonus = 15 },
        door = { label = "Door & Lock", maxTier = 5, costs = { 7000, 18000, 42000, 95000, 190000 }, raidDefense = 7 },
        keycards = { label = "Keycard System", maxTier = 3, costs = { 18000, 48000, 105000 }, raidDefense = 5 },
        cctv = { label = "CCTV", maxTier = 4, costs = { 9500, 26000, 58000, 125000 }, raidDefense = 5 },
        alarm = { label = "Alarm System", maxTier = 4, costs = { 7500, 22000, 50000, 115000 }, raidDefense = 5 },
        clean_room = { label = "Clean Room", maxTier = 4, costs = { 16000, 44000, 92000, 185000 }, qualityBonus = 2, contaminationReduction = 4 },
        worker_quarters = { label = "Worker Quarters", maxTier = 4, costs = { 11000, 30000, 65000, 135000 }, fatigueRecovery = 3 },
        worker_supplies = { label = "Food & Water", maxTier = 4, costs = { 6500, 18000, 40000, 85000 }, moraleBonus = 2, hungerReduction = 4 },
        medical_station = { label = "Medical Station", maxTier = 3, costs = { 14000, 38000, 82000 }, stressReduction = 3 },
        break_room = { label = "Break Room", maxTier = 3, costs = { 8500, 24000, 54000 }, moraleBonus = 3, stressReduction = 2 },
    },
}

With the Job Configurator enabled, open /jobconfig → Crime System → Drug System → General and check Laboratories per Character (drugMaxLaboratoriesPerCharacter) and Laboratories per Faction (drugMaxLaboratoriesPerFaction). These are central server settings, independent of the selected faction. The character limit applies separately to each character; the faction limit applies separately to each faction. Purchased and rented fixed laboratories count together. Campers and access to another owner's laboratory do not count. A stored laboratory still counts when its rental has expired. Lowering a limit blocks further acquisitions; it does not remove existing laboratories. Saved configurator overrides remain authoritative. Set or clear the two overrides there as needed and verify the effective values after a restart; editing the Lua file alone does not replace a saved override.

sky_crimesystem/config/drugs_laboratories.lua changes only two comments in the supplier block; its coordinates, heading, dealer model, stock and prices are unchanged. The complete new supplier block is:

    supplier = {
        enabled = true,
        account = "money",
        interactionDistance = 2.2,
        -- Import templates: saved Drug Creator suppliers keep their persisted positions.
        -- Move an imported supplier with Set position in the creator.
        locations = {
            {
                id = "dock_supplier",
                label = "Laboratory Supply Dealer",
                coords = { x = 1218.0, y = -3114.83, z = 5.54 },
                heading = 90.0,
                pedModel = "s_m_y_dockwork_01",
                scenario = "WORLD_HUMAN_CLIPBOARD",
                marker = true,
            },
        },
        items = {
            { id = "plant_pot", item = "plant_pot", label = "labSupplyPlantPot", category = "cultivation", price = 350, maxPurchase = 12, stockEnabled = true, stockMode = "fixed", stockAmount = 80, description = "labSupplyPlantPotDescription" },
            { id = "potting_soil", item = "potting_soil", label = "labSupplyPottingSoil", category = "cultivation", price = 180, maxPurchase = 20, stockEnabled = true, stockMode = "random", stockMin = 90, stockMax = 160, description = "labSupplyPottingSoilDescription" },
            { id = "plant_nutrients", item = "plant_nutrients", label = "labSupplyPlantNutrients", category = "cultivation", price = 240, maxPurchase = 15, stockEnabled = true, stockMode = "random", stockMin = 60, stockMax = 110, description = "labSupplyPlantNutrientsDescription" },
            { id = "water_bottle", item = "water_bottle", label = "labSupplyWater", category = "cultivation", price = 60, maxPurchase = 25, stockEnabled = false, description = "labSupplyWaterDescription" },
            { id = "trimming_shears", item = "trimming_shears", label = "labSupplyShears", category = "tools", price = 850, maxPurchase = 3, stockEnabled = true, stockMode = "fixed", stockAmount = 18, description = "labSupplyShearsDescription" },
            { id = "lab_gloves", item = "lab_gloves", label = "labSupplyGloves", category = "tools", price = 220, maxPurchase = 10, stockEnabled = false, description = "labSupplyGlovesDescription" },
            { id = "digital_scale", item = "digital_scale", label = "labSupplyScale", category = "tools", price = 950, maxPurchase = 2, stockEnabled = true, stockMode = "random", stockMin = 8, stockMax = 16, description = "labSupplyScaleDescription" },
            { id = "repair_kit", item = "repair_kit", label = "labSupplyRepairKit", category = "maintenance", price = 1200, maxPurchase = 4, stockEnabled = true, stockMode = "fixed", stockAmount = 20, description = "labSupplyRepairKitDescription" },
            { id = "fuel_can", item = "fuel_can", label = "labSupplyFuel", category = "maintenance", price = 500, maxPurchase = 6, stockEnabled = true, stockMode = "random", stockMin = 24, stockMax = 48, description = "labSupplyFuelDescription" },
            { id = "machine_oil", item = "machine_oil", label = "labSupplyOil", category = "maintenance", price = 420, maxPurchase = 8, stockEnabled = true, stockMode = "fixed", stockAmount = 45, description = "labSupplyOilDescription" },
            { id = "drug_packaging", item = "drug_packaging", label = "labSupplyPackaging", category = "processing", price = 180, maxPurchase = 25, stockEnabled = false, description = "labSupplyPackagingDescription" },
            { id = "lab_shelf_small", item = "lab_shelf_small", itemLabel = "Small Shelf", label = "labSupplyShelfSmall", category = "storage", price = 8000, maxPurchase = 2, stockEnabled = true, stockMode = "fixed", stockAmount = 10, description = "labSupplyShelfSmallDescription" },
            { id = "lab_shelf_medium", item = "lab_shelf_medium", itemLabel = "Industrial Shelf", label = "labSupplyShelfMedium", category = "storage", price = 18000, maxPurchase = 1, stockEnabled = true, stockMode = "random", stockMin = 3, stockMax = 7, description = "labSupplyShelfMediumDescription" },
            { id = "lab_shelf_large", item = "lab_shelf_large", itemLabel = "Secured Storage Rack", label = "labSupplyShelfLarge", category = "storage", price = 42000, maxPurchase = 1, stockEnabled = true, stockMode = "random", stockMin = 1, stockMax = 3, description = "labSupplyShelfLargeDescription" },
        },
    },

Supplier entries already imported into the Drug Creator keep their saved settings and position. To move one, open the Drug Creator (default command /drugcreator) with your existing creator permission, select the saved laboratory supplier, choose Set position, and confirm the new position and heading. The saved entry changes; its other settings remain intact. Editing the supplier template or restarting the resource does not move the saved entry. If you deliberately need to replace it from a template, select only that supplier in the import preview and enable replacement of existing entries; this also replaces its other imported settings, so review products and prices first. Keep Heist Creator imports separate.

No other released plaintext option, init/provider setting or command default changes in this follow-up. Update the resource's complete locale folder for new equipment and ownership messages, and update Jobs Base for the matching configurator labels.

Optional diagnostics are disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, restart the server, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-startup-hotfix.json. Disable with setr sky_profiler 0 and another full server restart. This is not a /jobconfig setting; no recording or upload starts automatically.

  1. Database, items and assets

No new SQL schema, manual SQL import, database reset, item definition, inventory icon or streamed model is required by these follow-up changes. Existing laboratory, equipment, inventory, construction-node and production tables are reused. Keep your existing items and assets. Equipment removal returns the already configured installation item to laboratory storage, including its condition, fuel and oil where applicable. If you use custom equipment, check that its existing return item is configured and available; a missing return item blocks removal. Your inventory integration must preserve item metadata when transferring the returned item if you want its saved equipment state to survive that transfer. Do not reimport the full seed SQL or overwrite all creator defaults to apply these fixes. Keep the existing database migration/provider setup from the 0.8.1 instructions; these changes add no new provider selection or credentials.

  1. Restart and check

Perform a full server restart to reload the source and manifest file lists, then reconnect clients. Start the framework, database connector and selected providers first, then refreshed Base 1.45.1, Jobs Base 1.48.1 and Crime 0.8.1. Stop Crime System before replacing files. Start the updated Sky Base first, then Sky Jobs Base, then Crime System; restore other resources stopped with their dependencies in their normal dependency order. Confirm that both libraries complete startup and Crime System finishes registration. Read the console for actual startup errors and new warnings about invalid saved ATM/shop settings. This follow-up uses the existing startup and automatic migration owners; a successful file copy alone does not prove the running resource or database state.

  1. Open /jobconfig → Crime System → Drug System → General. Confirm both new limits, save your intended values and check them after restart. With a temporary limit of one on a test owner, purchase or rent one fixed laboratory, then check that a second acquisition is refused without charging the owner. Check character and faction owners separately; confirm existing ownership is preserved and camper/shared-access cases do not consume the fixed-laboratory limit. Restore your intended values.
  2. In an idle laboratory, approach an installed machine, generator or additional storage shelf and open its interaction/status menu. Use Remove, check that exactly one installation item appears in laboratory storage, the prop and linked construction slot are freed, and condition/fuel/oil survive reinstallation. Check keyboard interaction and your configured target provider. The starting storage must remain; queued/running production and insufficient remaining storage capacity must refuse removal without losing equipment or stored contents. Users need the existing laboratory equipment capability.
  3. Let a planted pot change between small, medium and large growth stages on the same placement surface. Check that its pot remains on that surface and existing saved plant positions are preserved. If you use custom plant models, check their alignment separately.
  4. Open the Drug Creator import preview for an already imported supplier. It must be marked as existing, remain selectable and be skipped when replacement is off; do not overwrite it just to test the preview. If you move a saved supplier with Set position, check its saved heading and NPC on connected clients.
  5. Open the regular Crime location editing tools and ATM/shop configuration. Invalid saved robbery entries should produce useful warnings while remaining location tools register; repair the warned entries in the configurator. If applicable, confirm robbery alerts and clerk code handoff no longer add a logging error when the underlying action is rejected.
  6. Open drug contact and market views with inventory-backed batches. Change the player's carried quantity and reopen/refresh through the normal flow; quantities and eligible batches must reflect the current player's inventory, including separate characters. Complete ordinary laboratory/storage/production checks before allowing normal play. A long dependency wait no longer aborts at 60 seconds. Repair the original error behind any migration warning; failure to read saved settings remains an initialization error. Check the existing Ambulance death-handling integration on staging when installed.

Version 0.8.0

Highlights

  • Added a personal reputation handbook with character progress, available reputation rewards, recent activity, page navigation, and zoom controls through /crimerep.
  • Added named reputation rules that can customize rewards for an activity, a specific heist, or a specific drug sale.

Notable Changes

  • Improved Heist Creator placement with contextual keyboard and controller instructions and movement while selecting obstacles.
  • Changed new gas-zone placement to require at least four corners before confirmation while preserving existing saved zones.
  • Fixed an issue where preparation links to several obstacles could point to the wrong rows or shift after layout changes.
  • Improved heist preparation fields with clearer action labels, examples, requirement hints, and readable placeholders.
  • Fixed an issue where Crime menus and tablet apps could initialize before their dependencies were ready during startup.
  • Fixed an issue where reloading an open Crime interface could leave the menu closed while the player still had input focus.
  • Fixed an issue where a new laboratory placement could reuse an earlier editor's preview state.
  • Fixed an issue where players could retain access to a faction laboratory after their membership changed.
  • Fixed an issue where faction laboratory sale refunds could reach a private account, and clarified the refund destination before and after a sale.
  • Changed laboratory finance history to exclude purchase and rental deposits paid outside the laboratory treasury.
  • Fixed an issue where entering a camper laboratory could lose the player's valid interior presence and block storage or raid access.
  • Fixed an issue where laboratory storage transfers could fail without showing the reason to the player.
  • Fixed an issue where planted models could float or sink when their growth stage changed.
  • Fixed an issue where the player could flicker or become invisible during plant harvesting.
  • Fixed an issue where interrogation dummies, chair scenes, or restrained victims could use incorrect positions or lose their seated animation.

Other Changes

  • Improved the pickpocket minigame with larger text, loot choices, directional buttons, and feedback.
  • Added ATM drill item, quantity, and consumption controls to the Job Configurator independently of shop-safe drilling.
  • Fixed an issue where valid ATM locations were rejected unless the owner entered an internal ID manually.
  • Fixed an issue where NPC Pickpocketing settings appeared in several identically named categories.
  • Changed the Drug Creator default-import page to a compact grouped selector, removing its search field while retaining group selection and import choices.
  • Improved multiline descriptions in Drug Creator guides and the PvP editor so longer text remains readable.
  • Added a Crime warehouse background to the shared storage interface.
  • Changed the initial interface language fallback to English while preserving selected and server-provided languages.
  • Optimized laboratory assault and production updates so inactive queues stop making unnecessary database requests.
  • Optimized Darknet world updates so nearby drops and meetings are refreshed only for authenticated sessions.
  • Optimized nearby heist screen discovery to refresh after movement and relevant location changes.
  • Optimized territory access updates to preserve existing map geometry when membership or permissions change.
  • Changed the Heist Creator's developer export browser and export action to require an explicit server opt-in while preserving registered built-in editing.
  • Added optional administrator heist execution tests with selection and cancellation on development servers.
  • Improved bundled translations for the reputation handbook and Heist Creator guidance, field text, and error messages.
  • Improved Heist Creator checkbox consistency and corrected inspector visibility when changing panels.
  • Removed the obsolete standalone ESX item import file while preserving existing inventory definitions and item registration.
  • Optimized laboratory worker updates so the periodic monitor runs only while the player has an active laboratory scene.
  • Optimized drug risk-effect cleanup so smoke and fire expiry checks stop after the last active effect ends.
  • Optimized interrogation session updates so deadline and release checks run only while at least one session exists.
  • Optimized background loading when Heist Planning is closed while keeping current data available when it is reopened.
  • Optimized inventory checks so Crime and Drug Creator request only the items they use.
  • Improved configuration updates so unrelated resource edits do not reload Crime jobs, tablet apps or raid commands.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/functions.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/init.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/config/reputation.lua
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert

Removed Files

  • sky_crimesystem/items_esx.sql
Update InstructionsWhat to copy, what to keep and what to check0.7.10.8.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare

These instructions cover sky_crimesystem 0.7.1 → 0.8.0. Before replacing files, confirm that your customer download platform provides the versions below and check each downloaded resource's fxmanifest.lua; published documentation or a source tag alone does not establish that its customer download has been uploaded. Complete earlier migrations first if upgrading from an older version. Back up the database, resources, custom config, translations and saved Job Configurator/Creator data. Validate the update on staging before applying it to your production server. Stop the server during replacement. Install Sky Base 1.45.0, then Sky Jobs Base 1.48.0, then the matching releases for your installed jobs and Crime. Keep provider dependencies and optional integrations compatible; preserve saved overrides and existing records.

  1. Replace files

Use the complete 0.8.0 release package. Delete the entire sky_crimesystem/source/ folder and insert its new version; do not merge old generated interface files. Replace sky_crimesystem/fxmanifest.lua from the same package. Refresh the complete sky_crimesystem/config/locales/ tree and merge your custom translations into the new files. Keep your selected shared language in sky_base/config/config.lua. Install the following shipped paths from that package, merging custom configuration into the updated public files rather than restoring old complete files:

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/functions.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/init.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/config/reputation.lua
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert

Remove these obsolete files outside source/:

  • sky_crimesystem/items_esx.sql

Merge the supplied config folder with your existing settings, retaining all newly supplied files and your saved overrides. Drug Creator and Heist Creator content use their separate steps in this guide.

  1. Merge configuration

Install the matching updated sky_base and sky_jobs_base first, then sky_crimesystem. Keep ensure sky_base, ensure sky_jobs_base, ensure sky_crimesystem in that order. Replace the complete sky_crimesystem/source/ folder and sky_crimesystem/fxmanifest.lua from the same download; merge personal edits in configuration files and replace all bundled locale files.

Named reputation rules — plaintext configuration. In sky_crimesystem/config/reputation.lua, Config.Reputation.rules did not exist in 0.7.1. Its new shipped value is an empty table. Add the complete new table without changing existing reward amounts; either add rules = {}, inside the existing Config.Reputation = { ... } table or add this assignment after that table:

Config.Reputation.rules = {}

An empty list preserves the normal rewards. Each optional rule uses name, action, target, points, and enabled. An empty target applies to its activity; a nonempty target is supported for heist (the heist ID) and drug_sale (the drug type). A matching target rule takes priority over a general rule, which takes priority over the normal reward. Changing a rule affects future completions and does not recalculate existing reputation history.

Saved Job Configurator settings. With Config.UseJobConfigurator = true, open /jobconfig → Crime System → Reputation → Reputation. The new table key is reputationRules, initially []; keep your existing reputationRewards, reputationEnabled, reputationPointsPerLevel, and reputationMinimumJoinPoints values. Review and save the new named rules there. Saved overrides remain authoritative; changing a file default does not replace an already saved value.

ATM drilling and locations. Open /jobconfig → Crime System → Robbery → ATM Robbery. In the equipment group, review the new atmDrillItem, atmDrillItemAmount, and atmConsumeDrill settings. Previously these controls were absent; new missing keys use Config.ATMRobbery.items.drill, whose shipped values remain key = "vault_drill", amount = 1, and consume = false.

Config.ATMRobbery.items.drill = { key = "vault_drill", amount = 1, consume = false }

This existing plaintext block is unchanged from 0.7.1; no new drill block is needed when /jobconfig is disabled. Keep an existing custom item ID, quantity, or consumption choice. Consumption applies after each successfully completed ATM drilling point. Shop safes remain separate and use Config.ShopRobbery.drillItem, with the same unchanged shipped values; changing ATM settings does not change safe settings. The atmLocations editor now creates missing internal IDs automatically. Keep existing saved IDs, locations, and customizations; no ID rewrite or database reset is required. Robbery → NPC Pickpocketing now groups its existing settings under one subsection, preserving their keys and saved values.

Drug Creator content. The saved Drug Creator catalogue and its gameplay defaults do not require a new import. Keep existing entries and any template links. The default-import screen still lets you choose categories and entries, but now uses a compact grouped layout without its search field. Import defaults only when you intentionally want to add or update those selected templates; do not use a bulk reset as an update step.

Heist Creator content. Preserve saved drafts, published definitions, plans, and custom JSON files. Merge the supplied sky_crimesystem/config/heist_exports/heist_4_v1.json separately if you customized that built-in heist. Its definition.planningMap was absent in 0.7.1 and now contains the full block below. It also changes one keycard preparation description from the German wording for blockade to the wording for obstacle; the supplied missions, rewards, gas geometry, alarms, and crew limits are unchanged.

"planningMap": {
  "target": {
    "x": 255.2282562255859,
    "y": 223.97601318359375
  },
  "locationLabel": ""
}

Place this property inside the JSON definition object. Updating the supplied JSON file does not overwrite separately stored Creator definitions. New gas-zone placement now needs at least four corners before confirmation; existing saved gas zones remain valid.

Optional Heist development tools. The detached built-in export browser and developer export action previously followed Config.HeistCreator.builtinExport.enabled alone. They now also need the server setting sky_crimesystem_developer to equal the string true; its default is false. Existing registered built-in editing remains available without enabling developer exports. If you use these development tools, add the following before the Sky ensure lines in server.cfg and restart the resource:

set sky_crimesystem_developer true

Keep Config.HeistCreator.builtinExport.enabled = true and grant the existing Creator permission sky_crimesystem.crimecreator to the administrator. The optional /heisttest command uses the same opt-in and permission, lets an administrator select a saved or registered heist, and lets them stop their active test. Use it on a development or staging server: it grants real inventory equipment and uses the normal heist execution and reward handling. Reopening /heisttest offers cancellation; stopping a test does not promise to remove all equipment or rewards already received. To disable developer tools again, use set sky_crimesystem_developer false and restart.

Install Sky Base 1.45.0 and Sky Jobs Base 1.48.0 from this release set before installing Crime System 0.8.0. Start them in this order: sky_base → sky_jobs_base → sky_crimesystem. The new item-catalog reads and Job Configurator update event require those companion versions. These additional runtime changes introduce no new editable setting or changed default. Keep all saved /jobconfig overrides, crime jobs, Drug Creator entries and heist plans.

Optional diagnostics are disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, then restart the server. Run profiler record 1000, wait for profiler status to show that recording has completed, then run profiler saveJSON sky-release-profile.json. Disable diagnostics with setr sky_profiler 0 and another server restart. This is not a /jobconfig setting; no recording or upload starts automatically.

For an older explicit profiler package, replace any previously modified public config/provider/compatibility files with the supplied versions and merge your intentional customizations. In this release package, profiler preparation preserves all files outside source/ byte for byte except fxmanifest.lua; the functional config changes listed in this guide still require their own merge.

  1. Data, items and dependencies

SQL. Back up the database. Reputation rules and the handbook reuse the existing sky_crime_reputation table; do not reset its records. Copy the updated sky_crimesystem/import.sql. With the existing Config.AutoExecuteQuery = true, main resource tables continue to be handled at startup. If you keep Config.AutoExecuteQuery = false, apply the updated main import.sql manually through your normal database process, preserving existing data. This main SQL path is separate from Heist persistence: keep the existing Config.HeistPersistence.enabled and Config.HeistPersistence.autoMigrate choices. The documented active features introduce no changes to the existing reputation, PvP, base-raid, interrogation, or separate Heist table schemas. /jobconfig does not install SQL.

Items. Remove only the obsolete sky_crimesystem/items_esx.sql file from the resource folder; retain all existing inventory items and database item rows. Do not run a deleted import file or delete items because the file disappeared. No new mandatory item definitions are introduced for the documented features. ATM and shop-safe drilling still require the configured vault_drill item by default, with ATM quantity/consumption controlled independently. Keep the existing base-raid requirements from config/base_raids.lua: baseraidkit, police_raidram, and search_warrant (consumed on a valid police raid start). Keep interrogation definitions from config/interrogation_core.lua and config/interrogation_tools.lua: interrogation_chair, interrogation_cart, cable_tie, blindfold, reusable torture_pliers and car_battery, and consumed blowtorch and water_canister. Preserve your custom IDs if you changed these settings. Supported inventories retain the existing automatic fixed-item registration controlled by Config.InventoryItems.autoRegisterItems; the default preserveExisting = true keeps server-owned definitions. With automatic registration disabled or an unsupported inventory, retain or install the required definitions using your inventory's normal setup. For ox_inventory, missing supplied entries still need to be copied from sky_crimesystem/config/inventory/items_ox.lua into ox_inventory/data/items.lua before restarting the inventory. Existing QB examples remain in sky_crimesystem/config/inventory/items_qb.lua. Qbox still needs its existing configured black_money item.

Assets. Replace the complete source/ folder so the rebuilt interface includes the reputation handbook artwork and Crime storage background. Keep fxmanifest.lua and that folder from the same download. Existing config/inventoryimages/png/ and config/inventoryimages/webp/ mappings and streamed models are unchanged by this release; no new inventory-image or stream migration is required. If an existing mandatory item's image is missing, use the matching supplied image in your inventory image folder. Replace all sky_crimesystem/config/locales/* files; the existing global language selection still controls the resource and an explicit selection is preserved.

These additional runtime changes require no extra SQL, item, image or model migration. Preserve the item definitions and creator data required by the main Crime update instructions.

  1. Restart and check

Start your framework, database connector and configured providers first, then Base, Jobs Base and the updated job resources in dependency order. Reconnect clients. After restarting in dependency order, open the Crime tablet and creators during a fresh connection, then reload an already open interface and check that its menu, context, and focus return.

Open /crimerep and check your character's progress, reward list, recent activity, page navigation, close control, and zoom controls. Test one new named rule on a future matching completion; confirm an unmatched completion keeps its normal reward and old history remains unchanged.

In /jobconfig → Crime System → Robbery → ATM Robbery, create an ATM location without entering an ID, save, reopen, and reorder it; confirm the location remains valid. Check the exact configured drill item and consumption at each successful drilling point. Confirm NPC Pickpocketing appears once.

Enter a faction laboratory, change membership through the normal server workflow, and confirm access is revoked. Check that a laboratory sale identifies the refund account and faction refunds go to that account; acquisition costs should not appear as treasury spending.

Enter a camper laboratory and try a permitted shelf transfer, a rejected transfer, and the normal raid access workflow. Check the rejection message explains the cause.

Check planted models remain on their placement surface through growth stages, the player stays visible during harvesting, and interrogation dummies, seats, and tool scenes align.

In the Heist Creator, test four-corner gas placement, movement while choosing an obstacle, contextual input hints, preparation links to multiple obstacles, readable field examples, and inspector visibility. Preserve existing saved definitions.

If you explicitly enable the optional development setting on a staging server, check the export browser and permission-controlled /heisttest selection/cancellation; leave it disabled for normal operation when not needed.

While the planning interface is closed or another app is open, issue a catalog or access update and confirm that it does not request a planning snapshot; reopen Heist Planning and confirm it loads current data. Enter, leave and re-enter a laboratory and confirm that workers continue to refresh while present. Trigger overlapping smoke and fire effects and confirm that each effect stops at expiry. Start two interrogation sessions, end one and then the other, and confirm that active warnings, binding timeout and release deadlines continue to work. Save Crime settings in /jobconfig and verify the configured crime jobs, tablet apps and base-raid command update immediately. Restart once with the matching Sky Base and Jobs Base versions and check item registration warnings.

If a check fails, keep the update on staging and collect the installed resource versions, selected provider, effective saved setting and the first relevant startup or action error. A successful source test, build or copy does not establish live FiveM, provider or customer acceptance.

Version 0.7.1

Highlights

  • Changed Crime startup to use the same shared-dependency loading as the other Sky jobs.

Other Changes

  • Updated Hungarian translations, including harvesting and processing captions.

Changed Files

  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.7.00.7.1

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare

These instructions cover sky_crimesystem 0.7.0 → 0.7.1. Complete earlier migrations first if upgrading from an older version. Back up the database, resources, custom configuration and saved job/Creator data. Stop the server for the coordinated update. Install Base 1.44.1, then Jobs Base 1.47.1, then the matching hotfixes for your installed Sky jobs and Crime.

  1. Replace files

Use the 0.7.1 download. Delete the entire sky_crimesystem/source/ folder and insert the new folder. Replace sky_crimesystem/fxmanifest.lua from that same package. Refresh the complete sky_crimesystem/config/locales/ tree and reapply custom translations. Keep the new source and manifest together; do not merge old generated interface files into them.

  1. Keep settings

No configuration values or Job Configurator setting keys are added, removed or reset by this hotfix. Keep your current settings and saved overrides. Hungarian uses the existing Config.locale = "hu" setting in sky_base/config/config.lua; leave your selected language unchanged if you do not want to switch. Update the matching Base, Jobs Base and installed resource locale folders together.

Optional diagnostics stay disabled by default. If support requests a recording, put setr sky_profiler 1 before the Sky ensure lines in server.cfg, restart, run profiler record 1000, wait for profiler status to show completion, then run profiler saveJSON sky-hotfix-profile.json. Disable with setr sky_profiler 0 and another restart. This is not a /jobconfig option; nothing is recorded or uploaded automatically.

  1. Data and assets

No new SQL import, item definition, inventory image or stream asset is required for this hotfix. Keep saved job/Creator data; do not reset or reimport it. Required earlier migrations still apply when upgrading from an older release.

  1. Restart and check

Start your framework, database connector and configured providers first, then Base 1.44.1, Jobs Base 1.47.1 and the updated jobs/Crime. Reconnect clients. Open /jobconfig and the Crime tablet, then check a configured crime activity. If startup still fails, collect the first error and its preceding log lines together with the installed versions.

Version 0.7.0

Highlights

  • Added Simple and Advanced editing modes throughout the Drug Creator so administrators can choose between essential settings and detailed controls.
  • Expanded World Assets to inspect placed plants, campers and laboratories, including permission-protected test placement and laboratory ownership release.
  • Changed base raids so attackers breach individual interaction points in the world and then use the shared storage or garage interface for permitted withdrawals.
  • Improved laboratory management with clearer production readiness, equipment status, storage upgrades and staff controls.

Notable Changes

  • Added visible laboratory workers who use suitable workstations, patrol as security staff or move around while idle.
  • Fixed laboratory storage calculations and prevented production from completing into storage that cannot hold its output.
  • Improved laboratory equipment placement so compatible positions remain usable across the interior and stored equipment no longer appears installed.
  • Changed laboratory sales and administrative ownership releases to clear the previous owner's contents, workers, production and upgrades before making the site available again.
  • Changed camper locking to use the server's configured vehicle-key system, including key handover after purchases and successful theft.
  • Moved plant care into the world with dedicated treatment and trimming interactions, and spread harvest targets more evenly over the plant.
  • Expanded buyer and dealer definitions with tablet availability, reputation unlocks, request quantities, cooldowns and recruitment settings that are used by the contact network.
  • Expanded street-sale definitions with drug and territory restrictions, opening hours, sale limits, police requirements and reward tuning.
  • Expanded Drug Creator controls for laboratory power levels, field map markers and processing-location minigames, while improving supplier, camper-shop and delivery-route setup.
  • Added configurable heist planning-map labels and target coordinates, with automatic target selection for existing definitions.
  • Improved Heist Creator editing with focused detail dialogs and grouped laser walls that also support openings with offset corners.

Other Changes

  • Added Hungarian translations for Crime menus and messages.
  • Fixed an issue where newly placed plants could appear late or move away from the confirmed placement height.
  • Fixed an issue where laboratory interiors could appear incomplete or workers could leave their interior.
  • Fixed an issue where laboratory emergency exits exposed management controls instead of only providing an exit.
  • Fixed an issue where laboratory item images disappeared after management actions.
  • Fixed an issue where laboratory supplier markers used incorrect drawing arguments.
  • Fixed an issue where heist buyers or their interactions could remain after plan changes or resource stops.
  • Fixed an issue where the tablet briefly showed a previous page while opening another view, and removed the obsolete intermediate Crime menu.
  • Fixed an issue where activity displays could move outside the visible screen.
  • Fixed an issue where detached ATM rear panels did not collide correctly with drilling shots.
  • Improved ATM drilling calibration with independent hand targets and clearer stance controls.
  • Changed the default reputation requirement for joining crime jobs to zero while retaining configurable positive requirements.
  • Optimized repeated inventory-item checks and drug-state preparation when multiple players load data together.
  • Improved Creator validation, defaults, notifications and shared dropdown controls.
  • Updated the optional Pacific heist export so its four cash pickups each contain 200,000.
  • Improved startup diagnostics so migration waits identify the affected resource script in protected builds.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs.lua
  • sky_crimesystem/config/drugs_campers.lua
  • sky_crimesystem/config/drugs_growing.lua
  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_labs_power_workers.lua
  • sky_crimesystem/config/drugs_market_threat_processing.lua
  • sky_crimesystem/config/drugs_supply_chain.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/config/reputation.lua
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.6.00.7.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update

These instructions cover sky_crimesystem 0.6.0 → 0.7.0. Complete earlier required migrations first when upgrading from an older version. Before stopping the server, finish active base raids and back up the database, installed resource, customized configuration and saved Job Configurator, Drug Creator and Heist Creator data. Then stop the server for the coordinated update; raids do not resume after a resource restart.

Install Base 1.44.0 first, Jobs Base 1.47.0 second and Crime 0.7.0 afterward, together with the matching updates for your other installed Sky jobs. The new raid interfaces and laboratory worker support require these matching dependencies. Keep your current framework, inventory and vehicle-key providers configured and running before the Sky resources.

  1. Replace the package files

Use the matching 0.7.0 package. Delete the complete old sky_crimesystem/source/ folder and insert the new folder. Replace sky_crimesystem/fxmanifest.lua from the same download. Refresh the complete sky_crimesystem/config/locales/ folder and merge your custom translations back. Do not merge old generated interface files into the new source/ folder.

Merge each configuration change below into your own files. Copy the optional sky_crimesystem/config/heist_exports/heist_4_v1.json when you want the revised bundled export; copying it does not replace a saved heist. No files outside source/ are removed or renamed, and this release adds no new streamed model or inventory image.

  1. Merge configuration and saved overrides

Hungarian language

Refresh the complete resource locale folder from this download, including hu.lua, and carry over your custom translations. To use Hungarian, set the existing Config.locale value to "hu" in sky_base/config/config.lua; its supplied default remains "en". Keep your current value if you are not changing language. This is the shared Sky language setting, so update the matching Base, Jobs Base and installed job locale folders together. Jobs Base supplies the Hungarian /jobconfig translations too. No new /jobconfig language setting, saved-job reset or database migration is required for this language addition. Apply the normal restart and reconnect steps at the end of this update.

Prepare file edits while the server is stopped. Perform the /jobconfig, Creator imports and in-game checks described below only after starting the updated resources during maintenance, before admitting players.

Keep your existing jobs, coordinates, prices, providers and saved overrides. The following changes cover every modified configuration file for this version. Each Lua assignment shown below belongs after its existing parent table in the named file; do not paste a Config... = assignment inside a table.

ATM hand placement — sky_crimesystem/config/config.lua

Previously, Config.ATMRobbery.drillPresentation.hands did not exist. Add this complete block while keeping your existing player, tool, camera, target and FOV calibration:

Config.ATMRobbery.drillPresentation.hands = {
    x = 0.00000,
    y = 0.00000,
    z = 0.00000,
}

This is a file-based visual calibration setting; there is no matching /jobconfig key. Recalibrate only if your existing custom ATM presentation needs it.

Protected test placement — sky_crimesystem/config/drugs.lua

Previously, Config.Drugs.Creator.debug did not exist. The new shipped default is:

Config.Drugs.Creator.debug = true

This enables test placement controls for authorized Drug Creator administrators. Set it to false if you do not want these tools enabled. It does not grant Creator permission. This value is edited in the file, not /jobconfig. Test plants, campers and laboratories create saved world assets; use a staging server for acceptance tests.

Camper locking — sky_crimesystem/config/drugs_campers.lua

Remove the old lockKey = "L" entry from Config.Drugs.Campers (or your customized value). There is no replacement Crime lock key. The former /jobconfig → Drug Operations → Labs & Camper setting drugCamperLockKey and the separate Crime camper lock action are retired. Existing saved values no longer control locking. Use the lock control supplied by your configured vehicle-key provider, and check that purchases and successful camper theft give the intended player keys.

Plant-care timing — sky_crimesystem/config/drugs_growing.lua

Change Config.Drugs.Growing.care.minigames.treat.duration from 11 to 4 and Config.Drugs.Growing.care.minigames.trim.duration from 10 to 4 for the new shipped timings. The minigame names, rounds and XP are unchanged. Preserve intentional custom timings if desired. There are no matching /jobconfig fields for these two durations.

Config.Drugs.Growing.care.minigames.treat.duration = 4
Config.Drugs.Growing.care.minigames.trim.duration = 4

Interior contents — sky_crimesystem/config/drugs_laboratories.lua

Replace only the two emptyInterior tables below. The vehicle warehouse previously disabled the five listed entity sets; it must now enable them. The small warehouse previously disabled styles 1–5; it must now disable only 1–4 and enable style 5. Keep each preset's existing entrance, exit, bounds and nodes.

Config.Drugs.Laboratories.interiorPresets.criminal_enterprise_vehicle_warehouse.emptyInterior = {
    ipls = {
        "reh_int_placement_sum2_interior_0_dlc_int_03_sum2_milo_",
    },
    enable = {
        "entity_set_office",
        "entity_set_light_option_1",
        "entity_set_light_option_2",
        "entity_set_light_option_3",
        "entity_set_tint_options",
    },
}

Config.Drugs.Laboratories.interiorPresets.criminal_enterprise_warehouse.emptyInterior = {
    ipls = {
        "reh_int_placement_sum2_interior_1_dlc_int_04_sum2_milo_",
    },
    disable = {
        "entity_set_style_1",
        "entity_set_style_2",
        "entity_set_style_3",
        "entity_set_style_4",
    },
    enable = { "entity_set_style_5" },
}

These are preset definitions in the file. Existing saved Creator layouts and placed laboratories should be retained; do not reimport all defaults to apply this fix.

Laboratory worker activity — sky_crimesystem/config/drugs_labs_power_workers.lua

Previously, Config.Drugs.Workers.ai did not exist. Add the complete block:

Config.Drugs.Workers.ai = {
    enabled = true,
    refreshIntervalMs = 10000,
    idleRadius = 3.5,
    securityPatrolRadius = 7.0,
    scenarios = {
        chemist = "WORLD_HUMAN_CLIPBOARD",
        grower = "WORLD_HUMAN_GARDENER_PLANT",
        packager = "WORLD_HUMAN_CLIPBOARD",
        security = "WORLD_HUMAN_GUARD_STAND",
    },
    stationRoles = {
        chemist = { "chemistry", "heating", "testing" },
        grower = { "growing", "planting", "trimming", "drying" },
        packager = { "packaging", "pressing" },
    },
}

The existing /jobconfig → Drug Operations → Workers settings, including drugWorkersEnabled, still control the worker system. The new ai block is file-based and has no separate /jobconfig fields. Existing hired workers are retained.

Tablet buyer and dealer defaults — sky_crimesystem/config/drugs_market_threat_processing.lua

The existing Config.Drugs.Market.buyers rows gain tabletEnabled, starter/unlock settings, request minimum/maximum quantities and cooldowns. The existing dealer rows gain tablet availability, starter/unlock settings, hire availability and the recruitment values shown below. These fields were absent in the previous stock tables. Merge the new fields into matching custom rows and keep any additional entries; the full new stock tables are:

Config.Drugs.Market.buyers = {
    street_random = {
        label = "Street Buyer", channel = "street", minScore = 0,
        maxContamination = 45, priceMultiplier = 1.0, demandBonus = 0,
        tabletEnabled = true, starterContact = true,
        requestMinAmount = 1, requestMaxAmount = 8, cooldownMinutes = 45,
    },
    club_buyer = {
        label = "Club Buyer", channel = "premium", minScore = 70,
        maxContamination = 18, priceMultiplier = 1.35, demandBonus = 12,
        preferredPackaging = { "jar", "vacuum", "premium_seal" },
        tabletEnabled = true, unlockReputation = 20,
        requestMinAmount = 4, requestMaxAmount = 12, cooldownMinutes = 60,
    },
    wholesale_contact = {
        label = "Wholesale Contact", channel = "wholesale", minScore = 50,
        maxContamination = 30, priceMultiplier = 0.82, demandBonus = 5,
        bulkOnly = true, tabletEnabled = true, unlockReputation = 35,
        requestMinAmount = 15, requestMaxAmount = 60, cooldownMinutes = 120,
    },
}

Config.Drugs.Market.dealers = {
    corner_dealer = {
        label = "Corner Dealer", channel = "street", speedMultiplier = 1.0,
        priceCut = 0.18, minScore = 0, tabletEnabled = true,
        starterContact = true, hireEnabled = true, hirePrice = 35000,
        initialLoyalty = 60, dealerSkill = 40, dealerRisk = 35,
        dailyCapacity = 24,
    },
    network_dealer = {
        label = "Network Dealer", channel = "wholesale", speedMultiplier = 1.25,
        priceCut = 0.24, minScore = 45, tabletEnabled = true,
        unlockReputation = 25, hireEnabled = true, hirePrice = 65000,
        initialLoyalty = 68, dealerSkill = 58, dealerRisk = 42,
        dailyCapacity = 36, defaultStyle = "balanced",
    },
    premium_broker = {
        label = "Premium Broker", channel = "premium", speedMultiplier = 0.85,
        priceCut = 0.3, minScore = 75, tabletEnabled = true,
        unlockReputation = 55, hireEnabled = false,
    },
}

Saved Drug Creator entries are separate from these file defaults. Review Buyers and Dealers in Drug Creator for existing content; a file update alone does not replace those definitions. Retain your /jobconfig overrides under Market & Risk → Market & Distribution and Drug Networks → Contact Network. The per-entry values above are Creator content, not new global /jobconfig keys.

Supplier item order — sky_crimesystem/config/drugs_supply_chain.lua

Previously, Config.Drugs.SupplyChain.supplierPriceOrder did not exist and default supplier products were collected from supplierPrices. The new default supplier import follows this explicit order:

Config.Drugs.SupplyChain.supplierPriceOrder = {
    "label_printer",
    "lab_supply_kit",
    "empty_baggy",
    "mountain_coca_seed",
    "blue_dream_seed",
}

Keep your existing supplierPrices. Add every custom key from that table that you want included in generated default suppliers to supplierPriceOrder; an omitted custom key will not be included in a future default supplier import. Existing saved supplier products are retained and can be edited in Drug Creator → Laboratory Suppliers. There is no global /jobconfig key for this order.

Crime membership reputation — sky_crimesystem/config/reputation.lua

The shipped value Config.Reputation.minimumJoinPoints changes from 100 to 0; 0 disables the admission requirement and positive values keep it enabled. pointsPerLevel stays 100.

Config.Reputation.minimumJoinPoints = 0

With /jobconfig, open Reputation → Crime Membership and review reputationMinimumJoinPoints. An explicit saved or imported positive value is retained; change/reset that value to 0 only if you want the new disabled-by-default behavior. Do not reset reputation points or reward settings.

Base raid settings and locations

sky_crimesystem/config/base_raids.lua has no changed keys or defaults. Keep existing settings and /jobconfig → Base Raids overrides. The existing baseRaid_breachTimeoutSeconds now limits each breach attempt at an interaction point; baseRaid_interactionDistance, baseRaid_difficulty and baseRaid_requiredHits govern that attempt. baseRaid_protectionHours and baseRaid_failedCooldownMinutes still govern protection and failed attempts. Each crime job needs its correctly placed baseZone in Config.Jobs or /jobconfig → Mainbase. Check that intended storage, locker and heist-storage interaction points lie inside it. Do not create arbitrary replacement coordinates.

Optional performance diagnostics

Extra profiler information remains disabled by default. If support requests a recording, add setr sky_profiler 1 to server.cfg before the Sky ensure lines and restart the server. In the server console, run profiler record 1000, wait until profiler status reports completion, then run profiler saveJSON sky-release-profile.json. Share the file only when requested. To disable the extra information, change the line to setr sky_profiler 0 and restart again. This is not a /jobconfig setting; enabling it does not record or upload anything automatically.

Keep source/ and fxmanifest.lua from the same download even when diagnostics are disabled. Profiler processing changes only source Lua and the manifest. If an older profiler package changed public files outside source/, restore those files once from the clean current download and reapply your customizations.

  1. Apply SQL, inventory and asset updates

Database and existing raids

This version adds no table, SQL column, column type or SQL default, and requires no manual SQL migration from a complete 0.6.0 installation. Preserve your existing database. The main Crime tables, PvP tables, interrogation consent/objects/logs, base-raid tables and heist-screen table remain covered by the existing import.sql and their existing automatic migration paths. With Config.AutoExecuteQuery = true, keep the normal automatic route; with false, retain the already installed schema. Do not rerun the full SQL import merely for this update.

Heist definitions, plans and planning locations use the separate sky_crimesystem:heist migration controlled by Config.HeistPersistence.autoMigrate; their schema is unchanged. Heist screen persistence has its own existing migration. The new heist planning-map data and laser-wall grouping are saved inside the existing heist definition payload, not new SQL columns.

Base raids continue using sky_crime_base_raids (job, data) and sky_crime_base_raid_log. The saved session now records which interaction points were breached. On restart, any saved raid is ended: an older active session, or a new session with a breached point, receives normal protection; a new session with no breached point receives the failed-raid cooldown. Existing longer cooldowns are retained. No table reset or hand-edited raid JSON is required.

Drug Creator content

Keep your saved definitions. Updating resource files does not import defaults or replace custom entries. Open each affected Buyer, Dealer, Street Sale, Laboratory Supplier, Laboratory, Interior Template, Drug Field or Processing Location only when you want to review its newly exposed settings. Simple/Advanced mode changes the editing view; Advanced remains the default. Street-sale opening hours use the server's real local clock, and hourly street-sale limits restart with the resource.

If you deliberately want revised stock buyer, dealer or supplier content, first export/back up the existing entries, then use Drug Creator's Import Defaults and select only the entries you intend to replace. Review the selection before importing; replacement changes those saved definitions. Do not import every default just to update the script. Add custom supplier-price keys to the new order before generating/importing default suppliers.

The new Release laboratory action is a deliberate ownership reset, not an update step. It makes the site available and deletes the previous laboratory's storage, equipment, plants, workers, treasury, upgrades, production and associated activity; it does not refund the owner. Ordinary laboratory sales now perform the same contents cleanup. Back up and remove anything you intend to keep before using these actions. Do not release existing laboratories as part of installation.

Heist Creator content

Keep existing heists and plans. Existing definitions infer their planning-map target from their configured world locations; review the map target and label in Heist Creator when a different location is needed. Laser walls retain their individual beams and can be managed as a group.

The optional config/heist_exports/heist_4_v1.json changes the four Pacific cash pickups from 50,000, 50,000, 50,000 and 1,000 to 200,000 each, and adds an explicit always-allowed requirement to its keycard preparation objective. This does not update a saved Pacific heist automatically. Back up/export your current definition and import the revised file separately through Heist Creator only if you want those changes; otherwise retain your existing payout and settings. Drug Creator default imports do not import heists.

Inventory items and assets

No new item definition, inventory image or streamed asset is introduced. Keep the existing item mappings and image provider. Base raids still require the configured police_raidram or baseraidkit; police raid starts also require and consume search_warrant. Verify your customized names from Config.BaseRaids, not only the standard item import list.

If interrogations are enabled, retain the configured interrogation_chair, interrogation_cart, cable_tie, blindfold, torture_pliers, car_battery, blowtorch and water_canister, plus any item you configured for rescue. Check their existing images in your inventory resource. These are existing requirements, not new items for this version.

Money Wash and the Online Heist Hub remain disabled, jewel-case creation remains locked in the Creator, and NPC police reinforcement remains disabled by default.

  1. Restart and verify

Start the database, framework and configured providers, then Base 1.44.0, Jobs Base 1.47.0 and Crime 0.7.0, and reconnect before admitting players. Resolve startup or migration errors first. Perform the following checks on your staging or maintenance server:

  • Open Drug Creator, switch Simple/Advanced modes and confirm a saved custom entry remains intact. Check a buyer's request amount/cooldown and a dealer's hiring settings. Confirm custom supplier products are present before importing any defaults.
  • Enter both affected warehouse interiors. Check item images after a storage action, install one compatible equipment item, verify staff appear, and confirm storage upgrades and full-storage production behavior. Confirm an emergency exit only exits.
  • Buy or use a test camper and verify locking, unlocking and key handover with your actual vehicle-key provider. Test permitted and denied access.
  • Place one plant and check its height and immediate visibility, then try treatment, trimming and harvesting. Confirm the activity display stays on screen.
  • Start a base raid from the tablet, travel to a valid world interaction point, breach it, and withdraw an allowed item through shared storage. Check a second point stays locked until separately breached, unrelated jobs cannot use it, and raid access does not offer depositing or returning vehicles. Verify configured vehicle permissions and expected cooldowns.
  • Open an existing heist planning map, confirm its target, check one grouped laser wall and verify the buyer disappears when its plan ends. If you imported the Pacific export, confirm all four configured payout amounts.
  • Check crime-job admission with your intended saved reputation threshold. Test an ATM drilling attempt with your existing presentation profile.

These checks must be performed against the installed FiveM server and its providers. Source tests, interface builds and copied packages alone do not verify live gameplay.

Version 0.6.0

Highlights

  • Added focused Drug Creator editor pages with section navigation, clearer required-field feedback and save, discard or continue choices for unsaved edits.
  • Added selective default imports so owners can choose which supplied Creator entries to install or replace.
  • Added a dedicated camper manager for production, storage, upgrades, finances and setup readiness.
  • Added a visual model picker with previews, search, categories, pagination, custom model names and 18 bundled plant-growth previews.
  • Added a persistent wall screen for each Crime organization to share a tablet heist plan with nearby players.
  • Added four separate drilling points on detached ATM rear panels, retaining completed screws after an interrupted attempt.
  • Added polygon gas zones and four-corner laser surfaces to the Heist Creator.

Notable Changes

  • Changed camper processing to use the fixed Drug Wars interior and its built-in workstation, without requiring separately hired workers or placed production machines.
  • Added free placement of plant pots inside laboratories and removed the stock fixed cultivation positions and cultivation-wing expansion.
  • Improved production planning with required-material explanations and checks before an order is created.
  • Changed world-processing quantities to represent the requested finished output and scale full recipe batches, materials, duration and fees together.
  • Improved camper storage upgrades, transfer checks, purchase confirmations and visible updates after production or storage changes.
  • Fixed an issue where camper and laboratory messages could display the wrong manager name.
  • Changed normal and test plants to start seeded and grow gradually from their actual server-side care and environment state.
  • Added selectable harvest tools to Drug Field and Wild Plant entries.
  • Added cultivation-level, experience and unlock controls to the Job Configurator.
  • Changed QBCore framework organizations to use gangs, matching Qbox while preserving ESX job-based organizations.
  • Added direct interaction with the physical heist screen, including map controls, drawing, notes and supported plan actions.
  • Improved shared presentations so closing the tablet or leaving local screen interaction keeps the presentation running, and another authorized member can take over.
  • Improved the tablet planning overview with clearer next steps, preparation and crew requirements, equipment status and direct access to existing active plans.
  • Improved planning dialogs, member selection, photo previews and expanded maps across supported tablet themes and screen sizes.
  • Fixed an issue where a planning-location preview could show the wrong prop or position when switching between a table and a wall.
  • Improved gas-zone and laser placement with clearer feedback, clean cancellation and previews that follow the current placement.
  • Improved Creator navigation with Tab switching between the world and mission-flow views while preserving input inside forms and dialogs.
  • Fixed an issue where mouse look could remain blocked outside the Creator interface.

Other Changes

  • Changed the supplied drug catalog to a smaller Weed and Cocaine setup and removed automatic default imports during startup.
  • Changed process steps to an expandable editor focused on basic production fields, with reorder, duplicate, remove and preset actions.
  • Fixed an issue where a selective import could save entries whose required drug, interior or process definition was missing.
  • Fixed an issue where pressing Escape in the model picker could also close the editor or open an unsaved-changes warning.
  • Improved route-contact forms, tablet controls and signatures across screen resolutions.
  • Improved item-check diagnostics for interrogation and added missing laboratory and Creator translations.
  • Improved drill assembly with detailed component images, tool movement and native game sounds.
  • Added translations for shared screens, drilling points and tablet planning guidance.
  • Added an optional exported heist definition for manual review and import in the Heist Creator.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs.lua
  • sky_crimesystem/config/drugs_growing.lua
  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_supply_chain.lua
  • sky_crimesystem/config/heist_exports/heist_4_v1.json
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen.ytyp
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_01.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_02.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_03.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_04.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_05.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_06.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_07.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_08.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_09.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_10.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_11.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_12.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_13.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_14.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_15.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_16.ydr
  • sky_crimesystem/stream/heist-screen/sky_crime_heist_screen_materials.ytd
Update InstructionsWhat to copy, what to keep and what to check0.5.00.6.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update

This is the complete 0.6.0 package. If you already installed an earlier 0.6.0 download, apply these instructions again; checking the version alone cannot distinguish the packages. The current package has nui_build '05d656cdde7d2846' in its manifest and includes the stream/heist-screen/ assets and the new screen configuration. Read every step before stopping the server.

Back up stored Creator definitions before importing any defaults. The new selection page replaces selected existing entries with the supplied versions.

If Fire Job is installed and you are also updating an older Fire version, take all breathing bottles out of vehicle bottle storage before stopping that old version. The Fire update cannot migrate its old live vehicle-state contents. Complete this pre-shutdown step before updating Base or Jobs Base.

These instructions cover sky_crimesystem 0.5.0 → 0.6.0. Complete earlier required migrations first if upgrading from an older release. Stop the server for the coordinated update and back up the resource, database, customized configuration and saved job/creator settings. Install Base 1.43.0 first, then Jobs Base 1.46.0, then the matching installed job releases.

  1. Replace the package files

Use the matching 0.6.0 package. Delete the old sky_crimesystem/source/ directory completely and insert the new directory. Replace sky_crimesystem/fxmanifest.lua from the same package. Refresh the entire sky_crimesystem/config/locales/ tree and merge your custom translations back. Merge the four changed files config/drugs.lua, config/drugs_growing.lua, config/drugs_laboratories.lua and config/drugs_supply_chain.lua using the exact blocks in this view. The new model-preview images are included in source/; no separate inventory image installation is needed.

Do not merge old generated interface files into the new source/ directory.

Also merge sky_crimesystem/config/config.lua using the new screen and ATM blocks below. Add every file from sky_crimesystem/stream/heist-screen/ and the optional sky_crimesystem/config/heist_exports/heist_4_v1.json without removing your other custom exports or stream assets. Update sky_crimesystem/import.sql and apply the targeted table migration in step 4. Existing 0.6.0 installations must replace the full source/, matching manifest and listed new files too; do not keep the earlier interface bundle.

  1. Merge configuration and saved overrides

Prepare file changes while stopped. Perform /jobconfig, Creator and other in-game actions only after step 5 starts the updated resources, during maintenance before admitting players.

Configuration and stored Creator content

The complete release also changes sky_crimesystem/config/config.lua; its required screen and ATM additions follow the drug blocks below. Keep custom values when merging the four changed drug files. The supplied catalog is now centered on Weed and Cocaine; keep your intentional extra-drug definitions, harvesting, supply-chain entries and saved Creator content if those workflows remain in use. Updating files alone does not delete existing Creator entries from the database.

Remove the obsolete Config.Drugs.Creator.autoImportDefaults field from config/drugs.lua. Defaults are no longer imported during startup. Existing servers may keep their current Creator content. After the maintenance restart in step 5, to adopt supplied defaults, open /drugcreator → Import Defaults, globally or in the wanted section, review the selection and import only entries you intend to replace. Selected existing entries are overwritten; unselected entries are preserved. Include required Drug, Interior, Process and Camper definitions in a global selection, or create/import those dependencies first. An incomplete selection is rejected before any entries change; missing dependencies are not imported silently.

Normal laboratories still use their configured interior templates. Campers now use the fixed Drug Wars interior; an old custom camper-interior selection no longer chooses a different runtime interior. The manager focuses on processing, but this does not categorically disable the shared seed-placement path inside a converted camper. Existing plant data remains; use inventory placement to place new laboratory pots freely.

The process-step editor exposes basic production fields, action label, required tool, input/count and consumption, ordering, duplication and presets. Advanced step keys, tool-consumption, interaction/marker/help/target settings, scenario/distances and heat/risk/environment/quality modifiers are no longer directly editable in that panel. Editing another field preserves existing advanced values. Applying a preset replaces that preset's step set, so review it before saving.

In QBCore or Qbox framework organization mode, every configured Crime organization must exist as a framework gang. Keep ESX job-based organization names and intentional independent membership mode. Do not reset memberships or change a primary job merely to apply this release.

Job Configurator and saved overrides

Affected route: Crime System → Drug Operations → Cultivation Levels. Saved settings override their stock defaults; editing Lua alone is insufficient where a saved override exists. Check/reset the applicable override deliberately and preserve all unrelated customization. Drug Creator definitions are stored separately and are not replaced by changing /jobconfig defaults.

Persisted settingStock default / behavior
drugCultivationProgressionEnabledtrue; disabling removes progression gating
drugCultivationMaxLevel10; normalized between 1 and 10
drugCultivationLevelsLevels 1..10: XP 0,180,520,1050,1850,2950,4450,6450,9000,12250; titles from Config.Drugs.Growing.progression.levels
drugCultivationActionXpadd_soil=4, add_fertilizer=5, plant_seed=8, water=4, fertilize=5, treat=8, trim=7, harvest_part=12, perfect_harvest=18, mutation=45, wild_discovery=10
drugCultivationUnlocksContainers: plastic_pot = 1/fabric_pot = 3/hydro_bucket = 6. Substrates: potting_soil = 1/coco_mix = 3/living_soil = 7. Equipment: plant_pot = 1/grow_tent = 2/small_lamp = 1/grow_lamp = 3/industrial_lamp = 6/small_fan = 2/industrial_fan = 6/carbon_filter = 4/testing_kit = 3. Stock strains: blue_dream = 1/mountain_coca = 3. Scanner tiers:1/3/6/9.

Crime configurator labels are supplied by Jobs Base, so update its complete locale tree too. Creator definitions are a separate stored-content layer; changing /jobconfig defaults does not replace them.

Exact stock-file changes

The following blocks show each affected stock path before and after this version step. Merge the new blocks into their named files while preserving deliberate custom workflows. These are partial sections of the four files, not complete replacement files.

Where to paste: a full path such as Config.Drugs.Growing.progression.unlocks.strains = { ... } identifies the table. If replacing it inside the existing parent table, keep its local strains = { ... }, key and trailing comma and replace only its contents. Never paste a full Config... = assignment inside another Lua table. Alternatively, a full assignment shown here can be placed at the file's top level after that table's existing declaration. Use only the New stock block, not both old and new. Where a block is removed, delete that named obsolete stock entry when adopting this stock workflow; preserve intentional custom replacements. Remove the obsolete trailing mushroom/herbal aliases explicitly as shown.

sky_crimesystem/config/drugs.lua: Config.Drugs.Creator

Old stock block:

Config.Drugs.Creator = {
    enabled = true,
    permission = "sky_crimesystem.drugcreator",
    command = "drugcreator",
    autoImportDefaults = true,
    autoSyncWorldPoints = true,
    autoRegisterItems = true,
    persistFrameworkItems = true,
    warnMissingItems = true,
    defaultItemWeight = 1,
}

New stock block:

Config.Drugs.Creator = {
    enabled = true,
    permission = "sky_crimesystem.drugcreator",
    command = "drugcreator",
    autoSyncWorldPoints = true,
    autoRegisterItems = true,
    persistFrameworkItems = true,
    warnMissingItems = true,
    defaultItemWeight = 1,
}

sky_crimesystem/config/drugs_growing.lua: Config.Drugs.Growing.progression.unlocks.strains

Old stock block:

Config.Drugs.Growing.progression.unlocks.strains = {
    og_kush = 1,
    blue_dream = 1,
    mountain_coca = 3,
    dryland_root = 3,
    white_widow = 5,
    desert_ephedra = 5,
    purple_poppy = 5,
    gelato = 7,
    blue_spore = 7,
    purple_haze = 9,
}

New stock block:

Config.Drugs.Growing.progression.unlocks.strains = {
    blue_dream = 1,
    mountain_coca = 3,
}

sky_crimesystem/config/drugs_growing.lua: Config.Drugs.Growing.harvestParts.lsd

Old stock block:

Config.Drugs.Growing.harvestParts.lsd = {
    defaultMethod = "spore_cut",
    partsMin = 3,
    partsMax = 7,
    { key = "cap", label = "Pilzkappen schneiden", method = "spore_cut", outputItem = "wild_mushroom", tool = "trimming_shears", qualityDelta = 4, potencyDelta = 3, amountMultiplier = 0.22, plantDamage = 12, minigame = "spore_cut", propModel = "prop_stoneshroom1" },
    { key = "spore", label = "Sporenprobe sichern", method = "careful_cut", outputItem = "blue_spore_sample", tool = "precision_scissors", qualityDelta = 8, potencyDelta = 6, amountMultiplier = 0.08, plantDamage = 18, minigame = "precision_cut", propModel = "prop_stoneshroom1" },
}

New stock block:

Removed; no replacement block.

sky_crimesystem/config/drugs_growing.lua: Config.Drugs.Growing.harvestParts.herbal_stimulant

Old stock block:

Config.Drugs.Growing.harvestParts.herbal_stimulant = {
    defaultMethod = "uproot",
    partsMin = 2,
    partsMax = 4,
    { key = "root", label = "Wurzel freilegen", method = "uproot", outputItem = "desert_root", tool = "small_shovel", qualityDelta = 3, potencyDelta = 2, amountMultiplier = 0.34, plantDamage = 35, minigame = "precision_cut", propModel = "prop_plant_fern_02a" },
    { key = "golden_root", label = "Goldene Wurzel trennen", method = "careful_cut", outputItem = "golden_root", tool = "precision_scissors", qualityDelta = 9, potencyDelta = 5, amountMultiplier = 0.12, plantDamage = 22, minigame = "precision_cut", propModel = "prop_plant_fern_02a" },
}

New stock block:

Removed; no replacement block.

sky_crimesystem/config/drugs_growing.lua: Config.Drugs.Growing.strains

Old stock block:

Config.Drugs.Growing.strains = {
    {
        key = "og_kush",
        label = "OG Kush",
        drug = "weed",
        growthSpeed = 0.95,
        yield = 1.05,
        potency = 78,
        stability = 72,
        mutationChance = 1.5,
        pestResistance = 18,
        moldResistance = 12,
    },
    {
        key = "blue_dream",
        label = "Blue Dream",
        drug = "weed",
        growthSpeed = 1.05,
        yield = 1.0,
        potency = 72,
        stability = 82,
        mutationChance = 2.0,
        pestResistance = 10,
        moldResistance = 20,
    },
    {
        key = "white_widow",
        label = "White Widow",
        drug = "weed",
        growthSpeed = 1.0,
        yield = 0.95,
        potency = 84,
        stability = 76,
        mutationChance = 1.2,
        pestResistance = 22,
        moldResistance = 16,
    },
}

New stock block:

Config.Drugs.Growing.strains = {
    {
        key = "blue_dream",
        label = "Blue Dream",
        drug = "weed",
        growthSpeed = 1.05,
        yield = 1.0,
        potency = 72,
        stability = 82,
        mutationChance = 2.0,
        pestResistance = 10,
        moldResistance = 20,
    },
    {
        key = "mountain_coca",
        label = "Mountain Coca",
        drug = "coke",
        growthSpeed = 0.86,
        yield = 0.88,
        potency = 70,
        stability = 74,
        mutationChance = 0.8,
        pestResistance = 12,
        moldResistance = 14,
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.interiorPresets.weed_small

Old stock block:

Config.Drugs.Laboratories.interiorPresets.weed_small = {
    label = "Small Grow Laboratory",
    size = "small",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 1066.11, y = -3183.47, z = -39.16, heading = 92.0 },
    exit = { x = 1066.11, y = -3183.47, z = -39.16, heading = 92.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "weed_standard_equip", "weed_upgrade_equip", "weed_low_security", "weed_security_upgrade",
            "weed_production", "weed_set_up", "weed_drying", "weed_chairs",
            "weed_growtha_stage1", "weed_growtha_stage2", "weed_growtha_stage3",
            "weed_growthb_stage1", "weed_growthb_stage2", "weed_growthb_stage3",
            "weed_growthc_stage1", "weed_growthc_stage2", "weed_growthc_stage3",
            "weed_growthd_stage1", "weed_growthd_stage2", "weed_growthd_stage3",
            "weed_growthe_stage1", "weed_growthe_stage2", "weed_growthe_stage3",
            "weed_growthf_stage1", "weed_growthf_stage2", "weed_growthf_stage3",
            "weed_growthg_stage1", "weed_growthg_stage2", "weed_growthg_stage3",
            "weed_growthh_stage1", "weed_growthh_stage2", "weed_growthh_stage3",
            "weed_growthi_stage1", "weed_growthi_stage2", "weed_growthi_stage3",
            "light_growtha_stage23_standard", "light_growtha_stage23_upgrade",
            "light_growthb_stage23_standard", "light_growthb_stage23_upgrade",
            "light_growthc_stage23_standard", "light_growthc_stage23_upgrade",
            "light_growthd_stage23_standard", "light_growthd_stage23_upgrade",
            "light_growthe_stage23_standard", "light_growthe_stage23_upgrade",
            "light_growthf_stage23_standard", "light_growthf_stage23_upgrade",
            "light_growthg_stage23_standard", "light_growthg_stage23_upgrade",
            "light_growthh_stage23_standard", "light_growthh_stage23_upgrade",
            "light_growthi_stage23_standard", "light_growthi_stage23_upgrade",
            "weed_hosea", "weed_hoseb", "weed_hosec", "weed_hosed", "weed_hosee",
            "weed_hosef", "weed_hoseg", "weed_hoseh", "weed_hosei",
        },
    },
    cameraBounds = {
        min = { x = 1036.5, y = -3208.0, z = -39.0 },
        max = { x = 1066.5, y = -3182.0, z = -34.8 },
    },
    nodes = {
        { key = "grow_01", type = "cultivation", label = "Plant Position 1", coords = { x = 1053.95, y = -3196.65, z = -39.15 }, heading = 0.0 },
        { key = "grow_02", type = "cultivation", label = "Plant Position 2", coords = { x = 1056.15, y = -3196.65, z = -39.15 }, heading = 0.0 },
        { key = "grow_03", type = "cultivation", label = "Plant Position 3", coords = { x = 1058.35, y = -3196.65, z = -39.15 }, heading = 0.0 },
        { key = "grow_04", type = "cultivation", label = "Plant Position 4", coords = { x = 1060.55, y = -3196.65, z = -39.15 }, heading = 0.0 },
        { key = "machine_01", type = "machine", label = "Processing Position", coords = { x = 1038.9, y = -3205.4, z = -38.17 }, heading = 270.0 },
        { key = "storage_01", type = "storage", label = "Storage Position", coords = { x = 1040.4, y = -3199.2, z = -38.17 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Utility Position", coords = { x = 1044.2, y = -3194.8, z = -38.17 }, heading = 0.0 },
    },
}

New stock block:

Config.Drugs.Laboratories.interiorPresets.weed_small = {
    label = "Medium Cultivation Laboratory",
    size = "medium",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 1066.11, y = -3183.472, z = -39.162, heading = 92.0 },
    exit = { x = 1066.11, y = -3183.472, z = -39.162, heading = 92.0 },
    backdoors = {
        { key = "backdoor_01", label = "Back door 1", x = 1039.132, y = -3195.771, z = -38.225, heading = 0.0 },
    },
    emptyInterior = {
        disable = {
            "weed_standard_equip", "weed_upgrade_equip", "weed_low_security", "weed_security_upgrade",
            "weed_production", "weed_set_up", "weed_drying", "weed_chairs",
            "weed_growtha_stage1", "weed_growtha_stage2", "weed_growtha_stage3",
            "weed_growthb_stage1", "weed_growthb_stage2", "weed_growthb_stage3",
            "weed_growthc_stage1", "weed_growthc_stage2", "weed_growthc_stage3",
            "weed_growthd_stage1", "weed_growthd_stage2", "weed_growthd_stage3",
            "weed_growthe_stage1", "weed_growthe_stage2", "weed_growthe_stage3",
            "weed_growthf_stage1", "weed_growthf_stage2", "weed_growthf_stage3",
            "weed_growthg_stage1", "weed_growthg_stage2", "weed_growthg_stage3",
            "weed_growthh_stage1", "weed_growthh_stage2", "weed_growthh_stage3",
            "weed_growthi_stage1", "weed_growthi_stage2", "weed_growthi_stage3",
            "light_growtha_stage23_standard", "light_growtha_stage23_upgrade",
            "light_growthb_stage23_standard", "light_growthb_stage23_upgrade",
            "light_growthc_stage23_standard", "light_growthc_stage23_upgrade",
            "light_growthd_stage23_standard", "light_growthd_stage23_upgrade",
            "light_growthe_stage23_standard", "light_growthe_stage23_upgrade",
            "light_growthf_stage23_standard", "light_growthf_stage23_upgrade",
            "light_growthg_stage23_standard", "light_growthg_stage23_upgrade",
            "light_growthh_stage23_standard", "light_growthh_stage23_upgrade",
            "light_growthi_stage23_standard", "light_growthi_stage23_upgrade",
            "weed_hosea", "weed_hoseb", "weed_hosec", "weed_hosed", "weed_hosee",
            "weed_hosef", "weed_hoseg", "weed_hoseh", "weed_hosei",
        },
    },
    cameraBounds = {
        min = { x = 1036.5, y = -3208.0, z = -39.0 },
        max = { x = 1066.5, y = -3182.0, z = -34.8 },
    },
    nodes = {
        { key = "machine_01", type = "machine", label = "Machine Position 1", coords = { x = 1045.42, y = -3197.04, z = -39.146 }, heading = 179.932 },
        { key = "machine_02", type = "machine", label = "Machine Position 2", coords = { x = 1042.493, y = -3197.036, z = -39.151 }, heading = 179.932 },
        { key = "storage_01", type = "storage", label = "Storage Position 1", coords = { x = 1050.953, y = -3194.373, z = -40.119 }, heading = 179.932 },
        { key = "storage_02", type = "storage", label = "Storage Position 2", coords = { x = 1050.921, y = -3196.971, z = -40.119 }, heading = 179.932 },
        { key = "storage_03", type = "storage", label = "Storage Position 3", coords = { x = 1050.793, y = -3199.505, z = -40.119 }, heading = 179.932 },
        { key = "utility_01", type = "utility", label = "Utility Position 1", coords = { x = 1051.303, y = -3190.988, z = -40.159 }, heading = 179.932 },
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.interiorPresets.meth_medium

Old stock block:

Config.Drugs.Laboratories.interiorPresets.meth_medium = {
    label = "Medium Chemical Laboratory",
    size = "medium",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    exit = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "meth_lab_basic", "meth_lab_upgrade", "meth_lab_production",
            "meth_lab_security_low", "meth_lab_security_high", "meth_lab_setup",
        },
        enable = { "meth_lab_empty" },
    },
    cameraBounds = {
        min = { x = 996.5, y = -3201.8, z = -38.0 },
        max = { x = 1015.5, y = -3193.2, z = -33.8 },
    },
    nodes = {
        { key = "machine_01", type = "machine", label = "Chemistry Position", coords = { x = 1005.77, y = -3200.36, z = -38.52 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Heating Position", coords = { x = 1011.14, y = -3195.97, z = -38.99 }, heading = 0.0 },
        { key = "machine_03", type = "machine", label = "Packaging Position", coords = { x = 1014.1, y = -3194.95, z = -38.99 }, heading = 0.0 },
        { key = "storage_01", type = "storage", label = "Storage Position 1", coords = { x = 1001.5, y = -3194.86, z = -38.99 }, heading = 180.0 },
        { key = "storage_02", type = "storage", label = "Storage Position 2", coords = { x = 1001.5, y = -3197.1, z = -38.99 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Generator Position", coords = { x = 1004.75, y = -3194.96, z = -38.99 }, heading = 180.0 },
    },
}

New stock block:

Config.Drugs.Laboratories.interiorPresets.meth_medium = {
    label = "Medium Chemical Laboratory",
    size = "medium",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 996.91, y = -3200.682, z = -36.392, heading = 270.0 },
    exit = { x = 996.91, y = -3200.682, z = -36.392, heading = 270.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "meth_lab_basic", "meth_lab_upgrade", "meth_lab_production",
            "meth_lab_security_low", "meth_lab_security_high", "meth_lab_setup",
        },
        enable = { "meth_lab_empty" },
    },
    cameraBounds = {
        min = { x = 996.5, y = -3201.8, z = -38.0 },
        max = { x = 1015.5, y = -3193.2, z = -33.8 },
    },
    nodes = {
        { key = "machine_01", type = "machine", label = "Chemistry Position", coords = { x = 1007.14, y = -3200.362, z = -40.0 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Heating Position", coords = { x = 1010.442, y = -3200.56, z = -40.0 }, heading = 0.0 },
        { key = "machine_03", type = "machine", label = "Packaging Position", coords = { x = 1010.439, y = -3197.608, z = -40.0 }, heading = 0.0 },
        { key = "storage_01", type = "storage", label = "Storage Position 1", coords = { x = 1001.218, y = -3197.604, z = -40.0 }, heading = 180.0 },
        { key = "storage_02", type = "storage", label = "Storage Position 2", coords = { x = 1001.5, y = -3201.762, z = -40.0 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Generator Position", coords = { x = 1015.5, y = -3199.942, z = -40.0 }, heading = 180.0 },
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.interiorPresets.camper_compact

Old stock block:

Config.Drugs.Laboratories.interiorPresets.camper_compact = {
    label = "Compact Camper Laboratory",
    size = "small",
    allowLaboratories = false,
    allowCampers = true,
    entry = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    exit = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "meth_lab_basic", "meth_lab_upgrade", "meth_lab_production",
            "meth_lab_security_low", "meth_lab_security_high", "meth_lab_setup",
        },
        enable = { "meth_lab_empty" },
    },
    cameraBounds = {
        min = { x = 996.5, y = -3201.8, z = -38.0 },
        max = { x = 1015.5, y = -3193.2, z = -33.8 },
    },
    nodes = {
        { key = "storage_01", type = "storage", label = "Camper Storage Shelf", coords = { x = 1001.5, y = -3194.86, z = -38.99 }, heading = 180.0 },
        { key = "machine_01", type = "machine", label = "Camper Workbench", coords = { x = 1005.77, y = -3200.36, z = -38.52 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Camper Power Position", coords = { x = 1004.75, y = -3194.96, z = -38.99 }, heading = 180.0 },
        { key = "grow_01", type = "cultivation", label = "Camper Plant Position", coords = { x = 1011.14, y = -3195.97, z = -38.99 }, heading = 0.0 },
    },
}

New stock block:

Config.Drugs.Laboratories.interiorPresets.camper_compact = {
    label = "Compact Camper Laboratory",
    size = "small",
    allowLaboratories = false,
    allowCampers = true,
    entry = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    exit = { x = 996.91, y = -3200.68, z = -36.39, heading = 270.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "meth_lab_basic", "meth_lab_upgrade", "meth_lab_production",
            "meth_lab_security_low", "meth_lab_security_high", "meth_lab_setup",
        },
        enable = { "meth_lab_empty" },
    },
    cameraBounds = {
        min = { x = 996.5, y = -3201.8, z = -38.0 },
        max = { x = 1015.5, y = -3193.2, z = -33.8 },
    },
    nodes = {
        { key = "storage_01", type = "storage", label = "Camper Storage Shelf", coords = { x = 1001.5, y = -3194.86, z = -38.99 }, heading = 180.0 },
        { key = "machine_01", type = "machine", label = "Camper Workbench", coords = { x = 1005.77, y = -3200.36, z = -38.52 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Camper Power Position", coords = { x = 1004.75, y = -3194.96, z = -38.99 }, heading = 180.0 },
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.interiorPresets.drug_wars_lab

Old stock block:

Config.Drugs.Laboratories.interiorPresets.drug_wars_lab = {
    label = "drugCreatorInteriorPresetDrugWarsLab",
    size = "small",
    allowLaboratories = false,
    allowCampers = true,
    entry = { x = 483.4252, y = -2625.071, z = -50.0, heading = 90.0 },
    exit = { x = 483.4252, y = -2625.071, z = -50.0, heading = 90.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "set_product_01",
            "set_product_02",
            "set_product_03",
            "set_product_04",
            "set_product_05",
            "set_supplies_01",
            "set_supplies_02",
            "set_supplies_03",
            "set_supplies_04",
            "set_supplies_05",
            "set_equipment_upgrade",
        },
    },
    cameraBounds = {
        min = { x = 470.0, y = -2640.0, z = -54.0 },
        max = { x = 498.0, y = -2610.0, z = -44.0 },
    },
    nodes = {
        { key = "storage_01", type = "storage", label = "Camper Storage Shelf", coords = { x = 481.8, y = -2625.0, z = -49.664 }, heading = 90.0 },
        { key = "machine_01", type = "machine", label = "Processing Position 1", coords = { x = 487.8, y = -2623.9, z = -49.664 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Camper Power Position", coords = { x = 488.6, y = -2625.0, z = -49.664 }, heading = 90.0 },
        { key = "grow_01", type = "cultivation", label = "Camper Plant Position", coords = { x = 481.8, y = -2626.5, z = -49.664 }, heading = 0.0 },
        { key = "storage_02", type = "storage", label = "Camper Storage Shelf", coords = { x = 485.2, y = -2623.5, z = -50.064 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Processing Position 2", coords = { x = 483.5, y = -2626.5, z = -49.264 }, heading = 0.0 },
        { key = "machine_03", type = "machine", label = "Processing Position 3", coords = { x = 487.7, y = -2626.0, z = -49.664 }, heading = 0.0 },
        { key = "machine_04", type = "machine", label = "Camper Workbench", coords = { x = 485.2, y = -2626.5, z = -49.264 }, heading = 0.0 },
        { key = "machine_05", type = "machine", label = "Carbon Filter", coords = { x = 481.8, y = -2623.5, z = -49.664 }, heading = 180.0 },
        { key = "machine_06", type = "machine", label = "Cultivation Scanner", coords = { x = 483.5, y = -2623.5, z = -49.162 }, heading = 180.0 },
        { key = "machine_07", type = "machine", label = "Security Camera", coords = { x = 488.6, y = -2626.5, z = -47.6 }, heading = 90.0 },
    },
}

New stock block:

Config.Drugs.Laboratories.interiorPresets.drug_wars_lab = {
    label = "drugCreatorInteriorPresetDrugWarsLab",
    size = "small",
    allowLaboratories = false,
    allowCampers = true,
    entry = { x = 483.4252, y = -2625.071, z = -50.0, heading = 90.0 },
    exit = { x = 483.4252, y = -2625.071, z = -50.0, heading = 90.0 },
    backdoors = {},
    emptyInterior = {
        ipls = {
            "xm3_collision_fixes",
            "xm3_sum2_fix",
            "xm3_security_fix",
        },
        enable = {
            "set_product_01",
            "set_product_02",
            "set_product_03",
            "set_product_04",
            "set_product_05",
            "set_supplies_01",
            "set_supplies_02",
            "set_supplies_03",
            "set_supplies_04",
            "set_supplies_05",
            "set_equipment_upgrade",
        },
    },
    cameraBounds = {
        min = { x = 470.0, y = -2640.0, z = -54.0 },
        max = { x = 498.0, y = -2610.0, z = -44.0 },
    },
    nodes = {
        { key = "storage_01", type = "storage", label = "Camper Storage Shelf", coords = { x = 481.8, y = -2625.0, z = -49.664 }, heading = 90.0 },
        { key = "machine_01", type = "machine", label = "Processing Position 1", coords = { x = 487.8, y = -2623.9, z = -49.664 }, heading = 180.0 },
        { key = "utility_01", type = "utility", label = "Camper Power Position", coords = { x = 488.6, y = -2625.0, z = -49.664 }, heading = 90.0 },
        { key = "storage_02", type = "storage", label = "Camper Storage Shelf", coords = { x = 485.2, y = -2623.5, z = -50.064 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Processing Position 2", coords = { x = 483.5, y = -2626.5, z = -49.264 }, heading = 0.0 },
        { key = "machine_03", type = "machine", label = "Processing Position 3", coords = { x = 487.7, y = -2626.0, z = -49.664 }, heading = 0.0 },
        { key = "machine_04", type = "machine", label = "Camper Workbench", coords = { x = 485.2, y = -2626.5, z = -49.264 }, heading = 0.0 },
        { key = "machine_05", type = "machine", label = "Carbon Filter", coords = { x = 481.8, y = -2623.5, z = -49.664 }, heading = 180.0 },
        { key = "machine_06", type = "machine", label = "Batch Quality Scanner", coords = { x = 483.5, y = -2623.5, z = -49.162 }, heading = 180.0 },
        { key = "machine_07", type = "machine", label = "Security Camera", coords = { x = 488.6, y = -2626.5, z = -47.6 }, heading = 90.0 },
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.interiorPresets.bunker_large

Old stock block:

Config.Drugs.Laboratories.interiorPresets.bunker_large = {
    label = "Large Underground Laboratory",
    size = "large",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 892.64, y = -3245.87, z = -98.26, heading = 90.0 },
    exit = { x = 892.64, y = -3245.87, z = -98.26, heading = 90.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "Bunker_Style_B", "Bunker_Style_C",
            "standard_bunker_set", "upgrade_bunker_set", "upgrade_bunker_set_more",
            "standard_security_set", "security_upgrade", "Office_blocker_set",
            "Office_Upgrade_set", "gun_range_blocker_set", "gun_wall_blocker",
            "gun_range_lights", "gun_locker_upgrade", "Gun_schematic_set",
        },
        enable = { "Bunker_Style_A" },
    },
    cameraBounds = {
        min = { x = 884.0, y = -3246.2, z = -98.0 },
        max = { x = 904.0, y = -3196.0, z = -93.5 },
    },
    nodes = {
        { key = "grow_01", type = "cultivation", label = "Plant Position 1", coords = { x = 892.0, y = -3221.5, z = -98.26 }, heading = 0.0 },
        { key = "grow_02", type = "cultivation", label = "Plant Position 2", coords = { x = 895.0, y = -3221.5, z = -98.26 }, heading = 0.0 },
        { key = "grow_03", type = "cultivation", label = "Plant Position 3", coords = { x = 898.0, y = -3221.5, z = -98.26 }, heading = 0.0 },
        { key = "grow_04", type = "cultivation", label = "Plant Position 4", coords = { x = 901.0, y = -3221.5, z = -98.26 }, heading = 0.0 },
        { key = "grow_05", type = "cultivation", label = "Plant Position 5", coords = { x = 892.0, y = -3218.5, z = -98.26 }, heading = 180.0 },
        { key = "grow_06", type = "cultivation", label = "Plant Position 6", coords = { x = 895.0, y = -3218.5, z = -98.26 }, heading = 180.0 },
        { key = "machine_01", type = "machine", label = "Processing Position 1", coords = { x = 902.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Processing Position 2", coords = { x = 899.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "machine_03", type = "machine", label = "Processing Position 3", coords = { x = 896.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "storage_01", type = "storage", label = "Storage Position 1", coords = { x = 888.0, y = -3197.0, z = -98.19 }, heading = 90.0 },
        { key = "storage_02", type = "storage", label = "Storage Position 2", coords = { x = 888.0, y = -3200.0, z = -98.19 }, heading = 90.0 },
        { key = "utility_01", type = "utility", label = "Generator Position", coords = { x = 885.0, y = -3208.0, z = -98.19 }, heading = 270.0 },
    },
}

New stock block:

Config.Drugs.Laboratories.interiorPresets.bunker_large = {
    label = "Large Underground Laboratory",
    size = "large",
    allowLaboratories = true,
    allowCampers = true,
    entry = { x = 892.64, y = -3245.87, z = -98.26, heading = 90.0 },
    exit = { x = 892.64, y = -3245.87, z = -98.26, heading = 90.0 },
    backdoors = {},
    emptyInterior = {
        disable = {
            "Bunker_Style_B", "Bunker_Style_C",
            "standard_bunker_set", "upgrade_bunker_set", "upgrade_bunker_set_more",
            "standard_security_set", "security_upgrade", "Office_blocker_set",
            "Office_Upgrade_set", "gun_range_blocker_set", "gun_wall_blocker",
            "gun_range_lights", "gun_locker_upgrade", "Gun_schematic_set",
        },
        enable = { "Bunker_Style_A" },
    },
    cameraBounds = {
        min = { x = 884.0, y = -3246.2, z = -98.0 },
        max = { x = 904.0, y = -3196.0, z = -93.5 },
    },
    nodes = {
        { key = "machine_01", type = "machine", label = "Processing Position 1", coords = { x = 902.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "machine_02", type = "machine", label = "Processing Position 2", coords = { x = 899.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "machine_03", type = "machine", label = "Processing Position 3", coords = { x = 896.5, y = -3199.0, z = -98.19 }, heading = 180.0 },
        { key = "storage_01", type = "storage", label = "Storage Position 1", coords = { x = 888.0, y = -3197.0, z = -98.19 }, heading = 90.0 },
        { key = "storage_02", type = "storage", label = "Storage Position 2", coords = { x = 888.0, y = -3200.0, z = -98.19 }, heading = 90.0 },
        { key = "utility_01", type = "utility", label = "Generator Position", coords = { x = 885.0, y = -3208.0, z = -98.19 }, heading = 270.0 },
    },
}

sky_crimesystem/config/drugs_laboratories.lua: Config.Drugs.Laboratories.expansionCatalog.cultivation_wing

Old stock block:

Config.Drugs.Laboratories.expansionCatalog.cultivation_wing = {
    label = "labExpansionCultivationWing",
    description = "labExpansionCultivationWingDescription",
    category = "cultivation",
    kind = "space",
    nodeType = "cultivation",
    levels = {
        { cost = 18000 },
        { cost = 28000 },
        { cost = 42000 },
        { cost = 62000 },
        { cost = 90000 },
        { cost = 125000 },
    },
}

New stock block:

Removed; no replacement block.

sky_crimesystem/config/drugs_supply_chain.lua: Config.Drugs.SupplyChain

Old stock block:

Config.Drugs.SupplyChain = {
    version = 11,
    testMode = false,
    testDurationSeconds = 10,
    baseQuality = 50,
    products = {
        raw_weed = { drug = "weed", stage = "raw", portions = 1 },
        weed_dried = { drug = "weed", stage = "intermediate", portions = 1 },
        weed_cured = { drug = "weed", stage = "intermediate", portions = 1 },
        weed_baggy = { drug = "weed", stage = "retail", portions = 1, packaging = "baggy" },
        joint = { drug = "weed", stage = "retail", portions = 1, packaging = "baggy" },
        weed_premium_jar = { drug = "weed", stage = "premium", portions = 5, packaging = "jar" },
        coca_leaf = { drug = "coke", stage = "raw", portions = 1 },
        coke_powder = { drug = "coke", stage = "intermediate", portions = 1 },
        coke_baggy = { drug = "coke", stage = "retail", portions = 1, packaging = "baggy" },
        coke_brick = { drug = "coke", stage = "bulk", portions = 10, packaging = "brick" },
        chemical_precursor = { drug = "meth", stage = "raw", portions = 1 },
        meth_crystal = { drug = "meth", stage = "intermediate", portions = 1 },
        meth_baggy = { drug = "meth", stage = "retail", portions = 1, packaging = "baggy" },
        tab_solution = { drug = "lsd", stage = "raw", portions = 1 },
        lsd_tab_unpacked = { drug = "lsd", stage = "intermediate", portions = 1 },
        lsd_tabs = { drug = "lsd", stage = "retail", portions = 1, packaging = "premium_seal" },
        wild_mushroom = { drug = "mushrooms", stage = "raw", portions = 1 },
        dried_mushroom = { drug = "mushrooms", stage = "intermediate", portions = 1 },
        mushroom_baggy = { drug = "mushrooms", stage = "retail", portions = 1, packaging = "baggy" },
        desert_root = { drug = "herbal_stimulant", stage = "raw", portions = 1 },
        ephedra_leaf = { drug = "herbal_stimulant", stage = "raw", portions = 1 },
        herbal_extract = { drug = "herbal_stimulant", stage = "intermediate", portions = 1 },
        herbal_pill = { drug = "herbal_stimulant", stage = "retail", portions = 1, packaging = "baggy" },
        syrup_base = { drug = "lean", stage = "raw", portions = 1 },
        lean_mix = { drug = "lean", stage = "intermediate", portions = 1 },
        lean_bottle = { drug = "lean", stage = "premium", portions = 5, packaging = "premium_seal" },
        lean_cup = { drug = "lean", stage = "retail", portions = 1, packaging = "cup" },
    },
    supplierPrices = {
        empty_baggy = 5, empty_jar = 20, rolling_paper = 3, vacuum_bag = 10,
        foil_pack = 5, empty_bottle = 15, empty_cup = 3, empty_capsule = 3,
        blank_tab_sheet = 10, plastic_wrap = 15, lab_supply_kit = 20,
        chemical_precursor = 50, tab_solution = 45, syrup_base = 30, lab_filter = 10,
        brick_mold = 700, label_printer = 1500, small_shovel = 350, precision_scissors = 600,
        og_kush_seed = 40, blue_dream_seed = 45, white_widow_seed = 50,
        purple_haze_seed = 55, gelato_seed = 55, mountain_coca_seed = 60,
        blue_spore_seed = 40, dryland_root_seed = 30, desert_ephedra_seed = 30,
    },
}

New stock block:

Config.Drugs.SupplyChain = {
    version = 15,
    testMode = false,
    testDurationSeconds = 10,
    baseQuality = 50,
    products = {
        raw_weed = { drug = "weed", stage = "raw", portions = 1 },
        weed_baggy = { drug = "weed", stage = "retail", portions = 1, packaging = "baggy" },
        coca_leaf = { drug = "coke", stage = "raw", portions = 1 },
        coke_powder = { drug = "coke", stage = "intermediate", portions = 1 },
        coke_baggy = { drug = "coke", stage = "retail", portions = 1, packaging = "baggy" },
    },
    supplierPrices = {
        empty_baggy = 5,
        lab_supply_kit = 20,
        label_printer = 1500,
        blue_dream_seed = 45,
        mountain_coca_seed = 60,
    },
}

sky_crimesystem/config/drugs_supply_chain.lua: trailing aliases

Old:

Config.Drugs.Growing.harvestParts.mushrooms = Config.Drugs.Growing.harvestParts.lsd
Config.Drugs.Growing.harvestParts.mushrooms[2].outputItem = "blue_spore_seed"
Config.Drugs.Consumption.effects.mushrooms = Config.Drugs.Consumption.effects.lsd
Config.Drugs.Growing.harvestParts.coke[2].outputItem = "coca_leaf"
Config.Drugs.Growing.harvestParts.herbal_stimulant[2].outputItem = "desert_root"

New (the cocaine leaf override remains; the mushroom and herbal aliases are removed):

Config.Drugs.Growing.harvestParts.coke[2].outputItem = "coca_leaf"

Additional configuration in the complete 0.6.0 package

The following four paths were absent from the earlier package. Add all four blocks to sky_crimesystem/config/config.lua, including on servers with Config.UseJobConfigurator = true. Keep the parent Config.ATMRobbery and Config.HeistPlanning declarations. These are complete top-level assignments: paste them after those parent declarations, for example at the end of config/config.lua; do not paste Config... = assignments inside another table. Preserve any deliberate custom calibration when merging.

The first three blocks add the four rear-panel screw positions for the supplied detached ATM models. Keep the existing panel, cash, drilling camera and other ATM values. Every custom detached-body model also needs exactly four valid model-local contacts; there is no fallback to the former single panel-centre point. /atmdrillview can calibrate model-specific points; persist both its exported drillPresentation and model-specific drillPoints in this file, then restart.

Config.ATMRobbery.detachedParts.sky_atm_02.drillPoints = {
                { x = -0.42419797, y = 0.41116953, z = 1.66645062 },
                { x = 0.42419797, y = 0.41116953, z = 1.66645062 },
                { x = 0.42419797, y = 0.41116953, z = 0.76811969 },
                { x = -0.42419797, y = 0.41116953, z = 0.76811969 },
            }
Config.ATMRobbery.detachedParts.sky_atm_03.drillPoints = {
                { x = -0.42419797, y = 0.41316982, z = 1.85564008 },
                { x = 0.42419797, y = 0.41316982, z = 1.85564008 },
                { x = 0.42419797, y = 0.41316982, z = 0.72736773 },
                { x = -0.42419797, y = 0.41316982, z = 0.72736773 },
            }
Config.ATMRobbery.detachedParts.sky_fleeca_atm.drillPoints = {
                { x = -0.42851438, y = 0.42853536, z = 1.85257855 },
                { x = 0.42021359, y = 0.42853536, z = 1.85257855 },
                { x = 0.42021359, y = 0.42853536, z = 0.72847613 },
                { x = -0.42851438, y = 0.42853536, z = 0.72847613 },
            }

Config.ATMRobbery.drilling.duration remains 20000 and timeLimit remains 120000, but both now apply to each screw attempt, not the complete four-screw sequence. Cooling can extend an attempt. Keep custom timing intentionally. The default drill item remains vault_drill, amount 1, consume = false. If you deliberately use Config.ATMRobbery.items.drill.consume = true, the configured quantity is consumed after each successful screw: four times for a complete panel. Cancellation or overheating does not consume the current attempt, but does not refund items used on earlier completed screws. Cash is collected through the separate loot action after all four screws.

Add the screen block below. It enables one persistent screen per Crime organization. Distances are in metres; resolution is width and height in pixels. Keep placement, connection, interaction and rendering distances aligned with the intended location.

Config.HeistPlanning.screen = {
        enabled = true,
        placementDistance = 6.0,
        connectionDistance = 20.0,
        interactionDistance = 5.0,
        renderDistance = 48.0,
        resolution = { width = 1920, height = 1080 },
    }

The screen requires Config.HeistPersistence.enabled = true. If you deliberately disable Heist persistence, also set Config.HeistPlanning.screen.enabled = false; enabling a persistent screen while persistence is disabled produces a startup error. This release does not add the screen fields to /jobconfig: change them in config/config.lua and restart Crime. Existing /jobconfig crafting and plan-lifecycle settings remain separate. Do not expect saved Job Configurator overrides to populate the new screen block or the model-specific ATM screw points.

The added config/heist_exports/heist_4_v1.json is an optional Heist Creator export. Preserve a customer file first if that exact filename is already in use. Copying it does not activate a new robbery: Config.HeistDefinitionFiles still registers the existing Fleeca definition. Keep existing definitions and plans. If you choose to adopt this export, use the Heist Creator export browser/import workflow after the maintenance restart, inspect its identifiers, missions and world placements, and save only the content you intend to install. The supplied Pacific example needs its map/interior and the existing items explosive_charge, vault_keycard, gas_mask, plastic_wrap, carbon_filter and lab_gloves in the active inventory. Review its recipes, rewards and crew requirements before making it available. This optional content step is separate from Drug Creator default import and from SQL migration.

After the maintenance restart, open the tablet Heist Planning app, then Screen → Place screen, aim at a nearby vertical wall and confirm. Open a plan and choose Screen → Share on screen. Focus screen lets a nearby player interact with the physical display; leaving local focus or closing the tablet keeps the presentation running. Use Disconnect to end it, or Take control as another eligible organization member. Nearby outsiders can see the display but cannot control it; plan-changing actions retain the existing leader and crew permissions. Removing a screen ends its presentation. A presentation also ends when its presenter disconnects, leaves the permitted organization/range/bucket or stops responding, or when its plan ends.

Existing box-shaped gas zones remain usable. New polygon footprints and generated laser lines are saved as Creator definition content; existing heists do not need compulsory zone recreation or a separate SQL conversion. Use the Creator's placement controls only after startup, and preserve stored definitions that you do not intend to edit.

Optional performance diagnostics

Extra profiler information is disabled by default. If support requests a recording, add setr sky_profiler 1 to server.cfg before the Sky ensure lines and restart. Run profiler record 1000 in the server console, wait until profiler status reports completion, then run profiler saveJSON sky-release-profile.json. Disable with setr sky_profiler 0 and another restart. This is not a /jobconfig setting; enabling it neither starts recording nor uploads anything automatically. Keep source/ and fxmanifest.lua from the same download even when diagnostics are disabled. Profiler processing leaves public configuration unchanged; if an older profiler package modified public files, restore their new public versions once and reapply your customizations.

  1. Apply SQL, inventory and asset updates

SQL and persistence

The complete 0.6.0 package adds the sky_crime_heist_screens table. With screens enabled, Config.HeistPersistence.enabled = true and Config.HeistPersistence.autoMigrate = true, its migration runs during startup. With autoMigrate = false, run exactly this additive block from the new import.sql against the backed-up active server database before starting Crime with screens enabled:

CREATE TABLE IF NOT EXISTS `sky_crime_heist_screens` (
    `organization` VARCHAR(64) NOT NULL,
    `payload` LONGTEXT NOT NULL,
    `revision` BIGINT UNSIGNED NOT NULL DEFAULT 1,
    PRIMARY KEY (`organization`)
) ENGINE=InnoDB;

Keep all existing rows and other tables. Do not use clear.sql, drop tables or re-import the entire database to add screens. The table inherits the active database charset and collation. Main Crime/PvP/interrogation/raid tables and the existing separate Heist migration remain distinct; apply any earlier missing migrations through their existing update instructions. Drug Creator defaults and Heist Creator exports are content imports, not substitutes for SQL. Screen placement is persistent; a live presentation is not a promise to restore the same active presenter after a server restart.

If screens stay disabled, their startup does not create or query this table. Apply the table before later enabling screens when automatic migration is disabled. Successful ATM screw progress lasts only while that ATM's live state exists; it is not restored from SQL after a resource/server restart.

Inventory and assets

The reduced stock drug supply chain uses raw_weed, weed_baggy, coca_leaf, coke_powder and coke_baggy, with Blue Dream and Mountain Coca strains. Verify seeds and materials used by your selected definitions exist in the active inventory. Existing autoRegisterItems, persistFrameworkItems and warnMissingItems choices remain provider-dependent; check actual item registration. Keep items still used by custom definitions or owned by players, including existing configured base-raid and interrogation requirements.

No new mandatory inventory item or inventory image is required by the screen, gas/laser or assembly additions. The existing configurable drill item must be available for ATM drilling; review the per-screw consumption choice in step 3. Copy all 16 screen model files, their shared texture dictionary and type definition from stream/heist-screen/. The matching manifest registers those assets. The screen interface, assembly images and 18 plant-preview images arrive with the complete source/ directory. Do not use promotional artwork or development files as runtime assets.

  1. Restart and verify

Start framework/inventory dependencies, Base 1.43.0, Jobs Base 1.46.0 and Crime 0.6.0, then reconnect. Check startup and manifest version. Open the Creator, edit a value and verify the save/discard/continue choices. Open the model picker and confirm Escape closes that picker without closing the editor. Test a deliberately selected default import and an incomplete dependency selection on backed-up test content. Verify saved cultivation settings, gradual planted growth, free laboratory pot placement and your intended camper production/storage/upgrade paths with the actual inventory and players.

For a corrected same-version installation, confirm the manifest is 0.6.0 with nui_build '05d656cdde7d2846'. Check startup for the screen table and configuration errors. Place a screen through the tablet planning workflow with an authorized organization member, start a presentation and test nearby viewing, direct interaction, drawing/notes according to the member's plan permissions, closing the tablet, leaving local focus and authorized takeover. Verify placement survives a real restart; restart the presentation as needed. Test that an unrelated player cannot control the screen.

Test all four ATM screws and the separate cash collection, including a cancelled attempt and your configured drill consumption. In the Creator, verify gas-zone relocation, four-corner laser creation, cancellation, mouse look and Tab navigation; Tab inside a form or open dialog must stay with that interface. New screens and Creator features do not enable Money Wash, the online Heist Hub, locked jewelry-vitrine creation or default-disabled NPC police reinforcement.

Version 0.5.0

Update Base to 1.42.0 and Jobs Base to 1.45.0 before installing Crime System 0.5.0.

Highlights

  • Added personal Crime reputation, with configurable rewards for completed activities, a /crimerep overview and an optional reputation requirement for joining Crime factions.
  • Improved transported ATM drilling with the shared pressure-and-heat minigame, an aligned player and drill, and an administrator preview for adjusting the camera and positioning.
  • Improved processing orders with a quantity selector, matching material requirements and fees, and an exact remaining-time display.
  • Added Heist Creator context menus for editing, copying, pasting, duplicating and deleting supported missions, objectives, approaches, gas zones and lasers.

Notable Changes

  • Fixed an issue where shop robbery alerts did not create an incident in Jobs Base with the standard configuration.
  • Fixed an issue where public ATM and shop robbery actions could be hidden from ordinary civilians in the radial menu.
  • Improved shop-safe drilling with support for gang safes, audible jams and configurable drill breakage after repeated overheating, without an individual drilling-attempt time limit.
  • Fixed an issue where shopkeepers could lose their surrender pose or leave outdated threat information on screen after dying.
  • Fixed an issue where heist blockades using the existing progress drilling option did not open the pressure minigame correctly.
  • Added a complete default vault-drill preparation recipe using a drill, repair kit and car battery.
  • Improved outdoor cultivation with pot-free weed models, an adjustable ground offset for wild plants, a dedicated fertilizing interaction and better multi-part harvest views.
  • Fixed an issue where laboratory templates could duplicate or misplace equipment, lose storage links or prevent stored equipment from being placed.
  • Improved laboratory storage so equipment uses the intended shared stock and capacity, while saved equipment positions and model orientation remain consistent.
  • Fixed an issue where valid standard Drug Creator entries could be treated as migration conflicts or customized values could be replaced during normal default updates.
  • Fixed an issue where the Drug Creator's More menu did not open worker, camper and street-sale actions.
  • Improved sale-route contacts with clearer offers, amounts and sale progress, and an explanation before opening a route that is currently unavailable.
  • Added normal consumption for eligible finished drug items supplied outside the production system, while preserving checks on items that already carry a production batch.

Other Changes

  • Optimized Creator lists and details, drug activity, heist planning, territory changes and interrogation updates to avoid repeatedly transferring unchanged information.
  • Fixed an issue where delayed Creator or graffiti responses could replace a newer selection or unsaved work; conflicting edits are now rejected with a translated explanation.
  • Optimized drug startup and laboratory database reads to avoid redundant updates and repeated reads of the same data.
  • Reduced the texture memory used by damaged ATM models.
  • Improved heist planning with paper and folder textures and made vault-hack text easier to read.
  • Fixed an issue where scrolling during heist placement could switch the player's weapon.
  • Improved form readability, selection-list layering and shared tag controls across the interface.
  • Changed world processing stations to use the interaction help display instead of floating 3D text and shortened equipment highlighting to five seconds by default.
  • Updated gameplay, Creator, reputation and drilling translations in all bundled languages.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs_growing.lua
  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_market_threat_processing.lua
  • sky_crimesystem/config/drugs_supply_chain.lua
  • sky_crimesystem/config/functions.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/config/reputation.lua
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
  • sky_crimesystem/stream/sky_atm_01_exploded.ydr
  • sky_crimesystem/stream/sky_atm_01_exploded_cash.ydr
  • sky_crimesystem/stream/sky_atm_02_exploded.ydr
  • sky_crimesystem/stream/sky_atm_02_exploded_cash.ydr
  • sky_crimesystem/stream/sky_atm_03_exploded.ydr
  • sky_crimesystem/stream/sky_atm_03_exploded_cash.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_exploded.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_exploded_cash.ydr
Update InstructionsWhat to copy, what to keep and what to check0.4.00.5.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update

These instructions cover 0.4.0 → 0.5.0. Complete the earlier migrations first when upgrading from an older version. Stop the server and back up the database, resource, custom configuration, saved Creator definitions and configurator data. Install sky_base 1.42.0, then sky_jobs_base 1.45.0, including their own migration steps, before Crime. Review the new default admission requirement of 100 reputation points before reopening faction recruitment.

  1. Replace the package files

Install the matching 0.5.0 download. Delete and reinsert sky_crimesystem/source/*; replace sky_crimesystem/fxmanifest.lua, sky_crimesystem/import.sql, the complete sky_crimesystem/config/locales/* and the eight damaged-ATM stream files listed under Changed Files. Add sky_crimesystem/config/reputation.lua. Merge the listed changes into your customized configuration files rather than replacing unrelated settings or saved definitions. There are no removed or renamed customer paths outside source/ in this upgrade.

Keep source/* and fxmanifest.lua from the same download, even with diagnostics disabled. Profiler builds may instrument only Lua inside source/ and the manifest. If an older profiler package changed public files, restore those once from the clean new package and reapply your customizations. Future profiler-only updates do not require restoring those public files again.

  1. Merge configuration and review overrides

New reputation configuration

Add the new sky_crimesystem/config/reputation.lua from the download. This entire block is new in 0.5.0:

Config.Reputation = {
    enabled = true,
    pointsPerLevel = 100,
    minimumJoinPoints = 100,
    rewards = {
        atm = 20,
        shop_register = 5,
        shop_safe = 15,
        pickpocket = 3,
        heist = 100,
        drug_harvest = 2,
        drug_processing = 5,
        drug_sale = 5,
        drug_delivery = 15,
        drug_contract = 20,
        drug_raid = 25,
        graffiti = 3,
        moneywash = 10,
        base_raid = 25,
        pvp_win = 20,
    },
}

Reputation belongs to a character and persists across restarts. New characters start at 0 points and level 1; the default is 100 points per level. It is separate from faction influence, producer reputation and plant-care experience. /crimerep shows the player's points and level. Rewards are awarded for eligible completed activities, not multiplied by the money earned or each item in an order. Adding a reward does not enable an otherwise disabled activity.

The default minimumJoinPoints = 100 affects new admissions through the Crime faction membership flow. Existing members and promotions are retained, and points are not spent on joining. Set this to 0 to remove the admission requirement. Set enabled = false to suspend reputation awards and admission checks without deleting stored points.

When /jobconfig is enabled, open Crime → Reputation and review reputationEnabled, reputationPointsPerLevel, reputationMinimumJoinPoints and reputationRewards. Their defaults match the block above. reputationRewards is a list of rows such as { action = "atm", points = 20, enabled = true }; use the 15 action names shown above. An explicitly empty list awards no points. Missing, disabled or zero-point actions award none. Saved configurator overrides remain authoritative; changing only the file does not replace those overrides. Development-era separate reputation_<action> settings migrate into the new list, but an already saved list, including an empty one, is retained.

Merge the other public configuration changes

File and settingPrevious value in 0.4.0Value in 0.5.0 / action
config/config.lua → Config.CommandPermissions.atmdrillviewAbsentAdd { "god", "superadmin", "admin" }; adapt the groups to your administrator policy.
config/config.lua → Config.ATMRobbery.drillPresentationAbsentAdd the complete positioning block below.
config/config.lua → Config.ShopRobbery.drillMaxOverheatsAbsentAdd 3; reaching the limit destroys one drill.
config/config.lua → Config.ShopRobbery.drillSafeModelsAbsentAdd { "v_ilev_gangsafe" }; a saved drillSafe calibration still takes priority.
config/drugs_growing.lua → Config.Drugs.Growing.care.minigames.fertilize{ minigame = "ratio_mix", rounds = 3, duration = 9, xp = 5 }Replace with { minigame = "fertilizer_points", rounds = 5, duration = 4, xp = 5 }.
config/drugs_laboratories.lua → Config.Drugs.Laboratories.templateModelHeadingOffsetsAbsentAdd { bkr_prop_weed_table_01a = 90.0 }.
config/drugs_laboratories.lua → Config.Drugs.Laboratories.equipmentHighlight.durationSeconds205.
config/drugs_market_threat_processing.lua → Config.Drugs.Processing.maxOrderQuantityAbsentAdd 100; this caps supported processing orders.
config/drugs_supply_chain.lua → Config.Drugs.SupplyChain.version1011; keep the supplied migration version.

The settings in this table are edited in their configuration files; this release does not register matching /jobconfig keys for them. They remain effective with the configurator enabled. Do not invent configurator keys or reset unrelated settings. Existing overrides for already registered settings are retained.

Merge this complete new block into Config.ATMRobbery:

drillPresentation = {
    player = { x = 0.00000, y = 0.00000, z = 0.00000 },
    tool = { x = 0.00000, y = 0.00000, z = 0.00000 },
    camera = { x = 0.03921, y = -0.28666, z = 0.60750 },
    target = { x = 0.05137, y = -0.07460, z = -0.36968 },
    fov = 80.00,
},

The offsets are metres: X right, Y forward from the drilling stance and Z up; fov is the camera field of view. Optional calibration uses /atmdrillview near an existing stationary, detached ATM that has not yet been opened. The command does not create a test ATM. Use the preview controls and paste the atmdrilltune export into this block. Keep the existing ATM drill duration and time limit; the removed individual attempt deadline applies to shop-safe drilling.

In sky_crimesystem/config/config.lua, find Config.HeistCreator.openingMethodTemplates and the entry with id = "vault_drill". Its preparation.config.ingredients was an empty list. Replace that list with:

ingredients = {
    { key = "drill", amount = 1 },
    { key = "repair_kit", amount = 1 },
    { key = "car_battery", amount = 1 },
},

Keep its existing result = { key = "vault_drill", amount = 1 }. drillVariant = "progress" remains the default and now uses the pressure minigame; the optional "vault_drill" variant remains the GTA scaleform minigame. This template change affects newly created definitions. Check existing saved heist preparations separately and add ingredients where needed without replacing your whole heist catalogue.

Shop police dispatch

In config/functions.lua, the standard Config.Functions.SendShopPoliceDispatch(payload) now creates a Jobs Base incident; previously it only emitted the observer event. If you use the standard integration, merge the complete function below. If you deliberately replaced it for another dispatch provider, retain that integration and test it; do not run both integrations unintentionally.

function Config.Functions.SendShopPoliceDispatch(payload)
    if not IsDuplicityVersion() then
        return false
    end
    if type(payload) ~= "table" then
        error("Invalid shop police dispatch payload", 2)
    end

    local result = exports["sky_jobs_base"]:CreateDispatchIncident({
        sourceId = payload.unique,
        jobs = payload.jobs,
        coords = payload.coords,
        title = payload.title,
        message = payload.message,
        priority = payload.priority,
        details = {
            type = payload.type,
            reason = payload.reason,
            locationId = payload.locationId,
            radius = payload.radius,
            duration = payload.duration,
        },
    })
    TriggerEvent("sky_crimesystem:shopRobbery:policeDispatch", payload)
    if not result.success then
        return false, result.errorMessage or result.error or "unknown_error"
    end
    return true
end

Optional performance diagnostics

The optional profiler is disabled by default. To make a support recording, put setr sky_profiler 1 in server.cfg before the Sky ensure lines and restart. Run profiler record 1000 in the server console, wait until profiler status reports completion, then run profiler saveJSON sky-release-profile.json. Share that file only when requested. Set setr sky_profiler 0 and restart to disable the extra information. This is not a /jobconfig setting and does not start recordings or upload data automatically.

  1. Apply SQL, Creator, item and asset changes

SQL

This upgrade adds the personal reputation table. With Config.AutoExecuteQuery = true, allow the normal startup migration to finish. If automatic migration is disabled, run this new block from sky_crimesystem/import.sql against the existing database before starting Crime:

CREATE TABLE IF NOT EXISTS `sky_crime_reputation` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `identifier` VARBINARY(96) NOT NULL,
    `action` VARBINARY(64) NOT NULL,
    `completion_id` VARBINARY(128) NOT NULL,
    `points` INT UNSIGNED NOT NULL,
    `created_at` BIGINT NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_reputation_completion` (`identifier`, `action`, `completion_id`)
) ENGINE=InnoDB;

Keep the existing database and its records. A normal 0.4.0 installation does not have this table yet. No new Heist, PvP, interrogation or base-raid table migration is introduced by this upgrade; their existing setup remains required. The main automatic migration switch does not replace independently configured Heist or PvP migration settings. Also complete the Base and Jobs Base release migrations. Do not clear saved factions, plans, laboratory ownership, creator data or reputation records.

Drug Creator and saved definitions

The default supply-chain version changes from 10 to 11. With the existing default setting Config.Drugs.Creator.autoImportDefaults enabled, startup updates imported defaults while retaining customized fields and reporting conflicts for review. If your server disables that option, inspect the affected saved entries in the Creator and apply the desired changes there. Do not use a blanket replacement import to perform this update: the Creator's manual import can replace existing defaults. Back up and deliberately compare entries before any replacement import.

Default entry or Creator fieldPrevious valueNew value / required check
Recipe process_weed_fast“Pack dried weed”; weed_dried ×1 plus empty_baggy ×1“Process weed”; raw_weed ×1 plus empty_baggy ×1. Output remains weed_baggy ×1 and base time remains 10 seconds.
Processing point processing_location_weed_tablerecipeId = "process_weed_dry"recipeId = "process_weed_fast".
Recipe process_lean_mixsyrup_base ×1syrup_base ×1 plus lab_supply_kit ×1; material version becomes 11.
Wild plant wild_spawn_forest_weedharvestPartsMin = 2, harvestPartsMax = 4harvestPartsMin = 5, harvestPartsMax = 8.
Wild-plant field groundOffsetAbsentDefault 0; adjust between -10 and 10 metres in the Creator when the model needs a height correction.
Processing-point recipe selectionA recipeIds list could remain in saved dataSelect the single authoritative recipeId; the old list is cleared during normalization.
Processing-point floating textCould be enabledtextEnabled = false; interaction help replaces floating 3D text.
Enabled interior templatesCould lack required equipment categoriesInclude machine, storage and utility nodes. Incomplete warehouse defaults remain disabled until configured.

Quantity orders require a compatible recipe with material-version data; older custom recipes without it remain limited to one unit. Ingredients, output, processing time and handoff fees scale with the selected quantity; reusable tools do not. Handoff processing now checks all configured ingredients. Review custom recipes before enabling larger orders. Keep existing laboratory ownership and storage contents. Use stored matching equipment when placing laboratory equipment, and retain the template's required storage and utility nodes.

Items, assets and optional integrations

Replace all eight changed damaged-ATM .ydr files listed under Changed Files. Keep the existing ATM stream manifest entries and other models. Heist paper and folder graphics are included in the complete source/* replacement. There are no new standalone item definitions or inventory icons in this release. The new drill recipe uses the existing configured items drill, repair_kit, car_battery and vault_drill; the updated lean recipe uses the existing lab_supply_kit. Check those existing item mappings in your inventory.

Eligible finished drug items supplied externally can now be consumed using the active default product profile when they have no production batch. No special import or new setting is required. Raw materials, intermediate products, seeds and bulk products are not included. An item with an explicit invalid, consumed or reserved batch does not fall back to default consumption.

Keep existing interrogation, raid and optional item integrations; this update adds no new requirement there. Defaults still use interrogation_chair, interrogation_cart, cable_tie, blindfold, torture_pliers, car_battery, blowtorch and water_canister where their configured actions need them, and police_raidram, baseraidkit and search_warrant for the corresponding raid paths. Custom item names remain valid through their existing mappings.

The Online Heist Hub remains unavailable (Config.HeistCreator.hubPublishingEnabled = false), money laundering remains disabled by default, and NPC police support remains disabled by default. Creating jewel-case placements through the Creator remains disabled; existing configured placements and their test workflow are separate. This release does not add Crime File Explorer, publish a Pacific Standard heist, enable those inactive features or require a new external dispatch provider. Existing optional Ambulance overdose and Fire explosion integrations continue to need their matching configured resources.

  1. Restart and verify

Start database, framework and inventory/provider resources first, followed by Base 1.42.0, Jobs Base 1.45.0, Crime 0.5.0 and the configured optional job resources. Resolve SQL/startup errors before reopening play. Confirm /crimerep, one eligible reward, persistence after restart and the intended admission threshold. Check existing faction members are retained. Test civilian robbery actions, a shop police alert, safe overheating and transported ATM drilling. Open existing Drug and Heist Creator definitions, review reported migration conflicts, and confirm saved custom values remain. Test a supported quantity order with enough and insufficient materials, laboratory storage/placement, fertilizing and harvesting. Check an eligible externally supplied finished drug item and an invalid explicit batch separately. Reconnect two test players and confirm shared heist plans and relevant world changes remain synchronized. Use the optional profiler only for a deliberate recording; a successful build or startup is not proof of multiplayer gameplay or visual behavior.

Version 0.4.0

Update Base to 1.41.0 and Jobs Base to 1.44.0 before installing sky_crimesystem0.4.0. Narcan overdose treatment requires Ambulance 2.40.0 and Crime 0.4.0 together. Optional explosion fires require the matching Fire 1.12.0 installation.

Highlights

  • Added transported ATM drilling and cash collection, with separate removable panels and cash models.
  • Changed ATM explosives to use remote detonation from the planter's radial menu within the configured distance and time limits.
  • Added damaged ATM models for explosive robberies while keeping blown-open machines at their original location.
  • Added interactive shop-safe drilling with pressure, heat, a compact display and a visible drill in the game world.
  • Improved the Drug Creator with a drug-based production overview and focused editors for material sources, processing, cultivation and sales.
  • Added support for treating active overdoses with Narcan through the matching Ambulance update.

Notable Changes

  • Added a mechanical combination dial and a retractable code note for shop safes.
  • Added an optional GTA vault-drilling minigame for heist-door methods while keeping the existing progress mode as the default.
  • Added cash or black-money item payouts for supported shop, ATM and heist rewards, including Loot Buyer settlement.
  • Improved ATM towing with configurable housing weight and resistance applied to the towing vehicle.
  • Changed wall-mounted ATM models to reject towing while retaining explosive access.
  • Improved ATM drilling and looting so a stationary transported machine can be used while its tow rope remains attached.
  • Added support for the Roxwood ATM model when the corresponding map asset is installed.
  • Improved plant setup and watering with a dedicated watering interaction, better prop placement and clearer camera controls.
  • Improved harvest views for large plants and added collection modes with configurable reward and quality ranges for drug fields.
  • Fixed an issue where purchased laboratory sites could appear available again after a restart.
  • Fixed an issue where processing stations could keep their old location or availability after Creator changes.
  • Fixed an issue where saved processing props could be moved to a roof instead of retaining their chosen height.
  • Fixed an issue where grow lamps did not appear because their configured model names were unavailable.
  • Improved interrogation-chair and tool-cart placement with camera aiming and rejection of unsuitable surfaces.

Other Changes

  • Fixed an issue where drug system updates could stop and produce server errors after a player disconnected or changed characters.
  • Added configurable screen positions for drug activity, interaction and plant-status displays.
  • Fixed shop robberies remaining blocked after interrupted interactions or failed payouts.
  • Improved shop robbery checks so threat weapons are verified by the server and dead players cannot collect rewards.
  • Fixed shop hacking screens staying open after the player dies, moves away or the session ends.
  • Fixed ATM objects and interactions appearing in a different server instance.
  • Improved ATM drilling and looting checks to reject dead players and enforce the full cash-collection time.
  • Fixed expired ATM charges remaining active when no suitable player was available to display the explosion.
  • Improved drug-prop rotation with the mouse wheel and finer steps while holding Shift.
  • Changed new drug interaction defaults to markers, leaving floating text as an explicit choice and preserving saved selections.
  • Fixed an issue where processing progress could display a blank label.
  • Fixed an issue where drug tests could receive an effect description instead of the consumed substance name.
  • Fixed an issue where saved heist-door interaction positions could fail to load.
  • Fixed an issue where players could not return assigned gas masks after a heist plan had ended.
  • Fixed an issue where Crime tablet apps remained available during another job's service duty.
  • Fixed an issue where disabled money-laundering previews could interrupt shared configurator navigation.
  • Improved heist startup so it can resume when the server is ready.
  • Optimized raid maintenance to reduce unnecessary server work when checking active and expired raids.
  • Improved ATM cleanup so ropes and custom objects are removed when the resource stops.
  • Improved frontend packaging so replacing the complete interface removes obsolete files from older builds.
  • Updated Creator guidance and gameplay translations across the supported languages.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs.lua
  • sky_crimesystem/config/drugs_labs_power_workers.lua
  • sky_crimesystem/config/heists/fleeca_legion_square_v1.json
  • sky_crimesystem/config/interrogation_core.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
  • sky_crimesystem/stream/sky_atm_01_exploded.ydr
  • sky_crimesystem/stream/sky_atm_01_exploded_cash.ydr
  • sky_crimesystem/stream/sky_atm_02.ydr
  • sky_crimesystem/stream/sky_atm_02_cash.ydr
  • sky_crimesystem/stream/sky_atm_02_exploded.ydr
  • sky_crimesystem/stream/sky_atm_02_exploded_cash.ydr
  • sky_crimesystem/stream/sky_atm_02_panel.ydr
  • sky_crimesystem/stream/sky_atm_03.ydr
  • sky_crimesystem/stream/sky_atm_03_cash.ydr
  • sky_crimesystem/stream/sky_atm_03_exploded.ydr
  • sky_crimesystem/stream/sky_atm_03_exploded_cash.ydr
  • sky_crimesystem/stream/sky_atm_03_panel.ydr
  • sky_crimesystem/stream/sky_atm_exploded.ytyp
  • sky_crimesystem/stream/sky_atm_props.ytyp
  • sky_crimesystem/stream/sky_fleeca_atm.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_cash.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_exploded.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_exploded_cash.ydr
  • sky_crimesystem/stream/sky_fleeca_atm_panel.ydr
  • sky_crimesystem/stream/sky_grow_lamp_01a.ydr
  • sky_crimesystem/stream/sky_grow_lamp_01b.ydr
  • sky_crimesystem/stream/sky_weed_props.ytyp
Update InstructionsWhat to copy, what to keep and what to check0.3.00.4.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update

Update Base to 1.41.0 and Jobs Base to 1.44.0 before installing sky_crimesystem 0.4.0. Narcan overdose treatment requires Ambulance 2.40.0 and Crime 0.4.0 together. Optional explosion fires require the matching Fire 1.12.0 installation. These instructions cover 0.3.0 → 0.4.0; complete earlier migrations first when upgrading from an older version. Stop the server and back up the resource, database, customized files and saved configurator/creator data.

  1. Replace the package files

Install the matching 0.4.0 download. Update every path in Changed Files, delete and reinsert sky_crimesystem/source/*, and replace sky_crimesystem/config/locales/* completely. Remove the exact paths under Removed Files and apply any listed renames. Preserve unrelated files, writable data and custom assets; merge the configuration changes in this tab into your customized public files.

Replace source/* and fxmanifest.lua from the same download even when optional diagnostics remain off. Profiler instrumentation is confined to Lua in source/ and the generated manifest. Public configuration, integration and compatibility files match the uninstrumented source; their functional changes are listed separately for this release. If an older profiler package modified public files, restore those once from the clean new package and reapply your own edits.

  1. Merge configuration

Use /jobconfig → Crime for registered settings; keep saved overrides and your existing Drug Creator and Heist Creator records. The new ATM model, drilling, towing and remote-detonation fields listed here are file settings in this release, not registered ATM configurator fields. Edit them in sky_crimesystem/config/config.lua even when /jobconfig is enabled. Do not reset your Crime jobs or creators to install this update.

ATM configuration in config/config.lua: add "amb_prop_pine_atm" to Config.ATMRobbery.models only if you want automatic recognition of that installed Roxwood map model. The release supplies replacement ATM housings, not the Roxwood map itself. Add the complete new tables below; they were absent in 0.3.0. Keep your existing locations, rewards and other robbery settings.

Config.ATMRobbery.detachedModels = {
        prop_atm_01 = "sky_atm_02", -- No separate custom ATM 01; use the ATM 02 housing after detachment.
        prop_atm_02 = "sky_atm_02",
        prop_atm_03 = "sky_atm_03",
        prop_fleeca_atm = "sky_fleeca_atm",
        amb_prop_pine_atm = "sky_fleeca_atm" -- Roxwood Support
    }
Config.ATMRobbery.explodedModels = {
        prop_atm_01 = "sky_atm_01_exploded",
        prop_atm_02 = "sky_atm_02_exploded",
        prop_atm_03 = "sky_atm_03_exploded",
        prop_fleeca_atm = "sky_fleeca_atm_exploded",
        amb_prop_pine_atm = "sky_fleeca_atm_exploded",
    }
Config.ATMRobbery.detachedParts = {
        sky_atm_01_exploded = {
            cash = { model = "sky_atm_01_exploded_cash", offset = { x = 0.0, y = 0.0, z = 0.0 } },
        },
        sky_atm_02_exploded = {
            cash = { model = "sky_atm_02_exploded_cash", offset = { x = 0.0, y = 0.0, z = 0.0 } },
        },
        sky_atm_03_exploded = {
            cash = { model = "sky_atm_03_exploded_cash", offset = { x = 0.0, y = 0.0, z = 0.0 } },
        },
        sky_fleeca_atm_exploded = {
            cash = { model = "sky_fleeca_atm_exploded_cash", offset = { x = 0.0, y = 0.0, z = 0.0 } },
        },
        sky_atm_02 = {
            panel = { model = "sky_atm_02_panel", offset = { x = 0.0, y = 0.39726953, z = 1.21728516 } },
            cash = { model = "sky_atm_02_cash", offset = { x = 0.0, y = 0.30326953, z = 1.21728516 } },
        },
        sky_atm_03 = {
            panel = { model = "sky_atm_03_panel", offset = { x = 0.0, y = 0.39926982, z = 1.29150391 } },
            cash = { model = "sky_atm_03_cash", offset = { x = 0.0, y = 0.30526982, z = 1.29150391 } },
        },
        sky_fleeca_atm = {
            panel = { model = "sky_fleeca_atm_panel", offset = { x = -0.00415039, y = 0.41463536, z = 1.29052734 } },
            cash = { model = "sky_fleeca_atm_cash", offset = { x = -0.00415039, y = 0.32063536, z = 1.29052734 } },
        },
    }
Config.ATMRobbery.drilling = {
        duration = 20000, -- Minimum drilling time; the minigame also requires controlling heat/feed.
        timeLimit = 120000,
        maximumSpeed = 0.25, -- m/s; let the ATM settle before drilling/collecting, even with the rope attached.
    }
Config.ATMRobbery.remoteDetonation = {
        minimumDistance = 5.0,
        maximumDistance = 100.0,
        timeoutSeconds = 300,
    }

Add these new scalar/item fields after their existing parent tables:

Config.ATMRobbery.emptyCleanupSeconds = 120
Config.ATMRobbery.pulling.detachedMass = 850.0
Config.ATMRobbery.pulling.towMaximumAcceleration = 12.0
Config.ATMRobbery.items.drill = { key = "vault_drill", amount = 1, consume = false }

Remove Config.ATMRobbery.durations.fuse (previously 8000) and the complete obsolete Config.ATMRobbery.wallCompartment table. Remove the retired atmFuseSeconds entry from any hand-maintained import bundle; it is no longer used. The charge now waits for its owner to trigger it through the radial menu, from 5–100 m by default, and expires after 300 seconds. The old automatic eight-second fuse is not retained. Exploded ATMs stay at their original location; transported ATMs use their new housing. Drilling/collection requires a speed of at most 0.25 m/s, including when the rope is attached. The wall model prop_atm_01 cannot be towed.

Shop configuration in config/config.lua: Config.ShopRobbery.drillDurationMs stays 30000, now the minimum drilling time at ideal pressure; cooling can make an attempt longer. Add the new camera table and drillSafe = false:

Config.ShopRobbery.drillCamera = {
        fov = 58.00000,
        camera = { x = 0.12506, y = 0.06387, z = 0.16140 },
        target = { x = -0.08808, y = -0.89733, z = -0.01374 },
    }
Config.ShopRobbery.drillSafe = false

These are file-based scene calibration values. Keep drillSafe = false for automatic surface selection unless calibrating a custom safe. The new Config.CommandPermissions.drillview = { "god", "superadmin", "admin" } grants the calibration command to those ACE groups; add it to the existing permissions table if using the tool. Camera/safe profiles are specific to the actual drill and scene geometry; do not substitute unrelated model offsets.

Shop threat weapons: review Config.ShopRobbery.allowedWeapons. Its unchanged empty default {} now uses a shared list of known GTA weapons, checked on both the client and server. Add-on weapons require their explicit WEAPON_... names. A non-empty list replaces that default list, so include every standard and add-on weapon you intend to permit. Keep this value in config/config.lua; it is not a new /jobconfig field.

Payout migration: before admitting players, review these saved settings in /jobconfig → Crime:

SettingPreviously acceptedCurrent supported choices
atmRewardAccountArbitrary framework account namemoney for cash or black_money for the inventory item.
shopRegisterRewardSort / shopSafeRewardSortFree-text reward typecash or item; the configurator's item choice always uses black_money.
shopRegisterRewardName / shopSafeRewardNameCustom item nameRemoved from the configurator; a saved item payout now resolves to black_money.

Replace old ATM bank or custom-account overrides with an intentional supported choice. They no longer pay the old account and can fall back to cash. File-based servers must review Config.ATMRobbery.reward.account too: only black_money selects an inventory item; other values now follow the cash payout. For existing shop item rewards, explicitly review both register and safe payouts before saving: the new configurator no longer offers arbitrary reward-item names. Remove the retired name keys from hand-maintained import bundles. Keep your intended minimum/maximum amounts.

The shop file paths are Config.ShopRobbery.rewards.register.sort and Config.ShopRobbery.rewards.safe.sort; use "cash" for cash, or "item" with name = "black_money" for the matching black-money setup. The ATM cash value is "money", while the shop cash value is "cash". Shipped cash defaults remain unchanged. In the Heist Creator overview, choose the reward currency for each heist (settings.lootRewardType: cash or black_money). This is a heist-wide setting, including Loot Buyer settlement, and defaults to cash when absent; existing heists are not automatically converted to black money. Black money uses an inventory item, so ensure that item exists instead of assuming a framework account with the same name is sufficient.

Heist Creator: the existing vault_drill entry inside Config.HeistCreator.openingMethodTemplates gains drillVariant = "progress". This field was previously absent and retains the progress action. For a selected drilling method, set its drilling variant to vault_drill in the Heist Creator to use the GTA minigame. Preserve your own saved plans. The bundled config/heists/fleeca_legion_square_v1.json is reformatted only; it does not require reimporting an existing heist.

Drug display positions: add the complete new block to sky_crimesystem/config/drugs.lua:

Config.Drugs.UI = {
    activityHudPosition = {
        right = "3.5vh",
        bottom = "6.5vh",
    },
    interactionHudPosition = {
        right = "3.5vh",
        bottom = "8vh",
    },
    plantStatusHudPosition = {
        right = "3.5vh",
        top = "5vh",
    },
}

The matching /jobconfig settings are drugActivityHudPositionLeft/Right/Top/Bottom, drugInteractionHudPositionLeft/Right/Top/Bottom and drugPlantStatusHudPositionLeft/Right/Top/Bottom. Each name is a separate setting, for example drugActivityHudPositionRight. Unset edges remain empty; keep CSS units such as vh, px or % when entering a position. Existing saved positions remain authoritative.

Grow lamps: in sky_crimesystem/config/drugs_labs_power_workers.lua, change Config.Drugs.Power.equipment.grow_lamp.propModel from "bkr_prop_weed_lamp_01a" to "sky_grow_lamp_01a" and Config.Drugs.Power.equipment.industrial_lamp.propModel from "bkr_prop_weed_lamp_01b" to "sky_grow_lamp_01b". Leave their power, radius and other values intact. The matching streamed models and updated weed dictionary are included. Previously saved old lamp names are recognized by compatibility handling; do not delete laboratories or reset equipment.

Interrogation placement: in sky_crimesystem/config/interrogation_core.lua, remove forward, back, left, right, up, down and snap from Config.Interrogation.objects.controls. Their old values were 172, 173, 174, 175, 241, 242 and 47. Placement now follows the camera. Keep confirm = 38, cancel = 194, rotateLeft = 44, rotateRight = 45 and fineModifier = 21. These input bindings remain file-based.

The Drug Creator owns field collection modes, reward/quality ranges, plant setup and processing locations. Review these in the relevant saved definition; existing explicitly chosen interaction text remains enabled, while new defaults use markers. Keep custom production chains and saved stock. Online Heist Hub and Money Wash remain disabled, jewelry display cases remain unavailable in the Creator, and NPC police support stays disabled by default. This release does not unlock them.

Optional performance diagnostics

Extra profiler information remains disabled by default. For a support recording, add setr sky_profiler 1 to server.cfg before the Sky ensure lines and restart the server. In the server console, run profiler record 1000, wait for profiler status to report completion, then run profiler saveJSON sky-release-profile.json. Share that file when requested by support. Set setr sky_profiler 0 and restart again to disable the extra information. This is not a /jobconfig setting; enabling it does not start a recording or upload data automatically.

  1. Apply data and inventory updates

The database change adds idx_drug_raid_assault on sky_crime_drug_raid_sessions(status, mode). With Config.AutoExecuteQuery enabled, startup adds it. If automatic migrations are disabled, run this checked upgrade against the existing backed-up database:

SET @sky_update_sql = IF(
    EXISTS(SELECT 1 FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sky_crime_drug_raid_sessions' AND INDEX_NAME = 'idx_drug_raid_assault'),
    'SELECT 1', 'CREATE INDEX `idx_drug_raid_assault` ON `sky_crime_drug_raid_sessions` (`status`, `mode`)'
);
PREPARE sky_update_statement FROM @sky_update_sql;
EXECUTE sky_update_statement;
DEALLOCATE PREPARE sky_update_statement;

No table reset, collation conversion or new heist migration is needed for this version. Install all listed ATM and grow-lamp stream files together with the new manifest. Keep the existing vault_drill item available for ATM and shop drilling; the default requires one and does not consume it. If selecting black-money payouts, provide the black_money inventory item. Narcan is supplied and configured by Ambulance 2.40.0; Crime alone does not add a medical inventory action. Preserve saved laboratories, stock, production definitions, heists and drug-test evidence.

  1. Restart and verify

Restart the database, framework and any edited inventory first, then Base, Jobs Base and the installed job resources. Confirm 0.4.0 and resolve startup errors before admitting players. Test a supported towable ATM through towing, stopping, drilling and collecting cash; repeat with the rope attached and confirm wall ATM towing is refused. Plant an explosive, test the minimum and maximum remote distance, detonate it and collect its loot. Test shop drilling, code-note and safe-dial controls, each configured payout type, field harvesting, watering and saved processing positions. Reconnect to an owned laboratory and verify ownership. With Ambulance installed, test overdose treatment and ensure later consumption still works. Confirm completed heist plans allow masks to be returned and your custom drug definitions remain intact. Switch server instances while an ATM has a charge, rope or detached housing and confirm its objects and interactions stay in the correct instance. Test death during drilling and looting, full collection time, interrupted shop payouts, configured add-on threat weapons and leaving a shop hacking session. Open a drug-management view with two players, then disconnect or switch characters with one player. Perform a drug-system action with the remaining player and confirm that relevant updates still arrive without the missing-value tostring server error. Reconnect and reopen the view to verify updates for that character.

Version 0.3.0

Update Base to 1.40.0 and Jobs Base to 1.43.0 before installing sky_crimesystem0.3.0. Optional explosion fires use Fire 1.11.0.

Highlights

  • Added active laboratory security guards and defense effects during assaults, including alarms and capture blocking while guards remain alive.
  • Added withdrawals from distribution hubs, with clearer batch, strain and stock information for managing stored products.
  • Added a choice between player funds and an authorized organization account for distribution-network expenses.
  • Added separate laboratory treasury accounts so deposits and withdrawals can use a different account from the purchase price.
  • Added standard Jobs Base police dispatches for successful ATM breaches and a setting to disable those alerts.

Notable Changes

  • Improved ATM sling robberies with attachment animations, more reliable rope presentation and the ability to detach a breached ATM without losing its loot.
  • Fixed an issue where robbing one ATM could hide a neighboring machine or leave the original wall machine visible after streaming back in.
  • Added a clerk handover animation and a configurable looting action after entering a shop safe's correct code.
  • Fixed an issue where laboratory shelves or equipment could fail to load or overlap with objects from another laboratory instance.
  • Fixed an issue where processing actions could fail when their animation setup was empty or incomplete.
  • Fixed an issue where reconnecting or restarting inside a camper laboratory could leave the player without a usable exit.
  • Changed laboratory knocking to keep the visitor's identity anonymous.
  • Improved the Drug Creator with unified item identities, simpler consumption-effect presets, plant variants and popups that stay inside the editor.
  • Improved Heist Creator validation so selecting an issue opens and highlights the affected field.
  • Added position and object-selection tools for shop clerks, safes and cash registers.
  • Fixed an issue where insufficient-funds messages in the drug market did not show the configured required amount.
  • Fixed an issue where heat information did not use the laboratory's actual location name.
  • Changed optional explosion fires to require at least one online firefighter by default.
  • Fixed an issue where interrogation chairs and carts could be placed at the wrong height on sloping ground.
  • Fixed an issue where deleting a crime organization could fail during creator cleanup.

Other Changes

  • Added missing raid and interrogation item definitions, inventory examples and matching images for supported inventories.
  • Improved dealer information and distribution views with clearer stock, route and contract details.
  • Improved model selection and recruitment previews with Sky-hosted images.
  • Improved translations across the supported languages and corrected inconsistent Drug Creator terminology.
  • Fixed an issue where disabled money-laundering features could still register their interface or background behavior.
  • Optimized repeated creator lookups, laboratory power updates, assault polling and nearby-ped searches.
  • Updated bundled images and removed superseded image files.

Changed Files

  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs.lua
  • sky_crimesystem/config/drugs_business_network.lua
  • sky_crimesystem/config/drugs_laboratories.lua
  • sky_crimesystem/config/drugs_market_threat_processing.lua
  • sky_crimesystem/config/drugs_supply_chain.lua
  • sky_crimesystem/config/functions.lua
  • sky_crimesystem/config/inventory/README.md
  • sky_crimesystem/config/inventory/items_ox.lua
  • sky_crimesystem/config/inventory/items_qb.lua
  • sky_crimesystem/config/inventoryimages/png/0_blue_dream_seed.png
  • sky_crimesystem/config/inventoryimages/png/0_og_kush_seed.png
  • sky_crimesystem/config/inventoryimages/png/0_white_widow_seed.png
  • sky_crimesystem/config/inventoryimages/png/advanced_lockpick.png
  • sky_crimesystem/config/inventoryimages/png/baseraidkit.png
  • sky_crimesystem/config/inventoryimages/png/black_money.png
  • sky_crimesystem/config/inventoryimages/png/blank_tab_sheet.png
  • sky_crimesystem/config/inventoryimages/png/blindfold.png
  • sky_crimesystem/config/inventoryimages/png/blowtorch.png
  • sky_crimesystem/config/inventoryimages/png/blue_dream.png
  • sky_crimesystem/config/inventoryimages/png/blue_dream_seed.png
  • sky_crimesystem/config/inventoryimages/png/blue_spore.png
  • sky_crimesystem/config/inventoryimages/png/blue_spore_seed.png
  • sky_crimesystem/config/inventoryimages/png/bolt_cutters.png
  • sky_crimesystem/config/inventoryimages/png/brick_mold.png
  • sky_crimesystem/config/inventoryimages/png/brick_press.png
  • sky_crimesystem/config/inventoryimages/png/burner_phone.png
  • sky_crimesystem/config/inventoryimages/png/cable_tie.png
  • sky_crimesystem/config/inventoryimages/png/car_battery.png
  • sky_crimesystem/config/inventoryimages/png/carbon_filter.png
  • sky_crimesystem/config/inventoryimages/png/chemical_precursor.png
  • sky_crimesystem/config/inventoryimages/png/chemical_reactor.png
  • sky_crimesystem/config/inventoryimages/png/chemistry_table.png
  • sky_crimesystem/config/inventoryimages/png/coca_leaf.png
  • sky_crimesystem/config/inventoryimages/png/coco_mix.png
  • sky_crimesystem/config/inventoryimages/png/coke.png
  • sky_crimesystem/config/inventoryimages/png/coke_baggy.png
  • sky_crimesystem/config/inventoryimages/png/coke_brick.png
  • sky_crimesystem/config/inventoryimages/png/coke_powder.png
  • sky_crimesystem/config/inventoryimages/png/coke_seed.png
  • sky_crimesystem/config/inventoryimages/png/crowbar.png
  • sky_crimesystem/config/inventoryimages/png/curing_shelf.png
  • sky_crimesystem/config/inventoryimages/png/dealer_guide_book.png
  • sky_crimesystem/config/inventoryimages/png/desert_ephedra.png
  • sky_crimesystem/config/inventoryimages/png/desert_ephedra_seed.png
  • sky_crimesystem/config/inventoryimages/png/desert_root.png
  • sky_crimesystem/config/inventoryimages/png/digital_scale.png
  • sky_crimesystem/config/inventoryimages/png/dried_mushroom.png
  • sky_crimesystem/config/inventoryimages/png/drill.png
  • sky_crimesystem/config/inventoryimages/png/drug_generator_t1.png
  • sky_crimesystem/config/inventoryimages/png/drug_generator_t2.png
  • sky_crimesystem/config/inventoryimages/png/drug_generator_t3.png
  • sky_crimesystem/config/inventoryimages/png/drug_generator_t4.png
  • sky_crimesystem/config/inventoryimages/png/drug_generator_t5.png
  • sky_crimesystem/config/inventoryimages/png/drug_oven.png
  • sky_crimesystem/config/inventoryimages/png/drug_packaging.png
  • sky_crimesystem/config/inventoryimages/png/drug_press.png
  • sky_crimesystem/config/inventoryimages/png/drying_rack.png
  • sky_crimesystem/config/inventoryimages/png/dryland_root.png
  • sky_crimesystem/config/inventoryimages/png/dryland_root_seed.png
  • sky_crimesystem/config/inventoryimages/png/empty_baggy.png
  • sky_crimesystem/config/inventoryimages/png/empty_bottle.png
  • sky_crimesystem/config/inventoryimages/png/empty_capsule.png
  • sky_crimesystem/config/inventoryimages/png/empty_cup.png
  • sky_crimesystem/config/inventoryimages/png/empty_jar.png
  • sky_crimesystem/config/inventoryimages/png/ephedra_leaf.png
  • sky_crimesystem/config/inventoryimages/png/explosive_charge.png
  • sky_crimesystem/config/inventoryimages/png/fabric_pot.png
  • sky_crimesystem/config/inventoryimages/png/foil_pack.png
  • sky_crimesystem/config/inventoryimages/png/fuel_can.png
  • sky_crimesystem/config/inventoryimages/png/garden_scissors.png
  • sky_crimesystem/config/inventoryimages/png/gas_mask.png
  • sky_crimesystem/config/inventoryimages/png/gelato.png
  • sky_crimesystem/config/inventoryimages/png/gelato_seed.png
  • sky_crimesystem/config/inventoryimages/png/general_keycard.png
  • sky_crimesystem/config/inventoryimages/png/gloves.png
  • sky_crimesystem/config/inventoryimages/png/grow_lamp.png
  • sky_crimesystem/config/inventoryimages/png/grow_tent.png
  • sky_crimesystem/config/inventoryimages/png/hacking_device.png
  • sky_crimesystem/config/inventoryimages/png/hacktool.png
  • sky_crimesystem/config/inventoryimages/png/heist_planning_table.png
  • sky_crimesystem/config/inventoryimages/png/herbal_extract.png
  • sky_crimesystem/config/inventoryimages/png/herbal_pill.png
  • sky_crimesystem/config/inventoryimages/png/herbal_stimulant.png
  • sky_crimesystem/config/inventoryimages/png/herbal_stimulant_seed.png
  • sky_crimesystem/config/inventoryimages/png/hydro_bucket.png
  • sky_crimesystem/config/inventoryimages/png/industrial_fan.png
  • sky_crimesystem/config/inventoryimages/png/industrial_lamp.png
  • sky_crimesystem/config/inventoryimages/png/interrogation_cart.png
  • sky_crimesystem/config/inventoryimages/png/interrogation_chair.png
  • sky_crimesystem/config/inventoryimages/png/joint.png
  • sky_crimesystem/config/inventoryimages/png/keycard_cloner.png
  • sky_crimesystem/config/inventoryimages/png/lab_filter.png
  • sky_crimesystem/config/inventoryimages/png/lab_gloves.png
  • sky_crimesystem/config/inventoryimages/png/lab_shelf_large.png
  • sky_crimesystem/config/inventoryimages/png/lab_shelf_medium.png
  • sky_crimesystem/config/inventoryimages/png/lab_shelf_small.png
  • sky_crimesystem/config/inventoryimages/png/lab_supply_kit.png
  • sky_crimesystem/config/inventoryimages/png/label_printer.png
  • sky_crimesystem/config/inventoryimages/png/lean.png
  • sky_crimesystem/config/inventoryimages/png/lean_bottle.png
  • sky_crimesystem/config/inventoryimages/png/lean_cup.png
  • sky_crimesystem/config/inventoryimages/png/lean_mix.png
  • sky_crimesystem/config/inventoryimages/png/lean_seed.png
  • sky_crimesystem/config/inventoryimages/png/living_soil.png
  • sky_crimesystem/config/inventoryimages/png/lockpick.png
  • sky_crimesystem/config/inventoryimages/png/lsd.png
  • sky_crimesystem/config/inventoryimages/png/lsd_seed.png
  • sky_crimesystem/config/inventoryimages/png/lsd_tab_unpacked.png
  • sky_crimesystem/config/inventoryimages/png/lsd_tabs.png
  • sky_crimesystem/config/inventoryimages/png/machine_oil.png
  • sky_crimesystem/config/inventoryimages/png/meth.png
  • sky_crimesystem/config/inventoryimages/png/meth_baggy.png
  • sky_crimesystem/config/inventoryimages/png/meth_crystal.png
  • sky_crimesystem/config/inventoryimages/png/meth_seed.png
  • sky_crimesystem/config/inventoryimages/png/mixing_table.png
  • sky_crimesystem/config/inventoryimages/png/mountain_coca.png
  • sky_crimesystem/config/inventoryimages/png/mountain_coca_seed.png
  • sky_crimesystem/config/inventoryimages/png/mushroom_baggy.png
  • sky_crimesystem/config/inventoryimages/png/mushrooms.png
  • sky_crimesystem/config/inventoryimages/png/og_kush.png
  • sky_crimesystem/config/inventoryimages/png/og_kush_seed.png
  • sky_crimesystem/config/inventoryimages/png/packaging_table.png
  • sky_crimesystem/config/inventoryimages/png/paint_remover.png
  • sky_crimesystem/config/inventoryimages/png/plant_medicine.png
  • sky_crimesystem/config/inventoryimages/png/plant_nutrients.png
  • sky_crimesystem/config/inventoryimages/png/plant_pot.png
  • sky_crimesystem/config/inventoryimages/png/plastic_wrap.png
  • sky_crimesystem/config/inventoryimages/png/police_raidram.png
  • sky_crimesystem/config/inventoryimages/png/potting_soil.png
  • sky_crimesystem/config/inventoryimages/png/precision_scissors.png
  • sky_crimesystem/config/inventoryimages/png/purple_haze.png
  • sky_crimesystem/config/inventoryimages/png/purple_haze_seed.png
  • sky_crimesystem/config/inventoryimages/png/purple_poppy.png
  • sky_crimesystem/config/inventoryimages/png/purple_poppy_seed.png
  • sky_crimesystem/config/inventoryimages/png/raid_scanner.png
  • sky_crimesystem/config/inventoryimages/png/rare_weed_seed.png
  • sky_crimesystem/config/inventoryimages/png/raw_weed.png
  • sky_crimesystem/config/inventoryimages/png/recovery_sling.png
  • sky_crimesystem/config/inventoryimages/png/repair_kit.png
  • sky_crimesystem/config/inventoryimages/png/resin_rich_seed.png
  • sky_crimesystem/config/inventoryimages/png/resin_scraper.png
  • sky_crimesystem/config/inventoryimages/png/resin_tap.png
  • sky_crimesystem/config/inventoryimages/png/rolling_paper.png
  • sky_crimesystem/config/inventoryimages/png/sealed_bottle_pack.png
  • sky_crimesystem/config/inventoryimages/png/search_warrant.png
  • sky_crimesystem/config/inventoryimages/png/security_camera.png
  • sky_crimesystem/config/inventoryimages/png/signal_jammer.png
  • sky_crimesystem/config/inventoryimages/png/small_fan.png
  • sky_crimesystem/config/inventoryimages/png/small_grow_lamp.png
  • sky_crimesystem/config/inventoryimages/png/small_shovel.png
  • sky_crimesystem/config/inventoryimages/png/spore_sample.png
  • sky_crimesystem/config/inventoryimages/png/spray_can.png
  • sky_crimesystem/config/inventoryimages/png/stolen_burner_phone.png
  • sky_crimesystem/config/inventoryimages/png/stolen_lab_keycard.png
  • sky_crimesystem/config/inventoryimages/png/stolen_recipe_notes.png
  • sky_crimesystem/config/inventoryimages/png/syrup_base.png
  • sky_crimesystem/config/inventoryimages/png/tab_solution.png
  • sky_crimesystem/config/inventoryimages/png/testing_kit.png
  • sky_crimesystem/config/inventoryimages/png/thermite_charge.png
  • sky_crimesystem/config/inventoryimages/png/torture_pliers.png
  • sky_crimesystem/config/inventoryimages/png/trimming_shears.png
  • sky_crimesystem/config/inventoryimages/png/trimming_table.png
  • sky_crimesystem/config/inventoryimages/png/vacuum_bag.png
  • sky_crimesystem/config/inventoryimages/png/vault_drill.png
  • sky_crimesystem/config/inventoryimages/png/vault_keycard.png
  • sky_crimesystem/config/inventoryimages/png/water_bottle.png
  • sky_crimesystem/config/inventoryimages/png/water_canister.png
  • sky_crimesystem/config/inventoryimages/png/weed.png
  • sky_crimesystem/config/inventoryimages/png/weed_baggy.png
  • sky_crimesystem/config/inventoryimages/png/weed_cured.png
  • sky_crimesystem/config/inventoryimages/png/weed_dried.png
  • sky_crimesystem/config/inventoryimages/png/weed_premium_jar.png
  • sky_crimesystem/config/inventoryimages/png/weed_seed.png
  • sky_crimesystem/config/inventoryimages/png/white_widow.png
  • sky_crimesystem/config/inventoryimages/png/white_widow_seed.png
  • sky_crimesystem/config/inventoryimages/png/wild_mushroom.png
  • sky_crimesystem/config/inventoryimages/webp/0_blue_dream_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/0_og_kush_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/0_white_widow_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/advanced_lockpick.webp
  • sky_crimesystem/config/inventoryimages/webp/black_money.webp
  • sky_crimesystem/config/inventoryimages/webp/blank_tab_sheet.webp
  • sky_crimesystem/config/inventoryimages/webp/blindfold.webp
  • sky_crimesystem/config/inventoryimages/webp/blowtorch.webp
  • sky_crimesystem/config/inventoryimages/webp/blue_dream_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/blue_spore.webp
  • sky_crimesystem/config/inventoryimages/webp/blue_spore_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/bolt_cutters.webp
  • sky_crimesystem/config/inventoryimages/webp/brick_mold.webp
  • sky_crimesystem/config/inventoryimages/webp/brick_press.webp
  • sky_crimesystem/config/inventoryimages/webp/burner_phone.webp
  • sky_crimesystem/config/inventoryimages/webp/cable_tie.webp
  • sky_crimesystem/config/inventoryimages/webp/car_battery.webp
  • sky_crimesystem/config/inventoryimages/webp/carbon_filter.webp
  • sky_crimesystem/config/inventoryimages/webp/chemical_precursor.webp
  • sky_crimesystem/config/inventoryimages/webp/chemical_reactor.webp
  • sky_crimesystem/config/inventoryimages/webp/coca_leaf.webp
  • sky_crimesystem/config/inventoryimages/webp/coco_mix.webp
  • sky_crimesystem/config/inventoryimages/webp/coke.webp
  • sky_crimesystem/config/inventoryimages/webp/coke_brick.webp
  • sky_crimesystem/config/inventoryimages/webp/coke_powder.webp
  • sky_crimesystem/config/inventoryimages/webp/crowbar.webp
  • sky_crimesystem/config/inventoryimages/webp/curing_shelf.webp
  • sky_crimesystem/config/inventoryimages/webp/dealer_guide_book.webp
  • sky_crimesystem/config/inventoryimages/webp/desert_ephedra_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/desert_root.webp
  • sky_crimesystem/config/inventoryimages/webp/digital_scale.webp
  • sky_crimesystem/config/inventoryimages/webp/drug_generator_t1.webp
  • sky_crimesystem/config/inventoryimages/webp/drug_generator_t5.webp
  • sky_crimesystem/config/inventoryimages/webp/drug_oven.webp
  • sky_crimesystem/config/inventoryimages/webp/drug_packaging.webp
  • sky_crimesystem/config/inventoryimages/webp/drug_press.webp
  • sky_crimesystem/config/inventoryimages/webp/drying_rack.webp
  • sky_crimesystem/config/inventoryimages/webp/dryland_root_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/empty_bottle.webp
  • sky_crimesystem/config/inventoryimages/webp/empty_capsule.webp
  • sky_crimesystem/config/inventoryimages/webp/empty_cup.webp
  • sky_crimesystem/config/inventoryimages/webp/empty_jar.webp
  • sky_crimesystem/config/inventoryimages/webp/ephedra_leaf.webp
  • sky_crimesystem/config/inventoryimages/webp/fabric_pot.webp
  • sky_crimesystem/config/inventoryimages/webp/foil_pack.webp
  • sky_crimesystem/config/inventoryimages/webp/fuel_can.webp
  • sky_crimesystem/config/inventoryimages/webp/gas_mask.webp
  • sky_crimesystem/config/inventoryimages/webp/gelato_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/gloves.webp
  • sky_crimesystem/config/inventoryimages/webp/grow_lamp.webp
  • sky_crimesystem/config/inventoryimages/webp/grow_tent.webp
  • sky_crimesystem/config/inventoryimages/webp/hacking_device.webp
  • sky_crimesystem/config/inventoryimages/webp/hacktool.webp
  • sky_crimesystem/config/inventoryimages/webp/heist_planning_table.webp
  • sky_crimesystem/config/inventoryimages/webp/herbal_stimulant.webp
  • sky_crimesystem/config/inventoryimages/webp/herbal_stimulant_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/hydro_bucket.webp
  • sky_crimesystem/config/inventoryimages/webp/industrial_fan.webp
  • sky_crimesystem/config/inventoryimages/webp/industrial_lamp.webp
  • sky_crimesystem/config/inventoryimages/webp/interrogation_cart.webp
  • sky_crimesystem/config/inventoryimages/webp/interrogation_chair.webp
  • sky_crimesystem/config/inventoryimages/webp/joint.webp
  • sky_crimesystem/config/inventoryimages/webp/keycard_cloner.webp
  • sky_crimesystem/config/inventoryimages/webp/lab_filter.webp
  • sky_crimesystem/config/inventoryimages/webp/lab_gloves.webp
  • sky_crimesystem/config/inventoryimages/webp/lab_shelf_large.webp
  • sky_crimesystem/config/inventoryimages/webp/lab_shelf_small.webp
  • sky_crimesystem/config/inventoryimages/webp/lab_supply_kit.webp
  • sky_crimesystem/config/inventoryimages/webp/label_printer.webp
  • sky_crimesystem/config/inventoryimages/webp/lean.webp
  • sky_crimesystem/config/inventoryimages/webp/lean_bottle.webp
  • sky_crimesystem/config/inventoryimages/webp/lean_cup.webp
  • sky_crimesystem/config/inventoryimages/webp/lean_mix.webp
  • sky_crimesystem/config/inventoryimages/webp/lean_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/living_soil.webp
  • sky_crimesystem/config/inventoryimages/webp/lockpick.webp
  • sky_crimesystem/config/inventoryimages/webp/lsd_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/machine_oil.webp
  • sky_crimesystem/config/inventoryimages/webp/meth.webp
  • sky_crimesystem/config/inventoryimages/webp/meth_crystal.webp
  • sky_crimesystem/config/inventoryimages/webp/meth_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/mixing_table.webp
  • sky_crimesystem/config/inventoryimages/webp/mountain_coca.webp
  • sky_crimesystem/config/inventoryimages/webp/mountain_coca_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/mushrooms.webp
  • sky_crimesystem/config/inventoryimages/webp/og_kush_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/packaging_table.webp
  • sky_crimesystem/config/inventoryimages/webp/paint_remover.webp
  • sky_crimesystem/config/inventoryimages/webp/plant_nutrients.webp
  • sky_crimesystem/config/inventoryimages/webp/plant_pot.webp
  • sky_crimesystem/config/inventoryimages/webp/plastic_wrap.webp
  • sky_crimesystem/config/inventoryimages/webp/police_raidram.webp
  • sky_crimesystem/config/inventoryimages/webp/potting_soil.webp
  • sky_crimesystem/config/inventoryimages/webp/precision_scissors.webp
  • sky_crimesystem/config/inventoryimages/webp/purple_haze_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/purple_poppy_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/raw_weed.webp
  • sky_crimesystem/config/inventoryimages/webp/resin_scraper.webp
  • sky_crimesystem/config/inventoryimages/webp/resin_tap.webp
  • sky_crimesystem/config/inventoryimages/webp/rolling_paper.webp
  • sky_crimesystem/config/inventoryimages/webp/sealed_bottle_pack.webp
  • sky_crimesystem/config/inventoryimages/webp/search_warrant.webp
  • sky_crimesystem/config/inventoryimages/webp/security_camera.webp
  • sky_crimesystem/config/inventoryimages/webp/signal_jammer.webp
  • sky_crimesystem/config/inventoryimages/webp/small_fan.webp
  • sky_crimesystem/config/inventoryimages/webp/small_shovel.webp
  • sky_crimesystem/config/inventoryimages/webp/spore_sample.webp
  • sky_crimesystem/config/inventoryimages/webp/spray_can.webp
  • sky_crimesystem/config/inventoryimages/webp/stolen_burner_phone.webp
  • sky_crimesystem/config/inventoryimages/webp/stolen_lab_keycard.webp
  • sky_crimesystem/config/inventoryimages/webp/stolen_recipe_notes.webp
  • sky_crimesystem/config/inventoryimages/webp/syrup_base.webp
  • sky_crimesystem/config/inventoryimages/webp/thermite_charge.webp
  • sky_crimesystem/config/inventoryimages/webp/torture_pliers.webp
  • sky_crimesystem/config/inventoryimages/webp/trimming_shears.webp
  • sky_crimesystem/config/inventoryimages/webp/trimming_table.webp
  • sky_crimesystem/config/inventoryimages/webp/vacuum_bag.webp
  • sky_crimesystem/config/inventoryimages/webp/vault_drill.webp
  • sky_crimesystem/config/inventoryimages/webp/water_canister.webp
  • sky_crimesystem/config/inventoryimages/webp/weed_premium_jar.webp
  • sky_crimesystem/config/inventoryimages/webp/weed_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/white_widow.webp
  • sky_crimesystem/config/inventoryimages/webp/white_widow_seed.webp
  • sky_crimesystem/config/inventoryimages/webp/wild_mushroom.webp
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/items_esx.sql
  • sky_crimesystem/source/* — delete and reinsert
Update InstructionsWhat to copy, what to keep and what to check0.2.00.3.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update

Update Base to 1.40.0 and Jobs Base to 1.43.0 before installing sky_crimesystem 0.3.0. Optional explosion fires use Fire 1.11.0. These instructions cover 0.2.0 → 0.3.0; complete earlier migrations first when upgrading from an older version. Stop the server and back up the resource, database, customized files and saved configurator/creator data.

  1. Replace the package files

Install the matching 0.3.0 package. Update every path in Changed Files, delete and reinsert sky_crimesystem/source/*, and replace sky_crimesystem/config/locales/* completely. Remove every exact path listed under Removed Files and apply any listed renames. Preserve unrelated files, writable data and your own custom assets; merge the configuration changes in this tab into customized public files.

Replace source/* and fxmanifest.lua from the same download even when optional diagnostics remain off. The profiler only instruments Lua inside source/ and adds its manifest entries; public configuration, integration and compatibility files must match the uninstrumented package. Apply the separate functional public-file changes listed for this release. If an older profiler package modified public files, restore those once from the clean new package and reapply your edits.

  1. Merge configuration

Merge the following changes into your customized files; each filename is inside sky_crimesystem/. Paste assignments after their corresponding existing parent table declarations. A row marked file-only has no visible /jobconfig control. Do not replace entire existing parent tables with a partial list.

FileExact pathPrevious stateNew defaultConfiguration route
config/config.luaConfig.InventoryItems.autoRegisterItemsAbsenttrueFile only
config/config.luaConfig.InventoryItems.preserveExistingAbsenttrueFile only
config/config.luaConfig.ExplosionFire.minimumFirefightersNo staffing requirement1File only; 0 removes the requirement
config/config.luaConfig.ExplosionFire.firefighterJobGroupAbsent"fire"File only
config/config.luaConfig.ExplosionFire.requireOnDutyAbsentfalseFile only
config/config.luaConfig.ATMRobbery.worldObjectHideRadiusUsed worldObjectRadius (1.5)0.1File only
config/config.luaConfig.ATMRobbery.dispatch.enabledNo disable switchtrueatmDispatchEnabled
config/config.luaConfig.ShopRobbery.safeLootDurationMsNo separate code-looting action5000shopSafeLootDurationSeconds = 5 seconds
config/drugs.luaConfig.Drugs.Runtime.modelLoadTimeoutMsAbsent10000File only
config/drugs.luaConfig.Drugs.Performance.streetPedActivationDistanceAbsent2.5drugAdvancedPerformanceStreetPedActivationDistance
config/drugs.luaConfig.Drugs.Performance.streetPedScanIntervalMs7501000drugAdvancedPerformanceStreetPedScanIntervalMs
config/drugs.luaConfig.Drugs.Performance.streetPedIdleScanIntervalMsAbsent5000drugAdvancedPerformanceStreetPedIdleScanIntervalMs
config/drugs_business_network.luaConfig.Drugs.BusinessNetwork.paymentSourcePlayer account only"player"drugAdvancedBusinessNetworkPaymentSource
config/drugs_business_network.luaConfig.Drugs.BusinessNetwork.societyPermissionAbsent"MANAGE_MONEY"Registered as drugAdvancedBusinessNetworkSocietyPermission but hidden; maintain in file
config/drugs_laboratories.luaConfig.Drugs.Laboratories.treasuryAccountUsed purchaseAccount (default black_money)"money"File default; lab/camper creator treasuryAccount overrides it
config/drugs_laboratories.luaConfig.Drugs.Laboratories.storageCatalog.shelf_small.propModel"prop_rub_shelves_01""prop_shelves_01"File default; preserve custom valid models
config/drugs_laboratories.luaConfig.Drugs.Laboratories.storageCatalog.shelf_medium.propModel"prop_rub_shelves_02""prop_shelves_02"File default; preserve custom valid models
config/drugs_supply_chain.luaConfig.Drugs.SupplyChain.version910File migration marker; do not lower it
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.guardsEnabledAbsenttrueFile only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.maximumGuardsAbsent2File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.weaponAbsent"WEAPON_PISTOL"File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.ammunitionAbsent180File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.baseAccuracyAbsent24File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.accuracyPerSkillAbsent3File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.baseArmourAbsent20File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.armourPerStarAbsent12File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.breachDurationPerDefensePointAbsent0.008File only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.guardCaptureBlockAbsenttrueFile only
config/drugs_market_threat_processing.luaConfig.Drugs.Raids.laboratoryAssault.security.alarmDispatchAbsenttrueFile only

Complete new tables and changed scalar assignments

config/config.lua
Config.InventoryItems = {
    autoRegisterItems = true,
    preserveExisting = true,
}
config/config.lua
Config.ExplosionFire.minimumFirefighters = 1
Config.ExplosionFire.firefighterJobGroup = "fire"
Config.ExplosionFire.requireOnDuty = false
Config.ATMRobbery.worldObjectHideRadius = 0.1
Config.ATMRobbery.dispatch.enabled = true
Config.ShopRobbery.safeLootDurationMs = 5000
config/drugs.lua
Config.Drugs.Runtime.modelLoadTimeoutMs = 10000
Config.Drugs.Performance.streetPedActivationDistance = 2.5
Config.Drugs.Performance.streetPedScanIntervalMs = 1000
Config.Drugs.Performance.streetPedIdleScanIntervalMs = 5000
config/drugs_business_network.lua
Config.Drugs.BusinessNetwork.paymentSource = "player"
Config.Drugs.BusinessNetwork.societyPermission = "MANAGE_MONEY"
config/drugs_laboratories.lua
Config.Drugs.Laboratories.treasuryAccount = "money"
Config.Drugs.Laboratories.storageCatalog.shelf_small.propModel = "prop_shelves_01"
Config.Drugs.Laboratories.storageCatalog.shelf_medium.propModel = "prop_shelves_02"
config/drugs_supply_chain.lua
Config.Drugs.SupplyChain.version = 10
config/drugs_market_threat_processing.lua
Config.Drugs.Raids.laboratoryAssault.security = {
            guardsEnabled = true,
            maximumGuards = 2,
            weapon = "WEAPON_PISTOL",
            ammunition = 180,
            baseAccuracy = 24,
            accuracyPerSkill = 3,
            baseArmour = 20,
            armourPerStar = 12,
            breachDurationPerDefensePoint = 0.008,
        guardCaptureBlock = true,
        alarmDispatch = true,
        }

Config.Drugs.BusinessNetwork.paymentAccount remains "money"; its changed comment documents player account choices, not a new default. Its managed key is drugAdvancedBusinessNetworkPaymentAccount. payoutAccount remains "black_money". Player-paid expenses keep their previous behavior. Society-paid expenses require the player's crime organization and the configured permission; do not remove that permission check to make payments work.

Treasury behavior changes: laboratory deposits and withdrawals no longer use the purchase account. The new default is cash ("money"), while the purchase default stays "black_money". In the Drug Creator, review each laboratory/camper's Treasury account (treasuryAccount), which can override the file default. Set it to the previously used purchase account if you intend to retain that behavior. Existing treasury balances are retained; the update does not convert their currency or reset them.

For /jobconfig > sky_crimesystem > Settings, use the ATM dispatch and shop timing sections for atmDispatchEnabled and shopSafeLootDurationSeconds. The safe field uses seconds: 5 means 5000 milliseconds. The Performance and Business Network sections under Drug System expose the listed drugAdvanced... keys. Existing saved overrides take precedence over changed defaults, including an explicitly saved 750 millisecond street-ped interval; choose and save the desired value. File-only changes require editing the file and restarting. Runtime location actions for clerks, safes and registers update the existing creator coordinates; they are not new persistent settings.

The new security block uses hired laboratory security staff, up to two guards by default; it does not hire staff for free. Review guard equipment, alarm and capture rules before starting an assault. Explosion-fire chances remain 20 percent for ATMs and 15 percent for heists, and the integration still needs a running Fire Job. The new default counts online fire-group members even off duty; set requireOnDuty = true to count only on-duty members.

Custom ATM dispatch integration

The shipped Config.Functions.SendAtmPoliceDispatch(payload) in config/functions.lua previously only emitted an observer event. It now creates a Jobs Base incident and returns success or an error. For the stock integration, replace the complete function with this version. If an external dispatch service already owns your alerts, retain one provider call and its truthful success result; avoid creating the same incident both in the observer and the default integration.

config/functions.lua
function Config.Functions.SendAtmPoliceDispatch(payload)
    if not IsDuplicityVersion() then
        return false
    end

    if type(payload) ~= "table" then
        error("Invalid ATM police dispatch payload", 2)
    end

    local result = exports["sky_jobs_base"]:CreateDispatchIncident({
        sourceId = payload.unique,
        jobs = payload.jobs,
        coords = payload.coords,
        title = payload.title,
        message = payload.message,
        priority = payload.priority,
        details = {
            type = payload.type,
            method = payload.method,
            locationId = payload.locationId,
            radius = payload.radius,
            duration = payload.duration,
        },
    })
    TriggerEvent("sky_crimesystem:atm:policeDispatch", payload)
    if not result.success then
        return false, result.errorMessage or result.error or "unknown_error"
    end
    return true
end

Preserve configured dispatch recipient jobs, response plans, radius, duration and priority. Money laundering, NPC police support and unfinished heist options keep their existing disabled defaults; updating does not enable them. No existing public path is removed. With the configurator disabled, the edited Lua defaults are authoritative; with it enabled, review saved values before using any reset/default-data action.

Optional performance diagnostics

Extra profiler information remains disabled by default. Normal use needs no diagnostic setting. For a support recording, add setr sky_profiler 1 to server.cfg before the Sky ensure lines and restart the server. In the server console, run profiler record 1000, wait for profiler status to report completion, then run profiler saveJSON sky-release-profile.json. Share that file only when requested by support. Set setr sky_profiler 0 and restart again to disable the extra information. This is not a /jobconfig option; enabling it does not start a recording or upload data automatically.

  1. Apply data and inventory updates

No new Crime database column/table is introduced by this release. Keep the existing database and saved creator definitions. Config.Drugs.SupplyChain.version advances from 9 to 10; the default-data upgrade corrects the known invalid shelf models without deleting laboratories. Preserve custom valid models. Previously misplaced interrogation chairs/carts must be repositioned and saved once; existing coordinates are not automatically rewritten.

Inventory definitions and images

The ESX item catalog grows from 155 to 166 entries. The eleven additions are baseraidkit, blindfold, blowtorch, cable_tie, car_battery, interrogation_cart, interrogation_chair, police_raidram, search_warrant, torture_pliers and water_canister. trimming_shears already existed. The new registration helper also covers it. Keep server-owned labels, weights and other custom item values.

  • For native ESX, the updated sky_crimesystem/items_esx.sql inserts missing default items without replacing existing definitions. Supported ESX runtime registration also uses the new Config.InventoryItems policy.
  • For QBCore, merge only missing definitions from sky_crimesystem/config/inventory/items_qb.lua into the existing QBShared.Items table in qb-core/shared/items.lua. Supported runtime registration can also add the fixed Crime items.
  • For Ox Inventory, including Qbox with Ox Inventory, merge only missing definitions from sky_crimesystem/config/inventory/items_ox.lua into the existing return table in ox_inventory/data/items.lua. There is no supported runtime definition path for these missing Ox items. Qbox also needs the supplied stackable black_money item for its inventory-based dirty money; ESX's money account is not replaced with an item.
  • Copy the matching PNG images from sky_crimesystem/config/inventoryimages/png/ to ox_inventory/web/images/ or qb-inventory/html/images/ for the inventory you actually use. WebP alternatives are in config/inventoryimages/webp/; use them only when the provider and item image filenames match. Preserve unrelated inventory items and images.

Follow sky_crimesystem/config/inventory/README.md for the supplied examples. Restart the edited inventory before Crime. Item registration does not add a shop or grant items to players. Use the matching Base 1.40.0 inventory adapters and complete the shared Jobs Base 1.43.0 migrations; do not rerun destructive reset/import tools to repair an icon or missing definition.

  1. Restart and verify

Confirm version 0.3.0. Check saved settings and use an existing lab to verify shelves, equipment isolation, treasury account and camper reconnect exit. Test a staffed lab assault and its alarm/capture conditions. Move a small batch into and out of a distribution hub and verify stock and inventory totals. Test both allowed and denied society expenses. Breach one of two adjacent ATMs, verify one incident, detach the sling, leave/re-enter streaming range and check loot and the untouched neighbor. Enter a shop safe code and complete/cancel the timed loot. Check the added items/icons, slope placement, creator issue navigation and optional fire staffing threshold.

Version 0.2.0

Update sky_base to 1.39.0 and sky_jobs_base to 1.42.0 before installing sky_crimesystem0.2.0.

Highlights

  • Added interrogation scenes with grabbing, carrying, vehicle transport, placeable chairs and tools, minigames, release, and rescue options.
  • Added organization base raids for criminal groups and police, with entry requirements, protection periods, and access to eligible storage and vehicles.
  • Added custom weed plants and pots, with distinct strain colors that become more visible as plants grow.

Notable Changes

  • Added an editor for drawing organization mainbase boundaries and previewing their height without replacing ordinary job locations.
  • Added administrator practice dummies for trying interrogation scenes and tools.
  • Added administrator tools for placing and testing heist explosives.
  • Added the trimming table to laboratory equipment so players can place it and process suitable products.
  • Improved heist planning with an estimated reward and clearer door placement controls.
  • Added an on-screen explosive countdown and more varied vault and camera hacking challenges.
  • Added selection of existing map monitors in the Heist Creator, including a supplied Pacific Standard monitor profile.
  • Improved the cash-cart preview so small rewards can be configured and the displayed cash does not change the actual payout.
  • Added a strain selector when placing a test plant through the Drug Creator.

Other Changes

  • Changed medical integration so Crime can start without Sky Ambulance Job installed.
  • Fixed an issue where the heist planning system could fail to load during startup.
  • Fixed an issue where purchased campers could be missing from the world or arrive without vehicle keys; unsuccessful spawns now return the purchase cost.
  • Fixed an issue where restarting the resource could leave base raids active and keep Drug Creator imports locked.
  • Fixed an issue where storage outside a mainbase could prevent a valid raid or boundary from being saved.
  • Fixed an issue where normal organization storage could also show an unrelated heist interaction.
  • Fixed an issue where heist equipment carrying inventory metadata could not be deposited into heist storage.
  • Improved heist pickup instructions so players know when equipment must be delivered to heist storage.
  • Changed the included Fleeca gas-mask pickup to an accessible location outside the Vespucci mask shop.
  • Fixed an issue where valid processing recipes could still leave a processing location unavailable.
  • Fixed an issue where the Drug Creator could block test-plant placement or accept a preview beyond the permitted placement range.
  • Fixed an issue where graffiti could be missing while its images were still loading.
  • Improved Crime interfaces at different screen sizes and corrected German translations across gameplay and creator screens.
  • Improved language loading so Crime screens use the selected resource translations from the first opening.
  • Optimized drug updates so unrelated players and unchanged interaction points do not need to reload the same information repeatedly.
  • Added a complete set of item images for the included Crime activities.
Money Wash and online Heist Hub publishing remain unavailable. Saved settings cannot enable Money Wash. You can still save and activate heists on your own server. Jewellery display cases remain unavailable in the Heist Creator. NPC police support remains disabled by its file-level master switch; saved configurator settings cannot bypass it. Police and medical alerts are separate features.
  • Added optional performance diagnostics to help support investigate lag and delays, with diagnostics disabled by default.

Changed Files

  • sky_crimesystem/config/base_raids.lua
  • sky_crimesystem/config/config.lua
  • sky_crimesystem/config/drugs_growing.lua
  • sky_crimesystem/config/drugs_labs_power_workers.lua
  • sky_crimesystem/config/heists/fleeca_legion_square_v1.json
  • sky_crimesystem/config/interrogation_core.lua
  • sky_crimesystem/config/interrogation_scenes.lua
  • sky_crimesystem/config/interrogation_settings.lua
  • sky_crimesystem/config/interrogation_tools.lua
  • sky_crimesystem/config/locales/*
  • sky_crimesystem/fxmanifest.lua
  • sky_crimesystem/import.sql
  • sky_crimesystem/source/* — delete and reinsert
  • sky_crimesystem/stream/sky_weed_blue_dream_large.ydr
  • sky_crimesystem/stream/sky_weed_blue_dream_medium.ydr
  • sky_crimesystem/stream/sky_weed_blue_dream_small.ydr
  • sky_crimesystem/stream/sky_weed_gelato_large.ydr
  • sky_crimesystem/stream/sky_weed_gelato_medium.ydr
  • sky_crimesystem/stream/sky_weed_gelato_small.ydr
  • sky_crimesystem/stream/sky_weed_og_kush_large.ydr
  • sky_crimesystem/stream/sky_weed_og_kush_medium.ydr
  • sky_crimesystem/stream/sky_weed_og_kush_small.ydr
  • sky_crimesystem/stream/sky_weed_plant_large.ydr
  • sky_crimesystem/stream/sky_weed_plant_medium.ydr
  • sky_crimesystem/stream/sky_weed_plant_small.ydr
  • sky_crimesystem/stream/sky_weed_plants.ytd
  • sky_crimesystem/stream/sky_weed_pot_empty.ydr
  • sky_crimesystem/stream/sky_weed_pot_soil.ydr
  • sky_crimesystem/stream/sky_weed_props.ytyp
  • sky_crimesystem/stream/sky_weed_purple_haze_large.ydr
  • sky_crimesystem/stream/sky_weed_purple_haze_medium.ydr
  • sky_crimesystem/stream/sky_weed_purple_haze_small.ydr
  • sky_crimesystem/stream/sky_weed_white_widow_large.ydr
  • sky_crimesystem/stream/sky_weed_white_widow_medium.ydr
  • sky_crimesystem/stream/sky_weed_white_widow_small.ydr

Removed Files

  • sky_crimesystem/config/inventoryimages/README.md
  • sky_crimesystem/config/inventoryimages/manifest.json
  • sky_crimesystem/stream/bzzz_growing_freepot_a.ydr
  • sky_crimesystem/stream/bzzz_growing_freepot_a.ytyp
  • sky_crimesystem/stream/bzzz_growing_freepot_c.ydr

Renamed Files

  • sky_crimesystem/stream/bzzz_growing_freepot_textures.ytd → sky_crimesystem/stream/sky_weed_pots.ytd
Update InstructionsWhat to copy, what to keep and what to check0.1.00.2.0

Simplified update

Update sky_crimesystem safely

Read the complete update instructions in one continuous guide.

  1. Prepare the update.

Update sky_base to 1.39.0 and sky_jobs_base to 1.42.0 before installing sky_crimesystem 0.2.0. These steps cover 0.1.0 → 0.2.0. Follow earlier update instructions first when upgrading from an older version. Stop the server and back up the resource, database, custom settings, and saved configurator data.

  1. Replace the package files.

Install the matching 0.2.0 package. Update every path listed in Changed Files, delete and reinsert sky_crimesystem/source/*, and replace sky_crimesystem/config/locales/* completely. Merge the configuration changes in this tab into your customized files. Preserve writable data and generated user content. Install all new interrogation and raid configuration files and the new item images and models. Delete the exact retired files under Removed Files after backing up any custom replacements. For a first installation, copy the complete resource package.

Required profiler files

For the profiler update, replace the complete sky_crimesystem/source/* tree and sky_crimesystem/fxmanifest.lua from the same download, even if diagnostics stay disabled. Delete the old source/ folder before copying the new one.

The profiler builder leaves configuration, integration and compatibility files unchanged. Apply any separate configuration or integration changes listed for this release as usual.

If you previously installed an older profiler package that also modified files outside source/, restore those affected files once from the unmodified versions in the new download and reapply your custom edits. Later profiler-only updates do not require this step.

  1. Merge and review configuration.

For an existing 0.1.0 installation, merge the following changes. For a first installation, use the complete supplied configuration and then set up your organization. Keep a backup of existing drug catalogs, heist definitions, laboratories, and job settings before importing anything.

In sky_crimesystem/config/config.lua, add these previously absent command entries and the explosion test command setting:

config/config.lua
Config.CommandPermissions.explosiontest = { "god", "superadmin", "admin" }
Config.CommandPermissions.interrogationdummy = { "god", "superadmin", "admin" }
Config.HeistPlanning.explosionTestCommand = "explosiontest"

Command permissions are file settings. Keep your intended administrator groups. Add the previously absent monitor entry inside the existing Config.HeistPlanning.computerScreenProfiles table without removing your other profiles:

config/config.lua
Config.HeistPlanning.computerScreenProfiles[79209609] = {
    topLeft = { x = -0.21972656, y = -0.02006421, z = 0.20175380 },
    topRight = { x = 0.21777344, y = -0.02006421, z = 0.20175380 },
    bottomLeft = { x = -0.21972656, y = -0.03471265, z = -0.09658604 },
}

Each organization gains a baseZone entry. The supplied Config.Jobs entry now contains the following previously absent block; add it inside the matching job table without replacing that job:

config/config.lua
baseZone = {
    configured = false,
    points = {},
    z = 0,
    height = 30,
    bucket = 0,
},

The unconfigured default does not create a usable raid zone. With /jobconfig, open Crime System → Job → Mainbase, place the real boundary points, set the height, and apply/save. The lowest boundary point sets the bottom and the height extends upward. Ordinary job locations remain in their own tab. Existing circular zones remain usable until you deliberately redraw them. Storage outside the boundary is excluded from a raid and does not prevent the zone from being saved. Without the configurator, maintain Config.Jobs[].baseZone in the file using your real coordinates and set configured = true only after configuring a valid zone.

Install sky_crimesystem/config/base_raids.lua, previously absent, with this complete default block:

config/base_raids.lua
-- Each crime job needs one baseZone in Config.Jobs (or Job Configurator > Mainbase).
-- Coordinates are deliberately not invented for existing installations.
-- baseZone = { configured = true, x = 0, y = 0, z = 30, radius = 60, height = 30, bucket = 0 }
-- Only storage, locker and heist_storage points inside the baseZone are accessible during a raid.
Config.BaseRaids = {
    enabled = true,
    command = "raid",
    minimumDefenders = 3,
    protectionHours = 24,
    failedCooldownMinutes = 15,
    breachTimeoutSeconds = 120,
    interactionDistance = 3.0,
    policeRequireDuty = true,
    policeItem = "police_raidram",
    crimeItem = "baseraidkit",
    warrantItem = "search_warrant", -- Always consumed on a valid police raid start.
    difficulty = "normal",
    requiredHits = 3,
    lootStorage = true,
    lootHeistStorage = true,
    lootPersonalLockers = true,
    lootLaboratories = true,
    policeVehicles = true,
    crimeVehicles = false,
    lootVehicleTrunks = true,
    lootVehicleGloveboxes = true,
}

With /jobconfig, these values are under Crime → Base Raids. Their setting keys are baseRaid_ followed by the exact field name, for example baseRaid_enabled, baseRaid_minimumDefenders, baseRaid_protectionHours, and baseRaid_lootVehicleTrunks. Existing saved overrides remain authoritative. Police raids require the configured warrant item, which is consumed on a valid start. Vehicle inventory transfers need a supported Ox, QBCore, or Origen adapter; check your installed Origen version before using its vehicle-storage integration.

Install all four new interrogation files in full: config/interrogation_core.lua, config/interrogation_scenes.lua, config/interrogation_tools.lua, and config/interrogation_settings.lua. They were absent in 0.1.0. The manifest loads them in that order. The settings file creates the supplied-default snapshot; keep it together with the matching core, scenes, and tools. The complete new editable blocks follow so an existing development installation can compare every field.

config/interrogation_core.lua
Config.Interrogation = {
    enabled = true,

    binding = {
        notification = "sky", -- "sky" | "chat" | "event"
        notificationEvent = nil, -- event name, only used when notification = "event"
        target = "auto", -- "auto" | "sky" | "none"; "none" forces the interaction-point fallback
        dispatchResource = "sky_jobs_base", -- checked at boot, missing means dispatch degrades to notifications
        itemImagePath = "nui://ox_inventory/web/images/",
        itemImageFormat = "png",
    },

    consent = {
        required = false,
        defaultValue = false,
        globalIntensity = 1.0,
    },

    objects = {
        static = {
        },
        placeable = {
            chair = {
                item = "interrogation_chair",
                model = "prop_torture_ch_01",
                consumeItem = true,
                returnItemOnRemove = true,
            },
            cart = {
                item = "interrogation_cart",
                model = "prop_toolchest_03",
                consumeItem = true,
                returnItemOnRemove = true,
            },
        },
        seatOffsets = {
            default = vector3(0.0, -0.05, 0.05),
            ["prop_chair_01a"] = vector3(0.0, -0.12, 0.55),
            ["prop_torture_ch_01"] = vector3(0.0, -0.05, 0.05),
        },
        maxPerPlayer = 2, -- 0..20, 0 means unlimited
        maxGlobal = 40, -- 0..200, 0 means unlimited
        maxPlacementDistance = 6.0, -- 1.0..20.0 metres, re-checked server-side
        interactDistance = 2.5, -- 0.5..5.0 metres
        cartChairRadius = 3.0, -- 0.0..10.0 metres around a chair, 0 allows the cart anywhere
        inactivityRemovalMs = 3600000, -- 0..86400000, 0 disables automatic removal
        persistAcrossRestart = false,
        groundSnapOffset = 0.02, -- 0.0..1.0 metres lifted off the traced ground
        controls = {
            confirm = 38,
            cancel = 194,
            forward = 172,
            back = 173,
            left = 174,
            right = 175,
            up = 241,
            down = 242,
            rotateLeft = 44,
            rotateRight = 45,
            snap = 47,
            fineModifier = 21,
        },
        useGizmoResource = false,
        gizmoResource = "object_gizmo",
    },

    blockedZones = {
    },

    grabbing = {
        enabled = true,
        requiredItem = "cable_tie",
        jobWhitelist = nil, -- nil = every job; e.g. { "cartel" }
        requiredVictimState = {
            unconscious = true,
            restrained = true,
            healthBelow = 140, -- 0 disables the health path
        },
        approachAngle = 60.0, -- 15.0..180.0 degrees behind the victim
        skillcheck = {
            type = "timing",
            params = { rounds = 2, sweepMs = 1200, windowMs = 240, minHits = 2 },
        },
        failureCooldownMs = 15000, -- 0..300000
        allowedVehicleModels = { "burrito3", "speedo", "rumpo", "pony" },
        vehicleAttach = {
            offset = vector3(0.0, -1.1, 0.4),
            rotation = vector3(0.0, 0.0, 0.0),
        },
        restrictVision = true,
        blindfoldItem = "blindfold",
        shoulderCarry = {
            enabled = true,
            anim = {
                dict = "missfinale_c2mcs_1",
                carry = "fin_c2_mcs_1_camman",
                victim = "fin_c2_mcs_1_camman",
            },
        },
        escape = {
            enabled = true,
            holdMs = 8000, -- 1000..60000
            notifyPerpetrator = true,
        },
    },

    npc = {
        enabled = true,
        command = "interrogationdummy",
        model = "a_m_m_skater_01",
        maxPerPlayer = 2, -- 1..10
        despawnMs = 1800000, -- 60000..86400000 since the last use
    },

    session = {
        maxDurationMs = 1800000, -- 60000..21600000
        maxDurationWarnMs = 120000, -- 10000..600000, warning before the limit
        idleReleaseMs = 300000, -- 30000..3600000, no interaction from anyone
        victimSelfReleaseMs = 600000, -- 60000..7200000, no perpetrator interaction
        perpetratorGraceMs = 60000, -- 5000..600000 after the perpetrator disconnects
        bindTimeoutMs = 5000, -- 1000..20000 waiting for both scene acknowledgements
        releaseDurationMs = 2500, -- 0..30000
        rescue = {
            enabled = true,
            durationMs = 12000, -- 1000..120000
            requiredItem = nil, -- e.g. "wire_cutter"
            maxDistance = 2.0, -- 0.5..5.0
        },
        anims = {
            victim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
            perpetrator = { dict = "anim@gangops@hostage@", clip = "perp_idle", flags = 49 },
        },
        allowInventory = false,
        emoteWhitelist = { "surrender", "nod", "shakehead" },
        protectFromFallDamage = true,
        progressThresholds = { 25, 50, 75, 100 },
    },

    tools = {}, -- filled by config/interrogation_tools.lua

    dispatch = {
        enabled = true,
        adapter = "sky_jobs_base", -- "sky_jobs_base" | "generic" | "custom" | "none"
        customEvent = nil, -- event name, only used when adapter = "custom"
        jobs = { "police" },
        events = {
            grab = { chance = 0.35 }, -- 0.0..1.0
            fixate = { chance = 0.25 },
            tool_use = { chance = 0.15 },
        },
        requireWitness = true,
        witnessRadius = 45.0, -- 5.0..300.0 metres
        cooldownMsPerSession = 180000, -- 0..3600000
        positionInaccuracy = 60.0, -- 0.0..500.0 metres of random offset
    },

    logging = {
        enabled = true,
        groups = {
            object = "discord",
            grab = "discord",
            session = "discord",
            tool = "log",
            release = "discord",
            rescue = "discord",
            admin = "discord",
            security = "discord",
        },
        discordChannel = "interrogation",
        database = {
            enabled = false,
            retentionDays = 30, -- 0 keeps entries forever
            flushIntervalMs = 5000,
            flushBatchSize = 25,
            queueLimit = 500,
        },
    },

    security = {
        rateLimits = {
            fixate = { tokens = 4, windowMs = 10000 },
            tool = { tokens = 12, windowMs = 10000 },
            grab = { tokens = 6, windowMs = 10000 },
            place = { tokens = 6, windowMs = 60000 },
            release = { tokens = 10, windowMs = 10000 },
        },
        pingTolerance = 2.0, -- 0.0..10.0 metres added to every distance check
        traceToleranceMs = 1500, -- 0..10000 grace on a minigame deadline
        minPressGapMs = 40, -- 0..500, anything faster is not a human
        earlySubmitRatio = 0.85, -- 0.0..1.0 of the challenge duration
        violationThreshold = 5, -- 0 disables the reaction
        violationWindowMs = 300000,
        violationAction = "handleCheating", -- "none" | "log" | "kick" | "handleCheating"
    },

    presentation = {
        particles = true,
        sound = true,
        cameraWork = true,
        screenEffects = true,
        soundRange = 15.0, -- 1.0..100.0 metres
        soundVolume = 0.7, -- 0.0..1.0
    },
}
config/interrogation_scenes.lua
Config.Interrogation.scenes = {
    originPitch = 0.0,
    originYaw = 180.0,
    chairModel = "prop_torture_ch_01",
    idle = "waterboard_idle",
    library = {
        waterboard_idle = {
            dict = "missfbi3_waterboard", clip = "waterboard_idle", looped = true,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
            },
        },
        waterboard_loop = {
            dict = "missfbi3_waterboard", clip = "waterboard_loop", looped = true,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
                { role = "prop", suffix = "_rag", model = "p_loose_rag_01_s", lift = 0.2 },
                { role = "cam", suffix = "_cam" },
            },
        },
        electrocute_both_loop = {
            dict = "missfbi3_electrocute", clip = "electrocute_both_loop", looped = true,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
                { role = "prop", suffix = "_r_clip", model = "p_ld_crocclips01_s", lift = 0.2 },
                { role = "prop", suffix = "_l_clip", model = "p_ld_crocclips02_s", lift = 0.3 },
                { role = "cam", suffix = "_cam" },
            },
        },
        pull_tooth_ready_loop = {
            dict = "missfbi3_toothpull", clip = "pull_tooth_ready_loop", looped = true,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
                { role = "cam", suffix = "_cam" },
            },
        },
        pull_tooth_outro = {
            dict = "missfbi3_toothpull", clip = "pull_tooth_outro", looped = false, durationMs = 5000,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
            },
        },
        wrench_idle = {
            dict = "missfbi3_wrench", clip = "wrench_idle", looped = true,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
                { role = "prop", suffix = "_wrench", model = "prop_cs_wrench", lift = 0.2 },
                { role = "cam", suffix = "_cam" },
            },
        },
        wrench_attack_right = {
            dict = "missfbi3_wrench", clip = "wrench_attack_right", looped = false, durationMs = 2500,
            tracks = {
                { role = "victim", suffix = "_victim" },
                { role = "actor",  suffix = "_player" },
                { role = "chair",  suffix = "_chair" },
                { role = "prop", suffix = "_hand_l", model = "p_arm_bind_cut_s", lift = 0.1 },
                { role = "prop", suffix = "_hand_r", model = "p_arm_bind_cut_s", lift = -0.1 },
                { role = "prop", suffix = "_wrench", model = "prop_cs_wrench", lift = 0.2 },
            },
        },
    },
}
config/interrogation_tools.lua
Config.Interrogation.tools = {
    {
        id = "pliers",
        label = "toolPliers",
        icon = "Wrench",
        requiredItem = "torture_pliers",
        consumeItem = false,
        effect = { type = "damage", amount = 12 },
        healthFloor = 130,
        cooldownMs = 20000,
        minigame = {
            type = "timing",
            params = { rounds = 4, sweepMs = 2200, windowMs = 460, minHits = 3 },
        },
        keys = {
            { action = "hit", icon = "MousePointerClick", label = "keyStrike", control = 24 },
            { action = "cancel", icon = "X", label = "keyCancel", control = 194 },
        },
        actorAnim = { dict = "anim@amb@clubhouse@tutorial@bkr_tut_ig3@", clip = "machinic_loop_mechandplayer", flags = 49 },
        victimAnim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
        scene = "pull_tooth_ready_loop",
        successScene = "pull_tooth_outro",
        prop = {
            model = "p_pliers_01_s",
            bone = 28422,
            offset = vector3(0.0, 0.0, 0.0),
            rotation = vector3(0.0, 0.0, 0.0),
        },
        sound = { name = "Drill_Pin_Break", set = "DLC_HEIST_FLEECA_SOUNDSET", volume = 0.6, range = 12.0 },
        particle = { asset = "core", effect = "blood_stab", scale = 0.5, bone = 57005 },
        screenEffect = { type = "shake", intensity = 0.6, durationMs = 1200 },
        progressGain = 8,
        dispatchEvent = "tool_use",
    },
    {
        id = "car_battery",
        label = "toolCarBattery",
        icon = "Zap",
        requiredItem = "car_battery",
        consumeItem = false,
        effect = { type = "damage", amount = 15 },
        healthFloor = 135,
        cooldownMs = 30000,
        minigame = {
            type = "two_stage",
            params = { armWindowMs = 2500, delayMinMs = 900, delayMaxMs = 2600, fireWindowMs = 420 },
        },
        keys = {
            { action = "arm", icon = "Power", label = "keyCharge", control = 38 },
            { action = "fire", icon = "Zap", label = "keyRelease", control = 24 },
            { action = "cancel", icon = "X", label = "keyCancel", control = 194 },
        },
        actorAnim = { dict = "mp_car_bomb", clip = "car_bomb_mechanic", flags = 49 },
        victimAnim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
        scene = "electrocute_both_loop",
        prop = {
            model = "prop_car_battery_01",
            hideInScene = true,
            bone = 57005,
            offset = vector3(0.12, 0.0, -0.02),
            rotation = vector3(-100.0, 0.0, 0.0),
        },
        sound = { name = "Hack_Failed", set = "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", volume = 0.7, range = 15.0 },
        particle = { asset = "core", effect = "ent_ray_prologue_elec_crackle", scale = 0.7, bone = 57005 },
        screenEffect = { type = "flash", intensity = 0.8, durationMs = 900 },
        progressGain = 12,
        dispatchEvent = "tool_use",
    },
    {
        id = "blowtorch",
        label = "toolBlowtorch",
        icon = "Flame",
        requiredItem = "blowtorch",
        consumeItem = true,
        effect = { type = "damage", amount = 18 },
        healthFloor = 140,
        cooldownMs = 45000,
        minigame = {
            type = "hold_gauge",
            params = { holdMs = 11000, bandMin = 0.35, bandMax = 0.65, driftSteps = 20, minInBandRatio = 0.6 },
        },
        keys = {
            { action = "hold", icon = "Hand", label = "keyHold", control = 24 },
            { action = "cancel", icon = "X", label = "keyCancel", control = 194 },
        },
        actorAnim = { dict = "anim@scripted@heist@ig5_torch_lock@male@", clip = "action_male", flags = 49 },
        victimAnim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
        prop = {
            model = "prop_tool_blowtorch",
            bone = 57005,
            offset = vector3(0.1, 0.02, 0.01),
            rotation = vector3(-80.0, 10.0, 0.0),
        },
        sound = { name = "Drill", set = "DLC_HEIST_FLEECA_SOUNDSET", volume = 0.8, range = 18.0 },
        particle = { asset = "core", effect = "fire_wrecked_plane_cockpit", scale = 0.35,
            on = "prop", offset = vector3(0.0, 0.22, 0.0) },
        screenEffect = { type = "blur", intensity = 0.7, durationMs = 2000 },
        progressGain = 18,
        dispatchEvent = "tool_use",
    },
    {
        id = "waterboard",
        label = "toolWaterboard",
        icon = "Droplets",
        requiredItem = "water_canister",
        consumeItem = true,
        effect = { type = "status", status = "suffocating", durationMs = 45000, magnitude = 1.5 },
        healthFloor = 150,
        cooldownMs = 60000,
        minigame = {
            type = "progress",
            params = { workMs = 9000 },
            durationMs = 11000,
        },
        keys = {
            { action = "complete", icon = "Check", label = "keyPour", control = 24 },
            { action = "cancel", icon = "X", label = "keyCancel", control = 194 },
        },
        actorAnim = { dict = "anim@narcotics@trash", clip = "idle_a", flags = 49 },
        victimAnim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
        scene = "waterboard_loop",
        prop = {
            model = "w_am_jerrycan",
            bone = 28422,
            offset = vector3(0.0, 0.0, 0.0),
            rotation = vector3(0.0, 0.0, 0.0),
        },
        sound = { name = "Trailer_Water_Splash", set = "MISSION_RACE_09_SOUNDSET", volume = 0.6, range = 12.0 },
        particle = { asset = "core", effect = "ent_sht_water", scale = 0.4, bone = 57005 },
        screenEffect = { type = "filter", intensity = 0.9, durationMs = 4000 },
        progressGain = 22,
        dispatchEvent = "tool_use",
    },
    {
        id = "knuckles",
        label = "toolWrench",
        icon = "Hammer",
        requiredItem = nil,
        consumeItem = false,
        effect = { type = "damage", amount = 6 },
        healthFloor = 125,
        cooldownMs = 12000,
        minigame = {
            type = "mash",
            params = { workMs = 9000, gain = 0.12, decayPerSecond = 0.45, target = 0.8, startValue = 0.35 },
        },
        keys = {
            { action = "a", icon = "ArrowLeft", label = "keyLeftFist", control = 24 },
            { action = "b", icon = "ArrowRight", label = "keyRightFist", control = 25 },
            { action = "cancel", icon = "X", label = "keyCancel", control = 194 },
        },
        actorAnim = { dict = "melee@unarmed@streamed_variations", clip = "plyr_takedown_front_low_punch", flags = 49 },
        victimAnim = { dict = "anim@gangops@hostage@", clip = "victim_idle", flags = 1 },
        scene = "wrench_idle",
        successScene = "wrench_attack_right",
        sound = { name = "Melee_Hit_Ped", set = "MELEE_COMBAT_SOUNDSET", volume = 0.7, range = 14.0 },
        particle = { asset = "core", effect = "blood_stab", scale = 0.3, bone = 31086 },
        screenEffect = { type = "shake", intensity = 0.45, durationMs = 700 },
        progressGain = 5,
        dispatchEvent = "tool_use",
    },
}

With Config.UseJobConfigurator = true, review Crime → Interrogation for enablement, placement limits, grabbing, session duration, rescue, dispatch, logging, and presentation. The corresponding keys use interrogation..., including interrogationEnabled, interrogationGrabEnabled, interrogationMaxDurationMinutes, interrogationRescueEnabled, interrogationDispatchEnabled, and interrogationGlobalIntensity. Saved overrides take precedence. Binding paths, scene definitions, custom tool data, and settings not offered there remain in their configuration files. Creator edits to interrogation tool/zone definitions are runtime edits; keep permanent custom definitions in the files so a restart does not discard them.

The supplied Config.Interrogation.npc.enabled is true for administrator practice dummies. Change it to false in config/interrogation_core.lua before opening a server where practice dummies are unwanted; this option is not a saved configurator switch. The interrogationdummy command remains restricted by its administrator permissions. Interrogation consent checks are disabled by default and there is no player command to grant consent. Keep these defaults unless you have configured your own complete policy.

In sky_crimesystem/config/drugs_growing.lua, merge these model replacements:

PathPrevious valueNew value
Config.Drugs.Growing.setup.containers.plastic_pot.emptyPropModelbzzz_growing_freepot_asky_weed_pot_empty
Config.Drugs.Growing.setup.containers.plastic_pot.propModelbzzz_growing_freepot_csky_weed_pot_soil
Config.Drugs.Growing.setup.containers.fabric_pot.emptyPropModelbzzz_growing_freepot_asky_weed_pot_empty
Config.Drugs.Growing.setup.containers.fabric_pot.propModelbzzz_growing_freepot_csky_weed_pot_soil
Config.Drugs.Growing.plantDefaults.propModelSmallbkr_prop_weed_01_small_01csky_weed_plant_small
Config.Drugs.Growing.plantDefaults.propModelMediumbkr_prop_weed_med_01asky_weed_plant_medium
Config.Drugs.Growing.plantDefaults.propModelLargebkr_prop_weed_lrg_01asky_weed_plant_large

Append "sky_weed_plant_small", "sky_weed_plant_medium", and "sky_weed_plant_large" to the existing Config.Drugs.Growing.pottedGrowthModels list. Keep its existing GTA model names. Saved retired pot names resolve to the replacements; custom models remain supported.

In sky_crimesystem/config/drugs_labs_power_workers.lua, change Config.Drugs.Power.equipment.plant_pot.propModel from "bkr_prop_weed_01_small_01c" to "sky_weed_plant_small". Add the previously absent trimming-table entry inside the existing equipment table:

config/drugs_labs_power_workers.lua
Config.Drugs.Power.equipment.trimming_table = {
    label = "Trimming Table", category = "processing", watts = 40, radius = 2.5,
    conditionWear = 0.2, propModel = "bkr_prop_weed_table_01a",
    interactionLabel = "Trim product", processRole = "trimming",
    requiredTool = "trimming_shears",
}

Drug Creator catalogs and Heist Creator definitions have their own saved content. Do not reset them to adopt new file defaults. Back up/export your catalog, compare the model and equipment changes, and apply the intended entries through /drugcreator or its supported import. Update the supplied config/heists/fleeca_legion_square_v1.json and use /heistcreator to open/import that definition if you want the revised Fleeca pickup and translations; replacing the file alone does not replace your customized saved heist.

Config.NpcPoliceSupport.enabled remains false; its file value now prevents saved configurator values from enabling the unfinished feature. The other changes to its comment do not change the default. Money Wash and online Heist Hub publishing remain disabled. No provider credentials change.

Optional performance diagnostics

Sky's extra profiler information is disabled by default. This update does not start recordings or send data automatically. No configuration change is required for normal use. If support needs a performance recording, add the following line to server.cfg before the Sky ensure lines, then restart the server:

server.cfg
setr sky_profiler 1

This global setting is configured in server.cfg; it is not managed by /jobconfig. The previous state with no setting remains disabled. Set the value to 1 only when you want the additional diagnostics.

Run profiler record 1000 in the server console for a server delay, or in the player's F8 console for a client problem. Reproduce the issue during the recording. Wait until profiler status reports that recording has stopped, then run profiler saveJSON sky-profile.json in the same console to save the capture. These are the standard FiveM profiler commands.

After diagnostics, change the line to setr sky_profiler 0 and restart again. Keep the new package files installed; disabling diagnostics does not require editing Lua or removing manifest entries.

  1. Apply database and item changes.

For automatic setup, keep Config.AutoExecuteQuery = true. This update adds sky_crime_interrogation_consent, sky_crime_interrogation_objects, sky_crime_interrogation_logs, sky_crime_base_raids, and sky_crime_base_raid_log; existing activity data is retained. When automatic main-table migration is disabled, run these additions from sky_crimesystem/import.sql against your active database:

import.sql
CREATE TABLE IF NOT EXISTS `sky_crime_interrogation_consent` (
    `identifier` VARCHAR(64) NOT NULL,
    `consented` TINYINT(1) NOT NULL DEFAULT 0,
    `hint_seen` TINYINT(1) NOT NULL DEFAULT 0,
    `updated_at` BIGINT NOT NULL DEFAULT 0,
    PRIMARY KEY (`identifier`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `sky_crime_interrogation_objects` (
    `object_id` VARCHAR(64) NOT NULL,
    `kind` VARCHAR(16) NOT NULL DEFAULT 'chair',
    `model` VARCHAR(64) NOT NULL,
    `pos_x` DOUBLE NOT NULL,
    `pos_y` DOUBLE NOT NULL,
    `pos_z` DOUBLE NOT NULL,
    `heading` DOUBLE NOT NULL DEFAULT 0,
    `owner` VARCHAR(64) NOT NULL DEFAULT '',
    `created_at` BIGINT NOT NULL DEFAULT 0,
    `last_used_at` BIGINT NOT NULL DEFAULT 0,
    PRIMARY KEY (`object_id`),
    KEY `idx_sky_crime_interrogation_objects_owner` (`owner`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `sky_crime_interrogation_logs` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `session_id` VARCHAR(64) NOT NULL DEFAULT '',
    `event_group` VARCHAR(24) NOT NULL,
    `action` VARCHAR(32) NOT NULL,
    `server_id` INT NOT NULL DEFAULT 0,
    `identifier` VARCHAR(64) NOT NULL DEFAULT '',
    `character_name` VARCHAR(100) NOT NULL DEFAULT '',
    `target_identifier` VARCHAR(64) NOT NULL DEFAULT '',
    `pos_x` DOUBLE NOT NULL DEFAULT 0,
    `pos_y` DOUBLE NOT NULL DEFAULT 0,
    `pos_z` DOUBLE NOT NULL DEFAULT 0,
    `detail` TEXT NULL,
    `created_at` BIGINT NOT NULL,
    PRIMARY KEY (`id`),
    KEY `idx_sky_crime_interrogation_logs_session` (`session_id`),
    KEY `idx_sky_crime_interrogation_logs_created` (`created_at`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS sky_crime_base_raids (job VARCHAR(64) NOT NULL PRIMARY KEY, data LONGTEXT NOT NULL);
CREATE TABLE IF NOT EXISTS sky_crime_base_raid_log (id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, raid_id VARCHAR(96) NOT NULL, job VARCHAR(64) NOT NULL, actor VARCHAR(96) NOT NULL, action VARCHAR(32) NOT NULL, detail LONGTEXT NOT NULL, created_at BIGINT NOT NULL, INDEX idx_base_raid_log (raid_id, created_at));

For a new installation, apply the full import.sql if you manage the main tables manually. The separate heist tables are not included in that file: keep Config.HeistPersistence.enabled = true and Config.HeistPersistence.autoMigrate = true unless you maintain their migrations yourself. Keep Config.PvPEvents.autoMigrate = true for automatic PvP setup.

On the first start after updating, saved open base raids are completed and receive the configured protection time; unfinished breach attempts receive the failed-attempt cooldown. Further restarts do not extend already completed protection. This also releases the corresponding configuration and import locks. Preserve the raid history and existing stock; no manual raid-row deletion is needed.

Register the usual Crime inventory items in your active inventory. Add the raid items police_raidram, baseraidkit, and search_warrant, plus interrogation items cable_tie, blindfold, torture_pliers, car_battery, blowtorch, water_canister, interrogation_chair, and interrogation_cart. Check trimming_shears for the trimming table. On Qbox, also provide the stackable black_money item used for black-money payments. Use the configured item names if you customize them.

Install the supplied PNG or WebP files from sky_crimesystem/config/inventoryimages/png or webp into your inventory's image folder with matching extensions; provide any additional custom item images that are missing. Replace all Crime locales and install the new Sky plant and pot models. Remove retired Bzzz models and other obsolete files using the exact Removed Files list. Existing custom GTA plant models remain supported.

  1. Start and verify the update.

Start your framework, database, inventory, and targeting resources, then Base, Jobs Base, and Crime. Start Police, Ambulance, and Fire beforehand when using their optional integrations. Confirm administrator access to /jobconfig, /drugcreator, and /heistcreator; on Qbox, create the organization's framework gang before assigning members.

Test organization access with a regular member. Place and save a mainbase, reopen it, and confirm ordinary storage locations remain accessible. Test a raid with the configured participants and items, then a resource restart and the resulting cooldown. Check an interrogation's release and rescue actions, a camper purchase and its keys, one heist equipment deposit, Fleeca preparation pickup, a test plant, and a processing station. Reopen the interfaces in your chosen language and verify saved progress after restarting. For first-time setup, follow First Setup, Your First Heist, and Drug Basics.

Draft

Version 0.1.0

Initial release draft for Sky Crime System, based on the current development version. The release date is not yet confirmed.

Highlights

  • Added criminal organizations for ESX, QBCore, and Qbox, with framework job or gang membership and an independent membership option that lets players keep their regular jobs.
  • Added cooperative heists with crew planning, preparation missions, equipment management, different approaches, and shared progress through the robbery.
  • Added a drug economy covering cultivation, processing, laboratories, mobile production, and multiple ways to sell and distribute finished products.
  • Added territory control with supplied districts and custom areas, separate street and supply influence, ownership bonuses, and gang graffiti.

Notable Changes

  • Added a visual Heist Creator for arranging missions, objectives, dependencies, requirements, opening methods, and rewards, with tools to save and activate scenarios and open or export heist files.
  • Added an included Fleeca heist with a complete preparation and robbery flow for players and a starting point for server owners creating their own scenarios.
  • Added organization workshops and heist equipment storage so crews can craft tools and prepare the supplies required by their plans.
  • Added configurable heist security with alarms, cameras, lasers, gas zones, keycards, and doors or vaults that support different opening methods.
  • Added configurable loot collection and buyers, including cash, valuables, artwork, and deposit boxes.
  • Added optional heist preparations and escape scenarios involving computers, reconnaissance, transport vehicles, boats, diving, and one-time events.
  • Added a Drug Creator for managing drugs, strains, seeds, collection areas, recipes, equipment, laboratories, buyers, and routes.
  • Added plant cultivation with placement, growth stages, plant care, environmental conditions, harvesting, and configurable public collection areas.
  • Added custom weed plants and pots, including different strain appearances across growth stages.
  • Added public processing points and paid processing services with material requirements, production timers, and collection of finished goods.
  • Added purchasable laboratories with equipment placement, power, ventilation, storage, workers, upkeep, expansions, and production orders.
  • Added camper shops and mobile laboratories that players can purchase, convert, equip, and operate while parked.
  • Added product batches with quality, purity, freshness, potency, stability, contamination, packaging, and testing that affect production results and buyer demand.
  • Added consumable drug products with configurable effects, cooldowns, tolerance, addiction, and withdrawal.
  • Added street-sale conversations with buyer preferences, negotiation, refusals, scams, and the risk of police reports.
  • Added discoverable contacts, dealer trust, commissioned sales, delivery routes, changing market demand, and larger distribution networks with staff, storage hubs, and contracts.
  • Added drug-related heat, police and medical alerts, laboratory threats, and player attacks on production operations.
  • Added standalone shop robberies with clerk intimidation, cash registers, safe codes, drilling, and optional hacking.
  • Added ATM robberies using vehicle pulling and explosives, with configurable tools, rewards, police requirements, and cooldowns.
  • Added NPC pickpocketing with timing, pulse, and sequence minigames, selectable loot, cooldowns, and reactions such as fleeing, aggression, or police alerts after failed attempts.
  • Added organization base raids for criminal groups and police, with configurable entry requirements, protection periods, and access to eligible storage and vehicles.
  • Added the BlackBay tablet marketplace with player offers, buy requests, trade chat, configurable NPC traders, meetings, dead drops, and personal in-game coin wallets.
  • Added interrogation scenes with grabbing, carrying, vehicle transport, placeable chairs and tools, minigames, release, and rescue options.
  • Added faction PvP events with Last Man Standing, Team Deathmatch, and Free For All, including recurring schedules, entry fees, prize pools, scoreboards, and arena boundaries.

Other Changes

  • Added organization management with member invitations, ranks, permissions, shared funds, and configurable access to facilities.
  • Added shared tablet access, a gallery, garages, shops, wardrobes, storage, and lockers through Sky Jobs Base.
  • Added in-game configuration for organizations, locations, permissions, and gameplay settings through /jobconfig.
  • Added saved organization, territory, laboratory, plant, stock, heist, and event data with automatic database setup.
  • Added localized interfaces and optional integrations with Sky Police Job, Sky Ambulance Job, and Sky Fire Job.
Availability in this development version:
  • Money Wash is temporarily unavailable. Saved settings and imports cannot enable it. Existing businesses, equipment, and stored data are preserved. See Money Wash Businesses.
  • Online Heist Hub publishing is unavailable. Heists can still be saved and activated on your own server.
  • Jewellery display cases cannot be added through the Heist Creator. This does not disable the other loot types listed above.
  • NPC police support is disabled by default. Police and medical alerts remain separate features.

Changed Files

  • sky_crimesystem/* — install the complete resource package for this initial release, including configuration, translations, database files, models, and the built interface.