Aller au contenu

Vestiaires techniques

Noms et administration

La migration 0014_named_changing_rooms ajoute le nom persistant. Les routes internes PUT et DELETE /internal/v1/changing-rooms/{id}, ainsi que les routes web /admin/changing-rooms, exigent ADMIN_ALLOW_EDIT_CHGROOM. Toute mutation provoque une resynchronisation des props.

La NUI sépare la saisie du nom du placement. Les contrôles de molette 14/15 sont désactivés puis lus avec IsDisabledControlJustPressed. Les contrôles 172/173 appliquent un décalage vertical borné après la pose au sol du prop.

La migration 0017_selected_chgroom_props ajoute spawn_prop et prop_model_hash. Une salle avec spawn_prop=false référence un objet existant au lieu de créer un prop. Le client effectue un raycast limité aux objets, commute SetEntityDrawOutline uniquement lors d'un changement de cible, puis persiste le hash, la position et l'orientation. Comme les objets de mapping sont streamés, un worker borné à 80 mètres résout GetClosestObjectOfType et enregistre l'interaction à l'arrivée du joueur. La disparition de l'entité retire proprement l'interaction jusqu'au prochain streaming. Une mutation de position conserve spawn_prop : elle relance la sélection pour une référence existante et le placement partagé pour un prop généré.

Le manifest exige au minimum le game build 3258, qui contient mp2024_01; le déploiement force actuellement le build 3570. Avant IsModelInCdimage et RequestModel, le client demande les IPL de requiredIpls (par défaut m24_1_bailoffice_davis) et attend brièvement leur activation afin d'enregistrer les archétypes de l'intérieur DLC. Le build effectif, les IPL demandés et le résultat de validation de chaque modèle restent visibles dans F8. prop_coathook_01 a été retiré à la fois de la configuration et des fallbacks codés.

Après la saisie du nom, medusa-changing-rooms délègue la prévisualisation du prop et les contrôles à medusa-entity-placement, puis persiste uniquement le résultat renvoyé par son callback.

La migration 0015_cleanup_changing_rooms supprime les lignes sans nom, avec un nom vide, ou portant la valeur transitoire Vestiaire attribuée par 0014 aux anciennes lignes. Cette suppression est volontairement irréversible, car les lignes supprimées ne peuvent pas être reconstruites fidèlement lors d'un downgrade.

Persistance et API

La migration 0013_changing_rooms crée changing_rooms avec position, orientation, état et timestamps. PostgreSQL reste la source de vérité. Le resource medusa-changing-rooms synchronise GET /internal/v1/changing-rooms toutes les deux secondes et ne rediffuse l'inventaire que lorsque son empreinte change. POST /internal/v1/changing-rooms exige la clé interne et réautorise les rôles Discord avec ADMIN_ALLOW_PLACE_CHGROOM.

Les routes GET /internal/v1/changing-rooms/outfits/{character_id} et POST /internal/v1/changing-rooms/outfits/apply listent et appliquent les entrées saved_outfits. L'application vérifie que la tenue appartient au personnage demandé avant d'écrire characters.clothing. Le serveur FiveM résout toujours le personnage depuis la source connectée ; le client ne choisit jamais un autre identifiant de personnage.

Resource FiveM

Chaque client parcourt propModels, vérifie IsModelInCdimage et IsModelValid, puis attend le chargement du premier candidat utilisable. La priorité commence par m24_1_int_01_m241_coatrack_02, puis utilise prop_coathook_01, v_res_tre_wardrobe ou prop_cs_clothes_box. Chaque refus et le modèle finalement retenu sont journalisés dans F8. Le client crée ensuite le prop statique et l'inscrit comme entité dans medusa-interactions. Le contour, la détection de proximité, le verrou d'interaction et le popup sont donc mutualisés. Le resource détruit props et inscriptions lors d'une resynchronisation ou de son arrêt.

À l'ouverture, le client capture composants et accessoires, immobilise le ped et active une caméra plein corps. La sélection applique uniquement un aperçu local avec les exports de medusa-character-customization. La confirmation transmet l'UUID de la tenue au serveur ; seule la réponse API réussie ferme le vestiaire sans restauration. Annulation, arrêt de resource ou erreur de chargement libèrent le verrou d'interaction et restaurent le snapshot si nécessaire.

Le placement /placechangingroom est autorisé côté serveur avant l'ouverture du mode visuel puis réautorisé avant la mutation API. La création est inscrite dans l'audit sous changing_room.place avec position et orientation.

Le serveur vérifie la proximité d'un vestiaire actif avant de charger les tenues et avant la confirmation. Il crée une session de cinq minutes contenant uniquement les UUID renvoyés pour le personnage actif. Un événement client forgé ne peut donc appliquer ni une tenue non présentée, ni une tenue depuis une autre position.