NoxVR Documentation
Relay Protocol

Enter

Rejoindre une instance de jeu avec validation des permissions et configuration du joueur.

Le message Enter permet aux clients de rejoindre une instance de jeu spécifique.

Il gère les permissions, les mots de passe, les listes blanches/noires et configure le profil du joueur dans l'instance.

Priorité

High - Ce message a une priorité élevée pour permettre un accès rapide aux instances.

Le message Enter requiert que le client soit authentifié. Les requêtes envoyées avant l'authentification seront rejetées.


Requête Client → Serveur

Format du Payload

[instance_id: byte]
[flags: byte]
(UsePseudonyme ? [pseudonyme: string])
(UsePassword ? [password: string])

Structure Détaillée

TypeNomDescription
byteInstanceIDID de l'instance à rejoindre
byteFlagsOptions d'entrée dans l'instance
stringPseudonymeNom d'affichage personnalisé (conditionnel)
stringPasswordMot de passe de l'instance (conditionnel)

Enter Flags

ValeurNomDescription
0x00NoneEntrée standard
0x01AsBotRejoindre en tant que bot
0x02UsePseudonymeUtiliser un pseudonyme personnalisé
0x04UsePasswordFournir un mot de passe
0x08HideInListSe cacher dans les listes de joueurs

Exemple de Payload

[0x05]                          // InstanceID = 5
[0x00]                          // Flags = None

Entrée avec Pseudonyme et Mot de Passe

[0x03]                          // InstanceID = 3
[0x06]                          // Flags = UsePseudonyme | UsePassword
[0x0A, "PlayerName"]            // Pseudonyme = "PlayerName" (10 chars)
[0x08, "secret123"]             // Password = "secret123" (8 chars)

Entrée en tant que Bot

[0x01]                          // InstanceID = 1
[0x09]                          // Flags = AsBot | HideInList

Réponse Serveur → Client

Format du Payload

[instance_id: byte]
[result: byte]
(Success ? (
    [player_flags: uint]
    [player_id: ushort]
    [user_id: uint]
    [server_address: string]
    [display_name: string]
    [created_at: DateTime]
    [tps: byte]
    [threshold: byte]
))
(Blacklisted ? [expires_at: DateTime])
(Error in result ? [reason?: string])

Structure Détaillée

TypeNomDescription
byteInstanceIDID de l'instance concernée
byteResultCode de résultat de l'entrée
uintPlayerFlagsFlags du joueur dans l'instance
ushortPlayerIDID unique du joueur dans l'instance
uintUserIDID de l'utilisateur authentifié
stringServerAddressAdresse du serveur
stringDisplayNameNom d'affichage du joueur
DateTimeCreatedAtTimestamp de création du joueur
byteTPSTaux de rafraîchissement de l'instance
byteThresholdSeuil de latence de l'instance
stringReasonRaison du rejet ou bannissement
DateTimeExpiresAtDate d'expiration du bannissement

Enter Results

ValeurNomDescription
0x00SuccessEntrée réussie dans l'instance
0x01NotFoundInstance introuvable
0x02FullInstance pleine
0x03BlacklistedUtilisateur banni de l'instance
0x04NotWhitelistedUtilisateur non autorisé
0x05InvalidGameJeu incompatible
0x06IncorrectPasswordMot de passe incorrect
0x07UnknownErreur inconnue
0x08RefusedConnexion refusée
0x09InvalidPseudonymePseudonyme invalide

Player Flags (Succès)

ValeurNomDescription
0x001IsBotLe joueur est un bot
0x002InstanceMasterJoueur de référence de l'instance
0x004InstanceModeratorModérateur de l'instance
0x008InstanceOwnerPropriétaire de l'instance
0x010GuildModeratorModérateur de guilde
0x020MasterModeratorModérateur maître
0x040WorldOwnerPropriétaire du monde
0x080WorldModeratorModérateur du monde
0x100AuthUnverifiedAuthentification non vérifiée
0x200HideInListCaché dans les listes
0x400HasCustomDisplayNom d'affichage personnalisé

