X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=bf6fddf5cf3db2b75aa7b5be3baa1d05f9d22cb0;hp=30ed368f3a8ecbf4592a9d62b13e8bc563c5dbe2;hb=016835f8f51aff29719995f8d080d9c1b19392c4;hpb=be37ea91fb3bbd1a6fa4f0b70b32d1ea95343ad4 diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 30ed368f3a..bf6fddf5cf 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -330,11 +330,13 @@ void cvar_changes_init() BADCVAR("g_balance_kill_delay"); BADCVAR("g_buffs_pickup_anyway"); BADCVAR("g_buffs_randomize"); + BADCVAR("g_buffs_randomize_teamplay"); BADCVAR("g_campcheck_distance"); BADCVAR("g_ca_point_leadlimit"); BADCVAR("g_ca_point_limit"); BADCVAR("g_ctf_captimerecord_always"); BADCVAR("g_ctf_flag_glowtrails"); + BADCVAR("g_ctf_dynamiclights"); BADCVAR("g_ctf_flag_pickup_verbosename"); BADCVAR("g_domination_point_leadlimit"); BADCVAR("g_forced_respawn"); @@ -360,6 +362,7 @@ void cvar_changes_init() BADCVAR("sv_damagetext"); BADCVAR("sv_db_saveasdump"); BADCVAR("sv_intermission_cdtrack"); + BADCVAR("sv_mapchange_delay"); BADCVAR("sv_minigames"); BADCVAR("sv_namechangetimer"); BADCVAR("sv_precacheplayermodels"); @@ -491,6 +494,7 @@ void cvar_changes_init() BADCVAR("g_ca_weaponarena"); BADCVAR("g_freezetag_weaponarena"); BADCVAR("g_lms_weaponarena"); + BADCVAR("g_ctf_stalemate_time"); if(cvar_string("g_mod_balance") == "Testing") { @@ -809,8 +813,6 @@ spawnfunc(worldspawn) if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS) bot_waypoints_for_items = 0; - precache(); - WaypointSprite_Init(); GameLogInit(); // prepare everything @@ -871,6 +873,12 @@ spawnfunc(worldspawn) MapInfo_Enumerate(); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1); + if(fexists(strcat("scripts/", mapname, ".arena"))) + cvar_settemp("sv_q3acompat_machineshotgunswap", "1"); + + if(fexists(strcat("scripts/", mapname, ".defi"))) + cvar_settemp("sv_q3defragcompat", "1"); + if(whichpack(strcat("maps/", mapname, ".cfg")) != "") { int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ); @@ -1250,7 +1258,7 @@ void Maplist_Init() break; } } - + if (i == Map_Count) { bprint( "Maplist contains no usable maps! Resetting it to default map list.\n" ); @@ -1408,54 +1416,6 @@ void IntermissionThink(entity this) MapVote_Start(); } -/* -============ -FindIntermission - -Returns the entity to view from -============ -*/ -/* -entity FindIntermission() -{ - local entity spot; - local float cyc; - -// look for info_intermission first - spot = find(NULL, classname, "info_intermission"); - if (spot) - { // pick a random one - cyc = random() * 4; - while (cyc > 1) - { - spot = find(spot, classname, "info_intermission"); - if (!spot) - spot = find(spot, classname, "info_intermission"); - cyc = cyc - 1; - } - return spot; - } - -// then look for the start position - spot = find(NULL, classname, "info_player_start"); - if (spot) - return spot; - -// testinfo_player_start is only found in regioned levels - spot = find(NULL, classname, "testplayerstart"); - if (spot) - return spot; - -// then look for the start position - spot = find(NULL, classname, "info_player_deathmatch"); - if (spot) - return spot; - - //objerror ("FindIntermission: no spot"); - return NULL; -} -*/ - /* =============================================================================== @@ -1745,11 +1705,11 @@ void ShuffleMaplist() cvar_set("g_maplist", shufflewords(autocvar_g_maplist)); } -float leaderfrags; +float leaderscore; +float secondscore; +int fragsleft_last; float WinningCondition_Scores(float limit, float leadlimit) { - float limitreached; - // TODO make everything use THIS winning condition (except LMS) WinningConditionHelper(NULL); @@ -1781,40 +1741,57 @@ float WinningCondition_Scores(float limit, float leadlimit) if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining)) // these modes always score in increments of 1, thus this makes sense { - if(leaderfrags != WinningConditionHelper_topscore) + if (leaderscore != WinningConditionHelper_topscore || + secondscore != WinningConditionHelper_secondscore) { - leaderfrags = WinningConditionHelper_topscore; + int fragsleft = 0, leadingfragsleft = 0; + + leaderscore = WinningConditionHelper_topscore; + secondscore = WinningConditionHelper_secondscore; if (limit) + fragsleft = limit - leaderscore; + if (leadlimit) + leadingfragsleft = secondscore + leadlimit - leaderscore; + + if (autocvar_leadlimit_and_fraglimit && leadlimit) { - if (leaderfrags == limit - 1) + if (limit) + fragsleft = max(leadingfragsleft, fragsleft); + } + else if (leadlimit) + { + if (limit) + fragsleft = min(fragsleft, leadingfragsleft); + else + fragsleft = leadingfragsleft; + } + + if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times + { + if (fragsleft == 1) Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1); - else if (leaderfrags == limit - 2) + else if (fragsleft == 2) Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2); - else if (leaderfrags == limit - 3) + else if (fragsleft == 3) Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3); + + fragsleft_last = fragsleft; } } } - limitreached = false; - if (limit && WinningConditionHelper_topscore >= limit) - limitreached = true; - if(leadlimit) - { - float leadlimitreached; - leadlimitreached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit); - if(autocvar_leadlimit_and_fraglimit) - limitreached = (limitreached && leadlimitreached); - else - limitreached = (limitreached || leadlimitreached); - } + bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit); + bool leadlimit_reached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit); - if(limit) - game_completion_ratio = max(game_completion_ratio, bound(0, WinningConditionHelper_topscore / limit, 1)); + bool limit_reached; + if(autocvar_leadlimit_and_fraglimit) + limit_reached = (fraglimit_reached && leadlimit_reached); + else + limit_reached = (fraglimit_reached || leadlimit_reached); return GetWinningCode( - WinningConditionHelper_topscore && limitreached, + WinningConditionHelper_topscore && limit_reached, WinningConditionHelper_equality ); } @@ -1905,10 +1882,6 @@ Exit deathmatch games upon conditions */ void CheckRules_World() { - float timelimit; - float fraglimit; - float leadlimit; - VoteThink(); MapVote_Think(); @@ -1923,9 +1896,10 @@ void CheckRules_World() return; } - timelimit = autocvar_timelimit * 60; - fraglimit = autocvar_fraglimit; - leadlimit = autocvar_leadlimit; + float timelimit = autocvar_timelimit * 60; + float fraglimit = autocvar_fraglimit; + float leadlimit = autocvar_leadlimit; + if (leadlimit < 0) leadlimit = 0; if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts { @@ -1950,11 +1924,6 @@ void CheckRules_World() float wantovertime; wantovertime = 0; - if(timelimit > game_starttime) - game_completion_ratio = (time - game_starttime) / (timelimit - game_starttime); - else - game_completion_ratio = 0; - if(checkrules_suddendeathend) { if(!checkrules_suddendeathwarning) @@ -2100,7 +2069,7 @@ void Physics_Frame() if(autocvar_sv_freezenonclients) return; - FOREACH_ENTITY_FLOAT(pure_data, false, + IL_EACH(g_moveables, true, { if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS) continue; @@ -2126,7 +2095,7 @@ void Physics_Frame() if(autocvar_sv_gameplayfix_delayprojectiles >= 0) return; - FOREACH_ENTITY_FLOAT(move_qcphysics, true, + IL_EACH(g_moveables, it.move_qcphysics, { if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE) continue; @@ -2261,7 +2230,7 @@ void Shutdown() else db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid)); } - if(autocvar_developer) + if(autocvar_developer > 0) { if(autocvar_sv_db_saveasdump) db_dump(TemporaryDB, "server-temp.db");