Offre Durée limitée : -10% sur tout le site* avec le code WELCOME10

Ajouter des peds personnalisés sur un serveur FiveM : modèles joueur et PNJ

Mis à jour le 5 novembre 2026 28 min de lecture 13 sections

Un uniforme de police qui n'est pas celui du jeu de base, un ped de pompier, de mécano ou de livreur avec le logo de l'entreprise RP, des PNJ d'ambiance qui ne ressemblent pas à ceux de tous les autres serveurs : les peds personnalisés sont, avec les véhicules addon et le mapping, ce qui différencie visuellement un serveur FiveM. Un ped (de pedestrian) est un modèle de personnage du moteur RAGE de GTA V : celui que porte un joueur comme celui d'un PNJ que le serveur fait apparaître. Ce guide s'adresse à la personne qui administre le serveur, depuis le panel d'un hébergeur ou en ligne de commande sur un VPS Linux (Ubuntu, Debian) ou Windows qu'elle gère elle-même. Il couvre la structure d'une ressource ped addon (fichiers .ydd, .ytd, .yft, .ymt et peds.meta), le streaming par fxmanifest.lua, le choix entre remplacer un ped existant et en ajouter un nouveau, le déploiement de la ressource sur le serveur (SFTP, répertoires, sauvegarde, renommage en lot), le test côté serveur avec un script minimal, puis l'attribution des modèles aux joueurs et aux PNJ. Il complète notre guide pour ajouter des véhicules addon sur un serveur FiveM, dont il reprend la logique de ressource et de streaming. Si votre serveur n'est pas encore en ligne, commencez par notre guide de mise en place d'un serveur FiveM.

Ce qu'est un ped et pourquoi les streamer depuis le serveur

Dans GTA V, chaque personnage est un modèle identifié par un nom et son hash : s_m_y_cop_01 pour un policier, a_f_y_hipster_01 pour une passante, mp_m_freemode_01 et mp_f_freemode_01 pour les deux personnages multijoueur entièrement habillables. Les préfixes suivent une convention : a_ pour les peds d'ambiance, s_ pour les métiers (service), g_ pour les gangs, ig_ pour les personnages nommés de l'histoire, u_ pour les uniques, mp_ pour le multijoueur ; la lettre suivante donne le sexe (m ou f) et la tranche d'âge (y, m, o). Un ped personnalisé, c'est soit un nouveau nom ajouté à cette liste (ped addon), soit un modèle de remplacement qui prend la place d'un ped existant sous son nom d'origine (ped replace).

Sur FiveM, ces modèles sont servis par le serveur : tout fichier déposé dans le dossier stream d'une ressource démarrée est envoyé aux clients qui se connectent, mis en cache sur leur disque et chargé par le moteur à la demande. Le code du serveur FXServer parcourt récursivement le répertoire stream de chaque ressource et enregistre chaque fichier trouvé, sans filtrer sur l'extension ; seuls les sous-dossiers dont le nom commence par un point et les fichiers .stream_raw sont ignorés. C'est la même mécanique que pour les véhicules addon et les MLO de mapping. Ce streaming côté serveur est devenu la seule voie possible pour les joueurs sur FiveM pour GTA V Enhanced : la documentation des commandes serveur précise que le mode « pur » (sv_pureLevel) y est toujours actif, donc les fichiers de jeu modifiés localement par un joueur sont bloqués. Un uniforme ou un ped personnalisé doit venir du serveur, pas d'un dossier mods sur le PC du joueur.

Structure d'une ressource ped addon : .ydd, .ytd, .yft, .ymt et peds.meta

Un ped se compose de quatre types de fichiers du moteur RAGE, tous placés dans stream, plus un fichier de métadonnées XML, peds.meta, déclaré dans le manifeste. Le tutoriel de référence du forum Cfx.re sur le streaming de peds addon, publié en 2017 et toujours cité, décrit cette structure : les fichiers .ydd, .yft, .ymt et .ytd dans un dossier d'assets, un peds.meta dont chaque entrée reprend le nom du fichier sans extension, et deux lignes de manifeste.

FichierRôleÀ vérifier
monped.yddDictionnaire de drawables : la géométrie du personnage (tête, torse, jambes, chaussures, accessoires) et ses variantesMême nom que le modèle dans peds.meta, en minuscules
monped.ytdDictionnaire de textures : les images appliquées sur la géométrie, avec leurs variantes de couleurPoids après chargement sous 16 Mio pour éviter l'avertissement du serveur (voir plus bas)
monped.yftFragment : le squelette et les données physiques du ped, nécessaires aux animations et au ragdollPrésent, sinon le ped reste figé ou invisible
monped.ymtMétadonnées de variation : combien de composants, de drawables et de textures le jeu peut combiner pour ce pedExporté en XML pour être lu ou modifié (outils CodeWalker ou Meta Toolkit)
peds.metaFiche d'identité du modèle pour le moteur : nom, type de ped, jeux d'animations, capsule de collision, personnalité, voixDéclaré par files et data_file 'PED_METADATA_FILE' dans le manifeste

Il existe deux familles de peds, et le drapeau IsStreamedGfx de peds.meta les distingue. Un ped à composants « non streamés » tient dans un seul .ydd et un seul .ytd qui contiennent toutes ses variantes, avec IsStreamedGfx à false : c'est le cas de la plupart des peds d'ambiance et de métier du jeu. Un ped « streamé », comme les personnages de l'histoire en ig_ et les deux freemode, se présente sous la forme d'un dossier contenant un fichier .ydd et un .ytd par composant et par variante, avec IsStreamedGfx à true. Pour streamer cette seconde famille sur FiveM, le tutoriel de 2022 du même forum demande de préfixer chaque fichier du dossier par le nom du ped suivi d'un accent circonflexe (ig_brucie^head_000_r.ydd, par exemple, renommage fait en lot avec un outil comme Advanced Renamer), de placer le tout à plat dans stream avec le .yft et le .ymt, et de laisser IsStreamedGfx à true. Une archive téléchargée bien préparée arrive déjà sous cette forme ; si elle contient un sous-dossier au nom du ped avec des fichiers non préfixés, c'est ce renommage qu'il vous reste à faire.

