void GScr_RemoveBot(){ gentity_t *clEnt; clEnt = (gentity_t*)SV_RemoveBot(); if(clEnt) Scr_AddEntity(clEnt); }
/* ===================== SV_DropClient Called when the player is totally leaving the server, either willingly or unwillingly. This is NOT called if the entire server is quiting or crashing. ===================== */ void SV_DropClient (client_t *drop) { #ifdef MAUTH authclient_t *dropclient; #endif if (drop->bot) { SV_RemoveBot (drop); return; } // add the disconnect MSG_WriteByte (&drop->netchan.message, svc_disconnect); if (drop->state == cs_spawned) { if (!drop->spectator) { // call the prog function for removing a client // this will set the body to a dead frame, among other things pr_global_struct->self = EDICT_TO_PROG(drop->edict); PR_ExecuteProgram (pr_global_struct->ClientDisconnect); } else if (SpectatorDisconnect) { // call the prog function for removing a client // this will set the body to a dead frame, among other things pr_global_struct->self = EDICT_TO_PROG(drop->edict); PR_ExecuteProgram (SpectatorDisconnect); } } #ifdef MAUTH // remove client from auth queue... dropclient = SV_AuthListFind(&authclientq, Info_ValueForKey(drop->userinfo, "name")); if( dropclient ) SV_AuthListRemove (&authclientq, dropclient); #endif if (drop->spectator) Com_Printf ("Spectator %s removed\n",drop->name); else Com_Printf ("Client %s removed\n",drop->name); if (drop->download) { fclose (drop->download); drop->download = NULL; } if (drop->upload) { fclose (drop->upload); drop->upload = NULL; } *drop->uploadfn = 0; drop->state = cs_zombie; // become free in a few seconds drop->connection_started = svs.realtime; // for zombie timeout drop->old_frags = 0; drop->edict->v.frags = 0; // drop->edict->inuse = false; drop->name[0] = 0; memset (drop->userinfo, 0, sizeof(drop->userinfo)); SV_FreeDelayedPackets(drop); // send notification to all remaining clients SV_FullClientUpdate (drop, &sv.reliable_datagram); }