Price
UnknownA script by Clementinise
Price
Unknown

BMX has always been in GTA, but it’s never felt like this. This script brings a full freestyle system to FiveM: real tricks, proper grinding, deep customization, and physics that actually make sense for a BMX.
The script also comes with a brand new custom BMX, built from scratch with a focus on quality, reworked handling and idle animations that actually make the rider look like they belong on it.
Built from scratch. Every detail considered.
Ollie & Nollie - A proper jump system that looks and feels right.
Reverse Riding - And why not? Not a gimmick, actually usable.
Air Rotations - Backflip, frontflip and full spin, nothing more to say.
How to perform flips (while in air):
How to perform a Nollie:
Air Tricks - 19 trick slots across 6 input combinations (hands/legs × left/right/both modifiers).
Hands:
Legs (hold SPACE):
How to perform tricks (while in air):
| Direction | LEFT Modifier | RIGHT Modifier | BOTH Modifiers |
|---|---|---|---|
| left | One Hander | (disabled) | (disabled) |
| right | (disabled) | One Hander Mirror | (disabled) |
| up | Tabletop Mirror | Tabletop | (disabled) |
| down | Seat Grab Mirror | Seat Grab | Barspin |
| Direction | LEFT Modifier | RIGHT Modifier | BOTH Modifiers |
|---|---|---|---|
| left | One Footer | Can Can Mirror | Whip Mirror |
| right | Can Can | One Footer Mirror | Whip |
| up | Candy Bar | Candy Bar Mirror | No Foot |
| down | Nac Nac | Nac Nac Mirror | Crankflip |
Grinding - Dynamic grindable surface detection, smooth path following, peg spark particles and distance-based scoring. Rails, ledges, anything with an edge.
Note: Rockstar Editor alters some particles. Peg sparks look bigger and better in-game than shown here.
BMX Customization - 35 tunable parts across 4 categories, 6 paint buckets, as deep as GTA V allows it to go.
Parts categories:
Front Wheel
Rear Wheel
Chassis
Handlebars
How to open the customization menu:

