Généralités & important

MasterStretcher est une solution médicale avancée pour FiveM qui remplace les brancards statiques par des entités physiques réalistes. Le script gère la gravité dans les pentes, offre une synchronisation réseau parfaite (OneSync), permet l'ancrage automatique dans les ambulances configurées et inclut un module unique pour les nacelles de grandes échelles.

Présentation du projet

MasterStretcher remplace les brancards « statiques » par de vrais brancards physiques pour FiveM : on les pousse, ils suivent le terrain, se rangent dans les ambulances configurées et se synchronisent entre tous les joueurs. Le script est gratuit, distribué par MasterMods.

Version documentée : 3.6.4. Le détail des changements est dans Journaux des changements.

Fonctionnalités

Compatibilité

Domaine Pris en charge
Framework ESX, QBCore, QBox, ox_core, standalone
Interaction ox_target (recommandé), qb-target, ou clavier seul
Inventaire inventaire natif du framework, ou ox_inventory
Notifications ox_lib, ESX, QBCore / QBox, okokNotify, natives GTA
Langues français, anglais, allemand, espagnol (repli automatique sur le français)

Sécurité et stabilité

Le serveur a le dernier mot sur toutes les actions sensibles : création des brancards, permissions, distances, relais, invitations, positions du patient. Un client modifié ne peut ni faire apparaître de brancards à volonté, ni déplacer ou supprimer une entité qui ne lui appartient pas. L'état des brancards est écrit uniquement par le serveur, ce qui rend le script compatible avec sv_stateBagStrictMode.

Le script nettoie aussi derrière lui : brancards abandonnés, brancards des ambulances supprimées, places libérées à la déconnexion.

Guide pour les joueurs

L'archive contient Formation-Brancard-MasterStretcher.pdf, un guide de 13 pages à destination des joueurs (sortir, pousser, installer un patient, ranger, relais, messages et solutions, fiche réflexe). Il est aussi joint à chaque release. Le résumé en ligne est dans Guide d'utilisation.

Liens

Installation

Prérequis

Élément Détail
Compte Cfx.re Pour récupérer la ressource dans Keymaster
Artifacts FiveM Version récente (la dernière version recommandée) ; Lua 5.4 requis
OneSync Obligatoire (les brancards sont créés et synchronisés par le serveur)
ox_lib Obligatoire, démarré avant MasterStretcher
ox_target ou qb-target Recommandé (sinon : interactions au clavier, Config.TargetSystem = "none")
ox_inventory Facultatif ; version récente si vous l'utilisez (voir Configuration Détaillée)

1. Récupérer la ressource

  1. Sur la boutique Tebex MasterMods, ajoutez le paquet gratuit MasterStretcher et validez la commande à 0,00 €. Elle est liée à votre compte Cfx.re.
  2. Sur Keymaster, onglet Granted Assets, téléchargez l'archive MasterStretcher.

L'archive contient :

2. Installer sur le serveur

  1. Copiez le dossier MasterStretcher dans resources/. Gardez exactement ce nom : il sert à l'export ox_inventory (MasterStretcher.stretchermod_use_item).
  2. Dans server.cfg, démarrez-le après ses dépendances :
ensure ox_lib
ensure ox_target        # ou qb-target
ensure ox_inventory     # si utilisé
ensure MasterStretcher

3. MasterKey (facultative)

Depuis la 3.6.0, le script fonctionne sans MasterKey : le serveur est reconnu automatiquement par son adresse cfx.re. Au démarrage, la console affiche [MASTERMODS] Serveur identifié : xxxx.users.cfx.re.

La MasterKey rattache le serveur à votre compte MasterMods (portail, support, outils Premium). Pour l'ajouter :

  1. Créez votre MasterKey gratuite : https://ressources.mastermods.dev/CreerMasterKey.php
  2. Recommandé : ajoutez-la dans server.cfg :
set mastermods_key "MM-XXXXX"

Utilisez bien set (et non setr) : la clé reste côté serveur. Elle est prioritaire sur la config.

Autre possibilité : Config.MasterModsKey = "MM-XXXXX" dans config/config.lua. Ce fichier est téléchargé par les joueurs ; server.cfg est donc préférable.

Au démarrage, la console doit afficher : [MASTERMODS] Licence validée pour : <nom du serveur>. Si elle affiche « Aucune MasterKey (facultative) » alors que vous en avez mis une, la clé n'est pas lue (voir Dépannage - F.A.Q).

