Actually Client to SurfaceGui is possible, just not through a ServerScript. What you will need is a LocalScript, the Brick where you want the Gui to appear with a unique name, and the Gui placed in StarterGui.
Within the LocalScript you would have to use the Adornee property of SurfaceGui in order to set the part the Gui should be showing on.
1 | script.Parent.Adornee = game.Workspace.PartWithUniqueName |
From there, since it looks like you have the bulk of your script set up, you can use the LocalPlayer value of Players to receive your player value. You can then send a signal to the server via RemoteEvent if you need the server to do something for you.
Hopefully this answered your question. If it did, do not forget to hit the accept answer button. Have any questions, feel free to post them in the comments below.