/* * SV_SpawnServer * Change the server to a new map, taking all connected clients along with it. */ static void SV_SpawnServer( const char *server, qboolean devmap ) { unsigned checksum; int i; if( devmap ) Cvar_ForceSet( "sv_cheats", "1" ); Cvar_FixCheatVars(); Com_Printf( "------- Server Initialization -------\n" ); Com_Printf( "SpawnServer: %s\n", server ); svs.spawncount++; // any partially connected client will be restarted Com_SetServerState( ss_dead ); // wipe the entire per-level structure memset( &sv, 0, sizeof( sv ) ); SV_ResetClientFrameCounters(); svs.realtime = 0; svs.gametime = 0; SV_UpdateActivity(); Q_strncpyz( sv.mapname, server, sizeof( sv.mapname ) ); SV_SetServerConfigStrings(); sv.nextSnapTime = 1000; Q_snprintfz( sv.configstrings[CS_WORLDMODEL], sizeof( sv.configstrings[CS_WORLDMODEL] ), "maps/%s.bsp", server ); CM_LoadMap( svs.cms, sv.configstrings[CS_WORLDMODEL], qfalse, &checksum ); Q_snprintfz( sv.configstrings[CS_MAPCHECKSUM], sizeof( sv.configstrings[CS_MAPCHECKSUM] ), "%i", checksum ); // reserve the first modelIndexes for inline models for( i = 1; i < CM_NumInlineModels( svs.cms ); i++ ) Q_snprintfz( sv.configstrings[CS_MODELS + i], sizeof( sv.configstrings[CS_MODELS + i] ), "*%i", i ); // set serverinfo variable Cvar_FullSet( "mapname", sv.mapname, CVAR_SERVERINFO | CVAR_READONLY, qtrue ); // // spawn the rest of the entities on the map // // precache and static commands can be issued during // map initialization sv.state = ss_loading; Com_SetServerState( sv.state ); // set purelist SV_ReloadPureList(); // load and spawn all other entities ge->InitLevel( sv.mapname, CM_EntityString( svs.cms ), CM_EntityStringLen( svs.cms ), 0, svs.gametime, svs.realtime ); // run two frames to allow everything to settle ge->RunFrame( svc.snapFrameTime, svs.gametime ); ge->RunFrame( svc.snapFrameTime, svs.gametime ); SV_CreateBaseline(); // create a baseline for more efficient communications // all precaches are complete sv.state = ss_game; Com_SetServerState( sv.state ); Com_Printf( "-------------------------------------\n" ); }
/* * SV_InitGameProgs * * Init the game subsystem for a new map */ void SV_InitGameProgs( void ) { int apiversion; game_import_t import; void *( *builtinAPIfunc )(void *) = NULL; char manifest[MAX_INFO_STRING]; #ifdef GAME_HARD_LINKED builtinAPIfunc = GetGameAPI; #endif // unload anything we have now if( ge ) SV_ShutdownGameProgs(); sv_gameprogspool = _Mem_AllocPool( NULL, "Game Progs", MEMPOOL_GAMEPROGS, __FILE__, __LINE__ ); // load a new game dll import.Print = PF_dprint; import.Error = PF_error; import.GameCmd = PF_GameCmd; import.inPVS = PF_inPVS; import.CM_TransformedPointContents = PF_CM_TransformedPointContents; import.CM_TransformedBoxTrace = PF_CM_TransformedBoxTrace; import.CM_RoundUpToHullSize = PF_CM_RoundUpToHullSize; import.CM_NumInlineModels = PF_CM_NumInlineModels; import.CM_InlineModel = PF_CM_InlineModel; import.CM_InlineModelBounds = PF_CM_InlineModelBounds; import.CM_ModelForBBox = PF_CM_ModelForBBox; import.CM_OctagonModelForBBox = PF_CM_OctagonModelForBBox; import.CM_AreasConnected = PF_CM_AreasConnected; import.CM_SetAreaPortalState = PF_CM_SetAreaPortalState; import.CM_BoxLeafnums = PF_CM_BoxLeafnums; import.CM_LeafCluster = PF_CM_LeafCluster; import.CM_LeafArea = PF_CM_LeafArea; import.Milliseconds = Sys_Milliseconds; import.ModelIndex = SV_ModelIndex; import.SoundIndex = SV_SoundIndex; import.ImageIndex = SV_ImageIndex; import.SkinIndex = SV_SkinIndex; import.ConfigString = PF_ConfigString; import.GetConfigString = PF_GetConfigString; import.PureSound = PF_PureSound; import.PureModel = PF_PureModel; import.FS_FOpenFile = FS_FOpenFile; import.FS_Read = FS_Read; import.FS_Write = FS_Write; import.FS_Print = FS_Print; import.FS_Tell = FS_Tell; import.FS_Seek = FS_Seek; import.FS_Eof = FS_Eof; import.FS_Flush = FS_Flush; import.FS_FCloseFile = FS_FCloseFile; import.FS_RemoveFile = FS_RemoveFile; import.FS_GetFileList = FS_GetFileList; import.FS_FirstExtension = FS_FirstExtension; import.FS_MoveFile = FS_MoveFile; import.FS_IsUrl = FS_IsUrl; import.FS_FileMTime = FS_BaseFileMTime; import.FS_RemoveDirectory = FS_RemoveDirectory; import.Mem_Alloc = PF_MemAlloc; import.Mem_Free = PF_MemFree; import.Dynvar_Create = Dynvar_Create; import.Dynvar_Destroy = Dynvar_Destroy; import.Dynvar_Lookup = Dynvar_Lookup; import.Dynvar_GetName = Dynvar_GetName; import.Dynvar_GetValue = Dynvar_GetValue; import.Dynvar_SetValue = Dynvar_SetValue; import.Dynvar_AddListener = Dynvar_AddListener; import.Dynvar_RemoveListener = Dynvar_RemoveListener; import.Cvar_Get = Cvar_Get; import.Cvar_Set = Cvar_Set; import.Cvar_SetValue = Cvar_SetValue; import.Cvar_ForceSet = Cvar_ForceSet; import.Cvar_Value = Cvar_Value; import.Cvar_String = Cvar_String; import.Cmd_Argc = Cmd_Argc; import.Cmd_Argv = Cmd_Argv; import.Cmd_Args = Cmd_Args; import.Cmd_AddCommand = Cmd_AddCommand; import.Cmd_RemoveCommand = Cmd_RemoveCommand; import.ML_Update = ML_Update; import.ML_GetMapByNum = ML_GetMapByNum; import.ML_FilenameExists = ML_FilenameExists; import.ML_GetFullname = ML_GetFullname; import.Cmd_ExecuteText = Cbuf_ExecuteText; import.Cbuf_Execute = Cbuf_Execute; import.FakeClientConnect = SVC_FakeConnect; import.DropClient = PF_DropClient; import.GetClientState = PF_GetClientState; import.ExecuteClientThinks = SV_ExecuteClientThinks; import.LocateEntities = SV_LocateEntities; import.asGetAngelExport = Com_asGetAngelExport; import.GetStatQueryAPI = PF_StatQuery_GetAPI; import.MM_SendQuery = SV_MM_SendQuery; import.MM_GameState = SV_MM_GameState; // clear module manifest string assert( sizeof( manifest ) >= MAX_INFO_STRING ); memset( manifest, 0, sizeof( manifest ) ); if( builtinAPIfunc ) { ge = builtinAPIfunc( &import ); } else { ge = (game_export_t *)Com_LoadGameLibrary( "game", "GetGameAPI", &module_handle, &import, false, manifest ); } if( !ge ) Com_Error( ERR_DROP, "Failed to load game DLL" ); AC_LoadLibrary( (void *) &import, (void *) ge, ANTICHEAT_SERVER ); // impulZ: Refire AC Init apiversion = ge->API(); if( apiversion != GAME_API_VERSION ) { Com_UnloadGameLibrary( &module_handle ); Mem_FreePool( &sv_gameprogspool ); ge = NULL; Com_Error( ERR_DROP, "Game is version %i, not %i", apiversion, GAME_API_VERSION ); } Cvar_ForceSet( "sv_modmanifest", manifest ); SV_SetServerConfigStrings(); ge->Init( time( NULL ), svc.snapFrameTime, APP_PROTOCOL_VERSION, APP_DEMO_EXTENSION_STR ); }