From a22e4dfb0dfb042c80da9c44a3e5178f06cfc4d6 Mon Sep 17 00:00:00 2001
From: striven-prevailed <sg.striven@cutecat.club>
Date: Thu, 06 Nov 2025 13:54:47 +0000
Subject: [PATCH] Describe UPlay R1, Spring

---
 04_rendezvous/05_rmc_protocol.md |   91 +++++++++++++++++++++++++++------------------
 1 files changed, 55 insertions(+), 36 deletions(-)

diff --git a/04_rendezvous/05_rmc_protocol.md b/04_rendezvous/05_rmc_protocol.md
index bea7283..691b4b9 100644
--- a/04_rendezvous/05_rmc_protocol.md
+++ b/04_rendezvous/05_rmc_protocol.md
@@ -1,26 +1,40 @@
-The RMC protocol, standing for **R**emote **M**ethod **C**all, is used to make transactional requests, such that "methods" are called by the client and responses are generated by the server. As seen in HyperScape, this protocol is done over [RendezVous](./03_rendezvous_structure.md) data packets.
+# RendezVous: RMC Protocol
+
+The RMC protocol, standing for **R**emote **M**ethod **C**all, is used to make transactional requests, such that "methods" are called by the client and responses are generated by the server.
 
 RMC itself is designed as a transport for several other application-defined protocols, such that services can send and handle requests through RMC. This means that there's another level deeper to go before we get to application/game data, as each protocol implements its own reading and writing of bytes, although they follow similar patterns and standardised ways.
 
-Here are the currently understood RMC protocols implemented in HyperScape. Some appear to be standard to Ubisoft games as a whole, while others appear to be designed specifically for the game.
+## Official Implementation
+
+As seen in HyperScape, this protocol is done over [RendezVous](./03_structure.md) data packets.
+
+When a request is made, usually in a function going by `<protocol name>Protocol::Call<method name>`, a call context is created and containers in memory for data returned by the server are associated with **return value pointers**, with IDs from `[0, n)`, where n is the number of parameters.
+
+When a response is received, these **return value pointers** are fetched from the call context, and the packet is parsed and data is placed into these pointers.
 
 ## Known Protocols
 
-| Protocol                                                            | Description                                                       | HyperScape-specific? |
-|---------------------------------------------------------------------|-------------------------------------------------------------------|----------------------|
-| [`LoginProtocol`](./01_protocols/01_loginprotocol.md)               | Used for authenticating with an RMC server using a Ubisoft token. | ✖️                   |
-| [`CloudServersProtocol`](./01_protocols/02_cloudserversprotocol.md) | Used for listing datacenters for connecting to game servers       | ✔️                   |
-| ...                                                                 | ...                                                               | ...                  |
+Here are the currently understood RMC protocols implemented in HyperScape. Some appear to be standard to Ubisoft games as a whole, while others appear to be designed specifically for the game.
+
+| Protocol                                                                     | Description                                                       | HyperScape-specific? |
+|------------------------------------------------------------------------------|-------------------------------------------------------------------|----------------------|
+| [`LoginProtocol`](./01_rmc_protocols/loginprotocol.md)                       | Used for authenticating with an RMC server using a Ubisoft token. | ✖️                   |
+| [`CloudServersProtocol`](./01_rmc_protocols/cloudserversprotocol.md)         | Used for listing datacenters for connecting to game servers.      | ✔️                   |
+| [`ApexAntitoxicityProtocol`](./01_rmc_protocols/apexantitoxicityprotocol.md) | Currently unknown, presumably for managing bans and mutes.        | ✔️                   |
+| ...                                                                          | ...                                                               | ...                  |
+
+> [!NOTE]
+> This list is far from complete.
 
 ## Base Packet Format
 
 ##### Parsing
