Problem with HUD only being valid on clients

Some background information in case it’s relevant: My project’s current setup is a main menu level that can host/join a session, a lobby level where players in the same session can choose a character before seamless travel to the actual gameplay level. Since it’s seamless, the gameplay level’s gamemode overrides HandleStartingNewPlayer_Implementation to spawn the pawn before having the controller possess it.

The authority is handled by the session host acting as the listen server. The widget I’m trying to implement is just a text that displays the player’s health and changes whenever OnTakeAnyDamage is called by the character it’s binded to. Once everyone gets control of their characters, only the clients have that widget attached to their viewport, but the listen-server player doesn’t get anything. The clients’ health display gets updated after damage is replicated, so I know that the widget itself is functional.

Currently the HUD holds the health userwidget, and the Controller class overrides AcknowledgePossession to tell the character to GetWorld()->GetFirstPlayerController()->GetHUD(), cast, and then call a function to create the widget and attach to viewport. This is most likely where the problems originate from.

The HUD class itself also only seems to be valid on clients and not the listen-server for some reason.

Also, is there a resource for best practices for handling UI in multiplayer? My goal was originally to implement the player health and then implement a system to display teammates’ healths the same way Deep Rock Galactic does it, and the simple stuff is already stumping me.