resources/
└── [peds]/
    └── police_fr/
        ├── fxmanifest.lua
        ├── peds.meta
        └── stream/
            ├── police_fr.ydd        (ped à composants : un seul .ydd)
            ├── police_fr.ytd
            ├── police_fr.yft
            └── police_fr.ymt

Le fichier peds.meta est un document XML dont la racine est CPedModelInfo__InitDataList et dont la liste InitDatas contient un Item par modèle. L'exemple lié par le tutoriel de 2017 donne deux entrées complètes, une masculine et une féminine, qu'il suffit d'adapter : Name prend le nom du modèle, les autres champs renvoient vers des jeux d'animations et de comportements existants du jeu. L'extrait ci-dessous reprend les champs qui comptent pour un ped de métier masculin ; les champs omis gardent les valeurs de l'exemple.

<?xml version="1.0" encoding="UTF-8"?>
<CPedModelInfo__InitDataList>
  <InitDatas>
    <Item>
      <Name>police_fr</Name>
      <PropsName>null</PropsName>            <!-- ou police_fr_p si un .ydd de props (casquette, lunettes) accompagne le ped -->
      <ClipDictionaryName>move_m@generic</ClipDictionaryName>
      <ExpressionSetName>expr_set_ambient_male</ExpressionSetName>
      <Pedtype>CIVMALE</Pedtype>
      <MovementClipSet>move_m@business@c</MovementClipSet>
      <StrafeClipSet>move_ped_strafing</StrafeClipSet>
      <MovementToStrafeClipSet>move_ped_to_strafe</MovementToStrafeClipSet>
      <InjuredStrafeClipSet>move_strafe_injured</InjuredStrafeClipSet>
      <FullBodyDamageClipSet>dam_ko</FullBodyDamageClipSet>
      <AdditiveDamageClipSet>dam_ad</AdditiveDamageClipSet>
      <DefaultGestureClipSet>ANIM_GROUP_GESTURE_M_GENERIC</DefaultGestureClipSet>
      <FacialClipsetGroupName>facial_clipset_group_gen_male</FacialClipsetGroupName>
      <DefaultVisemeClipSet>ANIM_GROUP_VISEMES_M_LO</DefaultVisemeClipSet>
      <PoseMatcherName>Male</PoseMatcherName>
      <PoseMatcherProneName>Male_prone</PoseMatcherProneName>
      <GetupSetHash>NMBS_SLOW_GETUPS</GetupSetHash>
      <DecisionMakerName>DEFAULT</DecisionMakerName>
      <MotionTaskDataSetName>STANDARD_PED</MotionTaskDataSetName>
      <DefaultTaskDataSetName>STANDARD_PED</DefaultTaskDataSetName>
      <PedCapsuleName>STANDARD_MALE</PedCapsuleName>
      <RelationshipGroup>CIVMALE</RelationshipGroup>
      <NavCapabilitiesName>STANDARD_PED</NavCapabilitiesName>
      <PerceptionInfo>DEFAULT_PERCEPTION</PerceptionInfo>
      <DefaultBrawlingStyle>BS_AI</DefaultBrawlingStyle>
      <DefaultUnarmedWeapon>WEAPON_UNARMED</DefaultUnarmedWeapon>
      <Personality>SERVICEMALES</Personality>
      <CombatInfo>DEFAULT</CombatInfo>
      <VfxInfoName>VFXPEDINFO_HUMAN_GENERIC</VfxInfoName>
      <AmbientClipsForFlee>FLEE</AmbientClipsForFlee>
      <AbilityType>SAT_NONE</AbilityType>
      <ThermalBehaviour>TB_WARM</ThermalBehaviour>
      <SuperlodType>SLOD_HUMAN</SuperlodType>
      <ScenarioPopStreamingSlot>SCENARIO_POP_STREAMING_NORMAL</ScenarioPopStreamingSlot>
      <DefaultSpawningPreference>DSP_NORMAL</DefaultSpawningPreference>
      <IsStreamedGfx value="false" />
    </Item>
  </InitDatas>
</CPedModelInfo__InitDataList>

Pour un ped féminin, les valeurs changent de jeu d'animations : move_f@generic, expr_set_ambient_female, CIVFEMALE, ANIM_GROUP_GESTURE_F_GENERIC, facial_clipset_group_gen_female, ANIM_GROUP_VISEMES_F_LO, STANDARD_FEMALE. Un seul peds.meta peut déclarer plusieurs modèles, un Item par ped : c'est la façon la plus simple de regrouper tous les uniformes d'un métier dans une ressource.

Le fxmanifest.lua : files, data_file et streaming

Le manifeste d'une ressource ped tient en quelques lignes. fx_version 'cerulean' est la version courante du manifeste FXv2, game 'gta5' cible FiveM. La directive files ajoute peds.meta au paquet téléchargé par les clients, et data_file, que la documentation décrit comme l'ajout d'un fichier de données au système de contenu additionnel du jeu, indique au moteur de le lire avec le type PED_METADATA_FILE. La table officielle des types de fichiers de données associe ce type au monteur CPedModelMetaDataFileMounter, le même que celui des DLC Rockstar. Rien à déclarer pour le contenu de stream : le serveur le trouve seul.

-- resources/[peds]/police_fr/fxmanifest.lua
fx_version 'cerulean'
game 'gta5'

files {
    'peds.meta'
}

data_file 'PED_METADATA_FILE' 'peds.meta'

Deux variantes utiles. La documentation indique que data_file accepte les motifs de fichiers (globbing) : une ressource qui range un peds.meta par métier dans des sous-dossiers peut les déclarer en une ligne avec data_file 'PED_METADATA_FILE' 'data/**/peds.meta', à condition de lister les mêmes chemins dans files. Et si vos peds viennent avec un fichier pedpersonality.meta, qui définit les profils référencés par le champ Personality de peds.meta, le type correspondant est PED_PERSONALITY_FILE, listé dans la même table avec le même monteur. La ressource se démarre ensuite comme n'importe quelle autre, par une ligne dans server.cfg :

# server.cfg
ensure police_fr

