Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
world.qh File Reference
Include dependency graph for world.qh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define autocvar_g_weaponarena   cvar_string("g_weaponarena")
#define WARMUP_START_WEAPONS   ((autocvar_g_warmup_allguns == 1) ? (warmup_start_weapons & (weaponsInMap | start_weapons)) : warmup_start_weapons)

Functions

void CheckRules_World ()
void DropToFloor_QC_DelayedInit (entity this)
void DumpStats (float final)
void InitializeEntitiesRun ()
void InitializeEntity (entity e, void(entity this) func, int order)
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 readlevelcvars ()
void readplayerstartcvars ()
void ReadyRestart (bool forceWarmupEnd)
float RedirectionThink ()
void SetWinners (.float field, float value)
 STATIC_INIT (g_moveables)
 void (entity this) initialize_entity
int want_weapon (entity weaponinfo, int allguns)
float WinningCondition_Scores (float limit, float leadlimit)

Variables

bool autocvar__endmatch
bool autocvar__sv_init
string autocvar__sv_vote_gametype_custom
bool autocvar_g_jetpack
string autocvar_g_random_start_weapons
 Holds a list of possible random start weapons.
bool autocvar_g_use_ammunition
int autocvar_g_warmup
int autocvar_g_warmup_allguns
bool autocvar_g_warmup_allow_timeout
string autocvar_quit_and_redirect
float autocvar_quit_and_redirect_timer
bool autocvar_quit_when_empty
string autocvar_sessionid
bool autocvar_sv_curl_serverpackages_auto
bool autocvar_sv_db_saveasdump
bool autocvar_sv_dedicated
bool autocvar_sv_logscores_bots
bool autocvar_sv_logscores_console
bool autocvar_sv_logscores_file
string autocvar_sv_logscores_filename
float autocvar_sv_mapchange_delay
bool autocvar_sv_mapformat_is_quake2
bool autocvar_sv_mapformat_is_quake3
string autocvar_sv_termsofservice_url
float autocvar_timelimit_decrement
float autocvar_timelimit_increment
float autocvar_timelimit_max
float autocvar_timelimit_min
float autocvar_timelimit_overtime
int autocvar_timelimit_overtimes
float autocvar_timelimit_suddendeath
string cache_lastmutatormsg
string cache_mutatormsg
float checkrules_equality
int checkrules_overtimesadded
float checkrules_suddendeathend
float checkrules_suddendeathwarning
string clientstuff
string cvar_changes
string cvar_purechanges
float cvar_purechanges_count
float default_player_alpha
float default_weapon_alpha
vector dropped_origin
string fog
float g_grappling_hook
IntrusiveList g_moveables
float g_weapon_stay
float g_weaponarena_random
int g_weaponarena_type
WepSet g_weaponarena_weapons
bool gametype_custom_enabled
entity initialize_entity_first
entity initialize_entity_next
int initialize_entity_order
string loaded_gametype_custom_string
string matchid
string modname
bool observe_blocked_if_eliminated = false
entity random_start_ammo
 Entity that contains amount of ammo to give with random start weapons.
int random_start_weapons_count
 Number of random start weapons to give to players.
string record_type
string redirection_target
float ServerProgsDB
float start_ammo_cells
float start_ammo_fuel
float start_ammo_nails
float start_ammo_rockets
float start_ammo_shells
float start_armorvalue
float start_health
int start_items
WepSet start_weapons
WepSet start_weapons_default
WepSet start_weapons_defaultmask
bool sv_ready_restart_after_countdown
string sv_termsofservice_url_escaped
float TemporaryDB
int warmup_stage
float warmup_start_ammo_cells
float warmup_start_ammo_fuel
float warmup_start_ammo_nails
float warmup_start_ammo_rockets
float warmup_start_ammo_shells
float warmup_start_armorvalue
float warmup_start_health
WepSet warmup_start_weapons
WepSet warmup_start_weapons_default
WepSet warmup_start_weapons_defaultmask
float winning
const int WINNING_NEVER = 2
const int WINNING_NO = 0
const int WINNING_STARTSUDDENDEATHOVERTIME = 3
const int WINNING_YES = 1
int world_initialized

Macro Definition Documentation

◆ autocvar_g_weaponarena

#define autocvar_g_weaponarena   cvar_string("g_weaponarena")

Definition at line 12 of file world.qh.

Referenced by GameLogInit().

◆ WARMUP_START_WEAPONS

#define WARMUP_START_WEAPONS   ((autocvar_g_warmup_allguns == 1) ? (warmup_start_weapons & (weaponsInMap | start_weapons)) : warmup_start_weapons)

Definition at line 100 of file world.qh.

Referenced by GiveWarmupResources(), and MUTATOR_HOOKFUNCTION().

Function Documentation

◆ CheckRules_World()

void CheckRules_World ( )

Definition at line 1733 of file world.qc.

