Get Actor Location returns the same value for every client in Multicast event

I am trying to add a delay to a sound being played in multiplayer to simulate realistic speed of sound. Currently I have a very simple testing blueprint that does not have any delays yet:


When “E” button is pressed it runs a server event.
All that the server event does is it runs a multicast event.
Which plays a sound for every player.

Now, I don’t really understand why it does work. I would expect for Get Actor Location node in multicast to return each player’s location. Instead it returns location of the character that initially started chain of events by pressing “E”. My sound is being played in the correct location for everyone thanks to that, but how do I get the location of the character that hears the sound so I can calculate the delay?

I believe that when you are printing the “Get Actor Location”, it is sending a reference of the “Get Actor Location” for the actor that executed the multicast, so what may be the local actor for the BP, might be a remote actor (the actor that called PlaySoundMulti). I am not completely sure about this, but it is a possibility.

Edit: I just read that you know that it is only sending location of the actor that started chain of events, perhaps instead of doing the “Get Actor Location” for self, you should do it for the player controller 0, or something similar.

The problem is that I don’t know which player index to use, I need it to run for every client in range but whatever I do to get some kind of a reference to the client the event is currently executing for, I always get the one that triggered it. And the multicast event definitely runs for every client, there are as many print lines as there are clients, but every time it has the coordinates of the one who pressed “E”, not the one the event is supposed to be currently executing on.

EDIT: got something new, if I set it to print object name, then it becomes obvious that it executes on different clients, it outputs different names. But the coordinates are wrong, for some reason it gets correct client name but wrong coords.

EDIT2: ok, I did something ridiculous just to see what’s going on, based on it returning correct names for clients, here is pseudo code instead of blueprint screenshot:

characters = GetAllActorsOfClass(MyCharacter);
foreach (character in characters) {
if( == { print(character.location); }

Still prints out wrong coordinates.
So it somehow associates clients with wrong coordinates. I am starting to think that someone who really understands how replication works could solve this issue very easily.

I got it to work by doing almost exactly what Jamendxman3 suggested, by using Get Player Character 0. I don’t understand why does it work perfectly fine in multiplayer for every player when I am explicitly telling it to use player 0. It would be great if someone could explain what’s going on there.

Well the player indexes have always been confusing for me, but from what I understand, 0 is always the local player index.