/* * G_Shutdown */ void G_Shutdown( void ) { int i; G_Printf( "==== G_Shutdown ====\n" ); G_asCallShutdownScript(); G_asShutdownGametypeScript(); SV_WriteIPList (); trap_Cvar_ForceSet( "nextmap", va( "map \"%s\"", G_SelectNextMapName() ) ); BOT_RemoveBot( "all" ); G_RemoveCommands(); G_FreeCallvotes(); G_LevelFreePool(); for( i = 0; i < game.numentities; i++ ) { if( game.edicts[i].r.inuse ) G_FreeEdict( &game.edicts[i] ); } G_Free( game.edicts ); G_Free( game.clients ); }
//============== // CG_RegisterTeamColor //============== void CG_RegisterTeamColor( int team ) { cvar_t *teamForceColor = NULL; int rgbcolor; int *forceColor; switch( team ) { case TEAM_ALPHA: { teamForceColor = cg_teamALPHAcolor; forceColor = &cgs.teamColor[TEAM_ALPHA]; } break; case TEAM_BETA: { teamForceColor = cg_teamBETAcolor; forceColor = &cgs.teamColor[TEAM_BETA]; } break; case TEAM_PLAYERS: default: { teamForceColor = cg_teamPLAYERScolor; forceColor = &cgs.teamColor[TEAM_PLAYERS]; } break; } if( teamForceColor->modified ) { // load default one if in team based gametype if( team >= TEAM_ALPHA ) { rgbcolor = COM_ReadColorRGBString( teamForceColor->dvalue ); if( rgbcolor != -1 ) { // won't be -1 unless some coder defines a weird cvar *forceColor = rgbcolor; } } // if there is a force color, update with it if( teamForceColor->string[0] ) { rgbcolor = COM_ReadColorRGBString( teamForceColor->string ); if( rgbcolor != -1 ) { *forceColor = rgbcolor; } else { trap_Cvar_ForceSet( teamForceColor->name, "" ); // didn't work, disable force color } } teamForceColor->modified = qfalse; } }
/* * G_Client_InactivityRemove */ void G_Client_InactivityRemove( gclient_t *client ) { if( !client ) return; // racesow if( !level.gametype.autoInactivityRemove ) return; // !racesow if( client->ps.pmove.pm_type != PM_NORMAL ) return; if( g_inactivity_maxtime->modified ) { if( g_inactivity_maxtime->value <= 0.0f ) trap_Cvar_ForceSet( "g_inactivity_maxtime", "0.0" ); else if( g_inactivity_maxtime->value < 15.0f ) trap_Cvar_ForceSet( "g_inactivity_maxtime", "15.0" ); g_inactivity_maxtime->modified = false; } if( g_inactivity_maxtime->value == 0.0f ) return; if( ( GS_MatchState() != MATCH_STATE_PLAYTIME ) || !level.gametype.removeInactivePlayers ) return; // inactive for too long if( client->level.last_activity && client->level.last_activity + ( g_inactivity_maxtime->value * 1000 ) < level.time ) { if( client->team >= TEAM_PLAYERS && client->team < GS_MAX_TEAMS ) { edict_t *ent = &game.edicts[ client - game.clients + 1 ]; // move to spectators and reset the queue time, effectively removing from the challengers queue G_Teams_SetTeam( ent, TEAM_SPECTATOR ); G_SpawnQueue_RemoveClient( ent ); // racesow - set player in free-view client->queueTimeStamp = 0; G_PrintMsg( NULL, "%s" S_COLOR_YELLOW " has been moved to spectator after %.1f seconds of inactivity\n", client->netname, g_inactivity_maxtime->value ); } } }
static void ApplyProfileButton( menucommon_t *unused ) { menucommon_t *menuitem; char cmd[MAX_QPATH + 5 + 1]; // store profile choice for UI menuitem = UI_MenuItemByName( "m_performance_profile" ); trap_Cvar_ForceSet( "ui_gfxprofile", va( "%i", menuitem->curvalue ) ); // execute profile Q_snprintfz( cmd, sizeof( cmd ), "exec profiles/gfx_%s.cfg\n", gfx_profiles[menuitem->curvalue] ); trap_Cmd_ExecuteText( EXEC_APPEND, cmd ); }
static void MapsList_ChooseMap( menucommon_t *menuitem ) { char path[MAX_CONFIGSTRING_CHARS + 6]; // wsw: Medar: could do this in not so ugly way m_listitem_t *item; menucommon_t *mapitem; char mapinfo[MAX_CONFIGSTRING_CHARS]; const char *mapname, *fullname; int id = ( menuitem ? menuitem->localdata[1] : mapList_cur_idx ); mapitem = UI_MenuItemByName( "m_startserver_map" ); if( mapitem ) Q_strncpyz( mapitem->title, "initial map", sizeof( mapitem->title ) ); mapList_suggested_gametype = 0; item = UI_FindItemInScrollListWithId( &mapList, id ); if( item && item->name ) { if( !trap_ML_GetMapByNum( (int)((size_t)item->data), mapinfo, sizeof( mapinfo ) ) ) return; mapname = mapinfo; fullname = mapinfo + strlen( mapname ) + 1; if( menuitem ) { mapList_cur_idx = id; trap_Cvar_ForceSet( "ui_startserver_lastselectedmap", "" ); } if( mapitem ) { Q_strncatz( mapitem->title, ": " S_COLOR_WHITE, sizeof( mapitem->title ) ); if( !trap_Cvar_Value( "ui_maplist_sortmethod" ) ) Q_strncatz( mapitem->title, mapname, sizeof( mapitem->title ) ); else Q_strncatz( mapitem->title, *fullname ? fullname : mapname, sizeof( mapitem->title ) ); } #ifdef SUGGEST_MAP_GAMETYPE mapList_suggested_gametype = SuggestGameType( mapname ); // if( m_gametypes_item ) // { // m_gametypes_item->curvalue = mapList_suggested_gametype; // M_GametypeFunc( m_gametypes_item ); // } #endif Q_snprintfz( path, sizeof( path ), "levelshots/%s.jpg", mapname ); s_levelshot = trap_R_RegisterLevelshot( path, trap_R_RegisterPic( PATH_UKNOWN_MAP_PIC ), NULL ); } }
static void G_Gametype_GENERIC_Init( void ) { trap_ConfigString( CS_GAMETYPETITLE, "Generic Deathmatch" ); trap_ConfigString( CS_GAMETYPEVERSION, "1.0" ); trap_ConfigString( CS_GAMETYPEAUTHOR, "Warsow Development Team" ); trap_Cvar_ForceSet( "g_gametype", "generic" ); level.gametype.spawnableItemsMask = ( IT_WEAPON|IT_AMMO|IT_ARMOR|IT_POWERUP|IT_HEALTH ); level.gametype.respawnableItemsMask = ( IT_WEAPON|IT_AMMO|IT_ARMOR|IT_POWERUP|IT_HEALTH ); level.gametype.dropableItemsMask = ( IT_WEAPON|IT_AMMO|IT_ARMOR|IT_POWERUP|IT_HEALTH ); level.gametype.pickableItemsMask = ( level.gametype.spawnableItemsMask|level.gametype.dropableItemsMask ); if( GS_Instagib() ) level.gametype.pickableItemsMask &= ~G_INSTAGIB_NEGATE_ITEMMASK; level.gametype.isTeamBased = false; level.gametype.isRace = false; level.gametype.isTutorial = false; level.gametype.inverseScore = false; level.gametype.hasChallengersQueue = false; level.gametype.maxPlayersPerTeam = 0; level.gametype.ammo_respawn = 20; level.gametype.armor_respawn = 25; level.gametype.weapon_respawn = 5; level.gametype.health_respawn = 25; level.gametype.powerup_respawn = 90; level.gametype.megahealth_respawn = 20; level.gametype.ultrahealth_respawn = 60; level.gametype.countdownEnabled = false; level.gametype.mathAbortDisabled = false; level.gametype.canForceModels = true; level.gametype.canShowMinimap = false; level.gametype.teamOnlyMinimap = true; level.gametype.spawnpointRadius = 256; level.gametype.canShowMinimap = false; level.gametype.teamOnlyMinimap = true; level.gametype.mmCompatible = false; if( GS_Instagib() ) level.gametype.spawnpointRadius *= 2; trap_ConfigString( CS_SCB_PLAYERTAB_LAYOUT, "%n 164 %i 64 %l 48 %p 18 %p 18" ); trap_ConfigString( CS_SCB_PLAYERTAB_TITLES, "Name Score Ping C R" ); }
// update the current servers rating static void g_serverRating( void ) { clientRating_t avg; if( !game.ratings ) { avg.rating = MM_RATING_DEFAULT; avg.deviation = MM_DEVIATION_DEFAULT; } else { Rating_AverageRating( &avg, game.ratings ); } // Com_Printf("g_serverRating: Updated server's skillrating to %f\n", avg.rating ); trap_Cvar_ForceSet( "sv_skillRating", va( "%.0f", avg.rating ) ); }
/* * G_Gametype_Init */ void G_Gametype_Init( void ) { bool changed = false; const char *mapGametype; g_gametypes_list = trap_Cvar_Get( "g_gametypes_list", "", CVAR_NOSET|CVAR_ARCHIVE ); G_Gametype_GenerateGametypesList(); // fill the g_gametypes_list cvar // empty string to allow all g_votable_gametypes = trap_Cvar_Get( "g_votable_gametypes", "", CVAR_ARCHIVE ); if( !g_gametype ) // first time initialized changed = true; g_gametype = trap_Cvar_Get( "g_gametype", "dm", CVAR_SERVERINFO|CVAR_ARCHIVE|CVAR_LATCH ); //get the match cvars too g_warmup_timelimit = trap_Cvar_Get( "g_warmup_timelimit", "5", CVAR_ARCHIVE ); g_postmatch_timelimit = trap_Cvar_Get( "g_postmatch_timelimit", "4", CVAR_ARCHIVE ); g_countdown_time = trap_Cvar_Get( "g_countdown_time", "5", CVAR_ARCHIVE ); g_match_extendedtime = trap_Cvar_Get( "g_match_extendedtime", "2", CVAR_ARCHIVE ); // game settings g_timelimit = trap_Cvar_Get( "g_timelimit", "10", CVAR_ARCHIVE ); g_scorelimit = trap_Cvar_Get( "g_scorelimit", "0", CVAR_ARCHIVE ); g_allow_falldamage = trap_Cvar_Get( "g_allow_falldamage", "1", CVAR_ARCHIVE ); g_allow_selfdamage = trap_Cvar_Get( "g_allow_selfdamage", "1", CVAR_ARCHIVE ); g_allow_teamdamage = trap_Cvar_Get( "g_allow_teamdamage", "1", CVAR_ARCHIVE ); g_allow_bunny = trap_Cvar_Get( "g_allow_bunny", "1", CVAR_ARCHIVE|CVAR_READONLY ); // map-specific gametype mapGametype = G_asCallMapGametype(); if( mapGametype[0] && G_Gametype_Exists( mapGametype ) ) trap_Cvar_Set( g_gametype->name, mapGametype ); // update latched gametype change if( g_gametype->latched_string ) { if( G_Gametype_Exists( g_gametype->latched_string ) ) { trap_Cvar_ForceSet( "g_gametype", va( "%s", g_gametype->latched_string ) ); changed = true; } else { G_Printf( "G_Gametype: Invalid new gametype, change ignored\n" ); trap_Cvar_ForceSet( "g_gametype", va( "%s", g_gametype->string ) ); } } if( !G_Gametype_Exists( g_gametype->string ) ) { G_Printf( "G_Gametype: Wrong value: '%s'. Setting up with default (dm)\n", g_gametype->string ); trap_Cvar_ForceSet( "g_gametype", "dm" ); changed = true; } G_Printf( "-------------------------------------\n" ); G_Printf( "Initalizing '%s' gametype\n", g_gametype->string ); if( changed ) { const char *configs_path = "configs/server/gametypes/"; G_InitChallengersQueue(); // print a hint for admins so they know there's a chance to execute a // config here, but don't show it as an error, because it isn't G_Printf( "loading %s%s.cfg\n", configs_path, g_gametype->string ); trap_Cmd_ExecuteText( EXEC_NOW, va( "exec %s%s.cfg silent\n", configs_path, g_gametype->string ) ); trap_Cbuf_Execute(); // on a listen server, override gametype-specific settings in config trap_Cmd_ExecuteText( EXEC_NOW, "vstr ui_startservercmd\n" ); trap_Cbuf_Execute(); } // fixme: we are doing this twice because the gametype may check for GS_Instagib G_CheckCvars(); // update GS_Instagib, GS_FallDamage, etc G_Gametype_SetDefaults(); // Init the current gametype if( !GT_asLoadScript( g_gametype->string ) ) G_Gametype_GENERIC_Init(); GS_SetGametypeName( g_gametype->string ); trap_ConfigString( CS_GAMETYPENAME, g_gametype->string ); G_CheckCvars(); // update GS_Instagib, GS_FallDamage, etc // ch : if new gametype has been initialized, transfer the // client-specific ratings to gametype-specific list if( changed ) G_TransferRatings(); }
/* * S_Init */ static qboolean S_Init( void *hwnd, int maxEntities, qboolean verbose ) { int numDevices; int userDeviceNum = -1; char *devices, *defaultDevice; cvar_t *s_openAL_device; alDevice = NULL; alContext = NULL; // get system default device identifier defaultDevice = ( char * )qalcGetString( NULL, ALC_DEFAULT_DEVICE_SPECIFIER ); if( !defaultDevice ) { Com_Printf( "Failed to get openAL default device\n" ); return qfalse; } s_openAL_device = trap_Cvar_Get( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice, CVAR_ARCHIVE|CVAR_LATCH_SOUND ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) { userDeviceNum = numDevices; // force case sensitive if( strcmp( s_openAL_device->string, devices ) ) trap_Cvar_ForceSet( "s_openAL_device", devices ); } } if( !numDevices ) { Com_Printf( "Failed to get openAL devices\n" ); return qfalse; } // the device assigned by the user is not available if( userDeviceNum == -1 ) { Com_Printf( "'s_openAL_device': incorrect device name, reseting to default\n" ); trap_Cvar_ForceSet( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) userDeviceNum = numDevices; } if( userDeviceNum == -1 ) trap_Cvar_ForceSet( "s_openAL_device", defaultDevice ); } alDevice = qalcOpenDevice( (const ALchar *)s_openAL_device->string ); if( !alDevice ) { Com_Printf( "Failed to open device\n" ); return qfalse; } // Create context alContext = qalcCreateContext( alDevice, NULL ); if( !alContext ) { Com_Printf( "Failed to create context\n" ); return qfalse; } qalcMakeContextCurrent( alContext ); if( verbose ) { Com_Printf( "OpenAL initialized\n" ); if( numDevices ) { int i; Com_Printf( " Devices: " ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( i = 0; *devices; devices += strlen( devices ) + 1, i++ ) Com_Printf( "%s%s", devices, ( i < numDevices - 1 ) ? ", " : "" ); Com_Printf( "\n" ); if( defaultDevice && *defaultDevice ) Com_Printf( " Default system device: %s\n", defaultDevice ); Com_Printf( "\n" ); } Com_Printf( " Device: %s\n", qalcGetString( alDevice, ALC_DEVICE_SPECIFIER ) ); Com_Printf( " Vendor: %s\n", qalGetString( AL_VENDOR ) ); Com_Printf( " Version: %s\n", qalGetString( AL_VERSION ) ); Com_Printf( " Renderer: %s\n", qalGetString( AL_RENDERER ) ); Com_Printf( " Extensions: %s\n", qalGetString( AL_EXTENSIONS ) ); } // Check for Linux shutdown race condition if( !Q_stricmp( qalGetString( AL_VENDOR ), "J. Valenzuela" ) ) snd_shutdown_bug = qtrue; qalDopplerFactor( s_doppler->value ); qalDopplerVelocity( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); if( qalSpeedOfSound ) // opelAL 1.1 only. alDopplerVelocity being deprecated qalSpeedOfSound( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); s_doppler->modified = qfalse; S_SetAttenuationModel( S_DEFAULT_ATTENUATION_MODEL, S_DEFAULT_ATTENUATION_MAXDISTANCE, S_DEFAULT_ATTENUATION_REFDISTANCE ); S_LockBackgroundTrack( qfalse ); if( !S_InitDecoders( verbose ) ) { Com_Printf( "Failed to init decoders\n" ); return qfalse; } if( !S_InitSources( maxEntities, verbose ) ) { Com_Printf( "Failed to init sources\n" ); return qfalse; } return qtrue; }
/* * G_UpdateServerInfo * update the cvars which show the match state at server browsers */ static void G_UpdateServerInfo( void ) { // g_match_time if( GS_MatchState() <= MATCH_STATE_WARMUP ) { trap_Cvar_ForceSet( "g_match_time", "Warmup" ); } else if( GS_MatchState() == MATCH_STATE_COUNTDOWN ) { trap_Cvar_ForceSet( "g_match_time", "Countdown" ); } else if( GS_MatchState() == MATCH_STATE_PLAYTIME ) { // partly from G_GetMatchState char extra[MAX_INFO_VALUE]; int clocktime, timelimit, mins, secs; if( GS_MatchDuration() ) timelimit = ( ( GS_MatchDuration() ) * 0.001 ) / 60; else timelimit = 0; clocktime = (float)( game.serverTime - GS_MatchStartTime() ) * 0.001f; if( clocktime <= 0 ) { mins = 0; secs = 0; } else { mins = clocktime / 60; secs = clocktime - mins * 60; } extra[0] = 0; if( GS_MatchExtended() ) { if( timelimit ) Q_strncatz( extra, " overtime", sizeof( extra ) ); else Q_strncatz( extra, " suddendeath", sizeof( extra ) ); } if( GS_MatchPaused() ) Q_strncatz( extra, " (in timeout)", sizeof( extra ) ); if( timelimit ) trap_Cvar_ForceSet( "g_match_time", va( "%02i:%02i / %02i:00%s", mins, secs, timelimit, extra ) ); else trap_Cvar_ForceSet( "g_match_time", va( "%02i:%02i%s", mins, secs, extra ) ); } else { trap_Cvar_ForceSet( "g_match_time", "Finished" ); } // g_match_score if( GS_MatchState() >= MATCH_STATE_PLAYTIME && GS_TeamBasedGametype() ) { char score[MAX_INFO_STRING]; score[0] = 0; Q_strncatz( score, va( " %s: %i", GS_TeamName( TEAM_ALPHA ), teamlist[TEAM_ALPHA].stats.score ), sizeof( score ) ); Q_strncatz( score, va( " %s: %i", GS_TeamName( TEAM_BETA ), teamlist[TEAM_BETA].stats.score ), sizeof( score ) ); if( strlen( score ) >= MAX_INFO_VALUE ) { // prevent "invalid info cvar value" flooding score[0] = '\0'; } trap_Cvar_ForceSet( "g_match_score", score ); } else { trap_Cvar_ForceSet( "g_match_score", "" ); } // g_needpass if( password->modified ) { if( password->string && strlen( password->string ) ) { trap_Cvar_ForceSet( "g_needpass", "1" ); } else { trap_Cvar_ForceSet( "g_needpass", "0" ); } password->modified = false; } // g_gametypes_available if( g_votable_gametypes->modified || g_disable_vote_gametype->modified ) { if( g_disable_vote_gametype->integer || !g_votable_gametypes->string || !strlen( g_votable_gametypes->string ) ) { trap_Cvar_ForceSet( "g_gametypes_available", "" ); } else { char *votable; char *name; size_t len; int count; len = 0; for( count = 0; ( name = G_ListNameForPosition( g_gametypes_list->string, count, CHAR_GAMETYPE_SEPARATOR ) ) != NULL; count++ ) { if( G_Gametype_IsVotable( name ) ) len += strlen( name ) + 1; } len++; votable = ( char * )G_Malloc( len ); votable[0] = 0; for( count = 0; ( name = G_ListNameForPosition( g_gametypes_list->string, count, CHAR_GAMETYPE_SEPARATOR ) ) != NULL; count++ ) { if( G_Gametype_IsVotable( name ) ) { Q_strncatz( votable, name, len ); Q_strncatz( votable, " ", len ); } } //votable[ strlen( votable )-2 ] = 0; // remove the last space trap_Cvar_ForceSet( "g_gametypes_available", votable ); G_Free( votable ); } g_votable_gametypes->modified = false; g_disable_vote_gametype->modified = false; } if( GS_RaceGametype() ) { trap_Cvar_ForceSet( "g_race_gametype", "1" ); } else { trap_Cvar_ForceSet( "g_race_gametype", "0" ); } }
/* * G_Init * * This will be called when the dll is first loaded, which * only happens when a new game is started or a save game is loaded. */ void G_Init( unsigned int seed, unsigned int framemsec, int protocol, const char *demoExtension ) { cvar_t *g_maxentities; G_Printf( "==== G_Init ====\n" ); srand( seed ); G_InitGameShared(); SV_ReadIPList (); game.snapFrameTime = framemsec; game.frametime = game.snapFrameTime; game.protocol = protocol; Q_strncpyz( game.demoExtension, demoExtension, sizeof( game.demoExtension ) ); game.levelSpawnCount = 0; g_maxvelocity = trap_Cvar_Get( "g_maxvelocity", "16000", 0 ); if( g_maxvelocity->value < 20 ) { trap_Cvar_SetValue( "g_maxvelocity", 20 ); } g_gravity = trap_Cvar_Get( "g_gravity", va( "%i", GRAVITY ), 0 ); developer = trap_Cvar_Get( "developer", "0", 0 ); // noset vars dedicated = trap_Cvar_Get( "dedicated", "0", CVAR_NOSET ); // latched vars sv_cheats = trap_Cvar_Get( "sv_cheats", "0", CVAR_SERVERINFO | CVAR_LATCH ); sv_mm_enable = trap_Cvar_Get( "sv_mm_enable", "0", CVAR_ARCHIVE | CVAR_NOSET | CVAR_SERVERINFO ); // hack in CVAR_SERVERINFO flag trap_Cvar_Get( "gamename", trap_Cvar_String( "gamename" ), CVAR_SERVERINFO ); trap_Cvar_Get( "gamedate", __DATE__, CVAR_SERVERINFO | CVAR_LATCH ); password = trap_Cvar_Get( "password", "", CVAR_USERINFO ); password->modified = true; // force an update of g_needpass in G_UpdateServerInfo g_operator_password = trap_Cvar_Get( "g_operator_password", "", CVAR_ARCHIVE ); filterban = trap_Cvar_Get( "filterban", "1", 0 ); cm_mapHeader = trap_Cvar_Get( "cm_mapHeader", "", 0 ); cm_mapVersion = trap_Cvar_Get( "cm_mapVersion", "", 0 ); g_ammo_respawn = trap_Cvar_Get( "g_ammo_respawn", "0", CVAR_ARCHIVE ); g_weapon_respawn = trap_Cvar_Get( "g_weapon_respawn", "0", CVAR_ARCHIVE ); g_health_respawn = trap_Cvar_Get( "g_health_respawn", "0", CVAR_ARCHIVE ); g_armor_respawn = trap_Cvar_Get( "g_armor_respawn", "0", CVAR_ARCHIVE ); g_select_empty = trap_Cvar_Get( "g_select_empty", "0", CVAR_DEVELOPER ); g_projectile_touch_owner = trap_Cvar_Get( "g_projectile_touch_owner", "0", CVAR_DEVELOPER ); g_projectile_prestep = trap_Cvar_Get( "g_projectile_prestep", va( "%i", PROJECTILE_PRESTEP ), CVAR_DEVELOPER ); g_self_knockback = trap_Cvar_Get( "g_self_knockback", "1.18", CVAR_DEVELOPER ); g_knockback_scale = trap_Cvar_Get( "g_knockback_scale", "1.0", CVAR_ARCHIVE ); g_allow_stun = trap_Cvar_Get( "g_allow_stun", "1", CVAR_ARCHIVE ); g_armor_degradation = trap_Cvar_Get( "g_armor_degradation", va( "%.2f", ARMOR_DEGRADATION ), CVAR_DEVELOPER ); g_armor_protection = trap_Cvar_Get( "g_armor_protection", va( "%.2f", ARMOR_PROTECTION ), CVAR_DEVELOPER ); g_respawn_delay_min = trap_Cvar_Get( "g_respawn_delay_min", "600", CVAR_DEVELOPER ); g_respawn_delay_max = trap_Cvar_Get( "g_respawn_delay_max", "6000", CVAR_DEVELOPER ); g_numbots = trap_Cvar_Get( "g_numbots", "0", CVAR_ARCHIVE ); g_deadbody_followkiller = trap_Cvar_Get( "g_deadbody_followkiller", "1", CVAR_DEVELOPER ); g_deadbody_autogib_delay = trap_Cvar_Get( "g_deadbody_autogib_delay", "2000", CVAR_DEVELOPER ); g_maxtimeouts = trap_Cvar_Get( "g_maxtimeouts", "2", CVAR_ARCHIVE ); g_antilag = trap_Cvar_Get( "g_antilag", "1", CVAR_SERVERINFO|CVAR_ARCHIVE|CVAR_LATCH ); g_antilag_maxtimedelta = trap_Cvar_Get( "g_antilag_maxtimedelta", "200", CVAR_ARCHIVE ); g_antilag_maxtimedelta->modified = true; g_antilag_timenudge = trap_Cvar_Get( "g_antilag_timenudge", "0", CVAR_ARCHIVE ); g_antilag_timenudge->modified = true; g_allow_spectator_voting = trap_Cvar_Get( "g_allow_spectator_voting", "1", CVAR_ARCHIVE ); if( dedicated->integer ) { g_autorecord = trap_Cvar_Get( "g_autorecord", "1", CVAR_ARCHIVE ); g_autorecord_maxdemos = trap_Cvar_Get( "g_autorecord_maxdemos", "200", CVAR_ARCHIVE ); } else { g_autorecord = trap_Cvar_Get( "g_autorecord", "0", CVAR_ARCHIVE ); g_autorecord_maxdemos = trap_Cvar_Get( "g_autorecord_maxdemos", "0", CVAR_ARCHIVE ); } // flood control g_floodprotection_messages = trap_Cvar_Get( "g_floodprotection_messages", "4", 0 ); g_floodprotection_messages->modified = true; g_floodprotection_team = trap_Cvar_Get( "g_floodprotection_team", "0", 0 ); g_floodprotection_team->modified = true; g_floodprotection_seconds = trap_Cvar_Get( "g_floodprotection_seconds", "4", 0 ); g_floodprotection_seconds->modified = true; g_floodprotection_penalty = trap_Cvar_Get( "g_floodprotection_delay", "10", 0 ); g_floodprotection_penalty->modified = true; g_inactivity_maxtime = trap_Cvar_Get( "g_inactivity_maxtime", "90.0", 0 ); g_inactivity_maxtime->modified = true; // map list g_maplist = trap_Cvar_Get( "g_maplist", "", CVAR_ARCHIVE ); g_maprotation = trap_Cvar_Get( "g_maprotation", "1", CVAR_ARCHIVE ); // map pool g_enforce_map_pool = trap_Cvar_Get( "g_enforce_map_pool", "0", CVAR_ARCHIVE ); g_map_pool = trap_Cvar_Get( "g_map_pool", "", CVAR_ARCHIVE ); //game switches g_instagib = trap_Cvar_Get( "g_instagib", "0", CVAR_SERVERINFO|CVAR_ARCHIVE|CVAR_LATCH ); g_instajump = trap_Cvar_Get( "g_instajump", "1", CVAR_ARCHIVE ); g_instashield = trap_Cvar_Get( "g_instashield", "1", CVAR_ARCHIVE ); // helper cvars to show current status in serverinfo reply trap_Cvar_Get( "g_match_time", "", CVAR_SERVERINFO|CVAR_READONLY ); trap_Cvar_Get( "g_match_score", "", CVAR_SERVERINFO|CVAR_READONLY ); trap_Cvar_Get( "g_needpass", "", CVAR_SERVERINFO|CVAR_READONLY ); trap_Cvar_Get( "g_gametypes_available", "", CVAR_SERVERINFO|CVAR_READONLY ); trap_Cvar_Get( "g_race_gametype", "0", CVAR_SERVERINFO|CVAR_READONLY ); // define this one here so we can see when it's modified g_disable_vote_gametype = trap_Cvar_Get( "g_disable_vote_gametype", "0", CVAR_ARCHIVE ); g_asGC_stats = trap_Cvar_Get( "g_asGC_stats", "0", CVAR_ARCHIVE ); g_asGC_interval = trap_Cvar_Get( "g_asGC_interval", "10", CVAR_ARCHIVE ); g_skillRating = trap_Cvar_Get( "sv_skillRating", va("%.0f", MM_RATING_DEFAULT), CVAR_SERVERINFO|CVAR_READONLY ); // trap_Cvar_ForceSet( "sv_skillRating", va("%d", MM_RATING_DEFAULT) ); // nextmap trap_Cvar_ForceSet( "nextmap", "match \"advance\"" ); // initialize all entities for this game g_maxentities = trap_Cvar_Get( "sv_maxentities", "1024", CVAR_LATCH ); game.maxentities = g_maxentities->integer; game.edicts = ( edict_t * )G_Malloc( game.maxentities * sizeof( game.edicts[0] ) ); // initialize all clients for this game game.clients = ( gclient_t * )G_Malloc( gs.maxclients * sizeof( game.clients[0] ) ); game.quits = NULL; game.numentities = gs.maxclients + 1; trap_LocateEntities( game.edicts, sizeof( game.edicts[0] ), game.numentities, game.maxentities ); // server console commands G_AddServerCommands(); G_LoadFiredefsFromDisk(); // weapon items GS_InitWeapons(); // init AS engine G_asInitGameModuleEngine(); }
static qboolean StartServer_MenuInit( void ) { menucommon_t *menuitem_settings_background; menucommon_t *menuitem, *col_title; static char *skill_names[] = { "easy", "normal", "hard", 0 }; static char *sortmethod_names[] = { "file name", "title", 0 }; cvar_t *cvar_lastmap; int maxclients; int scrollwindow_width, xoffset, yoffset = 0; //leave some room for preview pic trap_Cvar_Get( "ui_maplist_sortmethod", "1", CVAR_ARCHIVE ); // create a list with the installed gametype names ui_gametype_names = trap_Cvar_Get( "ui_gametype_names", ";", CVAR_NOSET ); if( !UI_CreateFileNamesListCvar( ui_gametype_names, "progs/gametypes", ".gt", ';' ) ) trap_Cvar_ForceSet( "ui_gametype_names", "dm;" ); if( uis.vidWidth < 800 ) scrollwindow_width = uis.vidWidth * 0.85; else if( uis.vidWidth < 1024 ) scrollwindow_width = uis.vidWidth * 0.75; else scrollwindow_width = uis.vidWidth * 0.45; xoffset = scrollwindow_width / 2; // convert to item names format M_StartServer_MakeGametypesNames( ui_gametype_names->string ); s_startserver_menu.nitems = 0; menuitem = UI_InitMenuItem( "m_startserver_title1", "SERVER SETUP", 0, yoffset, MTYPE_SEPARATOR, ALIGN_CENTER_TOP, uis.fontSystemBig, NULL ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); // separator yoffset += trap_SCR_strHeight( menuitem->font ); menuitem = UI_InitMenuItem( "m_startserver_map", "initial map", 0, yoffset, MTYPE_SEPARATOR, ALIGN_CENTER_TOP, uis.fontSystemMedium, NULL ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset += trap_SCR_strHeight( menuitem->font ) * 0.5; // order type menuitem = col_title = UI_InitMenuItem( "m_startserver_order_title", "order by: ", -xoffset - LCOLUMN_OFFSET / 2, yoffset, MTYPE_SEPARATOR, ALIGN_LEFT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_startserver_menu, menuitem ); menuitem = UI_InitMenuItem( "m_startserver_order", NULL, col_title->x + trap_SCR_strWidth( col_title->title, uis.fontSystemSmall, 0 ), yoffset, MTYPE_SPINCONTROL, ALIGN_LEFT_TOP, uis.fontSystemSmall, StartServer_UpdateOrderMethod ); UI_SetupSpinControl( menuitem, sortmethod_names, trap_Cvar_Value( "ui_maplist_sortmethod" ) ); Menu_AddItem( &s_startserver_menu, menuitem ); menuitem = UI_InitMenuItem( "m_startserver_mappic", NULL, xoffset - MAPPIC_WIDTH - 8, yoffset, MTYPE_SEPARATOR, ALIGN_CENTER_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_startserver_menu, menuitem ); cvar_lastmap = trap_Cvar_Get( "ui_startserver_lastselectedmap", "", CVAR_NOSET ); MapsList_CreateItems( cvar_lastmap->string ); MapsList_ChooseMap( NULL ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset = MapsList_CreateScrollbox( scrollwindow_width, yoffset ); yoffset += trap_SCR_strHeight( menuitem->font ) * 0.5; menuitem_settings_background = UI_InitMenuItem( "m_startserver_settings_back", "", -xoffset, yoffset, MTYPE_SEPARATOR, ALIGN_LEFT_TOP, uis.fontSystemSmall, NULL ); Menu_AddItem( &s_startserver_menu, menuitem_settings_background ); // create an associated picture to the items to act as window background menuitem = menuitem_settings_background; menuitem->ownerdraw = M_StartServer_DrawSettingsBox; menuitem->pict.shader = uis.whiteShader; menuitem->pict.shaderHigh = NULL; Vector4Copy( colorMdGrey, menuitem->pict.color ); menuitem->pict.color[3] = 0; menuitem->pict.yoffset = 0; menuitem->pict.xoffset = 0; menuitem->pict.width = scrollwindow_width; menuitem->pict.height = yoffset + menuitem->pict.yoffset; // will be set later yoffset += trap_SCR_strHeight( menuitem->font ); // g_gametype m_gametype = mapList_suggested_gametype ? mapList_suggested_gametype : SuggestGameType( NULL ); menuitem = m_gametypes_item = UI_InitMenuItem( "m_startserver_gametype", "gametype", -130, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, M_GametypeFunc ); menuitem->statusbar = "select the server gametype"; UI_SetupSpinControl( menuitem, startserver_gametype_names, m_gametype ); Menu_AddItem( &s_startserver_menu, menuitem ); //yoffset += trap_SCR_strHeight( menuitem->font ); // g_timelimit menuitem = UI_InitMenuItem( "m_startserver_timelimit", "time limit", 100, yoffset, MTYPE_FIELD, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); menuitem->statusbar = "0 = no limit"; UI_SetupField( menuitem, trap_Cvar_String( "g_timelimit" ), 6, -1 ); UI_SetupFlags( menuitem, F_NUMBERSONLY ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); // sv_skilllevel menuitem = UI_InitMenuItem( "m_startserver_skill", "skill level", -130, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, M_SkillLevelFunc ); m_skill = trap_Cvar_Value( "sv_skilllevel" ); menuitem->statusbar = "select server skill level"; UI_SetupSpinControl( menuitem, skill_names, m_skill ); Menu_AddItem( &s_startserver_menu, menuitem ); //yoffset += trap_SCR_strHeight( menuitem->font ); // g_scorelimit menuitem = UI_InitMenuItem( "m_startserver_scorelimit", "score limit", 100, yoffset, MTYPE_FIELD, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); menuitem->statusbar = "0 = no limit"; UI_SetupField( menuitem, trap_Cvar_String( "g_scorelimit" ), 6, -1 ); UI_SetupFlags( menuitem, F_NUMBERSONLY ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); // sv_cheats menuitem = UI_InitMenuItem( "m_startserver_cheats", "cheats", -130, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, M_CheatsFunc ); m_cheats = trap_Cvar_Value( "sv_cheats" ); menuitem->statusbar = "enable cheats on the server"; UI_SetupSpinControl( menuitem, offon_names, m_cheats ); Menu_AddItem( &s_startserver_menu, menuitem ); //yoffset += trap_SCR_strHeight( menuitem->font ); // g_numbots menuitem = UI_InitMenuItem( "m_startserver_numbots", "number of bots", 100, yoffset, MTYPE_FIELD, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); menuitem->statusbar = "Can't be more than maxclients"; UI_SetupField( menuitem, trap_Cvar_String( "g_numbots" ), 6, -1 ); UI_SetupFlags( menuitem, F_NUMBERSONLY ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); // g_instagib menuitem = UI_InitMenuItem( "m_startserver_instagib", "instagib", -130, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, M_InstagibFunc ); m_instagib = trap_Cvar_Value( "g_instagib" ); menuitem->statusbar = "enable instagib mode"; UI_SetupSpinControl( menuitem, offon_names, m_instagib ); Menu_AddItem( &s_startserver_menu, menuitem ); //yoffset += trap_SCR_strHeight( menuitem->font ); // sv_maxclients /* ** maxclients determines the maximum number of players that can join ** the game. If maxclients is only "1" then we should default the menu ** option to 8 players, otherwise use whatever its current value is. */ maxclients = trap_Cvar_Value( "sv_maxclients" ) <= 1 ? 8 : trap_Cvar_Value( "sv_maxclients" ); menuitem = UI_InitMenuItem( "m_startserver_maxplayers", "max players", 100, yoffset, MTYPE_FIELD, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); UI_SetupField( menuitem, va( "%i", maxclients ), 6, -1 ); UI_SetupFlags( menuitem, F_NUMBERSONLY ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); // sv_public menuitem = UI_InitMenuItem( "m_startserver_public", "public", -130, yoffset, MTYPE_SPINCONTROL, ALIGN_RIGHT_TOP, uis.fontSystemSmall, M_PublicFunc ); m_public = trap_Cvar_Value( "sv_public" ); menuitem->statusbar = "announce this server to metaservers"; UI_SetupSpinControl( menuitem, offon_names, m_public ); Menu_AddItem( &s_startserver_menu, menuitem ); //yoffset += trap_SCR_strHeight( menuitem->font ); // sv_hostname menuitem = UI_InitMenuItem( "m_startserver_hostname", "server name", 100, yoffset, MTYPE_FIELD, ALIGN_RIGHT_TOP, uis.fontSystemSmall, NULL ); UI_SetupField( menuitem, trap_Cvar_String( "sv_hostname" ), 14, -1 ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += trap_SCR_strHeight( menuitem->font ); yoffset += trap_SCR_strHeight( menuitem->font ) * 0.5; // here ends the settings background, set it's image height now menuitem_settings_background->pict.height = yoffset - menuitem_settings_background->pict.height + ( 0.5 * trap_SCR_strHeight( menuitem->font ) ); yoffset += trap_SCR_strHeight( menuitem->font ); // begin button menuitem = UI_InitMenuItem( "m_startserver_begin", "begin", 16, yoffset, MTYPE_ACTION, ALIGN_LEFT_TOP, uis.fontSystemBig, StartServerActionFunc ); Menu_AddItem( &s_startserver_menu, menuitem ); UI_SetupButton( menuitem, qtrue ); menuitem = UI_InitMenuItem( "m_startserver_back", "back", -16, yoffset, MTYPE_ACTION, ALIGN_RIGHT_TOP, uis.fontSystemBig, M_genericBackFunc ); Menu_AddItem( &s_startserver_menu, menuitem ); yoffset += UI_SetupButton( menuitem, qtrue ) + UI_BUTTONBOX_VERTICAL_SPACE; Menu_Center( &s_startserver_menu ); s_startserver_menu.x = ( uis.vidWidth / 2 ); Menu_Init( &s_startserver_menu, qfalse ); return qtrue; }
/* * S_Init */ qboolean S_Init( void *hwnd, int maxEntities, qboolean verbose ) { int numDevices; int userDeviceNum = -1; char *devices, *defaultDevice; soundpool = S_MemAllocPool( "OpenAL sound module" ); alDevice = NULL; alContext = NULL; #ifdef OPENAL_RUNTIME if( !QAL_Init( ALDRIVER, verbose ) ) { #ifdef ALDRIVER_ALT if( !QAL_Init( ALDRIVER_ALT, verbose ) ) #endif { Com_Printf( "Failed to load OpenAL library: %s\n", ALDRIVER ); goto fail_no_device; } } #endif // get system default device identifier defaultDevice = ( char * )qalcGetString( NULL, ALC_DEFAULT_DEVICE_SPECIFIER ); if( !defaultDevice ) { Com_Printf( "Failed to get openAL default device\n" ); goto fail_no_device; } s_openAL_device = trap_Cvar_Get( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice, CVAR_ARCHIVE|CVAR_LATCH_SOUND ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) { userDeviceNum = numDevices; // force case sensitive if( strcmp( s_openAL_device->string, devices ) ) trap_Cvar_ForceSet( "s_openAL_device", devices ); } } if( !numDevices ) { Com_Printf( "Failed to get openAL devices\n" ); goto fail_no_device; } // the device assigned by the user is not available if( userDeviceNum == -1 ) { Com_Printf( "'s_openAL_device': incorrect device name, reseting to default\n" ); trap_Cvar_ForceSet( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) userDeviceNum = numDevices; } if( userDeviceNum == -1 ) trap_Cvar_ForceSet( "s_openAL_device", defaultDevice ); } alDevice = qalcOpenDevice( (const ALchar *)s_openAL_device->string ); if( !alDevice ) { Com_Printf( "Failed to open device\n" ); goto fail_no_device; } // Create context alContext = qalcCreateContext( alDevice, NULL ); if( !alContext ) { Com_Printf( "Failed to create context\n" ); goto fail; } qalcMakeContextCurrent( alContext ); if( verbose ) { Com_Printf( "OpenAL initialized\n" ); if( numDevices ) { int i; Com_Printf( " Devices: " ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( i = 0; *devices; devices += strlen( devices ) + 1, i++ ) Com_Printf( "%s%s", devices, ( i < numDevices - 1 ) ? ", " : "" ); Com_Printf( "\n" ); if( defaultDevice && *defaultDevice ) Com_Printf( " Default system device: %s\n", defaultDevice ); Com_Printf( "\n" ); } Com_Printf( " Device: %s\n", qalcGetString( alDevice, ALC_DEVICE_SPECIFIER ) ); Com_Printf( " Vendor: %s\n", qalGetString( AL_VENDOR ) ); Com_Printf( " Version: %s\n", qalGetString( AL_VERSION ) ); Com_Printf( " Renderer: %s\n", qalGetString( AL_RENDERER ) ); Com_Printf( " Extensions: %s\n", qalGetString( AL_EXTENSIONS ) ); } // Check for Linux shutdown race condition if( !Q_stricmp( qalGetString( AL_VENDOR ), "J. Valenzuela" ) ) snd_shutdown_bug = qtrue; s_volume = trap_Cvar_Get( "s_volume", "0.8", CVAR_ARCHIVE ); s_musicvolume = trap_Cvar_Get( "s_musicvolume", "0.5", CVAR_ARCHIVE ); s_doppler = trap_Cvar_Get( "s_doppler", "1.0", CVAR_ARCHIVE ); s_sound_velocity = trap_Cvar_Get( "s_sound_velocity", "10976", CVAR_DEVELOPER ); s_stereo2mono = trap_Cvar_Get ( "s_stereo2mono", "0", CVAR_ARCHIVE ); qalDopplerFactor( s_doppler->value ); qalDopplerVelocity( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); if( qalSpeedOfSound ) // opelAL 1.1 only. alDopplerVelocity being deprecated qalSpeedOfSound( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); s_doppler->modified = qfalse; S_SetAttenuationModel( S_DEFAULT_ATTENUATION_MODEL, S_DEFAULT_ATTENUATION_MAXDISTANCE, S_DEFAULT_ATTENUATION_REFDISTANCE ); S_LockBackgroundTrack( qfalse ); if( !S_InitDecoders( verbose ) ) { Com_Printf( "Failed to init decoders\n" ); goto fail; } if( !S_InitBuffers() ) { Com_Printf( "Failed to init buffers\n" ); goto fail; } if( !S_InitSources( maxEntities, verbose ) ) { Com_Printf( "Failed to init sources\n" ); goto fail; } #ifdef ENABLE_PLAY trap_Cmd_AddCommand( "play", S_Play ); #endif trap_Cmd_AddCommand( "music", S_Music ); trap_Cmd_AddCommand( "stopmusic", S_StopMusic ); trap_Cmd_AddCommand( "prevmusic", S_PrevMusic ); trap_Cmd_AddCommand( "nextmusic", S_NextMusic ); trap_Cmd_AddCommand( "pausemusic", S_PauseMusic ); trap_Cmd_AddCommand( "soundlist", S_SoundList ); trap_Cmd_AddCommand( "s_devices", S_ListDevices ); return qtrue; fail: if( alContext ) { if( !snd_shutdown_bug ) qalcMakeContextCurrent( NULL ); qalcDestroyContext( alContext ); alContext = NULL; } if( alDevice ) { qalcCloseDevice( alDevice ); alDevice = NULL; } fail_no_device: S_MemFreePool( &soundpool ); return qfalse; }