[STANDALONE] Better Tricks & Wheelies

KC-Bettertricks_GIF-cfxre

Better Tricks & Wheelies - Bikers have never had so much style :sunglasses:

Dive into the world of breathtaking aerial stunts, pull off smooth wheelies, and master stoppies like a pro. But that’s not all - you can also emote while doing wheelies with ease and style! It’s all about enhancing your in-game skills and providing more ways to show off in the server!!

KC-Bettertricks is a standalone script that gives new ways for your players to express themselves on bikes. Wheelies/Stoppies/Emotes/Stunts, everything you ever wanted for bikers into one script and working with every bikes!

Features

  • New ways of doing wheelies, stoppies and aerial stunts
  • 30 brand new animations (A total of 23 animations and 7 Left/Right variation)
  • You can use your own conditions to be able to do those new moves (Job, Item, etc)
  • Update checker with changelog if a new update is found directly in the console on resource start, except if fivem-checker is installed and running on your server
  • Optimized as much as possible: 0.00ms (0.00%) on idle and 0.06ms after pressind the keybind (Max reached is 0.12ms)
  • Debug mode for troubleshooting any issues with the resource
  • Customizable localization and key mapping.
Config file

The script is highly configurable; check out the full config file:

Config                             = Config or {}

Config.Eject                       = true       -- This value determines whether the player will be ejected if they land while doing a trick or not (The default value is true)
Config.InstantAnimStop             = true       -- This value determines whether the anim should instantly stopped, otherwise it will just go back to the sitting position gradually (The default value is true)
Config.TackledRagdollTime          = 5

Config.SpecificVehicle             = false      -- If set to true, you will be able to do tricks only on some specific bikes from the 'Config.StuntVehicles' & 'Config.GroundVehicles' list
Config.StuntVehicles               = {          -- Don't use "Model Name" since there is no native to get model name from vehicle in GTA, only use "Text Label Name(s)". You can found them here: https://gta.fandom.com/wiki/Category:Motorcycles
    "ENDURO",
    "MANCHEZ",
    "SANCHEZ01",
    "SANCHEZ02"
}
Config.GroundVehicles              = {          -- Don't use "Model Name" since there is no native to get model name from vehicle in GTA, only use "Text Label Name(s)". You can found them here: https://gta.fandom.com/wiki/Category:Motorcycles
    "ESSKEY",
    "BATI",
    "DOUBLE"
}

-- Tricks Key Config
Config.TricksOrganizeCommand       = 'tricksorganize'           -- If you ever feel the need to change the command, here's the option for it
Config.TricksToggleCommand         = 'trickstoggle'             -- If you ever feel the need to change the command, here's the option for it
Config.KeybindTable                = {
    Tricks = {
        CommandTitle               = 'Tricks',
        CommandName        		   = 'tricks',
        Inputs                     = {
            Controller = {
                CommandAlias = 'controller',
                CommandInputMapper = 'PAD_DIGITALBUTTON',
                CommandInputParameter = 'R1_INDEX'
            },
            MouseAndKeyboard = {
                CommandAlias = 'keyboard',
                CommandInputMapper = 'KEYBOARD',
                CommandInputParameter = 'SPACE'
            }
        }
    },
    GroundEmotes = {
        CommandTitle               = 'Ground Emotes',
        CommandName        		   = 'groundemotes',
        Inputs                     = {
            --[[ Controller = { -- I haven't yet found a good way to do it on controller, but maybe one day who knows.
                CommandAlias = 'controller',
                CommandInputMapper = 'PAD_DIGITALBUTTON',
                CommandInputParameter = 'R3_INDEX'
            }, ]]
            MouseAndKeyboard = {
                CommandAlias = 'keyboard',
                CommandInputMapper = 'MOUSE_BUTTON',
                CommandInputParameter = 'MOUSE_LEFT'
            }
        }
    }
}

