public override void SendClientMessages(bool sendSnapshots) { var receivingClients = new List <GameClient>(); foreach (var cl in Clients) { var client = (GameClient)cl; if (!client.ShouldSendMessage()) { continue; } Out.Debug("Write snapshot"); if (sendSnapshots && client.IsActive()) { receivingClients.Add(client); } else { // if client never send a netchannl packet yet, send ConnectionAccept because it could get lost in multiplayer if (client.NetChannel.GetSequenceNr(EFlowType.Incoming) == 0) { Networking.OutOfBandPrintf(Socket, client.NetChannel.GetRemoteAddress(), "{0}00000000000000", (char)EConnectionType.ConnectionAccept); } client.NetChannel.Transmit(); client.UpdateSendState(); } } if (receivingClients.Count > 0) { // if any client wants an update, take new snapshot now var snapshot = Program.FrameSnapshotManager.TakeTickSnapshot(TickCount); // copy temp ents references to pSnapshot CopyTempEntities(snapshot); foreach (var cl in receivingClients) { var frame = cl.GetSendFrame(); if (frame == null) { continue; } cl.SendSnapshot(frame); cl.UpdateSendState(); } snapshot.ReleaseRefrence(); } }
private void ConnectClient(EndPoint addr, int protocol, int authProtocol, int challenge, string name, string password) { if (name == null || password == null) { return; } if (!CheckChallengeNr(addr, challenge)) { RejectConnecton(addr, "Bad challenge.\n"); return; } if (!CheckIPConnectionReuse(addr)) { RejectConnecton(addr, "Too many pending connections.\n"); return; } if (!CheckIPRestrictions(addr)) { RejectConnecton(addr, "LAN servers are resticted to local clients only (class C).\n"); return; } if (!CheckPassword(addr, password)) { Console.WriteLine("Client \"{0}\" [{1}]: password failed.\n", name, addr); RejectConnecton(addr, "Bad password.\n"); return; } if (Clients.Count + 1 > Program.SvMaxPlayers) { RejectConnecton(addr, "Server is full.\n"); return; } var client = new GameClient(GetFreeSlot(), this); var channel = Networking.CreateChannel(Socket, name, addr, client); if (channel == null) { RejectConnecton(addr, "Failed to create net channel!\n"); return; } // set channel challenge channel.SetChallengeNr(challenge); // make sure client is reset and clear client.Connect(name, channel); client.SnapshotInterval = 1.0f / 20.0f; client.NextMessageTime = Networking.NetTime + client.SnapshotInterval; // add client to global list Clients.Add(client); // tell client connection worked, now use netchannels Networking.OutOfBandPrintf(Socket, addr, "{0}00000000000000", (char)EConnectionType.ConnectionAccept); Out.MsgC(ConsoleColor.Yellow, "Client \"{0}\" has connected from [{1}]", client.GetClientName(), channel.GetRemoteAddress()); }
public void RejectConnecton(EndPoint addr, string format, params object[] args) { var message = string.Format(format, args); Networking.OutOfBandPrintf(Socket, addr, "{0}{1}", (char)EConnectionType.ConnectionReject, message); }