Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
world.qc File Reference
#include "world.qh"
#include <common/checkextension.qh>
#include <common/constants.qh>
#include <common/deathtypes/all.qh>
#include <common/gametypes/_mod.qh>
#include <common/gametypes/sv_rules.qh>
#include <common/items/_mod.qh>
#include <common/mapinfo.qh>
#include <common/mapobjects/target/music.qh>
#include <common/mapobjects/trigger/hurt.qh>
#include <common/mapobjects/trigger/secret.qh>
#include <common/mapobjects/triggers.qh>
#include <common/monsters/_mod.qh>
#include <common/monsters/sv_monsters.qh>
#include <common/mutators/mutator/powerups/_mod.qh>
#include <common/net_linked.qh>
#include <common/notifications/all.qh>
#include <common/physics/player.qh>
#include <common/playerstats.qh>
#include <common/state.qh>
#include <common/stats.qh>
#include <common/teams.qh>
#include <common/util.qh>
#include <common/vehicles/all.qh>
#include <common/weapons/_all.qh>
#include <lib/warpzone/common.qh>
#include <server/anticheat.qh>
#include <server/antilag.qh>
#include <server/bot/api.qh>
#include <server/campaign.qh>
#include <server/cheats.qh>
#include <server/client.qh>
#include <server/command/common.qh>
#include <server/command/getreplies.qh>
#include <server/command/sv_cmd.qh>
#include <server/command/vote.qh>
#include <server/damage.qh>
#include <server/gamelog.qh>
#include <server/hook.qh>
#include <server/ipban.qh>
#include <server/items/items.qh>
#include <server/main.qh>
#include <server/mapvoting.qh>
#include <server/mutators/_mod.qh>
#include <server/race.qh>
#include <server/scores.qh>
#include <server/scores_rules.qh>
#include <server/spawnpoints.qh>
#include <server/teamplay.qh>
#include <server/weapons/weaponstats.qh>
Include dependency graph for world.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define BADCVAR(p)
#define BADPREFIX(p)
#define BADPREFIX_COND(p)
#define BADPRESUFFIX(p, s)
#define BADPRESUFFIXVALUE(p, s, val)
#define BADSUFFIX_COND(s)
#define BADVALUE(p, val)
#define X(match)

Functions

void __init_dedicated_server_shutdown ()
void AddWinners (.float field, float value)
void CheckRules_World ()
void ClearWinners ()
void cvar_changes_init ()
void DropToFloor_QC (entity this)
void DropToFloor_QC_DelayedInit (entity this)
void DumpStats (float final)
void EndFrame ()
void GameplayMode_DelayedInit (entity this)
float GetWinningCode (float fraglimitreached, float equality)
void GotoFirstMap (entity this)
void InitGameplayMode ()
void InitializeEntitiesRun ()
void InitializeEntity (entity e, void(entity this) func, int order)
void InitiateOvertime ()
int InitiateSuddenDeath ()
void MatchEnd_RestoreSpectatorAndTeamStatus (.int prev_team_field)
void MatchEnd_RestoreSpectatorStatus ()
bool MoveToRandomLocationWithinBounds (entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, int attempts, float maxaboveground, float minviewdistance, bool frompos)
float MoveToRandomMapLocation (entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
void NextLevel ()
void Physics_Frame ()
void PingPLReport_Spawn ()
void PingPLReport_Think (entity this)
bool RandomSeed_Send (entity this, entity to, int sf)
void RandomSeed_Spawn ()
void RandomSeed_Think (entity this)
void readlevelcvars ()
void readplayerstartcvars ()
float RedirectionThink ()
void RestoreGame ()
void RunThink (entity this, float dt)
void SetDefaultAlpha ()
void SetWinners (.float field, float value)
void Shutdown ()
 spawnfunc (__init_dedicated_server)
 spawnfunc (light)
 spawnfunc (worldspawn)
 STATIC_INIT_EARLY (maxclients)
void systems_update ()
int want_weapon (entity weaponinfo, int allguns)
void weaponarena_available_all_update (entity this)
void weaponarena_available_devall_update (entity this)
void weaponarena_available_most_update (entity this)
WepSet weapons_all ()
WepSet weapons_devall ()
WepSet weapons_most ()
WepSet weapons_start ()
 Weapons the player normally starts with outside weapon arena.
float WinningCondition_RanOutOfSpawns ()
float WinningCondition_Scores (float limit, float leadlimit)

Variables

bool autocvar_sv_freezenonclients
bool autocvar_sv_gameplayfix_multiplethinksperframe = true
int fragsleft_last
float latency_cnt
float latency_sum
const float LATENCY_THINKRATE = 10
float latency_time
entity pingplreport
entity randomseed
float redirection_nextthink
float redirection_timeout
const float SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS = 1
bool world_already_spawned

Macro Definition Documentation

◆ BADCVAR

#define BADCVAR ( p)
Value:
if(k == p) continue

Referenced by cvar_changes_init().

◆ BADPREFIX

#define BADPREFIX ( p)
Value:
if(BADPREFIX_COND(p)) continue
#define BADPREFIX_COND(p)

Referenced by cvar_changes_init().

◆ BADPREFIX_COND

#define BADPREFIX_COND ( p)
Value:
(substring(k, 0, strlen(p)) == p)
#define strlen
string substring(string s, float start, float length)

◆ BADPRESUFFIX

#define BADPRESUFFIX ( p,
s )
Value:
if(BADPREFIX_COND(p) && BADSUFFIX_COND(s)) continue
#define BADSUFFIX_COND(s)

Referenced by cvar_changes_init().

◆ BADPRESUFFIXVALUE

#define BADPRESUFFIXVALUE ( p,
s,
val )
Value:
if(BADPREFIX_COND(p) && BADSUFFIX_COND(s) && v == val) continue

Referenced by cvar_changes_init().

◆ BADSUFFIX_COND

#define BADSUFFIX_COND ( s)
Value:
(substring(k, -strlen(s), -1) == s)

◆ BADVALUE

#define BADVALUE ( p,
val )
Value:
if (k == p && v == val) continue

Referenced by cvar_changes_init().

◆ X

#define X ( match)
Value:
MACRO_BEGIN \
int fd = search_begin(match, true, false); \
if (fd >= 0) \
{ \
for (int i = 0, j = search_getsize(fd); i < j; ++i) \
{ \
s = cons(s, search_getfilename(fd, i)); \
} \
search_end(fd); \
} \
#define MACRO_END
Definition macro.qh:7
string search_getfilename(float handle, float num)
float search_getsize(float handle)
float search_begin(string pattern, float caseinsensitive, float quiet)
ERASEABLE string cons(string a, string b)
Definition string.qh:276

Referenced by spawnfunc().

Function Documentation

◆ __init_dedicated_server_shutdown()

void __init_dedicated_server_shutdown ( )

Definition at line 650 of file world.qc.

650 {
652}
void MapInfo_Shutdown()
Definition mapinfo.qc:1651

References MapInfo_Shutdown().

Referenced by Shutdown().

◆ AddWinners()

void AddWinners ( .float field,
float value )

Definition at line 1525 of file world.qc.

1526{
1527 FOREACH_CLIENT(IS_PLAYER(it) || INGAME(it), {
1528 if(it.(field) == value)
1529 it.winning = 1;
1530 });
1531}
#define IS_PLAYER(s)
Definition player.qh:243
#define INGAME(it)
Definition sv_rules.qh:24
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50

References FOREACH_CLIENT, INGAME, and IS_PLAYER.

Referenced by WinningCondition_RanOutOfSpawns().

◆ CheckRules_World()

void CheckRules_World ( )

Definition at line 1705 of file world.qc.

1706{
1707 VoteThink();
1708 MapVote_Think();
1709
1711
1712 if (intermission_running) // someone else quit the game already
1713 {
1714 if(player_count == 0) // Nobody there? Then let's go to the next map
1715 MapVote_Start();
1716 // this will actually check the player count in the next frame
1717 // again, but this shouldn't hurt
1718 return;
1719 }
1720
1721 float timelimit = autocvar_timelimit * 60;
1722 float fraglimit = autocvar_fraglimit;
1723 float leadlimit = autocvar_leadlimit;
1724 if (leadlimit < 0) leadlimit = 0;
1725
1726 if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
1727 {
1728 if(timelimit > 0)
1729 timelimit = 0; // timelimit is not made for warmup
1730 if(fraglimit > 0)
1731 fraglimit = 0; // no fraglimit for now
1732 leadlimit = 0; // no leadlimit for now
1733 }
1734
1735 if (autocvar__endmatch || timelimit < 0)
1736 {
1737 // endmatch
1738 NextLevel();
1739 return;
1740 }
1741
1742 if(timelimit > 0)
1743 timelimit += game_starttime;
1744
1745 int overtimes_prev = overtimes;
1746 int wantovertime = 0;
1747
1749 {
1751 {
1754 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_RACE_FINISHLAP);
1755 else
1756 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_FRAG);
1757 }
1758 }
1759 else
1760 {
1761 if (timelimit && time >= timelimit)
1762 {
1763 if(g_race && (g_race_qualifying == 2) && timelimit > 0)
1764 {
1765 float totalplayers;
1766 float playerswithlaps;
1767 float readyplayers;
1768 totalplayers = playerswithlaps = readyplayers = 0;
1770 ++totalplayers;
1771 if(GameRules_scoring_add(it, RACE_FASTEST, 0))
1772 ++playerswithlaps;
1773 if(it.ready)
1774 ++readyplayers;
1775 });
1776
1777 // at least 2 of the players have completed a lap: start the RACE
1778 // otherwise, the players should end the qualifying on their own
1779 if(readyplayers || playerswithlaps >= 2)
1780 {
1782 ReadyRestart(true); // go to race
1783 return;
1784 }
1785 else
1786 wantovertime |= InitiateSuddenDeath();
1787 }
1788 else
1789 wantovertime |= InitiateSuddenDeath();
1790 }
1791 }
1792
1794 {
1795 NextLevel();
1796 return;
1797 }
1798
1799 int checkrules_status = WinningCondition_RanOutOfSpawns();
1800 if(checkrules_status == WINNING_YES)
1801 bprint("Hey! Someone ran out of spawns!\n");
1802 else if(MUTATOR_CALLHOOK(CheckRules_World, checkrules_status, timelimit, fraglimit))
1803 checkrules_status = M_ARGV(0, float);
1804 else
1805 checkrules_status = WinningCondition_Scores(fraglimit, leadlimit);
1806
1807 if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME)
1808 {
1809 checkrules_status = WINNING_NEVER;
1811 wantovertime |= InitiateSuddenDeath();
1812 }
1813
1814 if(checkrules_status == WINNING_NEVER)
1815 // equality cases! Nobody wins if the overtime ends in a draw.
1816 ClearWinners();
1817
1818 if(wantovertime)
1819 {
1820 if(checkrules_status == WINNING_NEVER)
1822 else
1823 checkrules_status = WINNING_YES;
1824 }
1825
1827 if(checkrules_status != WINNING_NEVER || time >= checkrules_suddendeathend)
1828 checkrules_status = WINNING_YES;
1829
1830 if(checkrules_status == WINNING_YES)
1831 {
1832 if (overtimes == OVERTIME_SUDDENDEATH && overtimes != overtimes_prev)
1833 {
1834 // if suddendeathend overtime has just begun, revert it
1836 overtimes = overtimes_prev;
1837 }
1838 //print("WINNING\n");
1839 NextLevel();
1840 }
1841}
int player_count
Definition api.qh:103
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
bool warmup_stage
Definition main.qh:120
#define g_race
Definition race.qh:48
#define M_ARGV(x, type)
Definition events.qh:17
const int OVERTIME_SUDDENDEATH
Definition stats.qh:77
#define autocvar_timelimit
Definition stats.qh:92
#define autocvar_fraglimit
Definition stats.qh:90
float game_starttime
Definition stats.qh:82
int overtimes
Definition stats.qh:86
int autocvar_leadlimit
Definition stats.qh:84
float time
bool intermission_running
void bprint(string text,...)
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
#define NULL
Definition post.qh:14
void VoteThink()
Definition vote.qc:336
void ReadyRestart(bool forceWarmupEnd)
Definition vote.qc:526
void MapVote_Think()
Definition mapvoting.qc:758
void MapVote_Start()
Definition mapvoting.qc:743
int g_race_qualifying
Definition race.qh:13
#define GameRules_scoring_add(client, fld, value)
Definition sv_rules.qh:85
void InitiateOvertime()
Definition world.qc:1479
int InitiateSuddenDeath()
Definition world.qc:1447
void SetDefaultAlpha()
Definition world.qc:105
void ClearWinners()
Definition world.qc:1534
void CheckRules_World()
Definition world.qc:1705
void NextLevel()
Definition world.qc:1384
float WinningCondition_Scores(float limit, float leadlimit)
Definition world.qc:1540
float WinningCondition_RanOutOfSpawns()
Definition world.qc:1621
const int WINNING_NEVER
Definition world.qh:134
float checkrules_suddendeathwarning
Definition world.qh:36
const int WINNING_STARTSUDDENDEATHOVERTIME
Definition world.qh:135
int checkrules_overtimesadded
Definition world.qh:38
float checkrules_suddendeathend
Definition world.qh:37
bool autocvar__endmatch
Definition world.qh:6
const int WINNING_YES
Definition world.qh:133

References autocvar__endmatch, autocvar_fraglimit, autocvar_leadlimit, autocvar_timelimit, bprint(), checkrules_overtimesadded, checkrules_suddendeathend, checkrules_suddendeathwarning, CheckRules_World(), ClearWinners(), FOREACH_CLIENT, g_race, g_race_qualifying, game_starttime, GameRules_scoring_add, InitiateOvertime(), InitiateSuddenDeath(), intermission_running, IS_PLAYER, M_ARGV, MapVote_Start(), MapVote_Think(), MUTATOR_CALLHOOK, NextLevel(), NULL, OVERTIME_SUDDENDEATH, overtimes, player_count, ReadyRestart(), Send_Notification(), SetDefaultAlpha(), time, VoteThink(), warmup_stage, WINNING_NEVER, WINNING_STARTSUDDENDEATHOVERTIME, WINNING_YES, WinningCondition_RanOutOfSpawns(), and WinningCondition_Scores().

Referenced by CheckRules_World(), MUTATOR_HOOKABLE(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), and StartFrame().

◆ ClearWinners()

void ClearWinners ( )

Definition at line 1534 of file world.qc.

1535{
1536 FOREACH_CLIENT(IS_PLAYER(it) || INGAME(it), { it.winning = 0; });
1537}

References FOREACH_CLIENT, INGAME, and IS_PLAYER.

Referenced by CheckRules_World(), WinningCondition_Invasion(), WinningCondition_LMS(), WinningCondition_RanOutOfSpawns(), and WinningCondition_Scores().

◆ cvar_changes_init()

void cvar_changes_init ( )

Definition at line 145 of file world.qc.