Exemple de Réponse - Succès

[0x05]                          // InstanceID = 5
[0x00]                          // Result = Success
[0x00, 0x00, 0x00, 0x00]        // PlayerFlags = None
[0x00, 0x01]                    // PlayerID = 1
[0x00, 0x00, 0x04, 0x2A] // UserID = 1066
[0x0A, "nox.server"]            // ServerAddress = "nox.server"
[0x0C, "PlayerName123"]         // DisplayName = "PlayerName123"
[0x00, 0x00, 0x01, 0x8A, 0x32, 0x1F, 0x80, 0x00] // CreatedAt (timestamp)
[0x3C]                          // TPS = 60
[0x32]                          // Threshold = 50

Exemple de Réponse - Instance Pleine

[0x05]                          // InstanceID = 5
[0x02]                          // Result = Full
[0x0E, "Instance is full"]      // Reason = "Instance is full"

Exemple de Réponse - Blacklisté

[0x05]                          // InstanceID = 5
[0x03]                          // Result = Blacklisted
[0x0F, "Disruptive behavior"]   // Reason = "Disruptive behavior"
[0x00, 0x00, 0x01, 0x8A, 0x32, 0x1F, 0x80, 0x00] // ExpiresAt (timestamp)

Exemple de Réponse - Mot de Passe Incorrect

[0x05]                          // InstanceID = 5
[0x06]                          // Result = IncorrectPassword
[0x12, "Incorrect password"]    // Reason = "Incorrect password"

Traitement

Côté Serveur

  1. Validation d'instance : Vérification que l'instance existe
  2. Vérification de présence : S'assurer que le client n'est pas déjà dans l'instance
  3. Contrôle de capacité : Vérification que l'instance n'est pas pleine
  4. Validation des permissions : Vérification des listes noires/blanches
  5. Traitement des flags : Configuration des options de connexion
  6. Validation du mot de passe : Si requis par l'instance
  7. Création du joueur : Attribution d'un ID et configuration dans l'instance
  8. Notification : Mise à jour du serveur maître

Côté Client

  1. Préparation des données : Assemblage de l'ID d'instance et des flags
  2. Envoi conditionnel : Ajout du pseudonyme et/ou mot de passe si nécessaire
  3. Traitement de la réponse : Configuration locale selon le résultat

Comportements Spéciaux

Mode Bot

Pour rejoindre en tant que bot, l'instance doit autoriser les bots (InstanceFlags.AuthorizeBot). Sinon, la connexion sera refusée.

Pseudonyme Personnalisé

Le pseudonyme remplace temporairement le nom d'affichage du joueur dans cette instance spécifique.

Protection par Mot de Passe

Les instances protégées nécessitent le flag UsePassword et un mot de passe valide.

Listes de Contrôle

  • Liste blanche : Si activée, seuls les utilisateurs autorisés peuvent rejoindre
  • Liste noire : Les utilisateurs bannis ne peuvent pas rejoindre

Messages de Notification

Join

Quand un joueur rejoint avec succès, tous les autres joueurs de l'instance reçoivent un message Join avec les informations du nouveau joueur.

Synchronisation

Le nouveau joueur reçoit également les données de tous les joueurs déjà présents, incluant :

  • Informations d'avatar via AvatarChanged
  • Transformations via Transform

Codes d'Erreur

Erreurs de Permission

  • NotWhitelisted : L'utilisateur n'est pas sur la liste blanche
  • Blacklisted : L'utilisateur est banni avec date d'expiration
  • Refused : Connexion refusée (ex: bot non autorisé)

Erreurs d'Instance

  • NotFound : L'instance n'existe pas
  • Full : L'instance a atteint sa capacité maximale
  • IncorrectPassword : Mot de passe fourni incorrect

Erreurs de Données

  • InvalidPseudonyme : Le pseudonyme fourni est invalide
  • Unknown : Erreur générique ou inconnue