Page cover

Accessible files

Here you can find all the files which can be edite to make the asset compatible with your server.​

config.lua
----------------------------------------------------------------------------------------------
-----------------------------------| BRUTAL GYM SYSTEM :) |-----------------------------------
----------------------------------------------------------------------------------------------

--[[

Hi, thank you for buying our script, We are very grateful!

For help join our Discord server:     https://discord.gg/85u2u5c8q9
More informations about the script:   https://docs.brutalscripts.com

--]]

-- You can add your own notify here >> [gym-cl_utils.lua]

Config = {
    DeveloperMode = false, -- Developer mode (for support)

    Core = 'ESX',  -- ESX / QBCORE  | Other core setting on the 'core' folder
    TextUI = 'brutal_textui', -- false = DrawText3D / 'brutal_textui' / 'ox_lib' / 'okokTextUI' / 'ESXTextUI' / 'QBDrawText' // Custom can be add in the gym-cl_utils.lua!!!
    ProgressBar = '', -- 'progressBars' / 'pogressBar' / 'mythic_progbar' // Custom can be add in the gym-cl_utils.lua!!!
    BrutalNotify = true, -- Buy here: (4€+VAT) https://store.brutalscripts.com | Or set up your own notify >> gym-cl_utils.lua
    MINIGAME = false,  -- Download here: https://github.com/firestix77/taskbarskill   (You can edit in the [gym-cl_utils.lua])
    GYMDistance = 60,  -- This is the distance from which membership is broken
    PressKey = 38,  -- If you want to change: https://docs.fivem.net/docs/game-references/controls/

    DisableControls = {}, -- These controls will blocked during the exercises
    ShootWeponsBlackList = {'WEAPON_PETROLCAN'},

    GYMResting = {
        Use = false, -- Enable resting between workouts.
        RestDuration = 60, -- Rest duration in seconds. 
    },

    Skills = {
        SkillMenu = {Label = 'Brutal Skill Menu', Command = 'skillmenu', Control = 'DELETE'},  -- SETTINGS > KEYBINDINGS
        SkillNotifyTime = 5000, -- in milisec | 1000 = 1 sec
        SaveFrequency = 5, -- in minutes | Save in the SQL after that time
        RemoveTime = 10,  -- in munites | Remove one skill from player after that time

        SprintSpeedIncrease = 'MEDIUM', -- ('FAST', 'MEDIUM', 'SLOWLY') At what rate should you increase the run speed?
        SwimSpeedIncrease = 'MEDIUM', -- ('FAST', 'MEDIUM', 'SLOWLY') At what rate should you increase the swimming speed?
        StrengthIncrease = 'MEDIUM', -- ('HIGH', 'MEDIUM', 'LOW') At what rate should you increase strength?

        AllowOutsideTraining = false, -- If true, players can earn Stamina and Running points even when not in the gym.

        SkillTypes = {
            -- ⬇️ DO not edit this FIRST element! [You can edit the Skill Name with the Label]
            ['Stamina']  = {Use = true, Label = 'Stamina', Color = 'rgb(24, 191, 238)', Description = 'Affects ability to sprint, cycle and swim, Max stamina is unlimited stamina.'},
            ['Running']  = {Use = true, Label = 'Running', Color = 'rgb(24, 237, 148)', Description = 'Increases running speed. This brings a number of benefits.'},
            ['Driving']  = {Use = true, Label = 'Driving', Color = 'rgb(198, 237, 24)', Description = 'Increase vehicle handling, control wheelies better, increases control of veicle while in the air.'},
            ['Strength'] = {Use = true, Label = 'Strength', Color = 'rgb(237, 24, 24)', Description = 'Increases melee ability, increases speed on ladders/climbing, increases proficiency in sports, reduces demage taken.'},
            ['Swimming'] = {Use = true, Label = 'Swimming', Color = 'rgb(52, 24, 237)', Description = 'Increases the lung capacity, you can stay underwater longer.'},
            ['Shooting'] = {Use = true, Label = 'Shooting', Color = 'rgb(212, 24, 237)', Description = 'Increases accuracy, reduces recoil of guns, increases ammo capacity.'},
        }
    },

    Exersices = {
        -- Only use these [Stamina / Running / Driving / Strength / Swimming / Shooting] to the skill value.
        ['running'] = {label = "Running", anim = "running", time = 30, skill = 'Running'},
        ['pushups'] = {label = "Pushups", anim = "pushups", time = 30, skill = 'Strength'},
        ['situps'] = {label = "Situps", anim = "situps", time = 30, skill = 'Stamina'},
        ['weightlifting'] = {label = "Weightlifting", anim = "world_human_muscle_free_weights", time = 30, skill = 'Strength'},
        ['yoga'] = {label = "Yoga", anim = "world_human_yoga", time = 30, skill = 'Stamina'},
        ['pullup'] = {label = "Pullup", anim = "prop_human_muscle_chin_ups", time = 30, skill = 'Strength'},
        -- You can add more...
    },
    
    Gyms = {
        ['Beach GYM'] = {
            ItemRequired = {Use = false, Item = '', Time = 30, RemoveItem = false},
            Distances = {Marker = 10, Text = 1.0},
            GYMCoords = { x = -1200.3149, y = -1568.4581, z = 4.6123},
            Marker = { Distance = 15, Sprite = 30, Rotation = true, UpAndDown = false, Brightness = 100, r = 240, g = 221, b = 12, sizes = {x = 0.25, y = 0.3, z = 0.3}},  -- More sprites: https://docs.fivem.net/docs/game-references/markers/
            Blip = { Use = true, colour = 33, size = 1.1, sprite = 311 },
            Exersices = {
                [1]  = { type = 'weightlifting', x = -1197.0083, y = -1573.0277, z = 4.6125, heading = 29.5812},
                [2]  = { type = 'weightlifting', x = -1210.0604, y = -1561.3734, z = 4.6080, heading = 76.0602},
                [3]  = { type = 'pullup', x = -1204.6512, y = -1564.4742, z = 4.6096, heading = 36.2476},
                [4]  = { type = 'pullup', x = -1200.1077, y = -1570.9010, z = 4.6097, heading = 216.9520},
                [5]  = { type = 'yoga', x = -1204.6547, y = -1560.7797, z = 4.6143, heading = 35.4453},
                [6]  = { type = 'pushups', x = -1207.3629, y = -1565.8481, z = 4.6080, heading = 125.5502},
                [7]  = { type = 'situps', x = -1202.0811, y = -1567.2975, z = 4.6106,heading =  209.7822},
                -- You can add more...
            }
        },
        
        ['City GYM'] = {
            ItemRequired = {Use = false, Item = 'gym_membership', Time = 15, RemoveItem = true},
            Distances = {Marker = 10, Text = 1.0},
            GYMCoords = { x = -1263.9678, y = -360.9280, z = 36.9944},
            Marker = { Distance = 15, Sprite = 30, Rotation = true, UpAndDown = false, Brightness = 100, r = 260, g = 40, b = 40, sizes = {x = 0.25, y = 0.3, z = 0.3}},  -- More sprites: https://docs.fivem.net/docs/game-references/markers/
            Blip = { Use = true, colour = 1, size = 1.1, sprite = 311 },
            Exersices = {
                [1]  = { type = 'weightlifting', x = -1269.4681, y = -362.2640, z = 36.9837, heading = 114.9331},
                [2]  = { type = 'weightlifting', x = -1267.5681, y = -365.8660, z = 36.9837, heading = 111.7152},
                [3]  = { type = 'pullup', x = -1256.8202, y = -358.4193, z = 36.9595, heading = 115.7973},
                [4]  = { type = 'pullup', x = -1258.6047, y = -355.1523, z = 36.9596, heading = 157.1221},
                [5]  = { type = 'yoga', x = -1270.4337, y = -359.4362, z = 36.9596, heading = 265.9220},
                [6]  = { type = 'pushups', x = -1262.6473, y = -359.7602, z = 36.9948, heading = 118.7721},
                [7]  = { type = 'pushups', x = -1261.6625, y = -361.5224, z = 36.9948, heading = 114.4993},
                [8]  = { type = 'situps', x = -1266.0231, y = -356.7149, z = 36.9596, heading = 208.9295},
                [9]  = { type = 'situps', x = -1263.2084, y = -355.0845, z = 36.9596, heading = 205.2904},
                [10] = { type = 'running', x = -1263.5249, y = -369.5938, z = 37.1113, heading = 213.0987},
                [11] = { type = 'running', x = -1260.6754, y = -368.0751, z = 37.1124, heading = 213.4567},
                [12] = { type = 'running', x = -1257.7607, y = -366.3998, z = 37.1116, heading = 208.1506},
                -- You can add more...
            }
        },

        ['Prison GYM'] = {
            ItemRequired = {Use = false, Item = 'gym_membership', Time = 15, RemoveItem = true},
            Distances = {Marker = 10, Text = 1.0},
            GYMCoords = { x = 1747.8870, y = 2544.0845, z = 43.5854},
            Marker = { Distance = 15, Sprite = 30, Rotation = true, UpAndDown = false, Brightness = 100, r = 260, g = 40, b = 40, sizes = {x = 0.25, y = 0.3, z = 0.3}},  -- More sprites: https://docs.fivem.net/docs/game-references/markers/
            Blip = { Use = false, colour = 1, size = 1.1, sprite = 311 },
            Exersices = {
                [1]  = { type = 'weightlifting', x = 1746.9486, y = 2543.9863, z = 43.5855, heading = 100.8497},
                [2]  = { type = 'weightlifting', x = 1748.1990, y = 2541.6675, z = 43.5855, heading = 111.0449},
                [3]  = { type = 'pushups', x = 1739.7616, y = 2541.2312, z = 43.5855, heading = 206.0246},
                [4]  = { type = 'pushups', x = 1742.0660, y = 2537.2927, z = 43.5855, heading = 32.1690},
                [5]  = { type = 'situps', x = 1751.0808, y = 2536.8789, z = 43.5855, heading = 24.3098},
                [6]  = { type = 'situps', x = 1752.6005, y = 2537.6794, z = 43.5855, heading = 24.3307},
                -- You can add more...
            }
        },

        -- You can add more GYM's...
    },
    

    -----------------------------------------------------------
    -----------------------| TRANSLATE |-----------------------
    -----------------------------------------------------------

    Texts = {
        TextUI = {'[E] - Do some'}, 
        Text3D = {'To~r~', '~w~press ~w~[~g~E~w~]'}, 
    },    

    Notify = {
        [1] = {'Brutal GYM', "You don't have GYM card!", 5000, 'error'},
        [2] = {'Brutal GYM', "The time is up!", 5000, 'warning'},
        [3] = {'Brutal GYM', "You left the GYM!", 5000, 'warning'},
        [4] = {'Brutal GYM', "You can not do this in a vehicle!", 5000, 'error'},
        [5] = {'Brutal GYM', "You need to rest before starting another workout!", 5000, 'warning'},
        [6] = {'Brutal GYM', "You can now exercise again.", 5000, 'info'},
    }
}
gym-cl_utils.lua
ESX = Core
QBCore = Core