-| Name          | Description                                                                                                                                                 | Type                                                      |
-|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| Packet Length | The total number of bytes in the packet, not including the length itself.                                                                                   | `u32`                                                     |
-| Protocol Name | The protocol service on the server that is responsible for managing this request                                                                            | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Is Request?   | Whether or not this packet is for a _request_.                                                                                                              | `bool`                                                    |
-| ...           | See [Request Packet Format](#request-packet-format) or [Response Packet Format](#response-packet-format) for parsing the packet depending on `Is Request?`. | ...                                                       |
+| Name          | Description                                                                                                                                                 | Type                                           |
+|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| Packet Length | The total number of bytes in the packet, not including the length itself.                                                                                   | `u32`                                          |
+| Protocol Name | The protocol service on the server that is responsible for managing this request                                                                            | [`String`](./03_structure.md#structure-string) |
+| Is Request?   | Whether or not this packet is for a _request_.                                                                                                              | `bool`                                         |
+| ...           | See [Request Packet Format](#request-packet-format) or [Response Packet Format](#response-packet-format) for parsing the packet depending on `Is Request?`. | ...                                            |
 
 ## Request Packet Format
 
@@ -46,13 +60,13 @@
 ```
 
 ##### Parsing
-| Name           | Description                                                                                                                               | Type                                                                                                  |
-|----------------|-------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
-| ...            | See [Base Packet Format](#base-packet-format) for parsing the prologue of a request packet.                                               | ...                                                                                                   |
-| Call ID        | The nonce token for this call to identify the response associated with this request.                                                      | `u32`                                                                                                 |
-| Method Name    | The method to call on the server.                                                                                                         | [`String`](./03_rendezvous_structure.md#structure-string)                                             |
-| Class Versions | Version information about the data in the request                                                                                         | [`List`](./03_rendezvous_structure.md#structure-listt)`<`[`ClassVersion`](#structure-classversion)`>` |
-| Request Data   | Raw data to pass to the request handler, see the respective [protocol and method specification](#known-protocols) to write and read this. | `<remaining bytes>`                                                                                   |
+| Name           | Description                                                                                                         | Type                                                                                       |
+|----------------|---------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
+| ...            | See [Base Packet Format](#base-packet-format) for parsing the prologue of a request packet.                         | ...                                                                                        |
+| Call ID        | The nonce token for this call to identify the response associated with this request.                                | `u32`                                                                                      |
+| Method Name    | The method to call on the server.                                                                                   | [`String`](./03_structure.md#structure-string)                                             |
+| Class Versions | Version information about the data in the request                                                                   | [`List`](./03_structure.md#structure-listt)`<`[`ClassVersion`](#structure-classversion)`>` |
+| ...            | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                                                            |
 
 ### Structure: `ClassVersion`
 Example:
@@ -62,10 +76,10 @@
 00000010  6E 66 6F 00 01 00                                nfo...
 ```
 
-| Name           | Description                                       | Type                                                      |
-|----------------|---------------------------------------------------|-----------------------------------------------------------|
-| Structure Name | The name of the structure to assign a version to. | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Version        | The version of the structure.                     | `u16`                                                     |
+| Name           | Description                                       | Type                                           |
+|----------------|---------------------------------------------------|------------------------------------------------|
+| Structure Name | The name of the structure to assign a version to. | [`String`](./03_structure.md#structure-string) |
+| Version        | The version of the structure.                     | `u16`                                          |
 
 ## Response Packet Format
 
@@ -90,19 +104,24 @@
 ### Successful Response Format
 
 ##### Parsing
-| Name          | Description                                                                                                                                | Type                                                      |
-|---------------|--------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| ...           | See [Response Packet Format](#response-packet-format) for parsing the prologue of a successful response packet.                            | ...                                                       |
-| Call ID       | The nonce token for the call to associate the response to the request.                                                                     | `u32`                                                     |
-| Method Name   | The method that was called by the client.                                                                                                  | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Response Data | Raw data to pass to the response handler, see the respective [protocol and method specification](#known-protocols) to write and read this. | `<remaining bytes>`                                       |
+| Name        | Description                                                                                                         | Type                                           |
+|-------------|---------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| ...         | See [Response Packet Format](#response-packet-format) for parsing the prologue of a successful response packet.     | ...                                            |
+| Call ID     | The nonce token for the call to associate the response to the request.                                              | `u32`                                          |
+| Method Name | The method that was called by the client, see note below.                                                           | [`String`](./03_structure.md#structure-string) |
+| ...         | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                |
+
+> [!NOTE]
+> Typically, a `*` is appended to the Method Name in responses for currently unknown reasons. Likely to do with the fact that the response handlers update pointers to data containers created in the original request.
+>
+> For example, where the request might be `LoginProtocol::LoginWithToken_V1`, the response would be for `LoginProtocol::LoginWithToken_V1*`.
 
 ### Unsuccessful Response Format
 
 ##### Parsing
-| Name            | Description                                                                                                        | Type                                                      |
-|-----------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| ...             | See [Response Packet Format](#response-packet-format) for parsing the prologue of an unsuccessful response packet. | ...                                                       |
-| Error Namespace | The category of error that occurred.                                                                               | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Error Code      | The code of the error in the specified namespace                                                                   | `u16`                                                     |
-| Call ID         | The nonce token for the call to associate the response to the request.                                             | `u32`                                                     |
\ No newline at end of file
+| Name            | Description                                                                                                        | Type                                           |
+|-----------------|--------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| ...             | See [Response Packet Format](#response-packet-format) for parsing the prologue of an unsuccessful response packet. | ...                                            |
+| Error Namespace | The category of error that occurred.                                                                               | [`String`](./03_structure.md#structure-string) |
+| Error Code      | The code of the error in the specified namespace                                                                   | `u16`                                          |
+| Call ID         | The nonce token for the call to associate the response to the request.                                             | `u32`                                          |
\ No newline at end of file

--
Gitblit v1.10.0