/// <summary> /// Host_ShutdownServer /// This only happens at the end of a game, not between levels /// </summary> public void ShutdownServer(Boolean crash) { if (!Server.IsActive) { return; } Server.sv.active = false; // stop all client sounds immediately if (Client.cls.state == cactive_t.ca_connected) { Client.Disconnect( ); } // flush any pending messages - like the score!!! var start = Timer.GetFloatTime( ); Int32 count; do { count = 0; for (var i = 0; i < Server.svs.maxclients; i++) { HostClient = Server.svs.clients[i]; if (HostClient.active && !HostClient.message.IsEmpty) { if (Network.CanSendMessage(HostClient.netconnection)) { Network.SendMessage(HostClient.netconnection, HostClient.message); HostClient.message.Clear( ); } else { Network.GetMessage(HostClient.netconnection); count++; } } } if ((Timer.GetFloatTime( ) - start) > 3.0) { break; } }while (count > 0); // make sure all the clients know we're disconnecting var writer = new MessageWriter(4); writer.WriteByte(ProtocolDef.svc_disconnect); count = Network.SendToAll(writer, 5); if (count != 0) { Console.Print("Host_ShutdownServer: NET_SendToAll failed for {0} clients\n", count); } for (var i = 0; i < Server.svs.maxclients; i++) { HostClient = Server.svs.clients[i]; if (HostClient.active) { Server.DropClient(crash); } } // // clear structures // Server.sv.Clear( ); for (var i = 0; i < Server.svs.clients.Length; i++) { Server.svs.clients[i].Clear( ); } }
/// <summary> /// Host_Kick_f /// Kicks a user off of the server /// </summary> private static void Kick_f() { if (Cmd.Source == cmd_source_t.src_command) { if (!Server.sv.active) { Cmd.ForwardToServer(); return; } } else if (Progs.GlobalStruct.deathmatch != 0 && !Host.HostClient.privileged) { return; } client_t save = Host.HostClient; bool byNumber = false; int i; if (Cmd.Argc > 2 && Cmd.Argv(1) == "#") { i = (int)Common.atof(Cmd.Argv(2)) - 1; if (i < 0 || i >= Server.svs.maxclients) { return; } if (!Server.svs.clients[i].active) { return; } Host.HostClient = Server.svs.clients[i]; byNumber = true; } else { for (i = 0; i < Server.svs.maxclients; i++) { Host.HostClient = Server.svs.clients[i]; if (!Host.HostClient.active) { continue; } if (Common.SameText(Host.HostClient.name, Cmd.Argv(1))) { break; } } } if (i < Server.svs.maxclients) { string who; if (Cmd.Source == cmd_source_t.src_command) { if (Client.cls.state == cactive_t.ca_dedicated) { who = "Console"; } else { who = Client.Name; } } else { who = save.name; } // can't kick yourself! if (Host.HostClient == save) { return; } string message = null; if (Cmd.Argc > 2) { message = Common.Parse(Cmd.Args); if (byNumber) { message = message.Substring(1); // skip the # message = message.Trim(); // skip white space message = message.Substring(Cmd.Argv(2).Length); // skip the number } message = message.Trim(); } if (!String.IsNullOrEmpty(message)) { Server.ClientPrint("Kicked by {0}: {1}\n", who, message); } else { Server.ClientPrint("Kicked by {0}\n", who); } Server.DropClient(false); } Host.HostClient = save; }