X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=f00db073e47e1b805fd1bf5ac90a85cffb2e5a3a;hb=ae277921268b84c7b7ee5ab901ce7f0088c07605;hp=b1246091bcb1a1ca3d1f21477b32817f71e4a1bb;hpb=3ac34e5b003963141cbbde668cf5cda1b2eaacc9;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index b1246091b..f00db073e 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -57,17 +57,17 @@ void PingPLReport_Think(entity this) { WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT); WriteByte(MSG_BROADCAST, this.cnt); - WriteShort(MSG_BROADCAST, bound(1, e.ping, 65535)); - WriteByte(MSG_BROADCAST, min(ceil(e.ping_packetloss * 255), 255)); - WriteByte(MSG_BROADCAST, min(ceil(e.ping_movementloss * 255), 255)); + WriteShort(MSG_BROADCAST, bound(1, CS(e).ping, 65535)); + WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_packetloss * 255), 255)); + WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_movementloss * 255), 255)); // record latency times for clients throughout the match so we can report it to playerstats - if(time > (e.latency_time + LATENCY_THINKRATE)) + if(time > (CS(e).latency_time + LATENCY_THINKRATE)) { - e.latency_sum += e.ping; - e.latency_cnt += 1; - e.latency_time = time; - //print("sum: ", ftos(e.latency_sum), ", cnt: ", ftos(e.latency_cnt), ", avg: ", ftos(e.latency_sum / e.latency_cnt), ".\n"); + CS(e).latency_sum += CS(e).ping; + CS(e).latency_cnt += 1; + CS(e).latency_time = time; + //print("sum: ", ftos(CS(e).latency_sum), ", cnt: ", ftos(CS(e).latency_cnt), ", avg: ", ftos(CS(e).latency_sum / CS(e).latency_cnt), ".\n"); } } else @@ -176,7 +176,6 @@ void cvar_changes_init() BADPREFIX("cvar_check_"); BADCVAR("gamecfg"); BADCVAR("g_configversion"); - BADCVAR("g_maplist_index"); BADCVAR("halflifebsp"); BADCVAR("sv_mapformat_is_quake2"); BADCVAR("sv_mapformat_is_quake3"); @@ -211,6 +210,8 @@ void cvar_changes_init() BADCVAR("mastervolume"); BADCVAR("volume"); BADCVAR("bgmvolume"); + BADCVAR("in_pitch_min"); + BADCVAR("in_pitch_max"); // private BADCVAR("developer"); @@ -227,14 +228,17 @@ void cvar_changes_init() BADCVAR("sys_specialcharactertranslation"); BADCVAR("timeformat"); BADCVAR("timestamps"); + BADCVAR("g_require_stats"); BADPREFIX("developer_"); BADPREFIX("g_ban_"); BADPREFIX("g_banned_list"); + BADPREFIX("g_require_stats_"); BADPREFIX("g_chat_flood_"); BADPREFIX("g_ghost_items"); BADPREFIX("g_playerstats_"); BADPREFIX("g_voice_flood_"); BADPREFIX("log_file"); + BADPREFIX("quit_"); BADPREFIX("rcon_"); BADPREFIX("sv_allowdownloads"); BADPREFIX("sv_autodemo"); @@ -248,20 +252,28 @@ void cvar_changes_init() // these can contain player IDs, so better hide BADPREFIX("g_forced_team_"); + BADCVAR("sv_muteban_list"); + BADCVAR("sv_allow_customplayermodels_idlist"); + BADCVAR("sv_allow_customplayermodels_speciallist"); // mapinfo BADCVAR("fraglimit"); + BADCVAR("g_arena"); BADCVAR("g_assault"); BADCVAR("g_ca"); BADCVAR("g_ca_teams"); + BADCVAR("g_conquest"); BADCVAR("g_ctf"); BADCVAR("g_cts"); + BADCVAR("g_dotc"); BADCVAR("g_dm"); BADCVAR("g_domination"); BADCVAR("g_domination_default_teams"); BADCVAR("g_freezetag"); BADCVAR("g_freezetag_teams"); BADCVAR("g_invasion_teams"); + BADCVAR("g_jailbreak"); + BADCVAR("g_jailbreak_teams"); BADCVAR("g_keepaway"); BADCVAR("g_keyhunt"); BADCVAR("g_keyhunt_teams"); @@ -272,12 +284,16 @@ void cvar_changes_init() BADCVAR("g_race_laps_limit"); BADCVAR("g_race_qualifying_timelimit"); BADCVAR("g_race_qualifying_timelimit_override"); + BADCVAR("g_runematch"); + BADCVAR("g_snafu"); BADCVAR("g_tdm"); BADCVAR("g_tdm_teams"); + BADCVAR("g_vip"); BADCVAR("leadlimit"); BADCVAR("nextmap"); BADCVAR("teamplay"); BADCVAR("timelimit"); + BADCVAR("g_mapinfo_ignore_warnings"); // long BADCVAR("hostname"); @@ -304,9 +320,12 @@ void cvar_changes_init() // does nothing gameplay relevant BADCVAR("captureleadlimit_override"); + BADCVAR("condump_stripcolors"); BADCVAR("gameversion"); BADCVAR("g_allow_oldvortexbeam"); BADCVAR("g_balance_kill_delay"); + BADCVAR("g_buffs_pickup_anyway"); + BADCVAR("g_buffs_randomize"); BADCVAR("g_campcheck_distance"); BADCVAR("g_ca_point_leadlimit"); BADCVAR("g_ca_point_limit"); @@ -319,31 +338,37 @@ void cvar_changes_init() BADCVAR("g_freezetag_point_limit"); BADCVAR("g_hats"); BADCVAR("g_invasion_point_limit"); + BADCVAR("g_jump_grunt"); BADCVAR("g_keyhunt_point_leadlimit"); BADCVAR("g_nexball_goalleadlimit"); BADCVAR("g_new_toys_use_pickupsound"); BADCVAR("g_physics_predictall"); BADCVAR("g_piggyback"); + BADCVAR("g_playerclip_collisions"); BADCVAR("g_tdm_point_leadlimit"); BADCVAR("g_tdm_point_limit"); BADCVAR("leadlimit_and_fraglimit"); BADCVAR("leadlimit_override"); BADCVAR("pausable"); BADCVAR("sv_checkforpacketsduringsleep"); + BADCVAR("sv_damagetext"); + BADCVAR("sv_db_saveasdump"); BADCVAR("sv_intermission_cdtrack"); BADCVAR("sv_minigames"); BADCVAR("sv_namechangetimer"); BADCVAR("sv_precacheplayermodels"); BADCVAR("sv_stepheight"); BADCVAR("sv_timeout"); + BADCVAR("sv_weapons_modeloverride"); BADPREFIX("crypto_"); BADPREFIX("gameversion_"); BADPREFIX("g_chat_"); BADPREFIX("g_ctf_captimerecord_"); - BADPREFIX("g_maplist_votable_"); + BADPREFIX("g_maplist_"); BADPREFIX("g_mod_"); BADPREFIX("g_respawn_"); BADPREFIX("net_"); + BADPREFIX("notification_"); BADPREFIX("prvm_"); BADPREFIX("skill_"); BADPREFIX("sv_allow_"); @@ -378,6 +403,7 @@ void cvar_changes_init() BADCVAR("g_buffs"); BADCVAR("g_ca_teams_override"); BADCVAR("g_ctf_ignore_frags"); + BADCVAR("g_ctf_leaderboard"); BADCVAR("g_domination_point_limit"); BADCVAR("g_domination_teams_override"); BADCVAR("g_freezetag_teams_override"); @@ -388,18 +414,12 @@ void cvar_changes_init() 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_maxplayers"); BADCVAR("g_mirrordamage"); BADCVAR("g_nexball_goallimit"); BADCVAR("g_norecoil"); BADCVAR("g_physics_clientselect"); + BADCVAR("g_pinata"); BADCVAR("g_powerups"); BADCVAR("g_spawnshieldtime"); BADCVAR("g_start_delay"); @@ -443,6 +463,7 @@ void cvar_changes_init() BADCVAR("teamplay_mode"); BADCVAR("timelimit_override"); BADPREFIX("g_warmup_"); + BADPREFIX("sv_info_"); BADPREFIX("sv_ready_restart_"); // mutators that announce themselves properly to the server browser @@ -1137,7 +1158,7 @@ float(float exponent) MaplistMethod_Shuffle = // more clever shuffling string newlist; // now reinsert this at another position - insertpos = pow(random(), 1 / exponent); // ]0, 1] + insertpos = (random() ** (1 / exponent)); // ]0, 1] insertpos = insertpos * (Map_Count - 1); // ]0, Map_Count - 1] insertpos = ceil(insertpos) + 1; // {2, 3, 4, ..., Map_Count} LOG_TRACE("SHUFFLE: insert pos = ", ftos(insertpos)); @@ -1438,21 +1459,21 @@ void DumpStats(float final) if(to_file) fputs(file, strcat(s, "\n")); - FOREACH_CLIENT(IS_REAL_CLIENT(it) || (IS_BOT_CLIENT(it) && autocvar_sv_logscores_bots), LAMBDA( + FOREACH_CLIENT(IS_REAL_CLIENT(it) || (IS_BOT_CLIENT(it) && autocvar_sv_logscores_bots), { s = strcat(":player:see-labels:", GetPlayerScoreString(it, 0), ":"); - s = strcat(s, ftos(rint(time - it.jointime)), ":"); + s = strcat(s, ftos(rint(time - CS(it).jointime)), ":"); if(IS_PLAYER(it) || MUTATOR_CALLHOOK(GetPlayerStatus, it)) s = strcat(s, ftos(it.team), ":"); else s = strcat(s, "spectator:"); if(to_console) - LOG_INFO(s, it.netname, "\n"); + LOG_INFO(s, playername(it, false), "\n"); if(to_eventlog) - GameLogEcho(strcat(s, ftos(it.playerid), ":", it.netname)); + GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it, false))); if(to_file) - fputs(file, strcat(s, it.netname, "\n")); - )); + fputs(file, strcat(s, playername(it, false), "\n")); + }); if(teamplay) { @@ -1509,9 +1530,9 @@ void FixIntermissionClient(entity e) { stuffcmd(e, "\nscr_printspeed 1000000\n"); RandomSelection_Init(); - FOREACH_WORD(autocvar_sv_intermission_cdtrack, true, LAMBDA( + FOREACH_WORD(autocvar_sv_intermission_cdtrack, true, { RandomSelection_AddString(it, 1, 1); - )); + }); if (RandomSelection_chosen_string != "") { stuffcmd(e, sprintf("\ncd loop %s\n", RandomSelection_chosen_string)); @@ -1528,9 +1549,8 @@ only called if a time or frag limit has expired */ void NextLevel() { - gameover = true; - - intermission_running = 1; + game_stopped = true; + intermission_running = 1; // game over // enforce a wait time before allowing changelevel if(player_count > 0) @@ -1562,11 +1582,11 @@ void NextLevel() GameLogClose(); - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it), { FixIntermissionClient(it); if(it.winning) - bprint(it.netname, " ^7wins.\n"); - )); + bprint(playername(it, false), " ^7wins.\n"); + }); target_music_kill(); @@ -1578,25 +1598,6 @@ void NextLevel() localcmd("\nsv_hook_gameend\n"); } -/* -============ -CheckRules_Player - -Exit deathmatch games upon conditions -============ -*/ -void CheckRules_Player(entity this) -{ - if (gameover) // someone else quit the game already - return; - - if(!IS_DEAD(this)) - this.play_time += frametime; - - // fixme: don't check players; instead check spawnfunc_dom_team and spawnfunc_ctf_team entities - // (div0: and that in CheckRules_World please) -} - float InitiateSuddenDeath() { @@ -1659,22 +1660,22 @@ float GetWinningCode(float fraglimitreached, float equality) // set the .winning flag for exactly those players with a given field value void SetWinners(.float field, float value) { - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(it.winning = (it.(field) == value))); + FOREACH_CLIENT(IS_PLAYER(it), { it.winning = (it.(field) == value); }); } // set the .winning flag for those players with a given field value void AddWinners(.float field, float value) { - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it), { if(it.(field) == value) it.winning = 1; - )); + }); } // clear the .winning flags void ClearWinners() { - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(it.winning = 0)); + FOREACH_CLIENT(IS_PLAYER(it), { it.winning = 0; }); } void ShuffleMaplist() @@ -1767,7 +1768,7 @@ float WinningCondition_RanOutOfSpawns() team1_score = team2_score = team3_score = team4_score = 0; - FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), { switch(it.team) { case NUM_TEAM_1: team1_score = 1; break; @@ -1775,7 +1776,7 @@ float WinningCondition_RanOutOfSpawns() case NUM_TEAM_3: team3_score = 1; break; case NUM_TEAM_4: team4_score = 1; break; } - )); + }); IL_EACH(g_spawnpoints, true, { @@ -1901,13 +1902,13 @@ void CheckRules_World() float playerswithlaps; float readyplayers; totalplayers = playerswithlaps = readyplayers = 0; - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it), { ++totalplayers; if(PlayerScore_Add(it, SP_RACE_FASTEST, 0)) ++playerswithlaps; if(it.ready) ++readyplayers; - )); + }); // at least 2 of the players have completed a lap: start the RACE // otherwise, the players should end the qualifying on their own @@ -2030,7 +2031,9 @@ void Physics_Frame() if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS) continue; - set_movetype(it, it.move_movetype); + //set_movetype(it, it.move_movetype); + // inline the set_movetype function, since this is called a lot + it.movetype = (it.move_qcphysics) ? MOVETYPE_NONE : it.move_movetype; if(it.move_movetype == MOVETYPE_NONE) continue; @@ -2068,6 +2071,8 @@ void EndFrame() entity e = IS_SPEC(it) ? it.enemy : it; if (e.typehitsound) { it.typehit_time = time; + } else if (e.killsound) { + it.kill_time = time; } else if (e.damage_dealt) { it.hit_time = time; it.damage_dealt_total += ceil(e.damage_dealt); @@ -2082,6 +2087,7 @@ void EndFrame() FOREACH_CLIENT(true, { it.typehitsound = false; it.damage_dealt = 0; + it.killsound = false; antilag_record(it, CS(it), altime); }); IL_EACH(g_monsters, true, @@ -2122,7 +2128,7 @@ float RedirectionThink() redirection_nextthink = time + 1; clients_found = 0; - FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA( + FOREACH_CLIENT(IS_REAL_CLIENT(it), { // TODO add timer LOG_INFO("Redirecting: sending connect command to ", it.netname, "\n"); if(redirection_target == "self") @@ -2130,7 +2136,7 @@ float RedirectionThink() else stuffcmd(it, strcat("\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " \"connect ", redirection_target, "\"\n")); ++clients_found; - )); + }); LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.\n"); @@ -2160,7 +2166,7 @@ void RestoreGame() void Shutdown() { - gameover = 2; + game_stopped = 2; if(world_initialized > 0) {