1734{
1735 VoteThink();
1736 MapVote_Think();
1737
1739
1740 if (intermission_running) // someone else quit the game already
1741 {
1742 if(player_count == 0) // Nobody there? Then let's go to the next map
1743 MapVote_Start();
1744 // this will actually check the player count in the next frame
1745 // again, but this shouldn't hurt
1746 return;
1747 }
1748
1749 float timelimit = autocvar_timelimit * 60;
1750 float fraglimit = autocvar_fraglimit;
1751 float leadlimit = autocvar_leadlimit;
1752 if (leadlimit < 0) leadlimit = 0;
1753
1754 if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
1755 {
1756 if(timelimit > 0)
1757 timelimit = 0; // timelimit is not made for warmup
1758 if(fraglimit > 0)
1759 fraglimit = 0; // no fraglimit for now
1760 leadlimit = 0; // no leadlimit for now
1761 }
1762
1763 if (autocvar__endmatch || timelimit < 0)
1764 {
1765 // endmatch
1766 NextLevel();
1767 return;
1768 }
1769
1770 if(timelimit > 0)
1771 timelimit += game_starttime;
1772
1773 int overtimes_prev = overtimes;
1774 int wantovertime = 0;
1775
1777 {
1779 {
1782 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_RACE_FINISHLAP);
1783 else
1784 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_FRAG);
1785 }
1786 }
1787 else
1788 {
1789 if (timelimit && time >= timelimit)
1790 {
1791 if(g_race && (g_race_qualifying == 2) && timelimit > 0)
1792 {
1793 float totalplayers;
1794 float playerswithlaps;
1795 float readyplayers;
1796 totalplayers = playerswithlaps = readyplayers = 0;
1798 ++totalplayers;
1799 if(GameRules_scoring_add(it, RACE_FASTEST, 0))
1800 ++playerswithlaps;
1801 if(it.ready)
1802 ++readyplayers;
1803 });
1804
1805 // at least 2 of the players have completed a lap: start the RACE
1806 // otherwise, the players should end the qualifying on their own
1807 if(readyplayers || playerswithlaps >= 2)
1808 {
1810 ReadyRestart(true); // go to race
1811 return;
1812 }
1813 else
1814 wantovertime |= InitiateSuddenDeath();
1815 }
1816 else
1817 wantovertime |= InitiateSuddenDeath();
1818 }
1819 }
1820
1822 {
1823 NextLevel();
1824 return;
1825 }
1826
1827 int checkrules_status = WinningCondition_RanOutOfSpawns();
1828 if(checkrules_status == WINNING_YES)
1829 bprint("Hey! Someone ran out of spawns!\n");
1830 else if(MUTATOR_CALLHOOK(CheckRules_World, checkrules_status, timelimit, fraglimit))
1831 checkrules_status = M_ARGV(0, float);
1832 else
1833 checkrules_status = WinningCondition_Scores(fraglimit, leadlimit);
1834
1835 if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME)
1836 {
1837 checkrules_status = WINNING_NEVER;
1839 wantovertime |= InitiateSuddenDeath();
1840 }
1841
1842 if(checkrules_status == WINNING_NEVER)
1843 // equality cases! Nobody wins if the overtime ends in a draw.
1844 ClearWinners();
1845
1846 if(wantovertime)
1847 {
1848 if(checkrules_status == WINNING_NEVER)
1850 else
1851 checkrules_status = WINNING_YES;
1852 }
1853
1855 if(checkrules_status != WINNING_NEVER || time >= checkrules_suddendeathend)
1856 checkrules_status = WINNING_YES;
1857
1858 if(checkrules_status == WINNING_YES)
1859 {
1860 if (overtimes == OVERTIME_SUDDENDEATH && overtimes != overtimes_prev)
1861 {
1862 // if suddendeathend overtime has just begun, revert it
1864 overtimes = overtimes_prev;
1865 }
1866 //print("WINNING\n");
1867 NextLevel();
1868 }
1869}
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
#define IS_PLAYER(s)
Definition player.qh:242
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:1500
#define NULL
Definition post.qh:14
void VoteThink()
Definition vote.qc:336
void ReadyRestart(bool forceWarmupEnd)
Definition vote.qc:526
int g_race_qualifying
Definition race.qh:11
void MapVote_Think()
void MapVote_Start()
#define GameRules_scoring_add(client, fld, value)
Definition sv_rules.qh:85
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:52
void InitiateOvertime()
Definition world.qc:1507
int InitiateSuddenDeath()
Definition world.qc:1475
void SetDefaultAlpha()
Definition world.qc:105
void ClearWinners()
Definition world.qc:1562
void CheckRules_World()
Definition world.qc:1733
void NextLevel()
Definition world.qc:1412
float WinningCondition_Scores(float limit, float leadlimit)
Definition world.qc:1568
float WinningCondition_RanOutOfSpawns()
Definition world.qc:1649
const int WINNING_NEVER
Definition world.qh:133
float checkrules_suddendeathwarning
Definition world.qh:36
const int WINNING_STARTSUDDENDEATHOVERTIME
Definition world.qh:134
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:132

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().

◆ DropToFloor_QC_DelayedInit()

void DropToFloor_QC_DelayedInit ( entity this)

Definition at line 2399 of file world.qc.

2400{
2402}
const int INITPRIO_DROPTOFLOOR
Definition constants.qh:90
void InitializeEntity(entity e, void(entity this) func, int order)
Definition world.qc:2201
void DropToFloor_QC(entity this)
Definition world.qc:2275

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 1272 of file world.qc.

1273{
1274 float file;
1275 string s;
1276 float to_console;
1277 float to_eventlog;
1278 float to_file;
1279 float i;
1280
1281 to_console = autocvar_sv_logscores_console;
1282 to_eventlog = autocvar_sv_eventlog;
1284
1285 if(!final)
1286 {
1287 to_console = true; // always print printstats replies
1288 to_eventlog = false; // but never print them to the event log
1289 }
1290
1291 if(to_eventlog)
1293 to_console = false; // otherwise we get the output twice
1294
1295 if(final)
1296 s = ":scores:";
1297 else
1298 s = ":status:";
1299 s = strcat(s, GetGametype(), "_", GetMapname(), ":", ftos(rint(time)));
1300
1301 if(to_console)
1302 LOG_HELP(s);
1303 if(to_eventlog)
1304 GameLogEcho(s);
1305
1306 file = -1;
1307 if(to_file)
1308 {
1310 if(file == -1)
1311 to_file = false;
1312 else
1313 fputs(file, strcat(s, "\n"));
1314 }
1315
1316 s = strcat(":labels:player:", GetPlayerScoreString(NULL, 0));
1317 if(to_console)
1318 LOG_HELP(s);
1319 if(to_eventlog)
1320 GameLogEcho(s);
1321 if(to_file)
1322 fputs(file, strcat(s, "\n"));
1323
1325 s = strcat(":player:see-labels:", GetPlayerScoreString(it, 0), ":");
1326 s = strcat(s, ftos(rint(time - CS(it).jointime)), ":");
1327 if(IS_PLAYER(it) || INGAME_JOINED(it))
1328 s = strcat(s, ftos(it.team), ":");
1329 else
1330 s = strcat(s, "spectator:");
1331
1332 if(to_console)
1333 LOG_HELP(s, playername(it.netname, it.team, false));
1334 if(to_eventlog)
1335 GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it.netname, it.team, false)));
1336 if(to_file)
1337 fputs(file, strcat(s, playername(it.netname, it.team, false), "\n"));
1338 });
1339
1340 if(teamplay)
1341 {
1342 s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
1343 if(to_console)
1344 LOG_HELP(s);
1345 if(to_eventlog)
1346 GameLogEcho(s);
1347 if(to_file)
1348 fputs(file, strcat(s, "\n"));
1349
1350 for(i = 1; i < 16; ++i)
1351 {
1352 s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
1353 s = strcat(s, ":", ftos(i));
1354 if(to_console)
1355 LOG_HELP(s);
1356 if(to_eventlog)
1357 GameLogEcho(s);
1358 if(to_file)
1359 fputs(file, strcat(s, "\n"));
1360 }
1361 }
1362
1363 if(to_console)
1364 LOG_HELP(":end");
1365 if(to_eventlog)
1366 GameLogEcho(":end");
1367 if(to_file)
1368 {
1369 fputs(file, ":end\n");
1370 fclose(file);
1371 }
1372}
string playername(string thename, int teamid, bool team_colorize)
Definition util.qc:2180
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:83
void fclose(float fhandle)
void fputs(float fhandle, string s)
float fopen(string filename, float mode)
float rint(float f)
string ftos(float f)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
string GetTeamScoreString(int tm, float shortString)
Definition scores.qc:671
string GetPlayerScoreString(entity pl, float shortString)
Returns score strings for eventlog etc.
Definition scores.qc:610
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().

