Hello,
I have problems with server -> client synchronization
Server side
I have saved to the player other players id like this:
propagateGroupToItsMembers(broadcastToMembers: SimplePlayer[], group: Group | undefined): void {
const playersOnTheServer = RpgWorld.getPlayers();
playersOnTheServer
.filter(player => broadcastToMembers.find(member => member.id === player.id))
.forEach(player => {
player.group = group;
console.log('group propagated to player', player.id, player.name, player.group)
});
}
example schema:
{
id: '6id544',
owner: { id: 'pm6phv', name: 'Guest211' },
members: [
{ id: 'pm6phv', name: 'Guest211' },
{ id: 'cj5xie', name: 'Guest599' }
]
}
Client side
I implemented a custom react hook to fetch other player information like hp, and mana:
import { useCurrentPlayer, useObjects } from "@rpgjs/client/react";
import { Group } from "../server/src/managers/ServerGroupManager";
import { UnitInformationContract } from "../../unit-information/client/src/contracts/UnitInformationContract";
import { SimplePlayer } from "../server/src/managers/GroupManager";
export const useMembersInformation = (): Array<SimplePlayer | UnitInformationContract> => {
const objects: any[] = useObjects();
const currentPlayer = useCurrentPlayer();
const group = currentPlayer.group as Group;
if (!group || !group.id) {
console.log('there is no group');
return [];
}
return group.members
.filter((member: SimplePlayer) => member.id !== currentPlayer.id)
.map(member => {
const object = objects.find(object => object.id === member.id);
if (object) {
return object;
}
return member;
});
}
Issue: synchronization sometimes double players on the client side and sometimes keeps old data
Video:
I see that in the engine useObjects
and useCurrentPlayer
are marked as TODO
but I have no other idea how to get data of other players inside React GUI.