Architecture des magasins de vêtements¶
Le placement en jeu transmet actor_role_ids à l'API interne conformément à
InternalShopMutation. Après une création ou modification réussie, medusa-admin écrit l'action
clothing_shop.create ou clothing_shop.edit dans l'audit, force la resynchronisation et confirme
la persistance au client.
La prévisualisation et les contrôles de placement du PNJ sont délégués à l'export de
medusa-entity-placement; medusa-admin ne conserve que le formulaire métier et la mutation API.
La table clothing_shops est la source de vérité des positions, du modèle de PNJ, du scénario et de l’état actif. La migration 0010_clothing_shops importe les quatorze emplacements historiques et ajoute characters.clothing_shop_requested pour les ouvertures différées.
FastAPI expose le CRUD web sous /admin/clothing-shops et les routes FiveM sous /internal/v1/clothing-shops. Les mutations internes sont autorisées avec les rôles Discord de l’acteur. Le resource medusa-clothing-shops interroge l’API toutes les deux secondes, compare l’empreinte du résultat et ne reconstruit interactions, PNJ et blips qu’en cas de changement.
Les ouvertures distantes utilisent une file persistante par personnage. Le resource la consulte, résout le personnage connecté via medusa-player-utils, ouvre l’éditeur puis consomme la demande. FiveM ne contacte jamais PostgreSQL directement.
L’éditeur vestimentaire est une NUI dédiée dans medusa-clothing-shops; il ne lance plus l’interface partagée de medusa-character-customization. Le client calcule les bornes avec les natives de variations du ped, applique immédiatement les modèles et textures, et restaure l’instantané initial lors d’une annulation. La validation finale continue d’écrire characters.clothing via l’API interne.
La caméra scriptée reste ancrée sur l’orientation d’ouverture du personnage afin que sa rotation ne déplace pas le point de vue. Le callback NUI shop_focus sélectionne l’un des quatre profils locaux (head, torso, legs, full), chacun définissant distance, hauteur, point visé et champ de vision. Aucun callback ni fichier de création de personnage n’est modifié.
La migration 0011_saved_outfits ajoute saved_outfits, liée au personnage avec suppression en cascade, et outfit_share_codes. Les codes utilisent huit caractères majuscules sans caractères visuellement ambigus. Les routes internes /internal/v1/clothing-shops/outfits et /internal/v1/clothing-shops/codes sont appelées uniquement par le resource serveur, après résolution de la session active et validation structurelle de la tenue. Le chargement d’un code ne persiste rien avant la validation finale du magasin.
Le panneau NUI de medusa-moderation contient la vue World Edit. Les opérations sont transmises au serveur, réautorisées avec ADMIN_ALLOW_CLOTHESSHOP_EDIT, puis exécutées via l’API interne. Le mode placement libère le focus NUI, crée un PNJ client translucide et non collisionné, puis envoie sa position finale au serveur. Le PNJ temporaire est supprimé lors de la confirmation ou de l’annulation.
Les messages de commande utilisent medusa:command:message. Le client écrit localement dans le resource chat, la console F8 et le terminal NUI, ce qui évite l’événement réseau non sécurisé chat:addMessage.
Permissions : ADMIN_ALLOW_CLOTHESSHOP_EDIT et ADMIN_ALLOW_GIVE_CLOTHESSHOP. Les fondateurs les reçoivent via ALL_PERMISSIONS.