◆ InitializeEntitiesRun()

void InitializeEntitiesRun ( )

Definition at line 2234 of file world.qc.

2235{
2236 entity startoflist = initialize_entity_first;
2239 for (entity e = startoflist; e; e = e.initialize_entity_next)
2240 {
2241 e.remove_except_protected_forbidden = 1;
2242 }
2243 for (entity e = startoflist; e; )
2244 {
2245 e.remove_except_protected_forbidden = 0;
2246 e.initialize_entity_order = 0;
2247 entity next = e.initialize_entity_next;
2248 e.initialize_entity_next = NULL;
2249 var void(entity this) func = e.initialize_entity;
2250 e.initialize_entity = func_null;
2251 if (e.classname == "initialize_entity")
2252 {
2253 entity wrappee = e.enemy;
2254 builtin_remove(e);
2255 e = wrappee;
2256 }
2257 //dprint("Delayed initialization: ", e.classname, "\n");
2258 if (func)
2259 {
2260 func(e);
2261 }
2262 else
2263 {
2264 eprint(e);
2265 backtrace(strcat("Null function in: ", e.classname, "\n"));
2266 }
2267 e = next;
2268 }
2270}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
next
Definition all.qh:75
#define backtrace(msg)
Definition log.qh:96
void eprint(entity e)
var void func_null()
void
Definition self.qh:76
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:120

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 2201 of file world.qc.

2202{
2203 entity prev, cur;
2204
2205 if (!e || e.initialize_entity)
2206 {
2207 // make a proxy initializer entity
2208 entity e_old = e;
2209 e = new(initialize_entity);
2210 e.enemy = e_old;
2211 }
2212
2213 e.initialize_entity = func;
2214 e.initialize_entity_order = order;
2215
2217 prev = NULL;
2218 for (;;)
2219 {
2220 if (!cur || cur.initialize_entity_order > order)
2221 {
2222 // insert between prev and cur
2223 if (prev)
2224 prev.initialize_entity_next = e;
2225 else
2227 e.initialize_entity_next = cur;
2228 return;
2229 }
2230 prev = cur;
2231 cur = cur.initialize_entity_next;
2232 }
2233}
prev
Definition all.qh:53

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(), StartItem(), target_checkpoint_setup(), tdm_Initialize(), tmayhem_Initialize(), and turret_initialize().

◆ MatchEnd_RestoreSpectatorAndTeamStatus()

void MatchEnd_RestoreSpectatorAndTeamStatus ( .int prev_team_field)

Definition at line 1378 of file world.qc.

1379{
1380 bool fix_team = (teamplay && prev_team_field != team);
1381 FOREACH_CLIENT(true,
1382 {
1383 if (!IS_PLAYER(it) && INGAME_JOINING(it))
1384 {
1386 PutObserverInServer(it, true, false);
1387 bprint(playername(it.netname, it.team, false), " has been moved back to spectator\n");
1388 it.winning = false;
1389 }
1390 else if (fix_team && INGAME_JOINED(it) && it.(prev_team_field) && it.team != it.(prev_team_field))
1391 {
1393 if (MoveToTeam(it, Team_TeamToIndex(it.(prev_team_field)), 6))
1394 {
1395 string pl_name = playername(it.netname, it.team, false);
1396 bprint(pl_name, " has been moved back to the ", Team_ColoredFullName(it.team), "\n");
1397 }
1398 it.winning = (it.team == WinningConditionHelper_winnerteam);
1399 }
1400 });
1401}
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:345
bool MoveToTeam(entity client, int team_index, int type)
Moves player to the specified team.
Definition teamplay.qc:331
@ TEAM_FORCE_DEFAULT
Don't force any team.
Definition teamplay.qh:153
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 1403 of file world.qc.

1404{
1406}
void MatchEnd_RestoreSpectatorAndTeamStatus(.int prev_team_field)
Definition world.qc:1378

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 1125 of file world.qc.

