Skip to main content

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.

CodeSituation
MATCH_NOT_FOUNDUID inconnu ou état direct indisponible pour rejoindre/spectater ; REST utilise 404.
MATCH_FULLNouvelle inscription dans un lobby de quatre joueurs ; une reconnexion d’un membre ne remplit pas une nouvelle place.
UNAUTHORIZEDIdentité 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_STATEPhase incompatible, mauvais round, démarrage sans quatre joueurs répartis et connectés, ou appartenance active incompatible avec une création/inscription.
PLAYER_DEADJoueur éliminé qui tente mouvement, tir ou déclaration de touche.
INVALID_TARGETCible absente, éliminée, alliée ou identique à l’attaquant.
DUPLICATE_EVENTTouche déjà traitée ou séquence de mouvement déjà acceptée ; aucun second effet.
INVALID_PAYLOADJSON 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​

  1. Une rupture réseau détache la connexion, signale match.playerLeft aux autres joueurs et conserve le Player dans 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é.
  2. Unity ouvre une nouvelle connexion authentifiée et envoie match.join avec le même UID. Le backend reconnaît le membre par username, remplace l’ancienne connexion et empêche celle-ci de continuer à agir.
  3. Le backend envoie match.stateChanged ciblé avec l’instantané complet et le dernier seq accepté pour ce joueur. Aucun nouveau Player ni match.playerJoined d’inscription, aucune statistique réinitialisée.
  4. Unity applique cet état avant d’envoyer de nouvelles commandes et abandonne ses actions locales obsolètes. Un joueur à hp: 0 reste é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.