[STANDALONE] BMX Freestyle

A script by Clementinise

No reviews yet.
[STANDALONE] BMX Freestyle main image

Full Description

KC-BMX_GIF-Cfxre-OPTIMIZED

BMX Freestyle - Customize it. Ride it. Trick it. Own it. :bicycle:

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.


The BMX

Built from scratch. Every detail considered.


Movement

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

How to perform flips (while in air):

  1. Hold SHIFT before leaving the ground, then press W or S while airborne
  2. W = Frontflip, S = Backflip
  3. Release W/S to stop rotating and auto-align for landing

How to perform a Nollie:

  • Hold CTRL when jumping, the BMX will pivot from the front wheel instead of the rear

Tricks

Air Tricks - 19 trick slots across 6 input combinations (hands/legs × left/right/both modifiers).

Hands:

  • One Hander, Tabletop, Seat Grab, Barspin

Legs (hold SPACE):

  • One Footer, Can Can, Candy Bar, Nac Nac, Whip, No Foot, Crankflip
How-To

How to perform tricks (while in air):

  1. Hold SPACE to switch from HANDS tricks to LEGS tricks (optional)
  2. Hold Left Click, Right Click, or Both to select the trick you want to do
  3. Flick mouse in a direction (left/right/up/down) while holding click
  4. Release to perform the trick

HANDS TRICKS (Default - No SPACE)

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

LEGS TRICKS (SPACE held)

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

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.


Customization

BMX Customization - 35 tunable parts across 4 categories, 6 paint buckets, as deep as GTA V allows it to go.

Parts categories:

Front Wheel

  • Spokes, Valve Cap, Rim, Tyre, Hub, Guards, Pegs

Rear Wheel

  • Spokes, Valve Cap, Rim, Tyre, Hub, Guards, Pegs

Chassis

  • Seat (Leather, Plastic, Post, Post Screw), Crankset (Crank, Bearing, Sprocket, Left Pedal, Right Pedal), Frame, Chain, Fork

Handlebars

  • Stem (Screws, Stem), Left Grip (Grip, End, Screw), Right Grip (Grip, End, Screw), Handlebar
How-To

How to open the customization menu:

  • Place your BMX on one of the customization mat
  • Get off the BMX and stand near the mat
  • Press K to enter customization mode

Score & HUD

KC-BMX_GIF-ScoreHUD

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

Click to expand the full config file
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



Videos & Screenshots

Showcase:

KC - BMX Freestyle Showcase

Youtube video (if the above won’t load)


Purchase on Tebex

Get KC - BMX Freestyle at 52.00 USD 34.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!


My other scripts

[STANDALONE] Pick It Back
[STANDALONE] Sit Anywhere
[STANDALONE] Parkour Abilities
[STANDALONE] Better Tricks & Wheelies

Feel free to share your suggestions and have fun! :call_me_hand:

Code is accessible No, only Config file
Subscription-based No
Lines (approximately) ~16,000
Requirements None
Support Yes

Config Merger
Have you tried Config Merger? Merge your configs easily