146{
147 float h;
148 string k, v, d;
149 float n, i, adding, pureadding;
150
154
155 h = buf_create();
156 buf_cvarlist(h, "", "_"); // exclude all _ cvars as they are temporary
157 n = buf_getsize(h);
158
159 adding = true;
160 pureadding = true;
161
162 for(i = 0; i < n; ++i)
163 {
164 k = bufstr_get(h, i);
165
166#define BADPREFIX_COND(p) (substring(k, 0, strlen(p)) == p)
167#define BADSUFFIX_COND(s) (substring(k, -strlen(s), -1) == s)
168
169#define BADPREFIX(p) if(BADPREFIX_COND(p)) continue
170#define BADPRESUFFIX(p, s) if(BADPREFIX_COND(p) && BADSUFFIX_COND(s)) continue
171#define BADCVAR(p) if(k == p) continue
172#define BADVALUE(p, val) if (k == p && v == val) continue
173#define BADPRESUFFIXVALUE(p, s, val) if(BADPREFIX_COND(p) && BADSUFFIX_COND(s) && v == val) continue
174
175 // general excludes and namespaces for server admin used cvars
176 BADPREFIX("help_"); // PN's server has this listed as changed, let's not rat him out for THAT
177
178 // internal
179 BADPREFIX("csqc_");
180 BADPREFIX("cvar_check_");
181 BADCVAR("gamecfg");
182 BADCVAR("g_configversion");
183 BADCVAR("halflifebsp");
184 BADCVAR("sv_mapformat_is_quake2");
185 BADCVAR("sv_mapformat_is_quake3");
186 BADPREFIX("sv_world");
187
188 // client
189 BADPREFIX("chase_");
190 BADPREFIX("cl_");
191 BADPREFIX("con_");
192 BADPREFIX("scoreboard_");
193 BADPREFIX("g_campaign");
194 BADPREFIX("g_waypointsprite_");
195 BADPREFIX("gl_");
196 BADPREFIX("joy");
197 BADPREFIX("hud_");
198 BADPREFIX("m_");
199 BADPREFIX("menu_");
200 BADPREFIX("net_slist_");
201 BADPREFIX("r_");
202 BADPREFIX("sbar_");
203 BADPREFIX("scr_");
204 BADPREFIX("snd_");
205 BADPREFIX("show");
206 BADPREFIX("sensitivity");
207 BADPREFIX("userbind");
208 BADPREFIX("v_");
209 BADPREFIX("vid_");
210 BADPREFIX("crosshair");
211 BADPREFIX("notification_");
212 BADPREFIX("prvm_");
213 BADCVAR("mod_q3bsp_lightmapmergepower");
214 BADCVAR("mod_q3bsp_nolightmaps");
215 BADCVAR("fov");
216 BADCVAR("mastervolume");
217 BADCVAR("volume");
218 BADCVAR("bgmvolume");
219 BADCVAR("in_pitch_min");
220 BADCVAR("in_pitch_max");
221 BADCVAR("bottomcolor");
222 BADCVAR("topcolor");
223 BADCVAR("playermodel");
224
225 // private
226 BADCVAR("developer");
227 BADCVAR("log_dest_udp");
228 BADCVAR("net_address");
229 BADCVAR("net_address_ipv6");
230 BADCVAR("port");
231 BADCVAR("savedgamecfg");
232 BADCVAR("serverconfig");
233 BADCVAR("sv_autoscreenshot");
234 BADCVAR("sv_heartbeatperiod");
235 BADCVAR("sv_vote_master_ids");
236 BADCVAR("sv_vote_master_password");
237 BADCVAR("sys_colortranslation");
238 BADCVAR("sys_specialcharactertranslation");
239 BADCVAR("timeformat");
240 BADCVAR("timestamps");
241 BADCVAR("g_require_stats");
242 BADCVAR("g_chatban_list");
243 BADCVAR("g_playban_list");
244 BADCVAR("g_playban_minigames");
245 BADCVAR("g_voteban_list");
246 BADPREFIX("developer_");
247 BADPREFIX("g_ban_");
248 BADPREFIX("g_banned_list");
249 BADPREFIX("g_require_stats_");
250 BADPREFIX("g_chat_flood_");
251 BADPREFIX("g_ghost_items");
252 BADPREFIX("g_playerstats_");
253 BADPREFIX("g_voice_flood_");
254 BADPREFIX("log_file");
255 BADPREFIX("quit_");
256 BADPREFIX("rcon_");
257 BADPREFIX("sv_allowdownloads");
258 BADPREFIX("sv_autodemo");
259 BADPREFIX("sv_curl_");
260 BADPREFIX("sv_eventlog");
261 BADPREFIX("sv_logscores_");
262 BADPREFIX("sv_master");
263 BADPREFIX("sv_weaponstats_");
264 BADPREFIX("sv_waypointsprite_");
265 BADCVAR("rescan_pending");
266
267 // these can contain player IDs, so better hide
268 BADPREFIX("g_forced_team_");
269 BADCVAR("sv_allow_customplayermodels_idlist");
270 BADCVAR("sv_allow_customplayermodels_speciallist");
271
272 // mapinfo
273 BADCVAR("fraglimit");
274 BADCVAR("g_arena");
275 BADCVAR("g_assault");
276 BADCVAR("g_ca");
277 BADCVAR("g_ca_teams");
278 BADCVAR("g_conquest");
279 BADCVAR("g_conquest_teams");
280 BADCVAR("g_ctf");
281 BADCVAR("g_cts");
282 BADCVAR("g_dotc");
283 BADCVAR("g_dm");
284 BADCVAR("g_domination");
285 BADCVAR("g_domination_default_teams");
286 BADCVAR("g_duel");
287 BADCVAR("g_duel_not_dm_maps");
288 BADCVAR("g_freezetag");
289 BADCVAR("g_freezetag_teams");
290 BADCVAR("g_invasion_type");
291 BADCVAR("g_jailbreak");
292 BADCVAR("g_jailbreak_teams");
293 BADCVAR("g_keepaway");
294 BADCVAR("g_keyhunt");
295 BADCVAR("g_keyhunt_teams");
296 BADCVAR("g_lms");
297 BADCVAR("g_mayhem");
298 BADCVAR("g_nexball");
299 BADCVAR("g_onslaught");
300 BADCVAR("g_race");
301 BADCVAR("g_race_laps_limit");
302 BADCVAR("g_race_qualifying_timelimit");
303 BADCVAR("g_race_qualifying_timelimit_override");
304 BADCVAR("g_runematch");
305 BADCVAR("g_shootfromeye");
306 BADCVAR("g_snafu");
307 BADCVAR("g_survival");
308 BADCVAR("g_survival_not_dm_maps");
309 BADCVAR("g_tdm");
310 BADCVAR("g_tdm_on_dm_maps");
311 BADCVAR("g_tdm_teams");
312 BADCVAR("g_tka");
313 BADCVAR("g_tka_on_ka_maps");
314 BADCVAR("g_tka_on_tdm_maps");
315 BADCVAR("g_tka_teams");
316 BADCVAR("g_tmayhem");
317 BADCVAR("g_tmayhem_teams");
318 BADCVAR("g_vip");
319 BADCVAR("leadlimit");
320 BADCVAR("teamplay");
321 BADCVAR("timelimit");
322 BADCVAR("g_mapinfo_q3compat");
323 BADCVAR("g_mapinfo_settemp_acl");
324 BADCVAR("g_mapinfo_ignore_warnings");
325 BADCVAR("g_maplist_ignore_sizes");
326 BADCVAR("g_maplist_sizes_count_bots");
327
328 // long
329 BADCVAR("hostname");
330 BADCVAR("g_maplist");
331 BADCVAR("g_maplist_mostrecent");
332 BADCVAR("sv_motd");
333 BADCVAR("sv_termsofservice_url");
334 BADCVAR("sv_adminnick");
335
336 v = cvar_string(k);
337 d = cvar_defstring(k);
338 if(v == d)
339 continue;
340
341 if(adding)
342 {
343 if (cvar_changes == "")
344 cvar_changes = "// this server runs at modified server settings:\n";
345
346 cvar_changes = strcat(cvar_changes, k, " \"", v, "\" // \"", d, "\"\n");
348 {
349 cvar_changes = "// too many settings have been changed to show them here\n";
350 adding = 0;
351 }
352 }
353
354 // now check if the changes are actually gameplay relevant
355
356 // does nothing gameplay relevant
357 BADCVAR("captureleadlimit_override");
358 BADCVAR("condump_stripcolors");
359 BADCVAR("fs_gamedir");
360 BADCVAR("g_allow_oldvortexbeam");
361 BADCVAR("g_balance_kill_delay");
362 BADCVAR("g_buffs_pickup_anyway");
363 BADCVAR("g_buffs_randomize");
364 BADCVAR("g_buffs_randomize_teamplay");
365 BADCVAR("g_campcheck_distance");
366 BADCVAR("g_chatsounds");
367 BADCVAR("g_ca_point_leadlimit");
368 BADCVAR("g_ca_point_limit");
369 BADCVAR("g_ca_spectate_enemies");
370 BADCVAR("g_ctf_captimerecord_always");
371 BADCVAR("g_ctf_flag_glowtrails");
372 BADCVAR("g_ctf_dynamiclights");
373 BADCVAR("g_ctf_flag_pickup_verbosename");
374 BADCVAR("g_ctf_flagcarrier_auto_helpme_damage");
375 BADPRESUFFIX("g_ctf_flag_", "_model");
376 BADPRESUFFIX("g_ctf_flag_", "_skin");
377 BADCVAR("g_domination_point_leadlimit");
378 BADCVAR("g_forced_respawn");
379 BADCVAR("g_freezetag_point_leadlimit");
380 BADCVAR("g_freezetag_point_limit");
381 BADCVAR("g_glowtrails");
382 BADCVAR("g_hats");
383 BADCVAR("g_casings");
384 BADCVAR("g_invasion_point_limit");
385 BADCVAR("g_jump_grunt");
386 BADCVAR("g_keepaway_ballcarrier_effects");
387 BADCVAR("g_keepawayball_effects");
388 BADCVAR("g_keyhunt_point_leadlimit");
389 BADCVAR("g_nexball_goalleadlimit");
390 BADCVAR("g_new_toys_autoreplace");
391 BADCVAR("g_new_toys_use_pickupsound");
392 BADCVAR("g_physics_predictall");
393 BADCVAR("g_piggyback");
394 BADCVAR("g_playerclip_collisions");
395 BADCVAR("g_spawn_alloweffects");
396 BADCVAR("g_tdm_point_leadlimit");
397 BADCVAR("g_tdm_point_limit");
398 BADCVAR("g_mayhem_point_limit");
399 BADCVAR("g_mayhem_point_leadlimit");
400 BADCVAR("g_tmayhem_point_limit");
401 BADCVAR("g_tmayhem_point_leadlimit");
402 BADCVAR("leadlimit_and_fraglimit");
403 BADCVAR("leadlimit_override");
404 BADCVAR("pausable");
405 BADCVAR("sv_announcer");
406 BADCVAR("sv_autopause");
407 BADCVAR("sv_checkforpacketsduringsleep");
408 BADCVAR("sv_damagetext");
409 BADCVAR("sv_db_saveasdump");
410 BADCVAR("sv_intermission_cdtrack");
411 BADCVAR("sv_mapchange_delay");
412 BADCVAR("sv_minigames");
413 BADCVAR("sv_namechangetimer");
414 BADCVAR("sv_precacheplayermodels");
415 BADCVAR("sv_qcphysics");
416 BADCVAR("sv_radio");
417 BADCVAR("sv_stepheight");
418 BADCVAR("sv_timeout");
419 BADCVAR("sv_weapons_modeloverride");
420 BADCVAR("w_prop_interval");
421 BADPREFIX("chat_");
422 BADPREFIX("crypto_");
423 BADPREFIX("g_chat_");
424 BADPREFIX("g_ctf_captimerecord_");
425 BADPREFIX("g_hats_");
426 BADPREFIX("g_maplist_");
427 BADPREFIX("g_mod_");
428 BADPREFIX("g_respawn_");
429 BADPREFIX("net_");
430 BADPREFIX("skill_");
431 BADPREFIX("sv_allow_");
432 BADPREFIX("sv_maxidle");
433 BADPREFIX("sv_minigames_");
434 BADPREFIX("sv_radio_");
435 BADPREFIX("sv_timeout_");
436 BADPREFIX("sv_vote_");
437 BADPREFIX("timelimit_");
438 BADPRESUFFIX("g_", "_round_timelimit");
439 BADPRESUFFIX("g_", "_round_enddelay");
440
441 // allowed changes to server admins (please sync this to server.cfg)
442 // vi commands:
443 // :/"impure"/,$d
444 // :g!,^\/\/[^ /],d
445 // :%s,//\‍([^ ]*\‍).*,BADCVAR("\1");,
446 // :%!sort
447 // yes, this does contain some redundant stuff, don't really care
448 BADPREFIX("bot_ai_");
449 BADCVAR("bot_config_file");
450 BADCVAR("bot_number");
451 BADCVAR("bot_prefix");
452 BADCVAR("bot_suffix");
453 BADCVAR("capturelimit_override");
454 BADCVAR("fraglimit_override");
455 BADCVAR("gametype");
456 BADCVAR("g_antilag");
457 BADCVAR("g_balance_teams");
458 BADCVAR("g_balance_teams_queue");
459 BADCVAR("g_balance_teams_remove");
460 BADCVAR("g_balance_teams_remove_wait");
461 BADCVAR("g_balance_teams_prevent_imbalance");
462 BADCVAR("g_balance_teams_scorefactor");
463 BADCVAR("g_ban_sync_trusted_servers");
464 BADCVAR("g_ban_sync_uri");
465 BADCVAR("g_buffs");
466 BADCVAR("g_ca_teams_override");
467 BADCVAR("g_ca_prevent_stalemate");
468 BADCVAR("g_ctf_fullbrightflags");
469 BADCVAR("g_ctf_ignore_frags");
470 BADCVAR("g_ctf_leaderboard");
471 BADCVAR("g_domination_point_limit");
472 BADCVAR("g_domination_teams_override");
473 BADCVAR("g_freezetag_revive_spawnshield");
474 BADCVAR("g_freezetag_teams_override");
475 BADCVAR("g_friendlyfire");
476 BADCVAR("g_fullbrightitems");
477 BADCVAR("g_fullbrightplayers");
478 BADCVAR("g_keyhunt_point_limit");
479 BADCVAR("g_keyhunt_teams_override");
480 BADCVAR("g_lms_lives_override");
481 BADCVAR("g_mayhem_powerups");
482 BADCVAR("g_maplist");
483 BADCVAR("g_maxplayers");
484 BADCVAR("g_mirrordamage");
485 BADCVAR("g_nexball_goallimit");
486 BADCVAR("g_norecoil");
487 BADCVAR("g_physics_clientselect");
488 BADCVAR("g_pinata");
489 BADCVAR("g_powerups");
490 BADCVAR("g_powerups_drop_ondeath");
491 BADCVAR("g_player_brightness");
492 BADCVAR("g_rocket_flying");
493 BADCVAR("g_rocket_flying_disabledelays");
494 BADPREFIX("g_spawnshield");
495 BADCVAR("g_start_delay");
496 BADCVAR("g_superspectate");
497 BADCVAR("g_tdm_teams_override");
498 BADCVAR("g_tmayhem_teams_override");
499 BADCVAR("g_tmayhem_powerups");
500 BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
501 BADCVAR("hostname");
502 BADCVAR("log_file");
503 BADCVAR("maxplayers");
504 BADCVAR("minplayers");
505 BADCVAR("minplayers_per_team");
506 BADCVAR("net_address");
507 BADCVAR("port");
508 BADCVAR("rcon_password");
509 BADCVAR("rcon_restricted_commands");
510 BADCVAR("rcon_restricted_password");
511 BADCVAR("skill");
512 BADCVAR("sv_autoscreenshot");
513 BADCVAR("sv_autotaunt");
514 BADCVAR("sv_curl_defaulturl");
515 BADCVAR("sv_defaultcharacter");
516 BADCVAR("sv_defaultcharacterskin");
517 BADCVAR("sv_defaultplayercolors");
518 BADCVAR("sv_defaultplayermodel");
519 BADCVAR("sv_defaultplayerskin");
520 BADCVAR("sv_maxrate");
521 BADCVAR("sv_motd");
522 BADCVAR("sv_public");
523 BADCVAR("sv_showfps");
524 BADCVAR("sv_showskill");
525 BADCVAR("sv_showspectators");
526 BADCVAR("sv_status_privacy");
527 BADCVAR("sv_taunt");
528 BADCVAR("sv_vote_call");
529 BADCVAR("sv_vote_commands");
530 BADCVAR("sv_vote_majority_factor");
531 BADPREFIX("sv_vote_master");
532 BADCVAR("sv_vote_simple_majority_factor");
533 BADVALUE("sys_ticrate", "0.0078125");
534 BADVALUE("sys_ticrate", "0.015625");
535 BADVALUE("sys_ticrate", "0.03125");
536 BADCVAR("teamplay_mode");
537 BADCVAR("timelimit_override");
538 BADPREFIX("g_warmup");
539 BADPREFIX("sv_info_");
540 BADPREFIX("sv_ready_restart_");
541 BADCVAR("sv_teamnagger");
542
543 BADPRESUFFIXVALUE("g_", "_weaponarena", "most");
544 BADPRESUFFIXVALUE("g_", "_weaponarena", "most_available");
545
546 // mutators that announce themselves properly to the server browser
547 BADCVAR("g_instagib");
548 BADCVAR("g_new_toys");
549 BADCVAR("g_nix");
550 BADCVAR("g_grappling_hook");
551 BADCVAR("g_jetpack");
552
553#undef BADPRESUFFIX
554#undef BADPREFIX
555#undef BADCVAR
556#undef BADVALUE
557#undef BADPRESUFFIXVALUE
558
559 if(pureadding)
560 {
561 if (cvar_purechanges == "")
562 cvar_purechanges = "// this server runs at modified gameplay settings:\n";
563
564 cvar_purechanges = strcat(cvar_purechanges, k, " \"", v, "\" // \"", d, "\"\n");
566 {
567 cvar_purechanges = "// too many settings have been changed to show them here\n";
568 pureadding = 0;
569 }
570 }
572 // WARNING: this variable is used for the server list
573 // NEVER dare to skip this code!
574 // Hacks to intentionally appearing as "pure server" even though you DO have
575 // modified settings may be punished by removal from the server list.
576 // You can do to the variables cvar_changes and cvar_purechanges all you want,
577 // though.
578 }
579 buf_del(h);
580
581 if(cvar_changes == "")
582 cvar_changes = "// this server runs at default server settings\n";
584
585 if(cvar_purechanges == "")
586 cvar_purechanges = "// this server runs at default gameplay settings\n";
588}
#define buf_create
const string cvar_string(string name)
const string cvar_defstring(string name)
string strzone(string s)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define VM_TEMPSTRING_MAXSIZE
Definition string.qh:8
#define strfree(this)
Definition string.qh:59
#define BADCVAR(p)
#define BADPREFIX(p)
#define BADVALUE(p, val)
#define BADPRESUFFIX(p, s)
#define BADPRESUFFIXVALUE(p, s, val)
string cvar_changes
Definition world.qh:45
float cvar_purechanges_count
Definition world.qh:47
string cvar_purechanges
Definition world.qh:46

