#include <common/deathtypes/all.qh>
#include <common/debug.qh>
#include <common/mapinfo.qh>
+#include <common/mapobjects/_mod.qh>
#include <common/monsters/sv_monsters.qh>
#include <common/util.qh>
#include <common/vehicles/all.qh>
});
}
+// called shortly after map change in dedicated
void Pause_TryPause_Dedicated(entity this)
{
- if (player_count == 0)
+ if (player_count == 0 && !intermission_running && !autocvar__endmatch)
setpause(1);
}
+// called every normal frame in singleplayer/listen
void Pause_TryPause()
{
int n = 0, p = 0;
setpause(0);
}
+// called every paused frame by DP
void SV_PausedTic(float elapsedtime)
{
- if (!server_is_dedicated)
+ if (autocvar__endmatch) // `endmatch` while paused
+ setpause(0); // proceed to intermission
+ else if (!server_is_dedicated)
{
if (autocvar_sv_autopause)
Pause_TryPause();
void sys_phys_update(entity this, float dt);
void StartFrame()
{
- // TODO: if move is more than 50ms, split it into two moves (this matches QWSV behavior and the client prediction)
- IL_EACH(g_players, IS_FAKE_CLIENT(it), sys_phys_update(it, frametime));
- IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPreThink(it));
+ FOREACH_CLIENT(IS_FAKE_CLIENT(it),
+ {
+ // DP calls these for real clients only
+ sys_phys_update(it, frametime); // called by SV_PlayerPhysics for players
+ PlayerPreThink(it);
+ });
execute_next_frame();
- if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause();
delete_fn = remove_unsafely; // not during spawning!
serverprevtime = servertime;
CreatureFrame_All();
CheckRules_World();
+ // after CheckRules_World() as it may set intermission_running, and after RedirectionThink() in case listen server is closing
+ if (autocvar_sv_autopause && !server_is_dedicated && !intermission_running)
+ Pause_TryPause();
+
if (warmup_stage && !game_stopped && warmup_limit > 0 && time - game_starttime >= warmup_limit) {
ReadyRestart(true);
return;
MUTATOR_CALLHOOK(SV_StartFrame);
GlobalStats_updateglobal();
- FOREACH_CLIENT(true, GlobalStats_update(it));
- IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPostThink(it));
+ FOREACH_CLIENT(true,
+ {
+ GlobalStats_update(it);
+ if (IS_FAKE_CLIENT(it))
+ PlayerPostThink(it); // DP calls this for real clients only
+ PlayerFrame(it);
+ });
}
.vector originjitter;
return v;
}
+/*
+=============
+FindFileInMapPack
+
+Returns the first matching VFS file path that exists in the current map's pack.
+Returns string_null if no files match or the map isn't packaged.
+=============
+*/
+string FindFileInMapPack(string pattern)
+{
+ if (!checkextension("DP_QC_FS_SEARCH_PACKFILE"))
+ return string_null;
+
+ string base_pack = whichpack(strcat("maps/", mapname, ".bsp"));
+ if (base_pack == "" || !base_pack) // this map isn't packaged or there was an error
+ return string_null;
+
+ int glob = search_packfile_begin(pattern, true, true, base_pack);
+ if (glob < 0)
+ return string_null;
+
+ string file = search_getfilename(glob, 0);
+ search_end(glob);
+ return file;
+}
+
void WarpZone_PostInitialize_Callback()
{
// create waypoint links for warpzones