Documentation

Documentation Yoga minigame

Le minijeu de yoga du mode histoire, sorti de sa mission et transformé en activité roleplay que n'importe qui peut lancer. Alignez les deux marqueurs, tenez la posture pendant que le corps s'y installe, puis inspirez et expirez sur les gâchettes. Trois enchaînements, quatorze postures, les vraies animations et les vrais sons de respiration. Et un score auquel vos propres scripts peuvent réagir.

  • ESX
  • QBCore
  • Qbox
  • vRP
  • Standalone
01

Installation

  1. Déposer la ressource

    Récupérez le script depuis votre compte Tebex, copiez le dossier avenida_yoga/ dans votre dossier resources, et ajoutez ensure avenida_yoga à votre configuration serveur.

  2. Régler la langue et les enchaînements

    Config.Locale accepte n'importe lequel des quinze codes livrés dans locales/. Config.EnabledMoves décide des enchaînements que les joueurs peuvent lancer, et Config.DefaultMove celui utilisé quand aucun n'est précisé.

  3. Placer vos spots

    Les deux coordonnées de Config.Spots sont des exemples, remplacez-les par les vôtres. Chacune prend une orientation, un enchaînement, et un blip que vous pouvez couper. Une liste vide désactive toute la fonctionnalité et son thread.

  4. Diriger les notifications vers votre stack

    Config.Notif est sur auto et détecte ox_lib, okokNotify, QBCore ou ESX dans cet ordre. Forcez une cible si vous en faites tourner plusieurs, ou utilisez la branche custom de bridges/notif.lua pour votre propre système.

  5. Brancher la récompense, ou pas

    L'activité fonctionne telle quelle sans une ligne de votre code. Quand vous voudrez qu'elle rapporte quelque chose, écoutez avenida_yoga:server:sessionCompleted et lisez le score. C'est le seul point d'intégration.

02

Configuration

Transformer une séance en récompense

Un event, déclenché une fois à la fin. Le score est déjà calculé : 1 pour un enchaînement terminé, plafonné à 0,4 pour un abandon, moins 8 pour cent par posture ratée. Ce qu'il rapporte vous appartient.

lua
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)
03

Exports

Server

  • StartYoga
    exports['avenida_yoga']:StartYoga(src, moveKey?) --> boolean

    Lance une séance pour un joueur depuis votre code serveur, sur l'enchaînement que vous nommez ou sur celui par défaut. Renvoie false quand l'enchaînement est inconnu ou que le joueur est déjà en séance, un job ou un prop peut donc réagir au lieu de tirer à l'aveugle.

  • IsDoingYoga
    exports['avenida_yoga']:IsDoingYoga(src) --> boolean

    Vrai tant que le joueur tient une séance en cours, expiration comprise. Utile pour bloquer une action de job, un téléport ou une boutique pendant que le minijeu tient ses contrôles.

Client

  • StartYoga
    exports['avenida_yoga']:StartYoga(moveKey?) --> boolean

    Demande une séance au serveur depuis du code client. La demande passe quand même par le registre serveur, ce n'est donc pas un moyen de contourner le garde-fou de session.

  • IsDoingYoga
    exports['avenida_yoga']:IsDoingYoga() --> boolean

    Vrai tant que le joueur local est en séance. Le jumeau côté client de l'export serveur, pour tout ce qui doit réagir dans la même frame.

04

Recettes

Ajouter un spot de yoga sur votre map

Un spot demande des coordonnées et une orientation. Tout le reste est optionnel : l'enchaînement qu'il lance, le blip, et même l'apparition du tapis. Mettez move sur random pour varier, ou sur menu pour laisser le joueur choisir.

lua
-- 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 },
    },
}

Lancer le yoga depuis un job ou un prop

Un job bien-être, une cour de prison, une activité de désintoxication : donnez la séance sans passer par la commande. Lisez la valeur de retour, elle vous dit si le joueur était libre de commencer.

lua
local started = exports['avenida_yoga']:StartYoga(src, 'sunsalutation')