4. Adapter la configuration

Les fichiers de config/ restent modifiables (ils ne sont pas chiffrés) :

Fichier Contenu Page
config/config.lua Licence, langue, framework, permissions, gameplay, son, items, sécurité Configuration Détaillée
config/stretchers.lua Modèles de brancards, items, accessoires, positions du patient Configuration Détaillée
config/vehicles.lua Ambulances et nacelles Configuration des Véhicules

Mettre à jour

  1. Sauvegardez votre dossier config/.
  2. Remplacez le dossier MasterStretcher par celui de la nouvelle archive.
  3. Remettez votre config/ et comparez-le avec la nouvelle version : les nouvelles options sont listées dans les Journaux des changements. Une option absente de votre ancienne config prend sa valeur par défaut.
  4. Redémarrez le serveur (ou ensure MasterStretcher).

Mise à jour depuis la 3.4.0 : rien n'est obligatoire. Pensez à déplacer votre clé dans server.cfg et regardez les deux nouveaux réglages Config.MaxStretchersPerPlayer et Config.AbandonedStretcherMinutes.

Ne pas modifier

Le script vérifie au démarrage que tous ses fichiers sont présents. S'il en manque un, il refuse de démarrer et l'indique en console : réinstallez alors la ressource depuis une archive propre.

Guide d'utilisation