References BADCVAR, BADPREFIX, BADPRESUFFIX, BADPRESUFFIXVALUE, BADVALUE, buf_create, cvar_changes, cvar_defstring(), cvar_purechanges, cvar_purechanges_count, cvar_string(), strcat(), strfree, strlen, strzone(), and VM_TEMPSTRING_MAXSIZE.

Referenced by spawnfunc().

◆ DropToFloor_QC()

void DropToFloor_QC ( entity this)

Definition at line 2283 of file world.qc.

2284{
2285 int nudgeresult;
2286
2287 if(!this || wasfreed(this))
2288 {
2289 LOG_WARN("DropToFloor_QC: can not modify free entity");
2290 return;
2291 }
2292
2293 /* Prior to sv_legacy_bbox_expand 0, both droptofloor and nudgeoutofsolid_OrFallback were done for items
2294 * using box '-16 -16 0' '16 16 48' (without the FL_ITEM expansion applied),
2295 * which often resulted in bboxes partially in solids once expansion was applied.
2296 * We don't want bboxes in solids (bad for gameplay and culling),
2297 * but we also don't want items to land on a "skirting board" or the base of a sloping wall.
2298 * For initial nudgeoutofsolid_OrFallback and droptofloor stages we use a small box
2299 * so they fall as far and in the same place as they traditionally would,
2300 * then we nudge the full size box out of solid, in a direction appropriate for the plane(s).
2301 */
2302 vector saved_mins = this.mins; // gmqcc's used-uninitialized check doesn't handle
2303 vector saved_maxs = this.maxs; // making these assignments FL_ITEM conditional.
2304 if (this.flags & FL_ITEM)
2305 {
2306 // Using the Q3 bbox for best compatibility with all maps, except...
2307 this.mins.x = -15;
2308 this.mins.y = -15;
2309 this.maxs.x = 15;
2310 this.maxs.y = 15;
2311 this.maxs.z = this.mins.z + 30; // ...Nex, Xon and Quake use a different vertical offset, see also: StartItem()
2312 }
2313
2314 /* NOTE: sv_gameplayfix_droptofloorstartsolid_nudgetocorrect isn't checked, so it won't need to be networked to CSQC.
2315 * It was enabled by default in all Xonotic releases and in Nexuiz, so now certain maps depend on it.
2316 * Example: on erbium 0.8.6 the shards @ crylink are too low (in collision with the floor),
2317 * so without this those fall through the floor.
2318 * Q3, Q2 and Quake don't try to move items out of solid.
2319 */
2320 if(!Q3COMPAT_COMMON && autocvar_sv_mapformat_is_quake3) // Xonotic, Nexuiz
2321 {
2322 nudgeresult = nudgeoutofsolid_OrFallback(this);
2323 if (!nudgeresult)
2324 LOG_WARNF("DropToFloor_QC at \"%v\": COULD NOT FIX badly placed entity \"%s\" before drop", this.origin, this.classname);
2325 else if (nudgeresult > 0)
2326 LOG_WARNF("DropToFloor_QC at \"%v\": FIXED badly placed entity \"%s\" before drop", this.origin, this.classname);
2327 }
2329 {
2330 if (this.flags & FL_ITEM)
2331 this.origin.z += 6;
2332 else
2333 this.origin.z += 1; // monsters 1, misc_explobox 2 but we don't support those currently
2334 }
2335
2336 vector end = this.origin;
2338 end.z -= 4096;
2340 end.z -= 128;
2341 else
2342 end.z -= 256; // Quake, QuakeWorld
2343 tracebox(this.origin, this.mins, this.maxs, end, MOVE_NOMONSTERS, this);
2344
2346 {
2347 // Quake games just delete badly placed items (and misc_explobox)...
2348 if (this.flags & FL_ITEM)
2349 {
2350 LOG_WARNF("DropToFloor_QC at \"%v\" (Quake compat): DELETING badly placed item \"%s\"", this.origin, this.classname);
2351 delete(this);
2352 return;
2353 }
2354 // ...not monsters though...
2355 LOG_WARNF("DropToFloor_QC at \"%v\" (Quake compat): badly placed entity \"%s\"", this.origin, this.classname);
2356 }
2358 {
2359 // ...but we can't do that on Q3 maps like jamdm1
2360 // because our tracebox hits things Q3's trace doesn't (patches?).
2361 LOG_WARNF("DropToFloor_QC at \"%v\" (Quake 3 compat): badly placed entity \"%s\"", this.origin, this.classname);
2362 }
2363
2364 /* NOTE: sv_gameplayfix_droptofloorstartsolid (fallback from tracebox to traceline) isn't implemented.
2365 * It was disabled by default in all Xonotic releases and in Nexuiz.
2366 * Q3 doesn't support it (always uses its '-15 -15 -15' '15 15 15' box when dropping items), neither does Quake or Q2.
2367 */
2368
2369 if (!autocvar_sv_mapformat_is_quake2) // Quake, Q3, Nexuiz, Xonotic
2370 // allow to ride movers (or unset if in freefall)
2371 this.groundentity = trace_ent;
2372
2374 // if support is destroyed, keep suspended (gross hack for floating items in various maps)
2375 // bones_was_here: is this for Q1BSP only? Which maps use it? Do we need it at all? Intentions unclear in DP...
2376 this.move_suspendedinair = true;
2377
2378 if (trace_fraction)
2379 this.origin = trace_endpos;
2380
2381 if (this.flags & FL_ITEM)
2382 {
2383 this.mins = saved_mins;
2384 this.maxs = saved_maxs;
2385
2386 // A side effect of using a small box to drop items (and do the initial nudge) is
2387 // the full size box can end up in collision with a sloping floor or terrain model.
2388 nudgeresult = nudgeoutofsolid_OrFallback(this);
2389 // No warns for successful nudge because it would spam about items on slopes/terrain.
2390 }
2391 else if (trace_allsolid && trace_fraction) // dropped using "proper" bbox but never left solid
2392 {
2393 nudgeresult = nudgeoutofsolid_OrFallback(this);
2394 if (nudgeresult > 0)
2395 LOG_WARNF("DropToFloor_QC at \"%v\": FIXED badly placed entity \"%s\" after drop", this.origin, this.classname);
2396 }
2397 else
2398 nudgeresult = -1;
2399
2400 if (!nudgeresult)
2401 if (!Q3COMPAT_COMMON) // to be expected on Q3 maps like gu3-pewter because we use bigger final bboxes
2402 LOG_WARNF("DropToFloor_QC at \"%v\": COULD NOT FIX stuck entity \"%s\" after drop", this.origin, this.classname);
2403
2404 setorigin(this, this.dropped_origin = this.origin);
2405}
#define Q3COMPAT_COMMON
Definition stats.qh:368
const int FL_ITEM
Definition constants.qh:77
string classname
float flags
const float MOVE_NOMONSTERS
entity trace_ent
vector mins
vector trace_endpos
float trace_startsolid
vector maxs
vector origin
float trace_fraction
float trace_allsolid
#define LOG_WARNF(...)
Definition log.qh:62
#define LOG_WARN(...)
Definition log.qh:61
entity groundentity
Definition movetypes.qh:93
float move_suspendedinair
Definition movetypes.qh:94
vector
Definition self.qh:92
bool autocvar_sv_mapformat_is_quake3
Definition world.qh:32
vector dropped_origin
Definition world.qh:154
bool autocvar_sv_mapformat_is_quake2
Definition world.qh:33

References autocvar_sv_mapformat_is_quake2, autocvar_sv_mapformat_is_quake3, classname, dropped_origin, entity(), FL_ITEM, flags, groundentity, LOG_WARN, LOG_WARNF, maxs, mins, MOVE_NOMONSTERS, move_suspendedinair, origin, Q3COMPAT_COMMON, trace_allsolid, trace_endpos, trace_ent, trace_fraction, trace_startsolid, and vector.

Referenced by DropToFloor_QC_DelayedInit().

◆ DropToFloor_QC_DelayedInit()

void DropToFloor_QC_DelayedInit ( entity this)

Definition at line 2407 of file world.qc.

2408{
2410}
const int INITPRIO_DROPTOFLOOR
Definition constants.qh:97
void InitializeEntity(entity e, void(entity this) func, int order)
Definition world.qc:2209
void DropToFloor_QC(entity this)
Definition world.qc:2283

References DropToFloor_QC(), entity(), InitializeEntity(), and INITPRIO_DROPTOFLOOR.

Referenced by ctf_FlagSetup(), dom_controlpoint_setup(), MUTATOR_HOOKFUNCTION(), ons_ControlPoint_Setup(), ons_GeneratorSetup(), spawn_item_key(), StartItem(), and turret_initialize().

◆ DumpStats()

void DumpStats ( float final)

Definition at line 1244 of file world.qc.

1245{
1246 float file;
1247 string s;
1248 float to_console;
1249 float to_eventlog;
1250 float to_file;
1251 float i;
1252
1253 to_console = autocvar_sv_logscores_console;
1254 to_eventlog = autocvar_sv_eventlog;
1256
1257 if(!final)
1258 {
1259 to_console = true; // always print printstats replies
1260 to_eventlog = false; // but never print them to the event log
1261 }
1262
1263 if(to_eventlog)
1265 to_console = false; // otherwise we get the output twice
1266
1267 if(final)
1268 s = ":scores:";
1269 else
1270 s = ":status:";
1271 s = strcat(s, GetGametype(), "_", GetMapname(), ":", ftos(rint(time)));
1272
1273 if(to_console)
1274 LOG_HELP(s);
1275 if(to_eventlog)
1276 GameLogEcho(s);
1277
1278 file = -1;
1279 if(to_file)
1280 {
1282 if(file == -1)
1283 to_file = false;
1284 else
1285 fputs(file, strcat(s, "\n"));
1286 }
1287
1288 s = strcat(":labels:player:", GetPlayerScoreString(NULL, 0));
1289 if(to_console)
1290 LOG_HELP(s);
1291 if(to_eventlog)
1292 GameLogEcho(s);
1293 if(to_file)
1294 fputs(file, strcat(s, "\n"));
1295
1297 s = strcat(":player:see-labels:", GetPlayerScoreString(it, 0), ":");
1298 s = strcat(s, ftos(rint(time - CS(it).jointime)), ":");
1299 if(IS_PLAYER(it) || INGAME_JOINED(it))
1300 s = strcat(s, ftos(it.team), ":");
1301 else
1302 s = strcat(s, "spectator:");
1303
1304 if(to_console)
1305 LOG_HELP(s, playername(it.netname, it.team, false));
1306 if(to_eventlog)
1307 GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it.netname, it.team, false)));
1308 if(to_file)
1309 fputs(file, strcat(s, playername(it.netname, it.team, false), "\n"));
1310 });
1311
1312 if(teamplay)
1313 {
1314 s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
1315 if(to_console)
1316 LOG_HELP(s);
1317 if(to_eventlog)
1318 GameLogEcho(s);
1319 if(to_file)
1320 fputs(file, strcat(s, "\n"));
1321
1322 for(i = 1; i < 16; ++i)
1323 {
1324 s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
1325 s = strcat(s, ":", ftos(i));
1326 if(to_console)
1327 LOG_HELP(s);
1328 if(to_eventlog)
1329 GameLogEcho(s);
1330 if(to_file)
1331 fputs(file, strcat(s, "\n"));
1332 }
1333 }
1334
1335 if(to_console)
1336 LOG_HELP(":end");
1337 if(to_eventlog)
1338 GameLogEcho(":end");
1339 if(to_file)
1340 {
1341 fputs(file, ":end\n");
1342 fclose(file);
1343 }
1344}
string playername(string thename, int teamid, bool team_colorize)
Definition util.qc:2082
const float FILE_APPEND
void GameLogEcho(string s)
Definition gamelog.qc:15
bool autocvar_sv_eventlog_console
Definition gamelog.qh:4
bool autocvar_sv_eventlog
Definition gamelog.qh:3
string GetMapname()
string GetGametype()
#define LOG_HELP(...)
Definition log.qh:85
void fclose(float fhandle)
void fputs(float fhandle, string s)
float fopen(string filename, float mode)
float rint(float f)
string ftos(float f)
string GetTeamScoreString(int tm, float shortString)
Definition scores.qc:674
string GetPlayerScoreString(entity pl, float shortString)
Returns score strings for eventlog etc.
Definition scores.qc:613
float jointime
Definition client.qh:66
ClientState CS(Client this)
Definition state.qh:47
#define INGAME_JOINED(it)
Definition sv_rules.qh:25
bool teamplay
Definition teams.qh:59
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15
bool autocvar_sv_logscores_file
Definition world.qh:21
bool autocvar_sv_logscores_console
Definition world.qh:20
bool autocvar_sv_logscores_bots
Definition world.qh:19
string autocvar_sv_logscores_filename
Definition world.qh:22

References autocvar_sv_eventlog, autocvar_sv_eventlog_console, autocvar_sv_logscores_bots, autocvar_sv_logscores_console, autocvar_sv_logscores_file, autocvar_sv_logscores_filename, CS(), fclose(), FILE_APPEND, fopen(), FOREACH_CLIENT, fputs(), ftos(), GameLogEcho(), GetGametype(), GetMapname(), GetPlayerScoreString(), GetTeamScoreString(), INGAME_JOINED, IS_BOT_CLIENT, IS_PLAYER, IS_REAL_CLIENT, jointime, LOG_HELP, NULL, playername(), rint(), strcat(), teamplay, and time.

Referenced by GameCommand_printstats(), and NextLevel().

◆ EndFrame()

void EndFrame ( )

Definition at line 2483 of file world.qc.

2484{
2486
2487 Physics_Frame();
2488
2490 entity e = IS_SPEC(it) ? it.enemy : it;
2491 if (e.typehitsound) {
2492 STAT(TYPEHIT_TIME, it) = time;
2493 } else if (e.killsound) {
2494 STAT(KILL_TIME, it) = time;
2495 } else if (e.hitsound_damage_dealt) {
2496 STAT(HIT_TIME, it) = time;
2497 // NOTE: this is not accurate as client code doesn't need so much accuracy for its purposes
2498 STAT(HITSOUND_DAMAGE_DEALT_TOTAL, it) += ceil(e.hitsound_damage_dealt);
2499 }
2500 });
2501 // add 1 frametime because after this, engine SV_Physics
2502 // increases time by a frametime and then networks the frame
2503 // add another frametime because client shows everything with
2504 // 1 frame of lag (cl_nolerp 0). The last +1 however should not be
2505 // needed!
2506 float altime = time + frametime * (1 + autocvar_g_antilag_nudge);
2507 FOREACH_CLIENT(true, {
2508 it.typehitsound = false;
2509 it.hitsound_damage_dealt = 0;
2510 it.killsound = false;
2511 antilag_record(it, CS(it), altime);
2512 if(it.death_time == time && IS_PLAYER(it) && IS_DEAD(it))
2513 {
2514 // player's bbox gets resized now, instead of in the damage event that killed the player,
2515 // once all the damage events of this frame have been processed with normal size
2516 float h = ceil((it.mins.z + it.maxs.z) * PL_CORPSE_SCALE * 10) / 10;
2517 it.maxs.z = max(h, it.mins.z + 1);
2518 setsize(it, it.mins, it.maxs);
2519 }
2520 });
2521 IL_EACH(g_monsters, true,
2522 {
2523 antilag_record(it, it, altime);
2524 });
2525 IL_EACH(g_projectiles, it.classname == "nade",
2526 {
2527 antilag_record(it, it, altime);
2528 });
2530 IL_ENDFRAME();
2531}
void anticheat_endframe()
Definition anticheat.qc:250
void antilag_record(entity e, entity store, float t)
Definition antilag.qc:21
float autocvar_g_antilag_nudge
Definition antilag.qh:4
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define IS_DEAD(s)
Definition player.qh:245
const float PL_CORPSE_SCALE
Definition constants.qh:60
float frametime
ERASEABLE void IL_ENDFRAME()
#define IL_EACH(this, cond, body)
#define STAT(...)
Definition stats.qh:82
float ceil(float f)
float max(float f,...)
IntrusiveList g_projectiles
Definition common.qh:58
IntrusiveList g_monsters
#define IS_SPEC(v)
Definition utils.qh:10
void systems_update()
Definition main.qc:7
void Physics_Frame()
Definition world.qc:2441

References anticheat_endframe(), antilag_record(), autocvar_g_antilag_nudge, ceil(), CS(), entity(), FOREACH_CLIENT, frametime, g_monsters, g_projectiles, IL_EACH, IL_ENDFRAME(), IS_DEAD, IS_PLAYER, IS_REAL_CLIENT, IS_SPEC, max(), Physics_Frame(), PL_CORPSE_SCALE, STAT, systems_update(), and time.

◆ GameplayMode_DelayedInit()

void GameplayMode_DelayedInit ( entity this)

Definition at line 662 of file world.qc.

