| | |
| | | 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 |
| | | |
| | | 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_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 | ✔️ | |
| | | |------------------------------------------------------------------------------|-------------------------------------------------------------------|----------------------| |
| | | | [`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) | |
| | | | 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?`. | ... | |
| | | |
| | |
| | | |
| | | ##### 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)`>` | |
| | | | 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` |
| | |
| | | ``` |
| | | |
| | | | Name | Description | Type | |
| | | |----------------|---------------------------------------------------|-----------------------------------------------------------| |
| | | | Structure Name | The name of the structure to assign a version to. | [`String`](./03_rendezvous_structure.md#structure-string) | |
| | | |----------------|---------------------------------------------------|------------------------------------------------| |
| | | | 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 |
| | |
| | | |
| | | ##### 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, see note below. | [`String`](./03_rendezvous_structure.md#structure-string) | |
| | | | 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] |
| | |
| | | |
| | | ##### 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 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` | |