Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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;
            }
            }
        }