Config.Stunts = {
    ['Nac-Nac (L)'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_b',
        Start = 0.28,
        Loop = 0.50,
        Bone = 51826,
        Bone2 = 52301,
        flag = 32,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Nac-Nac (R)'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_c',
        Start = 0.15,
        Loop = 0.46,
        Bone = 58271,
        Bone2 = 14201,
        flag = 32,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Side (L)'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_d',
        Start = 0.47,
        Loop = 0.61,
        Bone = 0,
        Bone2 = 14201,
        flag = 32,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Side (R)'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_d',
        Start = 0.18,
        Loop = 0.34,
        Bone = 31086,
        Bone2 = 14201,
        flag = 32,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Heel Clicker'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_heelclicker',
        flag = 32,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Slyger 1 (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_slyger_1',
        flag = 34,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Slyger 1 (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_slyger_1_r',
        flag = 34,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Footrest'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_footrest',
        flag = 34,
        StickToHandlebar = true,
        type = 'ga'
    },
    ['Slyger 2 (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_slyger_2',
        flag = 34,
        StickToHandlebar = true,
        type = 'g'
    },
    ['Slyger 2 (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_slyger_2_r',
        flag = 34,
        StickToHandlebar = true,
        type = 'g'
    },
    ['Timotei'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_timotei',
        flag = 34,
        StickToHandlebar = true,
        type = 'g'
    },
    ['Clap Back'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_clapback',
        flag = 32,
        StickToHandlebar = false,
        type = 'g'
    },
    ['Feet Handle'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_feet_handlebar',
        flag = 34,
        StickToHandlebar = true,
        type = 'g'
    },
    ['Superman'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_superman',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Superman Double Grab'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_superman_double',
        Start = 0.0,
        Loop = 0.56,
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Holy Grab'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_holy_grab',
        flag = 34,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Oxecutionner (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_oxecutionner',
        flag = 34,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Oxecutionner (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_oxecutionner_r',
        flag = 34,
        StickToHandlebar = false,
        type = 'a'
    },
    ['On Top'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_e',
        Start = 0.15,
        Loop = 0.47,
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Lay Back'] = {
        animDict = 'rcmextreme2atv',
        animName = 'idle_a',
        Start = 0.16,
        Loop = 0.80,
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['90 Clock (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_90',
        flag = 32,
        StickToHandlebar = true,
        type = 'a'
    },
    ['90 Clock (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_90_r',
        flag = 32,
        StickToHandlebar = true,
        type = 'a'
    },
    ['Disco Can (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_discocan',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Disco Can (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_discocan_r',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Dead Body'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_deadbody',
        flag = 32,
        StickToHandlebar = true,
        type = 'a'
    },
    ['McMetz'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_mcmetz',
        flag = 32,
        StickToHandlebar = true,
        type = 'a'
    },
    ['Rock Solid'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_rocksolid',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Rodeo (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_rodeo',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Rodeo (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_rodeo_r',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Superman Seat Grab (L)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_superman_seat_grab',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Superman Seat Grab (R)'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_superman_seat_grab_r',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Light Taunt'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_light_taunt',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Heavy Taunt'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_heavy_taunt',
        flag = 32,
        StickToHandlebar = false,
        type = 'a'
    },
    ['Bar Hop'] = {
        animDict = 'veh@bike@tricks',
        animName = 'tricks_barhop',
        flag = 32,
        StickToHandlebar = true,
        type = 'a'
    },
    --- You can add your own tricks under this
    ['Celebrate'] = {
        animDict = 'mini@racing@bike@',
        animName = 'celebrate_c',
        flag = 33,
        StickToHandlebar = true,
        type = 'g'
    },
    ['Finger'] = {
        animDict = 'anim@mp_player_intcelebrationmale@finger',
        animName = 'finger',
        flag = 48,
        StickToHandlebar = false,
        type = 'g'
    }
}

Config.KeyDirection = {
    ['up'] = {
        ['left'] = 'Light Taunt',
        ['right'] = 'Heavy Taunt',
        ['down'] = 'Lay Back'
    },
    ['left'] = {
        ['right'] = 'Nac-Nac (R)',
        ['up'] = 'Superman',
        ['down'] = 'Superman Double Grab'
    },
    ['right'] = {
        ['left'] = 'Nac-Nac (L)',
        ['up'] = 'Holy Grab',
        ['down'] = 'Bar Hop'
    },
    ['down'] = {
        ['right'] = 'Side (R)',
        ['left'] = 'Side (L)',
        ['up'] = 'On Top'
    }
}

Config.RadialMenu           = {
    style = {                               -- Wheel style settings
        sizePx = 360,                       -- Wheel size in pixels
        slices = {                          -- Slice style settings
            default = { ['fill'] = '#2c3e50', ['stroke'] = 'none', ['stroke-width'] = 0, ['opacity'] = 0.60 },
            hover = { ['fill'] = '#16a085', ['stroke'] = 'none', ['stroke-width'] = 0, ['opacity'] = 0.80 },
            selected = { ['fill'] = '#16a085', ['stroke'] = 'none', ['stroke-width'] = 0, ['opacity'] = 0.80 }
        },
        titles = {                          -- Text style settings
            default = { ['fill'] = '#ecf0f1', ['stroke'] = 'none', ['font'] = 'Helvetica', ['font-size'] = 16, ['font-weight'] = 'bold' },
            hover = { ['fill'] = '#ecf0f1', ['stroke'] = 'none', ['font'] = 'Helvetica', ['font-size'] = 16, ['font-weight'] = 'bold' },
            selected = { ['fill'] = '#ecf0f1', ['stroke'] = 'none', ['font'] = 'Helvetica', ['font-size'] = 16, ['font-weight'] = 'bold' }
        },
        icons = {
            width = 64,
            height = 64
        }
    },
    wheel = {
        navAngle = 270,                 -- Orientation of wheel
        minRadiusPercent = 0.3,         -- Minimum radius of wheel in percentage
        maxRadiusPercent = 0.9,         -- Maximum radius of wheel in percentage
    }
}

-- Debug
Config.Debug        				        = false   	 -- If you think something is not working properly, you can set 'Config.Debug' to true. It will then print debug information in your console

-- Misc
Config.Language						        = 'en'		 -- Currently Available: fr, en
Config.UpdateChecker                        = false      -- Set to false if you don't want to check for resource update on start (No need to change this if you're using fivem-checker)
Config.ChangeLog					        = false		 -- Set to false if you don't want to display the changelog if new version is find (No need to change this if you're using fivem-checker)

-- Custom condition

---This function is called right after pressing the keybind
---@param type string       'Ground' or 'Air'
---@return boolean
function CanDoStunts(StuntType)
    return true -- Example: "return GetSelectedPedWeapon(PlayerPedId()) == GetHashKey('weapon_unarmed')" or "return QBCore.Functions.GetPlayerData().job.name == 'stuntman'"
end```
New animations list
Heel Clicker
Footrest
Slyger 1 (L)
Slyger 1 (R)
Slyger 2 (L)
Slyger 2 (R)
Timotei
Clap Back
Feet Handle
Superman
Superman Double Grab
Holy Grab
Oxecutionner (L)
Oxecutionner (R)
On Top
Lay Back
90 Clock (L)
90 Clock (R)
Disco Can (L)
Disco Can (R)
Dead Body
McMetz
Rock Solid
Rodeo (L)
Rodeo (R)
Superman Seat Grab (L)
Superman Seat Grab (R)
Light Taunt
Heavy Taunt
Bar Hop

Videos & Screenshots

Showcase:

Youtube video (if the above won’t load)

How-To:

Youtube video (if the above won’t load)

Screenshots

Screenshots coming soon

Purchase on Tebex

Get Better Tricks & Wheelies at 24.00USD on Tebex.


My other scripts

[STANDALONE] Pick It Back
[STANDALONE] Sit Anywhere
[STANDALONE] Parkour Abilities

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

Code is accessible No, only Config file
Subscription-based No
Lines (approximately) 1200
Requirements None
Support Yes
11 Likes

Good job :fire:

1 Like

works on any bike?

Whether it’s addon or vanilla bikes, it doesn’t matter; it allows you to do wheelies and stoppies with every bikes :+1:

1 Like

Does it change anything if you can roll over with a Wheele?

Sorry I do not speak German :sweat_smile:

Soory my tool did not work properly

can you use it in singleplayer?

:rotating_light: Update Alert :rotating_light:

Changelog:

  • Fixed player preferences not loading under certain circumstances
  • Added Config.MaxPitch to assist in maintaining wheelies
  • Added Config.InversedControl and a new command /trickscontrol for users to select their preferred control mode
  • Two new modes, Normal and Inverse. ‘Normal’ is easier for high-speed wheelies, while ‘Inverse’ is more controllable at lower speeds (Inverse is default)
  • All strings can now be correctly translated in the locale files (40+ strings)

As always, I value your feedback and suggestions. If you have any specific features you’d like to see added, feel free to leave a message here :wink:

1 Like