X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_assault.qc;h=994a29719c810a16d0029c18328269f1609ff31c;hb=42c08e5c16159929187a67150750bce1770b6355;hp=3dfd5d1d3a80672e946fc2c57cba2e22aaa18449;hpb=edeaa66721b27dd56891a09daa74fd8daadf345f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator/gamemode_assault.qc b/qcsrc/server/mutators/mutator/gamemode_assault.qc index 3dfd5d1d3..994a29719 100644 --- a/qcsrc/server/mutators/mutator/gamemode_assault.qc +++ b/qcsrc/server/mutators/mutator/gamemode_assault.qc @@ -1,6 +1,9 @@ #include "gamemode_assault.qh" +#include + .entity sprite; +#define AS_ROUND_DELAY 5 // random functions void assault_objective_use(entity this, entity actor, entity trigger) @@ -71,16 +74,13 @@ void assault_objective_decrease_use(entity this, entity actor, entity trigger) void assault_setenemytoobjective(entity this) { - FOREACH_ENTITY_STRING(targetname, this.target, + IL_EACH(g_assault_objectives, it.targetname == this.target, { - if(it.classname == "target_objective") - { - if(this.enemy == NULL) - this.enemy = it; - else - objerror(this, "more than one objective as target - fix the map!"); - break; - } + if(this.enemy == NULL) + this.enemy = it; + else + objerror(this, "more than one objective as target - fix the map!"); + break; }); if(this.enemy == NULL) @@ -108,7 +108,7 @@ void target_objective_decrease_activate(entity this) it.sprite = NULL; // TODO: just unsetting it?! } - spr = WaypointSprite_SpawnFixed(WP_Assault, 0.5 * (it.absmin + it.absmax), it, assault_sprite, RADARICON_OBJECTIVE); + spr = WaypointSprite_SpawnFixed(WP_AssaultDefend, 0.5 * (it.absmin + it.absmax), it, assault_sprite, RADARICON_OBJECTIVE); spr.assault_decreaser = this; spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible; spr.classname = "sprite_waypoint"; @@ -147,7 +147,8 @@ void assault_roundstart_use(entity this, entity actor, entity trigger) SUB_UseTargets(this, this, trigger); //(Re)spawn all turrets - FOREACH_ENTITY_CLASS("turret_main", true, LAMBDA( + IL_EACH(g_turrets, true, + { // Swap turret teams if(it.team == NUM_TEAM_1) it.team = NUM_TEAM_2; @@ -156,7 +157,7 @@ void assault_roundstart_use(entity this, entity actor, entity trigger) // Doubles as teamchange turret_respawn(it); - )); + }); } void assault_roundstart_use_this(entity this) { @@ -181,21 +182,10 @@ void assault_wall_think(entity this) // trigger new round // reset objectives, toggle spawnpoints, reset triggers, ... -void vehicles_clearreturn(entity veh); -void vehicles_spawn(entity this); void assault_new_round(entity this) { //bprint("ASSAULT: new round\n"); - // Eject players from vehicles - FOREACH_CLIENT(IS_PLAYER(it) && it.vehicle, vehicles_exit(it.vehicle, VHEF_RELEASE)); - - IL_EACH(g_vehicles, true, - { - vehicles_clearreturn(it); - vehicles_spawn(it); - }); - // up round counter this.winning = this.winning + 1; @@ -215,14 +205,27 @@ void assault_new_round(entity this) }); // reset the level with a countdown - cvar_set("timelimit", ftos(ceil(time - game_starttime) / 60)); + cvar_set("timelimit", ftos(ceil(time - AS_ROUND_DELAY - game_starttime) / 60)); ReadyRestart_force(); // sets game_starttime } +entity as_round; +.entity ent_winning; +void as_round_think() +{ + game_stopped = false; + assault_new_round(as_round.ent_winning); + delete(as_round); + as_round = NULL; +} + // Assault winning condition: If the attackers triggered a round end (by fulfilling all objectives) // they win. Otherwise the defending team wins once the timelimit passes. int WinningCondition_Assault() { + if(as_round) + return WINNING_NO; + WinningConditionHelper(NULL); // set worldstatus int status = WINNING_NO; @@ -242,7 +245,7 @@ int WinningCondition_Assault() { if(ent.winning) // round end has been triggered by attacking team { - bprint("ASSAULT: round completed...\n"); + bprint("Assault: round completed.\n"); SetWinners(team, assault_attacker_team); TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0)); @@ -253,7 +256,17 @@ int WinningCondition_Assault() } else { - assault_new_round(ent); + Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ASSAULT_OBJ_DESTROYED, ceil(time - game_starttime)); + as_round = new(as_round); + as_round.think = as_round_think; + as_round.ent_winning = ent; + as_round.nextthink = time + AS_ROUND_DELAY; + game_stopped = true; + + // make sure timelimit isn't hit while the game is blocked + if(autocvar_timelimit > 0) + if(time + AS_ROUND_DELAY >= game_starttime + autocvar_timelimit * 60) + cvar_set("timelimit", ftos(autocvar_timelimit + AS_ROUND_DELAY / 60)); } } } @@ -283,6 +296,7 @@ spawnfunc(target_objective) if (!g_assault) { delete(this); return; } this.classname = "target_objective"; + IL_PUSH(g_assault_objectives, this); this.use = assault_objective_use; this.reset = assault_objective_reset; this.reset(this); @@ -537,11 +551,11 @@ MUTATOR_HOOKFUNCTION(as, TurretSpawn) { entity turret = M_ARGV(0, entity); - if(!turret.team || turret.team == MAX_SHOT_DISTANCE) + if(!turret.team || turret.team == FLOAT_MAX) turret.team = 5; // this gets reversed when match starts? } -MUTATOR_HOOKFUNCTION(as, VehicleSpawn) +MUTATOR_HOOKFUNCTION(as, VehicleInit) { entity veh = M_ARGV(0, entity); @@ -563,7 +577,7 @@ MUTATOR_HOOKFUNCTION(as, PlayHitsound) return (frag_victim.classname == "func_assault_destructible"); } -MUTATOR_HOOKFUNCTION(as, GetTeamCount) +MUTATOR_HOOKFUNCTION(as, CheckAllowedTeams) { // assault always has 2 teams c1 = c2 = 0; @@ -596,6 +610,12 @@ MUTATOR_HOOKFUNCTION(as, OnEntityPreSpawn) } } +MUTATOR_HOOKFUNCTION(as, ReadyRestart_Deny) +{ + // readyrestart not supported (yet) + return true; +} + // scoreboard setup void assault_ScoreRules() {