L'ordre des lignes ensure n'a pas d'importance pour une ressource de streaming pur, qui ne dépend d'aucun script. Sans redémarrer le serveur, la console txAdmin suffit à charger une ressource fraîchement déposée : refresh rescanne le dossier resources et lit les manifestes, puis ensure police_fr la démarre, ou la redémarre si elle tournait déjà. Pour être certain que chaque joueur dispose des nouveaux fichiers, annoncez une reconnexion ou groupez l'ajout avec un redémarrage planifié. Pour la prise en main de la console, voyez notre guide configurer txAdmin.

Remplacer un ped existant ou ajouter un nouveau modèle

Le remplacement est la méthode historique, celle du premier tutoriel de streaming du forum Cfx.re, publié en 2016 à une époque où son auteur précisait que seul le remplacement de modèles existants fonctionnait : une ressource dont le manifeste est vide, un dossier stream, et dedans des fichiers portant exactement le nom d'un asset du jeu. Le moteur charge alors le fichier streamé à la place de l'original. Pour un ped, cela revient à déposer s_m_y_cop_01.ydd, s_m_y_cop_01.ytd et s_m_y_cop_01.yft modifiés, sans peds.meta : le jeu connaît déjà s_m_y_cop_01, son peds.meta interne, ses animations et sa voix. Tous les scripts qui font apparaître des policiers, et tous les PNJ d'ambiance en uniforme, utilisent aussitôt la nouvelle tenue. Le prix à payer : le ped d'origine disparaît, et deux ressources qui remplacent le même modèle entrent en conflit, la dernière chargée l'emportant sans message d'erreur.

CritèrePed replace (remplacement)Ped addon (nouveau modèle)
Fichiers.ydd, .ytd, .yft (et .ymt si les variantes changent) au nom du ped d'origineMêmes fichiers sous un nom nouveau, plus un peds.meta
ManifestePeut rester vide, hors fx_version et gamefiles et data_file 'PED_METADATA_FILE' obligatoires
Modèle d'origineDisparaît du serveurConservé, le nouveau s'ajoute à la liste
PNJ d'ambiance et scripts existantsAdoptent la nouvelle tenue sans rien changerIgnorent le nouveau ped tant qu'un script ne l'appelle pas par son nom
Volume de streamingStable : un fichier pour unAugmente à chaque ped ajouté
Risque de conflitDeux ressources qui remplacent le même ped : la dernière démarrée gagneDeux peds.meta qui déclarent le même Name
Usage typeUniformes de police, pompiers, ambulanciers sur les PNJ et les métiers du jeuTenues de métiers RP, personnages uniques, PNJ de scénario

Les deux approches se combinent sans problème dans une même ressource ou dans deux ressources voisines. La règle pratique : replace pour habiller les services d'urgence que le jeu fait déjà apparaître, addon pour tout ce qui n'existe pas dans GTA V. Dans tous les cas, gardez les noms de fichiers en minuscules, une recommandation qui revient dans chaque fil du forum et qui évite les surprises sur un VPS Linux, dont le système de fichiers distingue Police_FR.ydd de police_fr.ydd alors que Windows les confond. Un serveur migré d'un PC Windows vers un hébergement Linux perd parfois ses peds pour cette seule raison.

Déployer la ressource sur le serveur : SFTP, répertoires, sauvegarde et pare-feu

Une fois la ressource assemblée sur votre PC, il reste à la déposer dans le répertoire resources du serveur, et le chemin dépend de l'hébergement. Sur un serveur de jeu managé, le gestionnaire de fichiers du panel et un accès SFTP donnent directement sur ce répertoire. Sur un VPS Linux ou un serveur dédié que vous administrez vous-même, la procédure d'installation officielle place les artefacts FXServer dans ~/FXServer/server et les données du serveur, dont server.cfg et resources, dans ~/FXServer/server-data ; sous Windows Server, l'équivalent est C:\FXServer\server-data. Pour le transfert, préférez SFTP (FileZilla, WinSCP ou scp) au FTP classique : le SFTP passe par SSH et chiffre identifiants et fichiers, alors que le FTP les envoie en clair. Il vous faut l'adresse IP du serveur, un compte (celui du panel, ou un utilisateur SSH sur le VPS) et, pour un VPS, une clé SSH plutôt qu'un mot de passe.

EnvironnementOù déposer la ressourceComment la charger
Panel Pterodactyl (hébergement managé)resources/[peds]/ depuis le gestionnaire de fichiers ou en SFTP avec les identifiants du panelLigne ensure dans server.cfg, puis refresh et ensure dans la console txAdmin
VPS Linux ou serveur dédié (FXServer géré par vous)~/FXServer/server-data/resources/[peds]/, transfert par SFTP, scp ou unzip en SSHbash ~/FXServer/server/run.sh +exec server.cfg depuis server-data, ou txAdmin
Windows (FXServer.exe)C:\FXServer\server-data\resources\[peds]\C:\FXServer\server\FXServer.exe +exec server.cfg depuis server-data

Trois précautions avant de copier. Sauvegardez d'abord : une archive du répertoire resources, et un export de la base de données MySQL si votre script d'apparence y enregistre les tenues des joueurs, ce que fait par exemple illenium-appearance (voir plus bas) ; notre guide sur les sauvegardes d'un serveur FiveM décrit la routine. Vérifiez ensuite l'espace disque : des dizaines de peds et de véhicules streamés finissent par peser plusieurs gigaoctets, et un disque plein au moment du transfert laisse des ressources à moitié copiées ; sous Linux, df -h suffit à le voir. Enfin, le pare-feu n'a rien de particulier à ouvrir pour les peds : les fichiers de stream sont servis par FXServer lui-même sur le port TCP déclaré par endpoint_add_tcp dans server.cfg, 30120 dans l'exemple officiel, le même que celui des connexions de jeu, qui a son pendant UDP avec endpoint_add_udp. Si vous administrez un VPS Linux avec UFW, notre guide pour ouvrir les ports d'un serveur de jeu sous Linux détaille les règles.