663{
664 // at this stage team entities are spawned, teamplay contains the number of them
665
668
669 if (warmup_stage >= 0 && autocvar_g_maxplayers >= 0)
670 return;
671 if (!g_duel)
673
674 if (autocvar_g_maxplayers < 0)
675 {
676 if (map_maxplayers <= 0)
677 map_maxplayers = maxclients; // unlimited, but may need rounding
679 if (teamplay)
680 {
681 // automatic maxplayers should be a multiple of team count
682 int down = map_maxplayers % AVAILABLE_TEAMS;
683 int up = AVAILABLE_TEAMS - down;
684 map_maxplayers += (up < down && up + map_maxplayers <= maxclients) ? up : -down;
685 }
686 }
687
688 if (warmup_stage < 0)
689 {
690 int m = GetPlayerLimit();
691 if (m <= 0)
692 m = maxclients;
694 if (teamplay)
695 {
696 // automatic minplayers should be a multiple of team count
697 int down = map_minplayers % AVAILABLE_TEAMS;
698 int up = AVAILABLE_TEAMS - down;
699 map_minplayers += (up <= down && up + map_minplayers <= m) ? up : -down;
700 }
701 }
702 else
703 map_minplayers = 0; // don't display a minimum if it's not used (g_maxplayers < 0 && g_warmup >= 0)
704}
float maxclients
string mapname
#define g_duel
Definition duel.qh:32
bool MapReadSizes(string map)
Definition mapinfo.qc:1409
int map_minplayers
Definition mapinfo.qh:190
int map_maxplayers
Definition mapinfo.qh:191
float bound(float min, float value, float max)
void ScoreRules_generic()
#define AVAILABLE_TEAMS
int GetPlayerLimit()
Definition client.qc:2127
int autocvar_g_maxplayers
Definition client.qh:44
entity scores_initialized
Definition scores.qh:7

References autocvar_g_maxplayers, AVAILABLE_TEAMS, bound(), entity(), g_duel, GetPlayerLimit(), map_maxplayers, map_minplayers, mapname, MapReadSizes(), max(), maxclients, ScoreRules_generic(), scores_initialized, teamplay, and warmup_stage.

Referenced by InitGameplayMode().

◆ GetWinningCode()

float GetWinningCode ( float fraglimitreached,
float equality )

Definition at line 1490 of file world.qc.

1491{
1492 if(autocvar_g_campaign == 1)
1493 {
1494 if(fraglimitreached)
1495 return WINNING_YES;
1496 else
1497 return WINNING_NO;
1498 }
1499 else
1500 {
1501 if(equality)
1502 {
1503 if(fraglimitreached)
1505 else
1506 return WINNING_NEVER;
1507 }
1508 else
1509 {
1510 if(fraglimitreached)
1511 return WINNING_YES;
1512 else
1513 return WINNING_NO;
1514 }
1515 }
1516}
bool autocvar_g_campaign
Definition menu.qc:747
const int WINNING_NO
Definition world.qh:132

References autocvar_g_campaign, WINNING_NEVER, WINNING_NO, WINNING_STARTSUDDENDEATHOVERTIME, and WINNING_YES.

Referenced by WinningCondition_Scores().

◆ GotoFirstMap()

void GotoFirstMap ( entity this)

Definition at line 116 of file world.qc.

117{
118 float n;
120 {
121 // cvar_set("_sv_init", "0");
122 // we do NOT set this to 0 any more, so someone "accidentally" changing
123 // to this "init" map on a dedicated server will cause no permanent harm
124
127
128 if(!DoNextMapOverride(1))
129 GotoNextMap(1);
130
131 return;
132 }
133
134 if(time < 5)
135 {
136 this.nextthink = time;
137 }
138 else
139 {
140 this.nextthink = time + 1;
141 LOG_INFO("Waiting for _sv_init being set to 1 by initialization scripts...");
142 }
143}
float nextthink
float DoNextMapOverride(float reinit)
void GotoNextMap(float reinit)
#define LOG_INFO(...)
Definition log.qh:65
float MapInfo_FilterGametype(Gametype pGametype, int pFeatures, int pFlagsRequired, int pFlagsForbidden, bool pAbortOnGenerate)
Definition mapinfo.qc:177
int MapInfo_RequiredFlags()
Definition mapinfo.qc:1679
Gametype MapInfo_CurrentGametype()
Definition mapinfo.qc:1490
int MapInfo_ForbiddenFlags()
Definition mapinfo.qc:1664
int MapInfo_CurrentFeatures()
Definition mapinfo.qc:1480
void MapInfo_Enumerate()
Definition mapinfo.qc:134
bool autocvar__sv_init
Definition world.qh:5

References autocvar__sv_init, DoNextMapOverride(), entity(), GotoNextMap(), LOG_INFO, MapInfo_CurrentFeatures(), MapInfo_CurrentGametype(), MapInfo_Enumerate(), MapInfo_FilterGametype(), MapInfo_ForbiddenFlags(), MapInfo_RequiredFlags(), nextthink, and time.

Referenced by spawnfunc().

◆ InitGameplayMode()

void InitGameplayMode ( )

Definition at line 706 of file world.qc.

707{
708 VoteReset(false);
709
710 // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
712 // assign reflectively to avoid "assignment to world" warning
713 for (int i = 0, done = 0, n = numentityfields(); i < n; ++i)
714 {
715 string k = entityfieldname(i);
716 vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0';
717 if (v)
718 {
719 putentityfieldstring(i, world, sprintf("%v", v));
720 if (++done == 2) break;
721 }
722 }
723 // currently, NetRadiant's limit is 131072 qu for each side
724 // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu
725 // set the distance according to map size but don't go over the limit to avoid issues with float precision
726 // in case somebody makes extremely large maps
727 max_shot_distance = min(230000, vlen(world.maxs - world.mins));
728
730 GameRules_teams(false);
731
732 if (!cvar_value_issafe(world.fog))
733 {
734 LOG_INFO("The current map contains a potentially harmful fog setting, ignored");
735 world.fog = string_null;
736 }
737 if(MapInfo_Map_fog != "")
738 {
739 if(MapInfo_Map_fog == "none")
740 world.fog = string_null;
741 else
743 }
745
747
750 cvar_set("_sv_vote_gametype_custom", ""); // clear it immediately so it can't get stuck
751
754
756}
void get_mi_min_max(float mode)
Definition util.qc:678
vector mi_min
Definition util.qh:127
vector mi_max
Definition util.qh:128
const int INITPRIO_GAMETYPE_FALLBACK
Definition constants.qh:95
ERASEABLE bool cvar_value_issafe(string s)
Definition cvar.qh:11
void MapInfo_LoadMapSettings(string s)
Definition mapinfo.qc:1580
void MapInfo_ClearTemps()
Definition mapinfo.qc:1639
string MapInfo_Map_fog
Definition mapinfo.qh:12
string MapInfo_Map_clientstuff
Definition mapinfo.qh:11
void cvar_set(string name, string value)
float vlen(vector v)
float min(float f,...)
string string_null
Definition nil.qh:9
#define world
Definition post.qh:15
void VoteReset(bool verbose)
Definition vote.qc:129
#define strcpy(this, s)
Definition string.qh:52
void GameRules_teams(bool value)
Definition sv_rules.qc:3
int max_shot_distance
Definition weapon.qh:203
void GameplayMode_DelayedInit(entity this)
Definition world.qc:662
string loaded_gametype_custom_string
Definition world.qh:53
string clientstuff
Definition world.qh:61
bool gametype_custom_enabled
Definition world.qh:52
string cache_lastmutatormsg
Definition world.qh:70
string autocvar__sv_vote_gametype_custom
Definition world.qh:51
string cache_mutatormsg
Definition world.qh:69

References autocvar__sv_vote_gametype_custom, cache_lastmutatormsg, cache_mutatormsg, clientstuff, cvar_set(), cvar_value_issafe(), GameplayMode_DelayedInit(), GameRules_teams(), gametype_custom_enabled, get_mi_min_max(), InitializeEntity(), INITPRIO_GAMETYPE_FALLBACK, loaded_gametype_custom_string, LOG_INFO, MapInfo_ClearTemps(), MapInfo_LoadMapSettings(), MapInfo_Map_clientstuff, MapInfo_Map_fog, mapname, max_shot_distance, mi_max, mi_min, min(), NULL, strcpy, string_null, strzone(), vector, vlen(), VoteReset(), and world.

Referenced by spawnfunc().

◆ InitializeEntitiesRun()

void InitializeEntitiesRun ( )

Definition at line 2242 of file world.qc.

2243{
2244 entity startoflist = initialize_entity_first;
2247 for (entity e = startoflist; e; e = e.initialize_entity_next)
2248 {
2249 e.remove_except_protected_forbidden = 1;
2250 }
2251 for (entity e = startoflist; e; )
2252 {
2253 e.remove_except_protected_forbidden = 0;
2254 e.initialize_entity_order = 0;
2255 entity next = e.initialize_entity_next;
2256 e.initialize_entity_next = NULL;
2257 var void(entity this) func = e.initialize_entity;
2258 e.initialize_entity = func_null;
2259 if (e.classname == "initialize_entity")
2260 {
2261 entity wrappee = e.enemy;
2262 builtin_remove(e);
2263 e = wrappee;
2264 }
2265 //dprint("Delayed initialization: ", e.classname, "\n");
2266 if (func)
2267 {
2268 func(e);
2269 }
2270 else
2271 {
2272 eprint(e);
2273 backtrace(strcat("Null function in: ", e.classname, "\n"));
2274 }
2275 e = next;
2276 }
2278}
next
Definition all.qh:93
#define backtrace(msg)
Definition log.qh:99
void eprint(entity e)
var void func_null()
void
Definition self.qh:72
void remove_unsafely(entity e)
Definition main.qc:276
void remove_except_protected(entity e)
Definition main.qc:269
var void delete_fn(entity e)
entity initialize_entity_first
Definition world.qh:121

References backtrace, delete_fn(), entity(), eprint(), func_null(), initialize_entity_first, next, NULL, remove_except_protected(), remove_unsafely(), strcat(), and void.

Referenced by StartFrame().

◆ InitializeEntity()

void InitializeEntity ( entity e,
void(entity this) func,
int order )

Definition at line 2209 of file world.qc.

2210{
2211 entity prev, cur;
2212
2213 if (!e || e.initialize_entity)
2214 {
2215 // make a proxy initializer entity
2216 entity e_old = e;
2217 e = new(initialize_entity);
2218 e.enemy = e_old;
2219 }
2220
2221 e.initialize_entity = func;
2222 e.initialize_entity_order = order;
2223
2225 prev = NULL;
2226 for (;;)
2227 {
2228 if (!cur || cur.initialize_entity_order > order)
2229 {
2230 // insert between prev and cur
2231 if (prev)
2232 prev.initialize_entity_next = e;
2233 else
2235 e.initialize_entity_next = cur;
2236 return;
2237 }
2238 prev = cur;
2239 cur = cur.initialize_entity_next;
2240 }
2241}
prev
Definition all.qh:71

References entity(), initialize_entity_first, NULL, and prev.

Referenced by buffs_Initialize(), ctf_FlagSetup(), ctf_Initialize(), dom_Initialize(), DropToFloor_QC_DelayedInit(), g_clientmodel_init(), g_model_init(), InitGameplayMode(), invasion_Initialize(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), nb_Initialize(), ons_ControlPoint_Setup(), ons_GeneratorSetup(), ons_Initialize(), readplayerstartcvars(), REGISTER_MUTATOR(), relocate_spawnpoint(), SetBrushEntityModel(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), spawnfunc(), StartItem(), target_checkpoint_setup(), tdm_Initialize(), tmayhem_Initialize(), and turret_initialize().

◆ InitiateOvertime()

void InitiateOvertime ( )

Definition at line 1479 of file world.qc.

1480{
1482 // NOTE: here overtimes can never be < 0 so it can be safely sent as (unsigned) int stat; we ignore
1483 // the upper limit of OVERTIME_SUDDENDEATH - 1 = 16777215 - 1 that in practice can never be reached in game
1485 //add one more overtime by simply extending the timelimit
1487 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_TIME, autocvar_timelimit_overtime * 60);
1488}
float autocvar_timelimit_overtime
Definition world.qh:28

References autocvar_timelimit, autocvar_timelimit_overtime, checkrules_overtimesadded, cvar_set(), ftos(), NULL, overtimes, and Send_Notification().

Referenced by CheckRules_World().

◆ InitiateSuddenDeath()

int InitiateSuddenDeath ( )

Definition at line 1447 of file world.qc.

1448{
1449 // Check first whether normal overtimes could be added before initiating suddendeath mode
1450 // - for this timelimit_overtime needs to be >0 of course
1451 // - also check the winning condition calculated in the previous frame and only add normal overtime
1452 // again, if at the point at which timelimit would be extended again, still no winner was found
1456 {
1457 return 1; // need to call InitiateOvertime later
1458 }
1459 else
1460 {
1462 {
1464 {
1465 checkrules_suddendeathend = time; // no suddendeath in campaign
1466 }
1467 else
1468 {
1471 }
1474 }
1475 return 0;
1476 }
1477}
void race_StartCompleting()
Definition race.qc:1240
float autocvar_timelimit_suddendeath
Definition world.qh:30
int autocvar_timelimit_overtimes
Definition world.qh:29

References autocvar_g_campaign, autocvar_timelimit_overtime, autocvar_timelimit_overtimes, autocvar_timelimit_suddendeath, checkrules_overtimesadded, checkrules_suddendeathend, g_race, g_race_qualifying, OVERTIME_SUDDENDEATH, overtimes, race_StartCompleting(), and time.

Referenced by CheckRules_World().

◆ MatchEnd_RestoreSpectatorAndTeamStatus()

void MatchEnd_RestoreSpectatorAndTeamStatus ( .int prev_team_field)

Definition at line 1350 of file world.qc.

1351{
1352 bool fix_team = (teamplay && prev_team_field != team);
1353 FOREACH_CLIENT(true,
1354 {
1355 if (!IS_PLAYER(it) && INGAME_JOINING(it))
1356 {
1358 PutObserverInServer(it, true, false);
1359 bprint(playername(it.netname, it.team, false), " has been moved back to spectator");
1360 it.winning = false;
1361 }
1362 else if (fix_team && INGAME_JOINED(it) && it.(prev_team_field) && it.team != it.(prev_team_field))
1363 {
1365 if (MoveToTeam(it, Team_TeamToIndex(it.(prev_team_field)), 6))
1366 {
1367 string pl_name = playername(it.netname, it.team, false);
1368 bprint(pl_name, " has been moved back to the ", Team_ColoredFullName(it.team));
1369 }
1370 it.winning = (it.team == WinningConditionHelper_winnerteam);
1371 }
1372 });
1373}
int team
Definition main.qh:188
void PutObserverInServer(entity this, bool is_forced, bool use_spawnpoint)
putting a client as observer in the server
Definition client.qc:261
float WinningConditionHelper_winnerteam
the color of the winning team, or -1 if none
Definition scores.qh:109
#define INGAME_STATUS_CLEAR(it)
Definition sv_rules.qh:22
#define INGAME_JOINING(it)
Definition sv_rules.qh:26
void Player_SetForcedTeamIndex(entity player, int team_index)
Sets the index of the forced team of the given player.
Definition teamplay.qc:323
bool MoveToTeam(entity client, int team_index, int type)
Moves player to the specified team.
Definition teamplay.qc:299
@ TEAM_FORCE_DEFAULT
Don't force any team.
Definition teamplay.qh:138
int Team_TeamToIndex(int team_num)
Converts team value into team index.
Definition teams.qh:184
#define Team_ColoredFullName(teamid)
Definition teams.qh:232

References bprint(), FOREACH_CLIENT, INGAME_JOINED, INGAME_JOINING, INGAME_STATUS_CLEAR, IS_PLAYER, MoveToTeam(), Player_SetForcedTeamIndex(), playername(), PutObserverInServer(), team, Team_ColoredFullName, TEAM_FORCE_DEFAULT, Team_TeamToIndex(), teamplay, and WinningConditionHelper_winnerteam.

Referenced by MatchEnd_RestoreSpectatorStatus(), and MUTATOR_HOOKFUNCTION().

◆ MatchEnd_RestoreSpectatorStatus()

void MatchEnd_RestoreSpectatorStatus ( )

Definition at line 1375 of file world.qc.

1376{
1378}
void MatchEnd_RestoreSpectatorAndTeamStatus(.int prev_team_field)
Definition world.qc:1350

References MatchEnd_RestoreSpectatorAndTeamStatus(), and team.

Referenced by MUTATOR_HOOKFUNCTION().

◆ MoveToRandomLocationWithinBounds()

bool MoveToRandomLocationWithinBounds ( entity e,
vector boundmin,
vector boundmax,
float goodcontents,
float badcontents,
float badsurfaceflags,
int attempts,
float maxaboveground,
float minviewdistance,
bool frompos )

Definition at line 1101 of file world.qc.