-- Buy here: (4€+VAT) https://store.brutalscripts.com
function notification(title, text, time, type)
    if Config.BrutalNotify then
        exports['brutal_notify']:SendAlert(title, text, time, type)
    else
        -- Put here your own notify and set the Config.BrutalNotify to false
        SetNotificationTextEntry("STRING")
        AddTextComponentString(text)
        DrawNotification(0,1)

        -- Default ESX Notify:
        --TriggerEvent('esx:showNotification', text)

        -- Default QB Notify:
        --TriggerEvent('QBCore:Notify', text, 'info', 5000)

        -- OKOK Notify:
        -- exports['okokNotify']:Alert('GYM', text, time, type, false)

    end
end

function AddSkill(Skill)
    -- You can use another skill system, but I think our the best :D, because that is simple and great
    if Config.MINIGAME then
        finished = exports["taskbarskill"]:taskBar(3700, 1)
        if finished == 100 then 
            TriggerEvent('brutal_skills:client:AddSkill', Skill, 1)
        end
    else
        TriggerEvent('brutal_skills:client:AddSkill', Skill, 1)
    end
    -- Trigger name, SKILL_NAME, AMOUNT
end

function TextUIFunction(type, text)
    if type == 'open' then
        if Config.TextUI:lower() == 'ox_lib' then
            lib.showTextUI(text)
        elseif Config.TextUI:lower() == 'okoktextui' then
            exports['okokTextUI']:Open(text, 'darkblue', 'right')
        elseif Config.TextUI:lower() == 'esxtextui' then
            ESX.TextUI(text)
        elseif Config.TextUI:lower() == 'qbdrawtext' then
            exports['qb-core']:DrawText(text,'left')
        elseif Config.TextUI:lower() == 'brutal_textui' then
            exports['brutal_textui']:Open(text, "yellow")
        end
    elseif type == 'hide' then
        if Config.TextUI:lower() == 'ox_lib' then
            lib.hideTextUI()
        elseif Config.TextUI:lower() == 'okoktextui' then
            exports['okokTextUI']:Close()
        elseif Config.TextUI:lower() == 'esxtextui' then
            ESX.HideUI()
        elseif Config.TextUI:lower() == 'qbdrawtext' then
            exports['qb-core']:HideText()
        elseif Config.TextUI:lower() == 'brutal_textui' then
            exports['brutal_textui']:Close()
        end
    end
