X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_invasion.qc;h=efb6842e5dedb8137e9c6201f7d5e8f83e1c1d5f;hb=f00146a481475e0fb4516f421fc471739cee3d29;hp=1fa986483bd4ed9d31678bb6a3867f2a2fa4b916;hpb=e9f30b97435c6afe3d6911f21e1f4fd1b97e93da;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator/gamemode_invasion.qc b/qcsrc/server/mutators/mutator/gamemode_invasion.qc index 1fa986483..efb6842e5 100644 --- a/qcsrc/server/mutators/mutator/gamemode_invasion.qc +++ b/qcsrc/server/mutators/mutator/gamemode_invasion.qc @@ -1,3 +1,4 @@ +#include "gamemode_invasion.qh" #ifndef GAMEMODE_INVASION_H #define GAMEMODE_INVASION_H @@ -61,10 +62,10 @@ const float ST_INV_KILLS = 1; #ifdef IMPLEMENTATION -#include "../../../common/monsters/spawn.qh" -#include "../../../common/monsters/sv_monsters.qh" +#include +#include -#include "../../teamplay.qh" +#include float autocvar_g_invasion_round_timelimit; @@ -140,7 +141,7 @@ void invasion_SpawnChosenMonster(float mon) monster = spawnmonster("", mon, world, world, e.origin, false, false, 2); else return; - e.think = SUB_Remove; + e.think = SUB_Remove_self; e.nextthink = time + 0.1; } else @@ -192,11 +193,9 @@ void invasion_SpawnMonsters(float supermonster_count) float Invasion_CheckWinner() { - entity head; if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0) { - FOR_EACH_MONSTER(head) - Monster_Remove(head); + FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(Monster_Remove(it))); Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_ROUND_OVER); Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ROUND_OVER); @@ -206,21 +205,23 @@ float Invasion_CheckWinner() float total_alive_monsters = 0, supermonster_count = 0, red_alive = 0, blue_alive = 0, yellow_alive = 0, pink_alive = 0; - FOR_EACH_MONSTER(head) if(head.health > 0) - { - if((get_monsterinfo(head.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER) - ++supermonster_count; - ++total_alive_monsters; - - if(teamplay) - switch(head.team) + FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA( + if(it.health > 0) { - case NUM_TEAM_1: ++red_alive; break; - case NUM_TEAM_2: ++blue_alive; break; - case NUM_TEAM_3: ++yellow_alive; break; - case NUM_TEAM_4: ++pink_alive; break; + if((get_monsterinfo(it.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER) + ++supermonster_count; + ++total_alive_monsters; + + if(teamplay) + switch(it.team) + { + case NUM_TEAM_1: ++red_alive; break; + case NUM_TEAM_2: ++blue_alive; break; + case NUM_TEAM_3: ++yellow_alive; break; + case NUM_TEAM_4: ++pink_alive; break; + } } - } + )); if((total_alive_monsters + inv_numkilled) < inv_maxspawned && inv_maxcurrent < inv_maxspawned) { @@ -262,25 +263,25 @@ float Invasion_CheckWinner() else { winner_team = NUM_TEAM_4; } } else - FOR_EACH_PLAYER(head) { - float cs = PlayerScore_Add(head, SP_KILLS, 0); - if(cs > winning_score) - { - winning_score = cs; - winner = head; - } + FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + float cs = PlayerScore_Add(it, SP_KILLS, 0); + if(cs > winning_score) + { + winning_score = cs; + winner = it; + } + )); } - FOR_EACH_MONSTER(head) - Monster_Remove(head); + FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(Monster_Remove(it))); if(teamplay) { if(winner_team) { - Send_Notification(NOTIF_ALL, world, MSG_CENTER, APP_TEAM_NUM_4(winner_team, CENTER_ROUND_TEAM_WIN_)); - Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM_4(winner_team, INFO_ROUND_TEAM_WIN_)); + Send_Notification(NOTIF_ALL, world, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_WIN)); + Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM(winner_team, INFO_ROUND_TEAM_WIN)); } } else if(winner) @@ -294,20 +295,18 @@ float Invasion_CheckWinner() return 1; } -float Invasion_CheckPlayers() +bool Invasion_CheckPlayers() { return true; } void Invasion_RoundStart() { - entity e; - float numplayers = 0; - FOR_EACH_PLAYER(e) - { - e.player_blocked = 0; + int numplayers = 0; + FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + it.player_blocked = false; ++numplayers; - } + )); if(inv_roundcnt < inv_maxrounds) inv_roundcnt += 1; // a limiter to stop crazy counts @@ -331,15 +330,15 @@ void Invasion_RoundStart() } MUTATOR_HOOKFUNCTION(inv, MonsterDies) -{SELFPARAM(); - if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) +{ + if(!(frag_target.spawnflags & MONSTERFLAG_RESPAWNED)) { inv_numkilled += 1; inv_maxcurrent -= 1; - if(teamplay) { inv_monsters_perteam[self.team] -= 1; } + if(teamplay) { inv_monsters_perteam[frag_target.team] -= 1; } if(IS_PLAYER(frag_attacker)) - if(SAME_TEAM(frag_attacker, self)) // in non-teamplay modes, same team = same player, so this works + if(SAME_TEAM(frag_attacker, frag_target)) // in non-teamplay modes, same team = same player, so this works PlayerScore_Add(frag_attacker, SP_KILLS, -1); else { @@ -483,7 +482,7 @@ void invasion_ScoreRules(float inv_teams) ScoreRules_basics_end(); } -void invasion_DelayedInit() // Do this check with a delay so we can wait for teams to be set up. +void invasion_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up. { if(autocvar_g_invasion_teams) invasion_teams = bound(2, autocvar_g_invasion_teams, 4);