1102{
1103 float m = e.dphitcontentsmask;
1104 e.dphitcontentsmask = goodcontents | badcontents;
1105
1106 vector org = boundmin;
1107 vector delta = boundmax - boundmin;
1108
1109 vector start, end;
1110 start = end = org;
1111 int j; // used after the loop
1112 for(j = 0; j < attempts; ++j)
1113 {
1114 start.x = org.x + random() * delta.x;
1115 start.y = org.y + random() * delta.y;
1116 start.z = org.z + random() * delta.z;
1117
1118 // rule 1: start inside world bounds, and outside
1119 // solid, and don't start from somewhere where you can
1120 // fall down to evil
1121 tracebox(start, e.mins, e.maxs, start - '0 0 1' * delta.z, MOVE_NORMAL, e);
1122 if (trace_fraction >= 1)
1123 continue;
1124 if (trace_startsolid)
1125 continue;
1126 if (trace_dphitcontents & badcontents)
1127 continue;
1128 if (trace_dphitq3surfaceflags & badsurfaceflags)
1129 continue;
1130
1131 // rule 2: if we are too high, lower the point
1132 if (trace_fraction * delta.z > maxaboveground)
1133 start = trace_endpos + '0 0 1' * maxaboveground;
1134 vector enddown = trace_endpos;
1135
1136 // rule 3: make sure we aren't outside the map. This only works
1137 // for somewhat well formed maps. A good rule of thumb is that
1138 // the map should have a convex outside hull.
1139 // these can be traceLINES as we already verified the starting box
1140 vector mstart = start + 0.5 * (e.mins + e.maxs);
1141 traceline(mstart, mstart + '1 0 0' * delta.x, MOVE_NORMAL, e);
1142 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1143 continue;
1144 traceline(mstart, mstart - '1 0 0' * delta.x, MOVE_NORMAL, e);
1145 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1146 continue;
1147 traceline(mstart, mstart + '0 1 0' * delta.y, MOVE_NORMAL, e);
1148 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1149 continue;
1150 traceline(mstart, mstart - '0 1 0' * delta.y, MOVE_NORMAL, e);
1151 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1152 continue;
1153 traceline(mstart, mstart + '0 0 1' * delta.z, MOVE_NORMAL, e);
1154 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1155 continue;
1156
1157 // rule 4: we must "see" some spawnpoint or item
1158 entity sp = NULL;
1159 if(frompos)
1160 {
1161 if((traceline(mstart, e.origin, MOVE_NORMAL, e), trace_fraction) >= 1)
1162 sp = e;
1163 }
1164 if(!sp)
1165 {
1166 IL_EACH(g_spawnpoints, checkpvs(mstart, it),
1167 {
1168 if((traceline(mstart, it.origin, MOVE_NORMAL, e), trace_fraction) >= 1)
1169 {
1170 sp = it;
1171 break;
1172 }
1173 });
1174 }
1175 if(!sp)
1176 {
1177 int items_checked = 0;
1178 IL_EACH(g_items, checkpvs(mstart, it),
1179 {
1180 if((traceline(mstart, it.origin + (it.mins + it.maxs) * 0.5, MOVE_NORMAL, e), trace_fraction) >= 1)
1181 {
1182 sp = it;
1183 break;
1184 }
1185
1186 ++items_checked;
1187 if(items_checked >= attempts)
1188 break; // sanity
1189 });
1190
1191 if(!sp)
1192 continue;
1193 }
1194
1195 // find a random vector to "look at"
1196 end.x = org.x + random() * delta.x;
1197 end.y = org.y + random() * delta.y;
1198 end.z = org.z + random() * delta.z;
1199 end = start + normalize(end - start) * vlen(delta);
1200
1201 // rule 4: start TO end must not be too short
1202 tracebox(start, e.mins, e.maxs, end, MOVE_NORMAL, e);
1204 continue;
1205 if(trace_fraction < minviewdistance / vlen(delta))
1206 continue;
1207
1208 // rule 5: don't want to look at sky
1210 continue;
1211
1212 // rule 6: we must not end up in trigger_hurt
1213 if(tracebox_hits_trigger_hurt(start, e.mins, e.maxs, enddown))
1214 continue;
1215
1216 break;
1217 }
1218
1219 e.dphitcontentsmask = m;
1220
1221 if(j < attempts)
1222 {
1223 setorigin(e, start);
1224 e.angles = vectoangles(end - start);
1225 LOG_DEBUG("Needed ", ftos(j + 1), " attempts");
1226 return true;
1227 }
1228 return false;
1229}
float Q3SURFACEFLAG_SKY
float trace_dphitcontents
const float MOVE_NORMAL
string trace_dphittexturename
float checkpvs(vector viewpos, entity viewee)
float trace_dphitq3surfaceflags
bool tracebox_hits_trigger_hurt(vector start, vector e_min, vector e_max, vector end)
Definition hurt.qc:79
#define LOG_DEBUG(...)
Definition log.qh:80
float random(void)
vector vectoangles(vector v)
vector normalize(vector v)
vector org
Definition self.qh:92
IntrusiveList g_items
Definition items.qh:125
IntrusiveList g_spawnpoints

References checkpvs(), entity(), ftos(), g_items, g_spawnpoints, IL_EACH, LOG_DEBUG, MOVE_NORMAL, normalize(), NULL, org, Q3SURFACEFLAG_SKY, random(), trace_dphitcontents, trace_dphitq3surfaceflags, trace_dphittexturename, trace_endpos, trace_fraction, trace_startsolid, tracebox_hits_trigger_hurt(), vectoangles(), vector, and vlen().

Referenced by M_Mage_Attack_Teleport(), and MoveToRandomMapLocation().

◆ MoveToRandomMapLocation()

float MoveToRandomMapLocation ( entity e,
float goodcontents,
float badcontents,
float badsurfaceflags,
float attempts,
float maxaboveground,
float minviewdistance )

Definition at line 1231 of file world.qc.

1232{
1233 return MoveToRandomLocationWithinBounds(e, world.mins, world.maxs, goodcontents, badcontents, badsurfaceflags, attempts, maxaboveground, minviewdistance, false);
1234}
bool MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, int attempts, float maxaboveground, float minviewdistance, bool frompos)
Definition world.qc:1101

References entity(), MoveToRandomLocationWithinBounds(), and world.

Referenced by buff_Respawn(), CheatImpulse(), invasion_SpawnChosenMonster(), ka_RespawnBall(), and tka_RespawnBall().

◆ NextLevel()

void NextLevel ( )

Definition at line 1384 of file world.qc.

1385{
1386 cvar_set("_endmatch", "0");
1387 game_stopped = true;
1388 intermission_running = true; // game over
1389
1390 // enforce a wait time before allowing changelevel
1391 if(player_count > 0)
1393 else
1395
1396 /*
1397 WriteByte (MSG_ALL, SVC_CDTRACK);
1398 WriteByte (MSG_ALL, 3);
1399 WriteByte (MSG_ALL, 3);
1400 // done in FixIntermission
1401 */
1402
1403 //pos = FindIntermission ();
1404
1405 VoteReset(true);
1406
1407 MUTATOR_CALLHOOK(MatchEnd_BeforeScores);
1408
1409 DumpStats(true);
1410
1411 // send statistics
1414
1415 Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_Null); // kill all centerprints now
1416
1418 GameLogEcho(":gameover");
1419
1420 GameLogClose();
1421
1422 int winner_team = 0;
1423 FOREACH_CLIENT(IS_PLAYER(it) || INGAME(it), {
1425 if(it.winning)
1426 {
1427 if (teamplay && !winner_team)
1428 {
1429 winner_team = it.team;
1430 bprint(Team_ColorCode(winner_team), Team_ColorName_Upper(winner_team), "^7 team wins the match\n");
1431 }
1432 bprint(playername(it.netname, it.team, false), " ^7wins\n");
1433 }
1434 });
1435
1437
1440
1441 MUTATOR_CALLHOOK(MatchEnd);
1442
1443 localcmd("\nsv_hook_gameend\n");
1444}
float game_stopped
Definition stats.qh:81
void GameLogClose()
Definition gamelog.qc:75
void FixIntermissionClient(entity e)
float intermission_exittime
void localcmd(string command,...)
void target_music_kill()
Definition music.qc:48
s1 s2 s1 s2 FLAG s1 s2 FLAG spree_cen s1 CPID_Null
Definition all.inc:617
void Kill_Notification(NOTIF broadcast, entity client, MSG net_type, CPID net_cpid)
Definition all.qc:1537
void PlayerStats_GameReport(bool finished)
void CampaignPreIntermission()
Definition campaign.qc:167
#define Team_ColorName_Upper(teamid)
Definition teams.qh:223
string Team_ColorCode(int teamid)
Definition teams.qh:63
void WeaponStats_Shutdown()
void DumpStats(float final)
Definition world.qc:1244
float autocvar_sv_mapchange_delay
Definition world.qh:23

References autocvar_g_campaign, autocvar_sv_eventlog, autocvar_sv_mapchange_delay, bprint(), CampaignPreIntermission(), CPID_Null, cvar_set(), DumpStats(), FixIntermissionClient(), FOREACH_CLIENT, game_stopped, GameLogClose(), GameLogEcho(), INGAME, intermission_exittime, intermission_running, IS_PLAYER, Kill_Notification(), localcmd(), MUTATOR_CALLHOOK, NULL, player_count, playername(), PlayerStats_GameReport(), target_music_kill(), Team_ColorCode(), Team_ColorName_Upper, teamplay, time, VoteReset(), and WeaponStats_Shutdown().

Referenced by CheckRules_World(), and target_changelevel_use().

◆ Physics_Frame()

void Physics_Frame ( )

Definition at line 2441 of file world.qc.

2442{
2444 return;
2445
2446 IL_EACH(g_moveables, true,
2447 {
2448 if(IS_CLIENT(it) || it.move_movetype == MOVETYPE_PHYSICS)
2449 continue;
2450
2451 //set_movetype(it, it.move_movetype);
2452 // inline the set_movetype function, since this is called a lot
2453 it.movetype = (it.move_qcphysics) ? MOVETYPE_QCENTITY : it.move_movetype;
2454
2455 if(it.move_qcphysics && it.move_movetype != MOVETYPE_NONE)
2457
2458 if(it.movetype >= MOVETYPE_USER_FIRST && it.movetype <= MOVETYPE_USER_LAST) // these cases have no think handling
2459 {
2460 if(it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH)
2461 continue; // these movetypes have no regular think function
2462 // handle thinking here
2463 if (getthink(it) && it.nextthink > 0 && it.nextthink <= time + PHYS_INPUT_TIMELENGTH)
2465 }
2466 });
2467
2469 return;
2470
2471 // make a second pass to see if any ents spawned this frame and make
2472 // sure they run their move/think. this is verified by checking .move_time, which will never be 0 if the entity has moved
2473 // MOVETYPE_NONE is also checked as .move_time WILL be 0 with that movetype
2474 IL_EACH(g_moveables, it.move_qcphysics,
2475 {
2476 if(IS_CLIENT(it) || it.move_time || it.move_movetype == MOVETYPE_NONE || it.move_movetype == MOVETYPE_PHYSICS)
2477 continue;
2478 Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
2479 });
2480}
#define PHYS_INPUT_TIMELENGTH
Definition player.qh:254
#define IS_CLIENT(s)
Definition player.qh:242
int autocvar_sv_gameplayfix_delayprojectiles
Definition stats.qh:217
float MOVETYPE_USER_FIRST
float MOVETYPE_USER_LAST
void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient)
Definition movetypes.qc:779
const int MOVETYPE_NONE
Definition movetypes.qh:129
const int MOVETYPE_FAKEPUSH
Definition movetypes.qh:153
const int MOVETYPE_PUSH
Definition movetypes.qh:136
float move_movetype
Definition movetypes.qh:76
const int MOVETYPE_PHYSICS
Definition movetypes.qh:142
const int MOVETYPE_QCENTITY
Definition movetypes.qh:151
#define getthink(e)
void RunThink(entity this, float dt)
Definition world.qc:2413
bool autocvar_sv_freezenonclients
Definition world.qc:2440
IntrusiveList g_moveables
Definition world.qh:157

References autocvar_sv_freezenonclients, autocvar_sv_gameplayfix_delayprojectiles, g_moveables, getthink, IL_EACH, IS_CLIENT, MOVETYPE_FAKEPUSH, MOVETYPE_NONE, MOVETYPE_PHYSICS, Movetype_Physics_NoMatchTicrate(), MOVETYPE_PUSH, MOVETYPE_QCENTITY, MOVETYPE_USER_FIRST, MOVETYPE_USER_LAST, PHYS_INPUT_TIMELENGTH, RunThink(), and time.

Referenced by EndFrame().

◆ PingPLReport_Spawn()

void PingPLReport_Spawn ( )

Definition at line 96 of file world.qc.

97{
100 pingplreport.nextthink = time;
101}
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
#define setthink(e, f)
entity pingplreport
Definition world.qc:57
void PingPLReport_Think(entity this)
Definition world.qc:58

References new_pure, pingplreport, PingPLReport_Think(), setthink, and time.

Referenced by spawnfunc().

◆ PingPLReport_Think()

void PingPLReport_Think ( entity this)

Definition at line 58 of file world.qc.

59{
60 float delta;
61 entity e;
62
63 delta = 3 / maxclients;
64 if(delta < sys_frametime)
65 delta = 0;
66 this.nextthink = time + delta;
67
68 e = edict_num(this.cnt + 1);
69 if(IS_CLIENT(e) && IS_REAL_CLIENT(e))
70 {
71 WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
73 WriteShort(MSG_BROADCAST, bound(1, rint(CS(e).ping), 32767));
76
77 // record latency times for clients throughout the match so we can report it to playerstats
79 {
80 CS(e).latency_sum += CS(e).ping;
81 CS(e).latency_cnt += 1;
82 CS(e).latency_time = time;
83 //print("sum: ", ftos(CS(e).latency_sum), ", cnt: ", ftos(CS(e).latency_cnt), ", avg: ", ftos(CS(e).latency_sum / CS(e).latency_cnt), ".\n");
84 }
85 }
86 else
87 {
88 WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
93 }
94 this.cnt = (this.cnt + 1) % maxclients;
95}
float cnt
Definition powerups.qc:24
float ping
Definition main.qh:169
float ping_movementloss
Definition main.qh:169
float ping_packetloss
Definition main.qh:169
#define WriteHeader(to, id)
Definition net.qh:221
void WriteShort(float data, float dest, float desto)
void WriteByte(float data, float dest, float desto)
float MSG_BROADCAST
Definition menudefs.qc:55
float sys_frametime
Definition common.qh:57
float latency_time
Definition world.qc:56
const float LATENCY_THINKRATE
Definition world.qc:53

References bound(), ceil(), cnt, CS(), entity(), IS_CLIENT, IS_REAL_CLIENT, LATENCY_THINKRATE, latency_time, maxclients, min(), MSG_BROADCAST, nextthink, ping, ping_movementloss, ping_packetloss, rint(), sys_frametime, time, WriteByte(), WriteHeader, and WriteShort().

Referenced by PingPLReport_Spawn().

◆ RandomSeed_Send()

bool RandomSeed_Send ( entity this,
entity to,
int sf )

Definition at line 591 of file world.qc.

592{
593 WriteHeader(MSG_ENTITY, ENT_CLIENT_RANDOMSEED);
595 return true;
596}
const int MSG_ENTITY
Definition net.qh:115

References cnt, entity(), MSG_ENTITY, WriteHeader, and WriteShort().

Referenced by RandomSeed_Spawn().

◆ RandomSeed_Spawn()

void RandomSeed_Spawn ( )

Definition at line 604 of file world.qc.

605{
609
610 getthink(randomseed)(randomseed); // sets random seed and nextthink
611}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:123
void RandomSeed_Think(entity this)
Definition world.qc:597
bool RandomSeed_Send(entity this, entity to, int sf)
Definition world.qc:591
entity randomseed
Definition world.qc:590

References getthink, Net_LinkEntity(), new_pure, randomseed, RandomSeed_Send(), RandomSeed_Think(), and setthink.

Referenced by spawnfunc().

◆ RandomSeed_Think()

void RandomSeed_Think ( entity this)

Definition at line 597 of file world.qc.

598{
599 this.cnt = bound(0, floor(random() * 65536), 65535);
600 this.nextthink = time + 5;
601
602 this.SendFlags |= 1;
603}
int SendFlags
Definition net.qh:118
float floor(float f)

References bound(), cnt, entity(), floor(), nextthink, random(), SendFlags, and time.

Referenced by RandomSeed_Spawn().

◆ readlevelcvars()

void readlevelcvars ( )

Definition at line 2167 of file world.qc.

2168{
2170 if(cvar("sv_allow_fullbright"))
2172
2174 if(cvar("sv_forbid_pickuptimer"))
2176
2177 sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
2178
2179 if(cvar("g_campaign"))
2180 warmup_stage = 0; // no warmup during campaign
2181 else
2182 {
2185 warmup_limit = -1; // don't start until there's enough players
2186 else if (warmup_stage == 1)
2187 {
2188 // this code is duplicated in ReadyCount()
2189 warmup_limit = cvar("g_warmup_limit");
2190 if(warmup_limit == 0)
2192 }
2193 }
2194
2195 g_weapon_stay = cvar(strcat("g_", GetGametype(), "_weapon_stay"));
2196 if(!g_weapon_stay)
2197 g_weapon_stay = cvar("g_weapon_stay");
2198
2199 MUTATOR_CALLHOOK(ReadLevelCvars);
2200
2202 game_starttime = time + cvar("g_start_delay");
2203
2204 FOREACH(Weapons, it != WEP_Null, { it.wr_init(it); });
2205
2207}
int serverflags
Definition main.qh:211
float warmup_limit
Definition stats.qh:375
const int SERVERFLAG_FORBID_PICKUPTIMER
Definition constants.qh:20
const int SERVERFLAG_ALLOW_FULLBRIGHT
Definition constants.qh:16
Weapons
Definition guide.qh:113
#define FOREACH(list, cond, body)
Definition iter.qh:19
float cvar(string name)
void readplayerstartcvars()
Definition world.qc:1963
float g_weapon_stay
Definition world.qh:109
int autocvar_g_warmup
Definition world.qh:9
bool sv_ready_restart_after_countdown
Definition world.qh:116

