/** * @brief */ static void Frame(const uint32_t msec) { Cbuf_Execute(); if (threads->modified) { threads->modified = false; Thread_Shutdown(); Thread_Init(threads->integer); } if (game->modified) { game->modified = false; Fs_SetGame(game->string); if (Fs_Exists("autoexec.cfg")) { Cbuf_AddText("exec autoexec.cfg\n"); Cbuf_Execute(); } } Sv_Frame(msec); Cl_Frame(msec); }
/* * @brief Entry point for spawning a new server or changing maps / demos. Brings any * connected clients along for the ride by broadcasting a reconnect before * clearing state. Special effort is made to ensure that a locally connected * client sees the reconnect message immediately. */ void Sv_InitServer(const char *server, sv_state_t state) { #ifdef BUILD_CLIENT extern void Cl_Disconnect(void); #endif char path[MAX_QPATH]; Com_Debug("Sv_InitServer: %s (%d)\n", server, state); Cbuf_CopyToDefer(); // ensure that the requested map or demo exists if (state == SV_ACTIVE_DEMO) g_snprintf(path, sizeof(path), "demos/%s.dem", server); else g_snprintf(path, sizeof(path), "maps/%s.bsp", server); if (!Fs_Exists(path)) { Com_Print("Couldn't open %s\n", path); return; } // inform any connected clients to reconnect to us Sv_ShutdownMessage("Server restarting...\n", true); #ifdef BUILD_CLIENT // disconnect any local client, they'll immediately reconnect Cl_Disconnect(); #endif // clear the sv_server_t structure Sv_ClearState(); Com_Print("Server initialization...\n"); // initialize the clients, loading the game module if we need it Sv_InitClients(); // load the map or demo and related media Sv_LoadMedia(server, state); sv.state = state; Sb_Init(&sv.multicast, sv.multicast_buffer, sizeof(sv.multicast_buffer)); Com_Print("Server initialized\n"); Com_InitSubsystem(Q2W_SERVER); svs.initialized = true; }
/* * @brief */ void Sys_OpenLibrary(const char *name, void **handle) { *handle = NULL; #if defined(_WIN32) char *so_name = va("%s.dll", name); #else char *so_name = va("%s.so", name); #endif if (Fs_Exists(so_name)) { char path[MAX_OS_PATH]; g_snprintf(path, sizeof(path), "%s%c%s", Fs_RealDir(so_name), G_DIR_SEPARATOR, so_name); Com_Print("Trying %s...\n", path); if ((*handle = dlopen(path, RTLD_NOW))) return; Com_Error(ERR_DROP, "%s\n", dlerror()); } Com_Error(ERR_DROP, "Couldn't find %s\n", so_name); }
/* * @brief Captures a screenshot, writing it to the user's directory. */ void R_Screenshot_f(void) { static uint16_t last_screenshot; char filename[MAX_OS_PATH]; uint16_t i; // find a file name to save it to for (i = last_screenshot; i < MAX_SCREENSHOTS; i++) { g_snprintf(filename, sizeof(filename), "screenshots/quetoo%03u.jpg", i); if (!Fs_Exists(filename)) break; // file doesn't exist } if (i == MAX_SCREENSHOTS) { Com_Warn("Failed to create %s\n", filename); return; } last_screenshot = i; // save for next call const uint32_t width = r_context.width; const uint32_t height = r_context.height; byte *buffer = Mem_Malloc(width * height * 3); glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer); const int32_t quality = Clamp(r_screenshot_quality->integer, 0, 100); if (Img_WriteJPEG(filename, buffer, width, height, quality)) { Com_Print("Saved %s\n", Basename(filename)); } else { Com_Warn("Failed to write %s\n", filename); } Mem_Free(buffer); }
/* * @brief Returns true if the file exists, otherwise it attempts to start a download * from the server. */ _Bool Cl_CheckOrDownloadFile(const char *filename) { char cmd[MAX_STRING_CHARS]; if (cls.state == CL_DISCONNECTED) { Com_Print("Not connected\n"); return true; } if (IS_INVALID_DOWNLOAD(filename)) { Com_Warn("Refusing to download \"%s\"\n", filename); return true; } Com_Debug("Checking for %s\n", filename); if (Fs_Exists(filename)) { // it exists, no need to download return true; } Com_Debug("Attempting to download %s\n", filename); strncpy(cls.download.name, filename, sizeof(cls.download.name)); // udp downloads to a temp name, and only renames when done StripExtension(cls.download.name, cls.download.tempname); g_strlcat(cls.download.tempname, ".tmp", sizeof(cls.download.tempname)); // attempt an http download if available if (cls.download_url[0] && Cl_HttpDownload()) return false; // check to see if we already have a tmp for this file, if so, try to resume // open the file if not opened yet if (Fs_Exists(cls.download.tempname)) { // a temp file exists, resume download int64_t len = Fs_Load(cls.download.tempname, NULL); if ((cls.download.file = Fs_OpenAppend(cls.download.tempname))) { if (Fs_Seek(cls.download.file, len - 1)) { // give the server the offset to start the download Com_Debug("Resuming %s...\n", cls.download.name); g_snprintf(cmd, sizeof(cmd), "download %s %u", cls.download.name, (uint32_t) len); Net_WriteByte(&cls.net_chan.message, CL_CMD_STRING); Net_WriteString(&cls.net_chan.message, cmd); return false; } } } // or start if from the beginning Com_Debug("Downloading %s...\n", cls.download.name); g_snprintf(cmd, sizeof(cmd), "download %s", cls.download.name); Net_WriteByte(&cls.net_chan.message, CL_CMD_STRING); Net_WriteString(&cls.net_chan.message, cmd); return false; }