Erreurs et reconnexion
Format
{
"type": "error",
"data": {
"code": "PLAYER_DEAD",
"message": "Le joueur est éliminé pour ce round."
}
}
Sur WebSocket, ajouter matchUid et roundNumber s’ils sont connus ; reprendre data.eventId pour une erreur de touche si possible. Une erreur est ciblée au demandeur. Une commande refusée ne change ni HP, ni équipes, ni scores, ni statistiques.
| Code | Situation |
|---|---|
MATCH_NOT_FOUND | UID inconnu ou état direct indisponible pour rejoindre/spectater ; REST utilise 404. |
MATCH_FULL | Nouvelle inscription dans un lobby de quatre joueurs ; une reconnexion d’un membre ne remplit pas une nouvelle place. |
UNAUTHORIZED | Identité invalide, non-participant, action réservée au créateur ou commande de modification sur le canal spectateur ; REST utilise 401 ou 403. |
INVALID_TEAM | Équipe inexistante, joueur absent du lobby ou capacité de deux dépassée. |
INVALID_MATCH_STATE | Phase incompatible, mauvais round, démarrage sans quatre joueurs répartis et connectés, ou appartenance active incompatible avec une création/inscription. |
PLAYER_DEAD | Joueur éliminé qui tente mouvement, tir ou déclaration de touche. |
INVALID_TARGET | Cible absente, éliminée, alliée ou identique à l’attaquant. |
DUPLICATE_EVENT | Touche déjà traitée ou séquence de mouvement déjà acceptée ; aucun second effet. |
INVALID_PAYLOAD | JSON mal formé, événement inconnu, champ requis absent, dégâts non positifs ou valeurs non finies. |
Pour une touche déjà acceptée, vérifier la déduplication avant les contrôles dépendant de l’état courant : une retransmission reçoit DUPLICATE_EVENT même si la touche initiale a éliminé la cible ou terminé le round. Garder le cache des touches acceptées pendant la partie, y compris après transition. Cela n’autorise pas de nouvelles touches d’un ancien round.
Reprise mobile
- Une rupture réseau détache la connexion, signale
match.playerLeftaux autres joueurs et conserve lePlayerdans une partie lancée (HP, position, rotation, équipe, statistiques). Aucune mort ni réapparition automatique ; le joueur reste dans l’état partagé et peut être touché. - Unity ouvre une nouvelle connexion authentifiée et envoie
match.joinavec le même UID. Le backend reconnaît le membre par username, remplace l’ancienne connexion et empêche celle-ci de continuer à agir. - Le backend envoie
match.stateChangedciblé avec l’instantané complet et le dernierseqaccepté pour ce joueur. Aucun nouveauPlayernimatch.playerJoinedd’inscription, aucune statistique réinitialisée. - Unity applique cet état avant d’envoyer de nouvelles commandes et abandonne ses actions locales obsolètes. Un joueur à
hp: 0reste éliminé jusqu’au round suivant déclenché par le backend. Si ce round a déjà commencé pendant la coupure, les HP reçus reflètent cette réinitialisation réelle.
Dans le lobby, une déconnexion retire l’inscription et l’affectation comme match.leave, puis diffuse team.updated. Les délais de reconnexion, abandons définitifs, transfert/fermeture après départ du créateur et conduite d’une partie incomplète après démarrage restent à décider, sans ajouter d’état à MatchState.
Voir les conventions WebSocket pour la séquence et la déduplication, et le canal spectateur pour la reprise web.