References autocvar_g_campaign, autocvar_g_warmup, autocvar_timelimit, cvar(), FOREACH, g_weapon_stay, game_starttime, GetGametype(), MUTATOR_CALLHOOK, readplayerstartcvars(), SERVERFLAG_ALLOW_FULLBRIGHT, SERVERFLAG_FORBID_PICKUPTIMER, serverflags, strcat(), sv_ready_restart_after_countdown, time, warmup_limit, warmup_stage, and Weapons.

Referenced by spawnfunc().

◆ readplayerstartcvars()

void readplayerstartcvars ( )

Definition at line 1963 of file world.qc.

1964{
1965 // initialize starting values for players
1966 start_weapons = '0 0 0';
1967 start_weapons_default = '0 0 0';
1968 start_weapons_defaultmask = '0 0 0';
1969 start_items = 0;
1971 start_ammo_nails = 0;
1973 start_ammo_cells = 0;
1974 if (random_start_ammo == NULL)
1975 {
1977 }
1978 start_health = cvar("g_balance_health_start");
1979 start_armorvalue = cvar("g_balance_armor_start");
1980
1981 g_weaponarena = 0;
1982 g_weaponarena_weapons = '0 0 0';
1983
1984 string s = cvar_string("g_weaponarena");
1985
1986 MUTATOR_CALLHOOK(SetWeaponArena, s);
1987 s = M_ARGV(0, string);
1988
1989 if (s == "0" || s == "")
1990 {
1991 // no arena
1992 }
1993 else if (s == "off")
1994 {
1995 // forcibly turn off weaponarena
1996 }
1997 else if (s == "all" || s == "1")
1998 {
1999 g_weaponarena = 1;
2000 g_weaponarena_list = "All Weapons Arena";
2002 }
2003 else if (s == "devall")
2004 {
2005 g_weaponarena = 1;
2006 g_weaponarena_list = "Dev All Weapons Arena";
2008 }
2009 else if (s == "most")
2010 {
2011 g_weaponarena = 1;
2012 g_weaponarena_list = "Most Weapons Arena";
2014 }
2015 else if (s == "all_available")
2016 {
2017 g_weaponarena = 1;
2018 g_weaponarena_list = "All Available Weapons Arena";
2019
2020 // this needs to run after weaponsInMapAll is initialized
2022 }
2023 else if (s == "devall_available")
2024 {
2025 g_weaponarena = 1;
2026 g_weaponarena_list = "Dev All Available Weapons Arena";
2027
2028 // this needs to run after weaponsInMapAll is initialized
2030 }
2031 else if (s == "most_available")
2032 {
2033 g_weaponarena = 1;
2034 g_weaponarena_list = "Most Available Weapons Arena";
2035
2036 // this needs to run after weaponsInMapAll is initialized
2038 }
2039 else if (s == "none")
2040 {
2041 g_weaponarena = 1;
2042 g_weaponarena_list = "No Weapons Arena";
2043 }
2044 else
2045 {
2046 g_weaponarena = 1;
2047 float t = tokenize_console(s);
2048 g_weaponarena_list = "";
2049 for (int j = 0; j < t; ++j)
2050 {
2051 s = argv(j);
2052 Weapon wep = Weapon_from_name(s);
2053 if(wep != WEP_Null)
2054 {
2055 g_weaponarena_weapons |= (wep.m_wepset);
2057 }
2058 }
2059 if (g_weaponarena_list != "") // remove trailing " & "
2061 else // no valid weapon found
2062 g_weaponarena_list = "No Weapons Arena";
2063 }
2064
2065 if (g_weaponarena)
2066 {
2067 g_weapon_stay = 0; // incompatible
2071 }
2072 else
2073 {
2074 FOREACH(Weapons, it != WEP_Null, {
2075 int w = want_weapon(it, false);
2076 WepSet s = it.m_wepset;
2077 if(w & 1)
2078 start_weapons |= s;
2079 if(w & 2)
2081 if(w & 4)
2083 });
2084 }
2085
2086 if(cvar("g_balance_superweapons_time") < 0)
2088
2089 if(!cvar("g_use_ammunition"))
2091
2092 start_ammo_shells = cvar("g_start_ammo_shells");
2093 start_ammo_nails = cvar("g_start_ammo_nails");
2094 start_ammo_rockets = cvar("g_start_ammo_rockets");
2095 start_ammo_cells = cvar("g_start_ammo_cells");
2096 start_ammo_fuel = cvar("g_start_ammo_fuel");
2097 random_start_weapons_count = cvar("g_random_start_weapons_count");
2098 SetResource(random_start_ammo, RES_SHELLS, cvar("g_random_start_shells"));
2099 SetResource(random_start_ammo, RES_BULLETS, cvar("g_random_start_bullets"));
2100 SetResource(random_start_ammo, RES_ROCKETS, cvar("g_random_start_rockets"));
2101 SetResource(random_start_ammo, RES_CELLS, cvar("g_random_start_cells"));
2102
2113
2114 if (!g_weaponarena)
2115 {
2116 warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
2117 warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
2118 warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
2119 warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
2120 warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
2121 warmup_start_health = cvar("g_warmup_start_health");
2122 warmup_start_armorvalue = cvar("g_warmup_start_armor");
2123 warmup_start_weapons = '0 0 0';
2126 FOREACH(Weapons, it != WEP_Null, {
2128 WepSet s = it.m_wepset;
2129 if(w & 1)
2131 if(w & 2)
2133 if(w & 4)
2135 });
2136 }
2137
2139 start_items |= ITEM_Jetpack.m_itemid;
2140
2141 MUTATOR_CALLHOOK(SetStartItems);
2142
2143 if (start_items & ITEM_Jetpack.m_itemid)
2144 {
2145 start_items |= ITEM_FuelRegen.m_itemid;
2146 start_ammo_fuel = max(start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
2147 warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
2148 }
2149
2155 SetResource(random_start_ammo, RES_SHELLS, max(0, GetResource(random_start_ammo, RES_SHELLS)));
2156 SetResource(random_start_ammo, RES_BULLETS, max(0, GetResource(random_start_ammo, RES_BULLETS)));
2157 SetResource(random_start_ammo, RES_ROCKETS, max(0, GetResource(random_start_ammo, RES_ROCKETS)));
2158 SetResource(random_start_ammo, RES_CELLS, max(0, GetResource(random_start_ammo, RES_CELLS)));
2159
2165}
void SetResource(entity e, Resource res_type, float amount)
Sets the current amount of resource the given entity will have.
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
fields which are explicitly/manually set are marked with "M", fields set automatically are marked wit...
Definition weapon.qh:44
string netname
M: refname : reference name name.
Definition weapon.qh:79
const int IT_UNLIMITED_AMMO
Definition item.qh:23
const int IT_UNLIMITED_SUPERWEAPONS
Definition item.qh:24
const int INITPRIO_FINDTARGET
Definition constants.qh:96
#define tokenize_console
string argv(float n)
Weapon Weapon_from_name(string s)
Definition all.qh:144
vector WepSet
Definition weapon.qh:14
int want_weapon(entity weaponinfo, int allguns)
Definition world.qc:1843
WepSet weapons_most()
Definition world.qc:1914
WepSet weapons_all()
Definition world.qc:1894
void weaponarena_available_all_update(entity this)
Definition world.qc:1924
void weaponarena_available_devall_update(entity this)
Definition world.qc:1937
void weaponarena_available_most_update(entity this)
Definition world.qc:1950
WepSet weapons_devall()
Definition world.qc:1904
WepSet start_weapons
Definition world.qh:80
float warmup_start_ammo_cells
Definition world.qh:105
entity random_start_ammo
Entity that contains amount of ammo to give with random start weapons.
Definition world.qh:95
bool autocvar_g_jetpack
Definition world.qh:8
float start_ammo_shells
Definition world.qh:84
float warmup_start_ammo_rockets
Definition world.qh:104
float warmup_start_ammo_shells
Definition world.qh:102
float start_ammo_fuel
Definition world.qh:88
int start_items
Definition world.qh:83
WepSet start_weapons_default
Definition world.qh:81
int random_start_weapons_count
Number of random start weapons to give to players.
Definition world.qh:90
float warmup_start_ammo_nails
Definition world.qh:103
int autocvar_g_warmup_allguns
Definition world.qh:10
WepSet g_weaponarena_weapons
Definition world.qh:76
float start_ammo_cells
Definition world.qh:87
float g_weaponarena
Definition world.qh:75
float warmup_start_health
Definition world.qh:107
WepSet start_weapons_defaultmask
Definition world.qh:82
float start_ammo_rockets
Definition world.qh:86
WepSet warmup_start_weapons_default
Definition world.qh:99
float start_armorvalue
Definition world.qh:97
WepSet warmup_start_weapons_defaultmask
Definition world.qh:100
WepSet warmup_start_weapons
Definition world.qh:98
float warmup_start_ammo_fuel
Definition world.qh:106
string g_weaponarena_list
Definition world.qh:78
float start_health
Definition world.qh:96
float warmup_start_armorvalue
Definition world.qh:108
float start_ammo_nails
Definition world.qh:85

References argv(), autocvar_g_jetpack, autocvar_g_warmup_allguns, cvar(), cvar_string(), FOREACH, g_weapon_stay, g_weaponarena, g_weaponarena_list, g_weaponarena_weapons, GetResource(), InitializeEntity(), INITPRIO_FINDTARGET, IT_UNLIMITED_AMMO, IT_UNLIMITED_SUPERWEAPONS, M_ARGV, max(), MUTATOR_CALLHOOK, Weapon::netname, new_pure, NULL, random_start_ammo, random_start_weapons_count, SetResource(), start_ammo_cells, start_ammo_fuel, start_ammo_nails, start_ammo_rockets, start_ammo_shells, start_armorvalue, start_health, start_items, start_weapons, start_weapons_default, start_weapons_defaultmask, strcat(), strlen, strzone(), substring(), tokenize_console, want_weapon(), warmup_start_ammo_cells, warmup_start_ammo_fuel, warmup_start_ammo_nails, warmup_start_ammo_rockets, warmup_start_ammo_shells, warmup_start_armorvalue, warmup_start_health, warmup_start_weapons, warmup_start_weapons_default, warmup_start_weapons_defaultmask, Weapon_from_name(), weaponarena_available_all_update(), weaponarena_available_devall_update(), weaponarena_available_most_update(), Weapons, weapons_all(), weapons_devall(), and weapons_most().

Referenced by readlevelcvars().

◆ RedirectionThink()

float RedirectionThink ( )

Definition at line 2540 of file world.qc.

2541{
2542 float clients_found;
2543
2544 if(redirection_target == "")
2545 return false;
2546
2548 {
2549 cvar_set("sv_public", "-2");
2550 redirection_timeout = time + 0.6; // this will only try twice... should be able to keep more clients
2551 if(redirection_target == "self")
2552 bprint("^3SERVER NOTICE:^7 restarting the server\n");
2553 else
2554 bprint("^3SERVER NOTICE:^7 redirecting everyone to ", redirection_target, "\n");
2555 }
2556
2558 return true;
2559
2561
2562 clients_found = 0;
2564 // TODO add timer
2565 LOG_INFO("Redirecting: sending connect command to ", it.netname);
2566 if(redirection_target == "self")
2567 stuffcmd(it, "\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " reconnect\n");
2568 else
2569 stuffcmd(it, strcat("\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " \"connect ", redirection_target, "\"\n"));
2570 ++clients_found;
2571 });
2572
2573 LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.");
2574
2575 if(time > redirection_timeout || clients_found == 0)
2576 localcmd("\nwait; wait; wait; quit\n");
2577
2578 return true;
2579}
#define stuffcmd(cl,...)
Definition progsdefs.qh:23
float redirection_nextthink
Definition world.qc:2539
float redirection_timeout
Definition world.qc:2538
float autocvar_quit_and_redirect_timer
Definition world.qh:14
string redirection_target
Definition world.qh:67

References autocvar_quit_and_redirect_timer, bprint(), cvar_set(), FOREACH_CLIENT, ftos(), IS_REAL_CLIENT, localcmd(), LOG_INFO, redirection_nextthink, redirection_target, redirection_timeout, strcat(), stuffcmd, and time.

Referenced by StartFrame().

◆ RestoreGame()

void RestoreGame ( )

Definition at line 2581 of file world.qc.

2582{
2583 // Loaded from a save game
2584 // some things then break, so let's work around them...
2585
2586 // Progs DB (capture records)
2588
2589 // Mapinfo
2594
2596}
ERASEABLE int db_load(string filename)
Definition map.qh:35
void TargetMusic_RestoreGame()
Definition music.qc:85
void WeaponStats_Init()
Definition weaponstats.qc:9
string autocvar_sessionid
Definition world.qh:16
float ServerProgsDB
Definition world.qh:128

References autocvar_sessionid, db_load(), MapInfo_CurrentFeatures(), MapInfo_CurrentGametype(), MapInfo_Enumerate(), MapInfo_FilterGametype(), MapInfo_ForbiddenFlags(), MapInfo_RequiredFlags(), MapInfo_Shutdown(), ServerProgsDB, strcat(), TargetMusic_RestoreGame(), and WeaponStats_Init().

◆ RunThink()

void RunThink ( entity this,
float dt )

Definition at line 2413 of file world.qc.

2414{
2415 // don't let things stay in the past.
2416 // it is possible to start that way by a trigger with a local time.
2418 return;
2419
2420 float oldtime = time; // do we need to save this?
2421
2422 for (int iterations = 0; iterations < 128 && !wasfreed(this); ++iterations)
2423 {
2424 time = max(oldtime, this.nextthink);
2425 this.nextthink = 0;
2426
2427 if(getthink(this))
2428 getthink(this)(this);
2429 // mods often set nextthink to time to cause a think every frame,
2430 // we don't want to loop in that case, so exit if the new nextthink is
2431 // <= the time the qc was told, also exit if it is past the end of the
2432 // frame
2434 break;
2435 }
2436
2437 time = oldtime;
2438}
bool autocvar_sv_gameplayfix_multiplethinksperframe
Definition world.qc:2412

References autocvar_sv_gameplayfix_multiplethinksperframe, entity(), getthink, max(), nextthink, and time.

Referenced by Physics_Frame().

◆ SetDefaultAlpha()

◆ SetWinners()

void SetWinners ( .float field,
float value )

Definition at line 1519 of file world.qc.

1520{
1521 FOREACH_CLIENT(IS_PLAYER(it) || INGAME(it), { it.winning = (it.(field) == value); });
1522}

References FOREACH_CLIENT, INGAME, and IS_PLAYER.

Referenced by WinningCondition_Assault(), WinningCondition_Invasion(), and WinningCondition_Scores().

◆ Shutdown()

void Shutdown ( )

Definition at line 2598 of file world.qc.

2599{
2600 game_stopped = 2;
2601
2602 if(world_initialized > 0)
2603 {
2605
2606 // if a timeout is active, reset the slowmo value to normal
2608 cvar_set("slowmo", ftos(orig_slowmo));
2609
2610 LOG_TRACE("Saving persistent data...");
2611 Ban_SaveBans();
2612
2613 // playerstats with unfinished match
2615
2616 if(!cheatcount_total)
2617 {
2620 else
2622 }
2623 if(autocvar_developer > 0)
2624 {
2626 db_dump(TemporaryDB, "server-temp.db");
2627 else
2628 db_save(TemporaryDB, "server-temp.db");
2629 }
2630 CheatShutdown(); // must be after cheatcount check
2633 LOG_TRACE("Saving persistent data... done!");
2634 // tell the bot system the game is ending now
2635 bot_endgame();
2636
2639
2642 }
2643 else if(world_initialized == 0)
2644 {
2645 LOG_INFO("NOTE: crashed before even initializing the world, not saving persistent data");
2646 }
2647 else
2648 {
2650 }
2651}
void bot_endgame()
Definition bot.qc:412
void CheatShutdown()
Definition cheats.qc:54
float cheatcount_total
Definition cheats.qh:10
int timeout_status
Definition stats.qh:87
void Ban_SaveBans()
Definition ipban.qc:263
noref int autocvar_developer
Definition log.qh:96
#define LOG_TRACE(...)
Definition log.qh:76
ERASEABLE void db_close(int db)
Definition map.qh:84
ERASEABLE void db_save(int db, string filename)
Definition map.qh:8
ERASEABLE void db_dump(int db, string filename)
Definition map.qh:69
float orig_slowmo
Definition common.qh:58
const float TIMEOUT_ACTIVE
Definition common.qh:49
void __init_dedicated_server_shutdown()
Definition world.qc:650
bool autocvar_sv_db_saveasdump
Definition world.qh:18
int world_initialized
Definition world.qh:43
float TemporaryDB
Definition world.qh:129
string sv_termsofservice_url_escaped
Definition world.qh:59