end

function ProgressBarFunction(time, text)
    if Config.ProgressBar:lower() == 'progressbars' then --LINK: https://github.com/EthanPeacock/progressBars/releases/tag/1.0
        exports['progressBars']:startUI(time, text)
    elseif Config.ProgressBar:lower() == 'mythic_progbar' then -- LINK: https://github.com/HarryElSuzio/mythic_progbar
        TriggerEvent("mythic_progbar:client:progress", {name = "policejobduty", duration = time, label = text, useWhileDead = false, canCancel = false})
    elseif Config.ProgressBar:lower() == 'pogressbar' then -- LINK: https://github.com/SWRP-PUBLIC/pogressBar
        exports['pogressBar']:drawBar(time, text)
    end
end

function DrawText3D(x, y, z, text)
	SetTextScale(0.35, 0.35)
    SetTextFont(4)
    SetTextProportional(1)
    SetTextColour(255, 255, 255, 215)
    SetTextEntry("STRING")
    SetTextCentre(true)
    AddTextComponentString(text)
    SetDrawOrigin(x,y,z, 0)
    DrawText(0.0, 0.0)
    local factor = (string.len(text)) / 370
    DrawRect(0.0, 0.0+0.0125, 0.025+ factor, 0.03, 0, 0, 0, 75)
    ClearDrawOrigin()
