๐ช 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:
Shared.Exercises = {
-- your entries go here
}Available exercise UIDs
Each entry must use one of these uid values (defined in Shared.ExercisesTypes):
| UID | Exercise |
|---|---|
kettlebellswing | Kettlebell swing |
boxing | Punching bag |
jumpingbox | Box jumps |
overhead | Overhead press (barbell) |
backsquat | Back squat (barbell) |
raises | Dumbbell raises (large rack) |
biceps | Biceps curls (small rack) |
treadmill | Treadmill 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):
| Model | Used for |
|---|---|
devhub_gym_kettlebell_rack | Kettlebells |
devhub_gym_punch_bag | Punching bag |
devhub_gym_jumping_box | Jump box |
devhub_gym_barbell | Barbell โ squat |
devhub_gym_dumbell2_rack | Large dumbbells |
devhub_gym_dumbell1_rack | Small dumbbells |
prop_barbell_02 | Vanilla GTA barbell โ overhead |
devhub_gym_treadmill | Treadmill |
How to add new equipment (script spawns the prop)
Pick a UID and prop
Choose from the tables above.
Get the coordinates
Stand where you want the prop in-game, copy x, y, z, heading.
Add the entry
Append a new table inside Shared.Exercises in configs/shared.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
},Restart
restart devhub_gymplayerCoords 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:
{
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
| Key | Type | Required | Description |
|---|---|---|---|
uid | string | โ | Exercise type |
maxReps | number | โ | Max reps per session |
propName | string | โ | Prop model name |
propCoords | vec4 | โ | x, y, z, heading |
playerCoords | vec4 | โ | Optional โ fixed player position |
placeOnTheGround | bool | โ | true = snap prop to ground |
dontSpawnProp | bool | โ | 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:
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:
{
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.