/** * @sa SV_Spawn_f */ static void SV_Begin_f (client_t *cl) { qboolean began; Com_DPrintf(DEBUG_SERVER, "Begin() from %s\n", cl->name); /* could be abused to respawn or cause spam/other mod-specific problems */ if (cl->state != cs_spawning) { Com_Printf("EXPLOIT: Illegal 'begin' from %s (already spawned), client dropped.\n", cl->name); SV_DropClient(cl, "Illegal begin\n"); return; } /* call the game begin function */ TH_MutexLock(svs.serverMutex); began = svs.ge->ClientBegin(cl->player); TH_MutexUnlock(svs.serverMutex); if (!began) { SV_DropClient(cl, "'begin' failed\n"); return; } SV_SetClientState(cl, cs_began); Cbuf_InsertFromDefer(); }
/* * Sv_Begin_f */ static void Sv_Begin_f(void) { Com_Debug("Begin() from %s\n", Sv_NetaddrToString(sv_client)); if (sv_client->state != SV_CLIENT_CONNECTED) { // catch duplicate spawns Com_Warn("Sv_Begin_f: Invalid Begin() from %s\n", Sv_NetaddrToString(sv_client)); Sv_KickClient(sv_client, NULL); return; } if (sv.state == SV_ACTIVE_DEMO) return; // handle the case of a level changing while a client was connecting if (strtoul(Cmd_Argv(1), NULL, 0) != svs.spawn_count) { Com_Debug("Sv_Begin_f: Stale spawn count from %s\n", Sv_NetaddrToString(sv_client)); Sv_New_f(); return; } sv_client->state = SV_CLIENT_ACTIVE; // call the game begin function svs.game->ClientBegin(sv_player); Cbuf_InsertFromDefer(); }
/** * @sa SV_Begin_f */ static void SV_StartMatch_f (client_t *cl) { Com_DPrintf(DEBUG_SERVER, "StartMatch() from %s\n", cl->name); if (cl->state != cs_spawned) { SV_DropClient(cl, "Invalid state\n"); return; } TH_MutexLock(svs.serverMutex); svs.ge->ClientStartMatch(cl->player); TH_MutexUnlock(svs.serverMutex); Cbuf_InsertFromDefer(); }
/* ================== SV_Begin_f ================== */ void SV_Begin_f(void){ Com_DPrintf("Begin() from %s\n", sv_client->name); // handle the case of a level changing while a client was connecting if(atoi(Cmd_Argv(1)) != svs.spawncount){ Com_Printf("SV_Begin_f from different level\n"); SV_New_f(); return; } sv_client->state = cs_spawned; // call the game begin function ge->ClientBegin(sv_player); Cbuf_InsertFromDefer(); }
/* ================== SV_Begin_f ================== */ void SV_Begin_f (void) { Com_DPrintf ("Begin() from %s\n", sv_client->name); // r1ch: could be abused to respawn or cause spam/other mod specific problems if (sv_client->state != cs_connected) { Com_Printf ("EXPLOIT: Illegal 'begin' from %s[%s] (already spawned), client dropped.\n", sv_client->name, NET_AdrToString (sv_client->netchan.remote_address)); SV_DropClient (sv_client); return; } // handle the case of a level changing while a client was connecting if ( atoi(Cmd_Argv(1)) != svs.spawncount ) { Com_Printf ("SV_Begin_f from different level\n"); SV_New_f (); return; } sv_client->state = cs_spawned; // call the game begin function ge->ClientBegin (sv_player); // Knightmare- set default player speeds here, if // the game DLL hasn't already set them #ifdef NEW_PLAYER_STATE_MEMBERS if (!sv_player->client->ps.maxspeed) sv_player->client->ps.maxspeed = DEFAULT_MAXSPEED; if (!sv_player->client->ps.duckspeed) sv_player->client->ps.duckspeed = DEFAULT_DUCKSPEED; if (!sv_player->client->ps.waterspeed) sv_player->client->ps.waterspeed = DEFAULT_WATERSPEED; if (!sv_player->client->ps.accel) sv_player->client->ps.accel = DEFAULT_ACCELERATE; if (!sv_player->client->ps.stopspeed) sv_player->client->ps.stopspeed = DEFAULT_STOPSPEED; #endif // end Knightmare Cbuf_InsertFromDefer (); }
/** * @brief */ static void Init(void) { SDL_Init(SDL_INIT_TIMER); Mem_Init(); Cmd_Init(); Cvar_Init(); verbose = Cvar_Add("verbose", "0", 0, "Print verbose debugging information"); dedicated = Cvar_Add("dedicated", "0", CVAR_NO_SET, "Run a dedicated server"); if (strstr(Sys_ExecutablePath(), "-dedicated")) { Cvar_ForceSet("dedicated", "1"); } if (dedicated->value) { Cvar_ForceSet("threads", "0"); } game = Cvar_Add("game", DEFAULT_GAME, CVAR_LATCH | CVAR_SERVER_INFO, "The game module name"); game->modified = g_strcmp0(game->string, DEFAULT_GAME); threads = Cvar_Add("threads", "0", CVAR_ARCHIVE, "Specifies the number of threads to create"); threads->modified = false; time_demo = Cvar_Add("time_demo", "0", CVAR_LO_ONLY, "Benchmark and stress test"); time_scale = Cvar_Add("time_scale", "1.0", CVAR_LO_ONLY, "Controls time lapse"); const char *s = va("Quetoo %s %s %s", VERSION, __DATE__, BUILD_HOST); Cvar_Add("version", s, CVAR_SERVER_INFO | CVAR_NO_SET, NULL); quetoo.Debug = Debug; quetoo.Error = Error; quetoo.Print = Print; quetoo.Verbose = Verbose; quetoo.Warn = Warn; Fs_Init(true); Thread_Init(threads->integer); Con_Init(); Cmd_Add("mem_stats", MemStats_f, CMD_SYSTEM, "Print memory stats"); Cmd_Add("debug", Debug_f, CMD_SYSTEM, "Control debugging output"); Cmd_Add("quit", Quit_f, CMD_SYSTEM, "Quit Quetoo"); Netchan_Init(); Sv_Init(); Cl_Init(); Com_Print("Quetoo %s %s %s initialized\n", VERSION, __DATE__, BUILD_HOST); // reset debug value since Cbuf may change it from Com's "all" init Com_SetDebug("0"); // execute any +commands specified on the command line Cbuf_InsertFromDefer(); Cbuf_Execute(); // dedicated server, nothing specified, use Edge if (dedicated->value && !Com_WasInit(QUETOO_SERVER)) { Cbuf_AddText("map edge\n"); Cbuf_Execute(); } }
/* ================= Qcommon_Init ================= */ void Qcommon_Init (int argc, char **argv) { static const char *apVersion = APPLICATION " v" VERSION " " CPUSTRING " " __DATE__ " " BUILDSTRING; if (setjmp (abortframe) ) Sys_Error ("Error during initialization"); z_chain.next = z_chain.prev = &z_chain; // prepare enough of the subsystems to handle // cvar and command buffer management COM_InitArgv (argc, argv); Swap_Init (); Cbuf_Init (); Cmd_Init (); Cvar_Init (); Key_Init (); // we need to add the early commands twice, because // a basedir or cddir needs to be set before execing // config files, but we want other parms to override // the settings of the config files Cbuf_AddEarlyCommands (false); Cbuf_Execute(); FS_InitFilesystem (); Cbuf_AddText ("exec default.cfg\n"); Cbuf_Execute(); Cbuf_AddText ("exec aprconfig.cfg\n"); Cbuf_Execute(); FS_ExecConfig("autoexec.cfg"); Cbuf_Execute(); Cbuf_AddEarlyCommands (true); Cbuf_Execute(); Cmd_AddCommand ("echo", Cmd_Echo_f); // init commands and vars Cmd_AddCommand ("z_stats", Z_Stats_f); Cmd_AddCommand( "z_check", Z_Check ); host_speeds = Cvar_Get ("host_speeds", "0", 0); developer = Cvar_Get ("developer", "0", 0); timescale = Cvar_Get ("timescale", "1", CVAR_CHEAT); fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT); logfile_active = Cvar_Get ("logfile", "0", 0); showtrace = Cvar_Get ("showtrace", "0", 0); #ifdef DEDICATED_ONLY dedicated = Cvar_Get ("dedicated", "1", CVAR_ROM); #else dedicated = Cvar_Get ("dedicated", "0", CVAR_NOSET); #endif timescale->OnChange = OnChange_Timescale; OnChange_Timescale(timescale, timescale->resetString); Cvar_Get ("version", apVersion, CVAR_SERVERINFO|CVAR_ROM); Cmd_AddMacro( "date", Com_Date_m ); Cmd_AddMacro( "time", Com_Time_m ); if (dedicated->integer) Cmd_AddCommand ("quit", Com_Quit); #ifndef NDEBUG Cmd_AddCommand( "error", Com_Error_f ); Cmd_AddCommand( "errordrop", Com_ErrorDrop_f ); Cmd_AddCommand( "freeze", Com_Freeze_f ); Cmd_AddCommand( "crash", Com_Crash_f ); #endif Sys_Init (); srand(Sys_Milliseconds()); NET_Init (); Netchan_Init (); SV_Init (); CL_Init (); ComInitialized = true; Cbuf_InsertFromDefer(); //Execute commands which was initialized after loading autoexec (ignore, highlight etc) FS_ExecConfig ("postinit.cfg"); Cbuf_Execute(); // add + commands from command line if (!Cbuf_AddLateCommands ()) { // if the user didn't give any commands, run default action if (!dedicated->integer) Cbuf_AddText ("toggleconsole\n"); else Cbuf_AddText ("dedicated_start\n"); Cbuf_Execute(); } else { // the user asked for something explicit // so drop the loading plaque SCR_EndLoadingPlaque(); } Com_Printf ("====== " APPLICATION " Initialized ======\n\n"); }