end


--[[
    Exercise Play trigger: TriggerEvent('brutal_skills:client:PlayExercise', exercise, heading)
]]
skills-cl_utils.lua
function DefaultSkills() -- Add Skills
    Citizen.CreateThread(function()
        while true do
            local ped = PlayerPedId()
            local vehicle = GetVehiclePedIsUsing(ped)
    
            if IsPedSwimmingUnderWater(ped) then
                TriggerEvent('brutal_skills:client:AddSkill', 'Swimming', 1)
            elseif GetEntitySpeed(vehicle) * 3.6 >= 100 and GetPedInVehicleSeat(GetVehiclePedIsIn(ped), -1) == ped then
                TriggerEvent('brutal_skills:client:AddSkill', 'Driving', 1)
            elseif Config.Skills.AllowOutsideTraining then    
                
                if IsPedRunning(ped) then
                    TriggerEvent('brutal_skills:client:AddSkill', 'Stamina', 1)
                end

                if IsPedSprinting(ped) then
                    TriggerEvent('brutal_skills:client:AddSkill', 'Running', 1)
                end
            end
            Citizen.Wait(30000)
        end
    end)
    Citizen.CreateThread(function()
        while true do
            local ped = PlayerPedId()
            if IsPedShooting(ped) then
                GoodWeapon = true
                for k,v in pairs(Config.ShootWeponsBlackList) do
                    if GetSelectedPedWeapon(ped) == GetHashKey(v) then
                        GoodWeapon = false
                    end
                end

                if GoodWeapon then
                    TriggerEvent('brutal_skills:client:AddSkill', 'Shooting', 1)
                end
            end
            Citizen.Wait(200)
        end
    end)