Toutes les actions passent par l'œil d'interaction (Alt maintenu, puis viser le brancard, l'ambulance, la nacelle ou la personne). La seule touche directe est celle qui lâche le brancard : E par défaut, modifiable par chaque joueur dans Paramètres > Raccourcis > FiveM > Lâcher le brancard.

Le guide complet pour les joueurs, avec illustrations et fiche réflexe, est le PDF Formation-Brancard-MasterStretcher.pdf fourni dans l'archive.

Sortir un brancard

Méthode Comment
Depuis l'ambulance Ambulance à moins de 5 km/h, portes arrière ouvertes : Alt sur l'ambulance → Sortir le brancard. Il arrive directement en main.
Depuis l'inventaire Utiliser l'item brancard. L'item n'est retiré que si le brancard apparaît vraiment.
Commande /brancard (ou /brancard 2 pour le 2ᵉ modèle de Config.ItemsVeh).

Chaque ambulance configurée embarque son brancard dès qu'un joueur monte à bord (auto-armement). Un joueur peut avoir au plus Config.MaxStretchersPerPlayer brancards en service (2 par défaut) ; ceux des ambulances ne comptent pas.

Pousser et lâcher

Choix Usage Freins
Debout (pieds sortis) Pause pendant le transport Toujours serrés
Couché (au sol) Installer un patient, soins, fin d'intervention Serrés par défaut (Config.AutoBrakeOnRelease)

Installer le patient

Ouvrir le menu : Alt sur le brancard → Menu Gestion.

Qui Comment
Soi-même (tout le monde) S'installer → position. La place est réservée par le serveur avant de s'allonger. Se lever pour descendre.
Un autre joueur Brancard libre à moins de 4 m du blessé : Alt sur lui → Inviter la personne à aller sur le brancard → position. Il a 10 s pour accepter.
Un PNJ Brancard libre à moins de 4 m : Alt sur le PNJ → Mettre sur le brancard → position. Fonctionne aussi sur un PNJ mort ou blessé au sol (positions allongées uniquement). Sortir le patient pour le descendre : un PNJ ramassé mort retombe au sol.

Un secouriste peut changer la position d'un patient : Position Patient (Joueur) ou Position Patient (PNJ).

À l'hôpital, Confier le patient à l'hôpital (PNJ uniquement) : le personnel le prend en charge et le brancard est libéré. L'option n'apparaît que dans les zones hôpital configurées.

Réglages et accessoires

Menu Gestion → Accessoires & Réglages : dossier (debout / couché), garde-corps (levés / baissés) et matériel selon le modèle. Tous les joueurs voient les mêmes réglages.

L'ambulance

Action Conditions
Rentrer dans l'ambulance En poussant le brancard, portes requises ouvertes, à moins de 6 m. Le patient peut rester allongé.
Sortir le brancard Ambulance arrêtée, portes ouvertes. Fonctionne même si quelqu'un est resté assis dans l'ambulance.
Menu Intérieur Brancard rangé : même menu que Menu Gestion (patient, réglages) pendant le transport.

L'option de rangement reste toujours proposée : si c'est impossible (ambulance pleine, portes fermées), un message explique pourquoi. Une ambulance ne contient qu'un brancard.

Relais entre secouristes

Alt sur un collègue :

L'autre joueur doit accepter dans les 15 secondes ; les deux doivent rester proches du brancard.

Nacelle de grande échelle

Alt sur la nacelle en poussant : Fixer à la nacelle. Pour le récupérer : Sortir le brancard (sur la nacelle, en main) ou Détacher de la nacelle (sur le brancard, reste sur place). Menu Intérieur donne accès au patient.

Supprimer un brancard

Brancard couché et freiné : Alt → Supprimer le brancard (selon le grade). Un patient encore allongé est relevé automatiquement.

Le serveur nettoie aussi seul : brancard vide d'un joueur déconnecté, brancard rangé dans une ambulance supprimée, brancard oublié au sol depuis Config.AbandonedStretcherMinutes (30 min par défaut, aucun joueur à moins de 50 m).

Touches

Touche Action
Alt maintenu Œil d'interaction (ox_target / qb-target)
E Lâcher le brancard (choix Debout / Couché)

Sans système d'interaction (Config.TargetSystem = "none"), la touche E sert aussi à prendre le brancard le plus proche.

Configuration Détaillée

Fichiers modifiables : config/config.lua (réglages généraux) et config/stretchers.lua (modèles de brancards). Les véhicules sont décrits dans Configuration des Véhicules. Après une modification : ensure MasterStretcher (ou redémarrage).

1. MasterKey et langue

Option Défaut Rôle
set mastermods_key "MM-XXXXX" (server.cfg) — Facultative depuis la 3.6.0 (sans clé, le serveur est reconnu par son adresse cfx.re). Rattache le serveur à votre compte MasterMods. Prioritaire sur la config et jamais envoyée aux joueurs.
Config.MasterModsKey "VOTRE_MASTERKEY_ICI" Clé si elle n'est pas dans server.cfg.
Config.Locale "fr" fr, en, de, es (en-us, en-gb… acceptés). Une langue ou un texte manquant retombe sur le français.

2. Framework, interaction, notifications

Option Défaut Valeurs
Config.FrameworkMetier "standalone" "esx", "qb", "qbx", "ox" (ox_core), "standalone"
Config.InventorySystem "native" "native" (items du framework : ESX, QBCore, QBox) ou "ox" (ox_inventory). Indépendant du framework.
Config.TargetSystem "ox" "ox" (ox_target), "qb" (qb-target), "none" (clavier seul)
Config.NotifySystem "ox" "ox", "esx", "qb", "qbx", "okok", "gta"

3. Permissions par métier

Option Défaut Rôle
Config.JobRestriction false true : seules les personnes listées dans Config.AuthorizedJobs peuvent agir. Sans effet en standalone.
Config.RequireOnDuty true Avec JobRestriction : il faut aussi être en service (QB / QBX, ESX Legacy récent). Sans effet si le framework ne gère pas le service. Absente d'une config d'avant la 3.6.4 : service non exigé.
Config.AuthorizedJobs ambulance, pompier Grade minimum par action et par métier.
Config.AuthorizedJobs = {
    ['ambulance'] = { push = 0, patient = 0, stow = 1, spawn = 2, extras = 2, delete = 3 },
    ['pompier']   = { push = 1, patient = 1, stow = 1, spawn = 2, extras = 2, delete = 4 },
}
Action Ce qu'elle autorise
push Pousser, freins, relais, installer ou repositionner un patient (joueur ou PNJ), inviter un joueur
patient Réservé (non utilisé actuellement)
stow Ranger / sortir un brancard d'un véhicule ou d'une nacelle
spawn Sortir un brancard depuis l'item ou /brancard
extras Accessoires et réglages, menu intérieur
delete Supprimer un brancard

Un métier absent du tableau, ou une action absente pour ce métier, est refusé. S'allonger soi-même et se lever restent ouverts à tout le monde. Le contrôle est fait côté serveur : les options sont aussi masquées côté client par confort.

4. Gameplay et physique

Option Défaut Rôle
Config.DefaultKey 'E' Touche par défaut si Config.TargetSystem = "none" (prendre et lâcher)
Config.ReleaseKey 'E' Touche par défaut pour lâcher avec ox_target / qb-target. Chaque joueur peut la changer dans ses raccourcis FiveM.
Config.EnableSlopePhysics true Suivi de pente ; un brancard sans frein dévale
Config.EnableSlopePitch / EnableSlopeRoll true Inclinaison avant/arrière et latérale
Config.SlowDownWhenPushing true Marche ralentie en poussant
Config.TerrainPhysics false Expérimental : encore plus lent sur herbe, terre, sable, neige
Config.EnableAutoArming true Brancard automatique dans chaque ambulance configurée
Config.AutoBrakeOnRelease true Freins serrés en posant couché (debout : toujours serrés)
Config.EnablePickupAnimation false Expérimental : le joueur marche jusqu'au brancard et s'accroupit pour le prendre
Config.HolsterWeaponBeforePush true Range l'arme avant de pousser

Config.PhysicsRefreshRate est présent dans la config mais n'est plus utilisé.

5. Audio

Option Défaut Rôle
Config.EnableWheelSound true Son des roues
Config.WheelSoundFile "wheels.mp3" Fichier dans html/sounds/
Config.WheelSoundVolume 0.2 Volume maximum (0.0 à 1.0)
Config.WheelFadeTime 500 Fondu d'arrêt (ms)
Config.WheelSoundDistance 15.0 Distance d'écoute (m)

6. Items, limites et nettoyage

Option Défaut Rôle
Config.RemoveItemOnUse true Inventaire natif : retire l'item après l'apparition réussie du brancard
Config.MaxStretchersPerPlayer 2 Brancards en service par joueur (item et /brancard), 0 = illimité. Les brancards auto-armés ne comptent pas.
Config.AbandonedStretcherMinutes 30 Supprime un brancard au sol, vide, sans joueur à moins de 50 m depuis ce délai. 0 = jamais.

Inventaire natif (ESX, QBCore, QBox)

Les items de Config.ItemsVeh doivent exister dans votre base / vos items. Sous QBox, préférez ox_inventory.

ox_inventory

Avec Config.InventorySystem = "ox", déclarez chaque item dans ox_inventory/data/items.lua :

['stretcher'] = {
    label = 'Brancard',
    weight = 5000,
    consume = 1,
    client = { export = 'MasterStretcher.stretchermod_use_item' },
},

PNJ (Config.NPC)

Option Défaut Rôle
AllowDown true Autorise les PNJ morts ou blessés au sol
DownPositions dos, mort, RCP, PLS Positions proposées pour un PNJ mort ou blessé (labels des animations)
KeepDeadOnRemove true Un PNJ ramassé mort redevient un cadavre quand on le sort du brancard
HospitalDelivery true Active Confier le patient à l'hôpital
HospitalZones 5 hôpitaux d'origine { label, coords = vector3(...), radius } : à adapter à vos MLO

Section facultative : un config.lua sans Config.NPC utilise ces valeurs par défaut.

7. Sécurité réseau

Option Défaut Rôle
Config.MaxInteractionDistance 6.0 Distance maximale (m) entre un joueur et le brancard / véhicule qu'il manipule. Refus serveur au-delà.
Config.InviteToStretcherDistance 4.0 Distance maximale (m) entre le blessé et le brancard pour l'inviter
Config.Debug false Messages de diagnostic en console (F8 et serveur). À laisser à false en production.

8. Modèles de brancards (config/stretchers.lua)

Items et commande

Config.ItemsVeh = {
    { hash = `ferno-f2`,   item = 'stretcher',  label = 'Ferno F2' },
    { hash = `fernof3`,    item = 'stretcher2', label = 'Ferno F3' },
    { hash = `stryker_pp`, item = 'stryk',      label = 'Apex Lifter X1' },
}

L'ordre donne le numéro de /brancard <n>. Seuls les modèles listés ici peuvent apparaître par item ou commande.

Un modèle de brancard

Un modèle doit figurer à la fois dans Config.Brancards (réglages) et dans Config.Lits (positions du patient) :

Config.Brancards[`ferno-f2`] = {
    label            = "Ferno F2",
    extrasPieds      = { haut = 1, bas = 2 },   -- pieds dépliés / repliés
    extrasDossier    = { haut = 3, bas = 4 },
    extrasGardeCorps = { haut = 6, bas = 5 },
    defaultExtras    = { 4, 5 },               -- extras visibles à l'apparition (jamais les pieds)
    attach = {                                 -- position tenue en main
        pos = { x = -0.05, y = 1.43, z = -0.34 },
        rot = { x = 180.0, y = 180.0, z = 180.0 },
        pivotLength = 0.9,                     -- compensation en pente
    },
    groundOffset = { haut = 0.0, bas = 0.0 },  -- facultatif : seul `bas` (posé couché) est utilisé
    extras = {                                 -- accessoires du menu
        { id = 7, label = "extra_tablet" },
        { id = 9, label = "extra_oxygen" },
    },
}

Config.Lits = {
    { lit = `ferno-f2`, anims = Config.AnimsFernoF2 },
}

9. Commandes

Commande Qui Rôle
/brancard [n] Joueurs avec la permission spawn Sortir le brancard n°n de Config.ItemsVeh
/configBrancard Licence Premium Placer le brancard dans le véhicule le plus proche, copie la config
/configStretcher <modèle> Licence Premium Calibrer la prise en main et la hauteur au sol d'un modèle
/brancardDoors Config.Debug = true Affiche l'état des portes du véhicule proche (trouver requiredDoors)
brancardHeartbeat Console serveur, Config.Debug = true Force l'envoi licence / télémétrie / carte

Configuration des Véhicules (Ambulances/Paniers)

Fichier : config/vehicles.lua. Un brancard ne peut être rangé que dans un véhicule déclaré ici.

1. Structure d'une ambulance

Config.AmbulanceConfig = {
    {
        model = "Master III 2017",          -- nom affiché (informatif)
        hash = `rmaster317_vsav-bspp`,      -- nom de spawn, entre accents graves
        auteur = "Anto",                    -- crédit (informatif)
        AutoBrancardName = "ferno-f2",      -- brancard créé par l'auto-armement
        requiredDoors = {2, 3},             -- portes à ouvrir pour ranger / sortir
        detection = 2.4,                    -- obligatoire, sans effet (voir plus bas)
        alignementLateral = -0.25,          -- X : gauche (-) / droite (+)
        profondeur = -1.25,                 -- Y : arrière (-) / avant (+)
        hauteur = -0.25,                    -- Z : bas (-) / haut (+)
        rotation = 0.0,                     -- 0.0 = pieds vers l'avant
        offsetsByModel = {                  -- position propre à chaque modèle de brancard
            [`ferno-f2`]   = { alignementLateral = -0.25, profondeur = -1.25, hauteur = -0.25, rotation = 0.0 },
            [`stryker_pp`] = { alignementLateral = -0.35, profondeur = -1.60, hauteur = 0.95, rotation = 0.0 },
        },
    },
}
Champ Obligatoire Rôle
model oui Nom pour vous repérer
hash oui Modèle du véhicule (`nom_de_spawn`)
auteur oui Crédit du modèle
AutoBrancardName oui Nom du modèle de brancard auto-armé (doit être dans Config.Lits)
requiredDoors oui Portes qui doivent être ouvertes ; {} = aucune
detection oui Conservé pour compatibilité, sans effet
alignementLateral, profondeur, hauteur, rotation oui Position par défaut du brancard dans le véhicule
offsetsByModel non Position par modèle de brancard ; prioritaire sur les valeurs par défaut

Une entrée à laquelle il manque un champ obligatoire est ignorée, avec un message ERREUR DANS config/vehicles.lua en console qui indique le champ manquant.

Distance d'interaction

Les options de l'ambulance apparaissent à moins de Config.MaxInteractionDistance (6 m) du centre du véhicule. Pour un véhicule très long, augmentez cette valeur dans config/config.lua (le champ detection n'est plus utilisé).

