I’m working on a small game for my friends. So far i’ve gotten the Networking right, both players can fly around and it’s all in sync.
Now I’ve added projectiles (lasers) which I spawn like this:
if (_mou.LeftButton == ButtonState.Pressed
&& oldState.LeftButton
!= ButtonState.Released)
{
if (timeSinceShot > timePerShot)
{
timeSinceShot = 0;
bulletRotation = rotation; //Rotation of the players ship
laser.addLaser(myID, bulletRotation, localPosition);
}
}
This works fine, it fires the laser from my ship, but doesn’t get displayed yet.
Now when I fire I call this:
om.Write(bulletRotation); //Sends the rotation to the server
And when the server has received it, it sends it back to all players, including the one who shot.
Here’s how I receive the data on the client and write it to the lasers list:
if (who != myID)
{
try
{
float laserR = msg.ReadFloat();
laser.addLaser(who, laserR, player.players[i].position);
}
catch { }
}
Now when I test it on 2 clients and fire, I can see myself firing at the 2nd client which is good. However it not only fires on the 2nd client but also on my client’s 2nd player.
Edit: who is a RemoteUniqueIdentifier and myID is the clients RemoteUniqueIdentifier
Here’s a picture of my problem.
https://i.stack.imgur.com/CYJyW.png
(can’t upload it yet as I don’t have 10 rep.)
EDIT 2:
This is how the server send it’s data to all the players:
foreach (NetConnection player in server.Connections)
{
// ... send information about every other player (actually including self)
foreach (NetConnection otherPlayer in server.Connections)
{
// send position update about 'otherPlayer' to 'player'
NetOutgoingMessage om = server.CreateMessage();
// write who this position is for
om.Write(player.RemoteUniqueIdentifier);
om.Write(otherPlayer.RemoteUniqueIdentifier);
if (otherPlayer.Tag == null)
otherPlayer.Tag = new float[4];
float[] pos = otherPlayer.Tag as float[];
om.Write(pos[0]); // velocity X
om.Write(pos[1]); // velocity X
om.Write(pos[2]); // rotation
if (!noLasers)
{
om.Write(pos[3]); // bullet rotation
}
// send message
server.SendMessage(om, player, NetDeliveryMethod.Unreliable);
}
}
If
RemoteUniqueIdentifieris an object of some class, and you are trying to naively pass it through the wire, you will never be able to test local version and one you got from the server for equality.Reconstructed object on the ‘other side’ will always have a reference that can’t be compared with the original.
In that case, you might have an option to switch from
RemoteUniqueIdentifierto some immutable type such asintorGuid, evenstringwill work.