Score & HUD - Score counter with floating trick names, combo accumulation, and a circular input visualizer showing your current mode and flick direction in real time, directly inspired by the Skate game series.
Config = Config or {}
--------------------------------------------------------------------------------------------------
-- CUSTOMIZATION
--------------------------------------------------------------------------------------------------
-- Mat Locations
Config.CustomizationCenter = vector3(-1108.788, -1693.349, 3.20) -- Center point for all mats, used for general area check (The default value is -1108.788, -1693.349, 3.20)
Config.CustomizationMaxDistance = 14.0 -- Maximum distance to be considered "near" the customization area (The default value is 20.0)
Config.CustomizationMats = {
{
playerRadius = 1.5,
bmxZone = {
center = vector3(-1107.439, -1695.653, 3.588),
length = 2.0,
width = 1.0,
heading = 130,
maxZ = 2.0
}
},
{
playerRadius = 1.5,
bmxZone = {
center = vector3(-1108.880, -1693.357, 3.588),
length = 2.0,
width = 1.0,
heading = 123,
maxZ = 2.0
}
},
{
playerRadius = 1.5,
bmxZone = {
center = vector3(-1110.468, -1691.1877, 3.588),
length = 2.0,
width = 1.0,
heading = 125,
maxZ = 2.0
}
}
}
-- Costs
-- Note: If BOTH costs are set to 0, the "Purchase" button becomes "Apply" and no payment is processed
Config.PartPaintCost = 100 -- This value determines the cost per part paint bucket change
Config.BucketColorCost = 200 -- This value determines the cost per bucket color change
-- Keybind
Config.CustomizationKeybindTitle = 'Enter BMX Customization' -- This value determines the key title displayed in GTA 5 control settings (The default value is 'Enter BMX Customization')
Config.CustomizationKeybindMapper = 'KEYBOARD' -- This value determines the input mapper. You can find them here: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/ (The default value is 'KEYBOARD')
Config.CustomizationKeybindParameter = 'K' -- This value determines the input parameter. You can find them here: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/ (The default value is 'K')
-- Notification
Config.NotificationMode = 'continuous' -- This value determines the notification mode: 'continuous' (called every frame) or 'toggle' (called once to show, once to hide) (The default value is 'continuous')
--------------------------------------------------------------------------------------------------
-- GAMEPLAY
--------------------------------------------------------------------------------------------------
-- Grind |BETA FEATURE, SUBJECT TO CHANGE AND NOT FULLY FEATURE COMPLETE|
Config.EnableGrinding = true -- This value determines whether the grinding mechanic is enabled or not (The default value is false)
-- Controls
Config.DefaultInverseReverseDirection = false -- This value determines the default for inverse left/right steering when riding in reverse. This is a per-player setting, togglable via /bmx_reversedir (The default value is false)
-- HUD Defaults
Config.HUD = {
ScoreEnabled = true, -- This value determines whether the score counter is shown by default (The default value is true)
TricksEnabled = true, -- This value determines whether trick names are shown by default (The default value is true)
VisualizerEnabled = true, -- This value determines whether the trick input visualizer is shown by default (The default value is true)
Thresholds = {
GlowStart = 1500, -- This value determines the score at which progressive glow starts (The default value is 1500)
RainbowStart = 5000 -- This value determines the score at which rainbow mode activates, glow ends here (The default value is 5000)
}
}
-- Trick Scores
-- Override individual trick scores here. Mirror tricks (e.g., "One Hander M") share the same score as their base trick.
Config.TrickScores = { -- Points awarded per grind scoring threshold
-- Hands tricks
["One Hander"] = 100,
["Tabletop"] = 270,
["Seat Grab"] = 240,
["Barspin"] = 320,
-- Legs tricks
["One Footer"] = 150,
["Can Can"] = 170,
["Candy Bar"] = 140,
["Nac Nac"] = 210,
["Whip"] = 230,
["No Foot"] = 380,
["Crankflip"] = 400,
-- Rotations
["Backflip"] = 200,
["Frontflip"] = 200,
["180"] = 200,
-- Other
["Reverse"] = 200,
["Grind"] = 100,
}
--------------------------------------------------------------------------------------------------
-- DEBUG
--------------------------------------------------------------------------------------------------
Config.Debug = true -- This value determines whether debug information is printed in your console or above radar (The default value is false)
Config.DebugCategories = {
WARNING = true, -- Important warnings (I would advise to keep this enabled)
ERROR = true, -- Error messages (I would advise to keep this enabled)
CUSTOMIZE = false -- Customization access, payment flow, and area detection
}
--------------------------------------------------------------------------------------------------
-- MISC
--------------------------------------------------------------------------------------------------
Config.Language = 'en' -- Currently Available: fr, en, pt-br
Config.UpdateChecker = false -- This value determines whether to check for resource updates on start (The default value is false). No need to change this if you're using fivem-checker
Config.ChangeLog = false -- This value determines whether to display the changelog if a new version is found (The default value is false). No need to change this if you're using fivem-checker
--------------------------------------------------------------------------------------------------
-- CUSTOM CONDITIONS & EVENTS
--------------------------------------------------------------------------------------------------
local SERVER = IsDuplicityVersion()
local CLIENT = not SERVER
-- Server
if SERVER then
-- This function handles payment when the player clicks "Purchase" in the customization menu.
-- Modify this to integrate with your framework (ESX, QBCore, etc.)
--
---@param source number Player server ID
---@param amount number Total cost to charge
---@param purchaseData table Contains: { partPaintChanges = {...}, bucketColorChanges = {...} }
---@return boolean success Whether payment was successful
---@return string message Message to display to the player
--
Config.ProcessPayment = function(source, amount, purchaseData)
-- ESX EXAMPLE:
-- local xPlayer = ESX.GetPlayerFromId(source)
-- if xPlayer.getMoney() >= amount then
-- xPlayer.removeMoney(amount)
-- return true, "Customization purchased for $" .. amount .. "!"
-- else
-- return false, "You don't have enough money! Need $" .. amount
-- end
-- DEFAULT: No framework (always succeeds)
return true, "Customization applied!"
end
end
-- Client
if CLIENT then
-- This function determines if the player can access the BMX customization menu.
-- Modify this to add job/permission checks with your framework (ESX, QBCore, etc.)
--
---@return boolean canAccess Whether the player can access customization
--
Config.CanAccessCustomization = function()
-- ESX EXAMPLE (requires job):
-- local playerData = ESX.GetPlayerData()
-- if playerData.job and playerData.job.name == 'mechanic' then
-- return true
-- end
-- return false
-- DEFAULT: No framework (everyone can access)
return true
end
-- Notification function for customization prompts (enter/exit customization mode).
-- Be aware of the NotificationMode setting above, which determines how this function is called.
--
-- IMPORTANT: If you use a custom notification system (anything other than GTA help text),
-- you need to modify the locale file to properly format the messages.
-- The default uses GTA input formatting (e.g., ~INPUT_REPLAY_SHOWHOTKEY~)
-- which only works with help text. For custom notifications, change it to plain text like "Press K".
--
---@param message string Text to display
---@param type number Notification type (0 = info, 1 = success, 2 = error)
---@param operation? string 'show' or 'hide' (only in toggle mode)
--
Config.CustomizationNotification = function(message, type, operation)
if Config.NotificationMode == 'toggle' then
if operation == 'hide' then
-- Example for ox_lib:
-- lib.hideTextUI()
elseif operation == 'show' and message then
-- Example for ox_lib:
-- lib.showTextUI(message, { position = 'right-center' })
end
else
-- Continuous mode (default): Called every frame while near a mat or in customization
BeginTextCommandDisplayHelp("STRING")
AddTextComponentSubstringPlayerName(message)
EndTextCommandDisplayHelp(0, false, true, -1)
end
end
-- Called when a trick or rotation is successfully performed
--
---@param trickName string Name of the trick (e.g., "Barspin", "Backflip", "180", "Grind", "Reverse")
---@param points number Points awarded
--
Config.OnTrickLanded = function(trickName, points)
-- Example: TriggerServerEvent('myServer:giveXP', points)
end
-- Called when a grind begins
--
Config.OnGrindStarted = function()
-- Example: TriggerEvent('myHud:showGrindIndicator')
end
-- Called when a grind ends
--
---@param totalDistance number Total distance grinded in meters
---@param totalPoints number Total points earned during the grind
--
Config.OnGrindEnded = function(totalDistance, totalPoints)
-- Example: TriggerServerEvent('myServer:giveGrindReward', totalDistance, totalPoints)
end
end
Showcase:
Youtube video (if the above won’t load)
Get KC - BMX Freestyle at
52.00 USD34.00 USD on Tebex.
Still not convinced? Here’s the breakdown.
Tricks 11 tricks, 19 animations (mirrors included) Movement Ollie, Nollie, Backflip, Frontflip, Full Spin, Reverse - custom physics, not GTA’s defaults Grinding Custom sounds and particles Customization 35 tunable parts, down to the last screw Locale Use your own translations, UI entirely adapts to it (Currently available: EN, FR, PT-BR) Bundle Includes the BMX Garage map
Thoroughly tested before release, but real servers always find what solo testing can’t. Available at a reduced price for the first two weeks, any bug reported during this period will be fixed as a priority.
The first wave of servers helped iron out the remaining edge cases within the first two days. The script is solid now, but the sale remains for the first two weeks!
[STANDALONE] Pick It Back
[STANDALONE] Sit Anywhere
[STANDALONE] Parkour Abilities
[STANDALONE] Better Tricks & Wheelies
Feel free to share your suggestions and have fun! 
| Code is accessible | No, only Config file |
| Subscription-based | No |
| Lines (approximately) | ~16,000 |
| Requirements | None |
| Support | Yes |
See what others are saying about this script.
Share your experience and help others.