X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=ce7b8e2a15720eec91658e0c48b93faf9e832b8b;hp=07898df16817501ada15cc655255c3cec5cf9f0e;hb=4fc59bbd7e2d4f25ba21952ed50ae754295a7faa;hpb=68c78ae5b446ef95a908d345f054be33e2cada96 diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 07898df168..ce7b8e2a15 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,24 +243,33 @@ 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("serverconfig"); @@ -279,6 +295,11 @@ void cvar_changes_init() BADCVAR("sys_colortranslation"); BADCVAR("sys_specialcharactertranslation"); BADCVAR("timestamps"); + BADCVAR("net_address"); + BADCVAR("net_address_ipv6"); + BADPREFIX("sv_weaponstats_"); + BADCVAR("developer"); + BADPREFIX("developer_"); // mapinfo BADCVAR("timelimit"); @@ -304,27 +325,124 @@ 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 + BADPREFIX("prvm_"); + BADPREFIX("crypto_"); + BADPREFIX("g_chat_"); + 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_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_autoscreenshot"); + BADCVAR("sv_curl_defaulturl"); + BADCVAR("sv_defaultcharacter"); + BADCVAR("sv_defaultplayermodel"); + BADCVAR("sv_defaultplayerskin"); + BADCVAR("sv_maxrate"); + BADCVAR("sv_maxidle"); + 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"); +#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; } 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 +553,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; @@ -636,14 +758,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 +821,8 @@ void spawnfunc_worldspawn (void) { records_reply[i] = strzone(getrecords(i)); } + if(g_cts) + ladder_reply = strzone(getladder()); rankings_reply = strzone(getrankings()); @@ -703,6 +834,21 @@ void spawnfunc_worldspawn (void) localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n"); + // fill sv_curl_serverpackages from .serverpackage files + if(cvar("sv_curl_serverpackages_auto")) + { + fd = search_begin("*.serverpackage", TRUE, FALSE); + s = ""; + if(fd >= 0) + { + j = search_getsize(fd); + for(i = 0; i < j; ++i) + s = strcat(s, " ", search_getfilename(fd, i)); + search_end(fd); + } + cvar_set("sv_curl_serverpackages", substring(s, 1, -1)); + } + world_initialized = 1; } @@ -1509,16 +1655,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 @@ -1637,7 +1790,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; } @@ -2746,9 +2899,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);