1126{
1127 float m = e.dphitcontentsmask;
1128 e.dphitcontentsmask = goodcontents | badcontents;
1129
1130 vector org = boundmin;
1131 vector delta = boundmax - boundmin;
1132
1133 vector start, end;
1134 start = end = org;
1135 int j; // used after the loop
1136 for(j = 0; j < attempts; ++j)
1137 {
1138 start.x = org.x + random() * delta.x;
1139 start.y = org.y + random() * delta.y;
1140 start.z = org.z + random() * delta.z;
1141
1142 // rule 1: start inside world bounds, and outside
1143 // solid, and don't start from somewhere where you can
1144 // fall down to evil
1145 tracebox(start, e.mins, e.maxs, start - '0 0 1' * delta.z, MOVE_NORMAL, e);
1146 if (trace_fraction >= 1)
1147 continue;
1148 if (trace_startsolid)
1149 continue;
1150 if (trace_dphitcontents & badcontents)
1151 continue;
1152 if (trace_dphitq3surfaceflags & badsurfaceflags)
1153 continue;
1154
1155 // rule 2: if we are too high, lower the point
1156 if (trace_fraction * delta.z > maxaboveground)
1157 start = trace_endpos + '0 0 1' * maxaboveground;
1158 vector enddown = trace_endpos;
1159
1160 // rule 3: make sure we aren't outside the map. This only works
1161 // for somewhat well formed maps. A good rule of thumb is that
1162 // the map should have a convex outside hull.
1163 // these can be traceLINES as we already verified the starting box
1164 vector mstart = start + 0.5 * (e.mins + e.maxs);
1165 traceline(mstart, mstart + '1 0 0' * delta.x, MOVE_NORMAL, e);
1166 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1167 continue;
1168 traceline(mstart, mstart - '1 0 0' * delta.x, MOVE_NORMAL, e);
1169 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1170 continue;
1171 traceline(mstart, mstart + '0 1 0' * delta.y, MOVE_NORMAL, e);
1172 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1173 continue;
1174 traceline(mstart, mstart - '0 1 0' * delta.y, MOVE_NORMAL, e);
1175 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1176 continue;
1177 traceline(mstart, mstart + '0 0 1' * delta.z, MOVE_NORMAL, e);
1178 if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk")
1179 continue;
1180
1181 // rule 4: we must "be seen" by some spawnpoint or item
1182 // Note that checkpvs from mstart to item can detect visibility if mstart is behind
1183 // patch brushes (curved walls) that don't block visibility from the outside, however
1184 // the next traceline from item to mstart correctly detects invisibility in this case
1185 entity sp = NULL;
1186 if(frompos)
1187 {
1188 if((traceline(e.origin, mstart, MOVE_NORMAL, e), trace_fraction) >= 1)
1189 sp = e;
1190 }
1191 if(!sp)
1192 {
1193 IL_EACH(g_spawnpoints, checkpvs(mstart, it),
1194 {
1195 if((traceline(it.origin, mstart, MOVE_NORMAL, e), trace_fraction) >= 1)
1196 {
1197 sp = it;
1198 break;
1199 }
1200 });
1201 }
1202 if(!sp)
1203 {
1204 int items_checked = 0;
1205 IL_EACH(g_items, checkpvs(mstart, it),
1206 {
1207 if((traceline(it.origin + (it.mins + it.maxs) * 0.5, mstart, MOVE_NORMAL, e), trace_fraction) >= 1)
1208 {
1209 sp = it;
1210 break;
1211 }
1212
1213 ++items_checked;
1214 if(items_checked >= attempts)
1215 break; // sanity
1216 });
1217
1218 if(!sp)
1219 continue;
1220 }
1221
1222 float vlen_delta = vlen(delta);
1223 // find a random vector to "look at"
1224 end.x = org.x + random() * delta.x;
1225 end.y = org.y + random() * delta.y;
1226 end.z = org.z + random() * delta.z;
1227 end = start + normalize(end - start) * vlen_delta;
1228
1229 // rule 4: start TO end must not be too short
1230 tracebox(start, e.mins, e.maxs, end, MOVE_NORMAL, e);
1232 continue;
1233 if(trace_fraction < minviewdistance / vlen_delta)
1234 continue;
1235
1236 // rule 5: don't want to look at sky
1238 continue;
1239
1240 // rule 6: we must not end up in trigger_hurt
1241 if(tracebox_hits_trigger_hurt(start, e.mins, e.maxs, enddown))
1242 continue;
1243
1244 break;
1245 }
1246
1247 e.dphitcontentsmask = m;
1248
1249 if(j < attempts)
1250 {
1251 setorigin(e, start);
1252 e.angles = vectoangles(end - start);
1253 LOG_DEBUG("Needed ", ftos(j + 1), " attempts");
1254 return true;
1255 }
1256 return false;
1257}
float Q3SURFACEFLAG_SKY
float trace_dphitcontents
const float MOVE_NORMAL
string trace_dphittexturename
vector trace_endpos
float checkpvs(vector viewpos, entity viewee)
float trace_startsolid
float trace_dphitq3surfaceflags
float trace_fraction
bool tracebox_hits_trigger_hurt(vector start, vector e_min, vector e_max, vector end)
Definition hurt.qc:78
#define IL_EACH(this, cond, body)
#define LOG_DEBUG(...)
Definition log.qh:78
float random(void)
float vlen(vector v)
vector vectoangles(vector v)
vector normalize(vector v)
vector
Definition self.qh:96
vector org
Definition self.qh:96
IntrusiveList g_items
Definition items.qh:119
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 1259 of file world.qc.

1260{
1261 return MoveToRandomLocationWithinBounds(e, world.mins, world.maxs, goodcontents, badcontents, badsurfaceflags, attempts, maxaboveground, minviewdistance, false);
1262}
#define world
Definition post.qh:15
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:1125

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

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

◆ readlevelcvars()

void readlevelcvars ( )

Definition at line 2157 of file world.qc.

2158{
2160 if(cvar("sv_allow_fullbright"))
2162
2164 if(cvar("sv_forbid_pickuptimer"))
2166
2167 sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
2168
2169 if(cvar("g_campaign"))
2170 warmup_stage = 0; // no warmup during campaign
2171 else
2172 {
2175 warmup_limit = -1; // don't start until there's enough players
2176 else if (warmup_stage == 1)
2177 {
2178 // this code is duplicated in ReadyCount()
2179 warmup_limit = cvar("g_warmup_limit");
2180 if(warmup_limit == 0)
2182 }
2183 }
2184
2185 g_weapon_stay = cvar(strcat("g_", GetGametype(), "_weapon_stay"));
2186 if (!g_weapon_stay)
2187 g_weapon_stay = cvar("g_weapon_stay");
2188 MUTATOR_CALLHOOK(SetWeaponStay, g_weapon_stay);
2189 g_weapon_stay = M_ARGV(0, int);
2190
2191 MUTATOR_CALLHOOK(ReadLevelCvars);
2192
2194 game_starttime = time + cvar("g_start_delay");
2195
2196 FOREACH(Weapons, it != WEP_Null, { it.wr_init(it); });
2197
2199}
int serverflags
Definition main.qh:211
float warmup_limit
Definition stats.qh:377
const int SERVERFLAG_FORBID_PICKUPTIMER
Definition constants.qh:21
const int SERVERFLAG_ALLOW_FULLBRIGHT
Definition constants.qh:17
Weapons
Definition guide.qh:113
#define FOREACH(list, cond, body)
Definition iter.qh:19
bool autocvar_g_campaign
Definition menu.qc:752
float cvar(string name)
void readplayerstartcvars()
Definition world.qc:1969
float g_weapon_stay
Definition world.qh:108
int autocvar_g_warmup
Definition world.qh:9
bool sv_ready_restart_after_countdown
Definition world.qh:115

References autocvar_g_campaign, autocvar_g_warmup, autocvar_timelimit, cvar(), FOREACH, g_weapon_stay, game_starttime, GetGametype(), M_ARGV, 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 1969 of file world.qc.