Plusieurs modèles de brancard

Chaque modèle a ses propres dimensions. Sans entrée dans offsetsByModel, un autre modèle que celui calibré sera mal placé : ajoutez une ligne par modèle utilisé dans ce véhicule.

2. Trouver les bonnes valeurs

Avec l'assistant (licence Premium)

  1. Placez-vous près du véhicule, portes ouvertes, puis tapez /configBrancard.
  2. Renseignez le nom de spawn, le nom d'affichage, l'auteur, le brancard automatique et les portes.
  3. Déplacez le brancard fantôme : flèches (X/Y), Page préc./suiv. (Z), Z/S Q/D A/E (rotations), Maj pour la précision.
  4. Entrée copie le bloc dans le presse-papiers ; Retour arrière annule.

Si le véhicule est déjà configuré, l'assistant ne génère que la ligne offsetsByModel du modèle choisi, à coller dans l'entrée existante.

À la main

Ajustez les valeurs par pas de 0,05 puis ensure MasterStretcher :

3. Portes requises (requiredDoors)

Index Porte
0 Avant gauche (conducteur)
1 Avant droite (passager)
2 Arrière gauche
3 Arrière droite
4 Capot
5 Coffre / hayon
6 Soute (hélicoptères)

Certains véhicules modifiés ne suivent pas cette numérotation. Avec Config.Debug = true, la commande /brancardDoors affiche l'état de chaque porte du véhicule le plus proche : ouvrez la porte voulue et relevez son index.

