Looking through your source now.
First, please stop using GetPlayerController 0, you’ll see it in tutorials a lot and should rarely actually be used and many tutorials are made by people who hacked a solution and thought to share it, not experienced devs. Rule of thumb - if you can’t get a reference properly, you’re doing something wrong. It returns the first local player controller and that is rarely what you actually want - especially on the server.
In your case, you don’t really need to find a better way to get the player controller because this plugin wont work with an owner for reasons already mentioned.
This piece of code here is nasty:
// TODO: Is Unreal really going to make me send my own information back out to myself?
// look up a better way.
// If I own the object, don't sync it.
if (realObjectToSync->GetOwner() == UGameplayStatics::GetPlayerController(GetWorld(), 0))
{
return;
}
If the owner is a player controller, you can just check if it’s a local player controller, or even GetOwner()->GetNetConnection() != nullptr which pretty much works because of the entire problem you’re facing - no one else can call RPCs on it.
For this plugin to work, clients must not send their data. You really should simply be replicating the information and not multicasting it, it’s a waste of bandwidth. Replication is much more efficient.
That should do it