Dernier point, le renommage en lot. Deux opérations reviennent sans cesse : passer les fichiers en minuscules avant un transfert vers Linux, et préfixer les composants d'un ped streamé par nom^. Les deux tiennent en une ligne de commande, en PowerShell sous Windows ou en shell sous Linux, sans installer d'outil. Lancez-les une seule fois, dans le bon dossier, après la sauvegarde ; sous PowerShell, -WhatIf ajouté à Rename-Item affiche le résultat sans rien renommer.

# PowerShell (Windows), dans le dossier des composants du ped : préfixe monped^
Get-ChildItem -File | Rename-Item -NewName { 'monped^' + $_.Name }

# Shell (VPS Linux, Ubuntu ou Debian) : même préfixe, puis passage en minuscules
cd ~/FXServer/server-data/resources/[peds]/monped/stream
for f in *; do mv -- "$f" "monped^$f"; done
for f in *; do l=$(printf '%s' "$f" | tr '[:upper:]' '[:lower:]'); [ "$f" != "$l" ] && mv -- "$f" "$l"; done

Tester côté serveur : script de test et commande /ped

Avant de brancher un ped sur le framework, vérifiez qu'il se charge. Le plus court est une petite ressource de test avec une commande client. La séquence est toujours la même et vient directement de la référence des natives : IsModelInCdimage vérifie que le modèle existe dans les images du jeu (fichiers rpf), IsModelValid qu'il est connu du moteur, RequestModel demande son chargement, HasModelLoaded attend qu'il soit en mémoire, SetPlayerModel l'applique au joueur, puis SetModelAsNoLongerNeeded rend la main au moteur. La documentation de SetPlayerModel prévient que le ped courant du joueur est détruit et recréé, donc toute référence conservée à l'ancien ped devient invalide, et rappelle de demander le modèle et d'attendre son chargement avant l'appel. SetPedDefaultComponentVariation applique ensuite la tenue par défaut, faute de quoi certains peds, les freemode en tête, peuvent apparaître sans vêtements ou invisibles. Si vous débutez en Lua sur FiveM, notre tutoriel pour créer son premier script FiveM pose les bases du manifeste et des commandes.

-- resources/[local]/ped_test/fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
-- resources/[local]/ped_test/client.lua
RegisterCommand('ped', function(_, args)
    local name = args[1]
    if not name then return end
    local model = GetHashKey(name)

    if not IsModelInCdimage(model) or not IsModelValid(model) then
        print(('Modèle inconnu : %s (ressource non démarrée, nom ou peds.meta incorrect)'):format(name))
        return
    end

    RequestModel(model)
    local tries = 0
    while not HasModelLoaded(model) and tries < 500 do
        Wait(10)
        tries = tries + 1
    end
    if not HasModelLoaded(model) then
        print(('Chargement impossible : %s (fichiers .ydd/.yft/.ytd absents ou corrompus)'):format(name))
        return
    end

    SetPlayerModel(PlayerId(), model)
    SetPedDefaultComponentVariation(PlayerPedId())
    SetModelAsNoLongerNeeded(model)
end, false)

En jeu, /ped police_fr doit vous transformer sur-le-champ. Les trois sorties possibles disent chacune où chercher. « Modèle inconnu » : la ressource n'est pas démarrée, le Name de peds.meta ne correspond pas au nom tapé, ou le data_file manque dans le manifeste. « Chargement impossible » : le moteur connaît le modèle mais ne trouve pas ses fichiers, donc un .ydd, .ytd ou .yft est absent, mal nommé ou corrompu. Un ped qui apparaît mais reste figé, les bras en croix, ou invisible : .yft manquant, IsStreamedGfx à la mauvaise valeur, ou fichiers non préfixés pour un ped streamé. Pour les mêmes tests sans écrire de script, le menu « Player Appearance » de vMenu change le modèle du joueur, et sa liste de peds addon se renseigne dans le fichier addons.json de sa configuration, sous la clé peds, avec la permission vMenu.PlayerAppearance.SpawnNew pour les joueurs autorisés.

Les avertissements de taille s'affichent dans la console serveur au démarrage de la ressource, sous la forme « Asset police_fr/police_fr.ytd uses 24.3 MiB of physical memory ». Le code du serveur les émet quand la mémoire physique ou virtuelle d'un asset dépasse 16 Mio, en bleu, puis 32 Mio en jaune, puis 64 Mio en rouge, et ajoute au-delà de 48 Mio la mention que les assets surdimensionnés provoquent des problèmes de streaming, modèles qui ne se chargent pas ou ne s'affichent pas. Un uniforme en textures 4096 px dépasse facilement ce seuil : réduisez les textures du .ytd à 2048 px, voire 1024 px pour les détails, et compressez-les en DXT. Nos conseils sur les textures des véhicules addon s'appliquent à l'identique aux peds.

Attribuer les peds aux joueurs : métiers, ESX, QBCore et vMenu

Un ped addon chargé n'est encore visible de personne. Trois mécanismes l'exposent aux joueurs, selon l'organisation du serveur. Sur un serveur freeroam, vMenu suffit : la liste peds de son addons.json rend le modèle sélectionnable dans le menu d'apparence. Sur un serveur RP avec ESX Legacy ou QBCore, c'est la ressource d'apparence qui gère les tenues et les modèles : illenium-appearance, par exemple, annonce dans son README la prise en charge de qb-core, d'ESX et d'ox_core, dépend d'ox_lib, fournit une commande /pedmenu et permet de limiter des peds à certains métiers, gangs, identifiants de personnage ou permissions ACE. Un uniforme de police addon se réserve donc au métier police sans écrire de code. Son README précise de n'installer que la dernière release, jamais la branche main. Son manifeste charge @oxmysql/lib/MySQL.lua à côté d'ox_lib : les skins et les tenues des joueurs sont enregistrés dans la base de données MySQL du serveur, celle que décrit notre guide pour lier une base MySQL à un serveur FiveM, d'où l'intérêt de l'inclure dans les sauvegardes avant de retirer ou de renommer un ped.