4. Hélicoptères

5. Nacelles de grande échelle

Config.LadderBasketConfig = {
    {
        label = "Nacelle EPAN",
        hash = -84503767,                     -- modèle de la NACELLE (pas du camion)
        offset = { x = 0.44, y = -0.43, z = 0.15 },
        rot = { x = 90.0, y = 0.0, z = 0.0 },
    },
}
Champ Rôle
label Nom pour vous repérer
hash Modèle de la nacelle elle-même (objet attaché au camion)
offset Position du brancard dans la nacelle
rot Orientation ; une rotation X d'environ 90° le plaque contre la paroi

En jeu : Alt sur la nacelle → Fixer à la nacelle, Sortir le brancard ou Menu Intérieur ; Alt sur le brancard → Détacher de la nacelle. Une nacelle ne porte qu'un brancard.

Journaux des changements

📋 Changelog (Mise à jour du 30/12 - 31/12) - 3.1.0

Nouvelles Fonctionnalités
  • Système PNJ Complet : Placement de PNJ vivants sur le brancard avec un menu de position dédié pour modifier l’animation après l’installation.
  • Support Nacelle : Support de l’EPAN d’Anto avec détection automatique et masquage visuel des roues.
  • Alignement Dynamique (Pitch & Roll) : Le brancard s’incline automatiquement selon l’inclinaison du terrain (avant/arrière et latéral).
