New Website Sale - 15% OFF everything

๐Ÿ’ช Equipment Setup Guide

TL;DR โ€” Open configs/shared.lua, add a new entry inside Shared.Exercises, restart the resource. Done.

Where to edit

All equipment is configured in a single file:

Lua
Shared.Exercises = {
    -- your entries go here
}

Available exercise UIDs

Each entry must use one of these uid values (defined in Shared.ExercisesTypes):

UIDExercise
kettlebellswingKettlebell swing
boxingPunching bag
jumpingboxBox jumps
overheadOverhead press (barbell)
backsquatBack squat (barbell)
raisesDumbbell raises (large rack)
bicepsBiceps curls (small rack)
treadmillTreadmill run

Each uid is linked to Shared.ExercisesTypes (minigames + skill tree XP). To add a brand-new exercise type, you must extend Shared.ExercisesTypes and create the matching exercise script in escrowed/exercises/.


Available props (known models)

These models have a default menu offset registered in Config.PropsMenuOffset (configs/client.lua):

ModelUsed for
devhub_gym_kettlebell_rackKettlebells
devhub_gym_punch_bagPunching bag
devhub_gym_jumping_boxJump box
devhub_gym_barbellBarbell โ€” squat
devhub_gym_dumbell2_rackLarge dumbbells
devhub_gym_dumbell1_rackSmall dumbbells
prop_barbell_02Vanilla GTA barbell โ€” overhead
devhub_gym_treadmillTreadmill

How to add new equipment (script spawns the prop)

1

Pick a UID and prop

Choose from the tables above.

2

Get the coordinates

Stand where you want the prop in-game, copy x, y, z, heading.

3

Add the entry

Append a new table inside Shared.Exercises in configs/shared.lua:

Lua
{
    uid = "boxing",                  -- exercise type from the list above
    maxReps = 10,                    -- max reps per session
    placeOnTheGround = true,         -- auto-snap prop to the ground
    propName = "devhub_gym_punch_bag",
    propCoords = vec4(x, y, z, h),   -- prop position
    playerCoords = vec4(x, y, z, h), -- (optional) where the player stands
},
4

Restart

Shell
restart devhub_gym

playerCoords is not required for every exercise (e.g. boxing, jumpingbox, treadmill don't use it), but it is recommended for kettlebellswing, overhead, backsquat, raises, biceps.


How to use an EXISTING prop from the map (MLO / IPL)

If the prop already exists in the world and you do not want to spawn a duplicate, set dontSpawnProp = true:

Lua
{
    uid = "boxing",
    maxReps = 10,
    dontSpawnProp = true,            -- IMPORTANT โ€” skip spawning, use the existing prop
    propName = "devhub_gym_punch_bag",
    propCoords = vec4(x, y, z, h),   -- coords of the existing prop
},

propCoords must match the real position of the in-world prop. The script uses it to place the interaction menu and to position the player.


Full entry options

KeyTypeRequiredDescription
uidstringโœ“Exercise type
maxRepsnumberโœ“Max reps per session
propNamestringโœ“Prop model name
propCoordsvec4โœ“x, y, z, heading
playerCoordsvec4โ€”Optional โ€” fixed player position
placeOnTheGroundboolโ€”true = snap prop to ground
dontSpawnPropboolโ€”true = use an existing prop from the map

Important rules

Do NOT place multiple entries with the same uid too close to each other. Author note in shared.lua: "dont place the same uid too close to each other".

Config.PropSpawnDistance = 50.0 (max 75.0). Above that limit, props will not load reliably.

Custom prop? Register its menu offset in configs/client.lua โ†’ Config.PropsMenuOffset, otherwise the menu may appear inside the model:

Lua
Config.PropsMenuOffset = {
    [`your_prop`] = vec3(x, y, z),
}

Map blips are configured in configs/client.lua โ†’ Config.Blips.

Skill Tree XP โ€” if Shared.DevhubSkillTreeEnabled = true, XP rewards are configured in Shared.ExercisesTypes[uid].skillTrees.


Examples

Punching bag attached to a prop that already exists inside an MLO:

Lua
{
    uid = "boxing",
    maxReps = 15,
    dontSpawnProp = true,
    propName = "prop_box_bag01a",
    propCoords = vec4(150.25, -1005.75, 29.30, 90.0),
},

After adding entries, just run restart devhub_gym on the server.