Look into Remote Procedure Calls and the UFUNCTION specifiers associated with them (NetMulticast, Client, Server). Generally speaking, if you want to fire the function on the server and all connected clients, NetMulticast. If you want to fire the RPC on just the server, use Server. If you want to fire on just a specific Client, use Client. When calling functions on a specific client from the server, you’ll want to do so via that client’s PlayerController. The server has access to all the player controllers, and you can iterate through them in the following way:
for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
// AMyPlayerControllerClass derives from APlayerController
AMyPlayerControllerClass* PC = Cast<AMyPlayerControllerClass>(*It);
// If the PC belongs to the client you want to execute on, call said Client function
Of course, depending on where the client function you want to call lives in your code (your classes that derive from APawn/ACharacter/AHUD/etc), you’ll need to get to these objects from the player controller. For example, if my Client RPC is called Foo() and lives in the ACharacter class of my game, I might call something like this inside of MyPlayerControllerClass:
AMyCharacterClass* MyPawn = Cast<MyCharacterClass>(GetPawn());
I hope this helps.