示例#1
0
        public static Packet ReadPacket(Stream stream)
        {
            var    packetType = stream.ReadByte();
            Packet packet     = null;

            switch (packetType)
            {
            case 1:
                packet = new RequestConnectPacket();
                packet.ReadPacketData(stream);
                return(packet);

            case 2:
                packet = new ConnectDecisionPacket();
                packet.ReadPacketData(stream);
                return(packet);

            case 3:
                packet = new InputPacket();
                packet.ReadPacketData(stream);
                return(packet);

            case 4:
                packet = new GameStatePacket();
                packet.ReadPacketData(stream);
                return(packet);

            default:
                throw new Exception("Unrecognized Packet Type");
            }
        }
 private void ReceiveStates(UdpClient c, IPEndPoint ip)
 {
     while (true)
     {
         var res = c.Receive(ref ip);
         lastNetworkReceived = DateTime.Now;
         var stream = new MemoryStream(res);
         var packet = new GameStatePacket();
         packet.ReadPacketData(stream);
         lock (ServerStateBufferLock)
             ServerStateBuffer.Add(packet);
     }
 }
        private void UpdateToState(GameStatePacket packet)
        {
            var usedIds = new HashSet <long>();

            foreach (var blackHole in packet.Blackholes)
            {
                var b = gravityObjects.FirstOrDefault(a => a.ID() == blackHole.ID());
                if (b != default(GravitationalField))
                {
                    b.state = new State {
                        v = b.state.v, x = blackHole.Position
                    };
                    b.mass = blackHole.Mass();
                }
                else
                {
                    b = new Blackhole(blackHole.Owner(), blackHole.Mass(), blackHole.Position);
                    gravityObjects.Add(b);
                    units.Add(b);
                }
                usedIds.Add(b.ID());
            }
            foreach (var planet in packet.Planets)
            {
                var p = gravityObjects.FirstOrDefault(a => a.ID() == planet.ID());
                if (p != default(GravitationalField))
                {
                    p.state = new State {
                        v = p.state.v, x = planet.Position()
                    };
                    p.bounds.Center = p.state.x;
                    p.mass          = planet.Mass();
                }
                else
                {
                    var randy = randall.Next(1, 8);
                    p = new Spheroid(planet.Position(), Vector3.Zero, planet.mass, planet.size, randall.Next(2, 40), randy == 1 ? "earth" : randy == 2 ? "mars" : randy == 3 ? "moon" : randy == 4 ? "neptune" : randy == 5 ? "uranus" : randy == 6 ? "venus" : "ganymede", null);
                    gravityObjects.Add(p);
                    units.Add(p);
                }
                usedIds.Add(p.ID());
            }
            gravityObjects = gravityObjects.Where(a => usedIds.Contains(a.ID())).ToList();
            units          = units.Where(a => usedIds.Contains(a.ID())).ToList();
            selectedUnits  = new HashSet <IUnit>(selectedUnits.Where(a => usedIds.Contains(a.ID())));
            if (!selectedUnits.Any())
            {
                selectedUnits.Add(units.First(a => a is Blackhole && ((Blackhole)a).Owner() == IsServer));
            }
        }
        private void SendStatePacket(bool guarentee = false)
        {
            var pack = new GameStatePacket()
            {
                Blackholes = gravityObjects.OfType <Blackhole>().ToList(),
                Planets    = gravityObjects.OfType <Spheroid>().ToList()
            };

            var dat = new List <byte>();

            pack.WritePacketData(dat);
            if (guarentee)
            {
                PacketQueue.Instance.AddPacket(pack);
            }
            else
            {
                client3.Send(dat.ToArray(), dat.Count,
                             new IPEndPoint(new IPAddress(ClientIP.Split('.').Select(byte.Parse).ToArray()), PORT3));
            }
        }