Well, the real question here is who owns the weapon that spawns the effect? You can see your own effects because you own the weapon, and thus the function that spawns the effects gets called for you. However, everyone else doesn't own that weapon, so function replication doesn't work.
How do you fix this? Variable replication always works. So what you do is have the server increment a variable (say an integer) which gets replicated to all clients. Those clients will recognize the changed value and spawn the effect themselves. Some code to help you understand:
Code:
var int FireOffset;
var int OldFireOffset;
replication
{
reliable if (bNetDirty && ROLE == ROLE_Authority)
FireOffset;
}
simulated function PostNetReceive()
{
if (FireOffset != OldFireOffset)
{
ClientFireWeapon();
OldFireOffset = FireOffset;
}
}
function ServerFireWeapon()
{
// ... fire weapon stuff
FireOffset++;
}
simulated function ClientFireWeapon()
{
// .. spawn effect here
}
PostNetReceive is where to deal with this type of situation. You want to keep the old value as I have or you'll see your fire effect being spawned continuously (why? I don't know. It seems that it should only replicate the values when they've changed). Hope that helps.