#include "main.qh"
-#include "anticheat.qh"
-#include "hook.qh"
-#include "damage.qh"
-#include "world.qh"
-#include "spawnpoints.qh"
-#include <server/ipban.qh>
-#include <server/gamelog.qh>
-
-#include "bot/api.qh"
-
-#include "command/common.qh"
-
-#include <server/mutators/_mod.qh>
-#include "weapons/csqcprojectile.qh"
-#include <server/weapons/common.qh>
-#include <server/compat/quake3.qh>
-
-#include "../common/constants.qh"
#include <common/command/generic.qh>
-#include "../common/deathtypes/all.qh"
-#include "../common/debug.qh"
-#include "../common/mapinfo.qh"
-#include "../common/util.qh"
-
-#include "../common/vehicles/all.qh"
+#include <common/constants.qh>
+#include <common/deathtypes/all.qh>
+#include <common/debug.qh>
+#include <common/mapinfo.qh>
#include <common/monsters/sv_monsters.qh>
+#include <common/util.qh>
+#include <common/vehicles/all.qh>
#include <common/weapons/_all.qh>
+#include <lib/csqcmodel/sv_model.qh>
+#include <lib/warpzone/common.qh>
+#include <lib/warpzone/server.qh>
+#include <server/anticheat.qh>
+#include <server/bot/api.qh>
+#include <server/command/common.qh>
+#include <server/compat/quake3.qh>
+#include <server/damage.qh>
+#include <server/gamelog.qh>
+#include <server/hook.qh>
+#include <server/ipban.qh>
+#include <server/mutators/_mod.qh>
+#include <server/spawnpoints.qh>
+#include <server/weapons/common.qh>
+#include <server/weapons/csqcprojectile.qh>
+#include <server/world.qh>
-#include "../lib/csqcmodel/sv_model.qh"
-
-#include "../lib/warpzone/common.qh"
-#include "../lib/warpzone/server.qh"
+void dropclient_do(entity this)
+{
+ if (this.owner)
+ dropclient(this.owner);
+ delete(this);
+}
+/**
+ * Schedules dropclient for a player and returns true;
+ * if dropclient is already scheduled (for that player) it does nothing and returns false.
+ *
+ * NOTE: this function exists only to allow sending a message to the kicked player with
+ * Send_Notification, which doesn't work if called together with dropclient
+ */
+bool dropclient_schedule(entity this)
+{
+ bool scheduled = false;
+ FOREACH_ENTITY_CLASS("dropclient_handler", true,
+ {
+ if(it.owner == this)
+ {
+ scheduled = true;
+ break; // can't use return here, compiler shows a warning
+ }
+ });
+ if (scheduled)
+ return false;
+
+ entity e = new_pure(dropclient_handler);
+ setthink(e, dropclient_do);
+ e.owner = this;
+ e.nextthink = time + 0.1;
+ return true;
+}
void CreatureFrame_hotliquids(entity this)
{
});
}
-void Pause_TryPause(bool ispaused)
+void Pause_TryPause_Dedicated(entity this)
+{
+ if (player_count == 0)
+ setpause(1);
+}
+
+void Pause_TryPause()
{
- int n = 0;
- FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), {
- if (PHYS_INPUT_BUTTON_CHAT(it) != ispaused) return;
+ int n = 0, p = 0;
+ FOREACH_CLIENT(IS_REAL_CLIENT(it), {
+ if (PHYS_INPUT_BUTTON_CHAT(it)) ++p;
++n;
});
if (!n) return;
- setpause(ispaused);
+ if (n == p)
+ setpause(1);
+ else
+ setpause(0);
}
void SV_PausedTic(float elapsedtime)
{
- if (!server_is_dedicated) Pause_TryPause(false);
+ if (!server_is_dedicated)
+ {
+ if (autocvar_sv_autopause)
+ Pause_TryPause();
+ else
+ setpause(0);
+ }
}
void dedicated_print(string input)
bool game_delay_last;
-bool autocvar_sv_autopause = false;
void systems_update();
void sys_phys_update(entity this, float dt);
void StartFrame()
IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPreThink(it));
execute_next_frame();
- if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause(true);
+ if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause();
delete_fn = remove_unsafely; // not during spawning!
serverprevtime = servertime;
CreatureFrame_All();
CheckRules_World();
- if (warmup_stage && !game_stopped && warmup_limit > 0 && time >= warmup_limit) {
- ReadyRestart();
+ if (warmup_stage && !game_stopped && warmup_limit > 0 && time - game_starttime >= warmup_limit) {
+ ReadyRestart(true);
return;
}
if (!e.fullspawndata)
{
- LOG_WARNF("^1EDICT %s (classname %s) has no fullspawndata, engine lacks support?", ftos(num_for_edict(e)), e.classname);
+ //LOG_WARNF("^1EDICT %s (classname %s) has no fullspawndata, engine lacks support?", ftos(num_for_edict(e)), e.classname);
return v;
}