References __init_dedicated_server_shutdown(), autocvar_developer, autocvar_sessionid, autocvar_sv_db_saveasdump, Ban_SaveBans(), bot_endgame(), cheatcount_total, CheatShutdown(), cvar_set(), db_close(), db_dump(), db_save(), ftos(), game_stopped, loaded_gametype_custom_string, LOG_INFO, LOG_TRACE, MapInfo_Shutdown(), orig_slowmo, PlayerStats_GameReport(), ServerProgsDB, strcat(), strfree, sv_termsofservice_url_escaped, TemporaryDB, TIMEOUT_ACTIVE, timeout_status, WeaponStats_Shutdown(), and world_initialized.

◆ spawnfunc() [1/3]

spawnfunc ( __init_dedicated_server )

Definition at line 613 of file world.qc.

614{
615 // handler for _init/_init map (only for dedicated server initialization)
616
617 world_initialized = -1; // don't complain
618
620
621 entity e = new(GotoFirstMap);
623 e.nextthink = time; // this is usually 1 at this point
624
625 e = new(info_player_deathmatch); // safeguard against player joining
626
627 // assign reflectively to avoid "assignment to world" warning
628 for (int i = 0, n = numentityfields(); i < n; ++i)
629 {
630 string k = entityfieldname(i);
631 if (k == "classname")
632 {
633 // safeguard against various stuff ;)
634 putentityfieldstring(i, this, "worldspawn");
635 break;
636 }
637 }
638
639 // needs to be done so early because of the constants they create
640 static_init();
643
644 IL_PUSH(g_spawnpoints, e); // just incase
645
648}
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define static_init_late()
Definition static.qh:38
#define static_init_precache()
Definition static.qh:43
#define static_init()
Definition static.qh:33
void GotoFirstMap(entity this)
Definition world.qc:116

References delete_fn(), entity(), g_spawnpoints, GotoFirstMap(), IL_PUSH(), MapInfo_CurrentFeatures(), MapInfo_CurrentGametype(), MapInfo_Enumerate(), MapInfo_FilterGametype(), MapInfo_ForbiddenFlags(), MapInfo_RequiredFlags(), remove_unsafely(), setthink, static_init, static_init_late, static_init_precache, time, and world_initialized.

◆ spawnfunc() [2/3]

spawnfunc ( light )

Definition at line 1095 of file world.qc.

1096{
1097 //makestatic (this); // Who the f___ did that?
1098 delete(this);
1099}

◆ spawnfunc() [3/3]

spawnfunc ( worldspawn )

Definition at line 759 of file world.qc.

760{
761#ifdef WATERMARK
762 string watermark_start = cvar_string("sv_watermark_start");
763 if (watermark_start == "") // always true on Xonotic (re)start
764 cvar_set("sv_watermark_start", WATERMARK);
765 else if (watermark_start != WATERMARK) // true when qc code has been recompiled on a different git commit
766 {
767 LOG_INFOF(
768 "\n^1 Warning: ^3the server QC program was updated without a full restart."
769 "\n^3 Please restart the Xonotic executable otherwise you may get random bugs."
770 "\n\n");
771 }
772#endif
773
775
776 cvar_set("_endmatch", "0");
777
779 {
781 }
782 else
783 {
785 }
786
787 bool wantrestart = false;
788 {
790 {
791 // DP unloads dlcache pk3s before starting a listen server since https://gitlab.com/xonotic/darkplaces/-/merge_requests/134
792 // restore csqc_progname too
793 string expect = "csprogs.dat";
794 wantrestart = cvar_string("csqc_progname") != expect;
795 cvar_set("csqc_progname", expect);
796 }
797 else
798 {
799 // Try to use versioned csprogs from pk3
800 // Only ever use versioned csprogs.dat files on dedicated servers;
801 // we need to reset csqc_progname on clients ourselves, and it's easier if the client's release name is constant
802 string pk3csprogs = "csprogs-" WATERMARK ".dat";
803 // This always works; fall back to it if a versioned csprogs.dat is suddenly missing
804 string select = "csprogs.dat";
805 if (fexists(pk3csprogs)) select = pk3csprogs;
806 if (cvar_string("csqc_progname") != select)
807 {
808 cvar_set("csqc_progname", select);
809 wantrestart = true;
810 }
811 // Check for updates on startup
812 // We do it this way for atomicity so that connecting clients still match the server progs and don't disconnect
813 int sentinel = fopen("progs.txt", FILE_READ);
814 if (sentinel >= 0)
815 {
816 string switchversion = fgets(sentinel);
817 fclose(sentinel);
818 if (switchversion != "" && switchversion != WATERMARK)
819 {
820 LOG_INFOF("Switching progs: " WATERMARK " -> %s", switchversion);
821 // if it doesn't exist, assume either:
822 // a) the current program was overwritten
823 // b) this is a client only update
824 string newprogs = sprintf("progs-%s.dat", switchversion);
825 if (fexists(newprogs))
826 {
827 cvar_set("sv_progs", newprogs);
828 wantrestart = true;
829 }
830 string newcsprogs = sprintf("csprogs-%s.dat", switchversion);
831 if (fexists(newcsprogs))
832 {
833 cvar_set("csqc_progname", newcsprogs);
834 wantrestart = true;
835 }
836 }
837 }
838 }
839 if (wantrestart)
840 {
841 LOG_INFO("Restart requested");
843 // let initialization continue, shutdown depends on it
844 }
845 }
846
848 error("world already spawned - you may have EXACTLY ONE worldspawn!");
850
851 delete_fn = remove_safely; // during spawning, watch what you remove!
852
853 cvar_changes_init(); // do this very early now so it REALLY matches the server config
854
855 // default to RACE_RECORD, can be overwritten by gametypes
857
858 // needs to be done so early because of the constants they create
859 static_init();
860
862
864
865 // 0 normal
866 lightstyle(0, "m");
867
868 // 1 FLICKER (first variety)
869 lightstyle(1, "mmnmmommommnonmmonqnmmo");
870
871 // 2 SLOW STRONG PULSE
872 lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
873
874 // 3 CANDLE (first variety)
875 lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
876
877 // 4 FAST STROBE
878 lightstyle(4, "mamamamamama");
879
880 // 5 GENTLE PULSE 1
881 lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");
882
883 // 6 FLICKER (second variety)
884 lightstyle(6, "nmonqnmomnmomomno");
885
886 // 7 CANDLE (second variety)
887 lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");
888
889 // 8 CANDLE (third variety)
890 lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
891
892 // 9 SLOW STROBE (fourth variety)
893 lightstyle(9, "aaaaaaaazzzzzzzz");
894
895 // 10 FLUORESCENT FLICKER
896 lightstyle(10, "mmamammmmammamamaaamammma");
897
898 // 11 SLOW PULSE NOT FADE TO BLACK
899 lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
900
901 // styles 32-62 are assigned by the spawnfunc_light program for switchable lights
902
903 // 63 testing
904 lightstyle(63, "a");
905
908 else
909 PlayerStats_GameReport_Init(); // we need this to be initiated before InitGameplayMode
910
912
917
919
920 player_count = 0;
925
927
928 // NOTE for matchid:
929 // changing the logic generating it is okay. But:
930 // it HAS to stay <= 64 chars
931 // character set: ASCII 33-126 without the following characters: : ; ' " \ $
932 // strftime(false, "%s") isn't reliable, see strftime_s description
933 matchid = strzone(sprintf("%d.%s.%06d", autocvar_sv_eventlog_files_counter, strftime_s(), random() * 1000000));
934
936 GameLogInit(); // requires matchid to be set
937
939
942
943 Ban_LoadBans();
944
947
950
951 // quake 3 music support
952 // bones_was_here: Q3 doesn't support .noise but the Nexuiz _MapInfo_Generate() does.
953 // TODO: Q3 supports an optional intro file: "music/intro.wav music/loop.wav"
954 string music = GetField_fullspawndata(world, "music", true);
955 if (music || world.noise)
956 // prefer .music over .noise
957 strcpy(clientstuff, strcat(clientstuff, "cd loop \"", (music ? music : world.noise), "\"\n"));
958
959 if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
960 {
961 int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
962 if(fd != -1)
963 {
964 string s;
965 while((s = fgets(fd)))
966 {
967 int l = tokenize_console(s);
968 if(l < 2)
969 continue;
970 if(argv(0) == "cd")
971 {
972 string trackname = argv(2);
973 LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:");
974 LOG_INFO(" cdtrack ", trackname);
975 if (cvar_value_issafe(trackname))
976 {
977 string newstuff = strcat(clientstuff, "cd loop \"", trackname, "\"\n");
978 strcpy(clientstuff, newstuff);
979 }
980 }
981 else if(argv(0) == "fog")
982 {
983 LOG_INFO("Found ^1UNSUPPORTED^7 fog command in .cfg file; put this line in worldspawn in the .map/.bsp/.ent file instead:");
984 LOG_INFO(" \"fog\" \"", s, "\"");
985 }
986 else if(argv(0) == "set")
987 {
988 LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
989 LOG_INFO(" clientsettemp_for_type all ", argv(1), " ", argv(2));
990 }
991 else if(argv(0) != "//")
992 {
993 LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
994 LOG_INFO(" clientsettemp_for_type all ", argv(0), " ", argv(1));
995 }
996 }
997 fclose(fd);
998 }
999 }
1000
1002
1003 Nagger_Init();
1004
1005 // set up information replies for clients and server to use
1009 bool records_available = false;
1010 for(int i = 0; i < 10; ++i)
1011 {
1012 string s = getrecords(i);
1013 if (s != "")
1014 {
1015 records_reply[i] = strzone(s);
1016 records_available = true;
1017 }
1018 }
1019 if (!records_available)
1020 records_reply[0] = "No records available for the current gametype.\n";
1023
1024 // begin other init
1028
1029 CheatInit();
1030
1031 if (!wantrestart) localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
1032
1033 // fill sv_curl_serverpackages from .serverpackage files
1035 {
1036 string s = "csprogs-" WATERMARK ".dat";
1037 // remove automatically managed files from the list to prevent duplicates
1038 for (int i = 0, n = tokenize_console(cvar_string("sv_curl_serverpackages")); i < n; ++i)
1039 {
1040 string pkg = argv(i);
1041 if (startsWith(pkg, "csprogs-")) continue;
1042 if (endsWith(pkg, "-serverpackage.txt")) continue;
1043 if (endsWith(pkg, ".serverpackage")) continue; // OLD legacy
1044 s = cons(s, pkg);
1045 }
1046 // add automatically managed files to the list
1047 #define X(match) MACRO_BEGIN \
1048 int fd = search_begin(match, true, false); \
1049 if (fd >= 0) \
1050 { \
1051 for (int i = 0, j = search_getsize(fd); i < j; ++i) \
1052 { \
1053 s = cons(s, search_getfilename(fd, i)); \
1054 } \
1055 search_end(fd); \
1056 } \
1057 MACRO_END
1058 X("*-serverpackage.txt");
1059 X("*.serverpackage");
1060 #undef X
1061 cvar_set("sv_curl_serverpackages", s);
1062 }
1063
1064 // MOD AUTHORS: change this, and possibly remove a few of the blocks below to ignore certain changes
1065 modname = "Xonotic";
1066 // physics/balance/config changes that count as mod
1067 if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
1068 modname = cvar_string("g_mod_physics");
1069 if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
1070 modname = cvar_string("g_mod_balance");
1071 if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
1072 modname = cvar_string("g_mod_config");
1073 // extra mutators that deserve to count as mod
1074 MUTATOR_CALLHOOK(SetModname, modname);
1075 modname = M_ARGV(0, string);
1076
1077 // save it for later
1079
1080 WinningConditionHelper(this); // set worldstatus
1081
1082 if (autocvar_sv_autopause && autocvar_sv_dedicated && !wantrestart)
1083 // INITPRIO_LAST is too soon: bots either didn't join yet or didn't leave yet, see: bot_fixcount()
1085
1086 // load entity data outputted by create_scrshot_ent
1087 string filename = strcat("data/", mapname, "_scrshot_ent.txt");
1088 if(!find(NULL, classname, "info_autoscreenshot") && fexists(filename))
1089 loadfromfile(filename);
1090
1093}
bool bot_waypoints_for_items
Definition api.qh:9
bool autocvar_g_waypoints_for_items
Definition api.qh:8
#define BITSET(var, mask, flag)
Definition bits.qh:11
void CheatInit()
Definition cheats.qc:49
void CheckEngineExtensions(void)
int spawnflags
Definition ammo.qh:15
string maplist_reply
Definition util.qh:161
string rankings_reply
Definition util.qh:161
string records_reply[10]
Definition util.qh:162
string lsmaps_reply
Definition util.qh:161
string ladder_reply
Definition util.qh:161
string monsterlist_reply
Definition util.qh:161
#define RACE_RECORD
Definition util.qh:97
const float FILE_READ
void defer(entity this, float fdelay, void(entity) func)
Execute func() after time + fdelay.
Definition defer.qh:29
ERASEABLE bool fexists(string f)
Definition file.qh:4
void GameLogInit()
Definition gamelog.qc:45
int autocvar_sv_eventlog_files_counter
Definition gamelog.qh:6
string getmonsterlist()
string getrecords(int page)
Definition getreplies.qc:35
string getladder()
Definition getreplies.qc:71
string getlsmaps()
string getrankings()
Definition getreplies.qc:46
string getmaplist()
void Map_MarkAsRecent(string m)
void Ban_LoadBans()
Definition ipban.qc:305
#define LOG_INFOF(...)
Definition log.qh:66
ERASEABLE int db_create()
Definition map.qh:25
string _MapInfo_FindArenaFile(string pFilename, string extension)
Definition mapinfo.qc:1008
string fgets(float fhandle)
entity find(entity start,.string field, string match)
void changelevel(string map)
void loadfromfile(string file)
void PlayerStats_GameReport_Init()
#define error
Definition pre.qh:6
q3compat
Definition quake3.qc:59
#define Q3COMPAT_ARENA
Definition quake3.qh:4
#define Q3COMPAT_DEFI
Definition quake3.qh:5
void WinningConditionHelper(entity this)
Sets the following results for the current scores entities.
Definition scores.qc:443
void CampaignPostInit()
Definition campaign.qc:100
void CampaignPreInit()
Definition campaign.qc:49
void ClientInit_Spawn()
Definition client.qc:944
void Nagger_Init()
Definition vote.qc:97
void remove_safely(entity e)
Definition main.qc:283
void Pause_TryPause_Dedicated(entity this)
Definition main.qc:198
string GetField_fullspawndata(entity e, string fieldname, bool vfspath)
Retrieves the value of a map entity field from fullspawndata.
Definition main.qc:451
bool autocvar_sv_autopause
Definition main.qh:19
#define __spawnfunc_spawn_all()
Definition spawnfunc.qh:66
#define endsWith(this, suffix)
Definition string.qh:245
#define startsWith(haystack, needle)
Definition string.qh:236
ERASEABLE string strftime_s()
Definition string.qh:94
void GameRules_limit_fallbacks()
Set any unspecified rules to their defaults.
Definition sv_rules.qc:62
void WaypointSprite_Init()
void InitGameplayMode()
Definition world.qc:706
void RandomSeed_Spawn()
Definition world.qc:604
const float SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS
Definition world.qc:103
void readlevelcvars()
Definition world.qc:2167
void PingPLReport_Spawn()
Definition world.qc:96
void cvar_changes_init()
Definition world.qc:145
bool world_already_spawned
Definition world.qc:758
#define X(match)
string matchid
Definition world.qh:63
string autocvar_sv_termsofservice_url
Definition world.qh:57
string record_type
Definition world.qh:55
bool autocvar_sv_curl_serverpackages_auto
Definition world.qh:17
bool autocvar_sv_dedicated
Definition world.qh:41
string modname
Definition world.qh:49

References __spawnfunc_spawn_all, _MapInfo_FindArenaFile(), argv(), autocvar_g_campaign, autocvar_g_waypoints_for_items, autocvar_sessionid, autocvar_sv_autopause, autocvar_sv_curl_serverpackages_auto, autocvar_sv_dedicated, autocvar_sv_eventlog, autocvar_sv_eventlog_files_counter, autocvar_sv_termsofservice_url, Ban_LoadBans(), BITSET, bot_waypoints_for_items, CampaignPostInit(), CampaignPreInit(), changelevel(), CheatInit(), CheckEngineExtensions(), classname, ClientInit_Spawn(), clientstuff, cons(), cvar_changes_init(), cvar_defstring(), cvar_set(), cvar_string(), cvar_value_issafe(), db_create(), db_load(), defer(), delete_fn(), endsWith, error, fclose(), fexists(), fgets(), FILE_READ, find(), fopen(), GameLogInit(), GameRules_limit_fallbacks(), GetField_fullspawndata(), GetGametype(), getladder(), getlsmaps(), getmaplist(), getmonsterlist(), getrankings(), getrecords(), InitGameplayMode(), ladder_reply, loadfromfile(), localcmd(), LOG_INFO, LOG_INFOF, lsmaps_reply, M_ARGV, Map_MarkAsRecent(), MapInfo_CurrentFeatures(), MapInfo_CurrentGametype(), MapInfo_Enumerate(), MapInfo_FilterGametype(), MapInfo_ForbiddenFlags(), MapInfo_RequiredFlags(), maplist_reply, mapname, matchid, modname, monsterlist_reply, MUTATOR_CALLHOOK, Nagger_Init(), NULL, Pause_TryPause_Dedicated(), PingPLReport_Spawn(), player_count, PlayerStats_GameReport_Init(), q3compat, Q3COMPAT_ARENA, Q3COMPAT_DEFI, RACE_RECORD, random(), RandomSeed_Spawn(), rankings_reply, readlevelcvars(), record_type, records_reply, remove_safely(), ServerProgsDB, SetDefaultAlpha(), SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS, spawnflags, startsWith, static_init, static_init_late, static_init_precache, strcat(), strcpy, strftime_s(), strzone(), sv_termsofservice_url_escaped, TemporaryDB, tokenize_console, WaypointSprite_Init(), WeaponStats_Init(), WinningConditionHelper(), world, world_already_spawned, world_initialized, and X.

