X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=d55b7f6fab6497375c7aea6ef219aeabfd22f488;hb=2805e22b6636b63410a30e4fec68e1ae5ecadc87;hp=e969146ca40e145ed8e73e7e04a20f1f09e94330;hpb=2c0c9177a785b548215359e7c01991ece1701e5f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index e969146ca..d55b7f6fa 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -236,6 +236,7 @@ void cvar_changes_init() BADCVAR("g_configversion"); BADCVAR("g_maplist_index"); BADCVAR("halflifebsp"); + BADPREFIX("sv_world"); // client BADPREFIX("cl_"); @@ -279,6 +280,8 @@ void cvar_changes_init() BADCVAR("sys_colortranslation"); BADCVAR("sys_specialcharactertranslation"); BADCVAR("timestamps"); + BADCVAR("net_address"); + BADCVAR("net_address_ipv6"); // mapinfo BADCVAR("timelimit"); @@ -437,6 +440,8 @@ void spawnfunc_worldspawn (void) compressShortVector_init(); + allowed_to_spawn = TRUE; + local entity head; head = nextent(world); maxclients = 0; @@ -512,6 +517,8 @@ void spawnfunc_worldspawn (void) InitGameplayMode(); readlevelcvars(); GrappleHookInit(); + ElectroInit(); + LaserInit(); player_count = 0; bot_waypoints_for_items = cvar("g_waypoints_for_items"); @@ -634,8 +641,17 @@ void spawnfunc_worldspawn (void) addstat(STAT_SHOTORG, AS_INT, stat_shotorg); addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit); addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter); + addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup); + addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge); + + if(g_ca) + { + addstat(STAT_REDALIVE, AS_INT, redalive_stat); + addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat); + } // g_movementspeed hack + addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw); addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw); addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw); @@ -698,7 +714,22 @@ void spawnfunc_worldspawn (void) CheatInit(); - localcmd("\n_sv_hook_gamestart ", GetGametype(), ";"); + localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n"); + + // fill sv_curl_serverpackages from .serverpackage files + if(cvar("sv_curl_serverpackages_auto")) + { + fd = search_begin("*.serverpackage", TRUE, FALSE); + s = ""; + if(fd >= 0) + { + j = search_getsize(fd); + for(i = 0; i < j; ++i) + s = strcat(s, " ", search_getfilename(fd, i)); + search_end(fd); + } + cvar_set("sv_curl_serverpackages", substring(s, 1, -1)); + } world_initialized = 1; } @@ -1426,7 +1457,7 @@ void NextLevel() if(cvar("g_campaign")) CampaignPreIntermission(); - localcmd("\nsv_hook_gameend;"); + localcmd("\nsv_hook_gameend\n"); } /* @@ -1506,16 +1537,23 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true float GetWinningCode(float fraglimitreached, float equality) { - if(equality) - if(fraglimitreached) - return WINNING_STARTSUDDENDEATHOVERTIME; - else - return WINNING_NEVER; - else + if(cvar("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 @@ -1634,7 +1672,7 @@ float WinningCondition_Assault() TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0)); - if(ent.cnt == 1) // this was the second round + if(ent.cnt == 1 || cvar("g_campaign")) // this was the second round { status = WINNING_YES; } @@ -1739,6 +1777,8 @@ void ShuffleMaplist() float leaderfrags; float WinningCondition_Scores(float limit, float leadlimit) { + float limitreached; + // TODO make everything use THIS winning condition (except LMS) WinningConditionHelper(); @@ -1783,13 +1823,22 @@ float WinningCondition_Scores(float limit, float leadlimit) } } + limitreached = FALSE; + if(limit) + if(WinningConditionHelper_topscore >= limit) + limitreached = TRUE; + if(leadlimit) + { + float leadlimitreached; + leadlimitreached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit); + if(cvar("leadlimit_and_fraglimit")) + limitreached = (limitreached && leadlimitreached); + else + limitreached = (limitreached || leadlimitreached); + } + return GetWinningCode( - WinningConditionHelper_topscore && - ( - (limit && (WinningConditionHelper_topscore >= limit)) - || - (leadlimit && (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit)) - ), + WinningConditionHelper_topscore && limitreached, WinningConditionHelper_equality ); } @@ -2732,9 +2781,19 @@ void SV_Shutdown() print("Saving persistent data...\n"); Ban_SaveBans(); if(!cheatcount_total) - db_save(ServerProgsDB, "server.db"); + { + if(cvar("sv_db_saveasdump")) + db_dump(ServerProgsDB, "server.db"); + else + db_save(ServerProgsDB, "server.db"); + } if(cvar("developer")) - db_save(TemporaryDB, "server-temp.db"); + { + if(cvar("sv_db_saveasdump")) + db_dump(TemporaryDB, "server-temp.db"); + else + db_save(TemporaryDB, "server-temp.db"); + } CheatShutdown(); // must be after cheatcount check db_close(ServerProgsDB); db_close(TemporaryDB);