string GetMapname();
string GetGametype();
-void GotoNextMap();
+void GotoNextMap(float reinit);
void ShuffleMaplist()
-float() DoNextMapOverride;
+float(float reinit) DoNextMapOverride;
void SetDefaultAlpha()
{
world.cnt = 0;
}
-/**
- * Takes care of pausing and unpausing the game.
- * Centerprints the information about an upcoming or active timeout to all active
- * players. Also plays reminder sounds.
- */
-void timeoutHandler_Think() {
- entity plr;
- if (timeoutStatus == 1) {
- if (remainingLeadTime > 0) {
- //centerprint the information to every player
- FOR_EACH_REALCLIENT(plr) {
- if(plr.classname == "player") {
- Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout begins in %d seconds!", 1, remainingLeadTime);
- }
- }
- remainingLeadTime -= 1;
- //think again in 1 second:
- self.nextthink = time + 1;
- }
- else {
- //now pause the game:
- timeoutStatus = 2;
- //reset all the flood variables
- FOR_EACH_CLIENT(plr) {
- plr.nickspamcount = plr.nickspamtime = plr.floodcontrol_chat = plr.floodcontrol_chatteam = plr.floodcontrol_chattell = plr.floodcontrol_voice = plr.floodcontrol_voiceteam = 0;
- }
- cvar_set("slowmo", ftos(TIMEOUT_SLOWMO_VALUE));
- //copy .v_angle to .lastV_angle for every player in order to fix their view during pause (see PlayerPreThink)
- FOR_EACH_REALPLAYER(plr) {
- plr.lastV_angle = plr.v_angle;
- }
- self.nextthink = time;
- }
- }
- else if (timeoutStatus == 2) {
- if (remainingTimeoutTime > 0) {
- FOR_EACH_REALCLIENT(plr) {
- if(plr.classname == "player") {
- Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout ends in %d seconds!", 1, remainingTimeoutTime);
- }
- }
- if(remainingTimeoutTime == autocvar_sv_timeout_resumetime) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
- Announce("prepareforbattle");
- }
- remainingTimeoutTime -= 1;
- self.nextthink = time + TIMEOUT_SLOWMO_VALUE;
- }
- else {
- //unpause the game again
- remainingTimeoutTime = timeoutStatus = 0;
- cvar_set("slowmo", ftos(orig_slowmo));
- //and unlock the fixed view again once there is no timeout active anymore
- FOR_EACH_REALPLAYER(plr) {
- plr.fixangle = FALSE;
- }
- //get rid of the countdown message
- FOR_EACH_REALCLIENT(plr) {
- if(plr.classname == "player") {
- Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
- }
- }
- remove(self);
- return;
- }
-
- }
- else if (timeoutStatus == 0) { //if a player called the resumegame command (which set timeoutStatus to 0 already)
- FOR_EACH_REALCLIENT(plr) {
- if(plr.classname == "player") {
- Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
- }
- }
- remove(self);
- return;
- }
-}
-
void GotoFirstMap()
{
float n;
MapInfo_Enumerate();
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
- if(!DoNextMapOverride())
- GotoNextMap();
+ if(!DoNextMapOverride(1))
+ GotoNextMap(1);
return;
}
BADPREFIX("g_ban_");
BADPREFIX("g_banned_list");
BADPREFIX("g_chat_flood_");
+ BADPREFIX("g_ghost_items");
BADPREFIX("g_playerstats_");
+ BADPREFIX("g_respawn_ghosts");
BADPREFIX("g_voice_flood_");
BADPREFIX("rcon_");
- BADPREFIX("settemp_");
- BADPREFIX("sv_allowdownloads_");
+ BADPREFIX("sv_allowdownloads");
BADPREFIX("sv_autodemo");
BADPREFIX("sv_curl_");
BADPREFIX("sv_eventlog");
BADCVAR("g_balance_kill_delay");
BADCVAR("g_ca_point_leadlimit");
BADCVAR("g_ctf_captimerecord_always");
- BADCVAR("g_ctf_capture_leadlimit");
BADCVAR("g_ctf_flag_capture_effects");
BADCVAR("g_ctf_flag_glowtrails");
BADCVAR("g_ctf_flag_pickup_effects");
BADCVAR("sv_allow_fullbright");
BADCVAR("sv_checkforpacketsduringsleep");
BADCVAR("sv_timeout");
+ BADPREFIX("sv_timeout_");
BADCVAR("welcome_message_time");
BADPREFIX("crypto_");
BADPREFIX("g_chat_");
BADCVAR("gameversion");
BADPREFIX("gameversion_");
BADCVAR("sv_namechangetimer");
+#ifndef NO_LEGACY_NETWORKING
+ BADCVAR("sv_use_csqc_players"); // transition
+#endif
// allowed changes to server admins (please sync this to server.cfg)
// vi commands:
// :%s,//\([^ ]*\).*,BADCVAR("\1");,
// :%!sort
// yes, this does contain some redundant stuff, don't really care
+ BADCVAR("bot_config_file");
BADCVAR("bot_number");
BADCVAR("bot_prefix");
BADCVAR("bot_suffix");
- BADCVAR("bot_config_file");
BADCVAR("capturelimit_override");
BADCVAR("fraglimit_override");
BADCVAR("gametype");
BADCVAR("g_balance_teams_force");
BADCVAR("g_ban_sync_trusted_servers");
BADCVAR("g_ban_sync_uri");
- BADCVAR("g_ctf_capture_limit");
BADCVAR("g_ctf_ignore_frags");
- BADCVAR("g_ctf_win_mode");
BADCVAR("g_domination_point_limit");
BADCVAR("g_friendlyfire");
BADCVAR("g_fullbrightitems");
BADCVAR("g_minstagib");
BADCVAR("g_mirrordamage");
BADCVAR("g_nexball_goallimit");
+ BADCVAR("g_powerups");
BADCVAR("g_runematch_point_limit");
BADCVAR("g_start_delay");
BADCVAR("g_warmup");
BADCVAR("skill");
BADCVAR("sv_adminnick");
BADCVAR("sv_autoscreenshot");
+ BADCVAR("sv_autotaunt");
BADCVAR("sv_curl_defaulturl");
BADCVAR("sv_defaultcharacter");
BADCVAR("sv_defaultplayercolors");
BADCVAR("sv_public");
BADCVAR("sv_ready_restart");
BADCVAR("sv_status_privacy");
+ BADCVAR("sv_taunt");
BADCVAR("sv_vote_call");
BADCVAR("sv_vote_commands");
BADCVAR("sv_vote_majority_factor");
BADCVAR("sys_ticrate");
BADCVAR("teamplay_mode");
BADCVAR("timelimit_override");
+ BADCVAR("g_spawnshieldtime");
BADPREFIX("g_warmup_");
+ BADPREFIX("sv_ready_restart_");
if(autocvar_g_minstagib)
{
self.classname = "worldspawn"; // safeguard against various stuff ;)
+ // needs to be done so early because of the constants they create
+ RegisterWeapons();
+ RegisterGametypes();
+
MapInfo_Enumerate();
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
}
float world_already_spawned;
void RegisterWeapons();
void Nagger_Init();
+void Item_ItemsTime_Init();
void ClientInit_Spawn();
void WeaponStats_Init();
void WeaponStats_Shutdown();
head = nextent(head);
}
- // needs to be done so early as they would still spawn
+ // needs to be done so early because of the constants they create
RegisterWeapons();
+ RegisterGametypes();
ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
// dom_init();
GameLogInit(); // prepare everything
+ // NOTE for matchid:
+ // changing the logic generating it is okay. But:
+ // it HAS to stay <= 64 chars
+ // character set: ASCII 33-126 without the following characters: : ; ' " \ $
if(autocvar_sv_eventlog)
{
s = sprintf("%d.%s.%06d", ftos(autocvar_sv_eventlog_files_counter), strftime(FALSE, "%s"), floor(random() * 1000000));
s = strcat(s, ":no_use_ammunition");
// initialiation stuff, not good in the mutator system
- if(!autocvar_g_pickup_items)
+ if(autocvar_g_pickup_items == 0)
s = strcat(s, ":no_pickup_items");
+ if(autocvar_g_pickup_items > 0)
+ s = strcat(s, ":pickup_items");
// initialiation stuff, not good in the mutator system
if(autocvar_g_weaponarena != "0")
if(autocvar_g_minstagib)
s = strcat(s, ":minstagib");
+ // TODO to mutator system
+ if(autocvar_g_powerups == 0)
+ s = strcat(s, ":no_powerups");
+ if(autocvar_g_powerups > 0)
+ s = strcat(s, ":powerups");
+
GameLogEcho(s);
GameLogEcho(":gameinfo:end");
}
addstat(STAT_HAGAR_LOAD, AS_INT, hagar_load);
+ addstat(STAT_ARMOR_LARGE_TIME, AS_FLOAT, item_armor_large_time);
+ addstat(STAT_HEALTH_MEGA_TIME, AS_FLOAT, item_health_mega_time);
+ addstat(STAT_INVISIBLE_TIME, AS_FLOAT, item_invisible_time);
+ addstat(STAT_SPEED_TIME, AS_FLOAT, item_speed_time);
+ addstat(STAT_EXTRALIFE_TIME, AS_FLOAT, item_extralife_time);
+ addstat(STAT_STRENGTH_TIME, AS_FLOAT, item_strength_time);
+ addstat(STAT_SHIELD_TIME, AS_FLOAT, item_shield_time);
+ addstat(STAT_FUELREGEN_TIME, AS_FLOAT, item_fuelregen_time);
+ addstat(STAT_JETPACK_TIME, AS_FLOAT, item_jetpack_time);
+ Item_ItemsTime_Init();
+
if(g_ca || g_freezetag)
{
addstat(STAT_REDALIVE, AS_INT, redalive_stat);
next_pingtime = time + 5;
detect_maptype();
-
+
+ // set up information replies for clients and server to use
lsmaps_reply = "^7Maps available: ";
lsnewmaps_reply = "^7Maps without a record set: ";
for(i = 0, j = 0; i < MapInfo_count; ++i)
col = "^2";
else
col = "^3";
+
++j;
+
lsmaps_reply = strcat(lsmaps_reply, col, MapInfo_Map_bspname, " ");
+
if(g_race && !stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, RACE_RECORD, "time"))))
lsnewmaps_reply = strcat(lsnewmaps_reply, col, MapInfo_Map_bspname, " ");
else if(g_cts && !stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, CTS_RECORD, "time"))))
lsnewmaps_reply = strcat(lsnewmaps_reply, col, MapInfo_Map_bspname, " ");
}
}
+
lsmaps_reply = strzone(strcat(lsmaps_reply, "\n"));
- if (!g_race && !g_cts)
- lsnewmaps_reply = "Need to be playing race or CTS for lsnewmaps to work.";
- lsnewmaps_reply = strzone(strcat(lsnewmaps_reply, "\n"));
+ lsnewmaps_reply = strzone(strcat(((!g_race && !g_cts) ? "Need to be playing race or CTS for lsnewmaps to work." : lsnewmaps_reply), "\n"));
maplist_reply = "^7Maps in list: ";
n = tokenize_console(autocvar_g_maplist);
{
records_reply[i] = strzone(getrecords(i));
}
- if(g_cts)
- ladder_reply = strzone(getladder());
+
+ ladder_reply = strzone(getladder());
rankings_reply = strzone(getrankings());
+ // begin other init
ClientInit_Spawn();
RandomSeed_Spawn();
PingPLReport_Spawn();
s = "";
n = tokenize_console(cvar_string("sv_curl_serverpackages"));
for(i = 0; i < n; ++i)
- if(substring(argv(i), -14, -1) != ".serverpackage")
+ if(substring(argv(i), -14, -1) != "-serverpackage.txt")
+ if(substring(argv(i), -14, -1) != ".serverpackage") // OLD legacy
s = strcat(s, " ", argv(i));
+ fd = search_begin("*-serverpackage.txt", TRUE, FALSE);
+ if(fd >= 0)
+ {
+ j = search_getsize(fd);
+ for(i = 0; i < j; ++i)
+ s = strcat(s, " ", search_getfilename(fd, i));
+ search_end(fd);
+ }
fd = search_begin("*.serverpackage", TRUE, FALSE);
if(fd >= 0)
{
string GetGametype()
{
- return GametypeNameFromType(game);
+ return MapInfo_Type_ToString(MapInfo_LoadedGametype);
}
string getmapname_stored;
Map_Goto_SetStr(argv(position));
}
-void GameResetCfg()
-{
- // settings persist, except...
- localcmd("\nsettemp_restore\n");
-}
-
-void Map_Goto()
+void Map_Goto(float reinit)
{
- GameResetCfg();
- MapInfo_LoadMap(getmapname_stored);
+ MapInfo_LoadMap(getmapname_stored, reinit);
}
// return codes of map selectors:
return "";
}
-float DoNextMapOverride()
+float DoNextMapOverride(float reinit)
{
if(autocvar_g_campaign)
{
if(MapInfo_CheckMap(autocvar_nextmap))
{
Map_Goto_SetStr(autocvar_nextmap);
- Map_Goto();
+ Map_Goto(reinit);
alreadychangedlevel = TRUE;
return TRUE;
}
if(autocvar_lastlevel)
{
- GameResetCfg();
- localcmd("set lastlevel 0\ntogglemenu\n");
+ cvar_settemp_restore();
+ localcmd("set lastlevel 0\ntogglemenu 1\n");
alreadychangedlevel = TRUE;
return TRUE;
}
return FALSE;
}
-void GotoNextMap()
+void GotoNextMap(float reinit)
{
//string nextmap;
//float n, nummaps;
error("Everything is broken - not even the default map list works. Please report this to the developers.");
}
}
- Map_Goto();
+ Map_Goto(reinit);
}
}
&& ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) )
{
self.autoscreenshot = -1;
- if(clienttype(self) == CLIENTTYPE_REAL)
- stuffcmd(self, "\nscreenshot\necho \"^5A screenshot has been taken at request of the server.\"\n");
+ if(clienttype(self) == CLIENTTYPE_REAL) { stuffcmd(self, sprintf("\nautoscreenshot \"%s\" \"%s\"\n", GetMapname(), strftime(FALSE, "%s"))); }
return;
}
float mapvote_maps_suggested[MAPVOTE_COUNT];
string mapvote_suggestions[MAPVOTE_COUNT];
float mapvote_suggestion_ptr;
-float mapvote_selectionrs;
+float mapvote_voters;
float mapvote_selections[MAPVOTE_COUNT];
float mapvote_run;
float mapvote_detail;
{
result = strcat(":vote:finished:", mapvote_maps[mappos]);
result = strcat(result, ":", ftos(mapvote_selections[mappos]), "::");
- didntvote = mapvote_selectionrs;
+ didntvote = mapvote_voters;
for(i = 0; i < mapvote_count; ++i)
if(mapvote_maps[i] != "")
{
FixClientCvars(other);
Map_Goto_SetStr(mapvote_maps[mappos]);
- Map_Goto();
+ Map_Goto(0);
alreadychangedlevel = TRUE;
return TRUE;
}
mapvote_selections[i] = 0;
}
- mapvote_selectionrs = 0;
+ mapvote_voters = 0;
FOR_EACH_REALCLIENT(other)
{
- ++mapvote_selectionrs;
+ ++mapvote_voters;
if(other.mapvote)
{
i = other.mapvote - 1;
float i;
float firstPlace, secondPlace;
float firstPlaceVotes, secondPlaceVotes;
- float mapvote_selectionrs_real;
+ float mapvote_voters_real;
string result;
if(mapvote_count_real == 1)
return MapVote_Finished(0);
- mapvote_selectionrs_real = mapvote_selectionrs;
+ mapvote_voters_real = mapvote_voters;
if(mapvote_abstain)
- mapvote_selectionrs_real -= mapvote_selections[mapvote_count - 1];
+ mapvote_voters_real -= mapvote_selections[mapvote_count - 1];
RandomSelection_Init();
for(i = 0; i < mapvote_count_real; ++i) if(mapvote_maps[i] != "")
if(firstPlace == -1)
error("No first place in map vote... WTF?");
- if(secondPlace == -1 || time > mapvote_timeout || (mapvote_selectionrs_real - firstPlaceVotes) < firstPlaceVotes)
+ if(secondPlace == -1 || time > mapvote_timeout || (mapvote_voters_real - firstPlaceVotes) < firstPlaceVotes)
return MapVote_Finished(firstPlace);
if(mapvote_keeptwotime)
- if(time > mapvote_keeptwotime || (mapvote_selectionrs_real - firstPlaceVotes - secondPlaceVotes) < secondPlaceVotes)
+ if(time > mapvote_keeptwotime || (mapvote_voters_real - firstPlaceVotes - secondPlaceVotes) < secondPlaceVotes)
{
float didntvote;
MapVote_TouchMask();
result = strcat(result, ":", ftos(firstPlaceVotes));
result = strcat(result, ":", mapvote_maps[secondPlace]);
result = strcat(result, ":", ftos(secondPlaceVotes), "::");
- didntvote = mapvote_selectionrs;
+ didntvote = mapvote_voters;
for(i = 0; i < mapvote_count; ++i)
if(mapvote_maps[i] != "")
{
}
mapvote_initialized = TRUE;
- if(DoNextMapOverride())
+ if(DoNextMapOverride(0))
return;
if(!autocvar_g_maplist_votable || player_count <= 0)
{
- GotoNextMap();
+ GotoNextMap(0);
return;
}
MapVote_Init();
cvar_set("timelimit", "-1");
if(mapvote_initialized || alreadychangedlevel)
{
- if(DoNextMapOverride())
+ if(DoNextMapOverride(0))
return "Map switch initiated.";
else
return "Hm... no. For some reason I like THIS map more.";
TargetMusic_RestoreGame();
}
-void SV_Shutdown()
+void Shutdown()
{
entity e;
- if(gameover > 1) // shutting down already?
- return;
-
- gameover = 2; // 2 = server shutting down
+ gameover = 2;
if(world_initialized > 0)
{