1970{
1971 // initialize starting values for players
1972 start_weapons = '0 0 0';
1973 start_weapons_default = '0 0 0';
1974 start_weapons_defaultmask = '0 0 0';
1975 start_items = 0;
1977 start_ammo_nails = 0;
1979 start_ammo_cells = 0;
1980 if (random_start_ammo == NULL)
1982 start_health = cvar("g_balance_health_start");
1983 start_armorvalue = cvar("g_balance_armor_start");
1984
1985 string s = cvar_string("g_weaponarena");
1986 MUTATOR_CALLHOOK(SetWeaponArena, s);
1987 s = M_ARGV(0, string);
1988 switch (s)
1989 {
1990 case "0": case "": case "off":
1992 g_weaponarena_weapons = '0 0 0';
1993 break;
1994 case "all": case "1":
1997 break;
1998 case "devall":
2001 break;
2002 case "standard": case "most":
2005 break;
2006 case "extended":
2009 break;
2010 case "extended_available":
2013
2014 // this needs to run after weaponsInMapAll is initialized
2016 break;
2017 case "all_available":
2020
2021 // this needs to run after weaponsInMapAll is initialized
2023 break;
2024 case "devall_available":
2027
2028 // this needs to run after weaponsInMapAll is initialized
2030 break;
2031 case "standard_available": case "most_available":
2034
2035 // this needs to run after weaponsInMapAll is initialized
2037 break;
2038 case "none":
2040 g_weaponarena_weapons = '0 0 0';
2041 break;
2042 default:
2043 {
2044 g_weaponarena_weapons = '0 0 0';
2045 Weapon wep;
2046 int t = tokenize_console(s);
2047 for (int j = 0; j < t; ++j)
2048 {
2049 wep = Weapon_from_name(argv(j));
2050 if (wep != WEP_Null)
2051 g_weaponarena_weapons |= wep.m_wepset;
2052 }
2054 }
2055 }
2056
2058 {
2059 g_weapon_stay = 0; // incompatible
2062 }
2063 else
2064 FOREACH(Weapons, it != WEP_Null,
2065 {
2066 int w = want_weapon(it, false);
2067 WepSet set = it.m_wepset;
2068 if (w & 1)
2069 start_weapons |= set;
2070 if (w & 2)
2071 start_weapons_default |= set;
2072 if (w & 4)
2074 });
2075
2076 if (cvar("g_balance_superweapons_time") < 0)
2078 if (!cvar("g_use_ammunition"))
2080
2081 start_ammo_shells = cvar("g_start_ammo_shells");
2082 start_ammo_nails = cvar("g_start_ammo_nails");
2083 start_ammo_rockets = cvar("g_start_ammo_rockets");
2084 start_ammo_cells = cvar("g_start_ammo_cells");
2085 start_ammo_fuel = cvar("g_start_ammo_fuel");
2086 random_start_weapons_count = cvar("g_random_start_weapons_count");
2087 SetResource(random_start_ammo, RES_SHELLS, cvar("g_random_start_shells"));
2088 SetResource(random_start_ammo, RES_BULLETS, cvar("g_random_start_bullets"));
2089 SetResource(random_start_ammo, RES_ROCKETS, cvar("g_random_start_rockets"));
2090 SetResource(random_start_ammo, RES_CELLS, cvar("g_random_start_cells"));
2091
2102
2104 {
2105 warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
2106 warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
2107 warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
2108 warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
2109 warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
2110 warmup_start_health = cvar("g_warmup_start_health");
2111 warmup_start_armorvalue = cvar("g_warmup_start_armor");
2112 warmup_start_weapons = '0 0 0';
2115 FOREACH(Weapons, it != WEP_Null,
2116 {
2118 WepSet set = it.m_wepset;
2119 if (w & 1)
2120 warmup_start_weapons |= set;
2121 if (w & 2)
2123 if (w & 4)
2125 });
2126 }
2127
2129 start_items |= ITEM_Jetpack.m_itemid;
2130
2131 MUTATOR_CALLHOOK(SetStartItems);
2132
2133 if (start_items & ITEM_Jetpack.m_itemid)
2134 {
2135 start_items |= ITEM_FuelRegen.m_itemid;
2136 start_ammo_fuel = max(start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
2137 warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
2138 }
2139
2145 SetResource(random_start_ammo, RES_SHELLS, max(0, GetResource(random_start_ammo, RES_SHELLS)));
2146 SetResource(random_start_ammo, RES_BULLETS, max(0, GetResource(random_start_ammo, RES_BULLETS)));
2147 SetResource(random_start_ammo, RES_ROCKETS, max(0, GetResource(random_start_ammo, RES_ROCKETS)));
2148 SetResource(random_start_ammo, RES_CELLS, max(0, GetResource(random_start_ammo, RES_CELLS)));
2149
2155}
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:37
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:89
#define tokenize_console
const string cvar_string(string name)
string argv(float n)
float max(float f,...)
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:66
Weapon Weapon_from_name(string s)
Definition all.qh:145
@ WEPARENA_ALL
Definition weapon.qh:276
@ WEPARENA_ALL_AVAILABLE
Definition weapon.qh:277
@ WEPARENA_NONE
Definition weapon.qh:274
@ WEPARENA_EXTENDED_AVAILABLE
Definition weapon.qh:281
@ WEPARENA_STANDARD_AVAILABLE
Definition weapon.qh:279
@ WEPARENA_EXTENDED
Definition weapon.qh:280
@ WEPARENA_DEVALL
Definition weapon.qh:282
@ WEPARENA_STANDARD
Definition weapon.qh:278
@ WEPARENA_DEVALL_AVAILABLE
Definition weapon.qh:283
@ WEPARENA_OFF
Definition weapon.qh:273
@ WEPARENA_CUSTOM
Definition weapon.qh:275
vector WepSet
Definition weapon.qh:14
int want_weapon(entity weaponinfo, int allguns)
Definition world.qc:1871
WepSet weapons_standard()
Definition world.qc:1940
WepSet weapons_all()
Definition world.qc:1922
void weaponarena_available_update(entity this)
Definition world.qc:1962
WepSet weapons_extended()
Definition world.qc:1951
WepSet weapons_devall()
Definition world.qc:1933
WepSet start_weapons
Definition world.qh:79
float warmup_start_ammo_cells
Definition world.qh:104
entity random_start_ammo
Entity that contains amount of ammo to give with random start weapons.
Definition world.qh:94
bool autocvar_g_jetpack
Definition world.qh:8
float start_ammo_shells
Definition world.qh:83
float warmup_start_ammo_rockets
Definition world.qh:103
float warmup_start_ammo_shells
Definition world.qh:101
float start_ammo_fuel
Definition world.qh:87
int start_items
Definition world.qh:82
WepSet start_weapons_default
Definition world.qh:80
int random_start_weapons_count
Number of random start weapons to give to players.
Definition world.qh:89
float warmup_start_ammo_nails
Definition world.qh:102
int autocvar_g_warmup_allguns
Definition world.qh:10
WepSet g_weaponarena_weapons
Definition world.qh:75
float start_ammo_cells
Definition world.qh:86
float warmup_start_health
Definition world.qh:106
WepSet start_weapons_defaultmask
Definition world.qh:81
float start_ammo_rockets
Definition world.qh:85
WepSet warmup_start_weapons_default
Definition world.qh:98
int g_weaponarena_type
Definition world.qh:77
float start_armorvalue
Definition world.qh:96
WepSet warmup_start_weapons_defaultmask
Definition world.qh:99
WepSet warmup_start_weapons
Definition world.qh:97
float warmup_start_ammo_fuel
Definition world.qh:105
float start_health
Definition world.qh:95
float warmup_start_armorvalue
Definition world.qh:107
float start_ammo_nails
Definition world.qh:84

References argv(), autocvar_g_jetpack, autocvar_g_warmup_allguns, cvar(), cvar_string(), FOREACH, g_weapon_stay, g_weaponarena_type, g_weaponarena_weapons, GetResource(), InitializeEntity(), INITPRIO_FINDTARGET, IT_UNLIMITED_AMMO, IT_UNLIMITED_SUPERWEAPONS, M_ARGV, max(), MUTATOR_CALLHOOK, 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, 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_update(), Weapons, weapons_all(), weapons_devall(), weapons_extended(), weapons_standard(), WEPARENA_ALL, WEPARENA_ALL_AVAILABLE, WEPARENA_CUSTOM, WEPARENA_DEVALL, WEPARENA_DEVALL_AVAILABLE, WEPARENA_EXTENDED, WEPARENA_EXTENDED_AVAILABLE, WEPARENA_NONE, WEPARENA_OFF, WEPARENA_STANDARD, and WEPARENA_STANDARD_AVAILABLE.

Referenced by readlevelcvars().

◆ ReadyRestart()

void ReadyRestart ( bool forceWarmupEnd)

Definition at line 526 of file vote.qc.

527{
528 if (MUTATOR_CALLHOOK(ReadyRestart_Deny))
529 {
530 // NOTE: ReadyRestart support is mandatory in campaign
532 error("ReadyRestart must be supported in campaign mode!");
533 localcmd("restart\n"); // if ReadyRestart is denied, restart the server
534 }
535 else if (intermission_running || race_completing) // game is over, ReadyRestart no longer available
536 localcmd("restart\n");
537 else
538 localcmd("\nsv_hook_readyrestart\n");
539
540 if(forceWarmupEnd || autocvar_g_campaign)
541 warmup_stage = 0; // forcefully end warmup and go to match stage
542 else
543 warmup_stage = autocvar_g_warmup; // go into warmup if it's enabled, otherwise restart into match stage
544
545 ReadyRestart_force(false);
546}
void localcmd(string command,...)
#define error
Definition pre.qh:6
void ReadyRestart_force(bool is_fake_round_start)
Definition vote.qc:441
float race_completing
Definition race.qh:26

References autocvar_g_campaign, autocvar_g_warmup, error, intermission_running, localcmd(), MUTATOR_CALLHOOK, race_completing, ReadyRestart_force(), and warmup_stage.

Referenced by CheckRules_World(), GameCommand_allready(), GameCommand_resetmatch(), Join(), ReadyCount(), and StartFrame().

◆ RedirectionThink()

float RedirectionThink ( )

Definition at line 2532 of file world.qc.

2533{
2534 float clients_found;
2535
2536 if(redirection_target == "")
2537 return false;
2538
2540 {
2541 cvar_set("sv_public", "-2");
2542 redirection_timeout = time + 0.6; // this will only try twice... should be able to keep more clients
2543 if(redirection_target == "self")
2544 bprint("^3SERVER NOTICE:^7 restarting the server\n");
2545 else
2546 bprint("^3SERVER NOTICE:^7 redirecting everyone to ", redirection_target, "\n");
2547 }
2548
2550 return true;
2551
2553
2554 clients_found = 0;
2556 // TODO add timer
2557 LOG_INFO("Redirecting: sending connect command to ", it.netname);
2558 if(redirection_target == "self")
2559 stuffcmd(it, "\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " reconnect\n");
2560 else
2561 stuffcmd(it, strcat("\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " \"connect ", redirection_target, "\"\n"));
2562 ++clients_found;
2563 });
2564
2565 LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.");
2566
2567 if(time > redirection_timeout || clients_found == 0)
2568 localcmd("\nwait; wait; wait; quit\n");
2569
2570 return true;
2571}
#define LOG_INFO(...)
Definition log.qh:62
void cvar_set(string name, string value)
#define stuffcmd(cl,...)
Definition progsdefs.qh:23
float redirection_nextthink
Definition world.qc:2531
float redirection_timeout
Definition world.qc:2530
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().

