I’ll just keep dumping stuff until you guys ask me to stop :D. My issue may be completely distinct. If so, I’ll create a separate question.
Initially I thought this issue was purely disappearing proxies. I would spawn in a dedicated server, attempt to drive over to another player, and appear to be invisible. After some repetition and exploring I noticed that the proxy was visible, it was just in a very different location, as if the simulated proxy pawn had spawned in a different location from the autonomous and authoritative. It would move when and how I moved, but its initial orientation was wrong and its transform was not being corrected through replication, so the resulting position was very different.
If I destroy the authoritative pawn (which is invisible to the other client) then the respawned pawn and its proxies appear and move correctly to all parties.
I have to test this with a fresh, sample project, but I suspect that either a) the GameMode’s default pawn spawn mechanism is incorrectly setting the transform for simulated proxies or b) there is something peculiar about my pawn. Once my pawns are destroyed, their respawn is handled by a different implementation in a subclassed GameMode. I’m about to test a hack I hope will isolate the issue a bit more, where I force newly connected player controller pawns to be destroyed and respawned instantly in an effort to let my spawn implementation take over immediately.
Update: my initial spawn was a blueprint derived from my pawn class, whereas subsequent pawns were from the purely C++ base class. I didn’t notice this because the derived blueprint class doesn’t have any functionality. I’ve changed the GameMode respawn functionality to the SpawnDefaultPawnFor() function. Testing with a blueprint pawn causes the disappearing/diverging pawns, whereas a pure C++ pawn behaves as expected.