The core technical challenge was ensuring a stable, low-latency 4-player cooperative experience. We built the entire game using a Server-Authoritative networking model.
Authority and Session Management
For every game-critical action our logic runs exclusively on the server, keeping the true state
of the game world to prevent cheating (although it is co-op, so this isn't a huge deal).
For the platform layer, I set up the Advanced Sessions plugin and Steam Online Subsystem to manage all player connections
and implement the listen server setup. This integration also allowed us to include a proximity chat using VOIP with sound
attenuation based on distance.
Communication: RPCs & RepNotifies
We managed network traffic by using two methods for execution requests and visual synchronization (anything outside of Unreal's transform syncs).
Remote Procedure Calls (RPCs) were used for client input and requests. A client would use an RPC (Runs on Server) call to
ask the server to perform an action (like an interaction) and check that it is valid to do so.
Replication Notifications (RepNotifies) were used for broadcasting results. Once the server validated the RPC, it would update
a replicated property and the OnRepNotify function would trigger the resulting cosmetic or state effects (animation, audio, sometimes collision) on all clients.
Local Input & Shared Player Data
We processed all direct, local player inputs (movement, camera control, UI interactions, etc.)
primarily on the PlayerController class. This is because it only exists locally on the owning client and the server, ensuring minimal latency
for the player's immediate actions.
We used the PlayerState class to reliably hold data that needs to be replicated to all players,
regardless of their connection status. This included the player's custom color and nametag.
View PlayerController Blueprint (Input Example) ↗