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)); } }