X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=bacdce4170d68244ef8871e6bd88dc8a7313e1f1;hb=5f9b25fac221d0fdbd2053786747c260a33857c6;hp=120fa671625b2f4b6836fd624c379918e31d4afd;hpb=4ffdbacc1087b6ac964a72b252a6f92c850afd55;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 120fa6716..bacdce417 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -58,7 +58,7 @@ float world_initialized; string GetMapname(); string GetGametype(); void GotoNextMap(float reinit); -void ShuffleMaplist() +void ShuffleMaplist(); float(float reinit) DoNextMapOverride; void SetDefaultAlpha() @@ -264,6 +264,7 @@ void cvar_changes_init() BADCVAR("g_freezetag"); BADCVAR("g_keepaway"); BADCVAR("g_keyhunt"); + BADCVAR("g_td"); BADCVAR("g_keyhunt_teams"); BADCVAR("g_keyhunt_teams"); BADCVAR("g_lms"); @@ -551,8 +552,8 @@ void spawnfunc___init_dedicated_server(void) self.classname = "worldspawn"; // safeguard against various stuff ;) // needs to be done so early because of the constants they create - RegisterWeapons(); - RegisterGametypes(); + CALL_ACCUMULATED_FUNCTION(RegisterWeapons); + CALL_ACCUMULATED_FUNCTION(RegisterGametypes); MapInfo_Enumerate(); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); @@ -560,7 +561,6 @@ void spawnfunc___init_dedicated_server(void) void Map_MarkAsRecent(string m); float world_already_spawned; -void RegisterWeapons(); void Nagger_Init(); void ClientInit_Spawn(); void WeaponStats_Init(); @@ -598,8 +598,8 @@ void spawnfunc_worldspawn (void) } // needs to be done so early because of the constants they create - RegisterWeapons(); - RegisterGametypes(); + CALL_ACCUMULATED_FUNCTION(RegisterWeapons); + CALL_ACCUMULATED_FUNCTION(RegisterGametypes); ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid)); @@ -821,21 +821,38 @@ void spawnfunc_worldspawn (void) addstat(STAT_FROZEN, AS_INT, freezetag_frozen); addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress); } + + if(g_td) + { + addstat(STAT_CURRENT_WAVE, AS_FLOAT, stat_current_wave); + addstat(STAT_TOTALWAVES, AS_FLOAT, stat_totalwaves); + } + + // freeze attacks + addstat(STAT_FROZEN, AS_INT, frozen); + addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, revive_progress); // g_movementspeed hack addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw); addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed); addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw); addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw); - + // secrets addstat(STAT_SECRETS_TOTAL, AS_FLOAT, stat_secrets_total); addstat(STAT_SECRETS_FOUND, AS_FLOAT, stat_secrets_found); + // monsters + addstat(STAT_MONSTERS_TOTAL, AS_FLOAT, stat_monsters_total); + addstat(STAT_MONSTERS_KILLED, AS_FLOAT, stat_monsters_killed); + + // misc + addstat(STAT_RESPAWN_TIME, AS_FLOAT, stat_respawn_time); + 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: "; @@ -848,18 +865,18 @@ void spawnfunc_worldspawn (void) 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")); lsnewmaps_reply = strzone(strcat(((!g_race && !g_cts) ? "Need to be playing race or CTS for lsnewmaps to work." : lsnewmaps_reply), "\n")); @@ -882,9 +899,11 @@ void spawnfunc_worldspawn (void) for(i = 0; i < 10; ++i) { - records_reply[i] = strzone(getrecords(i)); + s = getrecords(i); + if (s) + records_reply[i] = strzone(s); } - + ladder_reply = strzone(getladder()); rankings_reply = strzone(getrankings()); @@ -938,6 +957,8 @@ void spawnfunc_worldspawn (void) // weird mutators that deserve to count as mod if(autocvar_g_minstagib) modname = "MinstaGib"; + if(autocvar_g_monsters) + modname = "Monsters"; // extra mutators that deserve to count as mod MUTATOR_CALLHOOK(SetModname); // weird game types that deserve to count as mod @@ -1343,10 +1364,10 @@ float mapvote_initialized; void IntermissionThink() { FixIntermissionClient(self); - + float server_screenshot = (autocvar_sv_autoscreenshot && self.cvar_cl_autoscreenshot); float client_screenshot = (self.cvar_cl_autoscreenshot == 2); - + if( (server_screenshot || client_screenshot) && ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) ) { @@ -1609,6 +1630,8 @@ void NextLevel() if(autocvar_g_campaign) CampaignPreIntermission(); + MUTATOR_CALLHOOK(MatchEnd); + localcmd("\nsv_hook_gameend\n"); } @@ -2025,7 +2048,6 @@ float WinningCondition_Race(float fraglimit) return WINNING_STARTSUDDENDEATHOVERTIME; else return WINNING_NEVER; - return wc; } float WinningCondition_QualifyingThenRace(float limit) @@ -2114,6 +2136,36 @@ float WinningCondition_RanOutOfSpawns() return WINNING_NO; } +// TD winning condition: +// game terminates if there are no generators (or 1 dies if td_dontend is TRUE) +float gensurvived; +float WinningCondition_TowerDefense() +{ + WinningConditionHelper(); // set worldstatus + + if(inWarmupStage) + return WINNING_NO; + + // first check if the game has ended + if(gendestroyed == TRUE) // FALSE means either generator hasen't spawned yet, or mapper didn't add one + if(td_gencount < 1 || !td_dont_end) + { + ClearWinners(); + dprint("Everyone lost, ending game.\n"); + return WINNING_YES; + } + + if(gensurvived) + { + ClearWinners(); + SetWinners(winning, 4); + return WINNING_YES; + } + + // Two or more teams remain + return WINNING_NO; +} + /* ============ CheckRules_World @@ -2269,6 +2321,10 @@ void CheckRules_World() { checkrules_status = WinningCondition_Onslaught(); // TODO remove this? } + else if(g_td) + { + checkrules_status = WinningCondition_TowerDefense(); // TODO make these mutator hooks? + } else { checkrules_status = WinningCondition_Scores(fraglimit, leadlimit); @@ -2345,7 +2401,7 @@ string MapVote_Suggest(string m) if(mapvote_initialized) return "Can't suggest - voting is already in progress!"; m = MapInfo_FixName(m); - if(!m) + if not(m) return "The map you suggested is not available on this server."; if(!autocvar_g_maplist_votable_suggestions_override_mostrecent) if(Map_IsRecent(m))