(Feat) Customisation -- replication et persistance
Lot 3 : l'apparence survit desormais au respawn, au changement de map et au relancement du jeu, et les trois autres joueurs la voient. Elle vit sur ASurvivalPlayerState et pas sur le pawn : c'est le JOUEUR qu'elle decrit, pas le corps. Le pawn meurt et reapparait, le PlayerState non -- reapparaitre avec le visage de quelqu'un d'autre n'aurait aucun sens, alors que perdre son inventaire au sol est la regle du jeu. SubmitCharacterAppearance() sur AFpsPlayerController est le point d'entree UNIQUE : il persiste ET annonce au serveur, jamais l'un sans l'autre. Persister sans annoncer laisserait le joueur seul a se voir change, annoncer sans persister le ferait repartir au visage par defaut au lancement suivant. C'est par la que passent les commandes console, et par la que passera l'ecran du lot 4. La course pawn / PlayerState est resolue des DEUX cotes. Chez un client ils arrivent par deux chemins de replication independants et rien ne dit lequel gagne : OnRep_CharacterAppearance monte le personnage si le pawn est deja la, AFpsPlayer::OnRep_PlayerState va chercher l'apparence si c'est l'inverse. Les deux appellent la meme fonction idempotente. Chez l'hote aucun OnRep ne se declenche, d'ou l'appel local dans SetCharacterAppearance -- sans lui, l'hote serait le seul a ne pas voir son propre personnage. Rien n'est valide cote PlayerState, deliberement : borner un index demande le catalogue, que seul UCharacterAppearanceComponent connait, et celui-ci passe deja tout ce qu'il monte par Catalog->Sanitize() sur chaque machine. Piege de test note dans CLAUDE.md : en PIE a deux joueurs, les deux fenetres lisent le meme .ini, donc les deux personnages demarrent identiques. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+24
-5
@@ -685,12 +685,31 @@ couleurs sur des MID). `DA_CharacterParts` couvre Body A ; **Body B reste à rem
|
||||
`ABP_PlayerBody_B` et sans barbes ni moustaches — le pack n'en livre pas, et une liste vide se
|
||||
comporte déjà comme `NoPart`.
|
||||
|
||||
Restent les lots 3 et 4 :
|
||||
**Le lot 3 est fait** : l'apparence vit sur `ASurvivalPlayerState` en `ReplicatedUsing` et se
|
||||
persiste dans `USurvivalUserSettings`. Elle survit donc au respawn — le pawn est un nouvel acteur,
|
||||
le PlayerState non — et au relancement du jeu.
|
||||
|
||||
- **Lot 3** — réplication par `ASurvivalPlayerState` en `ReplicatedUsing`, persistance dans
|
||||
`USurvivalUserSettings`
|
||||
- **Lot 4** — l'écran : `ACharacterPreviewActor` dans `MenuScene`, caméra à cadrages interpolés,
|
||||
UI à gauche
|
||||
- **`SubmitCharacterAppearance()` sur `AFpsPlayerController` est le point d'entrée UNIQUE.** Il
|
||||
persiste *et* annonce au serveur, jamais l'un sans l'autre : persister sans annoncer laisserait
|
||||
le joueur seul à se voir changé, annoncer sans persister le ferait repartir au visage par défaut
|
||||
au lancement suivant. C'est par là que passent les commandes console, et par là que passera
|
||||
l'écran du lot 4.
|
||||
- **La course pawn / PlayerState se résout des deux côtés.** Chez un client ils arrivent par deux
|
||||
chemins de réplication indépendants et rien ne dit lequel gagne : `OnRep_CharacterAppearance`
|
||||
monte le personnage si le pawn est déjà là, `AFpsPlayer::OnRep_PlayerState` va chercher
|
||||
l'apparence si c'est le pawn qui est arrivé le premier. Les deux appellent la même fonction
|
||||
idempotente. Chez l'hôte, aucun `OnRep` ne se déclenche — c'est le `BeginPlay` du pawn qui monte,
|
||||
et `SetCharacterAppearance` qui applique en local juste après avoir écrit la propriété.
|
||||
- **Rien n'est validé côté PlayerState, et c'est délibéré** : borner un index demande le catalogue,
|
||||
que seul `UCharacterAppearanceComponent` connaît — or il passe déjà tout ce qu'il monte par
|
||||
`Catalog->Sanitize()`, sur chaque machine. Dupliquer la validation demanderait de donner le
|
||||
catalogue au PlayerState pour un résultat identique.
|
||||
- Piège de test : **en PIE à deux joueurs, les deux fenêtres lisent le même `.ini`**, donc les deux
|
||||
personnages démarrent identiques. Il faut changer l'un des deux à la console pour vérifier que la
|
||||
réplication marche.
|
||||
|
||||
Reste le **lot 4** — l'écran : `ACharacterPreviewActor` dans `MenuScene`, caméra à cadrages
|
||||
interpolés, UI à gauche. Et le remplissage de **Body B** dans `DA_CharacterParts`.
|
||||
|
||||
#### Trois pièges du lot 2, aucun visible depuis le code
|
||||
|
||||
|
||||
Reference in New Issue
Block a user