if not started then
    -- unknown routine, or the player is already in a session
    return
end

Rendre la séance plus facile, ou impitoyable

Quatre nombres portent toute la difficulté. Montez les tentatives et les échecs pour un serveur grand public, baissez-les pour quelque chose de plus proche du jeu de base. Le délai de souffle est ce qui empêche un joueur de se garer sur la gâchette.

lua
-- 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 keyboard

Sortir un enchaînement maintenant, les autres plus tard

Seuls les enchaînements listés dans la config peuvent être lancés, par commande, par export ou par spot. Un serveur peut ouvrir avec le Guerrier seul et débloquer les plus longs lors d'un événement, sans toucher à quoi que ce soit d'autre.

lua
-- config/config.lua
Config.EnabledMoves = { 'warrior' }
Config.DefaultMove  = 'warrior'
05

Questions

Faut-il un framework ?

Non. L'activité ne lit jamais l'argent, les items, les jobs ni l'identité, il n'y a donc rien qu'un framework puisse fournir. Le même fichier tourne sur ESX, QBCore, Qbox, vRP, ox_core ou un serveur nu sans un seul bridge à configurer. La seule partie qui connaisse votre framework est la ligne de notification, un fichier ouvert à six branches.

Ai-je besoin d'ox_lib ?

Non, et ici c'est facile d'être précis : ox_lib sert à exactement une chose, le sélecteur d'enchaînement sur un spot réglé sur menu. Sans lui, ce spot lance l'enchaînement par défaut à la place. Config.UseOxLib bascule aussi le chargement des assets entre les helpers d'ox_lib et les appels natifs, et il est livré désactivé, la ressource tourne donc sur les natifs par défaut.

Y a-t-il une base de données ?

Aucune, et pas de fichier SQL non plus. Le serveur garde les séances en cours en mémoire, une par joueur, avec un délai qui nettoie celles qu'on abandonne. Rien n'est écrit nulle part. Si vous voulez un historique par joueur, c'est à ça que sert l'event de fin : vous stockez ce qui vous intéresse, dans votre propre schéma.

Un client modifié peut-il simuler une séance parfaite ?

Non. La séance est ouverte par le serveur et le résultat est borné avant d'atteindre votre event : les postures tenues ne peuvent pas dépasser l'enchaînement, les échecs ne peuvent pas dépasser trente, le drapeau de réussite est une comparaison stricte et le score est recalculé côté serveur à partir de ces valeurs bornées. Le pire qu'un client modifié puisse faire, c'est déclarer une séance qu'il a réellement ouverte.

Que se passe-t-il quand un joueur lâche une posture ?

Le corps se relève. La ressource lit l'animation exacte que joue le ped et choisit le relevé correspondant parmi les douze que le jeu fournit, dont quatre ont une variante distincte pour une posture lâchée tôt. La posture compte comme ratée, et après cinq postures ratées la séance s'arrête d'elle-même.

Peut-on faire du yoga partout, ou seulement sur un spot ?

Les deux. La commande marche partout à pied, et les spots sont une couche optionnelle par-dessus, pour les endroits que vous voulez signaler avec un tapis et un blip. Laissez Config.Spots vide et il ne reste que la commande et les exports, le thread des spots ne démarrant jamais.

Est-ce que ça marche à la manette ?

Oui, et c'est même pour elle que ça a été pensé d'abord, comme dans le jeu de base. Deux sticks visent les marqueurs et les gâchettes portent la respiration, avec la vibration tant que les deux marqueurs sont sur cible. Au clavier souris, la même séance tourne sur WASD et la souris, et les indications à l'écran changent toutes seules selon ce que le joueur vient d'utiliser.

Que coûte le script quand personne ne fait de yoga ?

0.00ms. La boucle de séance n'existe que pendant une séance, et le thread des spots se met en veille quand aucun joueur n'est à proximité. Sans aucun spot déclaré, ce thread ne démarre même pas.

Panier
Spirit RP
Discord