Yoga minigame
The yoga minigame from story mode, pulled out of the mission and turned into a roleplay activity anyone can start. Line up both markers, hold the pose while the body moves into it, then breathe in and breathe out on the triggers. Three routines, fourteen poses, the real animations and the real breathing sounds. And a score your own scripts can react to.
What it does
Four things happen in every pose, not one animation
Aim both markers on their targets, hold them there while the body moves into the pose, breathe in by holding both triggers, breathe out by letting go. The aiming window is 15 degrees, the holding window widens to 55 because the body is moving. That gap is what makes the pose feel like it is being held rather than watched.
Technical
specifications
Everything you
get
-
Fifteen locale files, shipped filled
Your players read the script in their own language from the first start, and the files sit outside escrow so you can edit any line in production. Honest note: they are translated and reviewed by us, not proofread by native speakers of all fifteen. Tell us what reads wrong in yours and it gets fixed.
-
The minigame rules are yours to set
Missed breathing cycles before a pose fails, failed poses before the session stops, how long a breath can be held, mouse sensitivity, rumble, on-screen hints, the timecycle strength per pose and its cap. `config/config.lua` is escrow exempt, so a wellness spa server and a prison yoga yard can run the same resource at two different difficulties.
-
The world spots, entirely in config
Coordinates, heading, which routine, the mat prop, the blip sprite and colour, the distance the marker appears at and the distance the prompt becomes usable. Leave the list empty and the whole feature switches off, thread included.
-
Four exports and one integration event
Start a session and check whether a player is in one, from the server or from the client. Then a single event at the end carrying the result, documented in the file with the line to copy. It is the shortest path between this activity and your own economy.
Integration guide
Installation
-
Drop the resource
Grab the script from your Tebex account, copy the
avenida_yoga/folder into your resources directory, and addensure avenida_yogato your server config. -
Set the language and the routines
Config.Localetakes any of the fifteen codes shipped inlocales/.Config.EnabledMovesdecides which routines players may start, andConfig.DefaultMovethe one used when none is given. -
Place your spots
The two coordinates in
Config.Spotsare examples, replace them with yours. Each one takes a heading, a routine, and a blip you can turn off. An empty list disables the whole feature and its thread. -
Point the notifications at your stack
Config.Notifis onautoand detects ox_lib, okokNotify, QBCore or ESX in that order. Force a target if you run several, or use thecustombranch ofbridges/notif.luafor your own system. -
Hook the reward, or do not
The activity works out of the box without any of your code. When you want it to pay something, listen to
avenida_yoga:server:sessionCompletedand read the score. That is the only integration point.
Quickstart
Turn a session into a reward
One event, fired once at the end. The score is already computed: 1 for a finished routine, capped at 0.4 for an abandoned one, minus 8 percent per failed pose. What it pays is your call.
AddEventHandler('avenida_yoga:server:sessionCompleted', function(src, data)
-- data.move 'warrior' | 'triangle' | 'sunsalutation'
-- data.completed true when the routine went to the end
-- data.posesBest poses held
-- data.poses poses in the routine
-- data.fails poses dropped
-- data.score 0.0 to 1.0
if not data.completed then return end
-- your own reward: stress, stamina, a skill, a payout
local reward = math.floor(250 * data.score)
end)API Reference
Public exports grouped by domain. Each row shows the call signature and what it does, not how it does it.
Server
StartYoga
exports['avenida_yoga']:StartYoga(src, moveKey?) --> booleanStarts a session for a player from your own server code, on the routine you name or on the default one. Returns
falsewhen the routine is unknown or the player is already in a session, so a job or a prop can react instead of firing blind.IsDoingYoga
exports['avenida_yoga']:IsDoingYoga(src) --> booleanTrue while the player holds a live session, expiry included. Useful to block a job action, a teleport or a shop while the minigame owns their controls.
Client
StartYoga
exports['avenida_yoga']:StartYoga(moveKey?) --> booleanAsks the server for a session from client code. The request still goes through the server registry, so this is not a way around the session guard.
IsDoingYoga
exports['avenida_yoga']:IsDoingYoga() --> booleanTrue while the local player is in a session. The client-side twin of the server export, for anything that has to react in the same frame.
Recipes
Real-world copy-paste examples. Drop them into your own resource, tweak the values, ship.
A spot needs coordinates and a heading. Everything else is optional: the routine it starts, the blip, and whether the mat prop is spawned at all. Set `move` to `random` for variety, or to `menu` to let the player choose.
-- config/config.lua
Config.Spots = {
{
coords = vector3(-1204.02, -1566.28, 3.63),
heading = 125.0,
move = 'menu',
blip = { sprite = 311, colour = 2, scale = 0.7 },
},
}A wellness job, a prison yard, a rehab activity: give the session without the command. Read the return value, it tells you whether the player was free to start.
local started = exports['avenida_yoga']:StartYoga(src, 'sunsalutation')
if not started then
-- unknown routine, or the player is already in a session
return
endFour numbers carry the whole difficulty. Raise the attempts and the fails for a casual server, lower them for something closer to the base game. The breath timeout is what stops a player from parking on the trigger.
-- config/config.lua
Config.BreathingAttempts = 3 -- missed cycles before a pose fails
Config.MaxFails = 5 -- failed poses before the session stops
Config.HoldBreathFailMs = 15000 -- holding the breath longer fails the pose
Config.MouseGain = 3.0 -- marker sensitivity on mouse and keyboardOnly the routines listed in the config can be started, by command, by export or by spot. A server can open with Warrior alone and unlock the longer ones as an event, without touching anything else.
-- config/config.lua
Config.EnabledMoves = { 'warrior' }
Config.DefaultMove = 'warrior'Troubleshooting
- No. The activity never reads money, items, jobs or identity, so there is nothing a framework could provide. The same file runs on ESX, QBCore, Qbox, vRP, ox_core or a bare server without a single bridge to configure. The only framework-aware part is the notification line, which is an open file with six branches.
- No, and here it is easy to be precise: ox_lib is used for exactly one thing, the routine picker on a spot set to `menu`. Without it, that spot starts the default routine instead. `Config.UseOxLib` also switches the asset loading between ox_lib helpers and the native calls, and it ships off, so the resource runs on natives by default.
- None, and no SQL file either. The server keeps the live sessions in memory, one per player, with a timeout that clears an abandoned one. Nothing is written anywhere. If you want a player history, that is what the completion event is for: you store what you care about, in your own schema.
- No. The session is opened by the server and the result is clamped before it reaches your event: poses held cannot exceed the routine, fails cannot exceed thirty, the completion flag is a strict comparison and the score is recomputed server side from those clamped values. The worst a modified client can do is report a session it really opened.
- The body stands back up. The resource reads the exact animation the ped is playing and picks the matching recovery from the twelve the game ships, with four of them having a separate variant for a pose dropped early. The pose counts as failed, and after five failed poses the session stops on its own.
- Both. The command works anywhere on foot, and the spots are an optional layer on top for the locations you want to signpost with a mat and a blip. Leave `Config.Spots` empty and only the command and the exports remain, with the spot thread never starting.
- Yes, and it was built for one first, like the base game. Two sticks aim the markers and the shoulder triggers carry the breathing, with rumble while both markers are on target. On mouse and keyboard the same session runs on WASD and the mouse, and the on-screen prompts change by themselves depending on what the player last used.
- 0.00ms. The session loop only exists while a session is live, and the spot thread parks when no player is near one. With no spots declared at all, that thread never starts in the first place.
What buyers say
5.0 1 verified review
Jpmediaaa. Hotstar Production I am very happy that I was given the opportunity to make a script trailer for the yoga minigame, I think the script is very seamless and very easy to use and interactive.
FEATURED DerassDance minigame
The GTA Online nightclub dance minigame, rebuilt for FiveM and playable anywhere on your map. Tap on the beat to climb four intensity levels, hold to keep them, boost or drop on demand, cycle ten styles and cut into 27 special moves without leaving the floor. Everyone around sees the whole thing, and your server never runs a line of it.
FEATURED Avenida TeamBarber shop
A barbershop staged like a scene, with a camera the player actually controls. The character walks in, sits down, and the barber gets to work while an orbit camera frames the head. Hair, beard, overlays and the full skin-detail set, previewed live before a single dollar is spent.
FEATURED Avenida TeamClothing store
A clothing store with saved outfits, company wardrobes and an editor that prices the catalogue from inside the game. Every component and every prop, bought one garment at a time or as a whole look, with a server-side ledger that stops anyone wearing what they never paid for.