⚙️Config File
The script is plug and play , however if you want to customize the script to your liking feel free to explore config files.
Config = Config or {}
Menu = {}
--[[
===============================
⚙️ Developer Debug Settings
===============================
]]
Config.RefreshTime = 2000 -- Interval in ms to refresh zone checks (0 disables)
Config.debugPoly = false -- Enables drawing of polyzone outlines (used for debugging zone shapes)
Config.debug = false -- Enables printing debug info to console
--[[
===============================
⚙️ Core Settings
===============================
]]
Config.Framework = "auto" -- "qb", "esx", "auto","standalone" If you dont want to use any provided framework functions, Checkout sv_editable.lua
Config.AllowOnlyOwnedVehicles = false -- Only allow stancing for vehicles the player owns (logic handled in sv_editable.lua)
Config.Notify = "ox_lib" -- Notification system to use (supports: codem, esx, qb, okok, wasabi, t-notify, r_notify, pNotify, mythic, ox_lib)
Config.StanceRenderDistance = 250.0 -- Max distance (in meters) at which stance changes are applied to vehicles
--[[
===============================
📍 Location & Blip Settings
===============================
]]
Config.GeneralBlip = {
Sprite = 545, -- Blip icon (https://docs.fivem.net/docs/game-references/blips/)
Display = 4, -- Blip display mode
Scale = 0.6, -- Size of the blip
Colour = 70, -- Blip color (https://docs.fivem.net/docs/game-references/blips/#blip-colors)
Name = "Tuff Stance Location" -- Name that appears on the map
}
-- Locations where stancer is available
Config.Stance_Locations = {
["1"] = {
enable = true, -- Enables this location
coords = vec4(-373.714294, -115.292305, 38.682007, 175.748032), -- Coordinates and heading for the interaction
interactDistance = 5.0, -- Max distance to trigger interaction
ItemRequired = false, -- Whether specific item(s) are required
ItemChecks = { toolkit = true, stancekit = true }, -- If ItemRequired is true, list items that can be accepted (set any to true)
IgnoreCarLiftSection = true, -- Set true to allow stancing without using the carlift to apply it
DynamicPricings = { -- Dynamic Pricing for each option
WHEEL_TYPE = 500,
WHEEL_NUMBER = 500,
ALL_WHEELS_WIDTH = 100,
ALL_WHEELS_SIZE = 100,
ALL_WHEELS_OFFSET = 100,
ALL_WHEELS_CAMBER = 100,
SUSPENSION_HEIGHT = 100,
WHEEL_FRONT_LEFT_OFFSET = 100,
WHEEL_FRONT_RIGHT_OFFSET = 100,
WHEEL_REAR_LEFT_OFFSET = 100,
WHEEL_REAR_RIGHT_OFFSET = 100,
WHEEL_FRONT_LEFT_CAMBER = 100,
WHEEL_FRONT_RIGHT_CAMBER = 100,
WHEEL_REAR_LEFT_CAMBER = 100,
WHEEL_REAR_RIGHT_CAMBER = 100,
},
Options = { -- Disable/Enable any options for this location
WHEEL_TYPE = true,
WHEEL_NUMBER = true,
ALL_WHEELS_WIDTH = true,
ALL_WHEELS_SIZE = true,
ALL_WHEELS_OFFSET = true,
ALL_WHEELS_CAMBER = true,
SUSPENSION_HEIGHT = true,
WHEEL_FRONT_LEFT_OFFSET = true,
WHEEL_FRONT_RIGHT_OFFSET = true,
WHEEL_REAR_LEFT_OFFSET = true,
WHEEL_REAR_RIGHT_OFFSET = true,
WHEEL_FRONT_LEFT_CAMBER = true,
WHEEL_FRONT_RIGHT_CAMBER = true,
WHEEL_REAR_LEFT_CAMBER = true,
WHEEL_REAR_RIGHT_CAMBER = true,
},
JobLock = {
JobRequired = false, -- Whether a job check is required to access stancing
jobs = {
mechanic = { 1, 2, 3 }, -- Mechanic job allowed with grade 1, 2 or 3
police = true -- Police job allowed, all grades
}
},
Invoice = {
AllowInvoice = false,
InvoiceSocietyName = 'mechanic'
},
blip = true, -- Whether to display a blip for this location
blipDetails = {} -- Datas that are in this will be callbacked to the global blip details (Config.Generalblip)
-- Example custom blipDetails:
-- blipDetails = {
-- Sprite = 446,
-- Scale = 0.5,
-- Name = "Custom Stancer Shop"
-- }
},
["2"] = {
enable = true, -- Enables this location
coords = vec4(-686.75, -810.94, 33.06, 96.31), -- Coordinates and heading for the interaction
interactDistance = 5.0, -- Max distance to trigger interaction
ItemRequired = false, -- Whether specific item(s) are required
ItemChecks = { toolkit = true, stancekit = true }, -- If ItemRequired is true, list items that can be accepted (set any to true)
IgnoreCarLiftSection = false, -- Set true to allow stancing without using the carlift to apply it
DynamicPricings = { -- Dynamic Pricing for each option
WHEEL_TYPE = 500,
WHEEL_NUMBER = 500,
ALL_WHEELS_WIDTH = 100,
ALL_WHEELS_SIZE = 100,
ALL_WHEELS_OFFSET = 100,
ALL_WHEELS_CAMBER = 100,
SUSPENSION_HEIGHT = 100,
WHEEL_FRONT_LEFT_OFFSET = 100,
WHEEL_FRONT_RIGHT_OFFSET = 100,
WHEEL_REAR_LEFT_OFFSET = 100,
WHEEL_REAR_RIGHT_OFFSET = 100,
WHEEL_FRONT_LEFT_CAMBER = 100,
WHEEL_FRONT_RIGHT_CAMBER = 100,
WHEEL_REAR_LEFT_CAMBER = 100,
WHEEL_REAR_RIGHT_CAMBER = 100,
},
Options = { -- Disable/Enable any options for this location
WHEEL_TYPE = true,
WHEEL_NUMBER = true,
ALL_WHEELS_WIDTH = true,
ALL_WHEELS_SIZE = true,
ALL_WHEELS_OFFSET = true,
ALL_WHEELS_CAMBER = true,
SUSPENSION_HEIGHT = true,
WHEEL_FRONT_LEFT_OFFSET = true,
WHEEL_FRONT_RIGHT_OFFSET = true,
WHEEL_REAR_LEFT_OFFSET = true,
WHEEL_REAR_RIGHT_OFFSET = true,
WHEEL_FRONT_LEFT_CAMBER = true,
WHEEL_FRONT_RIGHT_CAMBER = true,
WHEEL_REAR_LEFT_CAMBER = true,
WHEEL_REAR_RIGHT_CAMBER = true,
},
JobLock = {
JobRequired = true, -- Whether a job check is required to access stancing
jobs = {
mechanic = { 1, 2, 3 }, -- Mechanic job allowed with grade 1, 2 or 3
police = true -- Police job allowed, all grades
}
},
Invoice = {
AllowInvoice = true,
InvoiceSocietyName = 'mechanic'
},
blip = true, -- Whether to display a blip for this location
blipDetails = {} -- Datas that are in this will be callbacked to the global blip details (Config.Generalblip)
-- Example custom blipDetails:
-- blipDetails = {
-- Sprite = 446,
-- Scale = 0.5,
-- Name = "Custom Stancer Shop"
-- }
},
["3"] = {
enable = true, -- Enables this location
coords = vec4(-1424.09, -449.6, 35.91, 204.56), -- Coordinates and heading for the interaction
interactDistance = 5.0, -- Max distance to trigger interaction
ItemRequired = false, -- Whether specific item(s) are required
ItemChecks = { toolkit = true, stancekit = true }, -- If ItemRequired is true, list items that can be accepted (set any to true)
IgnoreCarLiftSection = false, -- Set true to allow stancing without using the carlift to apply it
DynamicPricings = { -- Dynamic Pricing for each option
WHEEL_TYPE = 500,
WHEEL_NUMBER = 500,
ALL_WHEELS_WIDTH = 100,
ALL_WHEELS_SIZE = 100,
ALL_WHEELS_OFFSET = 100,
ALL_WHEELS_CAMBER = 100,
SUSPENSION_HEIGHT = 100,
WHEEL_FRONT_LEFT_OFFSET = 100,
WHEEL_FRONT_RIGHT_OFFSET = 100,
WHEEL_REAR_LEFT_OFFSET = 100,
WHEEL_REAR_RIGHT_OFFSET = 100,
WHEEL_FRONT_LEFT_CAMBER = 100,
WHEEL_FRONT_RIGHT_CAMBER = 100,
WHEEL_REAR_LEFT_CAMBER = 100,
WHEEL_REAR_RIGHT_CAMBER = 100,
},
Options = { -- Disable/Enable any options for this location
WHEEL_TYPE = true,
WHEEL_NUMBER = true,
ALL_WHEELS_WIDTH = true,
ALL_WHEELS_SIZE = true,
ALL_WHEELS_OFFSET = true,
ALL_WHEELS_CAMBER = true,
SUSPENSION_HEIGHT = true,
WHEEL_FRONT_LEFT_OFFSET = true,
WHEEL_FRONT_RIGHT_OFFSET = true,
WHEEL_REAR_LEFT_OFFSET = true,
WHEEL_REAR_RIGHT_OFFSET = true,
WHEEL_FRONT_LEFT_CAMBER = true,
WHEEL_FRONT_RIGHT_CAMBER = true,
WHEEL_REAR_LEFT_CAMBER = true,
WHEEL_REAR_RIGHT_CAMBER = true,
},
JobLock = {
JobRequired = true, -- Whether a job check is required to access stancing
jobs = {
mechanic = { 1, 2, 3 }, -- Mechanic job allowed with grade 1, 2 or 3
police = true -- Police job allowed, all grades
}
},
Invoice = {
AllowInvoice = true,
InvoiceSocietyName = 'mechanic'
},
blip = true, -- Whether to display a blip for this location
blipDetails = {} -- Datas that are in this will be callbacked to the global blip details (Config.Generalblip)
-- Example custom blipDetails:
-- blipDetails = {
-- Sprite = 446,
-- Scale = 0.5,
-- Name = "Custom Stancer Shop"
-- }
},
}
--[[
===============================
🔐 Admin Settings
===============================
]]
Config.Administration = {
StanceCommand = "adminstancer", -- Command to force-open stancer UI as admin
RemoveStancerCommand = "adminrestancer", -- Command to remove stance from target vehicle
RemovePrice = 0 -- Price to charge for removing stance (0 = free)
}
--[[
===================
TEXTUI Settings
===================
]]
-- Determines how the interaction UI is triggered.
-- Options:
-- "buttonPress" - Press a key (e.g. "E") to interact.
-- "RadialMenu" - Uses a radial menu to interact.
Config.Interact = "buttonPress"
-- If Config.Interact is set to "RadialMenu", specify which radial menu system to use.
-- Options:
-- "qb-radialmenu" - Default QB-core radial menu.
-- "ox_lib" - ox_lib radial menu support.
-- "custom" - Use your own custom implementation (handled in cl_editable.lua).
Config.RadialMenu = "ox_lib"
-- Which text UI system to use for showing interaction hints.
-- Options:
-- "ox_lib" - Uses ox_lib's built-in text UI.
-- "cd_drawtextui" - Uses cd_drawtextui system.
-- "jg-textui" - Uses jg-textui system.
-- "lab-HintUI" - Uses lab-HintUI system.
-- "okokTextUI" - Uses okokTextUI system.
Config.DrawTextScript = 'ox_lib'
-- Configuration for displaying the interaction text UI.
Config.DrawTextUI = {
enable = true, -- Enable or disable the text UI system.
hotkey = "e", -- Key to press for interaction if using "buttonPress".
text = "Press %s to open Stance Menu", -- Text to show. "%s" will be replaced by the hotkey automatically.
custom = function(text) -- Function to show the text UI using the selected DrawTextScript.
if Config.DrawTextScript == 'ox_lib' and lib then
lib.showTextUI(text, {
position = "top-center",
icon = 'hand',
style = {
borderRadius = 0,
backgroundColor = '#48BB78',
color = 'white'
}
})
elseif Config.DrawTextScript == 'cd_drawtextui' then
TriggerEvent('cd_drawtextui:ShowUI', 'show', text)
elseif Config.DrawTextScript == 'jg-textui' then
exports['jg-textui']:DrawText(text)
elseif Config.DrawTextScript == 'lab-HintUI' then
exports['lab-HintUI']:Show(text, "Wheel Stancer")
elseif Config.DrawTextScript == 'okokTextUI' then
exports['okokTextUI']:Open(text, 'darkblue')
end
end,
customhide = function() -- Function to hide the text UI depending on which DrawTextScript is used.
if Config.DrawTextScript == 'ox_lib' and lib then
lib.hideTextUI()
elseif Config.DrawTextScript == 'cd_drawtextui' then
TriggerEvent('cd_drawtextui:HideUI')
elseif Config.DrawTextScript == 'jg-textui' then
exports['jg-textui']:HideText()
elseif Config.DrawTextScript == 'lab-HintUI' then
exports['lab-HintUI']:Hide()
elseif Config.DrawTextScript == 'okokTextUI' then
exports['okokTextUI']:Close()
end
end,
}
-- Dynamically change the text shown in DrawTextUI based on the interaction method. [#DONT TOUCH!]
if Config.DrawTextUI.enable and Config.Interact == "RadialMenu" then
Config.DrawTextUI.text = "Open Radial Menu To Stance the vehicle."
elseif Config.DrawTextUI.enable and Config.Interact == "buttonPress" then
-- If using buttonPress, inject the hotkey into the text string.
Config.DrawTextUI.text = string.format(Config.DrawTextUI.text, string.upper(Config.DrawTextUI.hotkey))
end
-- Configuration for drawing a marker on the ground at stance locations.
Config.DrawMarker = {
enabled = true, -- Enable or disable marker drawing.
Scale = 1.0,
MarkerType = 20, -- Marker type. Reference: https://docs.fivem.net/docs/game-references/markers/
-- Marker color values. Reference RGBA values from: https://rgbacolorpicker.com/
red = 255, -- Red component (0–255)
green = 255, -- Green component (0–255)
blue = 252, -- Blue component (0–255)
alpha = 100, -- Transparency (0–255)
MarkerUpAndDown = true, -- If true, marker has vertical pulsing animation.
MarkerRotate = true, -- If true, marker rotates in place.
}
--[[
===============================
🧾 Inventory Settings
===============================
]]
Config.Inventory = {
Enable_Inventory = false, -- Enable inventory-based item check
Inventory_Name = "qb-inventory" -- Inventory resource name (e.g., qb-inventory, ox_inventory, etc.)
}
--[[
==============================
REMOVE STANCE COMMAND SETTINGS
==============================
]]
-- Configuration for the command that removes a stance from a vehicle.
-- The Ui Will Automatically Put the Plate on the Input If the Player is within a Vehicle
-- Default usage: /dv_stance
Config.Remove_Stance_Command = {
Enable = true, -- Enable or disable the /dv_stance command entirely.
Command_name = "dv_stance", -- The actual command players will use to remove a vehicle's stance.
IgnoreStanceLocations = true, -- If true, the command can be used anywhere. If false, it only works within defined stance locations.
RemovePrice = 0, -- Price to remove the stance. Set to 0 for free.
Requires_Jobs = true, -- If true, only players with specific jobs and grades can use the command.
Jobs = {
["mechanic"] = { 1, 2, 3 }, -- Only grades 1, 2, and 3 from 'mechanic' job can use the command.
["police"] = true, -- All police grades can use the command.
},
ItemRequired = false, -- If true, using the command requires a specific item in inventory.
ItemChecks = {
["toolkit"] = true, -- Players with a "toolkit" can use the command (if ItemRequired = true).
["stancekit"] = true, -- Players with a "stancekit" can also use the command.
},
}
--[[
=======================
🚗 Car lift Settings
=======================
]]
Config.Carlift = {
Enable = true, -- Enable/disable car lift system
Locations = { -- Car lift locations with heading
['Bennys1'] = {
x = -692.48,
y = -814.27,
z = 33.02,
heading = 358.95,
displayName = 'Bennys 1' -- Shown in wheel storage UI as the name.
},
['Bennys2'] = { -- vec4(-1417.7, -445.45, 35.91, 212.88)
x = -1417.7,
y = -445.45,
z = 35.91,
heading = 212.88,
displayName = 'Bennys 2' -- Shown in wheel storage UI as the name.
},
['Bennys3'] = { -- vec4(124.94, -3035.2, 7.04, 266.57)
x = 124.94,
y = -3035.2,
z = 7.04,
heading = 266.57,
displayName = 'Bennys 3' -- Shown in wheel storage UI as the name.
},
},
WheelStorages = { -- Wheel storage near lift -703.39 -813.83 33.02
['BennysStorage1'] = {
x = -703.39,
y = -813.83,
z = 33.02,
LiftDistance = 50.0 -- Vehicles on lifts within this distance will be shown as presets for the wheel storage UI
},
['BennysStorage2'] = {
x = -1410.16,
y = -439.33,
z = 35.91,
LiftDistance = 50.0 -- Vehicles on lifts within this distance will be shown as presets for the wheel storage UI
},
},
Requires_Jobs = true, -- Restrict the lift usage to jobs
Jobs = {
["mechanic"] = { 1, 2, 3 }, -- Specific grades allowed
["police"] = true -- All grades allowed
},
Interaction = {
type = "ox", -- "ox", "DrawText", "qb"
TargetResourceName = 'ox_target' -- 'ox_target' , 'qb-target'
},
MiniGame = {
OnRemoval = true, -- Enable minigame on wheel removal
OnInstall = true, -- Enable minigame on wheel install
BoltMovements = 0.0008 -- Movement speed of bolts, only increase by small amounts! (example : 0.0015)
},
UseProgressbar = true, -- Use OX progress bar for actions
ProgressBarDetails = {
type = 'circle', -- "circle" or "box"
duration = 3000, -- Time in ms
label = 'Adjusting',
position = 'bottom', -- "middle" or "bottom"
useWhileDead = false,
canCancel = true,
anim = {
dict = 'amb@prop_human_movie_bulb@idle_a',
clip = 'idle_b'
},
disable = {
move = true,
car = true,
combat = true,
mouse = false,
sprint = true
}
}
}
--[[
=======================
Set Limit to Menu Settings
=======================
]]
Config.Limits = { -- the key values beside global can be either vehicle class number, or vehicle model itself for more info on vehicle class : https://docs.fivem.net/natives/?_0x29439776AAA00A62
Suspension = {
Global = {
max = 0.1,
min = -1.3
},
[`sandking`] = { -- define based on vehicle model ,if you are adding new vehicle models, make sure the name is between `MoDEL`
max = 0.05,
min = -2.0
},
[2] = { -- define based on vehicle class : 2 = SUVs
max = 0.7,
min = -3.0,
}
},
WheelSize = {
Global = {
max = 1.0,
min = 0.5
},
[9] = { -- OffRoads can have bigger wheels
min = 0.5,
max = 1.4
},
[`monster`] = {
min = 0.5,
max = 2.5
}
},
WheelWidth = {
Global = {
max = 1.4,
min = 0.1
},
[`monster`] = {
min = 0.5,
max = 3.5
}
},
-- Min and maximums of rightsides and leftsides should be exact opposite of each other. otherwise [All Wheels] will break.
WheelxRotationRight = { -- X rotoation for wheels on the right side of the vehicle
Global = {
max = 1.0,
min = 0.0
},
},
WheelxRotationLeft = { -- X rotoation for wheels on the left side of the vehicle
Global = {
max = 0.0,
min = -1.0
},
},
WheelyRotationRight = { -- Y rotoation for wheels on the right side of the vehicle
Global = {
max = 0.15,
min = -1.0
},
},
WheelyRotationLeft = { -- Y rotoation for wheels on the left side of the vehicle
Global = {
max = 1.0,
min = -0.15
},
}
}
-------------------------------
------- BLACKLIST Vehicles!
-------------------------------
Config.BlacklistedVehicles = { -- Blacklist Vehicle by Name.
-- Add vehicle spawn name to Blacklist them from using the Stance Menu.
[`bmx`] = true,
}
Config.BlackListedVehicleClass = { -- Blacklist by Vehicle Class, uncomment (remove --) any class to blacklist it from doing stances!
--[1] = true, -- Sedans
--[0] = true, -- Compacts
--[2] = true, -- SUVs
--[3] = true, -- Coupes
--[5] = true, -- Sports Classics
--[4] = true, -- Muscle
--[6] = true, -- Sports
--[7] = true, -- Super
[8] = true, -- Motorcycles
--[9] = true, -- Off-road
[10] = true, -- Industrial
[11] = true, -- Utility
--[12] = true, -- Vans
[13] = true, -- Cycles
[14] = true, -- Boats
[15] = true, -- Helicopters
[16] = true, -- Planes
--[17] = true, -- Service
--[18] = true, -- Emergency
--[19] = true, -- Military
--[20] = true, -- Commercial
[21] = true, -- Trains
[22] = true, -- Open Wheel
}
--[[
=======================
Webhooks Settings
=======================
]]
Config.EnableWebhooks = false -- true/false
Config.WebhooksOptions = {
SendOptions = {
OnRemoval = true,
RemoveColor = 'red',
OnAppliance = true,
ApplianceColor = 'green'
},
TagEveryone = false,
IncludeAdminJobs = false,
Details = {
TargetPlate = true,
PlayerName = true,
PlayerJob = true, -- Player Job
PlayerId = true, -- Player Server ID
PlayerIdentifier = true, -- Player Identifier
PlayerMoney = false
}
}
-- Note: To add WebhookURL you need to open sv_webhook.lua file add it there !
Config.Webhooks = {
HeaderImageURL = 'YOUR_IMAGE_LINK', -- If you Want Image Header For The Logs insert The URL
LogHeader = 'WheelStancer By Tuff', -- What Will be the Header Of Your logs
WebhookTitle = 'Wheel Stancer Log:'
}
--[[
=======================
Framework Settings
=======================
]]
-- ### IF YOU KNOW WHAT YOU ARE DOING YOU CAN CHANGE THIS ###
Config.PlayerSpawnEvents = {
'esx:playerLoaded',
'playerSpawned',
'QBCore:Client:OnPlayerLoaded'
}
if Config.Framework == "auto" then
if GetResourceState("es_extended") == "started" then
Config.Framework = "esx"
elseif GetResourceState("qb-core") == "started" or GetResourceState("qbx_core") == "started" then
Config.Framework = "qb"
else
Config.Framework = 'standalone'
end
end
Config.FrameworkSharedObject = nil
Config.FrameworkSharedObjects = {
['qb'] = function()
if Config.FrameworkSharedObject == nil then
Config.FrameworkSharedObject = exports['qb-core']:GetCoreObject()
end
return Config.FrameworkSharedObject
end,
['esx'] = function()
if Config.FrameworkSharedObject == nil then
Config.FrameworkSharedObject = exports['es_extended']:getSharedObject()
end
return Config.FrameworkSharedObject
end,
['old_esx'] = function()
if Config.FrameworkSharedObject == nil then
local ESX = nil
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj)
ESX = obj
end)
Citizen.Wait(30)
end
Config.FrameworkSharedObject = ESX
end
return Config.FrameworkSharedObject
end
}
Last updated