X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fsv_main.qc;h=df1e1e61217b7b87dc0002c9ce13e37a1e3272bb;hp=cb348848950cf0d7733e9d164119aaae393d488a;hb=109c5785a22fb4336ac5e91d5f1fa91678582164;hpb=8248399e782e50a2d45ce28b5175eb3e1d476568 diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index cb3488489..df1e1e612 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -1,3 +1,4 @@ +#include "sv_main.qh" #include "anticheat.qh" #include "g_hook.qh" @@ -101,7 +102,7 @@ void CreatureFrame_FallDamage(entity this) if(!this.hook.state) { float dm = vlen(this.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage. - if (this.deadflag) + if (IS_DEAD(this)) dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor; else dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage); @@ -127,12 +128,10 @@ void CreatureFrame_All() void Pause_TryPause(bool ispaused) { int n = 0; - entity it; - FOR_EACH_REALPLAYER(it) - { + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), LAMBDA( if (PHYS_INPUT_BUTTON_CHAT(it) != ispaused) return; ++n; - } + )); if (!n) return; setpause(ispaused); } @@ -153,12 +152,17 @@ Called before each frame by the server float game_delay; float game_delay_last; +bool autocvar_sv_autopause = true; float RedirectionThink(); +void PM_Main(Client this); void StartFrame() { - SELFPARAM(); + // TODO: if move is more than 50ms, split it into two moves (this matches QWSV behavior and the client prediction) + FOREACH_ENTITY_CLASS(STR_PLAYER, IS_FAKE_CLIENT(it), PM_Main(it)); + FOREACH_ENTITY_CLASS(STR_PLAYER, IS_FAKE_CLIENT(it), WITH(entity, self, it, PlayerPreThink())); + execute_next_frame(); - if (!server_is_dedicated) Pause_TryPause(true); + if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause(true); remove = remove_unsafely; // not during spawning! serverprevtime = servertime; @@ -172,14 +176,12 @@ void StartFrame() LOG_INFO("CEFC time: ", ftos(t * 1000), "ms; "); int c_seeing = 0; int c_seen = 0; - entity cl; - FOR_EACH_CLIENT(cl) - { - if(IS_REAL_CLIENT(cl)) + FOREACH_CLIENT(true, LAMBDA( + if(IS_REAL_CLIENT(it)) ++c_seeing; - if(IS_PLAYER(cl)) + if(IS_PLAYER(it)) ++c_seen; - } + )); LOG_INFO("CEFC calls per second: ", ftos(c_seeing * (c_seen - 1) / t), "; "); LOG_INFO("CEFC 100% load at: ", ftos(solve_quadratic(t, -t, -1) * '0 1 0'), "\n"); @@ -218,11 +220,7 @@ void StartFrame() CreatureFrame_All(); CheckRules_World(); - // if in warmup stage and limit for warmup is hit start match - if(warmup_stage) - if(!gameover) - if((g_warmup_limit > 0 && time >= g_warmup_limit) - || (g_warmup_limit == 0 && autocvar_timelimit != 0 && time >= autocvar_timelimit * 60)) + if(warmup_stage && !gameover && warmup_limit > 0 && time >= warmup_limit) { ReadyRestart(); return; @@ -231,13 +229,9 @@ void StartFrame() bot_serverframe(); anticheat_startframe(); MUTATOR_CALLHOOK(SV_StartFrame); - { - entity e; - FOR_EACH_CLIENT(e) - { - GlobalStats_update(e); - } - } + + FOREACH_CLIENT(true, LAMBDA(GlobalStats_update(it))); + FOREACH_ENTITY_CLASS(STR_PLAYER, IS_FAKE_CLIENT(it), WITH(entity, self, it, PlayerPostThink())); } .vector originjitter; @@ -356,7 +350,7 @@ void SV_OnEntityPreSpawnFunction() } } inv = !inv; -:cvar_fail +LABEL(cvar_fail) // now inv is 1 if we want to keep the item, and 0 if we want to get rid of it if (!inv) {