X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_world.qc;h=25fcdfd007b95c5c04aba33a54dc0d4869f7f31e;hb=e9e91f9bc18dd5002e60c595c83cb8f45068a14b;hp=a0f9a3f131ab2e2552340692736ad82fd398d324;hpb=b67505ebdf6ddb105e3ec745a71dae5490ad2508;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index a0f9a3f13..25fcdfd00 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -1,5 +1,4 @@ #include "g_world.qh" -#include "_all.qh" #include "anticheat.qh" #include "antilag.qh" @@ -14,23 +13,25 @@ #include "g_hook.qh" #include "ipban.qh" #include "mapvoting.qh" -#include "mutators/mutators_include.qh" +#include "mutators/all.qh" #include "race.qh" #include "scores.qh" #include "teamplay.qh" #include "weapons/weaponstats.qh" #include "../common/buffs/all.qh" #include "../common/constants.qh" -#include "../common/deathtypes.qh" -#include "../common/effects/effects.qh" +#include "../common/deathtypes/all.qh" #include "../common/mapinfo.qh" #include "../common/monsters/all.qh" #include "../common/monsters/sv_monsters.qh" #include "../common/vehicles/all.qh" #include "../common/notifications.qh" +#include "../common/physics.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/util.qh" #include "../common/items/all.qh" #include "../common/weapons/all.qh" @@ -82,8 +83,8 @@ void PingPLReport_Think() } void PingPLReport_Spawn() { - pingplreport = spawn(); - pingplreport.classname = "pingplreport"; + pingplreport = new(pingplreport); + make_pure(pingplreport); pingplreport.think = PingPLReport_Think; pingplreport.nextthink = time; } @@ -527,7 +528,8 @@ void RandomSeed_Think() } void RandomSeed_Spawn() {SELFPARAM(); - randomseed = spawn(); + randomseed = new(randomseed); + make_pure(randomseed); randomseed.think = RandomSeed_Think; Net_LinkEntity(randomseed, false, 0, RandomSeed_Send); @@ -545,20 +547,17 @@ spawnfunc(__init_dedicated_server) remove = remove_unsafely; - entity e; - e = spawn(); + entity e = spawn(); e.think = GotoFirstMap; e.nextthink = time; // this is usually 1 at this point - e = spawn(); - e.classname = "info_player_deathmatch"; // safeguard against player joining + e = new(info_player_deathmatch); // safeguard against player joining self.classname = "worldspawn"; // safeguard against various stuff ;) // needs to be done so early because of the constants they create static_init(); - CALL_ACCUMULATED_FUNCTION(RegisterNotifications); - CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); + static_init_late(); MapInfo_Enumerate(); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); @@ -603,8 +602,6 @@ spawnfunc(worldspawn) // needs to be done so early because of the constants they create static_init(); - CALL_ACCUMULATED_FUNCTION(RegisterNotifications); - CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid)); @@ -659,6 +656,7 @@ spawnfunc(worldspawn) PlayerStats_GameReport_Init(); // we need this to be initiated before InitGameplayMode InitGameplayMode(); + static_init_late(); readlevelcvars(); GrappleHookInit(); @@ -1427,7 +1425,7 @@ void DumpStats(float final) { s = strcat(":player:see-labels:", GetPlayerScoreString(other, 0), ":"); s = strcat(s, ftos(rint(time - other.jointime)), ":"); - if(IS_PLAYER(other) || other.caplayer == 1 || g_lms) + if(IS_PLAYER(other) || MUTATOR_CALLHOOK(GetPlayerStatus, other, s)) s = strcat(s, ftos(other.team), ":"); else s = strcat(s, "spectator:"); @@ -1486,11 +1484,14 @@ void FixIntermissionClient(entity e) e.solid = SOLID_NOT; e.movetype = MOVETYPE_NONE; e.takedamage = DAMAGE_NO; - if(e.weaponentity) + for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - e.weaponentity.effects = EF_NODRAW; - if (e.weaponentity.weaponentity) - e.weaponentity.weaponentity.effects = EF_NODRAW; + if(e.weaponentity[slot]) + { + e.weaponentity[slot].effects = EF_NODRAW; + if (e.weaponentity[slot].weaponentity[slot]) + e.weaponentity[slot].weaponentity[slot].effects = EF_NODRAW; + } } if(IS_REAL_CLIENT(e)) { @@ -1550,6 +1551,10 @@ void NextLevel() bprint(other.netname, " ^7wins.\n"); } + entity oldself = self; + target_music_kill(); + self = oldself; + if(autocvar_g_campaign) CampaignPreIntermission(); @@ -1706,85 +1711,6 @@ float WinningCondition_Assault() return status; } -// LMS winning condition: game terminates if and only if there's at most one -// one player who's living lives. Top two scores being equal cancels the time -// limit. -float WinningCondition_LMS() -{ - entity head, head2; - float have_player; - float have_players; - float l; - - have_player = false; - have_players = false; - l = LMS_NewPlayerLives(); - - head = find(world, classname, "player"); - if(head) - have_player = true; - head2 = find(head, classname, "player"); - if(head2) - have_players = true; - - if(have_player) - { - // we have at least one player - if(have_players) - { - // two or more active players - continue with the game - } - else - { - // exactly one player? - - ClearWinners(); - SetWinners(winning, 0); // NOTE: exactly one player is still "player", so this works out - - if(l) - { - // game still running (that is, nobody got removed from the game by a frag yet)? then continue - return WINNING_NO; - } - else - { - // a winner! - // and assign him his first place - PlayerScore_Add(head, SP_LMS_RANK, 1); - return WINNING_YES; - } - } - } - else - { - // nobody is playing at all... - if(l) - { - // wait for players... - } - else - { - // SNAFU (maybe a draw game?) - ClearWinners(); - LOG_TRACE("No players, ending game.\n"); - return WINNING_YES; - } - } - - // When we get here, we have at least two players who are actually LIVING, - // now check if the top two players have equal score. - WinningConditionHelper(); - - ClearWinners(); - if(WinningConditionHelper_winner) - WinningConditionHelper_winner.winning = true; - if(WinningConditionHelper_topscore == WinningConditionHelper_secondscore) - return WINNING_NEVER; - - // Top two have different scores? Way to go for our beloved TIMELIMIT! - return WINNING_NO; -} - void ShuffleMaplist() { cvar_set("g_maplist", shufflewords(autocvar_g_maplist)); @@ -2086,35 +2012,13 @@ void CheckRules_World() return; } - float checkrules_status; - checkrules_status = WinningCondition_RanOutOfSpawns(); + int checkrules_status = WinningCondition_RanOutOfSpawns(); if(checkrules_status == WINNING_YES) - { bprint("Hey! Someone ran out of spawns!\n"); - } - else if(g_race && !g_race_qualifying && timelimit >= 0) - { - checkrules_status = WinningCondition_Race(fraglimit); - //print("WC_RACE yields ", ftos(checkrules_status), "\n"); - } - else if(g_race && g_race_qualifying == 2 && timelimit >= 0) - { - checkrules_status = WinningCondition_QualifyingThenRace(fraglimit); - //print("WC_QUALIFYING_THEN_RACE yields ", ftos(checkrules_status), "\n"); - } - else if(g_assault) - { - checkrules_status = WinningCondition_Assault(); // TODO remove this? - } - else if(g_lms) - { - checkrules_status = WinningCondition_LMS(); - } + else if(MUTATOR_CALLHOOK(CheckRules_World, checkrules_status, timelimit, fraglimit)) + checkrules_status = ret_float; else - { checkrules_status = WinningCondition_Scores(fraglimit, leadlimit); - //print("WC_SCORES yields ", ftos(checkrules_status), "\n"); - } if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME) {