Troisième voie, pour un vestiaire de métier maison ou un script qui habille un PNJ : le même code que la commande de test, appelé depuis un événement du framework. Côté serveur, le script vérifie le métier du joueur avant d'autoriser le changement ; côté client, il exécute la séquence de chargement. Les peds de métier conservent les mêmes limites que dans le jeu de base : un modèle de type s_, a_ ou g_ n'offre que les variantes prévues par son .ymt, et seuls mp_m_freemode_01 et mp_f_freemode_01 acceptent l'habillage pièce par pièce. Les tenues additionnelles pour ces deux freemode, souvent regroupées sous le nom d'EUP pour les uniformes, suivent un autre circuit : des composants streamés nommés d'après le freemode et des fichiers de boutique déclarés avec le type SHOP_PED_APPAREL_META_FILE, que la table des fichiers de données associe au monteur CExtraMetaDataFileMounter. C'est un sujet à part entière, que ce guide ne couvre pas.

-- server.lua : le serveur décide qui a droit à la tenue (exemple ESX Legacy)
local ESX = exports['es_extended']:getSharedObject()

RegisterNetEvent('vestiaire:demander', function(modelName)
    local src = source
    local xPlayer = ESX.GetPlayerFromId(src)
    if not xPlayer or xPlayer.job.name ~= 'police' then
        return
    end
    TriggerClientEvent('vestiaire:appliquer', src, modelName)
end)

-- client.lua : le client applique le modèle avec la séquence de chargement du script de test
RegisterNetEvent('vestiaire:appliquer', function(modelName)
    local model = GetHashKey(modelName)
    if not IsModelInCdimage(model) then return end
    RequestModel(model)
    while not HasModelLoaded(model) do Wait(10) end
    SetPlayerModel(PlayerId(), model)
    SetPedDefaultComponentVariation(PlayerPedId())
    SetModelAsNoLongerNeeded(model)
end)

Faire apparaître des PNJ avec un ped personnalisé