◆ STATIC_INIT_EARLY()

STATIC_INIT_EARLY ( maxclients )

Definition at line 654 of file world.qc.

655{
656 maxclients = 0;
657 for (entity head = nextent(NULL); head; head = nextent(head)) {
658 ++maxclients;
659 }
660}
entity nextent(entity e)

References entity(), maxclients, nextent(), and NULL.

◆ systems_update()

void systems_update ( )

Definition at line 7 of file main.qc.

8{
9 float realtime = time;
10 SYSTEM_UPDATE(phys);
11 time = realtime;
12}
#define SYSTEM_UPDATE(sys)
Definition lib.qh:39

References SYSTEM_UPDATE, and time.

Referenced by EndFrame().

◆ want_weapon()

int want_weapon ( entity weaponinfo,
int allguns )

Definition at line 1843 of file world.qc.

1844{
1845 int d = 0;
1846 bool allow_mutatorblocked = false;
1847
1848 if(!weaponinfo.m_id)
1849 return 0;
1850
1851 bool mutator_returnvalue = MUTATOR_CALLHOOK(WantWeapon, weaponinfo, d, allguns, allow_mutatorblocked);
1852 d = M_ARGV(1, float);
1853 allguns = M_ARGV(2, int);
1854 allow_mutatorblocked = M_ARGV(3, bool);
1855
1856 if(allguns == 1)
1857 d = boolean(!(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
1858 else if(allguns == 2)
1859 d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
1860 else if(!mutator_returnvalue)
1861 d = !(!weaponinfo.weaponstart);
1862
1863 if(!allow_mutatorblocked && (weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED)) // never default mutator blocked guns
1864 d = 0;
1865
1866 float t = weaponinfo.weaponstartoverride;
1867
1868 //LOG_INFOF("want_weapon: %s - d: %d t: %d\n", weaponinfo.netname, d, t);
1869
1870 // bit order in t:
1871 // 1: want or not
1872 // 2: is default?
1873 // 4: is set by default?
1874 if(t < 0)
1875 t = 4 | (3 * d);
1876 else
1877 t |= (2 * d);
1878
1879 return t;
1880}
#define boolean(value)
Definition bool.qh:9
const int WEP_FLAG_MUTATORBLOCKED
Definition weapon.qh:219
const int WEP_FLAG_HIDDEN
Definition weapon.qh:216
const int WEP_FLAG_NORMAL
Definition weapon.qh:215

References boolean, entity(), M_ARGV, MUTATOR_CALLHOOK, WEP_FLAG_HIDDEN, WEP_FLAG_MUTATORBLOCKED, and WEP_FLAG_NORMAL.

Referenced by readplayerstartcvars(), and weapons_start().

◆ weaponarena_available_all_update()

void weaponarena_available_all_update ( entity this)

Definition at line 1924 of file world.qc.

1925{
1926 if (weaponsInMapAll)
1927 {
1929 }
1930 else
1931 {
1932 // if no weapons are available on the map, just fall back to all weapons arena
1934 }
1935}
vector weaponsInMapAll
all the weapons placed by the mapper (weaponreplace applied), ignores most filters
Definition stats.qh:55
WepSet weapons_start()
Weapons the player normally starts with outside weapon arena.
Definition world.qc:1883

References entity(), g_weaponarena_weapons, start_weapons, warmup_start_weapons, weapons_all(), weapons_start(), and weaponsInMapAll.

Referenced by readplayerstartcvars().

◆ weaponarena_available_devall_update()

void weaponarena_available_devall_update ( entity this)

Definition at line 1937 of file world.qc.

1938{
1939 if (weaponsInMapAll)
1940 {
1942 }
1943 else
1944 {
1945 // if no weapons are available on the map, just fall back to devall weapons arena
1947 }
1948}

References entity(), g_weaponarena_weapons, start_weapons, warmup_start_weapons, weapons_devall(), weapons_start(), and weaponsInMapAll.

Referenced by readplayerstartcvars().

◆ weaponarena_available_most_update()

void weaponarena_available_most_update ( entity this)

Definition at line 1950 of file world.qc.

1951{
1952 if (weaponsInMapAll)
1953 {
1955 }
1956 else
1957 {
1958 // if no weapons are available on the map, just fall back to most weapons arena
1960 }
1961}

References entity(), g_weaponarena_weapons, start_weapons, warmup_start_weapons, weapons_most(), weapons_start(), and weaponsInMapAll.

Referenced by readplayerstartcvars().

◆ weapons_all()

WepSet weapons_all ( )

Definition at line 1894 of file world.qc.

1895{
1896 WepSet ret = '0 0 0';
1897 FOREACH(Weapons, it != WEP_Null, {
1898 if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN)))
1899 ret |= it.m_wepset;
1900 });
1901 return ret;
1902}

References FOREACH, Weapons, WEP_FLAG_HIDDEN, and WEP_FLAG_MUTATORBLOCKED.

Referenced by readplayerstartcvars(), and weaponarena_available_all_update().

◆ weapons_devall()

WepSet weapons_devall ( )

Definition at line 1904 of file world.qc.

1905{
1906 WepSet ret = '0 0 0';
1907 FOREACH(Weapons, it != WEP_Null,
1908 {
1909 ret |= it.m_wepset;
1910 });
1911 return ret;
1912}

References FOREACH, and Weapons.

Referenced by readplayerstartcvars(), and weaponarena_available_devall_update().

◆ weapons_most()

WepSet weapons_most ( )

Definition at line 1914 of file world.qc.

1915{
1916 WepSet ret = '0 0 0';
1917 FOREACH(Weapons, it != WEP_Null, {
1918 if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN)))
1919 ret |= it.m_wepset;
1920 });
1921 return ret;
1922}

References FOREACH, Weapons, WEP_FLAG_HIDDEN, WEP_FLAG_MUTATORBLOCKED, and WEP_FLAG_NORMAL.

Referenced by readplayerstartcvars(), and weaponarena_available_most_update().

◆ weapons_start()

WepSet weapons_start ( )

Weapons the player normally starts with outside weapon arena.

Definition at line 1883 of file world.qc.

1884{
1885 WepSet ret = '0 0 0';
1886 FOREACH(Weapons, it != WEP_Null, {
1887 int w = want_weapon(it, false);
1888 if (w & 1)
1889 ret |= it.m_wepset;
1890 });
1891 return ret;
1892}

References FOREACH, want_weapon(), and Weapons.

Referenced by weaponarena_available_all_update(), weaponarena_available_devall_update(), and weaponarena_available_most_update().

◆ WinningCondition_RanOutOfSpawns()

float WinningCondition_RanOutOfSpawns ( )

Definition at line 1621 of file world.qc.

1622{
1623 if(have_team_spawns <= 0)
1624 return WINNING_NO;
1625
1627 return WINNING_NO;
1628
1630 return WINNING_NO;
1631
1632 for (int i = 1; i < 5; ++i)
1633 {
1635 }
1636
1637 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
1638 {
1639 if (Team_IsValidTeam(it.team))
1640 {
1641 Team_SetTeamScore(Team_GetTeam(it.team), 1);
1642 }
1643 });
1644
1645 IL_EACH(g_spawnpoints, true,
1646 {
1647 if (Team_IsValidTeam(it.team))
1648 {
1649 Team_SetTeamScore(Team_GetTeam(it.team), 1);
1650 }
1651 });
1652
1653 ClearWinners();
1654 float team1_score = Team_GetTeamScore(Team_GetTeamFromIndex(1));
1655 float team2_score = Team_GetTeamScore(Team_GetTeamFromIndex(2));
1656 float team3_score = Team_GetTeamScore(Team_GetTeamFromIndex(3));
1657 float team4_score = Team_GetTeamScore(Team_GetTeamFromIndex(4));
1658 if(team1_score + team2_score + team3_score + team4_score == 0)
1659 {
1660 checkrules_equality = true;
1661 return WINNING_YES;
1662 }
1663 else if(team1_score + team2_score + team3_score + team4_score == 1)
1664 {
1665 float t, i;
1666 if(team1_score)
1667 t = 1;
1668 else if(team2_score)
1669 t = 2;
1670 else if(team3_score)
1671 t = 3;
1672 else // if(team4_score)
1673 t = 4;
1675 for(i = 0; i < MAX_TEAMSCORE; ++i)
1676 {
1677 for (int j = 1; j <= NUM_TEAMS; ++j)
1678 {
1679 if (t == j)
1680 {
1681 continue;
1682 }
1683 if (!TeamBalance_IsTeamAllowed(balance, j))
1684 {
1685 continue;
1686 }
1688 }
1689 }
1690
1691 AddWinners(team, t);
1692 return WINNING_YES;
1693 }
1694 else
1695 return WINNING_NO;
1696}
#define MAX_TEAMSCORE
Definition scores.qh:149
float TeamScore_AddToTeam(int t, float scorefield, float score)
Adds a score to the given team.
Definition scores.qc:107
bool autocvar_g_spawn_useallspawns
Definition spawnpoints.qh:5
int have_team_spawns
bool some_spawn_has_been_used
entity Team_GetTeam(int team_num)
Returns the global team entity that corresponds to the given TEAM_NUM value.
Definition teamplay.qc:66
void Team_SetTeamScore(entity team_ent, float score)
Sets the score of the team.
Definition teamplay.qc:80
float Team_GetTeamScore(entity team_ent)
Returns the score of the team.
Definition teamplay.qc:75
entity TeamBalance_CheckAllowedTeams(entity for_whom)
Checks whether the player can join teams according to global configuration and mutator settings.
Definition teamplay.qc:459
bool TeamBalance_IsTeamAllowed(entity balance, int index)
Returns whether the team change to the specified team is allowed.
Definition teamplay.qc:826
entity Team_GetTeamFromIndex(int index)
Returns the global team entity at the given index.
Definition teamplay.qc:57
bool Team_IsValidTeam(int team_num)
Returns whether team value is valid.
Definition teams.qh:133
int Team_IndexToTeam(int index)
Converts team index into team value.
Definition teams.qh:169
const int NUM_TEAMS
Number of teams in the game.
Definition teams.qh:3
void AddWinners(.float field, float value)
Definition world.qc:1525
float checkrules_equality
Definition world.qh:35

References AddWinners(), autocvar_g_spawn_useallspawns, checkrules_equality, ClearWinners(), entity(), FOREACH_CLIENT, g_spawnpoints, have_team_spawns, IL_EACH, IS_DEAD, IS_PLAYER, MAX_TEAMSCORE, NULL, NUM_TEAMS, some_spawn_has_been_used, team, Team_GetTeam(), Team_GetTeamFromIndex(), Team_GetTeamScore(), Team_IndexToTeam(), Team_IsValidTeam(), Team_SetTeamScore(), TeamBalance_CheckAllowedTeams(), TeamBalance_IsTeamAllowed(), TeamScore_AddToTeam(), WINNING_NO, and WINNING_YES.

Referenced by CheckRules_World().

◆ WinningCondition_Scores()

float WinningCondition_Scores ( float limit,
float leadlimit )

Definition at line 1540 of file world.qc.

1541{
1542 // TODO make everything use THIS winning condition (except LMS)
1544
1545 if(teamplay)
1546 {
1547 for (int i = 1; i < 5; ++i)
1548 {
1551 }
1552 }
1553
1554 ClearWinners();
1559
1561 {
1564 limit = -limit;
1565 }
1566
1568 leadlimit = 0; // not supported in this mode
1569
1570 if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
1571 {
1572 float fragsleft;
1574 {
1575 fragsleft = 1;
1576 }
1577 else
1578 {
1579 fragsleft = FLOAT_MAX;
1580 float leadingfragsleft = FLOAT_MAX;
1581 if (limit)
1582 fragsleft = limit - WinningConditionHelper_topscore;
1583 if (leadlimit)
1585
1586 if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
1587 fragsleft = max(fragsleft, leadingfragsleft);
1588 else
1589 fragsleft = min(fragsleft, leadingfragsleft);
1590 }
1591
1592 if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
1593 {
1594 if (fragsleft == 1)
1595 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
1596 else if (fragsleft == 2)
1597 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
1598 else if (fragsleft == 3)
1599 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
1600
1601 fragsleft_last = fragsleft;
1602 }
1603 }
1604
1605 bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
1606 bool leadlimit_reached = (leadlimit && WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
1607
1608 bool limit_reached;
1609 // only respect leadlimit_and_fraglimit when both limits are set or the game will never end
1610 if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
1611 limit_reached = (fraglimit_reached && leadlimit_reached);
1612 else
1613 limit_reached = (fraglimit_reached || leadlimit_reached);
1614
1615 return GetWinningCode(
1616 WinningConditionHelper_topscore && limit_reached,
1618 );
1619}
const float FLOAT_MAX
Definition float.qh:3
float TeamScore_GetCompareValue(float t)
Returns a value indicating the team score (and higher is better).
Definition scores.qc:806
float WinningConditionHelper_secondscore
second highest score
Definition scores.qh:108
entity WinningConditionHelper_winner
the winning player, or NULL if none
Definition scores.qh:112
float WinningConditionHelper_topscore
highest score
Definition scores.qh:107
float WinningConditionHelper_equality
we have no winner
Definition scores.qh:111
float WinningConditionHelper_lowerisbetter
lower is better, duh
Definition scores.qh:114
float WinningConditionHelper_zeroisworst
zero is worst, duh
Definition scores.qh:115
int autocvar_leadlimit_and_fraglimit
Definition sv_rules.qh:8
int fragsleft_last
Definition world.qc:1539
void SetWinners(.float field, float value)
Definition world.qc:1519
float GetWinningCode(float fraglimitreached, float equality)
Definition world.qc:1490

References autocvar_leadlimit_and_fraglimit, checkrules_suddendeathend, ClearWinners(), FLOAT_MAX, fragsleft_last, GetWinningCode(), max(), min(), MUTATOR_CALLHOOK, NULL, Send_Notification(), SetWinners(), team, Team_GetTeamFromIndex(), Team_IndexToTeam(), Team_SetTeamScore(), teamplay, TeamScore_GetCompareValue(), time, WinningConditionHelper(), WinningConditionHelper_equality, WinningConditionHelper_lowerisbetter, WinningConditionHelper_secondscore, WinningConditionHelper_topscore, WinningConditionHelper_winner, WinningConditionHelper_winnerteam, and WinningConditionHelper_zeroisworst.

Referenced by CheckRules_World(), WinningCondition_QualifyingThenRace(), and WinningCondition_Race().

Variable Documentation

◆ autocvar_sv_freezenonclients

bool autocvar_sv_freezenonclients

Definition at line 2440 of file world.qc.

Referenced by Physics_Frame().

◆ autocvar_sv_gameplayfix_multiplethinksperframe

bool autocvar_sv_gameplayfix_multiplethinksperframe = true

Definition at line 2412 of file world.qc.

Referenced by RunThink().

◆ fragsleft_last

int fragsleft_last

Definition at line 1539 of file world.qc.

Referenced by WinningCondition_Scores().

◆ latency_cnt

float latency_cnt

Definition at line 55 of file world.qc.

Referenced by PlayerStats_GameReport_FinalizePlayer().

◆ latency_sum

float latency_sum

Definition at line 54 of file world.qc.

Referenced by PlayerStats_GameReport_FinalizePlayer().

◆ LATENCY_THINKRATE

const float LATENCY_THINKRATE = 10

Definition at line 53 of file world.qc.

Referenced by PingPLReport_Think().

◆ latency_time

float latency_time

Definition at line 56 of file world.qc.

Referenced by PingPLReport_Think().

◆ pingplreport

entity pingplreport

Definition at line 57 of file world.qc.

Referenced by PingPLReport_Spawn().

◆ randomseed

entity randomseed

Definition at line 590 of file world.qc.

Referenced by RandomSeed_Spawn().

◆ redirection_nextthink

float redirection_nextthink

Definition at line 2539 of file world.qc.

Referenced by RedirectionThink().

◆ redirection_timeout

float redirection_timeout

Definition at line 2538 of file world.qc.

Referenced by RedirectionThink().

◆ SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS

const float SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS = 1

Definition at line 103 of file world.qc.

Referenced by spawnfunc().

◆ world_already_spawned

bool world_already_spawned

Definition at line 758 of file world.qc.

Referenced by spawnfunc().