+#include "sv_main.qh"
#include "anticheat.qh"
#include "g_hook.qh"
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);
void CreatureFrame_All()
{
- for(entity e = world; (e = findfloat(e, damagedbycontents, true)); )
- {
- if (e.movetype == MOVETYPE_NOCLIP) { continue; }
-
- CreatureFrame_Liquids(e);
- CreatureFrame_FallDamage(e);
+ FOREACH_ENTITY_FLOAT(damagedbycontents, true, LAMBDA(
+ if(it.movetype == MOVETYPE_NOCLIP) continue;
+ CreatureFrame_Liquids(it);
+ CreatureFrame_FallDamage(it);
+ it.oldvelocity = it.velocity;
+ ));
+}
- e.oldvelocity = e.velocity;
- }
+void Pause_TryPause(bool ispaused)
+{
+ int n = 0;
+ FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), LAMBDA(
+ if (PHYS_INPUT_BUTTON_CHAT(it) != ispaused) return;
+ ++n;
+ ));
+ if (!n) return;
+ setpause(ispaused);
}
+void SV_PausedTic(float elapsedtime)
+{
+ if (!server_is_dedicated) Pause_TryPause(false);
+}
/*
=============
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 (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause(true);
remove = remove_unsafely; // not during spawning!
serverprevtime = servertime;
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");
}
#endif
- for(entity e = world; (e = findfloat(e, csqcprojectile_clientanimate, 1)); )
- CSQCProjectile_Check(e);
+ FOREACH_ENTITY_FLOAT(csqcprojectile_clientanimate, true, LAMBDA(CSQCProjectile_Check(it)));
if(RedirectionThink())
return;
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;
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;
float DoesQ3ARemoveThisEntity();
void SV_OnEntityPreSpawnFunction()
{SELFPARAM();
+ __spawnfunc_expect = this;
if (self)
if (self.gametypefilter != "")
if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, self.gametypefilter))
}
}
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)
{