public void SendPlayerUpdate(HeliSynchStru update) { if (inSession) { NetworkPacket packet = new NetworkPacket(); packet.Write((byte)MessageType.PlayerUpdatePosition); Type type = update.GetType(); FieldInfo [] fields = type.GetFields(); foreach (FieldInfo im in fields) { //im.GetValue ValueType tt = (ValueType)im.GetValue(update); packet.Write(tt); } peerObject.SendTo((int)PlayerID.AllPlayers, packet, 0, SendFlags.Sync | SendFlags.NoLoopback); } }
public void DataReceived(object sender, ReceiveEventArgs rea) { int senderID = rea.Message.SenderID; byte mType = (byte)rea.Message.ReceiveData.Read(typeof(byte)); MessageType messageType = (MessageType)mType; switch (messageType) { case MessageType.GameTime: { float stime = (float)rea.Message.ReceiveData.Read(typeof(float)); int timeCount = (int)rea.Message.ReceiveData.Read(typeof(int)); rea.Message.ReceiveData.Dispose(); if (timeCount == 0) { atime = stime; } else { timetable[timeCount - 1] = atime - stime; } if (timeCount == TC) { float delta = 0; for (int i = 0; i < TC - 1; ++i) { delta += timetable[i]; } delta = delta / (float)(TC - 1); } break; } case MessageType.ServerDown: { MessageBox.Show("Server is Down. bye bye"); Application.Exit(); break; } case MessageType.PlayerUpdatePosition: { HeliSynchStru temp = new HeliSynchStru(); Type type = temp.GetType(); FieldInfo [] fields = type.GetFields(); foreach (FieldInfo im in fields) { Type tt = im.FieldType; object tak = (object)rea.Message.ReceiveData.Read(tt); im.SetValue(temp, tak); } rea.Message.ReceiveData.Dispose(); lock (otherPlayers) { object playerObject = otherPlayers[senderID]; if (null == playerObject) { return; } RemotePlayer player = (RemotePlayer)playerObject; temp.position = (atime - temp.time) * temp.velocity + temp.position; temp.pmatrix.M41 = temp.position.X; temp.pmatrix.M42 = temp.position.Y; temp.pmatrix.M43 = temp.position.Z; player.heli.objectToSynch = temp; player.UpdateTime = DateTime.Now; player.Active = true; otherPlayers[senderID] = player; } break; } } }