rage-framework-rpc/README.md

112 lines
3.1 KiB
Markdown
Raw Normal View History

2018-11-01 19:35:16 +00:00
**rage-rpc** simplifies two-way communication between the RAGE Multiplayer server, client, and browser instances by providing a easy to use API for calling remote code and expecting results.
2018-11-01 12:43:41 +00:00
2018-11-01 12:47:02 +00:00
---
## Examples
2018-11-01 12:43:41 +00:00
2018-11-01 12:47:02 +00:00
### Server to Client
2018-11-01 12:43:41 +00:00
2018-11-01 19:35:16 +00:00
**Situation:** The server wants to ask a specific player if they are currently climbing anything.
##### Client-side
```javascript
const rpc = require('rage-rpc');
rpc.register('getIsClimbing', () => mp.players.local.isClimbing());
```
2018-11-01 12:43:41 +00:00
##### Server-side
```javascript
2018-11-01 19:35:16 +00:00
const rpc = require('rage-rpc');
2018-11-01 12:43:41 +00:00
2018-11-01 19:35:16 +00:00
const player = mp.players.at(0);
2018-11-01 12:43:41 +00:00
2018-11-01 19:35:16 +00:00
rpc.callClient(player, 'getIsClimbing').then(climbing => {
if(climbing){
console.log('The player is climbing!');
2018-11-01 12:43:41 +00:00
}else{
2018-11-01 19:35:16 +00:00
console.log('The player is not climbing!');
2018-11-01 12:43:41 +00:00
}
});
// or even just this inside an async function:
2018-11-01 19:35:16 +00:00
const isClimbing = await rpc.callClient(player, 'getIsClimbing');
2018-11-01 12:43:41 +00:00
```
**_That's it!_** No extra code to sort out who is asking for what, or setting up multiple events on each side just to send a single piece of data back to the caller.
---
2018-11-01 12:47:02 +00:00
### CEF to Server
2018-11-01 12:43:41 +00:00
**Situation:** A CEF instance wants a list of all vehicle license plates directly from the server.
2018-11-01 19:35:16 +00:00
##### Server-side
```javascript
constrpc = require('rage-rpc');
rpc.register('getAllLicensePlates', () => mp.vehicles.toArray().map(vehicle => vehicle.numberPlate));
```
##### Client-side
```javascript
// even if not using RPC on the client, it must be required somewhere before CEF can send any events
require('rage-rpc');
```
2018-11-01 12:43:41 +00:00
##### Browser
```javascript
2018-11-01 19:35:16 +00:00
const rpc = require('rage-rpc');
2018-11-01 12:43:41 +00:00
2018-11-01 19:35:16 +00:00
rpc.callServer('getAllLicensePlates').then(plates => {
2018-11-01 12:43:41 +00:00
alert(plates.join(', '));
});
```
2018-11-01 19:35:16 +00:00
With `rage-rpc`, CEF can directly communicate with the server and vice-versa, without having to pass everything through the client-side JS.
###### In vanilla RAGE, you would have to set up multiple events for sending/receiving on the client-side, call them from CEF, then resend the data to the server and back. It's a huge hassle.
---
### Client to Server
**Situation:** Give the clients/CEF the ability to log to the server's console.
##### Server-side
2018-11-01 12:43:41 +00:00
```javascript
2018-11-01 19:35:16 +00:00
const rpc = require('rage-rpc');
rpc.register('log', (message, info) => {
/*
the second argument, info, gives information about the request such as
- the internal ID of the request
- the environment in which the request was sent (server, client, or cef)
- the player who sent the request, if any
*/
console.log(info.player.name+': '+message);
});
2018-11-01 12:43:41 +00:00
```
2018-11-01 19:35:16 +00:00
##### Client-side OR Browser
2018-11-01 12:43:41 +00:00
```javascript
2018-11-01 19:35:16 +00:00
const rpc = require('rage-rpc');
function log(message){
return rpc.callServer('log', message);
}
2018-11-01 12:43:41 +00:00
2018-11-01 19:35:16 +00:00
// send it and forget it
log("Hello, Server!");
// send it again, but make sure it was successfully received
log("Hello again!").then(() => {
// the server acknowledged and processed the message
}).catch(() => {
// the message either timed out or the procedure was never registered
2018-11-01 12:43:41 +00:00
});
```
2018-11-01 19:35:16 +00:00
Note that once any side of the game registers a procedure, any context can immediately start accessing it. You could call `rpc.callServer('log', message);` from any CEF instance or anywhere in the client without any further setup.