Correctifs & Patches
  • Remaniement : Simplification du fichier de configuration
  • Système de Relais : Transfert de contrôle fluide entre deux collègues via une demande et une confirmation synchronisées.
  • Persistance d’Animation : Système de vérification pour empêcher que l’animation du patient ne soit coupée par des scripts tiers.
  • Optimisation des Collisions : Désactivation des collisions entre le patient et le brancard pendant le transport pour supprimer les mouvements erratiques.
  • Patch Technique : Correction de la fonction native de débarquement, correction d’un bug où les joueurs-non-métier ne pouvaient pas se coucher sur le brancard.
  • Changement de système : Plus besoin d’être sur Discord SAUF pour garder les fonctions ‘Premium’ : Support Nacelle, alignement dynamique, restriction métier
  • Optimisation des Extras : Regroupement des dossiers et garde-corps en interrupteurs uniques (ON/OFF) avec logique d’exclusion mutuelle pour une gestion simplifiée.

📑 Changelog - MasterStretcher (Mise à jour du 01/01) - 3.1.1

Attention : changement du fichier config.lua nécessaire !

  • Correction du bug des nacelles : Le brancard ne devrait plus léviter et ne plus boguer lorsqu’il est attaché à une échelle ou un panier. Il reste désormais parfaitement fixé pour tout le monde, même lors des mouvements.
  • Alerte de mise à jour : Si une nouvelle version du script est disponible, un gros message d’alerte très visible (en rouge et jaune) s’affichera directement dans la console de votre serveur au démarrage.
  • Affichage des véhicules amélioré : Les véhicules s’affichent désormais par leur nom et leur auteur (ex: Master III [Anto]), au lieu de simples numéros techniques pour une compréhension plus simple de la config.
  • Meilleure stabilité : Le système de vérification est plus robuste et ne risque plus de bloquer le démarrage, même si vous avez une liste de véhicules configurés extrêmement longue.
  • Gestion des pieds : Modification afin de pouvoir intégrer plus facilement d’autres brancards.

📑 Changelog - MasterStretcher (Mise à jour du 02/01) - 3.1.4

Attention : changement du fichier config.lua nécessaire !

