#include "g_hook.qh"
#include "ipban.qh"
#include "mapvoting.qh"
-#include "mutators/_mod.qh"
+#include <server/mutators/_mod.qh>
#include "race.qh"
#include "scores.qh"
+#include "scores_rules.qh"
#include "teamplay.qh"
#include "weapons/weaponstats.qh"
#include "../common/constants.qh"
#include <common/net_linked.qh>
#include "../common/deathtypes/all.qh"
+#include "../common/gamemodes/sv_rules.qh"
#include "../common/mapinfo.qh"
#include "../common/monsters/_mod.qh"
#include "../common/monsters/sv_monsters.qh"
#include "../common/playerstats.qh"
#include "../common/stats.qh"
#include "../common/teams.qh"
-#include "../common/triggers/trigger/secret.qh"
-#include "../common/triggers/target/music.qh"
+#include "../common/mapobjects/trigger/secret.qh"
+#include "../common/mapobjects/target/music.qh"
#include "../common/util.qh"
#include "../common/items/_mod.qh"
#include <common/weapons/_all.qh>
this.nextthink = time + delta;
e = edict_num(this.cnt + 1);
- if(IS_REAL_CLIENT(e))
+ if(IS_CLIENT(e) && IS_REAL_CLIENT(e))
{
WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
WriteByte(MSG_BROADCAST, this.cnt);
string redirection_target;
float world_initialized;
-string GetGametype();
-void ShuffleMaplist();
-
void SetDefaultAlpha()
{
if (!MUTATOR_CALLHOOK(SetDefaultAlpha))
else
{
this.nextthink = time + 1;
- LOG_INFO("Waiting for _sv_init being set to 1 by initialization scripts...\n");
+ LOG_INFO("Waiting for _sv_init being set to 1 by initialization scripts...");
}
}
string k, v, d;
float n, i, adding, pureadding;
- if(cvar_changes)
- strunzone(cvar_changes);
- cvar_changes = string_null;
- if(cvar_purechanges)
- strunzone(cvar_purechanges);
- cvar_purechanges = string_null;
+ strfree(cvar_changes);
+ strfree(cvar_purechanges);
cvar_purechanges_count = 0;
h = buf_create();
// these can contain player IDs, so better hide
BADPREFIX("g_forced_team_");
BADCVAR("sv_muteban_list");
+ BADCVAR("sv_voteban_list");
BADCVAR("sv_allow_customplayermodels_idlist");
BADCVAR("sv_allow_customplayermodels_speciallist");
BADCVAR("g_dm");
BADCVAR("g_domination");
BADCVAR("g_domination_default_teams");
+ BADCVAR("g_duel");
+ BADCVAR("g_duel_not_dm_maps");
BADCVAR("g_freezetag");
BADCVAR("g_freezetag_teams");
BADCVAR("g_invasion_teams");
+ BADCVAR("g_invasion_type");
BADCVAR("g_jailbreak");
BADCVAR("g_jailbreak_teams");
BADCVAR("g_keepaway");
BADCVAR("g_race_qualifying_timelimit");
BADCVAR("g_race_qualifying_timelimit_override");
BADCVAR("g_runematch");
+ BADCVAR("g_shootfromeye");
BADCVAR("g_snafu");
BADCVAR("g_tdm");
+ BADCVAR("g_tdm_on_dm_maps");
BADCVAR("g_tdm_teams");
BADCVAR("g_vip");
BADCVAR("leadlimit");
BADCVAR("teamplay");
BADCVAR("timelimit");
BADCVAR("g_mapinfo_ignore_warnings");
+ BADCVAR("g_maplist_ignore_sizes");
+ BADCVAR("g_maplist_sizes_count_bots");
// long
BADCVAR("hostname");
BADCVAR("captureleadlimit_override");
BADCVAR("condump_stripcolors");
BADCVAR("gameversion");
+ BADCVAR("fs_gamedir");
BADCVAR("g_allow_oldvortexbeam");
BADCVAR("g_balance_kill_delay");
BADCVAR("g_buffs_pickup_anyway");
BADCVAR("g_buffs_randomize");
+ BADCVAR("g_buffs_randomize_teamplay");
BADCVAR("g_campcheck_distance");
BADCVAR("g_ca_point_leadlimit");
BADCVAR("g_ca_point_limit");
BADCVAR("g_ctf_captimerecord_always");
BADCVAR("g_ctf_flag_glowtrails");
+ BADCVAR("g_ctf_dynamiclights");
BADCVAR("g_ctf_flag_pickup_verbosename");
BADCVAR("g_domination_point_leadlimit");
BADCVAR("g_forced_respawn");
BADCVAR("g_jump_grunt");
BADCVAR("g_keyhunt_point_leadlimit");
BADCVAR("g_nexball_goalleadlimit");
+ BADCVAR("g_new_toys_autoreplace");
BADCVAR("g_new_toys_use_pickupsound");
BADCVAR("g_physics_predictall");
BADCVAR("g_piggyback");
BADCVAR("g_playerclip_collisions");
+ BADCVAR("g_spawn_alloweffects");
BADCVAR("g_tdm_point_leadlimit");
BADCVAR("g_tdm_point_limit");
BADCVAR("leadlimit_and_fraglimit");
BADCVAR("sv_damagetext");
BADCVAR("sv_db_saveasdump");
BADCVAR("sv_intermission_cdtrack");
+ BADCVAR("sv_mapchange_delay");
BADCVAR("sv_minigames");
BADCVAR("sv_namechangetimer");
BADCVAR("sv_precacheplayermodels");
BADCVAR("sv_stepheight");
BADCVAR("sv_timeout");
BADCVAR("sv_weapons_modeloverride");
+ BADCVAR("w_prop_interval");
BADPREFIX("crypto_");
BADPREFIX("gameversion_");
BADPREFIX("g_chat_");
BADPREFIX("g_ctf_captimerecord_");
+ BADPREFIX("g_hats_");
BADPREFIX("g_maplist_");
BADPREFIX("g_mod_");
BADPREFIX("g_respawn_");
BADCVAR("g_ban_sync_uri");
BADCVAR("g_buffs");
BADCVAR("g_ca_teams_override");
+ BADCVAR("g_ctf_fullbrightflags");
BADCVAR("g_ctf_ignore_frags");
BADCVAR("g_ctf_leaderboard");
BADCVAR("g_domination_point_limit");
BADCVAR("g_physics_clientselect");
BADCVAR("g_pinata");
BADCVAR("g_powerups");
+ BADCVAR("g_player_brightness");
+ BADCVAR("g_rocket_flying");
+ BADCVAR("g_rocket_flying_disabledelays");
BADCVAR("g_spawnshieldtime");
BADCVAR("g_start_delay");
BADCVAR("g_superspectate");
BADCVAR("log_file");
BADCVAR("maxplayers");
BADCVAR("minplayers");
+ BADCVAR("minplayers_per_team");
BADCVAR("net_address");
BADCVAR("port");
BADCVAR("rcon_password");
BADCVAR("g_grappling_hook");
BADCVAR("g_jetpack");
+ // temporary for testing
+ // TODO remove before 0.8.3 release
+ BADCVAR("g_ca_weaponarena");
+ BADCVAR("g_freezetag_weaponarena");
+ BADCVAR("g_lms_weaponarena");
+ BADCVAR("g_ctf_stalemate_time");
+
+ if(cvar_string("g_mod_balance") == "Testing")
+ {
+ // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed
+ BADPREFIX("g_balance_");
+ }
+
#undef BADPRESUFFIX
#undef BADPREFIX
#undef BADCVAR
cvar_purechanges = strzone(cvar_purechanges);
}
-void detect_maptype()
-{
-#if 0
- vector o, v;
- float i;
-
- for (;;)
- {
- o = world.mins;
- o.x += random() * (world.maxs.x - world.mins.x);
- o.y += random() * (world.maxs.y - world.mins.y);
- o.z += random() * (world.maxs.z - world.mins.z);
-
- tracebox(o, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), o - '0 0 32768', MOVE_WORLDONLY, NULL);
- if(trace_fraction == 1)
- continue;
-
- v = trace_endpos;
-
- for(i = 0; i < 64; i += 4)
- {
- tracebox(o, '-1 -1 -1' * i, '1 1 1' * i, o - '0 0 32768', MOVE_WORLDONLY, NULL);
- if(trace_fraction == 1)
- continue;
- LOG_INFO(ftos(i), " -> ", vtos(trace_endpos), "\n");
- }
-
- break;
- }
-#endif
-}
-
entity randomseed;
bool RandomSeed_Send(entity this, entity to, int sf)
{
e = new(info_player_deathmatch); // safeguard against player joining
- this.classname = "worldspawn"; // safeguard against various stuff ;)
+ // assign reflectively to avoid "assignment to world" warning
+ for (int i = 0, n = numentityfields(); i < n; ++i) {
+ string k = entityfieldname(i);
+ if (k == "classname") {
+ // safeguard against various stuff ;)
+ putentityfieldstring(i, this, "worldspawn");
+ break;
+ }
+ }
// needs to be done so early because of the constants they create
static_init();
MapInfo_Shutdown();
}
-void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override)
+STATIC_INIT_EARLY(maxclients)
{
- if(!autocvar_g_campaign)
+ maxclients = 0;
+ for (entity head = nextent(NULL); head; head = nextent(head)) {
+ ++maxclients;
+ }
+}
+
+void default_delayedinit(entity this)
+{
+ if(!scores_initialized)
+ ScoreRules_generic();
+}
+
+void InitGameplayMode()
+{
+ VoteReset();
+
+ // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
+ get_mi_min_max(1);
+ // assign reflectively to avoid "assignment to world" warning
+ int done = 0; for (int i = 0, n = numentityfields(); i < n; ++i) {
+ string k = entityfieldname(i); vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0';
+ if (v) {
+ putentityfieldstring(i, world, sprintf("%v", v));
+ if (++done == 2) break;
+ }
+ }
+ // currently, NetRadiant's limit is 131072 qu for each side
+ // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu
+ // set the distance according to map size but don't go over the limit to avoid issues with float precision
+ // in case somebody makes extremely large maps
+ max_shot_distance = min(230000, vlen(world.maxs - world.mins));
+
+ MapInfo_LoadMapSettings(mapname);
+ GameRules_teams(false);
+
+ if (!cvar_value_issafe(world.fog))
+ {
+ LOG_INFO("The current map contains a potentially harmful fog setting, ignored");
+ world.fog = string_null;
+ }
+ if(MapInfo_Map_fog != "")
{
- if(fraglimit_override >= 0) cvar_set("fraglimit", ftos(fraglimit_override));
- if(timelimit_override >= 0) cvar_set("timelimit", ftos(timelimit_override));
- if(leadlimit_override >= 0) cvar_set("leadlimit", ftos(leadlimit_override));
- if(qualifying_override >= 0) cvar_set("g_race_qualifying_timelimit", ftos(qualifying_override));
+ if(MapInfo_Map_fog == "none")
+ world.fog = string_null;
+ else
+ world.fog = strzone(MapInfo_Map_fog);
}
- limits_are_set = true;
+ clientstuff = strzone(MapInfo_Map_clientstuff);
+
+ MapInfo_ClearTemps();
+
+ gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype);
+
+ cache_mutatormsg = strzone("");
+ cache_lastmutatormsg = strzone("");
+
+ InitializeEntity(NULL, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK);
}
void Map_MarkAsRecent(string m);
float world_already_spawned;
-void Nagger_Init();
-void ClientInit_Spawn();
-void WeaponStats_Init();
-void WeaponStats_Shutdown();
spawnfunc(worldspawn)
{
server_is_dedicated = boolean(stof(cvar_defstring("is_dedicated")));
- bool wantrestart = false;
+ bool wantrestart = false;
{
if (!server_is_dedicated)
{
fclose(sentinel);
if (switchversion != "" && switchversion != WATERMARK)
{
- LOG_INFOF("Switching progs: " WATERMARK " -> %s\n", switchversion);
+ LOG_INFOF("Switching progs: " WATERMARK " -> %s", switchversion);
// if it doesn't exist, assume either:
// a) the current program was overwritten
// b) this is a client only update
}
if (wantrestart)
{
- LOG_INFOF("Restart requested\n");
+ LOG_INFO("Restart requested");
changelevel(mapname);
// let initialization continue, shutdown depends on it
}
cvar_changes_init(); // do this very early now so it REALLY matches the server config
- maxclients = 0;
- for (entity head = nextent(NULL); head; head = nextent(head))
- {
- ++maxclients;
- }
-
// needs to be done so early because of the constants they create
static_init();
readlevelcvars();
GrappleHookInit();
- if(!limits_are_set)
- SetLimits(autocvar_fraglimit_override, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
+ GameRules_limit_fallbacks();
if(warmup_limit == 0)
warmup_limit = (autocvar_timelimit > 0) ? autocvar_timelimit * 60 : autocvar_timelimit;
if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
bot_waypoints_for_items = 0;
- precache();
-
WaypointSprite_Init();
GameLogInit(); // prepare everything
MapInfo_Enumerate();
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
+ if(fexists(strcat("scripts/", mapname, ".arena")))
+ cvar_settemp("sv_q3acompat_machineshotgunswap", "1");
+
+ if(fexists(strcat("scripts/", mapname, ".defi")))
+ cvar_settemp("sv_q3defragcompat", "1");
+
if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
{
int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
continue;
if(argv(0) == "cd")
{
- LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:\n");
- LOG_INFO(" cdtrack ", argv(2), "\n");
+ string trackname = argv(2);
+ LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" cdtrack ", trackname);
+ if (cvar_value_issafe(trackname))
+ {
+ string newstuff = strcat(clientstuff, "cd loop \"", trackname, "\"\n");
+ strcpy(clientstuff, newstuff);
+ }
}
else if(argv(0) == "fog")
{
- LOG_INFO("Found ^1UNSUPPORTED^7 fog command in .cfg file; put this line in worldspawn in the .map/.bsp/.ent file instead:\n");
- LOG_INFO(" \"fog\" \"", s, "\"\n");
+ LOG_INFO("Found ^1UNSUPPORTED^7 fog command in .cfg file; put this line in worldspawn in the .map/.bsp/.ent file instead:");
+ LOG_INFO(" \"fog\" \"", s, "\"");
}
else if(argv(0) == "set")
{
- LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:\n");
- LOG_INFO(" clientsettemp_for_type all ", argv(1), " ", argv(2), "\n");
+ LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" clientsettemp_for_type all ", argv(1), " ", argv(2));
}
else if(argv(0) != "//")
{
- LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:\n");
- LOG_INFO(" clientsettemp_for_type all ", argv(0), " ", argv(1), "\n");
+ LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" clientsettemp_for_type all ", argv(0), " ", argv(1));
}
}
fclose(fd);
next_pingtime = time + 5;
- detect_maptype();
-
// set up information replies for clients and server to use
maplist_reply = strzone(getmaplist());
lsmaps_reply = strzone(getlsmaps());
s = cons(s, pkg);
}
// add automatically managed files to the list
- #define X(match) MACRO_BEGIN { \
+ #define X(match) MACRO_BEGIN \
int fd = search_begin(match, true, false); \
if (fd >= 0) \
{ \
} \
search_end(fd); \
} \
- } MACRO_END
+ MACRO_END
X("*-serverpackage.txt");
X("*.serverpackage");
#undef X
// physics/balance/config changes that count as mod
if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
modname = cvar_string("g_mod_physics");
- if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance"))
+ if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
modname = cvar_string("g_mod_balance");
if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
modname = cvar_string("g_mod_config");
WinningConditionHelper(this); // set worldstatus
world_initialized = 1;
+ __spawnfunc_spawn_all();
}
spawnfunc(light)
string Map_Current_Name;
// NOTE: this now expects the map list to be already tokenized and the count in Map_Count
-float GetMaplistPosition()
+int GetMaplistPosition()
{
- float pos, idx;
- string map;
-
- map = GetMapname();
- idx = autocvar_g_maplist_index;
+ string map = GetMapname();
+ int idx = autocvar_g_maplist_index;
if(idx >= 0)
+ {
if(idx < Map_Count)
+ {
if(map == argv(idx))
+ {
return idx;
+ }
+ }
+ }
- for(pos = 0; pos < Map_Count; ++pos)
+ for(int pos = 0; pos < Map_Count; ++pos)
+ {
if(map == argv(pos))
return pos;
+ }
// resume normal maplist rotation if current map is not in g_maplist
return idx;
}
-float MapHasRightSize(string map)
+bool MapHasRightSize(string map)
{
- float fh;
- if(currentbots || autocvar_bot_number || player_count < autocvar_minplayers)
- if(autocvar_g_maplist_check_waypoints)
+ int minplayers = max(0, floor(autocvar_minplayers));
+ if (teamplay)
+ minplayers = max(0, floor(autocvar_minplayers_per_team) * AvailableTeams());
+ if (autocvar_g_maplist_check_waypoints
+ && (currentbots || autocvar_bot_number || player_count < minplayers))
{
- LOG_TRACE("checkwp "); LOG_TRACE(map);
+ string checkwp_msg = strcat("checkwp ", map);
if(!fexists(strcat("maps/", map, ".waypoints")))
{
- LOG_TRACE(": no waypoints");
+ LOG_TRACE(checkwp_msg, ": no waypoints");
return false;
}
- LOG_TRACE(": has waypoints");
+ LOG_TRACE(checkwp_msg, ": has waypoints");
}
+ if(autocvar_g_maplist_ignore_sizes)
+ return true;
+
// open map size restriction file
- LOG_TRACE("opensize "); LOG_TRACE(map);
- fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+ string opensize_msg = strcat("opensize ", map);
+ float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+ int pcount = player_count;
+ if(!autocvar_g_maplist_sizes_count_bots)
+ pcount -= currentbots;
if(fh >= 0)
{
- float mapmin, mapmax;
- LOG_TRACE(": ok, ");
- mapmin = stof(fgets(fh));
- mapmax = stof(fgets(fh));
+ opensize_msg = strcat(opensize_msg, ": ok, ");
+ int mapmin = stoi(fgets(fh));
+ int mapmax = stoi(fgets(fh));
fclose(fh);
- if(player_count < mapmin)
+ if(pcount < mapmin)
{
- LOG_TRACE("not enough");
+ LOG_TRACE(opensize_msg, "not enough");
return false;
}
- if(player_count > mapmax)
+ if(mapmax && pcount > mapmax)
{
- LOG_TRACE("too many");
+ LOG_TRACE(opensize_msg, "too many");
return false;
}
- LOG_TRACE("right size");
+ LOG_TRACE(opensize_msg, "right size");
return true;
}
- LOG_TRACE(": not found");
+ LOG_TRACE(opensize_msg, ": not found");
return true;
}
// return codes of map selectors:
// -1 = temporary failure (that is, try some method that is guaranteed to succeed)
// -2 = permanent failure
-float() MaplistMethod_Iterate = // usual method
+float MaplistMethod_Iterate() // usual method
{
float pass, i;
return -1;
}
-float() MaplistMethod_Repeat = // fallback method
+float MaplistMethod_Repeat() // fallback method
{
LOG_TRACE("Trying MaplistMethod_Repeat");
return -2;
}
-float() MaplistMethod_Random = // random map selection
+float MaplistMethod_Random() // random map selection
{
float i, imax;
return -1;
}
-float(float exponent) MaplistMethod_Shuffle = // more clever shuffling
+float MaplistMethod_Shuffle(float exponent) // more clever shuffling
// the exponent sets a bias on the map selection:
// the higher the exponent, the less likely "shortly repeated" same maps are
{
void Maplist_Init()
{
- Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
- float i;
- for (i = 0; i < Map_Count; ++i)
- if (Map_Check(i, 2))
- break;
+ float i = Map_Count = 0;
+ if(autocvar_g_maplist != "")
+ {
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
+ for (i = 0; i < Map_Count; ++i)
+ {
+ if (Map_Check(i, 2))
+ break;
+ }
+ }
+
if (i == Map_Count)
{
bprint( "Maplist contains no usable maps! Resetting it to default map list.\n" );
cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags() | MAPINFO_FLAG_NOAUTOMAPLIST));
if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
- localcmd("\nmenu_cmd sync\n");
+ if(!server_is_dedicated)
+ localcmd("\nmenu_cmd sync\n");
Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
}
if(Map_Count == 0)
error("empty maplist, cannot select a new map");
Map_Current = bound(0, GetMaplistPosition(), Map_Count - 1);
- if(Map_Current_Name)
- strunzone(Map_Current_Name);
- Map_Current_Name = strzone(argv(Map_Current)); // will be automatically freed on exit thanks to DP
+ strcpy(Map_Current_Name, argv(Map_Current)); // will be automatically freed on exit thanks to DP
// this may or may not be correct, but who cares, in the worst case a map
// isn't chosen in the first pass that should have been
}
string GetNextMap()
{
- float nextMap;
-
Maplist_Init();
- nextMap = -1;
+ float nextMap = -1;
if(nextMap == -1)
if(autocvar_g_maplist_shuffle > 0)
return;
alreadychangedlevel = true;
- string nextMap;
-
- nextMap = GetNextMap();
+ string nextMap = GetNextMap();
if(nextMap == "")
error("Everything is broken - cannot find a next map. Please report this to the developers.");
Map_Goto(reinit);
{
FixIntermissionClient(this);
- float server_screenshot = (autocvar_sv_autoscreenshot && this.cvar_cl_autoscreenshot);
- float client_screenshot = (this.cvar_cl_autoscreenshot == 2);
+ float server_screenshot = (autocvar_sv_autoscreenshot && CS(this).cvar_cl_autoscreenshot);
+ float client_screenshot = (CS(this).cvar_cl_autoscreenshot == 2);
if( (server_screenshot || client_screenshot)
&& ((this.autoscreenshot > 0) && (time > this.autoscreenshot)) )
MapVote_Start();
}
-/*
-============
-FindIntermission
-
-Returns the entity to view from
-============
-*/
-/*
-entity FindIntermission()
-{
- local entity spot;
- local float cyc;
-
-// look for info_intermission first
- spot = find(NULL, classname, "info_intermission");
- if (spot)
- { // pick a random one
- cyc = random() * 4;
- while (cyc > 1)
- {
- spot = find(spot, classname, "info_intermission");
- if (!spot)
- spot = find(spot, classname, "info_intermission");
- cyc = cyc - 1;
- }
- return spot;
- }
-
-// then look for the start position
- spot = find(NULL, classname, "info_player_start");
- if (spot)
- return spot;
-
-// testinfo_player_start is only found in regioned levels
- spot = find(NULL, classname, "testplayerstart");
- if (spot)
- return spot;
-
-// then look for the start position
- spot = find(NULL, classname, "info_player_deathmatch");
- if (spot)
- return spot;
-
- //objerror ("FindIntermission: no spot");
- return NULL;
-}
-*/
-
/*
===============================================================================
s = strcat(s, GetGametype(), "_", GetMapname(), ":", ftos(rint(time)));
if(to_console)
- LOG_INFO(s, "\n");
+ LOG_INFO(s);
if(to_eventlog)
GameLogEcho(s);
s = strcat(":labels:player:", GetPlayerScoreString(NULL, 0));
if(to_console)
- LOG_INFO(s, "\n");
+ LOG_INFO(s);
if(to_eventlog)
GameLogEcho(s);
if(to_file)
s = strcat(s, "spectator:");
if(to_console)
- LOG_INFO(s, playername(it, false), "\n");
+ LOG_INFO(s, playername(it, false));
if(to_eventlog)
GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it, false)));
if(to_file)
{
s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
if(to_console)
- LOG_INFO(s, "\n");
+ LOG_INFO(s);
if(to_eventlog)
GameLogEcho(s);
if(to_file)
s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
s = strcat(s, ":", ftos(i));
if(to_console)
- LOG_INFO(s, "\n");
+ LOG_INFO(s);
if(to_eventlog)
GameLogEcho(s);
if(to_file)
}
if(to_console)
- LOG_INFO(":end\n");
+ LOG_INFO(":end");
if(to_eventlog)
GameLogEcho(":end");
if(to_file)
if(!e.autoscreenshot) // initial call
{
e.autoscreenshot = time + 0.8; // used for autoscreenshot
- e.health = -2342;
+ SetResourceExplicit(e, RES_HEALTH, -2342);
// first intermission phase; voting phase has positive health (used to decide whether to send SVC_FINALE or not)
for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
{
// - for this timelimit_overtime needs to be >0 of course
// - also check the winning condition calculated in the previous frame and only add normal overtime
// again, if at the point at which timelimit would be extended again, still no winner was found
- if (!autocvar_g_campaign && (checkrules_overtimesadded >= 0) && (checkrules_overtimesadded < autocvar_timelimit_overtimes || autocvar_timelimit_overtimes < 0) && autocvar_timelimit_overtime && !(g_race && !g_race_qualifying))
+ if (!autocvar_g_campaign && checkrules_overtimesadded >= 0
+ && (checkrules_overtimesadded < autocvar_timelimit_overtimes || autocvar_timelimit_overtimes < 0)
+ && autocvar_timelimit_overtime && !(g_race && !g_race_qualifying))
{
return 1; // need to call InitiateOvertime later
}
{
++checkrules_overtimesadded;
//add one more overtime by simply extending the timelimit
- float tl;
- tl = autocvar_timelimit;
- tl += autocvar_timelimit_overtime;
- cvar_set("timelimit", ftos(tl));
-
+ cvar_set("timelimit", ftos(autocvar_timelimit + autocvar_timelimit_overtime));
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_TIME, autocvar_timelimit_overtime * 60);
}
float GetWinningCode(float fraglimitreached, float equality)
{
if(autocvar_g_campaign == 1)
+ {
if(fraglimitreached)
return WINNING_YES;
else
return WINNING_NO;
-
+ }
else
+ {
if(equality)
+ {
if(fraglimitreached)
return WINNING_STARTSUDDENDEATHOVERTIME;
else
return WINNING_NEVER;
+ }
else
+ {
if(fraglimitreached)
return WINNING_YES;
else
return WINNING_NO;
+ }
+ }
}
// set the .winning flag for exactly those players with a given field value
if(teamplay)
{
- team1_score = TeamScore_GetCompareValue(NUM_TEAM_1);
- team2_score = TeamScore_GetCompareValue(NUM_TEAM_2);
- team3_score = TeamScore_GetCompareValue(NUM_TEAM_3);
- team4_score = TeamScore_GetCompareValue(NUM_TEAM_4);
+ for (int i = 1; i < 5; ++i)
+ {
+ Team_SetTeamScore(Team_GetTeamFromIndex(i),
+ TeamScore_GetCompareValue(Team_IndexToTeam(i)));
+ }
}
ClearWinners();
leaderfrags = WinningConditionHelper_topscore;
if (limit)
- if (leaderfrags == limit - 1)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
- else if (leaderfrags == limit - 2)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
- else if (leaderfrags == limit - 3)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+ {
+ if (leaderfrags == limit - 1)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
+ else if (leaderfrags == limit - 2)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
+ else if (leaderfrags == limit - 3)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+ }
}
}
limitreached = false;
- if(limit)
- if(WinningConditionHelper_topscore >= limit)
- limitreached = true;
+ if (limit && WinningConditionHelper_topscore >= limit)
+ limitreached = true;
if(leadlimit)
{
float leadlimitreached;
if(!some_spawn_has_been_used)
return WINNING_NO;
- team1_score = team2_score = team3_score = team4_score = 0;
+ for (int i = 1; i < 5; ++i)
+ {
+ Team_SetTeamScore(Team_GetTeamFromIndex(i), 0);
+ }
- FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), {
- switch(it.team)
+ FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
+ {
+ if (Team_IsValidTeam(it.team))
{
- case NUM_TEAM_1: team1_score = 1; break;
- case NUM_TEAM_2: team2_score = 1; break;
- case NUM_TEAM_3: team3_score = 1; break;
- case NUM_TEAM_4: team4_score = 1; break;
+ Team_SetTeamScore(Team_GetTeam(it.team), 1);
}
});
IL_EACH(g_spawnpoints, true,
{
- switch(it.team)
+ if (Team_IsValidTeam(it.team))
{
- case NUM_TEAM_1: team1_score = 1; break;
- case NUM_TEAM_2: team2_score = 1; break;
- case NUM_TEAM_3: team3_score = 1; break;
- case NUM_TEAM_4: team4_score = 1; break;
+ Team_SetTeamScore(Team_GetTeam(it.team), 1);
}
});
ClearWinners();
+ float team1_score = Team_GetTeamScore(Team_GetTeamFromIndex(1));
+ float team2_score = Team_GetTeamScore(Team_GetTeamFromIndex(2));
+ float team3_score = Team_GetTeamScore(Team_GetTeamFromIndex(3));
+ float team4_score = Team_GetTeamScore(Team_GetTeamFromIndex(4));
if(team1_score + team2_score + team3_score + team4_score == 0)
{
checkrules_equality = true;
{
float t, i;
if(team1_score)
- t = NUM_TEAM_1;
+ t = 1;
else if(team2_score)
- t = NUM_TEAM_2;
+ t = 2;
else if(team3_score)
- t = NUM_TEAM_3;
+ t = 3;
else // if(team4_score)
- t = NUM_TEAM_4;
- CheckAllowedTeams(NULL);
+ t = 4;
+ entity balance = TeamBalance_CheckAllowedTeams(NULL);
for(i = 0; i < MAX_TEAMSCORE; ++i)
{
- if(t != NUM_TEAM_1) if(c1 >= 0) TeamScore_AddToTeam(NUM_TEAM_1, i, -1000);
- if(t != NUM_TEAM_2) if(c2 >= 0) TeamScore_AddToTeam(NUM_TEAM_2, i, -1000);
- if(t != NUM_TEAM_3) if(c3 >= 0) TeamScore_AddToTeam(NUM_TEAM_3, i, -1000);
- if(t != NUM_TEAM_4) if(c4 >= 0) TeamScore_AddToTeam(NUM_TEAM_4, i, -1000);
+ for (int j = 1; j <= NUM_TEAMS; ++j)
+ {
+ if (t == j)
+ {
+ continue;
+ }
+ if (!TeamBalance_IsTeamAllowed(balance, j))
+ {
+ continue;
+ }
+ TeamScore_AddToTeam(Team_IndexToTeam(j), i, -1000);
+ }
}
AddWinners(team, t);
totalplayers = playerswithlaps = readyplayers = 0;
FOREACH_CLIENT(IS_PLAYER(it), {
++totalplayers;
- if(PlayerScore_Add(it, SP_RACE_FASTEST, 0))
+ if(GameRules_scoring_add(it, RACE_FASTEST, 0))
++playerswithlaps;
if(it.ready)
++readyplayers;
return "Map switch will happen after scoreboard.";
}
-bool autocvar_sv_gameplayfix_multiplethinksperframe;
+bool autocvar_sv_gameplayfix_multiplethinksperframe = true;
void RunThink(entity this)
{
// don't let things stay in the past.
}
bool autocvar_sv_freezenonclients;
-bool autocvar_sv_gameplayfix_delayprojectiles;
+bool autocvar_sv_gameplayfix_delayprojectiles = false;
void Physics_Frame()
{
if(autocvar_sv_freezenonclients)
return;
- FOREACH_ENTITY_FLOAT(pure_data, false,
+ IL_EACH(g_moveables, true,
{
if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS)
continue;
if(autocvar_sv_gameplayfix_delayprojectiles >= 0)
return;
- FOREACH_ENTITY_FLOAT(move_qcphysics, true,
+ IL_EACH(g_moveables, it.move_qcphysics,
{
if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
continue;
FOREACH_CLIENT(IS_REAL_CLIENT(it), {
entity e = IS_SPEC(it) ? it.enemy : it;
if (e.typehitsound) {
- it.typehit_time = time;
+ STAT(TYPEHIT_TIME, it) = time;
} else if (e.killsound) {
- it.kill_time = time;
+ STAT(KILL_TIME, it) = time;
} else if (e.damage_dealt) {
- it.hit_time = time;
- it.damage_dealt_total += ceil(e.damage_dealt);
+ STAT(HIT_TIME, it) = time;
+ STAT(DAMAGE_DEALT_TOTAL, it) += ceil(e.damage_dealt);
}
});
// add 1 frametime because after this, engine SV_Physics
{
antilag_record(it, it, altime);
});
+ IL_EACH(g_projectiles, it.classname == "nade",
+ {
+ antilag_record(it, it, altime);
+ });
systems_update();
IL_ENDFRAME();
}
clients_found = 0;
FOREACH_CLIENT(IS_REAL_CLIENT(it), {
// TODO add timer
- LOG_INFO("Redirecting: sending connect command to ", it.netname, "\n");
+ LOG_INFO("Redirecting: sending connect command to ", it.netname);
if(redirection_target == "self")
stuffcmd(it, "\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " reconnect\n");
else
++clients_found;
});
- LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.\n");
+ LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.");
if(time > redirection_timeout || clients_found == 0)
localcmd("\nwait; wait; wait; quit\n");
return true;
}
-void TargetMusic_RestoreGame();
void RestoreGame()
{
// Loaded from a save game
else
db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid));
}
- if(autocvar_developer)
+ if(autocvar_developer > 0)
{
if(autocvar_sv_db_saveasdump)
db_dump(TemporaryDB, "server-temp.db");
}
else if(world_initialized == 0)
{
- LOG_INFO("NOTE: crashed before even initializing the world, not saving persistent data\n");
+ LOG_INFO("NOTE: crashed before even initializing the world, not saving persistent data");
}
else
{