Pour un PNJ de scénario (réceptionniste du commissariat, vendeur, garde), le script fait apparaître le ped avec CreatePed. La référence des natives précise que le modèle doit déjà être chargé, par exemple avec RequestModel, que le premier paramètre de type est ignoré (le jeu attribue lui-même CIVMALE, CIVFEMALE ou un autre type d'après peds.meta), que isNetwork à false crée une entité purement locale, et que la fonction renvoie un identifiant de script ou 0 en cas d'échec. Un PNJ local, créé par chaque client à l'entrée d'une zone, est le bon choix pour un décor : aucune synchronisation réseau, aucun coût côté serveur. Un PNJ réseau (isNetwork à true) ne se justifie que s'il doit se déplacer de façon cohérente pour tous les joueurs. Les natives FreezeEntityPosition, SetEntityInvincible et SetBlockingOfNonTemporaryEvents immobilisent le PNJ et l'empêchent de réagir aux coups de feu ou de fuir.

-- client.lua : un réceptionniste dans le hall du commissariat
CreateThread(function()
    local model = GetHashKey('reception_fr')
    RequestModel(model)
    while not HasModelLoaded(model) do Wait(10) end

    local ped = CreatePed(0, model, 441.0, -981.0, 30.69, 180.0, false, false)
    SetModelAsNoLongerNeeded(model)
    if ped == 0 then
        print('Échec de création du PNJ reception_fr')
        return
    end
    SetPedDefaultComponentVariation(ped)
    FreezeEntityPosition(ped, true)
    SetEntityInvincible(ped, true)
    SetBlockingOfNonTemporaryEvents(ped, true)
end)

Pour remplacer les PNJ d'ambiance du jeu par vos modèles sans script, la méthode replace de la section précédente reste la plus simple : un ped qui porte le nom d'un ped d'ambiance apparaît partout où le jeu l'aurait fait apparaître. Les PNJ pilotés par une IA conversationnelle, comme ceux que nous décrivions dans notre actualité sur les PNJ IA sur FiveM, s'appuient sur la même création d'entité : le modèle streamé fournit l'apparence, le script fournit le comportement.

Game build, FiveM Enhanced et peds des DLC

Beaucoup d'uniformes et de peds personnalisés réutilisent des composants, des animations ou des accessoires issus des DLC de GTA Online. Ils ne se chargent que si le serveur impose un game build qui contient ce DLC. La convar sv_enforceGameBuild, décrite dans la documentation des commandes serveur, sélectionne le build que les clients doivent utiliser ; elle ne se fixe qu'au démarrage et ne change pas à chaud. Chaque build inclut le contenu des précédents. La liste publiée va de 1604 (Arena War) à 3889 (The Kortz Center Heist), en passant par 2060 (Los Santos Summer Special), 2189 (Cayo Perico), 2372 (Los Santos Tuners), 2545 (The Contract), 2699 (The Criminal Enterprises), 2802 (Los Santos Drug Wars), 2944 (San Andreas Mercenaries), 3095 (The Chop Shop), 3258 (Bottom Dollar Bounties), 3407 (Agents of Sabotage), 3570 (Money Fronts) et 3751 (A Safehouse in the Hills) ; la valeur 1 charge le jeu de base sans DLC. Notre guide pour configurer la version des artefacts et le game build détaille le réglage.

La même page précise que FiveM pour GTA V Enhanced ne prend en charge que le dernier build, chargé par défaut, les autres valeurs ne s'appliquant qu'à FiveM Legacy. Pour l'administration des peds, cela a deux conséquences. Un serveur qui accueille les deux clients doit donc proposer des peds compatibles avec le dernier build, et un modèle converti depuis un vieux DLC peut se charger sur Legacy et non sur Enhanced. Et puisque le mode pur est permanent sur Enhanced, le streaming serveur est le seul vecteur de personnalisation. Notre comparatif FiveM Legacy ou Enhanced fait le point sur ce que chaque client change pour un serveur.

Dépannage : ped invisible, figé, sans texture ou introuvable

SymptômeCause probableCorrectif
« Modèle inconnu » dans le script de test, ou vMenu ne liste pas le pedRessource non démarrée, Name de peds.meta différent du nom tapé, ou data_file 'PED_METADATA_FILE' absent du manifesteensure dans server.cfg, puis comparez le Name, le nom des fichiers et le nom tapé, en minuscules
Le ped se charge mais reste invisibleFichiers .ydd ou .ytd absents ou mal nommés, IsStreamedGfx incohérent avec la structure des fichiers, ou conflit avec un script d'apparence qui réapplique une tenueVérifiez les quatre fichiers dans stream, corrigez IsStreamedGfx, testez la ressource seule sur un serveur de test
Le ped apparaît bras en croix, sans animation.yft manquant, ou jeux d'animations de peds.meta inexistants (faute de frappe dans MovementClipSet ou ClipDictionaryName)Ajoutez le .yft, repartez des valeurs de l'exemple pour les clip sets
Ped sans texture, gris ou noir.ytd absent, nom différent du .ydd, ou asset surdimensionnéAlignez les noms, réduisez les textures sous 16 Mio de mémoire physique
Avertissement « Asset ... uses ... MiB of physical memory » au démarrageTextures trop lourdes dans le .ytdPassez les textures en 2048 px maximum, compressées en DXT
Le ped replace n'a aucun effetNom de fichier différent de l'asset d'origine (majuscule, suffixe), ou une autre ressource remplace le même ped après celle-ciNom exact en minuscules, une seule ressource par ped remplacé
Le ped marche sur Legacy, pas sur EnhancedModèle dépendant d'un ancien build, ou fichier incompatible avec le dernier buildDemandez au créateur une version compatible avec le build courant, testez avec le client Enhanced
Le ped marche sur votre PC, pas sur le VPS LinuxCasse des noms de fichiersRenommez tout en minuscules avant le transfert SFTP
Erreur de manifeste au refreshSyntaxe Lua dans fxmanifest.lua, chemin de peds.meta différent entre files et data_fileComparez les deux chemins, vérifiez les guillemets et les virgules

Deux réflexes d'administration évitent la plupart des tickets. Testez chaque ped isolément sur un serveur de test avant de l'ajouter en production, et sauvegardez le serveur avant de toucher au dossier resources. Pour tout ce qui concerne le démarrage du serveur lui-même, notre page solutions aux erreurs courantes sur FiveM complète ce tableau. Sur le choix des peds à installer, les mêmes précautions que pour les scripts s'appliquent : archives complètes, créateur identifié, licence claire ; notre guide scripts FiveM, où les trouver et lesquels éviter liste les signaux à vérifier.

Performances, streaming et hébergement

Un ped pèse en général moins qu'un véhicule, mais un serveur RP en accumule vite des dizaines : uniformes par grade, tenues par métier, PNJ de scénario. Le coût se paie à trois endroits. À la connexion, chaque joueur télécharge depuis le serveur tous les fichiers de stream des ressources démarrées, puis les garde en cache ; c'est de la bande passante serveur et du temps de chargement. En jeu, chaque ped visible occupe de la mémoire vidéo chez le joueur, d'où l'importance des textures en 2048 px. Côté serveur, FXServer n'affiche rien et n'a pas à charger les modèles, mais il sert les fichiers et tient le registre de streaming : un disque SSD ou NVMe et un réseau rapide comptent plus que le processeur. Quand le serveur affiche aussi beaucoup de PNJ réseau, c'est l'optimisation du serveur FiveM dans son ensemble qui entre en jeu, OneSync en tête.

Sur nos offres serveur FiveM, de 4 à 64 Go de RAM DDR4, txAdmin et la protection anti-DDoS sont inclus, le réseau est à 10 Gbit/s et les serveurs sont hébergés en France : le dossier resources est accessible depuis le panel et en SFTP, sans compte root à gérer. Pour un FXServer que vous administrez vous-même, un VPS Linux KVM, serveur virtuel sous Ubuntu ou Debian avec accès SSH, convient à un serveur de taille moyenne, et notre guide FiveM sous Docker sur un VPS Linux couvre l'installation complète.

Lexique : ped, drawable, dictionnaire, streaming, game build

TermeCe que ça désigne sur un serveur FiveM
PedUn modèle de personnage du moteur RAGE, joueur ou PNJ, identifié par un nom (s_m_y_cop_01) et son hash. SetPlayerModel l'attribue à un joueur, CreatePed en fait apparaître un comme PNJ.
Ped addon et ped replaceUn addon est un nouveau nom déclaré dans un peds.meta ; un replace est un fichier qui porte le nom d'un asset existant et prend sa place.
Drawable et dictionnaire (.ydd, .ytd)Un drawable est une géométrie affichable ; un dictionnaire de drawables (.ydd) en regroupe plusieurs, un dictionnaire de textures (.ytd) regroupe les images qui les habillent.
Fragment (.yft)Le squelette et les données physiques d'un modèle animé ou cassable. Les véhicules et les peds en ont un.
Métadonnées de variation (.ymt)Le fichier binaire qui décrit les composants d'un ped et leurs combinaisons de drawables et de textures ; il s'édite après export en XML.
peds.meta et data_fileLe fichier XML qui enregistre un modèle auprès du moteur, et la directive de manifeste qui le confie au monteur de contenu additionnel du jeu, ici PED_METADATA_FILE.
StreamingLe mécanisme par lequel le serveur envoie aux clients le contenu des dossiers stream, que le moteur charge ensuite à la demande. Les avertissements de taille (16, 32, 48, 64 Mio) viennent du serveur au démarrage de la ressource.
Game buildLa version du contenu GTA V imposée aux clients par sv_enforceGameBuild. Un ped qui réutilise des éléments d'un DLC exige un build qui le contient.
Freemodemp_m_freemode_01 et mp_f_freemode_01, les seuls peds habillables composant par composant ; les tenues additionnelles pour eux (EUP) relèvent d'un autre type de fichiers de données que les peds addon.
SFTPTransfert de fichiers chiffré par SSH, utilisé pour déposer une ressource dans le répertoire resources d'un serveur managé ou d'un VPS ; à préférer au FTP, qui envoie identifiants et fichiers en clair.
Cache clientCopie locale, sur le disque du joueur, des fichiers streamés reçus du serveur, pour ne pas tout retélécharger à chaque connexion. C'est pour cela que le premier chargement après l'ajout de peds est plus long que les suivants.

Conclusion

Ajouter un ped personnalisé sur un serveur FiveM suit la même recette qu'un véhicule addon : une ressource, un dossier stream avec les fichiers .ydd, .ytd, .yft et .ymt, un peds.meta déclaré par files et data_file 'PED_METADATA_FILE', une ligne ensure dans server.cfg. Le remplacement d'un ped existant se passe même de peds.meta et habille d'un coup tous les PNJ du jeu qui portent ce modèle, au prix de la disparition de l'original. Le dépôt sur le serveur passe par le panel ou par SFTP, après une sauvegarde du répertoire resources et de la base MySQL, avec des noms de fichiers en minuscules si la cible est un VPS Linux. Une commande de test de quelques lignes, bâtie sur RequestModel et SetPlayerModel, dit en une seconde si le modèle est connu, chargé et complet, et la console serveur signale les textures trop lourdes avant que les joueurs ne voient des personnages gris. Le reste est affaire d'attribution : vMenu pour un serveur freeroam, illenium-appearance ou un vestiaire maison pour réserver un uniforme à un métier, CreatePed pour les PNJ de scénario. Pour que la connexion reste rapide avec des dizaines de peds et de véhicules streamés, le serveur doit suivre : nos offres serveur FiveM et nos serveurs dédiés sont dimensionnés pour cela.

FAQ

Qu'est-ce qu'un ped sur FiveM et quelle différence avec un skin ?

Un ped (de pedestrian) est un modèle de personnage du moteur RAGE de GTA V, identifié par un nom comme s_m_y_cop_01 ou mp_m_freemode_01 et par son hash. C'est le même objet pour un joueur et pour un PNJ : SetPlayerModel l'attribue à un joueur, CreatePed en fait apparaître un comme PNJ. Ce que les joueurs appellent « skin » désigne en général soit le choix d'un ped, soit une tenue appliquée aux deux peds freemode par un script d'apparence. Un ped personnalisé est un modèle streamé par le serveur, soit sous un nouveau nom (addon), soit à la place d'un ped existant (replace).

Quels fichiers composent un ped addon FiveM ?

Quatre fichiers du moteur dans le dossier stream de la ressource et un fichier XML déclaré dans le manifeste. Le .ydd est le dictionnaire de drawables (la géométrie et ses variantes), le .ytd le dictionnaire de textures, le .yft le fragment qui porte le squelette et la physique, le .ymt les métadonnées de variation qui décrivent les composants et leurs combinaisons. Le fichier peds.meta, à la racine de la ressource, enregistre le modèle auprès du moteur avec son nom, son type (CIVMALE, CIVFEMALE), ses jeux d'animations, sa capsule de collision et sa personnalité. Tous les noms de fichiers doivent reprendre le nom du modèle, en minuscules.

Que mettre dans le fxmanifest.lua d'une ressource ped ?

Quatre directives suffisent : fx_version 'cerulean', game 'gta5', un bloc files { 'peds.meta' } qui ajoute le fichier au paquet téléchargé par les clients, et data_file 'PED_METADATA_FILE' 'peds.meta' qui le confie au monteur de contenu additionnel du jeu (CPedModelMetaDataFileMounter dans la table officielle des types de fichiers de données). Les fichiers du dossier stream n'ont pas à être déclarés : le serveur FXServer parcourt ce dossier récursivement et enregistre chaque fichier trouvé. La ressource se démarre ensuite par une ligne ensure dans server.cfg, ou à chaud avec refresh puis ensure dans la console txAdmin.

Ped addon ou ped replace : lequel choisir ?

Le replace dépose dans stream des fichiers qui portent exactement le nom d'un ped du jeu (s_m_y_cop_01.ydd, .ytd, .yft) : le moteur les charge à la place des originaux, tous les PNJ et scripts qui utilisent ce modèle adoptent la nouvelle tenue, et aucun peds.meta n'est nécessaire. En contrepartie, le ped d'origine disparaît et deux ressources qui remplacent le même ped entrent en conflit. L'addon déclare un nouveau nom dans un peds.meta et conserve tout le jeu de base, mais reste invisible tant qu'un script, vMenu ou une ressource d'apparence ne l'appelle pas. Règle pratique : replace pour les services d'urgence que GTA V fait déjà apparaître, addon pour tout ce qui n'existe pas dans le jeu.

Comment tester qu'un ped personnalisé se charge bien côté serveur ?

Avec une ressource de test de quelques lignes et une commande client : IsModelInCdimage et IsModelValid vérifient que le modèle est connu, RequestModel demande son chargement, une boucle sur HasModelLoaded attend qu'il soit en mémoire, SetPlayerModel l'applique au joueur, SetPedDefaultComponentVariation pose la tenue par défaut et SetModelAsNoLongerNeeded rend la main au moteur. La documentation de SetPlayerModel rappelle que le ped courant est détruit et recréé, et qu'il faut demander le modèle et attendre son chargement avant l'appel. Si le modèle est inconnu, c'est la ressource ou le peds.meta ; s'il ne se charge pas, ce sont les fichiers .ydd, .ytd ou .yft ; s'il est figé ou invisible, c'est le .yft ou le drapeau IsStreamedGfx.

Pourquoi mon ped apparaît invisible ou figé les bras en croix ?

Un ped invisible vient presque toujours d'un .ydd ou d'un .ytd absent ou mal nommé, d'un drapeau IsStreamedGfx incohérent avec la structure des fichiers (true pour un ped livré en dossier de composants préfixés par nom^, false pour un ped en un seul .ydd), ou d'un script d'apparence qui réapplique une tenue par-dessus. Un ped figé, bras tendus, signale un .yft manquant ou un jeu d'animations introuvable dans peds.meta (faute de frappe dans MovementClipSet ou ClipDictionaryName). Testez la ressource seule sur un serveur de test, puis repartez des valeurs de l'exemple de peds.meta pour les clip sets.

Que signifie l'avertissement « Asset ... uses ... MiB of physical memory » ?

C'est le serveur FXServer qui, au démarrage d'une ressource, lit l'en-tête de chaque fichier de stream et compare sa mémoire physique et virtuelle à des seuils : au-delà de 16 Mio le message s'affiche en bleu, au-delà de 32 Mio en jaune, au-delà de 64 Mio en rouge, et au-delà de 48 Mio il ajoute que les assets surdimensionnés provoquent des problèmes de streaming, modèles qui ne se chargent pas ou ne s'affichent pas. Pour un ped, le coupable est presque toujours le .ytd : réduisez les textures à 2048 px au maximum, 1024 px pour les détails, et compressez-les en DXT. Le fichier est transmis malgré l'avertissement, mais les joueurs risquent de voir des personnages gris ou sans texture.

Comment réserver un uniforme ou un ped à un métier sur ESX ou QBCore ?

Par la ressource d'apparence du serveur ou par un vestiaire maison. illenium-appearance, par exemple, annonce la prise en charge de qb-core, d'ESX et d'ox_core, dépend d'ox_lib, fournit une commande /pedmenu et permet de limiter des peds à certains métiers, gangs, identifiants de personnage ou permissions ACE : un uniforme de police addon se réserve au métier police sans écrire de code. Pour un vestiaire maison, le serveur vérifie le métier (xPlayer.job.name sur ESX) avant d'envoyer au client un événement qui exécute la séquence RequestModel, SetPlayerModel, SetPedDefaultComponentVariation. Sur un serveur freeroam, la liste peds du fichier addons.json de vMenu rend le modèle sélectionnable dans le menu d'apparence.

Comment faire apparaître un PNJ avec un ped personnalisé ?

Avec la native CreatePed, après avoir chargé le modèle par RequestModel. Sa documentation précise que le paramètre de type est ignoré (le jeu attribue CIVMALE, CIVFEMALE ou un autre type d'après peds.meta), que isNetwork à false crée un PNJ purement local, et que la fonction renvoie 0 en cas d'échec. Pour un PNJ de décor (réceptionniste, vendeur, garde), créez-le côté client, localement, puis immobilisez-le avec FreezeEntityPosition, SetEntityInvincible et SetBlockingOfNonTemporaryEvents. Un PNJ réseau ne se justifie que s'il doit se déplacer de façon cohérente pour tous les joueurs. Pour habiller les PNJ d'ambiance du jeu sans script, un ped replace au nom du modèle d'origine suffit.

Faut-il changer le game build pour certains peds ?

Oui quand le ped réutilise des composants, des animations ou des accessoires issus d'un DLC de GTA Online. La convar sv_enforceGameBuild sélectionne le build imposé aux clients, se fixe uniquement au démarrage et inclut le contenu de tous les builds précédents, de 1604 (Arena War) à 3889 (The Kortz Center Heist) dans la liste officielle, la valeur 1 chargeant le jeu de base sans DLC. FiveM pour GTA V Enhanced ne prend en charge que le dernier build, chargé par défaut, et y applique en permanence le mode pur qui bloque les fichiers modifiés côté client : sur Enhanced, le streaming serveur est la seule façon de proposer des peds personnalisés.

Les peds personnalisés ralentissent-ils le serveur FiveM ?

Le coût se paie surtout chez les joueurs : téléchargement de tous les fichiers de stream à la première connexion, puis mémoire vidéo pour chaque ped visible. Le serveur, lui, sert les fichiers et tient le registre de streaming sans charger les modèles : un disque SSD ou NVMe et un réseau rapide comptent plus que le processeur. Gardez les textures en 2048 px, retirez les peds inutilisés, et testez chaque ressource isolément avant la production. Sur nos offres serveur FiveM, de 4 à 64 Go de RAM DDR4 avec txAdmin, protection anti-DDoS et réseau 10 Gbit/s inclus, le dossier resources est accessible depuis le panel et en SFTP.

Les peds fonctionnent sur mon PC Windows mais pas sur le VPS Linux, pourquoi ?

Presque toujours une question de casse. Le système de fichiers Linux distingue Police_FR.ydd de police_fr.ydd alors que Windows les confond ; un ped dont le nom de fichier mélange majuscules et minuscules se charge sur un PC de test et devient introuvable une fois transféré par SFTP sur un VPS Linux ou un serveur dédié. Renommez tous les fichiers de stream en minuscules avant le transfert, vérifiez que le Name de peds.meta est écrit de la même façon, puis relancez la ressource avec refresh et ensure dans la console txAdmin.

Comment transférer une ressource ped sur le serveur : panel, SFTP ou FTP ?

Par le gestionnaire de fichiers du panel ou en SFTP avec FileZilla, WinSCP ou scp, dans le répertoire resources du serveur : resources/[peds]/ sur un serveur managé, ~/FXServer/server-data/resources/ sur un VPS Linux ou un serveur dédié, C:\FXServer\server-data\resources\ sous Windows. Le SFTP passe par SSH et chiffre identifiants et fichiers, contrairement au FTP classique qui les envoie en clair. Avant de copier, sauvegardez le répertoire resources et la base de données MySQL si votre script d'apparence y enregistre les tenues, et vérifiez l'espace disque. Aucun port supplémentaire n'est à ouvrir dans le pare-feu : les fichiers de stream sont servis par FXServer sur le port TCP déclaré par endpoint_add_tcp dans server.cfg, 30120 dans l'exemple officiel. Ajoutez ensuite la ligne ensure, puis refresh et ensure dans la console txAdmin.

Comment renommer en lot les fichiers d'un ped (minuscules, préfixe nom^) ?

En ligne de commande, sans installer d'outil. Sous Windows, PowerShell : Get-ChildItem -File | Rename-Item -NewName { 'monped^' + $_.Name } préfixe chaque fichier du dossier courant, et -WhatIf ajouté à Rename-Item affiche le résultat sans rien renommer. Sous Linux (Ubuntu, Debian), une boucle shell fait la même chose : for f in *; do mv -- "$f" "monped^$f"; done, et une seconde boucle qui passe chaque nom par tr '[:upper:]' '[:lower:]' met tout en minuscules, ce qui compte sur un système de fichiers Linux qui distingue la casse. Exécutez ces commandes une seule fois, dans le bon dossier, après une sauvegarde.