Hey there @Mathrim! This is a bit of an odd one, as the construction script should be able to apply to server and client alike as long as the actor spawned is replicated and relevant. I had first thought this was a replication issue, then I recreated this and I couldn’t hit your issue at first until I realized if the construction script is active, setting the material after doesn’t work even on the server. Even with a Delay I couldn’t change the material unless I disabled the material change in the construction script.
Going to toy with this for a bit to see what I’m missing and get back to you.
Well you are calling a server function, to spawn an actor, that is replicated, so it spawns on the clients as well. But then you are setting a material, which by the way should not work like that, because the construction script is effectively run when the actor is spawned, so your material variable at that point still doesn’t have your selected value.
You could make your material variable RepNotify, and then in the OnRep function of it set the material. That way you can set it on the server and it will work as you expect it to work, and then when the variable gets replicated to the clients it will also apply the material change there
In general only the owner can destroy actors, so in multiplayer scenarios if an actor was spawned by the server, owned by the server, that means that the server has to destroy it. Since the actor is replicated, it will get destroyed on all clients as well
Multicast is for when you want the server to call a function on all clients. So the usual flow could look something like Client calls Run On Server function, and then the server does the logic and runs Multicast function to update the clients if needed. If you try to call a Multicast function from a client with no authority, then the multicast function is absorbed and is only run locally, which will cause issues, because the client will change its state to something potentially different than that of the server
Another thing, for the majority of the time, most gameplay logic should run only on the server. So I’m not sure what you’re doing right now, but it’s not really a sign of a well built architecture to have to call Destroy on a Server owned actor from a Client. Ideally, the logic that requires the Actor to be destroyed should be on the Server, and then the server just destroys its owned actor.
Usually destroying an actor on a client is only used for some spawned cosmetic actors maybe, or actors that are completely local to the client