How should I construct a Match system for my game?

My goal is to make a Match system for my game.
In my game there are 2 modes: PvP and PvE.
When a match start, a custom character will spawn according to the player’s choice in the character selection. Then it will have custom movement system, spells,…
The PvE will take place on a reserved server but I want the PvP to take place in the same server (which functions is a lobby also).
When a match is created, it contains an ID, a list of the players in that match. The remote events/functions will be using that player list to create maps, signal spells, update the position of each player in that match (No FireAllClients, just FireClient to players in a match)

Most of the logic will be done on clientside including projectile, movement, visual effects. The server is only responsible for updating position, calculations, create match, signal spells to other client in a match, damage, etc…

Is that the right approach I should take ? Or is there another way which is more efficient ?
(No code needed, just feedbacks, I have already finished the core scripting, now is just the right approach)