/* * SCR_PlayCinematic */ static void SCR_PlayCinematic( const char *arg, int flags ) { struct cinematics_s *cin; CL_SoundModule_Clear(); cin = CIN_Open( arg, 0, qfalse, qtrue ); if( !cin ) { Com_Printf( "SCR_PlayCinematic: couldn't find %s\n", arg ); return; } CL_Disconnect( NULL ); cl.cin.h = cin; cl.cin.keepRatio = (flags & 1) ? qfalse : qtrue; cl.cin.allowConsole = (flags & 2) ? qfalse : qtrue; cl.cin.paused = qfalse; cl.cin.absStartTime = cl.cin.absCurrentTime = cl.cin.absPrevTime = SCR_CinematicTime(); cl.cin.currentTime = 0; CL_SetClientState( CA_CINEMATIC ); CL_SoundModule_StopAllSounds(); SCR_EndLoadingPlaque(); SCR_ReadNextCinematicFrame(); }
void cl_mm_connect_done( stat_query_t *query, qboolean success, void *customp ) { stat_query_section_t *root; Com_DPrintf( "CL_MM_Connect: %s\n", sq_api->GetRawResponse( query ) ); /* * ch : JSON API * { * ticket: [int] // 0 on error, > 0 on success * } */ if( !success ) CL_MM_ErrorMessage( qtrue, "MM Connect: StatQuery error" ); else { root = sq_api->GetRoot( query ); if( root != NULL ) cls.mm_ticket = (int)sq_api->GetNumber( root, "ticket" ); } CL_SetClientState( CA_CONNECTING ); Com_DPrintf("CL_MM_Connect: Using ticket %u\n", cls.mm_ticket); }
static void SetUpTestCase() { TEST_Init(); cl_genericPool = Mem_CreatePool("Client: Generic"); cp_campaignPool = Mem_CreatePool("Client: Local (per game)"); cp_campaign = Cvar_Get("cp_campaign", "main"); cp_missiontest = Cvar_Get("cp_missiontest", "0"); vid_imagePool = Mem_CreatePool("Vid: Image system"); r_state.active_texunit = &r_state.texunits[0]; R_FontInit(); UI_Init(); GAME_InitStartup(); OBJZERO(cls); Com_ParseScripts(false); Cmd_ExecuteString("game_setmode campaign"); Cmd_AddCommand("msgoptions_set", Cmd_Dummy_f); CL_SetClientState(ca_disconnected); cls.realtime = Sys_Milliseconds(); }
/** * @brief Activates the map render screen (ca_active) * @sa SCR_EndLoadingPlaque * @sa G_ClientBegin * @note EV_START */ void CL_StartGame (const eventRegister_t* self, dbuffer* msg) { const int isTeamPlay = NET_ReadByte(msg); /* init camera position and angles */ OBJZERO(cl.cam); VectorSet(cl.cam.angles, 60.0, 60.0, 0.0); VectorSet(cl.cam.omega, 0.0, 0.0, 0.0); cl.cam.zoom = 1.25; CL_ViewCalcFieldOfViewX(); Com_Printf("Starting the game...\n"); /* make sure selActor is null (after reconnect or server change this is needed) */ CL_ActorSelect(nullptr); /* center on first actor */ cl_worldlevel->modified = true; if (cl.numTeamList) { const le_t* le = cl.teamList[0]; CL_ViewCenterAtGridPosition(le->pos); } /* activate the renderer */ CL_SetClientState(ca_active); GAME_StartBattlescape(isTeamPlay); }
/** * The suite initialization function. * Returns zero on success, non-zero otherwise. */ static int UFO_InitSuiteCampaign (void) { TEST_Init(); cl_genericPool = Mem_CreatePool("Client: Generic"); cp_campaignPool = Mem_CreatePool("Client: Local (per game)"); cp_campaign = Cvar_Get("cp_campaign", "main", 0, NULL); cp_missiontest = Cvar_Get("cp_missiontest", "0", 0, NULL); vid_imagePool = Mem_CreatePool("Vid: Image system"); r_state.active_texunit = &r_state.texunits[0]; R_FontInit(); UI_Init(); OBJZERO(cls); Com_ParseScripts(qfalse); Cmd_AddCommand("msgoptions_set", Cmd_Dummy_f, NULL); cl_geoscape_overlay = Cvar_Get("cl_geoscape_overlay", "0", 0, NULL); cl_3dmap = Cvar_Get("cl_3dmap", "1", 0, NULL); CL_SetClientState(ca_disconnected); cls.realtime = Sys_Milliseconds(); return 0; }
/** * @brief Sets the @c cls.state to @c ca_disconnected and informs the server * @sa CL_Drop * @note Goes from a connected state to disconnected state * Sends a disconnect message to the server * This is also called on @c Com_Error, so it shouldn't cause any errors */ void CL_Disconnect (void) { if (cls.state < ca_connecting) return; Com_Printf("Disconnecting...\n"); /* send a disconnect message to the server */ if (!Com_ServerState()) { dbuffer msg; NET_WriteByte(&msg, clc_stringcmd); NET_WriteString(&msg, NET_STATE_DISCONNECT "\n"); NET_WriteMsg(cls.netStream, msg); /* make sure, that this is send */ NET_Wait(0); } NET_StreamFinished(cls.netStream); cls.netStream = nullptr; CL_ClearState(); S_Stop(); R_ShutdownModels(false); R_FreeWorldImages(); CL_SetClientState(ca_disconnected); CL_ClearBattlescapeEvents(); GAME_EndBattlescape(); }
/* * SCR_PlayCinematic */ static void SCR_PlayCinematic( const char *arg, int flags ) { struct cinematics_s *cin; bool has_ogg; bool yuv; float framerate; size_t name_size = strlen( "video/" ) + strlen( arg ) + 1; char *name = alloca( name_size ); if( strstr( arg, "/" ) == NULL && strstr( arg, "\\" ) == NULL ) { Q_snprintfz( name, name_size, "video/%s", arg ); } else { Q_snprintfz( name, name_size, "%s", arg ); } cin = CIN_Open( name, 0, 0, &yuv, &framerate ); if( !cin ) { Com_Printf( "SCR_PlayCinematic: couldn't find %s\n", name ); return; } has_ogg = CIN_HasOggAudio( cin ); CIN_Close( cin ); SCR_FinishCinematic(); CL_SoundModule_StopAllSounds( true, true ); cin = CIN_Open( name, 0, has_ogg ? CIN_NOAUDIO : 0, &yuv, &framerate ); if( !cin ) { Com_Printf( "SCR_PlayCinematic: (FIXME) couldn't find %s\n", name ); return; } if( has_ogg ) { CL_SoundModule_StartBackgroundTrack( CIN_FileName( cin ), NULL, 4 ); } cl.cin.h = cin; cl.cin.keepRatio = (flags & 1) ? false : true; cl.cin.allowConsole = (flags & 2) ? false : true; cl.cin.startTime = SCR_CinematicTime(); cl.cin.paused = false; cl.cin.pause_cnt = 0; cl.cin.yuv = yuv; cl.cin.framerate = framerate; CL_SetClientState( CA_CINEMATIC ); SCR_EndLoadingPlaque(); SCR_RunCinematic(); }
static void CL_Reconnect (void) { if (cls.reconnectTime == 0 || cls.reconnectTime > CL_Milliseconds()) return; Com_Printf("Reconnecting...\n"); CL_Disconnect(); CL_SetClientState(ca_connecting); /* otherwise we would time out */ cls.connectTime = CL_Milliseconds() - 1500; }
/* * SCR_PlayCinematic */ static void SCR_PlayCinematic( char *arg ) { int len; size_t name_size; static cinematics_t clientCin; cinematics_t *cin = cl.cin = &clientCin; roq_chunk_t *chunk = &cin->chunk; name_size = strlen( "video/" ) + strlen( arg ) + strlen( ".roq" ) + 1; cin->name = Mem_ZoneMalloc( name_size ); Q_snprintfz( cin->name, name_size, "video/%s", arg ); COM_DefaultExtension( cin->name, ".roq", name_size ); // nasty hack cin->s_rate = 22050; cin->s_width = 2; cin->width = cin->height = 0; cin->frame = 0; len = FS_FOpenFile( cin->name, &cin->file, FS_READ ); if( !cin->file || len < 1 ) { Com_Printf( "Couldn't find %s\n", cin->name ); SCR_StopCinematic(); return; } // read header RoQ_ReadChunk( cin ); if( chunk->id != RoQ_HEADER1 || chunk->size != RoQ_HEADER2 || chunk->argument != RoQ_HEADER3 ) { Com_Printf( "Invalid video file %s\n", cin->name ); SCR_StopCinematic(); return; } SCR_EndLoadingPlaque(); cin->headerlen = FS_Tell( cin->file ); cin->frame = 0; cin->pic = cin->pic_pending = SCR_ReadNextCinematicFrame(); cin->time = cls.realtime + 1; // add 1 msec so SCR_GetCinematicTime is also valid for early commands CL_SetClientState( CA_ACTIVE ); CL_SoundModule_StopAllSounds(); }
/** * @sa CL_Frame */ static void CL_SendCommand (void) { /* get new key events */ IN_SendKeyEvents(); /* process console commands */ Cbuf_Execute(); /* send intentions now */ CL_SendChangedUserinfos(); /* fix any cheating cvars */ Cvar_FixCheatVars(); switch (cls.state) { case ca_disconnected: /* if the local server is running and we aren't connected then connect */ if (Com_ServerState()) { cls.servername[0] = '\0'; cls.serverport[0] = '\0'; CL_SetClientState(ca_connecting); return; } break; case ca_connecting: if (CL_Milliseconds() - cls.connectTime > cl_connecttimeout->integer) { if (GAME_IsMultiplayer()) Com_Error(ERR_DROP, "Server is not reachable"); } break; case ca_connected: if (cls.waitingForStart) { if (CL_Milliseconds() - cls.waitingForStart > cl_connecttimeout->integer) { Com_Error(ERR_DROP, "Server aborted connection - the server didn't response in %is. You can try to increase the cvar cl_connecttimeout", cl_connecttimeout->integer / 1000); } else { SCR_DrawLoading(100); } } break; default: break; } }
/* * CL_ParseServerData */ static void CL_ParseServerData( msg_t *msg ) { const char *str, *gamedir; int i, sv_bitflags, numpure; int http_portnum; Com_DPrintf( "Serverdata packet received.\n" ); // wipe the client_state_t struct CL_ClearState(); CL_SetClientState( CA_CONNECTED ); // parse protocol version number i = MSG_ReadLong( msg ); if( i != APP_PROTOCOL_VERSION ) Com_Error( ERR_DROP, "Server returned version %i, not %i", i, APP_PROTOCOL_VERSION ); cl.servercount = MSG_ReadLong( msg ); cl.snapFrameTime = (unsigned int)MSG_ReadShort( msg ); // set extrapolation time to half snapshot time Cvar_ForceSet( "cl_extrapolationTime", va( "%i", (unsigned int)( cl.snapFrameTime * 0.5 ) ) ); cl_extrapolationTime->modified = qfalse; // base game directory str = MSG_ReadString( msg ); if( !str || !str[0] ) Com_Error( ERR_DROP, "Server sent an empty base game directory" ); if( !COM_ValidateRelativeFilename( str ) || strchr( str, '/' ) ) Com_Error( ERR_DROP, "Server sent an invalid base game directory: %s", str ); if( strcmp( FS_BaseGameDirectory(), str ) ) { Com_Error( ERR_DROP, "Server has different base game directory (%s) than the client (%s)", str, FS_BaseGameDirectory() ); } // game directory str = MSG_ReadString( msg ); if( !str || !str[0] ) Com_Error( ERR_DROP, "Server sent an empty game directory" ); if( !COM_ValidateRelativeFilename( str ) || strchr( str, '/' ) ) Com_Error( ERR_DROP, "Server sent an invalid game directory: %s", str ); gamedir = FS_GameDirectory(); if( strcmp( str, gamedir ) ) { // shutdown the cgame module first in case it is running for whatever reason // (happens on wswtv in lobby), otherwise precaches that are going to follow // will probably f**k up (like models trying to load before the world model) CL_GameModule_Shutdown(); if( !FS_SetGameDirectory( str, qtrue ) ) Com_Error( ERR_DROP, "Failed to load game directory set by server: %s", str ); ML_Restart( qtrue ); } // parse player entity number cl.playernum = MSG_ReadShort( msg ); // get the full level name Q_strncpyz( cl.servermessage, MSG_ReadString( msg ), sizeof( cl.servermessage ) ); sv_bitflags = MSG_ReadByte( msg ); if( cls.demo.playing ) { cls.reliable = ( sv_bitflags & SV_BITFLAGS_RELIABLE ); } else { if( cls.reliable != ( ( sv_bitflags & SV_BITFLAGS_RELIABLE ) != 0 ) ) Com_Error( ERR_DROP, "Server and client disagree about connection reliability" ); } // builting HTTP server port if( cls.httpbaseurl ) { Mem_Free( cls.httpbaseurl ); cls.httpbaseurl = NULL; } if( ( sv_bitflags & SV_BITFLAGS_HTTP ) != 0 ) { if( ( sv_bitflags & SV_BITFLAGS_HTTP_BASEURL ) != 0 ) { // read base upstream url cls.httpbaseurl = ZoneCopyString( MSG_ReadString( msg ) ); } else { http_portnum = MSG_ReadShort( msg ) & 0xffff; cls.httpaddress = cls.serveraddress; if( cls.httpaddress.type == NA_IP6 ) { cls.httpaddress.address.ipv6.port = BigShort( http_portnum ); } else { cls.httpaddress.address.ipv4.port = BigShort( http_portnum ); } if( http_portnum ) { if( cls.httpaddress.type == NA_LOOPBACK ) { cls.httpbaseurl = ZoneCopyString( va( "http://localhost:%hu/", http_portnum ) ); } else { cls.httpbaseurl = ZoneCopyString( va( "http://%s/", NET_AddressToString( &cls.httpaddress ) ) ); } } } } // pure list // clean old, if necessary Com_FreePureList( &cls.purelist ); // add new numpure = MSG_ReadShort( msg ); while( numpure > 0 ) { const char *pakname = MSG_ReadString( msg ); const unsigned checksum = MSG_ReadLong( msg ); Com_AddPakToPureList( &cls.purelist, pakname, checksum, NULL ); numpure--; } //assert( numpure == 0 ); // get the configstrings request CL_AddReliableCommand( va( "configstrings %i 0", cl.servercount ) ); cls.sv_pure = ( sv_bitflags & SV_BITFLAGS_PURE ) != 0; cls.sv_tv = ( sv_bitflags & SV_BITFLAGS_TVSERVER ) != 0; #ifdef PURE_CHEAT cls.sv_pure = qfalse; #endif // separate the printfs so the server message can have a color Com_Printf( S_COLOR_WHITE "\n" "=====================================\n" ); Com_Printf( S_COLOR_WHITE "%s\n\n", cl.servermessage ); }
/** * @brief Calls all reset functions for all subsystems like production and research * also initializes the cvars and commands * @sa CL_Init */ static void CL_InitLocal (void) { CL_SetClientState(ca_disconnected); cls.realtime = Sys_Milliseconds(); /* register our variables */ cl_introshown = Cvar_Get("cl_introshown", "0", CVAR_ARCHIVE, "Only show the intro once at the initial start"); cl_fps = Cvar_Get("cl_fps", "0", CVAR_ARCHIVE, "Show frames per second"); cl_log_battlescape_events = Cvar_Get("cl_log_battlescape_events", "1", 0, "Log all battlescape events to events.log"); cl_selected = Cvar_Get("cl_selected", "0", CVAR_NOSET, "Current selected soldier"); cl_connecttimeout = Cvar_Get("cl_connecttimeout", "25000", CVAR_ARCHIVE, "Connection timeout for multiplayer connects"); /* userinfo */ cl_name = Cvar_Get("cl_name", Sys_GetCurrentUser(), CVAR_USERINFO | CVAR_ARCHIVE, "Playername"); cl_teamnum = Cvar_Get("cl_teamnum", "1", CVAR_USERINFO | CVAR_ARCHIVE, "Preferred teamnum for multiplayer teamplay games"); cl_ready = Cvar_Get("cl_ready", "0", CVAR_USERINFO, "Ready indicator in the userinfo for tactical missions"); cl_msg = Cvar_Get("cl_msg", "2", CVAR_USERINFO | CVAR_ARCHIVE, "Sets the message level for server messages the client receives"); sv_maxclients = Cvar_Get("sv_maxclients", "1", CVAR_SERVERINFO, "If sv_maxclients is 1 we are in singleplayer - otherwise we are multiplayer mode (see sv_teamplay)"); masterserver_url = Cvar_Get("masterserver_url", MASTER_SERVER, CVAR_ARCHIVE, "URL of UFO:AI masterserver"); cl_map_debug = Cvar_Get("debug_map", "0", 0, "Activate realtime map debugging options - bitmask. Valid values are 0, 1, 3 and 7"); cl_le_debug = Cvar_Get("debug_le", "0", 0, "Activates some local entity debug rendering"); cl_trace_debug = Cvar_Get("debug_trace", "0", 0, "Activates some client side trace debug rendering"); cl_leshowinvis = Cvar_Get("cl_leshowinvis", "0", CVAR_ARCHIVE, "Show invisible local entities as null models"); /* register our commands */ Cmd_AddCommand("check_cvars", CL_CheckCvars_f, "Check cvars like playername and so on"); Cmd_AddCommand("targetalign", CL_ActorTargetAlign_f, N_("Target your shot to the ground")); Cmd_AddCommand("cl_setratiofilter", CL_SetRatioFilter_f, "Filter the resolution screen list with a ratio"); Cmd_AddCommand("cmd", CL_ForwardToServer_f, "Forward to server"); Cmd_AddCommand("cl_userinfo", CL_UserInfo_f, "Prints your userinfo string"); #ifdef ACTIVATE_PACKET_COMMAND /* this is dangerous to leave in */ Cmd_AddCommand("packet", CL_Packet_f, "Dangerous debug function for network testing"); #endif Cmd_AddCommand("quit", CL_Quit_f, "Quits the game"); Cmd_AddCommand("env", CL_Env_f); Cmd_AddCommand(CL_PRECACHE, CL_Precache_f, "Function that is called at mapload to precache map data"); Cmd_AddCommand(CL_SPAWNSOLDIERS, CL_SpawnSoldiers_f, "Spawns the soldiers for the selected teamnum"); Cmd_AddCommand(CL_STARTMATCH, CL_StartMatch_f, "Start the match once every player is ready"); Cmd_AddCommand("cl_configstrings", CL_ShowConfigstrings_f, "Print client configstrings to game console"); Cmd_AddCommand("cl_openurl", CL_OpenURL_f, "Opens the given url in a browser"); /* forward to server commands * the only thing this does is allow command completion * to work -- all unknown commands are automatically * forwarded to the server */ Cmd_AddCommand("say", nullptr, "Chat command"); Cmd_AddCommand("say_team", nullptr, "Team chat command"); Cmd_AddCommand("players", nullptr, "List of team and player name"); #ifdef DEBUG Cmd_AddCommand("debug_cgrid", Grid_DumpWholeClientMap_f, "Shows the whole client side pathfinding grid of the current loaded map"); Cmd_AddCommand("debug_croute", Grid_DumpClientRoutes_f, "Shows the whole client side pathfinding grid of the current loaded map"); Cmd_AddCommand("debug_listle", LE_List_f, "Shows a list of current know local entities with type and status"); Cmd_AddCommand("debug_listlm", LM_List_f, "Shows a list of current know local models"); /* forward commands again */ Cmd_AddCommand("debug_edictdestroy", nullptr, "Call the 'destroy' function of a given edict"); Cmd_AddCommand("debug_edictuse", nullptr, "Call the 'use' function of a given edict"); Cmd_AddCommand("debug_edicttouch", nullptr, "Call the 'touch' function of a given edict"); Cmd_AddCommand("debug_killteam", nullptr, "Kills a given team"); Cmd_AddCommand("debug_stunteam", nullptr, "Stuns a given team"); Cmd_AddCommand("debug_listscore", nullptr, "Shows mission-score entries of all team members"); Cmd_AddCommand("debug_statechange", nullptr, "Change the state of an edict"); #endif IN_Init(); CL_ServerEventsInit(); CL_CameraInit(); CL_BattlescapeRadarInit(); CLMN_InitStartup(); TUT_InitStartup(); PTL_InitStartup(); GAME_InitStartup(); WEB_InitStartup(); ACTOR_InitStartup(); TEAM_InitStartup(); TOTD_InitStartup(); HUD_InitStartup(); INV_InitStartup(); HTTP_InitStartup(); }