There is issue with teleport system where the true position according to the game’s system isn’t updated when a user is teleported.
The way it seems to work is, when a user is teleported, their visual position for users in the room goes to the new position, as well as for the player themselves. However the game still thinks the user is in their old position. Only after teleporting a 2nd time does the position truly update for the game system.
This is hugely breaking in many circumstances, e.g. if a user is teleported, and then another user is teleported to their position, the 2nd user will be sent to their old position rather than new one. Also, if a player is teleported, then a user joins the room, that user sees them in their old position visually causing mismatch in visuals.
What is “rid: string”? Does this not take a Position type argument? Also anyone know what’s up with calls that have both a “rid” field and a “room_id” field? From context it seems “rid” should mean “room_id.” Is that inaccurate, or is there really redundancy here?
You are correct; the TeleportRequest must include destination parameters in the payload. It should consist of x, y, z, and facing. Here is an example:
/**
* The request to teleport a user to a new destination.
*/
class TeleportRequest {
/**
* @param {string} userId - The ID of the user to teleport.
* @param {string} destination - The destination to teleport the user to.
* @param {string|null} rid - An optional request ID.
*/
constructor(userId, destination, rid = null) {
this.user_id = userId;
this.destination = destination;
this.rid = rid;
}
}
The request ID (rid) in the WebSocket is basically a randomly generated identifier that can be assigned every time you send a request or response. While it is not necessary to include, you may choose to keep it in case you intend to manage the specific request at a later point
What I personally do is keep a function that generates a random rid , and I call that function every time I make a request. Here is the function:
function generateRid() {
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var length = 8;
var rid = '';
for (var i = 0; i < length; i++) {
var randomIndex = Math.floor(Math.random() * characters.length);
rid += characters.charAt(randomIndex);
}
return rid;
}