◆ SetWinners()

void SetWinners ( .float field,
float value )

Definition at line 1547 of file world.qc.

1548{
1549 FOREACH_CLIENT(IS_PLAYER(it) || INGAME(it), { it.winning = (it.(field) == value); });
1550}
#define INGAME(it)
Definition sv_rules.qh:24

References FOREACH_CLIENT, INGAME, and IS_PLAYER.

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

◆ STATIC_INIT()

STATIC_INIT ( g_moveables )

Definition at line 157 of file world.qh.

157{ g_moveables = IL_NEW(); }
#define IL_NEW()
IntrusiveList g_moveables
Definition world.qh:156

References g_moveables, and IL_NEW.

◆ void()

void ( entity this)

References entity().

◆ want_weapon()

int want_weapon ( entity weaponinfo,
int allguns )

Definition at line 1871 of file world.qc.

1872{
1873 int d = 0;
1874 bool allow_mutatorblocked = false;
1875
1876 if(!weaponinfo.m_id)
1877 return 0;
1878
1879 bool mutator_returnvalue = MUTATOR_CALLHOOK(WantWeapon, weaponinfo, d, allguns, allow_mutatorblocked);
1880 d = M_ARGV(1, float);
1881 allguns = M_ARGV(2, int);
1882 allow_mutatorblocked = M_ARGV(3, bool);
1883
1884 if(allguns == 1)
1885 d = boolean(!(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
1886 else if(allguns == 2)
1887 d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
1888 else if(!mutator_returnvalue)
1889 d = !(!weaponinfo.weaponstart);
1890
1891 if(!allow_mutatorblocked && (weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED)) // never default mutator blocked guns
1892 d = 0;
1893
1894 float t = weaponinfo.weaponstartoverride;
1895
1896 //LOG_INFOF("want_weapon: %s - d: %d t: %d\n", weaponinfo.netname, d, t);
1897
1898 // bit order in t:
1899 // 1: want or not
1900 // 2: is default?
1901 // 4: is set by default?
1902 if(t < 0)
1903 t = 4 | (3 * d);
1904 else
1905 t |= (2 * d);
1906
1907 return t;
1908}
#define boolean(value)
Definition bool.qh:9
const int WEP_FLAG_MUTATORBLOCKED
hides from impulse 99 etc. (mutators are allowed to clear this flag)
Definition weapon.qh:256
const int WEP_FLAG_HIDDEN
hides from menu
Definition weapon.qh:253
const int WEP_FLAG_NORMAL
in "most weapons" set
Definition weapon.qh:252

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

Referenced by readplayerstartcvars(), and weapons_start().

◆ WinningCondition_Scores()

float WinningCondition_Scores ( float limit,
float leadlimit )

Definition at line 1568 of file world.qc.

1569{
1570 // TODO make everything use THIS winning condition (except LMS)
1572
1573 if(teamplay)
1574 {
1575 for (int i = 1; i <= AVAILABLE_TEAMS; ++i)
1576 {
1579 }
1580 }
1581
1582 ClearWinners();
1587
1589 {
1592 limit = -limit;
1593 }
1594
1596 leadlimit = 0; // not supported in this mode
1597
1598 if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
1599 {
1600 float fragsleft;
1602 {
1603 fragsleft = 1;
1604 }
1605 else
1606 {
1607 fragsleft = FLOAT_MAX;
1608 float leadingfragsleft = FLOAT_MAX;
1609 if (limit)
1610 fragsleft = limit - WinningConditionHelper_topscore;
1611 if (leadlimit)
1613
1614 if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
1615 fragsleft = max(fragsleft, leadingfragsleft);
1616 else
1617 fragsleft = min(fragsleft, leadingfragsleft);
1618 }
1619
1620 if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
1621 {
1622 if (fragsleft == 1)
1623 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
1624 else if (fragsleft == 2)
1625 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
1626 else if (fragsleft == 3)
1627 Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
1628
1629 fragsleft_last = fragsleft;
1630 }
1631 }
1632
1633 bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
1634 bool leadlimit_reached = (leadlimit && WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
1635
1636 bool limit_reached;
1637 // only respect leadlimit_and_fraglimit when both limits are set or the game will never end
1638 if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
1639 limit_reached = (fraglimit_reached && leadlimit_reached);
1640 else
1641 limit_reached = (fraglimit_reached || leadlimit_reached);
1642
1643 return GetWinningCode(
1644 WinningConditionHelper_topscore && limit_reached,
1646 );
1647}
const float FLOAT_MAX
Definition float.qh:3
float min(float f,...)
float TeamScore_GetCompareValue(float t)
Returns a value indicating the team score (and higher is better).
Definition scores.qc:803
void WinningConditionHelper(entity this)
Sets the following results for the current scores entities.
Definition scores.qc:440
#define AVAILABLE_TEAMS
Number of teams that exist currently.
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
void Team_SetTeamScore(entity team_ent, float score)
Sets the score of the team.
Definition teamplay.qc:109
entity Team_GetTeamFromIndex(int index)
Returns the global team entity at the given index.
Definition teamplay.qc:86
int Team_IndexToTeam(int index)
Converts team index into team value.
Definition teams.qh:169
int fragsleft_last
Definition world.qc:1567
void SetWinners(.float field, float value)
Definition world.qc:1547
float GetWinningCode(float fraglimitreached, float equality)
Definition world.qc:1518

References autocvar_leadlimit_and_fraglimit, AVAILABLE_TEAMS, 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__endmatch

bool autocvar__endmatch

Definition at line 6 of file world.qh.

Referenced by CheckRules_World(), Pause_TryPause_Dedicated(), and SV_PausedTic().

◆ autocvar__sv_init

bool autocvar__sv_init

Definition at line 5 of file world.qh.

Referenced by GotoFirstMap().

◆ autocvar__sv_vote_gametype_custom

string autocvar__sv_vote_gametype_custom

Definition at line 51 of file world.qh.

Referenced by InitGameplayMode().

◆ autocvar_g_jetpack

bool autocvar_g_jetpack

Definition at line 8 of file world.qh.

Referenced by readplayerstartcvars(), and SendWelcomeMessage().

◆ autocvar_g_random_start_weapons

string autocvar_g_random_start_weapons

Holds a list of possible random start weapons.

Definition at line 91 of file world.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_use_ammunition

bool autocvar_g_use_ammunition

Definition at line 7 of file world.qh.

Referenced by GameLogInit().

◆ autocvar_g_warmup

int autocvar_g_warmup

Definition at line 9 of file world.qh.

Referenced by readlevelcvars(), ReadyCount(), ReadyRestart(), and SendWelcomeMessage().

◆ autocvar_g_warmup_allguns

int autocvar_g_warmup_allguns

Definition at line 10 of file world.qh.

Referenced by readplayerstartcvars().

◆ autocvar_g_warmup_allow_timeout

bool autocvar_g_warmup_allow_timeout

Definition at line 11 of file world.qh.

Referenced by CommonCommand_timeout().

◆ autocvar_quit_and_redirect

string autocvar_quit_and_redirect

Definition at line 13 of file world.qh.

Referenced by DoNextMapOverride().

◆ autocvar_quit_and_redirect_timer

float autocvar_quit_and_redirect_timer

Definition at line 14 of file world.qh.

Referenced by RedirectionThink().

◆ autocvar_quit_when_empty

bool autocvar_quit_when_empty

Definition at line 15 of file world.qh.

Referenced by DoNextMapOverride().

◆ autocvar_sessionid

string autocvar_sessionid

Definition at line 16 of file world.qh.

Referenced by RestoreGame(), Shutdown(), and spawnfunc().

◆ autocvar_sv_curl_serverpackages_auto

bool autocvar_sv_curl_serverpackages_auto

Definition at line 17 of file world.qh.

Referenced by spawnfunc().

◆ autocvar_sv_db_saveasdump

bool autocvar_sv_db_saveasdump

Definition at line 18 of file world.qh.

Referenced by Shutdown().

◆ autocvar_sv_dedicated

◆ autocvar_sv_logscores_bots

bool autocvar_sv_logscores_bots

Definition at line 19 of file world.qh.

Referenced by DumpStats().

◆ autocvar_sv_logscores_console

bool autocvar_sv_logscores_console

Definition at line 20 of file world.qh.

Referenced by DumpStats().

◆ autocvar_sv_logscores_file

bool autocvar_sv_logscores_file

Definition at line 21 of file world.qh.

Referenced by DumpStats().

◆ autocvar_sv_logscores_filename

string autocvar_sv_logscores_filename

Definition at line 22 of file world.qh.

Referenced by DumpStats().

◆ autocvar_sv_mapchange_delay

float autocvar_sv_mapchange_delay

Definition at line 23 of file world.qh.

Referenced by NextLevel().

◆ autocvar_sv_mapformat_is_quake2

bool autocvar_sv_mapformat_is_quake2

Definition at line 33 of file world.qh.

Referenced by DropToFloor_QC(), and Physics_UpdateStats().

◆ autocvar_sv_mapformat_is_quake3

bool autocvar_sv_mapformat_is_quake3

Definition at line 32 of file world.qh.

Referenced by DropToFloor_QC(), Physics_UpdateStats(), and PutPlayerInServer().

◆ autocvar_sv_termsofservice_url

string autocvar_sv_termsofservice_url

Definition at line 57 of file world.qh.

Referenced by spawnfunc().

◆ autocvar_timelimit_decrement

float autocvar_timelimit_decrement

Definition at line 25 of file world.qh.

Referenced by GameCommand_reducematchtime().

◆ autocvar_timelimit_increment

float autocvar_timelimit_increment

Definition at line 24 of file world.qh.

Referenced by GameCommand_extendmatchtime().

◆ autocvar_timelimit_max

float autocvar_timelimit_max

◆ autocvar_timelimit_min

float autocvar_timelimit_min

◆ autocvar_timelimit_overtime

float autocvar_timelimit_overtime

Definition at line 28 of file world.qh.

Referenced by InitiateOvertime(), InitiateSuddenDeath(), and ReadyRestart_force().

◆ autocvar_timelimit_overtimes

int autocvar_timelimit_overtimes

Definition at line 29 of file world.qh.

Referenced by InitiateSuddenDeath().

◆ autocvar_timelimit_suddendeath

float autocvar_timelimit_suddendeath

Definition at line 30 of file world.qh.

Referenced by InitiateSuddenDeath(), and Onslaught_CheckWinner().

◆ cache_lastmutatormsg

string cache_lastmutatormsg

Definition at line 70 of file world.qh.

Referenced by InitGameplayMode(), and SendWelcomeMessage().

◆ cache_mutatormsg

string cache_mutatormsg

Definition at line 69 of file world.qh.

Referenced by InitGameplayMode(), net_handle_ServerWelcome(), and SendWelcomeMessage().

◆ checkrules_equality

float checkrules_equality

Definition at line 35 of file world.qh.

Referenced by CampaignPreIntermission(), and WinningCondition_RanOutOfSpawns().

◆ checkrules_overtimesadded

int checkrules_overtimesadded

◆ checkrules_suddendeathend

float checkrules_suddendeathend

◆ checkrules_suddendeathwarning

float checkrules_suddendeathwarning

Definition at line 36 of file world.qh.

Referenced by CheckRules_World(), and ReadyRestart_force().

◆ clientstuff

string clientstuff

Definition at line 61 of file world.qh.

Referenced by ClientConnect(), InitGameplayMode(), and spawnfunc().

◆ cvar_changes

string cvar_changes

Definition at line 45 of file world.qh.

Referenced by COMMON_COMMAND(), CommonCommand_cvar_changes(), and cvar_changes_init().

◆ cvar_purechanges

string cvar_purechanges

◆ cvar_purechanges_count

float cvar_purechanges_count

◆ default_player_alpha

◆ default_weapon_alpha

◆ dropped_origin

◆ fog

string fog

Definition at line 65 of file world.qh.

Referenced by Fog_Set().

◆ g_grappling_hook

float g_grappling_hook

Definition at line 112 of file world.qh.

Referenced by PRECACHE(), and REGISTER_MUTATOR().

◆ g_moveables

◆ g_weapon_stay

◆ g_weaponarena_random

float g_weaponarena_random

Definition at line 76 of file world.qh.

Referenced by MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ g_weaponarena_type

◆ g_weaponarena_weapons

◆ gametype_custom_enabled

bool gametype_custom_enabled

◆ initialize_entity_first

entity initialize_entity_first

Definition at line 120 of file world.qh.

Referenced by InitializeEntitiesRun(), InitializeEntity(), and make_safe_for_remove().

◆ initialize_entity_next

entity initialize_entity_next

Definition at line 119 of file world.qh.

◆ initialize_entity_order

int initialize_entity_order

Definition at line 118 of file world.qh.

◆ loaded_gametype_custom_string

string loaded_gametype_custom_string

◆ matchid

◆ modname

◆ observe_blocked_if_eliminated

bool observe_blocked_if_eliminated = false

◆ random_start_ammo

entity random_start_ammo

Entity that contains amount of ammo to give with random start weapons.

Definition at line 94 of file world.qh.

Referenced by PutPlayerInServer(), and readplayerstartcvars().

◆ random_start_weapons_count

int random_start_weapons_count

Number of random start weapons to give to players.

Definition at line 89 of file world.qh.

Referenced by PutPlayerInServer(), and readplayerstartcvars().

◆ record_type

◆ redirection_target

string redirection_target

Definition at line 67 of file world.qh.

Referenced by DoNextMapOverride(), and RedirectionThink().

◆ ServerProgsDB

◆ 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

WepSet start_weapons_default

Definition at line 80 of file world.qh.

Referenced by readplayerstartcvars().

◆ start_weapons_defaultmask

WepSet start_weapons_defaultmask

Definition at line 81 of file world.qh.

Referenced by MUTATOR_HOOKFUNCTION(), and readplayerstartcvars().

◆ sv_ready_restart_after_countdown

bool sv_ready_restart_after_countdown

◆ sv_termsofservice_url_escaped

string sv_termsofservice_url_escaped

Definition at line 59 of file world.qh.

Referenced by Shutdown(), spawnfunc(), and WinningConditionHelper().

◆ TemporaryDB

float TemporaryDB

◆ warmup_stage

int warmup_stage

Definition at line 113 of file world.qh.

◆ 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

WepSet warmup_start_weapons_default

Definition at line 98 of file world.qh.

Referenced by readplayerstartcvars().

◆ warmup_start_weapons_defaultmask

WepSet warmup_start_weapons_defaultmask

Definition at line 99 of file world.qh.

Referenced by MUTATOR_HOOKFUNCTION(), and readplayerstartcvars().

◆ winning

◆ WINNING_NEVER

const int WINNING_NEVER = 2

◆ WINNING_NO

◆ WINNING_STARTSUDDENDEATHOVERTIME

const int WINNING_STARTSUDDENDEATHOVERTIME = 3

◆ WINNING_YES

◆ world_initialized