🚑 Configuration & Identification des Véhicules
  • Labels des Ambulances : Les véhicules sont désormais identifiés par leurs noms configurés (ex: “Master III 2012”) au lieu de simples identifiants techniques.
  • Affichage des Auteurs : L’auteur du modèle (si renseigné dans la configuration) apparaît désormais entre crochets à côté du nom du véhicule (ex: [Anto]).
  • AutoBrancardName (Liaison automatique) :
  • Ce paramètre définit le modèle de brancard nativement associé à une ambulance.
  • Le rapport automatique traduit désormais l’ID technique en label lisible, vous permettant de valider instantanément que la liaison entre votre ambulance et son brancard est opérationnelle.
  • requiredDoors (Gestion des accès) :
  • Ce paramètre liste les indices des portes (ex: 2, 3) qui doivent être impérativement ouvertes pour charger ou décharger un brancard.
  • Le rapport technique répertorie ces portes pour chaque véhicule, garantissant un contrôle précis de vos réglages de réalisme.

📑 Changelog - MasterStretcher (Mise à jour du 02/01) - 3.1.5

  • Test : essais nacelle
  • Rotation : possibilité de tourner le brancard pour l’attachement dans le véhicule

📑 Changelog - MasterStretcher (Mise à jour du 03/01) - 3.1.6

📑 Changelog - MasterStretcher (Mise à jour du 25/01) - 3.1.7

  • Correction d'un bug sur le fait que l'index métier (grade) n'était pas vérifié. Changement de sa logique générale.

📑 Changelog - MasterStretcher (Mise à jour du 25/01) - 3.1.8

📑 Changelog - MasterStretcher (Mise à jour du 15/02) - 3.2.0

Attention : changement du fichier config.lua nécessaire !

📑 Changelog - MasterStretcher (Mise à jour du 17/02) - 3.2.1

  • Ajout de la langue Espagnole.
  • Correction d'un bug où le son de roulement ne pouvait pas être désactivé.

📑 Changelog - MasterStretcher (Mise à jour du 18/03) - 3.2.2

📑 Changelog - MasterStretcher (Mise à jour du 01/04) - 3.2.3

Attention : changement du fichier config.lua nécessaire !

📑 Changelog - MasterStretcher (Mise à jour du 02/04) - 3.2.4

Attention : changement du fichier config.lua nécessaire !

📑 Changelog - MasterStretcher (Mise à jour du 03/04) - 3.2.5

📑 Changelog - MasterStretcher (Mise à jour du 13/05) - 3.2.6

📑 Changelog - MasterStretcher (Mise à jour du 31/08) - 3.3.4

Attention : changement du fichier config.lua nécessaire !

📑 Changelog - MasterStretcher (Mise à jour du 31/08) - 3.3.5 - 3.3.10

📋 Changelog - MasterStretcher (Mise à jour du 07/09) 3.3.12

📋 Changelog - MasterStretcher (Mise à jour du 11/09) 3.3.13 - 3.4.0

📑 Changelog - MasterStretcher (Mise à jour du 21/10) - 3.4.1

⚠️ Aucune modification de config obligatoire. Deux nouveaux réglages facultatifs dans config/config.lua (voir plus bas), et la clé peut passer dans server.cfg.

Nouveautés
Correctifs
Sécurité

📑 Changelog - MasterStretcher (Mise à jour du 22/10) - 3.4.2

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 22/10) - 3.4.3

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 24/10) - 3.5.0

⚠️ Aucune modification de config obligatoire. Nouvelle section facultative Config.NPC dans config/config.lua (zones hôpital à adapter à vos MLO).

Nouveautés
Correctifs

📑 Changelog - MasterStretcher (Mise à jour du 24/10) - 3.5.1

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 27/10) - 3.5.2

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 30/10) - 3.6.0

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 01/11) - 3.6.1

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 01/11) - 3.6.2

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 01/11) - 3.6.3

⚠️ Aucune modification de config nécessaire.

📑 Changelog - MasterStretcher (Mise à jour du 01/11) - 3.6.4

⚠️ Nouvelle option facultative : Config.RequireOnDuty (voir Configuration détaillée). Sans elle, rien ne change.

Exports et événements

Pour intégrer MasterStretcher à vos propres scripts (menu radial, script ambulance, etc.). Remplacez MasterStretcher par le nom du dossier de la ressource.

Exports client

Toutes les actions renvoient true en cas de succès, ou false, raison. Les mêmes contrôles qu'en jeu s'appliquent (licence, permission, distance), et le serveur revalide chaque action.

