Here’s the thing. BeginPlay fires on both server and client. That’s why you have SwitchHasAuthoirty which makes an execution path for the server (Authority pin), and one for client (Remote pin), though that statement is only valid if the actor is replicated. Also you shouldn’t need to use RPCs at all. You are already on server, why have ServerBeginPlay event as a server RPC? That will make it 100% drop on clients, as they don’t own WaterSplashes actor.
So here’s what you need to do:
Make sure WaterSplashes actor is replicated.
Make ServerBeginPlay event a regular non-replicated event.
Before GetGameMode and casting to yours (and after creating your dynamic material instance) do a SwitchHasAuthority with authority pin so you’re on server. As I said before BeginPlay fires on both server and client, and GameMode is server-only, thus at the current state you’ll get a null GameMode client-side and thus a failing cast. I strongly suggest checking this.