X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=f6707b54dd6dde9a87137be9136efaedfde3a637;hp=9df213c1b8b3748ef74551d84b60239865dab0d3;hb=4faee34e4aa9a80d92e5dc16e7a58a07dc48d207;hpb=fb839150d0cd4c4937d183b723b6cc1ed250c66a diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 9df213c1b..f6707b54d 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -213,16 +213,23 @@ void cvar_changes_init() { float h; string k, v, d; - float n, i; + float n, i, adding, pureadding; if(cvar_changes) strunzone(cvar_changes); cvar_changes = string_null; + if(cvar_purechanges) + strunzone(cvar_purechanges); + cvar_purechanges = string_null; + cvar_purechanges_count = 0; h = buf_create(); buf_cvarlist(h, "", "_"); // exclude all _ cvars as they are temporary n = buf_getsize(h); + adding = TRUE; + pureadding = TRUE; + for(i = 0; i < n; ++i) { k = bufstr_get(h, i); @@ -236,27 +243,50 @@ void cvar_changes_init() BADCVAR("g_configversion"); BADCVAR("g_maplist_index"); BADCVAR("halflifebsp"); + BADPREFIX("sv_world"); // client + BADPREFIX("chase_"); BADPREFIX("cl_"); BADPREFIX("con_"); + BADPREFIX("scoreboard_"); BADPREFIX("g_campaign"); BADPREFIX("gl_"); BADPREFIX("joy"); + BADPREFIX("hud_"); BADPREFIX("menu_"); BADPREFIX("net_slist_"); BADPREFIX("r_"); BADPREFIX("sbar_"); BADPREFIX("scr_"); + BADPREFIX("snd_"); BADPREFIX("userbind"); BADPREFIX("v_"); BADPREFIX("vid_"); BADPREFIX("crosshair"); BADCVAR("mod_q3bsp_lightmapmergepower"); BADCVAR("mod_q3bsp_nolightmaps"); + BADCVAR("fov"); + BADCVAR("mastervolume"); + BADCVAR("volume"); + BADCVAR("bgmvolume"); // private + BADCVAR("developer"); + BADCVAR("g_banned_list"); + BADCVAR("log_dest_udp"); + BADCVAR("log_file"); + BADCVAR("net_address"); + BADCVAR("net_address_ipv6"); + BADCVAR("port"); + BADCVAR("savedgamecfg"); BADCVAR("serverconfig"); + BADCVAR("sv_heartbeatperiod"); + BADCVAR("sv_vote_master_password"); + BADCVAR("sys_colortranslation"); + BADCVAR("sys_specialcharactertranslation"); + BADCVAR("timestamps"); + BADPREFIX("developer_"); BADPREFIX("g_ban_"); BADPREFIX("g_chat_flood_"); BADPREFIX("g_voice_flood_"); @@ -268,21 +298,23 @@ void cvar_changes_init() BADPREFIX("sv_eventlog"); BADPREFIX("sv_logscores_"); BADPREFIX("sv_master"); - BADCVAR("g_banned_list"); - BADCVAR("log_dest_udp"); - BADCVAR("log_file"); - BADCVAR("net_address"); - BADCVAR("port"); - BADCVAR("savedgamecfg"); - BADCVAR("sv_heartbeatperiod"); - BADCVAR("sv_vote_master_password"); - BADCVAR("sys_colortranslation"); - BADCVAR("sys_specialcharactertranslation"); - BADCVAR("timestamps"); + BADPREFIX("sv_weaponstats_"); + + // these can contain player IDs, so better hide + BADCVAR("g_forced_team_red"); + BADCVAR("g_forced_team_blue"); + BADCVAR("g_forced_team_yellow"); + BADCVAR("g_forced_team_pink"); // mapinfo BADCVAR("timelimit"); BADCVAR("fraglimit"); + BADCVAR("leadlimit"); + BADCVAR("g_tdm_teams"); + BADCVAR("g_keyhunt_teams"); + BADCVAR("g_domination_default_teams"); + BADCVAR("g_race_qualifying_timelimit"); + BADCVAR("g_lms"); BADCVAR("g_arena"); BADCVAR("g_ca"); BADCVAR("g_assault"); @@ -304,27 +336,147 @@ void cvar_changes_init() BADCVAR("g_maplist"); BADCVAR("g_maplist_mostrecent"); BADCVAR("sv_motd"); -#undef BADPREFIX -#undef BADCVAR v = cvar_string(k); d = cvar_defstring(k); - if(v != d) + if(v == d) + continue; + + if(adding) { cvar_changes = strcat(cvar_changes, k, " \"", v, "\" // \"", d, "\"\n"); if(strlen(cvar_changes) > 16384) { cvar_changes = "// too many settings have been changed to show them here\n"; - break; + adding = 0; + } + } + + // now check if the changes are actually gameplay relevant + + // does nothing visible + BADCVAR("captureleadlimit_override"); + BADCVAR("g_arena_point_leadlimit"); + BADCVAR("g_ca_point_leadlimit"); + BADCVAR("g_ctf_capture_leadlimit"); + BADCVAR("g_domination_point_leadlimit"); + BADCVAR("g_keyhunt_point_leadlimit"); + BADCVAR("g_nexball_goalleadlimit"); + BADCVAR("g_runematch_point_leadlimit"); + BADCVAR("leadlimit_and_fraglimit"); + BADCVAR("leadlimit_override"); + BADCVAR("sv_checkforpacketsduringsleep"); + BADPREFIX("crypto_"); + BADPREFIX("g_chat_"); + BADPREFIX("net_"); + BADPREFIX("prvm_"); + BADPREFIX("sv_fragmessage_"); + BADPREFIX("sv_vote_"); + BADPREFIX("timelimit_"); + + // allowed changes to server admins (please sync this to server.cfg) + // vi commands: + // :/"impure"/,$d + // :g!,^\/\/[^ /],d + // :%s,//\([^ ]*\).*,BADCVAR("\1");, + // :%!sort + // yes, this does contain some redundant stuff, don't really care + BADCVAR("bot_number"); + BADCVAR("bot_prefix"); + BADCVAR("bot_suffix"); + BADCVAR("capturelimit_override"); + BADCVAR("fraglimit_override"); + BADCVAR("gametype"); + BADCVAR("g_antilag"); + BADCVAR("g_balance_teams"); + BADCVAR("g_balance_teams_force"); + BADCVAR("g_ban_sync_trusted_servers"); + BADCVAR("g_ban_sync_uri"); + BADCVAR("g_ctf_capture_limit"); + BADCVAR("g_ctf_ignore_frags"); + BADCVAR("g_ctf_win_mode"); + BADCVAR("g_domination_point_limit"); + BADCVAR("g_fullbrightitems"); + BADCVAR("g_fullbrightplayers"); + BADCVAR("g_keyhunt_point_limit"); + BADCVAR("g_keyhunt_teams_override"); + BADCVAR("g_lms_lives_override"); + BADCVAR("g_maplist"); + BADCVAR("g_maplist_check_waypoints"); + BADCVAR("g_maplist_mostrecent_count"); + BADCVAR("g_maplist_shuffle"); + BADCVAR("g_maplist_votable"); + BADCVAR("g_maplist_votable_abstain"); + BADCVAR("g_maplist_votable_nodetail"); + BADCVAR("g_maplist_votable_suggestions"); + BADCVAR("g_minstagib"); + BADCVAR("g_nexball_goallimit"); + BADCVAR("g_runematch_point_limit"); + BADCVAR("g_start_delay"); + BADCVAR("hostname"); + BADCVAR("log_file"); + BADCVAR("maxplayers"); + BADCVAR("minplayers"); + BADCVAR("net_address"); + BADCVAR("port"); + BADCVAR("rcon_password"); + BADCVAR("rcon_restricted_commands"); + BADCVAR("rcon_restricted_password"); + BADCVAR("skill"); + BADCVAR("sv_adminnick"); + BADCVAR("sv_autoscreenshot"); + BADCVAR("sv_curl_defaulturl"); + BADCVAR("sv_maxidle"); + BADCVAR("sv_maxrate"); + BADCVAR("sv_motd"); + BADCVAR("sv_public"); + BADCVAR("sv_ready_restart"); + BADCVAR("sv_status_privacy"); + BADCVAR("sv_vote_call"); + BADCVAR("sv_vote_commands"); + BADCVAR("sv_vote_majority_factor"); + BADCVAR("sv_vote_master"); + BADCVAR("sv_vote_master_commands"); + BADCVAR("sv_vote_master_password"); + BADCVAR("sv_vote_simple_majority_factor"); + BADCVAR("timelimit_override"); + + if(cvar("g_minstagib")) + { + BADCVAR("g_grappling_hook"); + BADCVAR("g_jetpack"); + } +#undef BADPREFIX +#undef BADCVAR + + if(pureadding) + { + cvar_purechanges = strcat(cvar_purechanges, k, " \"", v, "\" // \"", d, "\"\n"); + if(strlen(cvar_purechanges) > 16384) + { + cvar_purechanges = "// too many settings have been changed to show them here\n"; + pureadding = 0; } } + ++cvar_purechanges_count; + // WARNING: this variable is used for the server list + // NEVER dare to skip this code! + // Hacks to intentionally appearing as "pure server" even though you DO have + // modified settings may be punished by removal from the server list. + // You can do to the variables cvar_changes and cvar_purechanges all you want, + // though. } buf_del(h); if(cvar_changes == "") - cvar_changes = "// this server runs at default settings\n"; + cvar_changes = "// this server runs at default server settings\n"; else - cvar_changes = strcat("// this server runs at modified settings:\n", cvar_changes); + cvar_changes = strcat("// this server runs at modified server settings:\n", cvar_changes); cvar_changes = strzone(cvar_changes); + if(cvar_purechanges == "") + cvar_purechanges = "// this server runs at default gameplay settings\n"; + else + cvar_purechanges = strcat("// this server runs at modified gameplay settings:\n", cvar_purechanges); + cvar_purechanges = strzone(cvar_purechanges); } void detect_maptype() @@ -435,8 +587,12 @@ void spawnfunc_worldspawn (void) check_unacceptable_compiler_bugs(); + cvar_changes_init(); // do this very early now so it REALLY matches the server config + compressShortVector_init(); + allowed_to_spawn = TRUE; + local entity head; head = nextent(world); maxclients = 0; @@ -546,24 +702,34 @@ void spawnfunc_worldspawn (void) MUTATOR_CALLHOOK(BuildMutatorsString); s = ret_string; + // simple, probably not good in the mutator system if(cvar("g_grappling_hook")) s = strcat(s, ":grappling_hook"); + + // initialiation stuff, not good in the mutator system if(!cvar("g_use_ammunition")) s = strcat(s, ":no_use_ammunition"); + + // initialiation stuff, not good in the mutator system if(!cvar("g_pickup_items")) s = strcat(s, ":no_pickup_items"); + + // initialiation stuff, not good in the mutator system if(cvar_string("g_weaponarena") != "0") s = strcat(s, ":", cvar_string("g_weaponarena"), " arena"); - if(cvar("g_vampire")) - s = strcat(s, ":vampire"); - if(cvar("g_laserguided_missile")) - s = strcat(s, ":laserguided_missile"); + + // TODO to mutator system if(cvar("g_norecoil")) s = strcat(s, ":norecoil"); + + // TODO to mutator system if(cvar("g_midair")) s = strcat(s, ":midair"); + + // TODO to mutator system if(cvar("g_minstagib")) s = strcat(s, ":minstagib"); + GameLogEcho(s); GameLogEcho(":gameinfo:end"); } @@ -636,14 +802,21 @@ void spawnfunc_worldspawn (void) addstat(STAT_SHOTORG, AS_INT, stat_shotorg); addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit); addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter); + addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup); + addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge); + + if(g_ca) + { + addstat(STAT_REDALIVE, AS_INT, redalive_stat); + addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat); + } // g_movementspeed hack addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw); addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw); addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw); next_pingtime = time + 5; - InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS); detect_maptype(); @@ -692,6 +865,8 @@ void spawnfunc_worldspawn (void) { records_reply[i] = strzone(getrecords(i)); } + if(g_cts) + ladder_reply = strzone(getladder()); rankings_reply = strzone(getrankings()); @@ -1524,16 +1699,23 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true float GetWinningCode(float fraglimitreached, float equality) { - if(equality) - if(fraglimitreached) - return WINNING_STARTSUDDENDEATHOVERTIME; - else - return WINNING_NEVER; - else + if(cvar("g_campaign") == 1) if(fraglimitreached) return WINNING_YES; else return WINNING_NO; + + else + if(equality) + if(fraglimitreached) + return WINNING_STARTSUDDENDEATHOVERTIME; + else + return WINNING_NEVER; + else + if(fraglimitreached) + return WINNING_YES; + else + return WINNING_NO; } // set the .winning flag for exactly those players with a given field value @@ -1652,7 +1834,7 @@ float WinningCondition_Assault() TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0)); - if(ent.cnt == 1) // this was the second round + if(ent.cnt == 1 || cvar("g_campaign")) // this was the second round { status = WINNING_YES; } @@ -2761,9 +2943,19 @@ void SV_Shutdown() print("Saving persistent data...\n"); Ban_SaveBans(); if(!cheatcount_total) - db_save(ServerProgsDB, "server.db"); + { + if(cvar("sv_db_saveasdump")) + db_dump(ServerProgsDB, "server.db"); + else + db_save(ServerProgsDB, "server.db"); + } if(cvar("developer")) - db_save(TemporaryDB, "server-temp.db"); + { + if(cvar("sv_db_saveasdump")) + db_dump(TemporaryDB, "server-temp.db"); + else + db_save(TemporaryDB, "server-temp.db"); + } CheatShutdown(); // must be after cheatcount check db_close(ServerProgsDB); db_close(TemporaryDB);