end
client-core.lua
Core = nil

if Config.Core:upper() == 'ESX' then

    local _esx_ = 'new' -- 'new' / 'old'

    if _esx_ then
        Core = exports['es_extended']:getSharedObject()
    else
        while Core == nil do
            TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
            Citizen.Wait(0)
        end
    end
    
    LoadedEvent = 'esx:playerLoaded'
    ReviveEvent = 'esx_ambulancejob:revive'
    TSCB = Core.TriggerServerCallback

elseif Config.Core:upper() == 'QBCORE' then

    Core = exports['qb-core']:GetCoreObject()
    LoadedEvent = 'QBCore:Client:OnPlayerLoaded'
    ReviveEvent = 'hospital:client:Revive'
    TSCB = Core.Functions.TriggerCallback

end
server-core.lua
Core = nil

if Config.Core:upper() == 'ESX' then
--------------------------------------------------------------------------
---------------------------------| ESX |----------------------------------
--------------------------------------------------------------------------

    local _esx_ = 'new' -- 'new' / 'old'
        
    if _esx_ == 'new' then
        Core = exports['es_extended']:getSharedObject()
    else
        Core = nil
        TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
        while Core == nil do
            Citizen.Wait(0)
        end
    end

    RESCB = Core.RegisterServerCallback
    GETPFI = Core.GetPlayerFromId
    RUI = Core.RegisterUsableItem
    Accounts = {'money', 'bank'}

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        while xPlayer == nil do
            Citizen.Wait(1000)
            xPlayer = GETPFI(source) 
        end
        return xPlayer.identifier
    end

    function GetAccountMoney(xPlayer,account)
        return xPlayer.getAccount(account).money
    end

    function GetItemCount(xPlayer, item)
        if xPlayer.getInventoryItem(item) == nil then
            print("^1PROBLEM!^7 The ^3" ..item.. "^7 item is not created.")
            return 0
        end

        return xPlayer.getInventoryItem(item).count
    end

    function RemoveAccountMoney(xPlayer, account, amount)
        xPlayer.removeAccountMoney(account, amount)
    end

    function AddAccountMoney(xPlayer, account, amount)
        xPlayer.addAccountMoney(account, amount)
    end

    function RemoveItem(xPlayer, item)
        xPlayer.removeInventoryItem(item, 1)
    end

elseif Config.Core:upper() == 'QBCORE' then
--------------------------------------------------------------------------
--------------------------------| QBCore |--------------------------------
--------------------------------------------------------------------------

    Core = exports['qb-core']:GetCoreObject()
    RESCB = Core.Functions.CreateCallback
    GETPFI = Core.Functions.GetPlayer
    RUI = Core.Functions.CreateUseableItem
    Accounts = {'cash', 'bank'}

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        while xPlayer == nil do
            Citizen.Wait(1000)
            xPlayer = GETPFI(source) 
        end
        return xPlayer.PlayerData.citizenid
    end

    function GetAccountMoney(xPlayer, account)
        if account == Accounts[1] then
            return xPlayer.PlayerData.money['cash']
        elseif account == Accounts[2] then
            return xPlayer.PlayerData.money['bank']
        end
    end

    function GetItemCount(xPlayer, item)
        local items = xPlayer.Functions.GetItemByName(item)
        local item_count = 0
        if items ~= nil then
            item_count = items.amount
        else
            item_count = 0
        end
        return item_count
    end

    function RemoveAccountMoney(xPlayer, account, amount)
        xPlayer.Functions.RemoveMoney(account, amount)
    end

    function AddAccountMoney(xPlayer, account, amount)
        xPlayer.Functions.AddMoney(account, amount)
    end

    function RemoveItem(xPlayer, item)
        xPlayer.Functions.RemoveItem(item, 1)
    end
    
end

Last updated

Was this helpful?