Clients can only do “Run on Server” RPC’s from Actors that the Client already own.
The Server owns the GameState therefore you can’t make any use of “Run on Server” events.
The GameState should only be used in conjunction with the GameMode class to replicate variables or make Multicast RPC’s to the clients.
GameMode is used for server internal logic and GameState is used to let the clients see what the server is doing.
You might have the wrong perception of what Replication is.
Replication is when the Server has spawned an Actor and it is “mirrored” onto the Clients.
Clients have no control on replication but they can make “Run on Owner” Events ONLY on the Actors and it’s Components that the Client already is the net-owner of.
If a Client spawns an Actor even if it is replicated nothing happens because the Client can’t Replicate anything. RPC’s also won’t work at all.
If the server already has all the information it needs (which it often does) then it will work fine with replicating everything through the GameState but if the Client needs to make an “Run on Server” event you have several options.
Use the PlayerController, PlayerState or Possessed Character Actor.
You can also let the Server Spawn a new Actor per player and use that. To ensure every player gets an Actor each you can Spawn on BeginPlay of the PlayerController when having Authority (Server side). It is important while spawning this Actor to set the PlayerController as the Owner of the new Actor otherwise “Run on Server” RPC’s won’t work.
Alternatively you can add a replicated Component to any of the Above Actors as it will inherit the ownership from it’s parent Actor.
Note that if you use the PlayerController or Components attached to the PlayerController you will not be able to use Multicast RPC’s or replicate any variables for other clients to receive because the PlayerController replication mode is set to “Only Relevant to Owner”.