Export Paramètres Retour
IsPushingStretcher() — boolean : le joueur pousse un brancard
GetAttachedStretcher() — Entité du brancard poussé, ou nil
IsStretcherOccupied(entity?) brancard (défaut : le plus proche, 4 m) boolean
TogglePush(entity?) brancard (défaut : le plus proche) true, "pushed" / true, "dropped"
OpenMenu(entity?) brancard Ouvre le Menu Gestion
StowStretcher(ambulance?) ambulance (défaut : la plus proche, 5 m) Range le brancard poussé
UnstowStretcher(ambulance?) ambulance Sort le brancard rangé
OpenAmbulanceMenu(ambulance?) ambulance Ouvre le Menu Intérieur
ToggleBrakes(entity?) brancard couché Serre ou desserre les freins
GetStretcherPatient(entity) brancard { type = 'player', serverId }, { type = 'npc', ped, pedNetId, state, position } ou nil

Raisons possibles : not_authorized, no_permission, invalid_stretcher, holding_stretcher, no_stretcher_held, no_ambulance_found, doors_closed, no_stretcher_in_ambulance.

local ok, reason = exports.MasterStretcher:StowStretcher()
if not ok then print('Rangement impossible : ' .. reason) end

Événements client

Déclenchés localement (AddEventHandler), pour le joueur qui fait l'action :

Événement Arguments
stretchermod:onPushStart stretcher
stretchermod:onPushStop stretcher, position ('debout' ou 'couche')
stretchermod:onStretcherStowed vehicle, stretcher
stretchermod:onStretcherUnstowed vehicle, stretcher
AddEventHandler('stretchermod:onStretcherStowed', function(vehicle, stretcher)
    -- ex. : afficher le moniteur du véhicule
end)

PNJ : exports et événements serveur

Pour les serveurs qui génèrent leurs patients PNJ (scripts de missions, ERS, callouts). Tous les identifiants sont des netId. Ces exports ne vérifient ni permission ni distance : c'est votre script qui décide.

Export Paramètres Retour
PlaceNPCOnStretcher(pedNetId, stretcherNetId, position?, state?) position : index ou label ('anim_dead'…), défaut : première position autorisée. state : 'dead', 'injured' ou nil true ou false, raison
RemoveNPCFromStretcher(stretcherNetId, deletePed?) deletePed = true supprime le PNJ boolean
GetStretcherPatient(stretcherNetId) — { type = 'player', serverId }, { type = 'npc', pedNetId, state, position } ou nil
GetNPCStretcher(pedNetId) — netId du brancard, ou nil

Raisons possibles : disabled, invalid_stretcher, invalid_position, invalid_ped, is_player, occupied, ped_on_other_stretcher, down_not_allowed, position_not_allowed.

Événements serveur (AddEventHandler), avec une table data = { pedNetId, stretcherNetId, state, position, source, reason, zone } :

Événement Quand
masterstretcher:npcPlaced PNJ installé sur un brancard
masterstretcher:npcRemoved PNJ retiré. reason : 'removed', 'stretcher_deleted', 'despawned' ou 'api'
masterstretcher:npcDelivered PNJ confié à l'hôpital (zone = label de la zone) ; le PNJ est supprimé
-- Le patient de la mission est arrivé à l'hôpital
AddEventHandler('masterstretcher:npcDelivered', function(data)
    print(('PNJ %s confié à %s'):format(data.pedNetId, data.zone))
end)

State bags (lecture seule)

L'état est écrit uniquement par le serveur. Vous pouvez le lire :

Clé Sur Valeur
stretcherPos brancard 'haut', 'bas' ou 'basket'
stretcherBrakes brancard boolean
attachedPlayer brancard serverId du joueur allongé, ou nil
attachedPedNetId brancard netId du PNJ allongé, ou nil
attachedPedState brancard 'dead' (ramassé mort), 'injured' (blessé au sol) ou nil
attachedStretcher véhicule netId du brancard rangé, ou nil
isPushingStretcher joueur netId du brancard poussé, ou nil
local patient = Entity(stretcher).state.attachedPlayer

Les événements réseau internes (stretchermod:server:*, stretchermod:client:*) ne font pas partie de l'API : leurs paramètres peuvent changer d'une version à l'autre et le serveur refuse les appels qui ne viennent pas du script.