You need to make event in your player controller (because it owns umg hud and its easy to access it from umg).
In widget you get owning player controller reference, call that event.
In player controller do Remote Procedure Call (RPC event) or “run on server event”, call that event from client side of player controller to server side of it.
Now server side COPY of your player controller should know you want posses something.
With that working send that request over to some blueprint that is your “gameplay logic engine”, i picked gameInstance for all that logic in my game.
And posses pawn from server side of that blueprint.
References to actors will not work while passed from client to server or from client to client, because client is actually on different computer than server, its confusing but parts of code that look like they are in same graph and same blueprint in fact are on different computers. So you must identify pawns in some other way than references. I keep integer index for them when i spawn them, integer is long enough to not worry with old unused anymore indexes, when i spawn i always do ++1 to last index.
There is built in index for players etc, but for some reason this never worked for me in multiplayer.