Added configurable vehicle purchase-price catalogues, including custom database mappings.
Added optional JG HUD mileage display independently of the mileage source.
Added free camera movement during tuning with the Space key.
Notable Changes
Improved JG Mileage selection to retain Sky mileage while the optional provider is unavailable.
Fixed initial tuning saves for owned Qbox vehicles with empty properties.
Improved workshop vehicle history with temporary-registration online time and recorded plate-style changes.
Added optional server integration for attributing successful plate-style changes to their workshop actor.
Improved remote vehicle, lift and Dyno handling when a streamed vehicle is not yet available.
Added HP below the existing PS output in Dyno results.
Improved File Explorer loading so ordinary folders remain available while shared document data loads.
Improved shared document and video previews, with clearer feedback when a document cannot be loaded.
Improved court execution forms with automatic deadline updates that preserve entered details.
Improved targeted invoices so the selected recipient stays attached to the invoice throughout creation.
Other Changes
Improved customer names in workshop invoices.
Removed a repeated stance diagnostic from normal console output.
Changed Files
sky_mechanicjob/README.md
sky_mechanicjob/compat/jg_hud_mileage.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/config/sv_functions.lua
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.34.11.35.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_mechanicjob1.34.1 → 1.35.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.
Phase 2 of 5
Replace files
Use the complete 1.35.0 customer package. Delete the entire sky_mechanicjob/source/ folder and insert the new one, then replace sky_mechanicjob/fxmanifest.lua from the same package. Refresh the complete sky_mechanicjob/config/locales/ tree and merge custom translations. Preserve your selected language. Do not restore an older bootstrap or merge generated interface files.
Merge config/config.lua and the updated Config.Functions.GetVehiclePurchasePrice implementation in config/sv_functions.lua, retaining deliberate custom API hooks. Add compat/jg_hud_mileage.lua and update the supplied README.md. Keep the matching manifest and complete generated source together.
Phase 3 of 5
Merge config
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_mechanicjob 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.VehiclePrices controls the global price source used by vehicle-value-based tuning. Defaults retain the existing mapping:
In /jobconfig → Mechanic Jobs → General → Database, use vehiclePriceSource, vehiclePriceTable, vehiclePriceModelColumn, vehiclePricePriceColumn and vehiclePriceHashColumn. auto uses ESX's SQL mapping or QBCore/Qbox's vehicle catalogue. database uses the configured SQL mapping on any framework. For JG Dealerships choose database, dealership_vehicles, spawn_code, price, hashkey. The model column must contain spawn names, not display names; price values must be positive numbers. The optional hash column accepts numeric signed/unsigned hashes; leave it empty to resolve from spawn names. SQL identifiers allow up to 64 letters, digits or underscores. Missing prices retain the configured fallback vehicle value. The catalogue is read-only; the existing custom purchase-price hook remains available.
New Config.ToggleFeatures.tuningFreeCamera = true allows Space to hide the tuning cursor for camera movement; it is independent of existing automatic tuningCamera. New Config.ToggleFeatures.jgHud = false enables optional JG HUD display. Existing jgMileage = false and mileageHud = true remain. Select these feature switches in /jobconfig when enabled. For Sky mileage shown only in JG HUD, enable JG HUD and disable JG Mileage and Mileage HUD. JG Mileage uses jg-vehiclemileage v2.1.1+ while started, otherwise Sky mileage continues; switching does not migrate old odometer data.
For JG HUD integration, add this after the existing client_scripts block in jg-hud/fxmanifest.lua, so it loads after framework/cl-functions.lua:
Reload manifests with refresh, then restart Mechanic and jg-hud, or use the full server restart in the verification step. This retains JG HUD's original getter when Sky has no active display value. No additional JG resource is required if the new switch stays off. Plate-style audit integration is opt-in through the supplied server exports; installing this release alone does not enable attribution for an external script. Keep existing actor/permission policies. Install Base 1.46.0 with Mechanic 1.35.0 for the Qbox initial-save correction.
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.
Phase 4 of 5
SQL & items
SQL: No new Mechanic table, column or manual migration. Vehicle-price configuration reads your existing catalogue; do not alter dealership tables merely to apply the update. Existing registration history and vehicle properties remain. Items: No new definitions. Assets: Add the supplied JG compatibility Lua file if integrating the HUD; no new map, stream model or item image. No Sky-to-JG mileage data migration is performed.
Phase 5 of 5
Restart & test
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 saved tuning settings and calculate a price for a known model, including your fallback for a missing price. Test automatic tuning camera and Space free camera independently. If JG HUD is enabled, check its mileage with your selected source, provider stop/restart and vehicle exit. On Qbox, save tuning and retrieve an already-owned vehicle with naturally empty saved properties, preserving plate, fuel and damage. Check temporary-registration remaining online time and history, Dyno PS/HP output, File Explorer and targeted invoices. If integrating plate-style audit exports, confirm only successful attributed changes are recorded.
Version 1.34.1
Highlights
Added a configurable global vehicle purchase-price catalogue so vehicle-value-based tuning prices can use your dealership's existing table and spawn-name fields.
Fixed an issue where Space could not restore the tuning cursor after entering free camera.
Fixed an issue where the first tuning save failed for owned Qbox vehicles with missing or empty saved properties.
Fixed an issue where Mechanic failed to initialize when shared dependencies took more than 60 seconds to load.
Notable Changes
Added a Free camera in tuning menu feature switch in /jobconfig, allowing you to disable free-camera entry separately from automatic part focusing.
Fixed an issue where vehicle and Dyno updates produced network-object warnings outside a player's streaming range.
Fixed an issue where lift attachment updates tried to use a vehicle after it left streaming range during loading.
Improved Mechanic startup so a failed migration is reported without aborting the entire initializer.
Other Changes
Updated the release package to keep its own dependency bootstrap editable for support.
Changed Files
sky_mechanicjob/README.md
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/config/sv_functions.lua
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.34.01.34.1
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_mechanicjob1.34.0 → the refreshed 1.34.1 package. If you already installed the earlier 1.34.1 startup hotfix, download the latest 1.34.1 package again for these additions. The manifest version stays 1.34.1, so the version alone cannot distinguish the earlier package. Check that the new download includes Config.VehiclePrices and Config.ToggleFeatures.tuningFreeCamera in sky_mechanicjob/config/config.lua, then check the settings after installation.
Back up resources, the database, custom configuration, translations and saved configurator data. Validate the update on staging and stop the server for replacement. Install the latest refreshed Base 1.45.1, then Jobs Base 1.48.1, then Mechanic 1.34.1 and the matching updates for your installed consumers. Base supplies the Qbox first-save storage contract and Jobs Base supplies startup readiness plus the matching configurator fields and labels. An older package with the same .1 version may lack the new additions. Complete earlier release migrations first if upgrading from before 1.34.0.
Phase 2 of 5
Replace files
Use the complete refreshed 1.34.1 customer package. Delete the entire sky_mechanicjob/source/ folder and insert the new folder, then replace sky_mechanicjob/fxmanifest.lua from that same package. This replaces the runtime code and generated interface together; do not merge old generated interface files.
Merge the new sky_mechanicjob/config/config.lua entries and the updated purchase-price hook in sky_mechanicjob/config/sv_functions.lua as described below, preserving intentional custom values and hooks. Replace sky_mechanicjob/README.md and refresh the complete sky_mechanicjob/config/locales/ tree, merging custom translations. Keep your selected Base language.
The supplied dependency bootstrap remains editable for support and must match the new source and manifest. Keep the new source/dependencies.lua; do not restore an older custom bootstrap. There are no outside-source removals or renames in this Mechanic update.
Phase 3 of 5
Merge config
Keep your existing jobs, grades, workshop locations and saved overrides. Merge the changed values into sky_mechanicjob/config/config.lua; do not replace your custom configuration with all shipped defaults. Config.UseJobConfigurator remains true by default. When it is true, managed features and settings use the packaged defaults plus saved database overrides, so edit them in /jobconfig. Plaintext edits to those managed values do not change the effective saved configuration. When it is false, the Lua values below are authoritative. Startup settings such as Config.UseJobConfigurator and Config.AutoExecuteQuery remain plaintext settings. No configuration reset or re-import is required.
Vehicle purchase prices — old: no Config.VehiclePrices block; the supplied hook used ESX vehicles.model / vehicles.price or the QBCore/Qbox catalogue. New: add this complete block, with the default auto preserving those sources:
In /jobconfig, open Mechanic Jobs → General → Database and set Vehicle price source, Vehicle price table, Spawn name column, Price column, and Model hash column (optional). This is one global catalogue for the resource's vehicle-value-based tuning calculations, not a separate mapping for each workshop. The saved setting keys and new defaults are vehiclePriceSource = "auto", vehiclePriceTable = "vehicles", vehiclePriceModelColumn = "model", vehiclePricePriceColumn = "price", and vehiclePriceHashColumn = "". Missing new keys inherit those defaults; saved non-default mappings remain authoritative. Save the intended values there and reopen the section after a restart to check them.
Choose auto / Automatic (framework) for the existing behaviour: ESX reads the configured SQL mapping, while QBCore and Qbox use their framework vehicle catalogue. Choose database / Database to read a custom SQL catalogue on any of those frameworks. Use the exact names of an existing table and columns. The model column must contain spawn names, the price column numeric purchase prices, and SQL table/column names must contain 1–64 letters, digits or underscores. Do not enter schema prefixes, spaces or SQL expressions. Leave the optional hash column empty to match model hashes from spawn names; an existing numeric hash column may contain signed or unsigned values, including numeric strings.
For an existing JG Dealerships catalogue that uses these exact column names, the complete example is:
With /jobconfig enabled, enter the same five values in General → Database instead of relying on the Lua example. JG's model column is a display name; use spawn_code for the spawn name. The mapping only reads prices and does not create or change dealership tables. Missing or nonpositive prices use your existing Config.TuningCostProfile.fallbackVehicleValue or the applicable workshop/instant-tuning price profile's fallback. The shipped global fallback remains 50000; preserve intentional pricing overrides.
Merge sky_mechanicjob/config/sv_functions.lua from the same package. The supplied Config.Functions.GetVehiclePurchasePrice(model, modelHash, source) now reads Config.VehiclePrices; restoring an older supplied hook would bypass the mapping. If you deliberately use a custom resource API or complex query, preserve that custom hook and check its returned prices; the new SQL settings do not override custom hook code. Keep the supplied startup readiness line at the top of this file. For the standard mapping, this is the complete new hook:
Config.Functions.GetVehiclePurchasePrice = function(model, modelHash, source)
local modelName = tostring(model or "")
modelName = modelName:match("^%s*(.-)%s*$")
local normalizedHash = tonumber(modelHash)
if normalizedHash then
normalizedHash = normalizedHash % 4294967296
end
local function getSharedVehiclePrice(vehicles)
if modelName ~= "" then
local directVehicle = vehicles[modelName] or vehicles[modelName:lower()] or vehicles[modelName:upper()]
local directPrice = tonumber(directVehicle and directVehicle.price) or 0
if directPrice > 0 then
return math.floor(directPrice)
end
end
if not normalizedHash then
return nil
end
for catalogModel, vehicle in pairs(vehicles) do
local price = tonumber(vehicle.price) or 0
if price > 0 then
local vehicleModel = tostring(vehicle.model or vehicle.hash or catalogModel or "")
if vehicleModel ~= "" and (joaat(vehicleModel) % 4294967296 == normalizedHash
or (tonumber(vehicleModel) and tonumber(vehicleModel) % 4294967296 == normalizedHash)) then
return math.floor(price)
end
end
end
return nil
end
local price_source = Config.VehiclePrices or ConfigDefaults.VehiclePrices
if price_source.source ~= "auto" and price_source.source ~= "database" then
error("[sky_mechanicjob] Config.VehiclePrices.source must be auto or database")
end
if price_source.source == "database" or Sky.Config.framework == "esx" then
local identifiers = {}
for _, key in ipairs({ "tableName", "modelColumn", "priceColumn", "hashColumn" }) do
local identifier = tostring(price_source[key] or ""):match("^%s*(.-)%s*$")
if key ~= "hashColumn" or identifier ~= "" then
if #identifier == 0 or #identifier > 64 or not identifier:match("^[%w_]+$") then
error(("[sky_mechanicjob] Invalid Config.VehiclePrices.%s: use a SQL identifier of 1-64 letters, digits or underscores"):format(key))
end
identifiers[key] = "`" .. identifier .. "`"
end
end
if modelName ~= "" then
local rows = Sky.Query(("SELECT %s AS price FROM %s WHERE %s = ? LIMIT 1")
:format(identifiers.priceColumn, identifiers.tableName, identifiers.modelColumn), { modelName })
local price = tonumber(rows[1] and rows[1].price) or 0
if price > 0 then
return math.floor(price)
end
end
if not normalizedHash then
return nil
end
if identifiers.hashColumn then
local signed_hash = normalizedHash >= 2147483648 and normalizedHash - 4294967296 or normalizedHash
local rows = Sky.Query(("SELECT %s AS price FROM %s WHERE %s IN (?, ?) LIMIT 1")
:format(identifiers.priceColumn, identifiers.tableName, identifiers.hashColumn),
{ ("%.0f"):format(signed_hash), ("%.0f"):format(normalizedHash) })
local price = tonumber(rows[1] and rows[1].price) or 0
return price > 0 and math.floor(price) or nil
end
local rows = Sky.Query(("SELECT %s AS model, %s AS price FROM %s")
:format(identifiers.modelColumn, identifiers.priceColumn, identifiers.tableName), {})
for _, row in ipairs(rows) do
local rowModel = tostring(row.model or "")
local price = tonumber(row.price) or 0
if rowModel ~= "" and price > 0 and joaat(rowModel) % 4294967296 == normalizedHash then
return math.floor(price)
end
end
return nil
end
if Sky.Config.framework == "qbox" then
return getSharedVehiclePrice(exports.qbx_core:GetVehiclesByName())
end
local qb = exports["qb-core"]:GetCoreObject()
return getSharedVehiclePrice(qb.Shared.Vehicles)
end
Free camera — old: Config.ToggleFeatures.tuningFreeCamera was absent and free-camera entry was not separately configurable. New: add tuningFreeCamera = true alongside the existing tuningCamera = true. tuningCamera still controls automatic focusing of the selected tuning part; its shipped default is unchanged. tuningFreeCamera controls hiding the cursor for manual camera movement, independently of the automatic camera. This complete shipped block is a reference: add the new entry and preserve your existing choices for all other entries:
Config.ToggleFeatures = {
kuv = false,
vehicleRegistration = false,
stance = true,
tuningCamera = true, -- Automatically focus the selected tuning part. Also managed in /jobconfig.
tuningFreeCamera = true, -- Allow Space to hide the tuning cursor for free camera movement. Also managed in /jobconfig.
instantTuning = false,
partsDelivery = true,
carryItems = false,
nitro = true,
antiLag = true,
twoStep = true,
electronicTuning = true,
wheelDamage = true,
customHandling = true,
handlingEditor = true, -- Admin editor and its automatic plate/model overrides.
mileageHud = true,
-- Requires jg-vehiclemileage v2.1.1+ to be started first. Existing Sky mileage is not migrated to JG.
jgMileage = false,
workshopLift = true,
mobileDyno = true,
brakeOverheating = true,
selfServiceOrderNotifications = true,
vehicleMaintenanceNotifications = true,
subscriptions = true
}
In /jobconfig, open Mechanic Jobs → Features → Free camera in tuning menu. Its saved feature key is tuningFreeCamera, with default true; a saved false remains disabled after restart. Keep or adjust Automatic tuning camera separately (tuningCamera, unchanged default true). With free camera enabled, Space releases the tuning cursor and pressing it again restores the cursor; Escape still closes the menu. With it disabled, Space does not enter free camera. Disabling it through /jobconfig during an unfocused tuning session restores the cursor. The existing focus-key default remains Config.Keybinds.tuningFocusKey = "SPACE"; retain player key bindings and existing hotkey overrides.
Update the matching Jobs Base 1.48.1 package and its complete sky_jobs_base/config/locales/jobconfigurator/sky_mechanicjob/ tree for the new price fields, General → Hotkeys/Database labels and free-camera feature label. Refresh Mechanic's own complete locale tree and merge custom translations. Keep the selected language in sky_base/config/config.lua. The configurator labels are owned by Jobs Base.
The existing Parts Delivery Shop → Delivery handling selector is restored by Jobs Base 1.48.1. Its setting remains partsDeliveryMode; without /jobconfig, retain Config.PartsDelivery.deliveryMode in sky_mechanicjob/config/config.lua ("standard" or "player_inventory"). The shipped default remains "standard". Keep saved overrides.
Optional diagnostics remain 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 a plaintext server convar, not a /jobconfig setting; no recording or upload starts automatically.
Phase 4 of 5
SQL & items
SQL: No new table, column or SQL import is introduced by this Mechanic update. Keep your existing Config.AutoExecuteQuery policy. Repair the original database error if an earlier migration failed; continuing startup does not create missing schema. Do not replay a full import, clear tuning tables, force success markers or reset saved jobs/configurator data.
The vehicle-price mapping reads an existing catalogue; it does not create a dealership table, alter its schema or change prices. Check the table and columns before choosing Database. JG Dealerships is optional and is only needed if you choose its existing catalogue or custom hook.
Qbox: Update the refreshed Base 1.45.1 together with Mechanic 1.34.1, keeping your existing Qbox qbx_core and qbx_vehicles setup. An already-owned vehicle with missing or empty properties can receive its first complete tuning snapshot through qbx_vehicles; later saves continue preserving stored fuel, damage and other fields. This does not create an ownership record, repair malformed nonempty property data, or require a framework patch or manual SQL repair. Do not empty an existing vehicle's saved properties to trigger initialization. If you customized sky_base/config/vehicle_storage.lua, merge its Qbox initialization-marker update while preserving your garage schema mapping.
Items: No new item definitions, inventory registrations or item migration are introduced. Assets: No new item images, models, audio or stream assets are introduced. Keep the existing inventory and asset setup. The new frontend files are supplied inside the replaced source/ folder.
Progress providers: Keep your selected provider configuration. If you use ZSX_UIV2, install the matching Base 1.45.1 provider files and follow Base's provider setup; ensure the provider starts before Base. ZSX supports player cancellation; no programmatic stop export is assumed.
Phase 5 of 5
Restart & test
Perform a full server restart after replacement so changed manifests and file lists reload. Start the framework, database connector and selected providers first, then Base 1.45.1, Jobs Base 1.48.1, Mechanic 1.34.1 and other installed consumers. Reconnect clients. The new changes keep the existing startup hotfix: Mechanic waits for Jobs Base initialization instead of aborting after 60 seconds. SQL migration warnings remain actionable and failure to read saved settings remains a visible initialization error.
Open the Mechanic tablet at your existing workshop. With /jobconfig, confirm the General → Database values, the Free camera in tuning menu feature, and Parts Delivery Shop → Delivery handling. Save a deliberate non-default price mapping or free-camera choice, reopen the section and restart once to verify that choice persists; do not reset unrelated overrides.
For vehicle-value-based pricing, use a vehicle with a known positive purchase price in your selected catalogue and check its tuning quote. With an optional hash column, test a vehicle whose catalogue stores its hash in the format you use. Also check a missing-price vehicle against the intended fallback. Fixed-price or otherwise overridden tuning options may not change when the purchase catalogue changes.
In the tuning menu, test Space to hide and restore the cursor and Escape to close, with Automatic tuning camera both enabled and disabled. Then disable Free camera in tuning menu and confirm that entry is blocked; if you disable it during an unfocused session, confirm that the cursor returns. Test your existing rebound focus key too.
On Qbox, use an already-owned staging vehicle with naturally missing or empty saved properties. Complete one permitted tuning install, store and retrieve it through your configured garage, and check the installed tuning, plate/model, fuel and damage. Repeat a save with an existing complete record and check that stored fuel, damage and other vehicle data remain intact. Source/contract tests do not establish the customer's paid install or garage round trip.
With two clients or a staging streaming-range test, check a spawned tuned vehicle, Dyno updates, remote AntiLag/TwoStep effects, catalytic smoke, wheel repair and engine-sound previews both nearby and outside streaming range. Check that no new network-object warnings occur and that nearby effects and restoration still work. Test lift attachment while in range, moving out of range during loading, and detachment; this change does not create a missing garage/lift vehicle association.
Complete and cancel one non-minigame install/repair using your selected progress provider; include ZSX_UIV2 if configured. Do not assume a provider has a programmatic stop export when it does not document one. If a feature remains unavailable, collect the first initialization/SQL error, preceding lines and actual package versions. Customer/client/provider acceptance remains a check to perform on your server.
Version 1.34.0
Highlights
Added an automatic tuning camera that focuses the selected vehicle part, with a player toggle and manual camera control.
Added optional authoritative mileage integration with jg-vehiclemileage.
Added invoice creation for unpaid public tuning orders while retaining the original customer and quoted order amount.
Notable Changes
Added separate interaction profiles for mobile dyno stations and result monitors, including placement controls and live blip updates.
Added gang and independent organization access selectors for supported mechanic activities and instant tuning.
Added the shared Sky Billing view alongside the existing mechanic service invoice workflows.
Improved mechanic invoice receipts and shared payment views with eligible installment choices and clearer payment status.
Fixed an issue where record printing callbacks were missing or the wrong file view reopened.
Fixed an issue where reopening the tablet lost its current route and navigation context.
Fixed an issue where an expired advanced pricing quote could fail while rebuilding the tuning catalogue.
Fixed an issue where untracked vehicles kept the wrong engine sound after repair.
Fixed an issue where persistence checks reported a normal unowned vehicle as a save error.
Improved tuning, wheel replacement and billing to use the active workshop's configuration.
Improved custom handling updates to reuse unchanged vehicle settings and discard stale updates.
Added an ESX vehicle properties compatibility diagnostic for unsupported upstream property layouts.
Improved first-time invoice, printer and tablet initialization.
Improved document navigation with grouped types and profile tabs.
Other Changes
Changed the default mechanic invoice amount limits to 999999999 while retaining custom configured limits and other grade rules.
Changed the default engine sound camera focus from the rear to the engine.
Improved configuration updates so other resources' edits do not invoke mechanic handlers.
Improved tablet descriptions so longer text remains readable.
Updated mechanic and billing translations.
Changed Files
sky_mechanicjob/config/adv_config.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/engine_sounds_config.lua
sky_mechanicjob/config/init.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/config/sv_functions.lua
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.33.11.34.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_mechanicjob1.33.1 → 1.34.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.
Phase 2 of 5
Replace files
Use the complete 1.34.0 release package. Delete the entire sky_mechanicjob/source/ folder and insert its new version; do not merge old generated interface files. Replace sky_mechanicjob/fxmanifest.lua from the same package. Refresh the complete sky_mechanicjob/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_mechanicjob/config/adv_config.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/engine_sounds_config.lua
sky_mechanicjob/config/init.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/config/sv_functions.lua
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Phase 3 of 5
Merge config
Merge the two new feature defaults into sky_mechanicjob/config/config.lua:
Set /jobconfig → Mechanicjob → Features keys tuningCamera and jgMileage when the configurator is enabled. Saved overrides remain effective. The camera feature permits automatic focus; each player can disable the automatic camera in the tuning menu and use the existing manual/free camera control with Space. Disabling the feature releases its own camera immediately.
Leave jgMileage = false unless using jg-vehiclemileage v2.1.1 or newer, started before Mechanicjob. With the feature enabled, JG's valid odometer value is authoritative, including zero and corrected lower values. Existing Sky mileage is not migrated into JG. Back up and review both systems' odometer data before switching; do not enable this to copy Sky mileage.
Add both new profiles inside your existing Config.Interactions table, keeping all existing workshop profiles:
With /jobconfig, edit the station and monitor interaction/placement profiles for Mechanicjob and keep saved custom rules. They are interaction profiles, not new global boolean settings. Menu and inventory placement use the configured placement gizmo and limits. Review existing installations and their blips after a live update.
The default global Config.Billing.maximumInvoiceAmount changes 250000 → 999999999. The shipped per-job Config.Jobs[*].billing.maximumInvoiceAmount also changes 250000 → 999999999; the shipped grade rows 0/1/2/3 change 15000/50000/125000/250000 → 999999999. Keep deliberate server-specific limits, discounts, taxes, permissions and other grade flags. Review the selected job's Billing settings in /jobconfig; do not reset saved custom limits to receive the new default.
In config/engine_sounds_config.lua, the default Config.EngineSounds.cameraPart changes "rear" → "engine". Preserve custom sound entries and their chosen focus. This sound option catalogue stays in the plaintext file; tuningCamera controls whether automatic focus is available.
Activity allow-lists in config/adv_config.lua now accept exact job/group names and "gang:<internal_name>". Gang membership is checked independently; a job duty requirement applies to job grants. Preserve existing jobs and enter only the intended gang selector in a supported activity list.
Mechanic's native service invoice and advanced billing configuration remain separate from central Sky Billing. Configure Base Config.billing = "sky" and Jobs Base billing to use the shared central panel; do not assume this migrates existing mechanic or external invoices. Unpaid public tuning orders can be invoiced from the Tuning Orders view by an authorized mechanic, using the original order/customer rather than a nearby replacement.
Merge readiness lines in config/init.lua and config/sv_functions.lua while retaining your custom function bodies. These bootstrap extension files are not /jobconfig settings.
The new readiness line in the supplied public bootstrap/hooks is:
if not Citizen.Await(SkyJobsReady) then return end
Retain it in the same position as the supplied file, before code using the job dependency. Merge your custom function bodies into the updated files; do not add this line inside every custom function. This is a bootstrap change, not a new editable setting.
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.
Phase 4 of 5
SQL & items
SQL: No new Mechanic table or column is introduced by this release. Keep existing orders, invoice links and vehicle mileage. Do not replay the full Mechanic import on an established database. Complete matching Base and Jobs Base migrations for the central Billing panel; existing mechanic invoices keep their own workflow.
Items/assets: No new item definition or streamed model is required by these changes. Existing mobile dyno, monitor, engine sound and carry-item names must still match your configured inventory. Replace the shipped UI, style and image files named in Changed Files. Keep your selected external vehicle properties and mileage provider configuration.
Providers: JG mileage is optional and requires jg-vehiclemileage v2.1.1+ started first. The ESX compatibility diagnostic reports unsupported upstream vehicle property support; it does not patch ESX or guarantee successful persistence. Follow the reported upstream compatibility requirement when this warning appears.
Dependencies: Install matching Sky Base 1.45.0 and Jobs Base 1.48.0 releases before Mechanicjob 1.34.0. Start framework/database/providers, Base, Jobs Base and then Mechanicjob; include the compatible JG resource before Mechanicjob only when that integration is enabled. Restart and reconnect clients.
Phase 5 of 5
Restart & test
Start your framework, database connector and configured providers first, then Base, Jobs Base and the updated job resources in dependency order. Reconnect clients. Open a workshop and test automatic focus on the selected part, the player camera toggle, Space/manual control and live disabling. If JG is enabled, verify a loaded, zero and corrected odometer value and preserve the unconverted Sky history. Place a dyno/monitor through the configured routes and check saved interaction, slope/placement and blip settings. Invoice an unpaid public order and confirm the original customer, quote and permission checks; retry without creating a duplicate. Test the native mechanic invoice flow separately from the shared Sky Billing panel, print a record, reopen the tablet at its current view and check tuning prices/materials for two workshop jobs.
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 1.33.1
Highlights
Changed Mechanic startup back to the previous shared-dependency loading behavior.
Notable Changes
Added missing English tuning labels and consolidated older handling-editor and Dyno translation files.
Update InstructionsA guided update for server owners1.33.01.33.1
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_mechanicjob1.33.0 → 1.33.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.
Phase 2 of 5
Replace files
Use the 1.33.1 download. Delete the entire sky_mechanicjob/source/ folder and insert the new folder. Replace sky_mechanicjob/fxmanifest.lua from that same package. Refresh the complete sky_mechanicjob/config/locales/ tree and reapply custom translations. Keep the new source and manifest together; do not merge old generated interface files into them.
Remove these obsolete locale fragments after merging any custom translations into the matching language file: sky_mechanicjob/config/locales/partials/handling_editor.lua, sky_mechanicjob/config/locales/partials/mobile_dyno.lua.
Phase 3 of 5
Merge config
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.
Phase 4 of 5
SQL & items
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.
Phase 5 of 5
Restart & test
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 check that the tuning menu loads and saves vehicle properties. If startup still fails, collect the first error and its preceding log lines together with the installed versions.
Version 1.33.0
Highlights
Fixed an issue where a visited workshop could offer tuning options from the visitor's job or the global defaults instead of its own restrictions.
Fixed an issue where repaired vehicles could still crawl without normal throttle response after engine damage.
Fixed an issue where Dyno results ignored installed performance upgrades or reused the calibration from an earlier run.
Notable Changes
Improved open tuning menus so configuration changes remove newly forbidden pending choices while retaining installed tuning and other permitted selections.
Fixed an issue where a basket containing disabled tuning options could proceed with only part of the requested work.
Fixed an issue where subscription-terminal NPC settings were overwritten by separate legacy settings after saving.
Fixed an issue where different Instant Tuning locations inherited the first NPC's heading.
Fixed an issue where saved Dyno installations moved when reloaded before world collision was available.
Other Changes
Improved Hungarian translations, including the handling editor and mobile Dyno, so older translation fragments no longer replace the selected language.
Added missing English labels for tuning options, including wheels, window tints, lights and performance upgrades.
Optimized workshop lift discovery to avoid repeatedly scanning the same world objects during one refresh.
Fixed an issue where custom workshop interaction consumers kept old settings after a configuration update.
Improved keyboard selection and accessibility in shared tablet dropdowns.
Updated vehicle documents to display times in 24-hour format.
Improved startup dependency loading and database-wait diagnostics for protected resource packages.
Update InstructionsA guided update for server owners1.32.01.33.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover sky_mechanicjob1.32.0 → 1.33.0. Complete earlier required migrations first if upgrading from an older version. Stop the server for the coordinated update and back up the database, resource files, customized configuration and saved job/Creator data. Install Base 1.44.0 first, then Jobs Base 1.47.0, then sky_mechanicjob1.33.0 and the matching updates for your other installed Sky jobs. The updated manifest requires the matching Base and Jobs Base imports; do not combine it with older dependency folders.
Phase 2 of 5
Replace files
Use the matching 1.33.0 package. Delete the complete old sky_mechanicjob/source/ folder and insert the new folder. Replace sky_mechanicjob/fxmanifest.lua from the same download. Refresh the entire sky_mechanicjob/config/locales/ tree and merge your custom translations back. Do not merge old generated interface files into the new source/ folder.
Merge the comment update in sky_mechanicjob/config/config.lua while preserving your workshop settings. Copy sky_mechanicjob/compat/sky_mechanicjob_repair_hotfix.lua to its packaged compat/ location. It is an optional compatibility file for older 1.32.0 installations; do not additionally install it into config/locales/partials/ for this full update, which already includes the repair fix. If you already used that drop-in on 1.32.0, it automatically skips its repair callback when the integrated fix is present. Delete the old sky_mechanicjob/config/locales/partials/handling_editor.lua and sky_mechanicjob/config/locales/partials/mobile_dyno.lua files. Their supplied translations are now included in the normal language files. Use the matching fxmanifest.lua, which no longer loads the old partials directory. Merge any custom text from those fragments into the corresponding normal locale table instead of restoring the old files or their manifest globs. If you maintain other custom files in that directory, move their translations into the corresponding normal locale files too. No file rename is required.
Phase 3 of 5
Merge config
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.
In sky_mechanicjob/config/config.lua, the only file change is the guidance comment inside Config.Subscriptions.npc. No shipped value changes, new config tables, adv_config.lua edits or interaction capability flags are required. The existing defaults remain:
Keep your customized values rather than replacing them with this example. Previously these subscription-specific values could overwrite the terminal's edited NPC. They are now legacy plaintext/import defaults; customized interaction values in Config.Interactions.subscription_terminal.npc take priority. Set model through pedHash, scenario through scenario, and animation through animation.dict / animation.name. Leave the scenario empty to use an animation. For a server without /jobconfig, retain legacy values or move intentional customizations to those interaction fields; no bulk reset is needed.
With /jobconfig: After starting the updated resources, open Mechanic → Interactions → Subscription Terminal → NPC. The four old standalone settings are retired and automatically move to the interaction only where no explicit interaction override exists:
Old saved setting
New NPC field under __interactions.subscription_terminal.npc
subscriptionsNpcPedModel
pedHash
subscriptionsNpcScenario
scenario
subscriptionsNpcEmoteDict
animation.dict
subscriptionsNpcEmoteClip
animation.name
Explicit interaction values, including empty scenario/animation strings, are preserved. The load migration is repeatable; the next normal save persists the new interaction overrides and removes the retired standalone keys. Review and save the effective NPC once. Do not edit the database, reset the job or reimport the whole configuration.
Workshop tuning restrictions: Existing per-job Config.Jobs[*].tuningCostProfile, managed as the job-owned tuningCostProfile extension, now determines the visited workshop's choices for staff and public customers. Its optionCostByOptionId settings remain unchanged. Existing disabled objects (enabled = false) and legacy literal false entries remain disabled. Existing global Config.ToggleFeatures.electronicTuning, .antiLag and .twoStep also apply when open menus refresh. Saved overrides remain authoritative. Recheck a normal and a restricted workshop separately; enabling an option in one workshop must not enable it in another. Instant Tuning keeps its separate profile. Already installed tuning is preserved when a newly forbidden pending selection is removed.
Dyno installation coordinates, headings and all Dyno/lift settings retain their current values. Saved Dyno positions are restored directly; correct an intentionally misplaced installation using its existing editor instead of deleting the stored installations.
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 own customizations.
Phase 4 of 5
SQL & items
No Mechanic SQL migration, table/column type/default change, new inventory item, image or streamed asset is required. Existing subscriptions, invoices, orders, vehicle tuning and role grants are retained. The subscription NPC change migrates existing configurator values through the normal load/save path; it is not an SQL schema migration.
Phase 5 of 5
Restart & test
Start providers/framework, Base 1.44.0, Jobs Base 1.47.0 and Mechanic 1.33.0, then reconnect. Check subscription terminal model/scenario/animation after saving, reopening and restarting; test two Instant Tuning NPC locations with different headings. Check that an interaction save updates active workshop points.
At two workshops with different ECU permissions, test both staff and public customers. Change an option while the tuning menu is open: only a now-forbidden pending choice should be removed, installed tuning and other permitted selections should remain, and a rejected basket should not charge money. Compare Dyno runs on the same vehicle before/after engine or turbo upgrades and after removing them, including a second run without reconnecting. The Dyno remains a simulated estimate; this update does not calibrate it to real-world power figures. Restart/reopen a saved Dyno installation and check its exact position and heading. Damage and repair a vehicle using your actual repair provider, then verify normal throttle response and its selected engine sound. Check workshop lifts after streaming away/back and 24-hour vehicle-document times.
Version 1.32.0
Highlights
Added an “Invoice myself” option to the tuning basket for authorized mechanics at their own workshop.
Added deletion of unpaid tuning orders together with cancellation of their unpaid invoice, subject to the existing cancellation permissions.
Notable Changes
Fixed an issue where inspection and registration points did not open the vehicle records app or authorize an explicitly shared workshop correctly.
Fixed an issue where disabled tuning stages could still appear as available choices.
Fixed an issue where repairs and non-minigame installation work ignored the configured progress-bar provider or its cancellation result.
Fixed an issue where tuning invoice actions were offered without the required role permission or rejected correctly configured workshop names beginning with “society_”.
Improved invoice rejection messages so staff can identify missing permissions, duty requirements or the wrong workshop without losing their tuning basket.
Fixed an issue where invoice receipts with an empty item list could fail to display.
Other Changes
Added playback for video records opened in the shared document viewer.
Fixed an issue where select menus inside dialogs could appear behind the dialog or lose its focus scope.
Improved scaling of shared tablet controls, signatures and document views across screen resolutions.
Changed Files
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.31.01.32.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
If Fire Job is installed, take all breathing bottles out of vehicle bottle storage before stopping the old server. 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_mechanicjob1.31.0 → 1.32.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.
Phase 2 of 5
Replace files
Use the matching 1.32.0 package. Delete the old sky_mechanicjob/source/ directory completely and insert the new directory. Replace sky_mechanicjob/fxmanifest.lua from the same package. Refresh the entire sky_mechanicjob/config/locales/ tree and merge your custom translations back. Merge sky_mechanicjob/config/config.lua as described in this view, preserving unrelated workshops, prices and custom values.
Do not merge old generated interface files into the new source/ directory.
Phase 3 of 5
Merge config
Prepare file changes while the server is stopped. Perform the /jobconfig, Creator and other in-game actions described in this section after starting the updated resources in step 5, during maintenance and before admitting players.
Changed file: sky_mechanicjob/config/config.lua, Config.Interactions.vehicle_registry. The generated defaults mirror it. No adv_config.lua, SQL, item, stream asset or permission-ID migration exists.
Exact changed fields: interaction false -> true; duty absent -> true; interactionDistance absent -> 2.5; marker.enabled false -> true with new type = 1, offset = vector3(0.0, 0.0, 0.0); blip.enabled false -> true with new sprite = 446, color = 5. public = false, unique = false, npc.enabled = false remain unchanged.
/jobconfig resource: sky_mechanicjob. This is an interaction definition at interactions.vehicle_registry, not a new individual feature switch. There is no vehicleRegistryInteraction setting. Definitions/capability flags and actual saved Workshop locations are different objects.
Existing feature keys are kuv and vehicleRegistration (Config.ToggleFeatures.kuv / .vehicleRegistration), both default false and unchanged. At least one must be enabled for the service point. The service-point interaction follows those feature switches; disabling both removes it.
Review saved interaction/location display overrides in the Mechanic Interaction System and Workshops area. Existing saved disabled marker/blip choices remain intentional overrides; defaults alone do not force them visible. Place/retain the actual vehicle_registry point in the desired workshop, review marker/blip visibility and workshop sharing for the intended job. No reset or destructive reimport is required.
New self-invoices use existing job billingSettings / fallback Config.Billing settings: enabled, allowTuningInvoices and allowImmediatePayment, plus duty, own workshop and the role's existing Create invoices permission. No new config setting is added. Exact configured job names beginning with society_ must be retained; do not rename jobs/accounts for this fix.
Unpaid-order deletion requires existing Cancel invoices permission and effective rank allowCancellation. It is not unrestricted deletion and does not refund paid/open orders through this path. Closing a receipt still leaves the order pending.
Progress provider selection remains in sky_base/config/config.lua (Config.progressbar), not a new Mechanic option or /jobconfig key. Update Base with the job; verify the configured provider during the installation check.
Dependencies: Base 1.43.0, Jobs Base 1.46.0, then Mechanic 1.32.0.
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. In the server console, run profiler record 1000, wait until profiler status reports completion, then run profiler saveJSON sky-release-profile.json. To disable the extra information, use setr sky_profiler 0 and restart. This is not a /jobconfig setting. Enabling it does not start recording 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; public configuration and provider files remain unchanged by that processing. If an older profiler package altered files outside source/, restore those once from the current download and reapply your own customizations.
Phase 4 of 5
SQL & items
No Mechanic SQL, inventory item, image or stream migration is required. Keep existing data and role grants. The new source provides the runtime changes; /jobconfig does not install source files or manifests.
Phase 5 of 5
Restart & test
Start framework/providers, Base 1.43.0, Jobs Base 1.46.0 and Mechanic 1.32.0, then reconnect. Test the placed inspection/registration point and a deliberately shared workshop. Check an authorized customer invoice, self-invoice and unpaid-order deletion, plus a role without invoice permission. Closing a receipt must leave its order pending. Test cancellation with the configured progress provider and confirm cancelled work does not install parts or complete a repair.
If a separate invoice-creation window remains invisible, provide the first F8 NUI error and the installed versions. The empty-item receipt correction does not establish the cause of every window-opening problem.
Version 1.31.0
Update Base to 1.42.0 and Jobs Base to 1.45.0 before installing sky_mechanicjob1.31.0.
Highlights
Added File Explorer directories for workshop vehicles, orders, invoices and subscriptions, with shared documents grouped by the issuing job.
Added Print and Share actions for saved workshop vehicles, orders and invoices, with explicit recipients and read-only access for receiving jobs.
Added payment of mechanic invoices from an authorized customer company account, including refunds to the original paying company.
Improved radial invoicing with a dedicated invoice printer, multiple catalogue reasons, multiline notes and matching customer receipts.
Notable Changes
Fixed an issue where on-duty staff could not invoice a customer from their own configured workshop tuning point.
Added temporary preservation of unsubmitted staff tuning baskets when closing and reopening the same vehicle at the same workshop.
Fixed an issue where closing the Stance Kit discarded authorized stance adjustments.
Fixed an issue where accepted vehicle tuning and electronic settings were lost or not reapplied after restarting the Mechanic resource.
Fixed an issue where anti-lag flames appeared at hidden stock exhausts instead of the installed exhaust outlets.
Fixed an issue where real plates containing spaces stopped matching vehicle keys after fake-plate compatibility handling.
Fixed an issue where saving a vehicle profile could restore recipients that another worker had revoked.
Fixed an issue where carried parts or parts-delivery boxes could be deposited without warehouse access; denied deposits now preserve the carried stock and delivery state.
Other Changes
Fixed an issue where custom performance-stage item quantities, including one item, were replaced when saving or reopening the configurator.
Improved workshop record updates while preserving unsaved input, and added clearer vehicle color values with RGB copying.
Optimized dyno updates to avoid repeatedly sending unchanged session data and completed results.
Optimized workshop configuration saves so unchanged creator settings and billing templates are left in place.
Improved workshop directories, subscriptions, tags, filters and form readability across screen sizes.
Fixed an issue where an older invoice response could change the currently displayed receipt, and kept paid receipts open until closed.
Update InstructionsA guided update for server owners1.30.01.31.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
These instructions cover 1.30.0 → 1.31.0. Complete older required migrations first if upgrading from an earlier version. Stop the server and back up the database, resource, customized files and saved job/creator data. Install Base 1.42.0 first, then Jobs Base 1.45.0 with its own SQL, inventory and printer requirements, then sky_mechanicjob1.31.0.
Phase 2 of 5
Replace files
Install the matching 1.31.0 package and replace these delivered paths:
Delete the old sky_mechanicjob/source/ directory and insert the complete new one, including its UI. Replace the complete locale directory. Preserve unrelated writable data and customized public configuration. There are no additional deleted or renamed package paths outside source/ in this release.
Always replace source/* and fxmanifest.lua from the same download, even with diagnostics off. The profiler may instrument only source Lua and the generated manifest; public configuration and compatibility files must match the uninstrumented release source. If an older profiler package modified public files, restore those once from the clean new package and reapply your custom edits.
Phase 3 of 5
Merge config
No options are added, removed or given new defaults in sky_mechanicjob/config/config.lua or config/adv_config.lua for this update. Preserve your job and workshop configuration. File Explorer and the saved-record Print/Share actions become available with Jobs Base 1.45.0; no separate activation flag or record import is required. Vehicle records, orders, invoices and subscriptions retain their app restrictions and role permissions. Own-record actions require an on-duty authorized worker. A recipient sees an explicitly shared record read-only. Other jobs use Shared Documents under the issuing workshop; existing explicit vehicle recipients are retained, while the old Jobs Base Share-tab record/link rules no longer grant document access. DOJ is optional and is needed only for DOJ-origin documents.
Shared-storage permissions: Keep the existing warehouse and full-access role settings. This correction requires no new configuration key, SQL step, permission ID or role reassignment. Update Jobs Base 1.45.0 and any installed Mechanic Job 1.31.0 together so shared storage and workshop deposits use the matching checks. Personal lockers, trunks and custom storage are outside this shared-storage refresh change.
Billing: The existing per-job Config.Jobs[*].billingSettings / /jobconfigBilling extension remains authoritative. Keep enabled, radialEnabled, allowTuningInvoices and allowImmediatePayment enabled for the corresponding workflows; retain your existing customer range and amount limits. Config.Billing remains the plaintext fallback for jobs without those values. There is no new company-payment switch or permission ID. Pay with Company is shown only to the actual invoice recipient whose current registered, active job grants Manage money and differs from the issuing workshop. It uses that company's balance and does not fall back to personal cash or bank funds. Ordinary invoices retain their configured instalment policy; tuning invoices require full payment before installation. Refunds of company-funded tuning go back to the original paying company, even if the customer changes jobs or is offline.
Tuning materials: Explicit quantities in the existing /jobconfig per-job tuningCostProfile extension, including quantity one, are now preserved. If an earlier version overwrote a custom quantity, enter the intended values again and save after this update; the old intended amounts cannot be recovered automatically. Old bare item-name defaults still migrate. No new setting or SQL migration is needed for this correction.
Workshop and vehicle state: An unsubmitted staff basket survives closing and reopening the same live vehicle at the same workshop during the current client session. It does not survive character logout, reconnect, resource restart or vehicle removal, and it does not save unpaid changes to the vehicle. Separately, already accepted runtime tuning can survive a Mechanic resource stop/start while the same vehicle exists; that is not persistence across a full server restart. The Stance Kit saves authorized changes when closed. Existing self-service interaction capability flags and saved per-location vehicle class restrictions are unchanged; do not add new capability flags as ordinary saved settings.
Document printing: Complete the Jobs Base 1.45.0 SQL and printer setup before using Print. The active inventory must support item metadata. Merge the supplied job_document entry from sky_jobs_base/config/inventory/items_ox.lua into your active inventory; for Ox Inventory, put it inside the existing ox_inventory/data/items.lua table and copy sky_jobs_base/config/inventory/job_document.png to ox_inventory/web/images/job_document.png:
In sky_jobs_base/config/printers.lua, keep Config.Printers.enabled = true and enable this resource in Config.Printers.resources. Configure a printer in /jobconfig → the job → Locations, then review the existing job printerSettings. paperEnabled and inkEnabled remain off by default; register and supply printer_paper or printer_ink only when the corresponding consumption setting is enabled. Saved records can be printed only when access and printer checks pass. The requester collects the finished item at the printer. A collected paper copy remains readable after the corresponding digital share is revoked. Printing is optional; it is not needed to browse or share records. Editing Ambulance or Mechanic configuration does not install these shared items or tables. For Mechanic, Config.Printers.resources.sky_mechanicjob = true is newly supplied by Jobs Base 1.45.0; add that entry to a customized existing resources table.
Optional performance diagnostics: Extra profiler information remains off by default. To make a support recording, put setr sky_profiler 1 in server.cfg before the Sky ensure lines and restart the server. Run profiler record 1000 in the server console, wait for profiler status to report completion, then run profiler saveJSON sky-release-profile.json. Share the file only when requested. To disable the extra information, use setr sky_profiler 0 and restart again. This is not a /jobconfig setting; enabling it does not record or upload anything automatically.
Phase 4 of 5
SQL & items
SQL: Back up the database. With the existing plaintext Config.AutoExecuteQuery = true, startup adds the two columns. If it is false, apply these matching statements from sky_mechanicjob/import.sql before using the new release:
ALTER TABLE `sky_mechanic_invoice_payments`
ADD COLUMN IF NOT EXISTS `payer_job` VARCHAR(64) NULL;
ALTER TABLE `sky_mechanic_vehicle_profiles`
ADD COLUMN IF NOT EXISTS `sharing_revision` BIGINT UNSIGNED NOT NULL DEFAULT 0;
payer_job records the company for each invoice payment; existing rows remain valid with NULL. sharing_revision protects vehicle recipient changes from stale edits, starting at zero for existing profiles. Existing profiles, recipients, invoices and tuning orders are retained. Jobs Base 1.45.0 also needs its own shared-record and printed-document tables; apply that dependency's migration first. Do not reset or delete business records. /jobconfig does not install SQL.
Inventory and assets: No Mechanic item, image outside the UI bundle, stream model or tuning-material definition is added or renamed. Replace the full UI through source/* and all locales. Optional record printing uses the Jobs Base job_document item/image and the job's configured printer supplies.
Fake-plate compatibility: Replace sky_mechanicjob/compat/fakeplates.lua and sky_mechanicjob/compat/fakeplates_realplate_native.lua. Restart the garage/key resources that load these compatibility files after Mechanic starts. Real plates such as ABC 123 must retain their internal space through keys, fake-plate application/removal and garage storage. Fake-plate input validation is unchanged. Previously compacted stored real plates cannot be reconstructed reliably by inserting guessed spaces; compare an affected entry with its original owned-vehicle record.
Phase 5 of 5
Restart & test
Restart the database/framework and any changed inventory first, then Base 1.42.0, Jobs Base 1.45.0 and Mechanic 1.31.0, followed by garage/key resources loading the updated fake-plate compatibility files. Confirm versions and resolve migration errors before admitting players. With two workers, test vehicle-share grant/revoke conflicts and verify an ordinary profile save cannot restore revoked recipients. Open File Explorer and verify vehicle, order, invoice and subscription access plus a receiving job's read-only view. If printing is configured, print, collect and open a document. Issue a radial invoice with multiple reasons; test cash, card, authorized company payment, insufficient company funds and a tuning refund back to the original company. Verify the workshop receives the payment through the configured banking adapter. At a real workshop point, select tuning, close/reopen, invoice the nearby customer, pay in full and install. Reopen the Stance Kit after closing and restart only Mechanic with the same tuned vehicle present. Check a mixed-space real plate through keys, fake-plate removal and garage storage, plus anti-lag on stock and modified exhausts. Run a dyno session with an observer. Save/reopen custom quantity-one stages in /jobconfig.
Shared-storage role check: Use a regular employee role with warehouse access, not the highest rank or a full-access role, since those retain their existing bypass. Confirm that permitted stock can be transferred. Remove warehouse access through role management while storage is open: it must close, and reopening or transferring stock must be denied. Restore access and reopen without reconnecting. Restrict an item and a weapon for that role, then verify that withdrawals are blocked, including a weapon whose stored name uses different capitalization and any supported carried-item withdrawal. The restriction list blocks withdrawal; it does not reserve stock for that role. Deposits still require warehouse access. With access retained, change a restriction and confirm that the open view updates without losing the current selection or entered quantities.
Carried-parts deposit check: With an on-duty employee carrying a part, revoke warehouse access and attempt to deposit it into shared storage. Repeat with a parts-delivery box. Each denied deposit must leave the carried stock and delivery state unchanged. Restore warehouse access and confirm that both deposits succeed without reconnecting.
Version 1.30.0
Update Base to 1.41.0 and Jobs Base to 1.44.0 before installing sky_mechanicjob1.30.0.
Highlights
Added tuning invoices for nearby customers, with installation becoming available only after the invoice is paid in full.
Added an invoice action to the mechanic radial menu and per-workshop controls for invoicing and customer distance.
Added nearby vehicle capture and nearby owner selection when creating workshop vehicle records.
Notable Changes
Fixed an issue where repair-kit animations could start for a vehicle outside the configured repair range or continue after a rejected repair.
Improved vehicle pushing with gentler wheel steering while keeping forward and backward movement separate.
Improved workshop vehicle records by separating the actual model from its displayed name and filling in the vehicle plate during capture.
Optimized workshop order loading to reduce unnecessary server work when viewing orders.
Improved engine-hoist placement updates after workshop settings are changed.
Other Changes
Added missing inventory images for drift tyres, blank plates, fake-plate kits, plate printers and plate scanners.
Optimized nearby-vehicle capture for areas containing many vehicles.
Updated translations and tuning checkout feedback for customer invoices and nearby vehicle records.
Update InstructionsA guided update for server owners1.29.11.30.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update Base to 1.41.0 and Jobs Base to 1.44.0 before installing sky_mechanicjob1.30.0. These instructions cover 1.29.1 → 1.30.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.
Phase 2 of 5
Replace files
Install the matching 1.30.0 download. Update every path in Changed Files, delete and reinsert sky_mechanicjob/source/*, and replace sky_mechanicjob/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.
Phase 3 of 5
Merge config
In sky_mechanicjob/config/config.lua, add the following three fields to each relevant Config.Jobs[*].billingSettings table and to the existing Config.Billing fallback table. All three fields were absent in 1.29.1:
With /jobconfig, edit Mechanic → job → Billing: Invoice radial action (billingSettings.radialEnabled), Invoice tuning customers (billingSettings.allowTuningInvoices) and Customer distance (billingSettings.customerRange, 1–20 m). Keep existing explicit job settings. Config.Billing is the file-based compatibility fallback for missing per-job billing fields; it is not a second global configurator section.
Billing and immediate payments must be enabled. The mechanic must be on duty and have the existing CREATE_BILLING permission. A normal tuning invoice is sent to the nearest other eligible player within range; check the recipient before issuing it. The linked order remains unavailable until full payment, even if ordinary invoices allow partial payment. Cancelling the unpaid invoice closes its blocked order. Public self-service, instant tuning and administrator tuning retain their own checkout flows.
In sky_mechanicjob/config/adv_config.lua, remove Config.VehiclePush.steeringDegreesPerSecond (previous default 34.0). Steering now uses limited wheel movement; there is no replacement setting and no saved configurator key to migrate. Keep the other VehiclePush values.
Nearby owner selection associates a workshop record with a character. It does not transfer legal framework vehicle ownership. No other configuration values change.
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.
Phase 4 of 5
SQL & items
No database migration or new item type is required. Existing invoice and order storage supports the new payment state. Copy the new images from sky_mechanicjob/config/inventory/ to the matching image directory of your inventory if you use drift_tyres, blank_plate, fake_plate_kit, plate_printer or plate_scanner. Preserve existing item definitions, workshop orders, invoices and vehicle records.
Phase 5 of 5
Restart & test
Restart the database, framework and any edited inventory first, then Base, Jobs Base and the installed job resources. Confirm 1.30.0 and resolve startup errors before admitting players. With two players, send a tuning invoice, pay it in full and install the order. Verify that an unpaid or cancelled invoice cannot release installation. Check the selected recipient, range, cash/card payment and workshop income. Capture a nearby vehicle and owner without changing legal ownership, try a repair at the configured distance, push a vehicle gently in both directions and inspect stock quantities in an order.
Hotfix
Version 1.29.1
Update Base to 1.40.1 and Jobs Base to 1.43.1 before installing Mechanic 1.29.1.
Highlights
Fixed an issue where workshops without engine hoist locations repeatedly requested workshop data, creating unnecessary network traffic.
Notable Changes
Removed repeated workshop requests while waiting for the initial workshop setup to become available; later location changes still apply automatically.
Changed missing engine hoists to be restored when a player takes them or a workshop update arrives, removing the periodic background check.
Other Changes
No additional changes.
Changed Files
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.29.01.29.1
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Upgrade 1.29.0 to 1.29.1; complete earlier update instructions first if needed. Stop the server and back up the resource, database, customized files and saved workshop settings. Install Base 1.40.1 and Jobs Base 1.43.1 before Mechanic 1.29.1.
Phase 2 of 5
Replace files
Delete the complete old sky_mechanicjob/source folder and insert its replacement from the 1.29.1 package. Replace sky_mechanicjob/fxmanifest.lua from the same package. Preserve configuration, locales, compatibility files and persistent data outside source.
Phase 3 of 5
Merge config
No manual configuration values or saved /jobconfig settings change. Keep existing workshop shops and engine hoist locations. No SQL, item or locale migration is required; do not reset or reimport the database for this hotfix.
Phase 4 of 5
SQL & items
No SQL, item or locale migration is required. Keep existing workshop data; do not reset or reimport the database for this hotfix.
Phase 5 of 5
Restart & test
Start Base, Jobs Base and Mechanic in that order and confirm Mechanic 1.29.1. Test a workshop without a hoist, then place, move and remove a hoist in /jobconfig. Check the updates on connected players, taking an existing hoist and server/client logs for recurring timeout errors.
Version 1.29.0
Update Base to 1.40.0 and Jobs Base to 1.43.0 before installing sky_mechanicjob1.29.0. Vehicle documents also require Mechanic 1.29.0 and Police 1.32.0 together.
Highlights
Added optional vehicle inspections with car and motorcycle checklists, expiry dates, reinspection fees and signed reports.
Added optional vehicle registration, ownership transfers and deregistration with owner consent and permanent document history.
Improved vehicle records with nearby-customer selection, compact details, separate history and signed document previews.
Notable Changes
Fixed an issue where vehicle records could keep the plate field locked when creating a new entry after viewing another vehicle.
Fixed an issue where electronic tuning options could disappear from saved instant-tuning price profiles.
Fixed an issue where saved tuning could overwrite vehicle extras restored by a garage.
Fixed an issue where nearby observers or delayed garage restoration could overwrite live engine-sound changes and previews.
Improved dynamometer engine-speed synchronization for nearby observers.
Fixed an issue where Handling Editor diagnostics bypassed the central debug settings, including messages on player disconnect.
Fixed an issue where switching propulsion settings did not consistently apply the requested driven wheels.
Fixed an issue where resetting ECU effects on an aircraft could apply an unsuitable vehicle effect.
Added a confirmation for eight-gear handling settings that explains the live gear limit before applying them.
Added confirmed invoice income to the organization finance history.
Other Changes
Improved invoice and subscription layouts and kept vehicle-record panels readable across tablet themes.
Optimized repeated ECU, engine-sound, lighting and Two-Step checks while keeping installed tuning active.
Removed unnecessary synchronization diagnostics while retaining validation and persistence.
Updated bundled tuning and interface images with smaller files.
Update InstructionsA guided update for server owners1.28.01.29.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update Base to 1.40.0 and Jobs Base to 1.43.0 before installing sky_mechanicjob1.29.0. Vehicle documents also require Mechanic 1.29.0 and Police 1.32.0 together. These instructions cover 1.28.0 → 1.29.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.
Phase 2 of 5
Replace files
Install the matching 1.29.0 package. Update every path in Changed Files, delete and reinsert sky_mechanicjob/source/*, and replace sky_mechanicjob/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.
Phase 3 of 5
Merge config
Merge these additions into sky_mechanicjob/config/config.lua. Paste assignments after their corresponding existing parent table declarations. Both new features are disabled by default. Every path in this table was absent in 1.28.0:
Also add the complete new interaction definition. All six leaf values are new and false: Config.Interactions.vehicle_registry.public, .interaction, .unique, .marker.enabled, .npc.enabled, and .blip.enabled. This is the service-point capability definition; changing it does not create a workshop location:
For managed settings, open /jobconfig > sky_mechanicjob > Settings and search for the inspection/registration fields using the exact keys above. Saved overrides take precedence; missing values use the new defaults. With Config.UseJobConfigurator = false, maintain the Lua values directly. Enable only the services you want to offer.
Create a Vehicle inspection / registration point (vehicle_registry) in the workshop's Locations editor and assign it to the intended job. The vehicle must be at that point within the configured distance. Grant the relevant role permissions: 1401 reads records, 1402 performs inspections, 1403 handles registration/deregistration, and 1404 revokes documents issued by that job. Staff must be on duty. The actual owner must be nearby and confirm with a drawn signature; selecting a nearby customer does not replace owner consent.
The defaults give inspections 30 real days of validity, a two-day warning and a ten-minute session. Registration requires a valid inspection by default. Changing validity affects new documents; it does not renew an old certificate. Ownership transfers require the registration workflow. Fees use normal Mechanic invoices, including applicable billing settings; an issued document is not proof that its invoice was paid. No additional direct payment is required by this update.
Saved instantTuningProfile.optionCostByOptionId profiles now regain missing electronic-option entries from shipped defaults during loading/import. Existing prices remain unchanged. Review the completed price list in /jobconfig after updating; no manual profile reset is required. Dyno ground settings already shipped in 1.28.0 do not require another migration.
Removed diagnostic setting:Config.HandlingEditor.debugEnabled changes from false to removed. Delete that property from a customized sky_mechanicjob/config/config.lua. Its /jobconfig key handlingEditorDebugEnabled is also retired; existing saved overrides are ignored, so no SQL deletion or settings reset is required. Detailed Handling Editor traces now follow Sky Base's central debug level. For support diagnostics, enable Config.debugLevels.debug in sky_base/config/config.lua, then restart Base and dependent resources. Restore it to its unchanged default false afterward. Keep Config.debug and Config.debugLevels.all at their unchanged default false when selecting individual levels. These Base settings are maintained in files, outside /jobconfig.
The existing Handling Editor performance controls remain unchanged: Config.HandlingEditor.performanceChecksEnabled = true, Config.HandlingEditor.performanceWarningMs = 25, Config.HandlingEditor.payloadWarningBytes = 262144, and Config.HandlingEditor.performanceSummaryIntervalMs = 60000. Threshold warnings now respect Base's central warning level; enabling debug is not required for those warnings.
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.
Phase 4 of 5
SQL & items
Back up the vehicle, registry and invoice tables. The normal Mechanic startup migration adds sky_mechanic_invoices.registry_operation_id CHAR(36) NULL and unique index uniq_mechanic_registry_operation when Config.AutoExecuteQuery = true.
With automatic SQL disabled, run the shipped sky_mechanicjob/vehicle_registry.sql against the existing game database. Merely rerunning the invoice CREATE TABLE IF NOT EXISTS in import.sql does not add this column to an existing table. For new installations, the updated import.sql includes it.
Complete the Base owned-vehicle identifier upgrade and import sky_jobs_base/vehicle_registry.sql when Jobs Base automatic SQL is disabled. The shared finance update also needs sky_jobs_logs.payment_reference and its unique index; follow Jobs Base 1.43.0 before starting Mechanic. Keep existing ownership, tuning, invoice and document data. No new items are required. Never clear the registry, regenerate vehicle IDs or issue old certificates automatically to resolve a migration error.
Phase 5 of 5
Restart & test
Confirm version 1.29.0 and all schema migrations. Leave both new switches off until a test workshop, permissions and service point are ready. With the owner nearby, issue an inspection, sign it, register the vehicle and inspect the history from Mechanic and Police. Check expiry, owner rejection, off-duty rejection and one invoice per operation. Verify the actual society credit separately from document issuance. Then test an existing instant-tuning profile, a garage vehicle with extras, propulsion changes and the eight-gear confirmation. With two clients, test engine-sound preview, cancellation and saved restoration after a garage spawn, streaming away/back and a change of vehicle controller. Check that a nearby dynamometer observer sees the current engine revs. With central debug disabled, verify that ordinary Handling Editor use and player disconnect do not force debug traces; enable the debug level for a support trace and restore it afterward.
Version 1.28.0
Update sky_base to 1.39.0 and sky_jobs_base to 1.42.0 before installing sky_mechanicjob1.28.0.
Highlights
Improved tuning saves so confirmed purchases and completed installations update the vehicle's garage record before it is parked.
Fixed an issue where cancelling a paint preview could change unrelated vehicle settings or fail to restore the original color.
Fixed an issue where changing a vehicle's drivetrain could leave it unable to move.
Notable Changes
Fixed an issue where saved handling changes could be lost when a vehicle was restored or entered again.
Added an option to disable the handling editor and its automatic vehicle rules while keeping the rest of the mechanic job available.
Improved gear-count editing by explaining unsupported changes before they can be saved and preserving unchanged factory gear counts.
Improved engine-sound previews and synchronization so cancelled changes restore the original sound and saved changes reach nearby vehicles.
Added separate Extras and Liveries sections under the tuning menu's More button.
Improved the tuning basket with clearer failure messages and disabled payment buttons while a purchase is being processed.
Changed mobile dyno placement to accept any ground material that meets the existing flatness and clearance requirements.
Other Changes
Fixed an issue where the dyno controls could show missing or untranslated text until another interface had been opened.
Fixed an issue where opening the mobile dyno could fail when loading its active sessions.
Improved the cleanup of tyre data for vehicles that no longer exist, including compatibility with different database collations.
Improved ownership checks used during cleanup by adding a missing vehicle-plate index when needed.
Removed misleading handling-performance warnings caused only by waiting for a network response.
Optimized engine-sound restoration checks for vehicles without saved Mechanic sound changes.
Added optional performance diagnostics to help support investigate lag and delays, with diagnostics disabled by default.
Changed Files
sky_mechanicjob/config/adv_config.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/import.sql
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.27.11.28.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.39.0 and sky_jobs_base to 1.42.0 before installing sky_mechanicjob1.28.0. These steps cover 1.27.1 → 1.28.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.
Phase 2 of 5
Replace files
Install the matching 1.28.0 package. Update every path listed in Changed Files, delete and reinsert sky_mechanicjob/source/*, and replace sky_mechanicjob/config/locales/* completely. Merge the configuration changes in this tab into your customized files. Preserve writable data and generated user content.
Required profiler files
For the profiler update, replace the complete sky_mechanicjob/source/* tree and sky_mechanicjob/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.
Phase 3 of 5
Merge config
In sky_mechanicjob/config/config.lua, add the previously absent feature switch:
config/config.lua
Config.ToggleFeatures.handlingEditor = true
The new default true keeps the handling editor and its automatic plate/model rules enabled. Set it to false to disable both. This is separate from the existing Config.ToggleFeatures.customHandling, which remains unchanged. With Config.UseJobConfigurator = true, use Mechanic → Features → Handling editor, feature key handlingEditor; saved feature overrides take precedence. With the configurator disabled, use the file value. Respawn vehicles after disabling previously applied handling changes; switching the feature off does not reset vehicles already in the world.
In sky_mechanicjob/config/adv_config.lua, delete Config.MobileDyno.placement.acceptedMaterials. The old list was { "tarmac", "concrete_pavement", "paving_slab", "road", "concrete", "concrete_solid" }; it is no longer read. There is no replacement material list. maxSlopeDegrees = 1.0, maxHeightSpread = 0.04, rayStartHeight = 2.0, rayDepth = 5.0, and the footprint probes stay unchanged. Placement still needs valid, sufficiently flat ground. The removed material list and the model-specific probes are file settings; existing /jobconfig slope and height settings continue to apply.
Before using the new tuning save path, follow Garage Integration and the matching ESX, QBCore, or Ox instructions. Some framework versions need the documented vehicle-property additions to preserve paint types and separate livery values. Check your actual installed files and keep custom changes. In particular, QBCore with MSK Garage 5.6 needs a review of the different vehicle-property formats; installing field additions alone does not establish compatibility.
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.
Phase 4 of 5
SQL & items
Back up sky_mechanic_vehicle_tuning and your framework's owned-vehicle table before the first start. The automatic migration, controlled by Config.AutoExecuteQuery, adds nullable legacy_properties LONGTEXT DEFAULT NULL to sky_mechanic_vehicle_tuning and ensures a non-unique plate index on owned_vehicles (ESX) or player_vehicles (QBCore/Qbox) when needed. Existing suitable indexes and vehicle rows are retained.
If Config.AutoExecuteQuery = false, run the VEHICLE OWNERSHIP INDEX block from sky_mechanicjob/import.sql against your active database. It starts with SET @sky_mechanic_ownership_table = 'owned_vehicles';; change that value to 'player_vehicles' for QBCore/Qbox. Then run:
ALTER TABLE `sky_mechanic_vehicle_tuning`
ADD COLUMN IF NOT EXISTS `legacy_properties` LONGTEXT NULL;
Confirmed tuning now updates owned_vehicles.vehicle on ESX, the existing QBCore/Qbox vehicle properties, or the Sky job-garage vehicle record. On conversion, the previous full Mechanic snapshot is saved once in legacy_properties; Mechanic-specific extras remain in its active record. Existing vehicles are not converted in bulk. Keep those backup values and verify an existing vehicle after a confirmed save. The older /migrate command is not a bulk conversion tool for this change.
Replace all Mechanic locales. No new inventory item, image, streamed model, or provider secret is introduced by this release.
Phase 5 of 5
Restart & test
Confirm a tuning purchase, check the existing garage record, and retrieve the vehicle twice. Verify paint, RGB-to-palette changes, liveries, extras, engine sound, and handling before entering the vehicle and from a second player's view. Cancel a paint preview and confirm unrelated tuning stays intact. Test drivetrain conversion, the handling-editor switch, and a mobile dyno on valid flat ground. Check persistence again after a server restart.
Version 1.27.1
Update sky_jobs_base to 1.41.1 and use sky_base1.38.0 before updating sky_mechanicjob.
Highlights
Fixed an issue where tuning purchases could succeed with insufficient funds when the payment provider allowed an overdraft.
Fixed an issue where Anti-Lag installed on a spawned, unsaved vehicle could be reported as missing.
Notable Changes
Fixed an issue where the mobile Dyno could sit above the ground after placement.
Added controls for sharing completed Dyno measurements with nearby players, including recipient selection and send feedback.
Other Changes
Fixed an issue where received Dyno results could disappear while the tablet opened or refreshed.
Improved the standalone tablet presentation of shared Dyno results and restored normal input when leaving the Dyno view.
Changed Files
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
sky_mechanicjob/stream/sky_mechanic_props.ytyp
sky_mechanicjob/stream/sky_mobile_dyno.ydr
Update InstructionsA guided update for server owners1.27.01.27.1
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_jobs_base to 1.41.1 and use sky_base1.38.0 before updating sky_mechanicjob. These steps cover 1.27.0 → 1.27.1; complete earlier release instructions first if you are upgrading from an older version. Stop the server and back up the resource, database, saved Job Configurator settings and custom configuration. Preserve generated reports and other writable data.
Phase 2 of 5
Replace files
Install 1.27.1 as a matching package. Update every path in Changed Files, delete and reinsert sky_mechanicjob/source/*, and replace sky_mechanicjob/config/locales/* completely. Merge the configuration instructions in this tab into customized files; retain intentional settings and persistent data.
Phase 3 of 5
Merge config
No config/config.lua, config/adv_config.lua or /jobconfig value changes are required for this patch. Keep existing Anti-Lag, vehicle persistence, payment and Mobile Dyno settings. The Anti-Lag correction supports the existing temporary tuning path for spawned vehicles; it does not make those vehicles persistent across deletion or server restarts.
Sharing is available from a completed measurement owned by the operator. Open the sharing controls, select a nearby player and send the result. Existing duty, distance and session checks still apply. No additional monitor is required for direct player sharing.
Phase 4 of 5
SQL & items
Replace sky_mechanicjob/stream/sky_mobile_dyno.ydr and sky_mechanicjob/stream/sky_mechanic_props.ytyp together with the matching source package. The corrected placement uses updated collision bounds; no manual station Z offset is required for the shipped model. Replace all sky_mechanicjob/config/locales/* for the sharing controls.
No new SQL migration, inventory item, image or provider secret is introduced. Preserve stored tuning, Dyno measurements, orders and balances. Follow any unfinished 1.27.0 installation steps when upgrading from an older version.
Phase 5 of 5
Restart & test
Start providers, Base, Jobs Base and Mechanic in that order. Check a tuning purchase with insufficient and sufficient funds, Anti-Lag on a spawned vehicle, mobile Dyno placement, leaving its tablet view and sharing a completed measurement with a second nearby player.
Version 1.27.0
Update sky_base to 1.38.0 and sky_jobs_base to 1.41.0 before updating sky_mechanicjob.
Highlights
Added a standalone administrator handling editor with simple and advanced controls, field explanations, flags, validation, saved profiles, and vehicle-specific rules.
Improved the mobile Dyno with a physical control panel, a dedicated tablet workspace, and independently placeable result monitors.
Added inventory-based Dyno placement, cancellation, pickup, and controls through the mechanic radial menu.
Added staged power sweeps, sustained-load tests, steady holds, and coastdown runs with cooling-fan preparation and temperature warnings.
Notable Changes
Added road-test telemetry, acceleration and braking measurements, a driving overlay, and handling recommendations based on recorded runs.
Added handling profile revisions, personal workspaces, fleet-rule history, and clipboard-based XML import and export.
Improved handling edits so repeated applications preserve the original vehicle baseline, configured field limits remain stable, and unsuccessful live changes are reported.
Improved Dyno operation for seated drivers and external operators, including run cleanup, distance checks, and access validation.
Improved Dyno graphs with elapsed-time axes, separate power and torque scales, smoother stage transitions, saved results, and sharing to result monitors.
Improved Dyno fan controls, wheel and roller presentation, screen alignment, and tyre-squeal suppression.
Added player-configurable mechanic, nitro, tuning, and editor key bindings.
Removed the exhaust-smoke color tuning option and retired its saved configuration while preserving historical paid-order refund handling.
Fixed an issue where a driver could not toggle an installed Anti-Lag kit unless they were the registered vehicle owner.
Other Changes
Improved workshop lift, engine-hoist, parts-delivery, and self-service tuning updates so older responses cannot replace newer creator data.
Improved handling editor layout, theme consistency, dropdown behavior, and telemetry-mode selection when reopening or applying changes.
Updated all bundled mechanic gameplay translations and the shared Job Configurator labels required by the new settings.
Updated Dyno models, animations, audio, inventory icons, and handling field definitions required by the new tools.
Update InstructionsA guided update for server owners1.26.01.27.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.38.0 and sky_jobs_base to 1.41.0 before updating sky_mechanicjob. Stop the server and back up the complete sky_mechanicjob resource, its database and inventory data, saved Job Configurator settings where applicable, and intentional public configuration edits. Preserve writable reports and other generated data outside the replaceable source files.
Phase 2 of 5
Replace files
Install 1.27.0 as a consistent package. Replace every file listed in Changed Files, delete and reinsert sky_mechanicjob/source/*, and replace sky_mechanicjob/config/locales/* completely. Merge the public configuration changes listed in this tab into your customized files; do not copy old configuration files over the new package wholesale. Keep the manifest, built UI, runtime and dependencies from the matching release set.
Phase 3 of 5
Merge config
In sky_mechanicjob/config/config.lua, add the complete Config.Keybinds block. This table and its paths were absent in 1.26.0; 1.27.0 uses the following string defaults instead of scattered settings or fixed controls. Preserve your chosen keys when transferring old settings.
With Config.UseJobConfigurator = true, open /jobconfig → this resource → General → Keybinds. Every key inside the block is also its exact saved setting ID; for example Config.Keybinds.mechanicDynoControl38 is saved under the same final name. Saved overrides take precedence over the generated defaults. Numeric overrides migrate to their corresponding QWERTY key, and -1 migrates to an empty string. An empty string means no initial binding. Players retain their own assignments in Settings → Key Bindings → FiveM; changing a server default does not overwrite those assignments.
With Config.UseJobConfigurator = false, edit these paths in the file and restart the resource. Keep mouse/controller prefixes exactly as shown. Command permissions and Config.AutoExecuteQuery remain file settings; their reordering does not change their values.
Remove the following old paths after transferring your overrides. The new paths all live in config/config.lua; the saved setting ID is the final segment of each new path.
Old path in 1.26.0
Old default
New path in 1.27.0
New default
Config.Nitro.activationKey in config/adv_config.lua
"LSHIFT"
Config.Keybinds.nitroActivationKey
"LSHIFT"
Move Config.AutoExecuteQuery and the complete Config.CommandPermissions table from sky_mechanicjob/config/adv_config.lua to sky_mechanicjob/config/config.lua, preserving your existing values and groups. Remove the old definitions from adv_config.lua so they cannot overwrite the new table. Add the previously absent permission and feature flag:
The permission remains plaintext/global. mobileDyno is a saved /jobconfig feature toggle. Add the complete new handling editor block to config/config.lua; all these paths were absent in 1.26.0:
config/config.lua
Config.HandlingEditor = {
defaultTab = "advanced", -- simple, advanced, flags, inspector, telemetry, profiles, fleet, export
-- Suggested percentage window above/below the captured vehicle basis.
-- A non-default field maximum below takes precedence over the upper endpoint.
-- The vehicle basis remains stable after Apply, so reopening cannot compound this range.
sliderMaximumDeviationPercent = 30,
-- Optional hard maximums for every numeric handling field. Fields not listed here use the
-- default maximum from data/handling_editor_schema.json (fallback: 1,000,000,000).
-- Overrides may raise or lower that default, up to the editor's numeric ceiling of
-- 1,000,000,000 (2,147,483,647 for integers). The same limits are editable in /jobconfig; they do not
-- change a vehicle value by themselves. A non-default maximum is also the slider endpoint;
-- fields using their default maximum retain the suggested vehicle-basis slider window.
-- Example: ["CHandlingData.fInitialDriveMaxFlatVel"] = 250.0,
fieldMaximums = {},
layerInspectorEnabled = true,
fieldDocumentationEnabled = true,
validatorEnabled = true,
blockCriticalValidation = true,
telemetryCoachEnabled = true,
profileVersioningEnabled = true,
fleetManagerEnabled = true,
flagSearchEnabled = true,
workspacesEnabled = true,
maxProfileRevisions = 30,
maxFleetResults = 200,
maxWorkspacesPerAdmin = 12,
coachMinimumSamples = 20,
coachWheelSlipWarningKmh = 12.0,
coachMinimumBrakeDeceleration = 6.0,
-- Detailed traces are opt-in; threshold warnings use the queued Sky.Debug logger.
debugEnabled = false,
performanceChecksEnabled = true,
performanceWarningMs = 25,
payloadWarningBytes = 262144,
performanceSummaryIntervalMs = 60000
}
With /jobconfig, the saved keys are handlingEditorDefaultTab, handlingEditorSliderMaximumDeviationPercent, handlingEditorLayerInspectorEnabled, handlingEditorFieldDocumentationEnabled, handlingEditorValidatorEnabled, handlingEditorBlockCriticalValidation, handlingEditorTelemetryCoachEnabled, handlingEditorProfileVersioningEnabled, handlingEditorFleetManagerEnabled, handlingEditorFlagSearchEnabled, handlingEditorWorkspacesEnabled, handlingEditorMaxProfileRevisions, handlingEditorMaxFleetResults, handlingEditorMaxWorkspacesPerAdmin, handlingEditorCoachMinimumSamples, handlingEditorCoachWheelSlipWarningKmh, handlingEditorCoachMinimumBrakeDeceleration, handlingEditorDebugEnabled, handlingEditorPerformanceChecksEnabled, handlingEditorPerformanceWarningMs, handlingEditorPayloadWarningBytes, and handlingEditorPerformanceSummaryIntervalMs. They map to the same suffixes in Config.HandlingEditor. Each Config.HandlingEditor.fieldMaximums[field_id] override uses the exact saved key handlingEditorMaximum__<field_id> and must be checked under the matching handling field. Saved overrides win; changing a maximum does not itself change a vehicle. With the configurator disabled, the file is authoritative.
Add the complete new Config.MobileDyno block to sky_mechanicjob/config/adv_config.lua. Every path in this block was absent in 1.26.0; retain the model-specific coordinates for the supplied models only:
Review these values in Mobile Dyno and saved installations. The default tablet operating distance is 20.0 metres, pickup distance is 3.5, and requireOnDuty stays enabled in the new block. Item placements are not persistent by default. Model identifiers, screen geometry, roller geometry, animation definitions, thermal simulation and test-profile shapes remain plaintext Lua settings; they are not ordinary saved location fields. Place the supplied Dyno on a valid flat surface and use the editor for each installation rather than copying one model's coordinates to another model. Existing explicit overrides remain effective.
Remove Config.Jobs[*].tuningCostProfile.optionCostByOptionId.electronic_exhaust_smoke_color, including its enabled and complete cost table. This option was enabled in the old shipped workshop, with prices from 0.0 to 4.65 and ecu_tuning_kit requirements; it has no replacement. The updated runtime retires old job and instant-tuning overrides and ignores old vehicle smoke-color values. Keep paid historical orders and existing ECU kits for their remaining supported uses and refund handling. No Two-Step default value changes in this release; retain your current Two-Step settings.
Phase 4 of 5
SQL & items
With Config.AutoExecuteQuery = true, let startup create the seven new handling tables. Otherwise apply the matching new sky_mechanicjob/import.sql statements before starting the resource. Existing vehicle tuning, Dyno result history, orders and balances must be retained. Exact new schema:
migration.sql
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_profiles` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL,
`vehicle_label` VARCHAR(120) NULL,
`vehicle_model` VARCHAR(64) NULL,
`vehicle_model_hash` BIGINT UNSIGNED NULL,
`handling_name` VARCHAR(64) NULL,
`snapshot` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(120) NULL,
`created_by_name` VARCHAR(120) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_mechanic_handling_profiles_name` (`name`),
INDEX `idx_mechanic_handling_profiles_model` (`vehicle_model_hash`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_overrides` (
`id` INT NOT NULL AUTO_INCREMENT,
`scope` VARCHAR(16) NOT NULL,
`target_key` VARCHAR(80) NOT NULL,
`target_label` VARCHAR(120) NOT NULL,
`vehicle_model_hash` BIGINT UNSIGNED NULL,
`profile_name` VARCHAR(64) NULL,
`snapshot` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(120) NULL,
`created_by_name` VARCHAR(120) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_mechanic_handling_override` (`scope`, `target_key`),
INDEX `idx_mechanic_handling_overrides_scope` (`scope`),
INDEX `idx_mechanic_handling_overrides_model` (`vehicle_model_hash`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_runs` (
`id` INT NOT NULL AUTO_INCREMENT,
`vehicle_label` VARCHAR(120) NULL,
`vehicle_model_hash` BIGINT UNSIGNED NOT NULL,
`plate` VARCHAR(24) NULL,
`mode` VARCHAR(16) NOT NULL,
`top_speed` DECIMAL(8,2) NOT NULL DEFAULT 0,
`distance` DECIMAL(10,2) NOT NULL DEFAULT 0,
`elapsed` DECIMAL(10,3) NOT NULL DEFAULT 0,
`max_acceleration` DECIMAL(8,3) NOT NULL DEFAULT 0,
`max_deceleration` DECIMAL(8,3) NOT NULL DEFAULT 0,
`max_wheel_slip` DECIMAL(8,3) NOT NULL DEFAULT 0,
`zero_to_sixty` DECIMAL(10,3) NULL,
`zero_to_hundred` DECIMAL(10,3) NULL,
`zero_to_two_hundred` DECIMAL(10,3) NULL,
`hundred_to_zero` DECIMAL(10,3) NULL,
`quarter_mile` DECIMAL(10,3) NULL,
`kilometer` DECIMAL(10,3) NULL,
`samples` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(120) NULL,
`created_by_name` VARCHAR(120) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_mechanic_handling_runs_model` (`vehicle_model_hash`, `created_at`),
INDEX `idx_mechanic_handling_runs_plate` (`plate`, `created_at`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_profile_revisions` (
`id` INT NOT NULL AUTO_INCREMENT,
`profile_id` INT NOT NULL,
`revision` INT NOT NULL,
`note` VARCHAR(500) NULL,
`release_status` VARCHAR(16) NOT NULL DEFAULT 'draft',
`telemetry_run_id` INT NULL,
`snapshot` LONGTEXT NOT NULL,
`created_by_identifier` VARCHAR(120) NULL,
`created_by_name` VARCHAR(120) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_mechanic_handling_profile_revision` (`profile_id`, `revision`),
INDEX `idx_mechanic_handling_revisions_profile` (`profile_id`, `created_at`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_preferences` (
`identifier` VARCHAR(120) NOT NULL,
`preferences` LONGTEXT NOT NULL,
`favorites` LONGTEXT NOT NULL,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`identifier`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_workspaces` (
`id` INT NOT NULL AUTO_INCREMENT,
`owner_identifier` VARCHAR(120) NOT NULL,
`owner_name` VARCHAR(120) NULL,
`name` VARCHAR(64) NOT NULL,
`vehicle_label` VARCHAR(120) NULL,
`vehicle_model_hash` BIGINT UNSIGNED NULL,
`snapshot` LONGTEXT NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_mechanic_handling_workspace_owner_name` (`owner_identifier`, `name`),
INDEX `idx_mechanic_handling_workspaces_owner` (`owner_identifier`, `updated_at`)
);
CREATE TABLE IF NOT EXISTS `sky_mechanic_handling_fleet_history` (
`id` INT NOT NULL AUTO_INCREMENT,
`scope` VARCHAR(16) NOT NULL,
`target_key` VARCHAR(80) NOT NULL,
`target_label` VARCHAR(120) NOT NULL,
`vehicle_model_hash` BIGINT UNSIGNED NULL,
`action` VARCHAR(24) NOT NULL,
`snapshot` LONGTEXT NULL,
`created_by_identifier` VARCHAR(120) NULL,
`created_by_name` VARCHAR(120) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_mechanic_handling_fleet_target` (`scope`, `target_key`, `created_at`),
INDEX `idx_mechanic_handling_fleet_created` (`created_at`)
);
Register mobile_dyno (weight 25000) and mobile_dyno_monitor (weight 5000) in the active inventory. The ESX-style items inserts in import.sql are idempotent; QBCore, Qbox and ox_inventory normally need their own shared item definitions. The runtime registers usable actions through the shared prop service. Copy the new config/inventory/mobile_dyno.png and config/inventory/mobile_dyno_monitor.png into the inventory's image directory.
Install every listed Dyno stream file, the updated stream/sky_mechanic_props.ytyp, both new audio configuration files, data/handling_editor_schema.json, the matching manifest, complete locales and complete built source folder. The manifest now points to the archetype inside stream/ and loads the Dyno audio mix. Do not carry an older manifest forward. No new provider secret is required.
Phase 5 of 5
Restart & test
Start the matching dependencies and Mechanic, then verify all seven handling tables and both usable items. Place/cancel/pick up a Dyno and monitor, check duty and range rejection, prepare cooling fans, run seated and external tests, and check start/stop cleanup, temperatures, graphs, fan dragging, saved history and monitor sharing. Open /handlingeditor with an authorized administrator, apply two successive edits, reopen, test profile revisions, XML clipboard export/import, field limits, fleet rules and driving telemetry. Verify unsupported/failed live changes report an error, Escape closes only the open dropdown, and drivers can toggle installed Anti-Lag. Confirm smoke-color ordering is unavailable while historical refunds remain intact.
Version 1.26.0
Update sky_base to 1.37.0 and sky_jobs_base to 1.40.0 before updating sky_mechanicjob.
Highlights
Added persistent electronic exhaust-smoke color tuning with eleven levels and ECU Tuning Kit pricing.
Improved Two-Step so input detection remains responsive while idle polling is configurable and its torque effect composes with ECU tuning.
Improved live vehicle tuning so runtime vehicles retain applied settings through synchronization and ownership changes.
Added support for every runtime plate style, including the Enhanced plate variant.
Notable Changes
Added server-authorized anti-lag previews and ECU index diagnostics for safer electronic-tuning workflows.
Improved Job Creator refresh behavior so a saved configuration cannot trigger an unsafe recursive refresh.
Improved parts-delivery guidance when several completed orders are waiting.
Fixed engine-hoist behavior so attaching and moving a vehicle does not damage it.
Added an optional config/img directory contract for custom NUI tuning images.
Other Changes
Updated number inputs so browser spinner controls match the tablet interface.
Updated bundled locales for exhaust-smoke colors, Two-Step defaults, delivery guidance, plate styles, and tuning diagnostics.
Improved electronic-tuning persistence and preview cleanup across resource and player lifecycle changes.
Changed Files
sky_mechanicjob/config/adv_config.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/img/README.md
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.25.01.26.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Install Base 1.37.0 and Jobs Base 1.40.0, stop the server, and back up the resource, Job Configurator settings, tuning/vehicle data, inventory definitions, and deliberate changes to config/config.lua and config/adv_config.lua.
Install 1.26.0 as one clean package. Its manifest, frontend, locales, tuning runtime, and source files must remain aligned.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. At minimum replace fxmanifest.lua, config/config.lua, config/adv_config.lua, the complete config/locales and source directories, and the built frontend. Add config/img/README.md; keep locally supplied images in that directory when reapplying custom artwork.
Phase 3 of 5
Merge config
The canonical path is Config.Jobs[*].tuningCostProfile.optionCostByOptionId. The shipped entry is:
When the Job Configurator is enabled, startup copies missing electronic_* entries from the current defaults into saved profiles while preserving existing entries. Review Tuning Prices after the first start; do not add a second options table. With the shipped percentage pricing, 4.65 means 4.65% of the vehicle value. The existing ecu_tuning_kit item is reused.
Extend the plaintext Two-Step block in config/adv_config.lua:
inactiveCheckIntervalMs accepts 50 through 1000; lower values react sooner while higher values reduce idle polling. /jobconfig controls Config.ToggleFeatures.twoStep, not these low-level physics and timing values.
Phase 4 of 5
SQL & items
No SQL migration, new inventory identifier, bundled inventory image, or stream asset is required. Confirm that the existing ecu_tuning_kit item remains registered because exhaust-smoke color levels 1..10 consume it under the shipped pricing profile. The optional config/img directory is for NUI artwork and does not replace inventory images.
Phase 5 of 5
Restart & test
Start Base, Jobs Base, and Mechanic in order. Install every exhaust-smoke color level, verify its cost/item consumption, observe the selected color, reconnect, change network ownership, and confirm persistence. Preview and cancel anti-lag with allowed and denied users, inspect ECU diagnostics, and test Two-Step when initially disabled/enabled with foot-brake and optional handbrake settings. Confirm its torque remains compatible with ECU tuning. Test all plate styles including Enhanced, save Job Configurator changes once, process multiple queued deliveries, use the engine hoist without body/engine damage, and load an optional custom image in FiveM CEF.
Version 1.25.0
Update sky_base to 1.36.0 and sky_jobs_base to 1.39.0 before updating sky_mechanicjob.
Highlights
Added persistent electronic tuning for anti-lag variants, two-step, throttle response, wheelie behavior, engine output, idle speed, interior lighting, headlight brightness, radio power, brake lights, horn high beams, automatic hazards, and preset or custom RGB mood lighting with intensity and disable control.
Added staged brake overheating with configurable vehicle and brake-upgrade multipliers, glowing discs, critical sparks, short brake fade, and a debug display.
Added a parts-delivery mode that can place the complete collected order directly into the player's inventory instead of using the physical pallet flow.
Changed the former Anti-Lag Kit into one ECU Tuning Kit that supplies anti-lag, two-step, and every new electronic upgrade.
Notable Changes
Improved tuning orders so required item quantities are visible, carried repair items can be consumed, advanced installations work with parts delivery disabled, and live prices refresh after Job Configurator changes.
Improved vehicle repair and service persistence so self-service work and Quasar parking retain completed repairs without overwriting unrelated vehicle data.
Improved workshop deliveries so the pallet appears at the configured spawn position and direct-inventory collection grants the full validated order once.
Fixed an issue where seated customers could be removed from their vehicle during billing and where a partially paid invoice could remain open after completion.
Added system-actor entries to vehicle history so automated service actions remain distinguishable from employee changes.
Improved fake plates so a qualifying collision can detach the plate even when body-health loss is small.
Other Changes
Improved xenon synchronization, repaired-window updates, transactional stance changes, and wheel geometry so nearby clients see the same vehicle state without changing door angles.
Removed the lingering limp-mode speed cap after the underlying vehicle condition recovers.
Improved the tuning interface with functional categories, dedicated ECU artwork, clearer removal/order details, shared form controls, and consistent FiveM CEF rendering.
Updated bundled translations for ECU tuning, brake heat, parts delivery, exhaust work, catalytic converters, invoices, and vehicle-state messages.
Update InstructionsA guided update for server owners1.24.11.25.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Before updating, install Base 1.36.0 and Jobs Base 1.39.0, stop the server, and back up the resource, inventory definitions/data, Job Configurator tables, mechanic tables, and intentional provider/config edits.
Install 1.25.0 as one clean package. Its UI, runtime, manifest, locales, config defaults, image, and compatibility files must match.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. At minimum replace fxmanifest.lua, import.sql, compat/fakeplates_realplate_native.lua, config/adv_config.lua, config/config.lua, config/sv_functions.lua, the complete config/locales and source directories, and the built UI. Add config/inventory/ecu_tuning_kit.png.
Phase 3 of 5
Merge config
Add these feature defaults, both absent in 1.24.1:
With /jobconfig, these are normal saved feature flags named electronicTuning and brakeOverheating; saved flags override the file. Add the complete new brake block:
/jobconfig stores these brake values: brakeOverheatingMinimumSpeedKmh, brakeOverheatingReferenceSpeedKmh, brakeOverheatingHeatGainPerSecond, brakeOverheatingCoolingPerSecond, brakeOverheatingCoolingDelayMs, brakeOverheatingHeatClassMultipliers, brakeOverheatingHeatBrakeUpgradeMultipliers, brakeOverheatingCooldownClassMultipliers, brakeOverheatingCooldownBrakeUpgradeMultipliers, brakeOverheatingWarmThreshold, brakeOverheatingHotThreshold, brakeOverheatingCriticalThreshold, brakeOverheatingVisualDistance, brakeOverheatingSparkMinimumIntervalMs, brakeOverheatingSparkMaximumIntervalMs, brakeOverheatingFadeChancePerSecond, brakeOverheatingFadeMinimumDurationMs, brakeOverheatingFadeMaximumDurationMs, and brakeOverheatingFadeCooldownMs. Saved values override the matching fields. simulationIntervalMs, maximumVisibleVehicles, glow, the spark asset/scale, wheelBones, and excludedVehicleClasses remain plaintext-only.
Add Config.PartsDelivery.deliveryMode = "standard" after deliveryTimeSeconds = 60; the path was absent before. The normal saved /jobconfig key is partsDeliveryMode, with allowed values "standard" and "player_inventory". This is a setting, not an interaction capability flag.
Replace antilag_kit with ecu_tuning_kit in every job Shop, Parts Delivery Shop, and tuning required-item entry. Rename the pricing category antilag to ecu_electronics while preserving supplierSharePercent = 70.0, marginPercent = 25.0, laborFee = 1400, difficulty = "complex", minimumPrice = 400, and maximumPrice = 90000. The resource migrates saved /jobconfig jobs on start; verify every job after migration.
Here kit means ecu_tuning_kit. Remove Config.AntiLag.activationRpm = 0.7 and Config.AntiLag.minGear = 2 from config/adv_config.lua; both paths are deleted in 1.25.0. No executable value changed in config/sv_functions.lua, but replace or carefully remerge the file because fake-plate ownership now uses the current Base/Jobs identity contracts.
Phase 4 of 5
SQL & items
No mechanic table schema changes in this release. The ESX item seed changes from:
old-item.sql
('antilag_kit', 'Anti-Lag Kit', 2000, 0, 1)
to:
new-item.sql
('ecu_tuning_kit', 'ECU Tuning Kit', 2000, 0, 1)
INSERT IGNORE does not rename an existing inventory row or stored player/job inventory. Register the new item in the active inventory, migrate stored antilag_kit counts deliberately, and install config/inventory/ecu_tuning_kit.png. The old item is no longer referenced by shipped shops or tuning costs. No provider credential or new streamed model is required.
Phase 5 of 5
Restart & test
The console reports Base 1.36.0, Jobs Base 1.39.0, and Mechanic 1.25.0 in that order.
ecu_tuning_kit exists with its image and stored antilag_kit inventory was deliberately migrated.
Every saved job uses ecu_tuning_kit, the ecu_electronics category, and the new option costs after Job Configurator migration.
All anti-lag levels, two-step, and every electronic tuning option install, consume the displayed quantity, persist, synchronize, and remove correctly.
Brake heat honors class/brake multipliers and thresholds; glow, sparks, fade, cooling, exclusions, and /brakeheatdebug behave as configured.
Standard parts delivery retains the physical flow and player_inventory grants the complete order exactly once.
Carried repair items, parts-delivery-disabled installs, order quantities, and live pricing changes work.
Billing keeps seated occupants in place and closes a completed partial-payment flow.
Self-service and Quasar repairs plus xenon, mood light, windows, stance, wheel geometry, and electronic state survive parking/retrieval without changing door angles.
A qualifying collision can detach a fake plate and recovered vehicles no longer retain a limp-mode speed cap.
Version 1.24.1
Update sky_base to 1.35.1 and sky_jobs_base to 1.38.1 before updating sky_mechanicjob.
Highlights
Improved the built-in frontend fallback catalogue so missing translated tuning, delivery, invoice, registry, and tablet keys remain readable.
Notable Changes
Fixed an issue where a complete 1.24.0 feature installation could still show blank or placeholder Mechanic labels.
Other Changes
Updated the package manifest for the 1.24.1 compatibility set.
Changed Files
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
Update InstructionsA guided update for server owners1.24.01.24.1
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update Base to 1.35.1 and Jobs Base to 1.38.1, stop the server, and back up Mechanic.
Install 1.24.1 as one clean package; a .1 manifest beside the .0 built UI is a mixed update.
Phase 2 of 5
Replace files
Delete and reinsert the resource. Replace fxmanifest.lua, the built UI, and config/locales completely.
Phase 3 of 5
Merge config
No public config value or /jobconfig key changed in 1.24.1.
Phase 4 of 5
SQL & items
No SQL, item, image, stream asset, or provider credential changed.
Phase 5 of 5
Restart & test
Base 1.35.1, Jobs Base 1.38.1, and Mechanic 1.24.1 start in order.
Tuning, delivery, invoice, registry, and tablet labels fall back to readable English when a translation key is absent.
Version 1.24.0
Update sky_base to 1.35.0 and sky_jobs_base to 1.38.0 before updating sky_mechanicjob.
Highlights
Cross-job vehicle records - mechanics can create richer owner/model/color records and share selected profiles read-only with other jobs.
Quantity-aware tuning parts - performance stages can require increasing quantities instead of one item for every level, including repeated legacy item entries.
Improved invoice and delivery workflows - invoice registry history, normalized timestamps, custom quantities, stacked delivered parts, customer subscription names, and clearer delivery pallets are supported.
Tyre-only persistence - JG garage tyre saves sanitize bounded tyre fields, require a persisted owned plate when ownership checks are enabled, and update only tyre data without overwriting other tuning properties.
Notable Changes
Advanced pricing can keep selected parts-shop categories available without an active tuning order; Service items are enabled by default.
Vehicle records support editing for their owner job and read-only access for configured share targets.
Tuning orders can source quantities from job storage, enforce price caps consistently, and show clearer item labels and dark-mode surfaces.
Subscription lists retain customer names and vehicle history includes owner-scoped invoice entries.
Wheel size/width scaling was removed; normal Stancer camber, track width, suspension, and alignment remain.
Other Changes
Dropdown, opacity, delivery, subscription, invoice, registry, pricing, tuning, and locale behavior was corrected.
The Tuning menu includes dedicated Extras artwork in the rebuilt interface.
Custom tuning diagnostics now follow the shared Base logging path.
Tyre persistence updates only tyre-related fields in the stored property document so ordinary tyre saves preserve unrelated tuning data.
Database schemas now inherit the active database character set and collation; no new inventory item or streamed asset is required.
Update InstructionsA guided update for server owners1.23.01.24.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.35.0 and sky_jobs_base to 1.38.0. Stop the server and back up the complete Mechanic resource, local pricing/tuning configuration, Job Configurator tables, and all Mechanic database tables.
Install 1.24.0 as one clean package. Its pricing rules, UI, server validation, generated settings, database schema, and persistence runtime must match.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. Replace fxmanifest.lua, import.sql, config/config.lua, config/adv_config.lua, the complete config/locales and source directories, and the built UI.
Phase 3 of 5
Merge config
Delete these obsolete values: Config.ToggleFeatures.stanceWheelSize, Config.ToggleFeatures.stanceWheelWidth, the complete Config.WheelSizeOptions table, and the wheel_size / wheel_width option-cost rows. They existed in 1.23.0 and are absent in 1.24.0.
Add the complete sharing default and assign it to intended mechanic jobs:
config/config.lua
local mechanic_sharing_defaults = {
enabled = true,
records = {
vehicleRecords = { enabled = true, jobs = {}, groups = { "mechanic" } }
}
}
Change every shipped performance item from a string to { name, quantity }. Required stage quantities are:
Performance path
Stage quantities in 1.24.0
Removed extra row
performanceStages.engine.cost
1, 2, 3, 4 × engine
None
performanceStages.brakes.cost
1, 2, 3 × brakes
Former fourth row
performanceStages.transmission.cost
1, 2, 3 × transmission
None
performanceStages.suspension.cost
1, 2, 3, 4 × suspension
Former fifth row
performanceStages.armor.cost
1, 2, 3, 4, 5 × armor_plating
Former sixth row
Use items = { { name = "brakes", quantity = 2 } } for a two-unit example. The existing prices stay attached to their matching real stage.
The global advanced-pricing switch remains false by default. When it is enabled, matching Config.Jobs[*].partsDeliveryShop categories are purchasable without a tuning order and each item price is the supplier base price. Per-job vehicle-record sharing is Job Configurator data; the two advanced-pricing values are normal saved /jobconfig settings.
Phase 4 of 5
SQL & items
Automatic migration and the manual file mirror apply these exact changes:
migration.sql
ALTER TABLE `sky_mechanic_subscriptions`
ADD COLUMN IF NOT EXISTS `customer_name` VARCHAR(120) NULL AFTER `identifier`;
ALTER TABLE `sky_mechanic_vehicle_profiles`
ADD COLUMN IF NOT EXISTS `owner_name` VARCHAR(120) NULL,
ADD COLUMN IF NOT EXISTS `owner_identifier` VARCHAR(120) NULL,
ADD COLUMN IF NOT EXISTS `model` VARCHAR(64) NULL,
ADD COLUMN IF NOT EXISTS `color` VARCHAR(120) NULL,
ADD COLUMN IF NOT EXISTS `shared_with_jobs` LONGTEXT NULL,
ADD COLUMN IF NOT EXISTS `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
If the database does not support grouping these ADD COLUMN IF NOT EXISTS clauses, execute the complete shipped import.sql, where they are separate statements. All shipped schema definitions now inherit the active database character set and collation. No separately installed inventory item, image, or stream asset is required; the Extras artwork is already contained in the rebuilt interface under source.
Phase 5 of 5
Restart & test
Base 1.35.0, Jobs Base 1.38.0, and Mechanic 1.24.0 start in that order.
Subscription rows expose customer_name and vehicle profiles contain every new metadata/share/timestamp column.
Each performance level consumes the configured quantity and the removed extra levels no longer appear.
Service-category items remain available without a tuning order only when advanced pricing is enabled.
A shared vehicle record is read-only outside its owner job; invoices are not exposed to shared viewers.
Delivered parts stack correctly and subscription customer names remain visible.
JG tyre snapshots accept only bounded tyre fields, reject invalid or non-owned plates when ownership checks are enabled, and preserve every unrelated tuning property.
Wheel-size/width controls are gone while supported Stancer controls still work.
The rebuilt Tuning menu displays the dedicated Extras artwork.
Version 1.23.0
Update sky_base to 1.34.0 and sky_jobs_base to 1.37.0 before updating sky_mechanicjob.
Highlights
Server-authoritative advanced pricing - optional quotes combine supplier share, margin, labor, difficulty, vehicle class, mechanic grade, stock, demand, tax, discount caps, and price limits; class-based prices, order-bound procurement, returns, refunds, and workshop profit analytics use the same validated calculation. Public server exports are CreatePricingQuote, GetPricingQuote, ValidatePricingQuote, GetPricingAnalytics, and GetSupplierCatalog; server integrations can observe sky_mechanicjob:server:pricingQuoteCreated, sky_mechanicjob:server:pricingQuoteExpired, and sky_mechanicjob:server:supplierStockChanged.
Extended workshop billing - invoices support estimates, deposits, partial payments, manual lines, due dates, reminders and fees, tax, per-grade limits, cancellation permissions, analytics, and optional recipient-name privacy. Public server exports are CreateInvoice, CreateEstimate, GetInvoice, GetPlayerInvoices, PayInvoice, RespondToEstimate, SendInvoiceReminder, CancelInvoice, and GetBillingAnalytics; server integrations can observe sky_mechanicjob:server:invoiceCreated, sky_mechanicjob:server:invoiceStatusChanged, sky_mechanicjob:server:invoiceOverdue, sky_mechanicjob:server:invoicePaymentRecorded, sky_mechanicjob:server:estimateResponded, sky_mechanicjob:server:invoiceReminderSent, and sky_mechanicjob:server:invoiceCancelled.
Customer and company subscriptions - configurable workshop memberships provide one strongest non-stacking discount, personal or job-wide ownership, society payment, expiry, a configurable NPC terminal, and workshop-specific models; the responsive tablet app is marked New, its runtime is loaded explicitly, and its SVG assets plus public NPC setup documentation are included. Server integrations can resolve the effective discount through GetSubscriptionDiscount.
Parts deliveries in the tablet - the old single-order timer HUD was replaced with a synchronized overview of every workshop delivery, while configured carriers can sprint with delivery boxes.
Notable Changes
External LB Tablet and RoadPad surfaces support authorization, inherited sessions, retries, message relay, safe routes, lifecycle return/close, and tuning focus preservation; their runtime module is loaded explicitly.
Drift tuning now requires the dedicated drift_tyres item instead of a stance kit; the item is included in shop defaults and SQL inventory seeds.
Oil absorbent and brooms are stocked in mechanic shops, including migration into existing configurator-managed shops without duplicates.
Vehicle persistence batches orphan-tyre cleanup, reapplies tuning after a server/client startup handshake, avoids shutdown-time saves, preserves add-on stance baselines, and restores stance after garage retrieval.
Motorcycle tuning exposes rear-wheel changes instead of treating the vehicle as front-wheel-only.
The public server-authoritative /antilag command toggles the persisted state only when Anti-Lag is enabled, the player is the driver of their own vehicle, and that vehicle has an installed Anti-Lag kit; every rejected requirement returns a clear result.
Self-service validation follows creator-defined workshop points rather than static job locations.
Plates in Config.TuningRestrictions.blockedPlates are rejected by mechanic, self-service, instant, and admin tuning flows.
Owned vehicles can send rate-limited maintenance reminders when wear reaches the configured threshold.
Oil-leak relays use the configured integration resource and now ship with the Fire resource as the default target; an unavailable provider rejects the relay and writes an English debug diagnostic with its resource state.
Other Changes
All newly added and revised user-facing feedback received locale coverage; Italian was added.
Shared input, selection, switch, checkbox, range, and date-range controls were made responsive and theme-consistent.
Regression coverage was expanded across the release's server, client, persistence, UI, and integration paths.
Changed Files
sky_mechanicjob/README.md
sky_mechanicjob/config/adv_config.lua
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/import.sql
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.22.01.23.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Stop the server after both dependencies are current. Back up the complete resource, public config files, generated creator settings, and database. Export existing mechanic invoices, tuning orders, vehicle tuning, and shop configuration before applying the schema.
Install 1.23.0 as a clean package. Pricing, billing, memberships, deliveries, persistence, generated defaults, and the tablet UI depend on matching client, server, config, SQL, and UI files.
Phase 2 of 5
Replace files
Replace fxmanifest.lua, source, the complete built UI, locales, README, and import.sql. Start from the new config/config.lua and config/adv_config.lua, then transfer deliberate server values into the matching new blocks.
Phase 3 of 5
Merge config
Apply every public value change; Absent -> New means the path did not exist in 1.22.0:
Billing defaults exist globally and per job. Replace every job's complete billingSettings table with this block; the first four fields existed in 1.22.0, and every following field is new:
Replace the complete fallback table. showRecipientName, the extended invoice fields, and gradeRules are new; job-specific billingSettings still take precedence:
The /jobconfigFeatures section saves vehicleMaintenanceNotifications and subscriptions; those values override Config.ToggleFeatures. Saved global keys are maintenanceNotificationsEnabled, maintenanceNotificationsThreshold, maintenanceNotificationsCooldownMinutes, subscriptionsEnabled, subscriptionsAllowJobSubscriptions, subscriptionsCurrency, subscriptionsMaximumModels, subscriptionsMaximumDurations, subscriptionsNpcPedModel, subscriptionsNpcScenario, subscriptionsNpcEmoteDict, subscriptionsNpcEmoteClip, tuningBlockedPlates, allowsprint, priceType, and vehicleClassPricing. The exact advanced-pricing keys are advancedPricingEnabled, advancedPricingSupplierSharePercent, advancedPricingRoundingStep, advancedPricingDefaultMarginPercent, advancedPricingMinimumMarginPercent, advancedPricingMaximumMarginPercent, advancedPricingMinimumRetailPrice, advancedPricingMaximumRetailPrice, advancedPricingTaxPercent, advancedPricingQuoteLifetimeMinutes, advancedPricingMaximumDiscountPercent, advancedPricingReturnRefundPercent, advancedPricingAnalyticsPeriodDays, advancedPricingPreviewCostPercent, advancedPricingPreviewCompactValue, advancedPricingPreviewSportsValue, advancedPricingPreviewSuperValue, advancedPricingInventoryEnabled, advancedPricingInventoryBaseStock, advancedPricingInventoryLowStockThreshold, advancedPricingInventoryLowStockMarkupPercent, advancedPricingInventoryDemandMarkupPerUnitPercent, advancedPricingInventoryMaximumDemandMarkupPercent, advancedPricingInventoryRestockPerDay, advancedPricingInventoryDemandDecayPerDay, advancedPricingDifficultyRules, advancedPricingCategoryRules, advancedPricingVehicleClassRules, and advancedPricingMechanicGradeRules.
Saved per-job values are shop, partsDeliveryShop, billingSettings, tuningCostProfile, and allowedVehicleClasses. The defaults migration adds missing oil_absorbent and broom rows without duplicating existing rows; add or verify drift_tyres separately and then verify all three items once. Self-service points additionally save their own allowedVehicleClasses, where an empty list means every GTA class.
Config.Interactions.self_service_tuning.vehicleClassWhitelist = true is only the capability flag that exposes the per-point class editor; it is not a saved class list. Config.Interactions.subscription_terminal exposes a placeable creator point, while each terminal's position is separate saved creator data. Subscription models start from Config.Subscriptions.models and are then managed in the Subscriptions tablet/database, not as ordinary /jobconfig model rows. When Config.UseJobConfigurator = true, resave every workshop because saved overrides win over Lua defaults.
After enabling subscriptions, assign View subscriptions to every workshop role that may open the tablet app and Manage subscriptions to every workshop role that may edit availability, models, durations, prices, or discounts. A player purchasing a company-wide subscription additionally needs Manage money in the purchasing company job; the permission is checked against that company, not the selling workshop.
/antilag is available only while Config.ToggleFeatures.antiLag is enabled. The player must run it in-game as the driver of their own vehicle, and the persisted vehicle tuning must contain an installed Anti-Lag kit. The command rejects passengers, non-owned vehicles, vehicles without the kit, and concurrent toggles for the same plate.
Public pricing and supplier server exports are CreatePricingQuote, GetPricingQuote, ValidatePricingQuote, GetPricingAnalytics, and GetSupplierCatalog. Public billing server exports are CreateInvoice, CreateEstimate, GetInvoice, GetPlayerInvoices, PayInvoice, RespondToEstimate, SendInvoiceReminder, CancelInvoice, and GetBillingAnalytics. GetSubscriptionDiscount(sourceOrIdentifier, jobName) returns the strongest applicable discount percent and its subscription record.
Server-local integration events are sky_mechanicjob:server:pricingQuoteCreated, sky_mechanicjob:server:pricingQuoteExpired, sky_mechanicjob:server:supplierStockChanged, sky_mechanicjob:server:invoiceCreated, sky_mechanicjob:server:invoiceStatusChanged, sky_mechanicjob:server:invoiceOverdue, sky_mechanicjob:server:invoicePaymentRecorded, sky_mechanicjob:server:estimateResponded, sky_mechanicjob:server:invoiceReminderSent, and sky_mechanicjob:server:invoiceCancelled.
The configured oil provider accepts states starting and started; all other states reject the relay and write an English debug diagnostic containing the provider and state. No player-facing notification is emitted for this rejection. Start Config.OilLeaks.integration.resource before Mechanic, select another compatible provider, or deliberately set Config.OilLeaks.enabled = false.
Phase 4 of 5
SQL & items
Run the complete import.sql before startup when Config.AutoExecuteQuery = false. It applies every one of these changes:
Creates sky_mechanic_subscription_settings with society_job, enabled, models, updated_by, and updated_at; primary key society_job.
Creates sky_mechanic_subscriptions with id, identifier, society_job, model_id, model_label, discount_percent, price_paid, purchased_at, expires_at, and updated_at; one customer/workshop unique key plus expiry and workshop/expiry indexes.
Creates sky_mechanic_job_subscriptions with id, customer_job, society_job, model_id, model_label, discount_percent, price_paid, purchased_by_identifier, purchased_by_name, purchased_at, expires_at, and updated_at; one company/workshop unique key plus expiry and workshop/expiry indexes.
Adds document_type, amount_paid, deposit_required, due_at, valid_until, accepted_at, declined_at, reminder_count, reminder_fees, last_reminder_at, and updated_at to sky_mechanic_invoices.
Adds category and cost_type to sky_mechanic_invoice_items.
Creates sky_mechanic_invoice_payments with id, invoice_id, amount, payment_method, payer_identifier, payer_name, and created_at; indexes invoice/time and creation time.
Creates sky_mechanic_pricing_entries with id, order_id, part_index, order_uid, society_job, part_id, part_label, category, vehicle_class, mechanic_grade, retail_revenue, supplier_cost, labor_cost, margin_amount, tax_amount, discount_amount, refund_amount, status, created_at, and updated_at; unique order/part plus job/time, part/time, and status indexes.
Creates sky_mechanic_supplier_stock with society_job, item_name, stock, demand, last_restock_at, and updated_at; composite primary key plus update-time index.
Adds only the ESX items seed drift_tyres (Drift Tyres, weight 15000, not rare, removable). Register it manually in QBCore, Qbox, ox_inventory, or any other active inventory.
oil_absorbent and broom are pre-existing cleanup items and are not inserted by Mechanic SQL. Confirm both are registered before enabling their shop rows. Existing invoice, order, tuning, and membership rows are extended in place; do not drop those tables.
Add a subscription_terminal point to each intended workshop, then restart sky_base, sky_jobs_base, and sky_mechanicjob in that order.
Phase 5 of 5
Restart & test
Base 1.34.0, Jobs Base 1.37.0, and Mechanic 1.23.0 start in order.
Existing tuning, stance, invoices, and workshop settings survive migration and restart.
Advanced pricing stays inactive until enabled, then produces stable server-side quotes, grade caps, supplier costs, returns, and analytics.
Estimates, invoices, deposits, partial payments, reminders, manual lines, privacy, and role limits persist correctly.
Personal and job subscriptions charge the configured account, select only the strongest discount, expire, and display through the configured NPC terminal.
Parts deliveries list every active order in the tablet and allow sprinting only when configured.
drift_tyres, oil_absorbent, and broom are registered in the active inventory; drift tuning uses the first item and both cleanup supplies appear once in migrated shops.
Blocked plates cannot use any tuning route; motorcycle rear wheels and public anti-lag behave correctly.
Add-on stance survives resource start and garage retrieval without duplicate tyres or shutdown-save errors.
Maintenance notices obey threshold/cooldown, and oil leaks reach a started compatible integration resource or remain deliberately disabled.
Update sky_base to 1.33.0 and sky_jobs_base to 1.36.0 before updating sky_mechanicjob.
Highlights
Reliable parts deliveries - partial deliveries preserve their remaining items, pallets keep their targets after movement, carried boxes clean up correctly, and failures return a clear result.
Server-side mechanic integrations - trusted server resources can repair vehicles or wheel damage, inspect and repair wear/condition, check whether tuning exists, and react to completed mechanic operations.
Global Stance control - Stance can be disabled as one complete feature and reacts to Job Configurator changes without a resource restart.
Per-location vehicle-class enforcement - self-service tuning points can apply their configured class whitelist before opening.
Notable Changes
Test-drive vehicles are excluded from persistent wear and wheel-damage processing.
Full repairs preserve custom native engine audio and reapply saved Stance values.
Orphaned tyre damage, tuning state, welding animations, delivery-box movement, and billing-spec updates are handled more consistently.
Workshop lifts and Stance items respond to live configuration changes.
Ordered item and vehicle image sources are used throughout shops, diagnostics, tuning, and dealer views.
Added a complete Serbian locale.
Other Changes
Removed obsolete tyre-reset SQL guidance; no database reset is part of this release.
Added focused regression checks for engine audio, install animations, server integrations, and Stance gating.
Changed Files
sky_mechanicjob/config/config.lua
sky_mechanicjob/config/locales/*
sky_mechanicjob/fxmanifest.lua
sky_mechanicjob/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.21.01.22.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Back up the complete resource and intentional public configuration changes. Use a clean package so client, server, UI, locales, and generated defaults remain synchronized.
Phase 2 of 5
Replace files
Replace the complete runtime and built UI, current locales, generated defaults, and API documentation. Keep all files listed in Changed Files from the new package.
Phase 3 of 5
Merge config
Without /jobconfig, apply these exact additions:
Config path
1.22.0 shipped value / action
Config.ToggleFeatures.stance
New: true; set false to hide and disable Stance functionality globally
New capability flag: true; enables per-location vehicle-class whitelist editing for this interaction type
With /jobconfig, review and save the managed Stance feature. The vehicleClassWhitelist boolean itself is part of the interaction definition, not a normal saved setting; use the configurator to review the actual allowed classes for every self_service_tuning location. No existing public value was removed or changed.
Phase 4 of 5
SQL & items
No SQL migration or reset is required. Do not run old tyre-reset guides. No new inventory item, image, stream file, or metadata file is required.
Phase 5 of 5
Restart & test
Base 1.33.0, Jobs Base 1.36.0, and Mechanic 1.22.0 are running.
Partial deliveries retain undelivered parts and pallet/box targets remain usable.
Disabled Stance is absent from tuning and its usable item is not registered.
Self-service tuning rejects disallowed vehicle classes when whitelist enforcement is enabled.
Test-drive vehicles do not gain persistent wear or wheel damage.
Repairs preserve custom engine audio and saved Stance values.
Trusted server integrations return clear results for repair, condition, wear, tuning, and completion flows.
Version 1.21.0
Update sky_base to 1.32.0 and sky_jobs_base to 1.35.0 before updating sky_mechanicjob.
Highlights
Unpaid public tuning orders - workshops that hide public prices can now accept an unpaid customer order for a mechanic to review and invoice later instead of showing zero-cost work.
Lift bypass for unsuitable vehicles - configurable vehicle classes and models, including motorcycles by default, can complete lift-dependent service work without forcing them onto a workshop lift.
Better workshop lift placement - creator lifts support gizmo placement, initialize vehicle control before lifting, and handle order/service actions more reliably.
Clearer drivetrain tuning - the active drivetrain and drivetrain presets are visible in the correct Handling and Performance sections.
Notable Changes
Custom wheels are installed and displayed correctly in tuning flows.
Parts deliveries use the active job's delivery bay instead of another workshop's location.
Public-order price visibility now clearly distinguishes paid self-service orders from mechanic-invoiced unpaid orders.
Nitro no longer repeats a missing-system notification while the control key is held.
Missing Base or Jobs Base dependencies are reported clearly during startup.
Other Changes
Restored German characters and refreshed the setup documentation.
Updated the resource version to 1.21.0.
Update InstructionsA guided update for server owners1.20.01.21.0
Guided update
Update sky_mechanicjob safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.32.0 and sky_jobs_base to 1.35.0, then stop the server.
Back up
Safe location
Complete sky_mechanicjob folder
Outside the live resources folder
Customized config/function files
Separate custom-config folder
Use a clean resource folder so the rebuilt interface and current runtime always match.
Phase 2 of 5
Replace files
Replace the resource first:
Action
Current server path
New package / destination
Delete
resources/[sky]/sky_mechanicjob
Remove only after the backup exists
Copy
—
Copy the new sky_mechanicjob folder to resources/[sky]/sky_mechanicjob
Keep from new release
fxmanifest.lua, source, and source/html
Do not restore these from 1.20.0
Keep from new release
config/locales
Contains the current setup text
Merge only if customized
Old config/function edits
Reapply intentional values inside the matching new files
Do not copy the old config/adv_config.lua over the new one: it contains an obsolete drivetrain whitelist.
Phase 3 of 5
Merge config
Keep placementGizmo = true in Config.Interactions.workshop_lift in the newconfig/config.lua. This is a placement definition, not an editable /jobconfig setting.
If you do not use /jobconfig, also merge the lift-bypass values with your server settings:
If you use /jobconfig, review Order Install → Lift Bypass Vehicle Classes/Models and Charge public self-service orders, then save. Keep placementGizmo in the runtime config and keep the old drivetrain whitelist removed.
Phase 4 of 5
SQL & items
No SQL migration and no new inventory item are required for sky_mechanicjob1.21.0.
Existing mechanic items, images, workshops, orders, and vehicle data remain in place.
The console reports Mechanic 1.21.0 without dependency errors.
A paid public order charges immediately when prices are visible.
An unpaid public order can be reviewed and invoiced by a mechanic when prices are hidden.
Motorcycles and every configured model/class bypass the lift; ordinary cars still require it.
Lift gizmo placement and vehicle control work.
Custom wheels, drivetrain presets, and the active drivetrain appear correctly.
Parts delivery uses the active job's workshop location.
Version 1.20.0
Update sky_base to 1.31.0 and sky_jobs_base to 1.34.0 before updating sky_mechanicjob.
Highlights
Fake plates survive compatible garage storage - new compatibility helpers let garage resources resolve the real stored plate while Police, radar, dispatch, and visible UI can continue to see the active fake plate.
Safer RGB controller tuning - mechanics can only edit installed neon directions, unavailable controls are disabled, and vehicles without compatible neon are rejected clearly.
Workshop management in Job Configurator - workshop entries now have a dedicated creator section with localized labels and job-aware filtering.
Optional mechanic-first repair policy - repair-kit use by non-mechanics can be blocked while a mechanic is on duty, with a clear localized message.
Notable Changes
Added the Full Dark theme across Mechanic tablet apps.
Fake plate state can be restored after compatible garage flows instead of being lost during storage.
Vehicle ownership queries now use owned_vehicles on ESX and player_vehicles on QB-based frameworks.
Custom chrome paint is hidden and rejected when the active tuning profile does not allow it.
Mechanic item and vehicle artwork now supports PNG and WebP fallbacks.
Other Changes
Added public compatibility files and setup guidance for fake-plate-aware garage resources.
Updated the resource version to 1.20.0.
Update sky_base to 1.31.0 and sky_jobs_base to 1.34.0.
Download sky_mechanicjob from the CFX Portal and create a resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so version 1.20.0 and the new /compat files are loaded.
Add the complete new /compat folder. For garage/framework resources that must resolve the real stored plate, add shared_script "@sky_mechanicjob/compat/fakeplates_realplate_native.lua" near the top of that resource's manifest and declare dependency "sky_mechanicjob". Do not add this override to Police, dispatch, radar, or UI resources that should see the displayed fake plate. See Fake Plate Integration for complete manifest and persistence examples.
If a resource should choose between real and displayed plates itself, load @sky_mechanicjob/compat/fakeplates.lua and use the provided compatibility helpers described in the updated README and integration guide.
If you do not use /jobconfig, merge these /config/config.lua changes manually:
Change Config.FakePlates.resetOnGarageStore from true to false when fake plates should persist through compatible garage storage. Retain true if storing a vehicle should deliberately remove its fake plate.
Under Config.VehicleCare.repair, add blockForNonMechanicsWhenMechanicsOnDuty = false. Set it to true to reserve repair-kit use for mechanics whenever at least one mechanic is on duty.
If you use /jobconfig, verify the Fake Plate garage-reset and Vehicle Care repair-access values before saving.
Replace /config/sv_functions.lua, then restore customer-specific integration code from your backup.
No SQL migration is required.
Restart sky_mechanicjob and test fake plate storage/restoration with every installed garage, RGB controller neon restrictions, profile-blocked chrome paint, repair-kit access, and Workshop Creator filtering.
Version 1.19.0
Update sky_base to 1.30.0 and sky_jobs_base to 1.33.0 before updating sky_mechanicjob.
Highlights
Complete fake plate system - mechanics can create and install temporary display plates with ownership, distance, engine, duplicate, cooldown, expiry, crash-loss, blacklist, and audit controls.
Synchronized engine-sound previews - preview revs are relayed to nearby players so engine-sound tuning can be evaluated together before purchase.
Safer workshop deletion - jobs with active deliveries, tuning work, invoices, or vehicle service obligations cannot be removed until their operational records are resolved.
Notable Changes
Framework-spawned vehicles now restore broken tyres, doors, and windows along with their other saved properties.
Overdue delivery orders are promoted when ready orders are fetched, and on-duty staff receive refreshed ready pallets.
Duplicate vehicle-lift props are prevented after reconnects and creator-owned lift props disappear when their creator entry is deleted.
The mechanic tablet closes correctly after invoice payment.
Sliders update visually when a tuning option is reset to its default.
Registered Job Configurator defaults now cover the complete current mechanic configuration.
Added an administrator command permission for resetting an active fake plate.
Other Changes
Added configurable optional risk and illegal-market rules for fake plates.
Added audit storage and default item records for blank plates, fake-plate kits, plate scanners, and plate printers.
Updated the resource version to 1.19.0.
Update sky_base to 1.30.0 and sky_jobs_base to 1.33.0.
Download sky_mechanicjob from the CFX Portal and create a database and resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so the fake-plate scripts and version 1.19.0 are loaded.
If you do not use /jobconfig, copy the complete Config.FakePlates block into /config/config.lua. Review at least the enabled state, item names, plate length/pattern/blacklist, ownership and vehicle-state requirements, interaction distances, install time, cooldown, expiry/restart/garage behavior, duplicate prevention, audit logging, crash falloff, optional typo risk, and optional illegal market.
If you use /jobconfig, verify the same Fake Plates values there before saving. The block must still exist in config.lua when your setup does not import configurator defaults.
Add the fakeplatereset command permission to /config/adv_config.lua.
Replace /config/sv_functions.lua, then restore customer-specific server integration code from your backup.
Run the updated /import.sql if automatic query execution is disabled. It creates the fake-plate audit table and adds the four default plate-related items for compatible inventories.
Register the plate items and images manually if your inventory does not use the bundled SQL/item integration.
Restart sky_mechanicjob and test plate installation/removal, garage expiry behavior, nearby engine-sound previews, saved vehicle damage, active deliveries, and protected job deletion.
Version 1.18.0
Before updating, make sure sky_base and sky_jobs_base are up to date. The updated Job Configurator defaults and config import flow require the matching shared-resource release.
Highlights
Tyre repairs now follow each damaged wheel. Missing and burst tyres are tracked individually, mechanics work on the affected side with the car jack, and Vehicle Diagnostics shows the remaining tyre condition and repair progress.
Optional vehicle-fire integration with Sky Fire Job. Critical engine damage and severe frontal impacts can create configurable vehicle fires when sky_firejob is available, while mechanic repairs clear matching fire and entrapment states.
Safer Job Configurator defaults and imports. Shipped defaults remain stable even when local config files are customized, and existing local values can be imported deliberately through the matching jobs-base workflow.
Notable Changes
Added configurable workshop map blips, including station labels, sprite, color, scale, display mode, and short-range behavior.
Added optional mechanic notifications when customers place self-service tuning orders, with an optional vehicle plate in the message.
Added configurable non-minigame installation rules for large vehicles and selected vehicle models.
Vehicle washing and waxing now support large vehicles more reliably.
Tire smoke color changes now preview live during tuning, with smoother preview updates and restoration when the preview is cancelled.
Added /fix as an admin repair alias.
Instant Tuning now consistently rejects Stance wheel-size and wheel-width options when those features are disabled.
Other Changes
Improved tyre repair restoration so unrelated body, engine, window, door, dirt, and remaining wheel damage are preserved correctly.
Improved oil-leak diagnostics for frontal-impact and active-leak flows.
Wear, oil-leak, fire, and wheel-damage effects no longer apply to invulnerable vehicles.
Pressing the Nitro control no longer shows a missing-installation notification when Nitro is disabled for the current job.
Job Configurator fire settings are hidden automatically when the optional Fire Job integration is unavailable.
Workshop Creator-owned settings remain sourced from customer configuration during generated-default builds.
Update sky_base and sky_jobs_base to their matching releases first.
Download sky_mechanicjob from the CFX Portal and create a backup of customized files.
Replace the /source folder, the built frontend files in /source/html, and fxmanifest.lua.
Replace /config/locales so the new self-service order and tyre-repair text is available.
Merge the updated Config.Jobs entries from config/config.lua, especially the new blip and selfServiceOrderNotifications settings.
Merge the updated Config.OrderInstall vehicle-class and vehicle-model lists if large vehicles should use the non-minigame installation flow.
Merge Config.FirejobVehicleFires if you use sky_firejob, and review its critical-engine and frontal-impact thresholds in /jobconfig. No Fire Job resource is required when this integration is not used.
Merge the new Config.WheelDamage.repairRestore, tyreRepair, and deformation settings if you keep a customized config file.
Open /jobconfig, review workshop blips, self-service order notifications, vehicle-fire settings, and wheel-damage repair settings, then save the jobs you changed.
If existing local config values should become the initial Job Configurator values, use the config import workflow provided by the matching sky_jobs_base release before making further edits.
Restart sky_jobs_base, sky_mechanicjob, and sky_firejob when the optional vehicle-fire integration is enabled.
Test a missing tyre on each vehicle side, a burst tyre, self-service order notifications, workshop blips, large-vehicle installs, and optional vehicle-fire cleanup after a mechanic repair.
Version 1.17.0
Before updating, make sure sky_base and sky_jobs_base are up to date. Several billing and storage improvements require the matching jobs-base release.
Highlights
Billing was expanded as one complete workflow. Mechanic billing now supports protected default prices, Bossmenu custom positions, editable custom invoice prices, saved labels, and cleaner Billing settings inside the Job Configurator.
Order parts can be taken from job storage. Mechanic jobs can choose whether tuning-order parts are consumed from the player's inventory or from the workshop's shared storage.
Vehicle and Nitro systems were tightened up. Wheel tasks now follow the real vehicle wheel count, diagnostics repairs have a safer vehicle-class fallback, pushed vehicles align better with stance height, and external Nitro HUDs have a supported API.
Notable Changes
Added a Custom position dropdown to the mechanic tablet Billing app for boss-created custom prices.
Custom invoice positions support editable prices when custom prices are enabled and are stored as normal invoice items.
Added a new inventory image for engine_sound_kit.
Added the per-job Order item source setting for Player inventory or Storage.
Storage mode shows combined job-storage item amounts in Orders and consumes installed parts directly from storage.
Mechanic default billing rows are now protected in Bossmenu and keep their labels and prices synchronized.
Mechanic billing price controls are shown inside the Billing settings page instead of a separate Billing Prices tab.
Added Config.Nitro.externalUpdateIntervalMs in config/adv_config.lua for external Nitro HUD update timing.
Vehicle wheel tasks now adapt to the real vehicle wheel count, so motorcycles use front/rear tasks while cars keep four wheel positions.
Vehicle persistence was adjusted to avoid engine sound dropouts and fuel HUD value jumps while driving.
Vehicle push animations now stay aligned better on vehicles with raised stance settings.
Vehicle Diagnostics repairs now work better on server artifacts where the server cannot read the vehicle class directly.
Added an external Nitro HUD API for resources that want to display their own Nitro interface.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal and create a backup of customized files.
Replace the /source folder and update fxmanifest.lua.
Replace the built frontend files in /source/html.
Replace /config/locales so the new billing and wheel-task text keys are available.
Copy config/inventory/engine_sound_kit.png into your active inventory image setup if your inventory does not load images directly from the resource.
Merge config/adv_config.lua if you keep a custom file, especially the new Nitro external update interval:
Config.Nitro.externalUpdateIntervalMs = 150
Open /jobconfig, review every mechanic job's Order item source and Billing settings, then save the jobs you changed. Player inventory keeps the old behavior; Storage requires the workshop storage to contain the required install parts.
Make sure the matching sky_jobs_base billing migration is installed so billing labels can be saved in sky_jobs_billing_specs.
Restart sky_jobs_base and sky_mechanicjob.
Test custom billing positions, storage-based order installation, billing price editing, motorcycle wheel tasks, diagnostics repairs, and Nitro HUD integration if used.
Version 1.16.0
Before updating, make sure sky_base and sky_jobs_base are up to date. The configurable Instant Tuning profile and workshop vehicle-class selection require the matching shared-resource releases.
Highlights
Configurable Instant Tuning. Administrators can now control the performance stages, appearance modifications, wheel types, special options, and individual values available at global Instant Tuning locations. Client menus use the dedicated profile, and purchases are validated by the server.
Workshop vehicle specializations. Each mechanic workshop can be limited to selected GTA vehicle classes. The restriction applies to tuning, removal, diagnostics repairs, and order installation, while an empty selection continues to allow every class.
Configurable vehicle fluid leaks. Severely damaged engine-oil or transmission-fluid parts can create fluid trails while driving. Heavy frontal impacts can also create an immediate spill and start a configurable timed leak for combustion vehicles.
Notable Changes
Existing Job Configurator entries are migrated automatically to add engine_sound_kit to the normal mechanic shop and tablet Parts Shop. The migration is idempotent and preserves custom items and prices.
Added configurable thresholds, probabilities, intervals, speed and distance limits for wear-based oil leaks under Config.OilLeaks.
Added configurable frontal-impact detection using impact speed, speed loss, vehicle damage, optional front deformation, trigger chance, cooldown, leak duration, and spill radius.
Added all vehicle fluid leak and frontal-impact settings to the global in-game Job Configurator under Vehicle Fluid Leaks.
Added configurable provider routing plus SetFluidLeakProvider and ResetFluidLeakProvider client exports for external spill systems.
Added inventory definitions for engine_sound_kit to the ox_inventory, qs-inventory, QB-Core, and ESX documentation examples.
Fixes and Improvements
Fixed custom xenon RGB colors reverting to white after server restarts or garage cycles. Persisted indexed and custom colors are now reapplied after late garage property updates, and transient white values no longer overwrite the saved color.
Fixed txAdmin vehicle repair leaving Vehicle Diagnostics parts damaged. Repairing the occupied vehicle now restores all wear parts, clears catalytic-converter damage when required, and synchronizes the repaired state to clients.
Fixed mechanic debug messages appearing while sky_base debug mode was disabled. Debug helpers now consistently use the shared gated logger without suppressing production warnings or errors.
Fixed /debugwearzero engine_oil being interpreted as a vehicle plate. The command now supports both /debugwearzero [part] for the current vehicle and /debugwearzero [plate] [part].
Improved frontal-impact detection with a short sampling window and removed reliance on GTA's short-lived collision flag.
Update sky_base and sky_jobs_base to their matching releases first.
Download sky_mechanicjob from the CFX Portal and back up your customized files.
Replace the /source folder and update fxmanifest.lua to version 1.16.0.
Replace the built frontend files in /source/html and update /config/locales.
In config/config.lua, add allowedVehicleClasses to every entry inside Config.Jobs. Use an empty table to preserve unrestricted behavior, or list GTA class IDs from 0 through 22:
Config.Jobs = {
{
name = "mechanic",
-- Empty accepts every vehicle class. Example restriction: { 8, 9 }.
allowedVehicleClasses = {},
-- ... existing job settings ...
}
}
In config/config.lua, add the complete Config.OilLeaks block after Config.Wear and before Config.WheelDamage. The new integration table selects the fluid-spill provider; the remaining values become fallback defaults for the in-game Job Configurator:
The new Vehicle Fluid Leaks section is stored by /jobconfig. After the first save, its 25 runtime values override the matching enabled, trail, part-threshold, chance, and frontalImpact fallback values above. The integration provider fields remain managed in config/config.lua.
Open /jobconfig, configure Instant Tuning > Tuning, review Vehicle Fluid Leaks, and review allowedVehicleClasses for every mechanic workshop. Empty vehicle-class selections allow all classes.
Existing Job Configurator jobs receive engine_sound_kit in the normal shop and tablet Parts Shop automatically. If you do not use that migration, add the item to both catalogs manually and add its definition to your inventory framework.
No new setting is required in config/engine_sounds_config.lua when updating from 1.15.0; keep its existing defaultPrice, stockPrice, requiredItem, disableVehicleRadio, and per-sound price values.
Restart sky_base, sky_jobs_base, and sky_mechanicjob.
Test Instant Tuning restrictions, an unsupported vehicle class, custom xenon persistence after a garage cycle, txAdmin repair, and both wear-based and frontal-impact fluid leaks.
Version 1.15.0
Before updating, make sure sky_base and sky_jobs_base are up to date — install the matching releases first. This release also aligns the inventory calls with the matching sky_base release; running it against an older sky_base can break item add/remove.
Highlights
Self-service engine sound orders. Customers can now buy custom engine sounds through self-service tuning, fulfilled as a mechanic tablet order. The install flow opens the hood, plays a mechanic work animation, applies the selected sound, and closes the hood. A new engine_sound_kit item is required for the order.
Configurable engine sound prices. Each custom engine sound can have its own fixed price, including fallback and stock-restoration prices. Prices show correctly in the tuning basket and respect the instant-tuning price multiplier.
Physical brake installs. Normal and ceramic brake tuning now use the same workshop-lift workflow as stance installs — the vehicle must be raised, and the mechanic is guided through all four wheel positions with brake-specific checklist and radial text before the install completes.
Plate installs at the plate. License-plate tuning (plate holder, vanity plate, plate style) now requires the mechanic to stand at the front or rear license plate instead of the vehicle side, with a dedicated checklist step, a contextual radial action, and front/rear distance checks.
Notable Changes
Stance wheel size & width toggles — separate mechanic feature toggles for Stance wheel size and wheel width, disabled by default. When off (via config.lua or the in-game Job Configurator), the related Stance sliders are removed from tuning menus and their values are ignored everywhere, so wheel-scale tuning is not applied.
Engine sound preview no longer touches the radio — applying or previewing a custom engine sound no longer turns the GTA vehicle radio on or switches stations. A dedicated EngineSounds.disableVehicleRadio toggle optionally suppresses only the normal vehicle radio, without changing the custom engine audio itself.
Plate install positioning — new Config.OrderInstall.plateInstallDistance and plateInstallSideTolerance tune how close and how centered on the plate the mechanic must stand for plate installs.
Fixes and Improvements
Fixed engine hoist props not always appearing after a server start or player join until sky_mechanicjob was restarted — the hoist props are now re-synced and respawned reliably during startup.
Fixed custom engine sounds not always persisting for tuning orders or after a vehicle was spawned from a garage — live engine-sound state is now saved and reapplied after restore, so late garage writes can't leave the vehicle on stock audio.
Fixed mechanic paint and persisted tuning not applying immediately to vehicles spawned through Quasar AdvancedGarages map parking — saved paint, stance, RGB, and performance tuning are now reapplied before the player enters the vehicle.
Fixed vehicle mileage resetting when a player drove a vehicle and then disconnected or restarted the resource without a normal driver-exit — mileage is now saved periodically while driving and once more on resource stop.
Migrated internal item add/remove calls to the new sky_base inventory signature (slot + metadata).
Update sky_base and sky_jobs_base first — install the matching releases. The inventory-call change depends on the new sky_base release.
Download sky_mechanicjob from the CFX Portal and create a backup of your customized files.
Replace the /source folder and update fxmanifest.lua (version 1.15.0).
Replace the built frontend files in /source/html.
Run the updated import.sql to seed the new engine_sound_kit item (or add the item to your inventory manually). With Config.AutoExecuteQuery enabled (default) this runs on start.
Update /config/locales (new cz.lua; new brake, plate-install, engine-sound, and Stance-toggle strings in English & German — other languages fall back to English).
Merge config/engine_sounds_config.lua — it adds defaultPrice, stockPrice, requiredItem = "engine_sound_kit", the disableVehicleRadio toggle, and an optional per-sound price:
Config.EngineSounds = {
-- ... existing settings ...
+ defaultPrice = 5000,
+ stockPrice = 5000,
+ requiredItem = "engine_sound_kit",
+ disableVehicleRadio = true, -- keep the normal GTA radio off while applying a custom engine sound
sounds = {
- { audioName = "MONSTER", label = "Monster" },
+ { audioName = "MONSTER", label = "Monster", price = 5000 },
-- ... add a per-sound `price` to each entry (falls back to defaultPrice if omitted) ...
}
}
In config/config.lua, apply the additive changes below (defaults keep the previous behaviour):
Add the two new Stance toggles to Config.ToggleFeatures (both off by default):
Config.ToggleFeatures = {
workshopLift = true,
stanceWheelSize = false, -- enable the Stance wheel-size slider
stanceWheelWidth = false, -- enable the Stance wheel-width slider
}
- Add the `engine_sound_kit` item to each job's tuning catalog and point the `engine_sound` tuning option at it:
```diff
-- in each Config.Jobs[*] item catalog:
{ name = "engine_sound_kit", label = "Engine Sound Kit", price = 750 },
-- and in the tuning options:
engine_sound = {
enabled = true,
Open /jobconfig and review the new Stance wheel-size / wheel-width toggles and engine-sound prices for every mechanic job.
Restart the server, or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Test self-service engine sound orders, brake installs on the lift, plate installs at the front/rear plate, and engine-sound persistence after a garage spawn.
Version 1.14.0
Before updating, make sure sky_base and sky_jobs_base are up to date. This release uses the latest shared interaction, Job Configurator, and tablet notification behavior.
Highlights
Added synchronized custom engine sounds with an audible tuning preview for the mechanic and nearby players.
Added a multiplayer vehicle push system for heavily damaged vehicles, including steering, stamina, terrain effects, and support for up to three players.
Added finer per-job tuning controls for individual upgrade stages, values, and paint ranges such as Chameleon colors.
Improved Stancer synchronization, tuning preview protection, Parts Delivery notifications, and overall client performance.
Notable Changes
Custom engine sounds are now replicated through the vehicle state so nearby players hear the selected sound. The engine continuously revs while an Engine Sound option is focused, making sounds easier to compare before purchase.
Engine sound entries accept common field formats and case-insensitive matching while preserving the configured GTA audio name.
Disabled vehicles can be pushed from the front or rear with E, steered with A/D, moved with W/S, and boosted with SHIFT.
Vehicle pushing supports weight classes, slopes, stamina, helper bonuses, synchronized three-player formations, automatic cancellation, and a dedicated status HUD.
Tuning profiles can enable or disable individual upgrade stages and use allowedValues or blockedValues for exact values and ranges.
The Job Configurator now provides value controls and presets for Standard and Chameleon paint ranges without requiring manual JSON editing.
Realistic Wheel Damage multipliers now update immediately after saving Job Configurator changes and support decimal values such as 0.1.
Secondary tuning sections are grouped under a localized More menu, while the main categories and basket stay directly accessible.
Fixes and Improvements
Unpaid tuning previews now freeze the connected vehicle and restore its original state if the player exits, changes driver, moves the vehicle, or leaves the workshop area.
Stancer wheel size, wheel width, camber, track width, and suspension height remain more reliable after rim changes, installation, garage spawning, vehicle damage, stream-in, and driver changes.
Parts Delivery notifications now validate that a delivery still exists before creating a waypoint. Valid notifications mark the pickup location instead of reopening the Parts Shop.
Mechanic tablet apps are registered for mechanic jobs created only through /jobconfig, not only jobs listed in config.lua.
Reduced idle client usage for Stancer updates, vehicle persistence, vehicle push detection, Parts Delivery checks, and self-service tuning interactions.
Healthy vehicles can no longer be pushed only because their engine was switched off.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal and create a backup of your customized files.
Replace the /source folder and update fxmanifest.lua.
Replace the built frontend files in /source/html.
Update /config/locales, or merge the new Engine Sound, Parts Delivery waypoint, Vehicle Push, and More menu translation keys into custom locale files.
Add or merge config/engine_sounds_config.lua. Custom sound audio files and audio data must still be supplied and ensured by your sound resource. See Custom Engine Sounds for the complete setup.
If you keep a customized adv_config.lua, merge the new Config.VehiclePush section and review its damage threshold, movement, stamina, HUD position, unsupported classes, and weight classes.
If you keep custom tuning profiles in config.lua, review per-stage enabled values and the new allowedValues / blockedValues rules.
Open /jobconfig and review Tuning Prices and Wheel Damage for every mechanic job.
Restart the server or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Test custom engine sounds with two players, damaged-vehicle pushing, restricted tuning values, Stancer persistence, and Parts Delivery notification waypoints.
Version 1.13.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Added partial tuning-order refunds for individual uninstalled positions or all remaining uninstalled positions while keeping installed tuning paid.
Added live inventory counters for every required part in the mechanic tablet's tuning-order details.
Added per-job Nitro access overrides with inherit, enabled, and disabled modes.
Added configurable account or inventory-item payouts for the stolen parts dealer.
Added configurable Stancer slider scales, bounds, and defaults.
Added an external HUD visibility hook for tuning sessions.
Notable Changes
Refunded tuning positions now keep their amount, timestamp, and responsible employee for a complete audit trail.
Order totals and statuses are recalculated after partial refunds, and refunded positions can no longer be installed.
Server-side order locking prevents refund and installation actions from modifying the same order simultaneously.
Required-part counters total matching items across all inventory slots and display (0) when an item is missing.
Parts Delivery now waits for valid network IDs, recreates invalid delivery entities, retries client resolution, and requests a fresh sync when necessary.
Delivery resolver threads are cancelled when deliveries are removed, preventing missing or resurrected pallets and repeated network-object warnings.
Wheel size and width synchronization now handles late-streaming garage vehicles, delayed property restoration, changed wheel setups, and superseded state updates.
Instant Tuning now has its own localized menu title while preserving the existing Admin Tuning, Self Service Tuning, RGB Controller, and Stance Kit titles.
Stance wheel adjustments on Workshop Lifts now use the dedicated streamed tune/anim animation and continue when FiveM reports a custom clip duration of 0.0.
Per-job Nitro access is enforced for boost use, Nitro Kit installation, installation callbacks, and state updates without restricting other workshop tuning features.
Stolen parts dealer item payouts validate inventory capacity and restore the sold part if the payout item cannot be added.
Saved vehicle-specific Stance values remain higher priority than configured slider defaults, while Reset Stance still restores the captured factory state.
Other Changes
Added Config.Functions.SetExternalHudVisible(visible) so external HUDs can be hidden while tuning is open and restored through every central close path.
External HUD export failures are logged without blocking the tuning menu.
Existing tuningCostProfile.nitroAccess values remain supported as a compatibility fallback.
Added detailed stolen parts dealer diagnostics for configurator updates, payout targets, inventory checks, framework results, and balances.
Added validation for invalid Stancer scales and reversed slider bounds.
Added the localized Instant Tuning title to every bundled mechanic locale and rebuilt the production NUI.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder and update fxmanifest.lua.
Replace the built frontend files and /config/locales, or copy the new Instant Tuning and refund translation keys into your custom locale files.
Copy the new /stream/tune.ycd animation file included with the resource.
If you keep your own mechanic job entries in config.lua, add the new Nitro access setting to each job:
nitroAccess = "inherit" -- "inherit", "enabled", or "disabled"
If you keep your own Config.PartsTheft, update the stolen parts dealer settings:
If you keep your own adv_config.lua, add the new Stancer slider configuration:
Config.StancerOptions = {
scale = 100,
bounds = {
camber_front = { min = -45, max = 45 },
camber_rear = { min = -45, max = 45 },
track_width_front = { min = 0, max = 150 },
track_width_rear = { min = 0, max = 150 },
suspension_height = { min = -30, max = 30 }
},
defaults = {
camber_front = 0,
camber_rear = 0,
track_width_front = 80,
track_width_rear = 80,
suspension_height = 0
}
}
To integrate an external HUD, override the new hook in adv_config.lua:
Config.Functions.SetExternalHudVisible = function(visible)
exports["your_hud_resource"]:SetHudVisible(visible)
end
Review the new Nitro access and stolen parts dealer payout settings in /jobconfig.
Restart the server or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Version 1.12.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Added support for GTA V's VMT Lightbar tuning slot, including pricing, required items, previews, installation, localization, and persistence.
Added automatic Workshop Lift detection for configured MLO/YMAP lift props and support for multiple lift model sets.
Reworked Stance installation into a physical four-wheel Workshop Lift workflow for tuning orders and the usable Stance Kit.
Added optional police dispatch alerts for successful wheel and catalytic converter thefts.
Notable Changes
Stance changes are now installed at all four wheel positions while the vehicle is raised on a configured Workshop Lift.
A localized Stance checklist and contextual radial actions track each completed wheel position before the selected Stance is applied and saved.
Existing matching MLO/YMAP lift props can now be reused instead of spawning duplicate lift objects.
Configured lift prop pairs can be discovered automatically without placing a workshop_lift point in Workshop Creator.
Compatible vehicles now show Lightbar variants from modification slot 49 in the Bodywork tuning section; vehicles without variants remain unchanged.
Repair Kits can now separately control normal vehicle damage, realistic wheel damage, and every mechanic wear part they restore.
Persisted engine, brake, transmission, suspension, turbo, armor, and Custom Handling upgrades are restored more reliably after garage spawning.
Self-service tuning markers are restored correctly when older Job Configurator data contains self_service_tuning.interaction=false.
Successful parts thefts can send configurable police dispatches with custom jobs, title, message, and cooldown.
Other Changes
Added Config.Functions.SendPartsTheftDispatch(source, data) so server owners can replace the default sky_jobs_base dispatch integration.
Existing MLO lift props are preserved during cleanup, refreshes, and resource stops.
Added periodic lift prop discovery for MLO objects that stream in after resource start.
Added detailed stolen parts dealer payout diagnostics for the active payout account, inventory changes, framework payout result, and before/after balances.
Added performance tuning values to vehicle persistence debug logs.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder and update fxmanifest.lua.
Replace the /config/locales folder, or copy the new Lightbar, Stance installation, checklist, progress, notification, and validation translation keys into your custom locale files.
If you keep your own adv_config.lua, update Config.WorkshopLiftSystem with configurable lift model sets and existing MLO/YMAP prop detection:
If you keep your own adv_config.lua, add the new Workshop Lift radial distance setting inside Config.WorkshopLiftSystem:
radialDistance = 4.5
If you keep your own parts delivery config, add the new timer HUD settings inside Config.PartsDelivery:
timerHud = {
enabled = true,
position = {
left = "50%",
top = "3vh"
}
}
Restart the server or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Version 1.10.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Improved vehicle repair reliability so fix kit repairs now also reset mechanic wear consequences and limp-mode states.
Stabilized Stancer defaults, persistence, wheel size, and wheel width handling across tuning, checkout, parking, and restarts.
Added stronger RGB xenon and neon persistence guards so saved light settings are not overwritten by temporary stock-like vehicle reads.
Added Workshop Lift debug diagnostics to help investigate invisible, duplicated, or incorrectly synced lift props.
Improved Job Configurator integration by disabling the legacy Workshop Creator when the configurator flow is active.
Notable Changes
Fixed normal fix_kit repairs so they clear transmission limp mode, electric limp mode, engine damage, undriveable state, and related wear effects.
Fixed stale physical carry item states so mechanics can take parts from storage again without needing to reconnect.
Updated the mileage HUD runtime toggle so it appears or disappears immediately for active drivers after Job Configurator changes.
Reworked Stancer reset/default handling so vehicle defaults are captured once and custom stance changes are saved separately.
Preserved persisted Stancer values when unstable native reads return stock-like values during save or restore windows.
Improved Wheel Size and Wheel Width handling with dedicated Stancer option detection, tire/rim collider updates, and debug readback output.
Protected saved xenon and underbody neon settings from being replaced by transient disabled/default live reads outside active tuning sessions.
Added localized Workshop Creator disabled messages for all supported mechanic locale files.
Added detailed debug-only lift logs for model names, hashes, entities, coordinates, nearby objects, cleanup, creator sync, and attach/detach broadcasts.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace fxmanifest.lua so version 1.10.0 is loaded (it now also loads the new config/init.lua).
Add the new /config/init.lua file.
Important — the global table initialization moved to config/init.lua. If you keep your own config/config.lua instead of replacing it, remove these two lines from the top of the file (they are now set in init.lua):
Replace the mechanic locale files if you want the new Workshop Creator disabled message in all supported languages.
Restart the server or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Test fix kit repairs, Stancer reset/persistence, RGB xenon/neon persistence, carry-item storage pickup, mileage HUD toggles, and workshop lift behavior.
Version 1.9.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Improved mechanic tuning, carry-item, parts delivery, and instant tuning flows.
Added Engine Hoist support for engine installs.
Added better Instant Tuning management through the Job Configurator.
Notable Changes
Fixed engine installs so carried engines and inventory engines are both handled correctly.
Fixed moved parts delivery pallets so they can still be unpacked.
Fixed tuning freecam focus so players can return to the tuning UI more reliably.
Fixed tuning basket removal so other preview changes are not lost.
Fixed unpaid light previews so they are restored when tuning is closed.
Added stancer support to the applied tuning list in the mechanic tablet.
Added an admin full vehicle repair export.
Improved customer name display by preferring in-game character names.
Fixed self-service tuning so it creates mechanic orders again.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace fxmanifest.lua so version 1.9.0 is loaded.
Replace config/config.lua if you want the new default Engine Hoist carry-item transport setting.
Restart the server or fully restart sky_base, sky_jobs_base, and sky_mechanicjob.
Open /jobconfig and verify Instant Tuning, Tuning Prices, and Carry Items if Config.UseJobConfigurator = true.
Version 1.8.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Added shared in-game job configurator support for mechanic jobs, features, interactions, pricing/settings, parts delivery, wear, wheel damage, vehicle care, and carry-item settings.
Notable Changes
Fixed Nitro, Anti-Lag, and Two-Step backfire effects on tuned exhausts through shared vehicle effect handling.
Added config/adv_config.lua and moved advanced/static settings out of the main config/config.lua.
Update sky_base and sky_jobs_base first.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace fxmanifest.lua so version 1.8.0 and the new config file list are loaded.
Replace config/config.lua.
Add the new config/adv_config.lua.
Restart the server or fully restart sky_mechanicjob.
Open /jobconfig and verify the Mechanic Job settings if Config.UseJobConfigurator = true.
Version 1.7.1
Before updating, make sure sky_base and sky_jobs_base are up to date.
Changes
Fixed vehicle color handling so selected paint, custom colors, pearlescent, wheel, dashboard, and interior colors are kept more reliably after tuning and restoring vehicles.
Reworked Stancer saving and loading so stance changes stay synced better, while self-service previews no longer save unpaid changes before checkout.
Download sky_mechanicjob from the CFX Portal.
Replace the /source folder.
Replace fxmanifest.lua so version 1.7.1 is loaded.
Restart the server.
Version 1.7.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Stancer persistence was fully stabilized across re-enter, garage outpark, impound retrieval, menu close/reopen, and resource restart.
Vehicle restore timing and guard flow were cleaned up to stop duplicate overwrite waves and workshop flicker behavior.
Core runtime systems (Anti-Lag, Nitro, Two-Step, Self-Service pricing, Instant Tuning access) were unified and made more reliable.
Notable Changes
Stancer persistence overhaul:
Added session snapshot + dirty-state handling to prevent transient GTA defaults from overwriting tuned stance.
Added immediate debounced save for camber, track width, suspension height, wheel size, and wheel width.
Added stronger delayed stance stability checks for suspension/camber/track after restore.
Persistence stability fixes:
Fixed runtime blockers around sanitizePlate and lastKnownStanceByPlate.
Fixed local guard scope/order in vehicle persistence to prevent purchase callback instability.
Reduced broad reapply storms and duplicate late restore paths.
Self-Service / Instant Tuning:
Public self-service pricing visibility is now controlled by Config.TuningCostProfile.publicUsersSeePrices.
Instant tuning now supports global and per-location job restrictions (mechanicOnly, allowedJobs/jobs) with client/server enforcement.
Two-Step / Anti-Lag / Nitro runtime:
Anti-Lag moved to config-driven runtime balancing.
Two-Step now includes configurable launch-control behavior and improved trigger consistency.
Nitro got live HUD/progress sync improvements, better hide behavior, and stronger config runtime control.
Other Changes
Reduced repeated paint apply bursts and restore spam in heavy spawn/re-enter windows.
Improved tuning close behavior so unpaid preview/reset flows do not persist unintended changes.
Restart the server or fully restart the affected resources.
Test vehicle restore after garage, impound, outpark, re-enter, and restart flows.
Test paint, pearlescent, xenon, RGB, livery, and stance values on multiple vehicle types.
Version 1.5.0
Before updating, make sure sky_base and sky_jobs_base are up to date.
Highlights
Added optional physical item carrying through Config.CarryItems, where delivered orders must be unpacked and parts become physical objects that mechanics carry through the workshop by hand or transport in bulk with pallets and forklifts.
Added workshop prop placement support, including configurable props such as cones, barriers, work lights, and parts boxes for better rp.
Notable Changes
Added a forklift to the default mechanic vehicle list for workshops that use physical delivery handling.
Added optional drivetrain swap whitelisting through Config.CustomHandlingOptions.drivetrainWhitelist for vehicles that are safe to switch between drivetrain presets.
Tuning orders are now scoped per workshop, and the vehicle registry now keeps each mechanic business separated correctly.
Added Kiminaze Advanced Parking integration to avoid duplicate vehicles during stance resets.
Improved install flows by skipping hood-opening steps on vehicles without a hood and hiding armor tuning on bikes.
Other Changes
Improved persistence for window tint, liveries, underbody neons, anti-lag state, and paint data.
Fixed vehicles becoming chrome, windows breaking unexpectedly, and braking issues on some addon vehicles.
Fixed stance synchronization for nearby players.
Refunds are now limited to unstarted orders, and refunded orders can now be deleted.
Added Russian translations.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace fxmanifest.lua so version 1.5.0 is loaded.
Add the new workshop props and forklift vehicle entries from the updated Config.Jobs section if you want to use the new prop placement and delivery workflows.
Add interactionDistance to Config.Interactions.self_service_tuning and Config.Interactions.part_delivery if you want to customize those ranges:
interactionDistance = 2.5
Add Config.CarryItems from the new config if you want delivered parts to become physical objects that must be transported through the workshop.
Add the optional drivetrain whitelist if you use drivetrain swaps and want to restrict them to tested vehicle models:
Requires sky_base 1.14.0 or newer andsky_jobs_base 1.15.0 or newer. The admin permission system has been replaced - sky_base must be updated and the three bootstrap ACEs must be added to your server.cfg before ensure sky_base, otherwise /admintuning, /migrate, /workshopcreator, /setboss, and every other admin command will deny everyone except the server console.
Highlights
Added an Applied Tuning section to Vehicle Diagnostics App so mechanics can see and set installed tuning back to stock and receive configured install items back.
Tuning removal now uses the same install workflows as tuning installs, including wheel, brake, suspension, and simple checklist flows.
Added optional workshop-location enforcement for tuning installs and removals through Config.TuningWorkshopRequirement.
Added synced stance state so stance changes are visible to nearby players without them entering the vehicle.
Notable Changes
Command permissions now use sky_base ACE auto-wiring through Config.CommandPermissions, including the Workshop Creator permission.
Parts theft configuration was consolidated into Config.PartsTheft, including lug wrench item settings, stolen wheel item settings, and stolen parts dealer settings.
Instant tuning points can now force marker interaction through Config.InstantTuning.forceMarkerInteraction.
Vehicle lookup now includes a fallback for police vehicles, fixing car jack, wheel, nitro, and catalytic converter interactions on some vehicle classes.
Saved vehicle properties no longer re-apply persisted dirt level when vehicles are entered or tuning data is loaded.
Nitro HUD, order item images, and stolen parts dealer images now use the configured NUI item image base from sky_jobs_base.
Other Changes
Added Swedish translations.
Improved applied tuning loading for diagnostics.
Improved stance sync performance.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace fxmanifest.lua so version 1.4.0 is loaded.
Update Config.CommandPermissions so command permissions are registered through sky_base ACE auto-wiring:
Add overwriteHandling to Config.CustomHandlingOptions:
Config.CustomHandlingOptions = {
enabled = true,
-- Set this to true only when another handling editor/resource overwrites handling on every vehicle enter.
-- WARNING: If no other handling script resets the vehicle handling first, this can multiply tuning again on each vehicle enter.
overwriteHandling = false,
-- ...
}
Add the electric vehicle fallback config if your server run below game build 3258:
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added Vehicle Part Theft as a new criminal gameplay loop where catalytic converters and wheels can be stolen, sold, and repaired.
Added the stolen parts dealer interaction and UI so stolen wheels and catalytic converters can be sold to configured NPC dealers.
Added realistic theft consequences: stolen catalytic converters change vehicle sound and create smoke, while stolen wheels leave vehicles sitting on bricks.
Notable Changes
Added lug wrench theft selection so players can choose whether to steal a wheel or catalytic converter.
Added realistic catalytic converter removal and installation minigames using a jack, bolt interaction, and guided checklist flow.
Added wheel theft support using the existing wheel workflow, synced missing-wheel state, and inventory rewards.
Mechanics can repair stolen parts through diagnostics by replacing catalytic converters or missing wheels.
Added electric vehicle wear support for traction batteries and power inverters, including diagnostics labels and repair flows.
Tuning options can now be disabled individually and can define their own required install items directly in Config.TuningCostProfile.
Added Config.TuningCostProfile.freeVehicles for vehicles that should create free tuning orders.
Vehicle purchase price lookup is now configurable through Config.Functions.GetVehiclePurchasePrice.
Other Changes
Fixed vehicle paint saving and engine health restoration after re-entering vehicles.
Disabled stance support for motorbikes.
Self service tuning now always uses a marker instead of target.
Added lug_wrench.png, catalytic_converter.png, traction_battery.png, inverter.png, antilag_kit.png, and nitro_kit.png inventory images.
Added English, German, and French locale keys for part theft, catalytic converter work, wheel theft, stolen parts dealer, and electric vehicle wear parts.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace the /html or built frontend files included with the resource so the catalytic converter minigame, lug wrench choice, and stolen parts dealer UI are available.
Replace fxmanifest.lua so the new client/server files and version 1.2.0 are loaded.
Copy the new inventory images from config/inventory into your inventory item image setup if your inventory requires item images.
Add the new theft and electric vehicle items to your mechanic shop items:
Add forceMarkerInteraction = true to Config.Interactions.self_service_tuning if you use marker-based self-service tuning.
Update Config.TuningCostProfile from the new config.
Add or merge Config.Functions.GetVehiclePurchasePrice from config/sv_functions.lua.
Add lug_wrench, catalytic_converter, traction_battery, and inverter to your inventory item definitions.
Add one or more stolen_parts_dealer points in Workshop Creator where stolen parts should be sold.
Version 1.1.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added configurable instant tuning locations that can apply tuning directly without creating a workshop order.
Added tuning order refund and completed-order delete actions in the mechanic tablet.
Added a fix_kit usable item workflow for repairing nearby vehicles, including realistic wheel damage repair support.
Notable Changes
Tuning prices can now use percentage-based or fixed money values through Config.TuningCostProfile.priceType.
Tuning cost config keys were standardized from percentage-specific names to generic cost fields.
The mechanic tablet now shows order status and payment method, and supports refunded order state.
Currency display is now configurable through locale files.
Custom handling tuning options now save correctly and show as applied in the tuning menu.
Fix kit repairs can reset realistic wheel damage when Config.VehicleCare.repair.fixRealisticWheelDamage is enabled.
Other Changes
Added fix_kit.png inventory image.
Added society_job, refunded_at, refunded_by_identifier, and refunded_by_name columns to sky_mechanic_tuning_orders.
Added English, German, and French locale keys for instant tuning, order refunds, order deletion, fix kit, and configurable currency symbols.
Updated French translations.
Fixed wheel damage repair behavior when using the fix kit.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace the /html or built frontend files included with the resource so the updated tablet order actions and currency display are available.
Replace fxmanifest.lua so version 1.1.0 is loaded.
Copy config/inventory/fix_kit.png into your inventory item image setup if your inventory requires item images.
If you use custom locale files, copy the new instant tuning, order refund/delete, fix kit, and currency translation keys from the updated locale files.
Update Config.TuningCostProfile to the new pricing format in the new config.
Add fix_kit to your inventory item definitions if your inventory requires explicit item registration.
If Config.AutoExecuteQuery = false, run the updated import.sql manually so the tuning order refund columns are created.
Version 1.0.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added a realistic wheel damage system with synced wheel damage state, popped tyres, detached wheels, and handling penalties.
Added damaged-wheel repair support through the vehicle diagnostics repair flow.
Improved workshop car lift synchronization so raised vehicles and lift attachments stay consistent for other players.
Notable Changes
Wheel damage now reacts to collisions and hard landings, with configurable multipliers per vehicle class and off-road wheel type.
Wheel damage is synchronized through vehicle state bags and can be reset by mechanic repair actions.
Only one wheel can detach from a vehicle at a time to reduce vehicle physics issues.
Wheel damage runtime performance was improved and the default config was cleaned up.
Sponge and wax inventory item images were added for the vehicle care items introduced in the previous update.
Fixed lift vehicle sync and duplicate lift prop issues.
Other Changes
Added source/client/wheel_damage.lua and source/server/wheel_damage.lua.
Added source/server/lift.lua.
Added Config.WheelDamage.
Updated the diagnostics tablet flow for damaged wheel repairs.
Added wash_sponge.png and vehicle_wax.png inventory images.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace the /html or built frontend files included with the resource so the updated diagnostics repair flow is available.
Replace fxmanifest.lua so source/client/wheel_damage.lua, source/server/wheel_damage.lua, source/server/lift.lua, and version 1.0.0 are loaded.
Copy config/inventory/wash_sponge.png and config/inventory/vehicle_wax.png into your inventory item image setup if your inventory requires item images.
Add the new wheel damage config to config/config.lua:
If you use custom diagnostics or wear repair config, make sure tyre repairs are allowed to use the updated wheel repair flow.
Version 0.6.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added vehicle wash and vehicle wax usable-item workflows, including dedicated wash/wax items, animations, particle effects, and a vehicle-care minigame.
Added realistic wheel-based brake and suspension install flows so brake and suspension work now uses jack, wheel detach, component install, wheel attach, and jack removal steps.
Added a configurable install duration and an on-screen progress bar for non-minigame install actions.
Notable Changes
Vehicle wax now keeps a clean vehicle clean for a configurable mileage window through Config.VehicleCare.wax.cleanKilometers.
Wash and wax items are now available in the mechanic shop and Parts Shop delivery catalog.
Brake pad and suspension wear repairs now use the wheel workflow instead of a simple repair flow.
Improved mechanic animations for under-hood repairs, engine swaps, oil draining, oil pouring, and underbody installs.
Added storage, locker, and trunk background images for the mechanic UI.
Fuel level is no longer overwritten when saving or restoring mechanic vehicle properties.
Other Changes
Added source/client/vehicle_care.lua and source/server/vehicle_care.lua.
Added Config.OrderInstall.nonMinigameDurationMs.
Added Config.VehicleCare for wash and wax item configuration.
Added English, German, and French translation keys for vehicle care and the new wheel checklist steps.
Fixed repaint workflow particle effects.
Updated the wheel attach minigame so brake and suspension workflows can reattach the existing wheel.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace the /html or built frontend files included with the resource so the vehicle-care minigame, install progress bar, and storage backgrounds are available.
Replace fxmanifest.lua so source/client/vehicle_care.lua, source/server/vehicle_care.lua, config/img/**, and version 0.6.0 are loaded.
If the release package includes /config/img, copy it so the new storage, locker, and trunk background images are available.
If you use custom locale files, copy the new vehicle-care and wheel-checklist translation keys from the updated locale files.
Add the new wash and wax items to your mechanic shop items:
Add wash_sponge and vehicle_wax to your inventory item definitions and item images if your inventory requires them.
If you use custom wear repair config, make sure brake pad and suspension repairs use the wheel flow.
Version 0.5.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added the Parts Shop tablet app for mechanic part orders, including catalog browsing, category filters, basket checkout, own-card and company-card payment, and order history.
Added Parts Delivery points for Workshop Creator so ordered parts arrive as physical delivery boxes at configured workshop locations.
Added tablet push notifications when part deliveries are ready to collect.
Notable Changes
Parts purchases can now be logged in the boss menu, including order UID, price, and ordered item summary.
Parts deliveries now support delivery ETA, pending/ready/claimed status tracking, claim history, and ready-delivery lookup by delivery point.
Delivery box props now scale by order size so larger orders use larger box piles.
Company-card checkout now uses the PURCHASE_SUPPLIES job permission and validates company balance before placing an order.
The Parts Shop app now reopens correctly after closing the tablet, and app permission routing was fixed.
Tuning freecam now blocks player controls while keeping camera look controls available.
Wheel lug nut indicators are easier to see in the wheel detach minigame.
Other Changes
Added the sky_mechanic_part_deliveries database table and automatic migration support.
Added English translation keys for Parts Shop, Parts Delivery, checkout errors, order history, and delivery notifications.
Fixed order history timestamps.
Improved delivery interaction logic.
Refined Parts Shop navbar, color theming, and overall design.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace the /html or built frontend files included with the resource so the new Parts Shop tablet app is available.
Replace fxmanifest.lua so @sky_jobs_base/source/enums/Permission.lua, source/client/parts_delivery.lua, source/server/parts_delivery.lua, and version 0.5.0 are loaded.
If you use custom locale files, copy the new Parts Shop and Parts Delivery translation keys from the updated locale files.
Add the new Parts Delivery interaction to Config.Interactions:
Add a part_delivery point in Workshop Creator for every workshop that should receive part orders.
If Config.AutoExecuteQuery = false, run the updated import.sql manually so sky_mechanic_part_deliveries is created.
Version 0.4.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added synced custom xenon colors across players, including re-application when vehicles stream in or players join.
Added German and French translations.
Added a tuning menu reset button for stancing so vehicles can be restored to default stance values directly from the UI.
Notable Changes
Improved stancing persistence when leaving and re-entering vehicles, including wheel size, wheel width, camber, track width, suspension height, and wheel rotation values.
Improved performance for nitro, anti-lag, two-step, RGB effects, vehicle wear, and general in-vehicle idle loops.
Nitro now uses keymapping support through Config.Nitro.activationKey, with separate timing controls for active ticks, input checks, local effects, and remote effects.
Engine hoist props created through the Workshop Creator now spawn and sync more reliably from configured placement points.
Fixed unwanted neon installs during the order workflow.
Other Changes
Fixed stance reset behavior in the tuning menu.
Fixed engine hoist placement in the Workshop Creator flow.
Cleaned up stancing and nitro runtime logic for better maintainability.
Updated two-step default flame scale values.
Download sky_mechanicjob from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace fxmanifest.lua so the new source/client/xenon_sync.lua file and version metadata are loaded.
If you use custom locale files, copy the new translation keys from the updated locale files.
If you use custom config files, update Config.Interactions.self_service_tuning:
If Config.AutoExecuteQuery = false, run the updated import.sql manually so the vehicle profile primary-key migration fix is applied.
Version 0.2.0
Before updating, make sure sky_base and sky_jobs_base is up to date.
Highlights
Added the Vehicles App to the mechanic tablet with searchable, paginated vehicle records, linked tuning orders, service history, tags, notes, and gallery image assignment.
Added automatic database migration support through Config.AutoExecuteQuery.
Added /migrate command for importing tuning data from previous mechanic scripts such as jg-mechanic.
Notable Changes
Vehicle history is now logged for order installs, nitro installs/refills, and wear repairs, including used items, mechanic details, duty state, and action metadata.
Tuning orders can now link back into the Vehicles App, and vehicle records only list vehicles that have mechanic orders.
Tablet apps now reopen and close more reliably, including direct order selection from linked vehicle records.
Self-service tuning now supports multiple placement points and requires the player to be the driver.
Added optional off-duty job configuration per mechanic job.
Xenon color changes now calculate order pricing correctly.
Other Changes
Added sky_mechanic_vehicle_profiles and sky_mechanic_vehicle_history database tables.