X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_invasion.qc;h=efed23a5df41f48dd0897ffb72c8434412f1cb47;hb=611ca3ef85a52d3272aeca943f0b3a97e3aa52bb;hp=1d9dc662017f7743f212588be4a96ba0c8a7f1c4;hpb=868c953a2bff5ddb11700a7d160e66014d9704de;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 1d9dc6620..efed23a5d 100644 --- a/qcsrc/server/mutators/mutator/gamemode_invasion.qc +++ b/qcsrc/server/mutators/mutator/gamemode_invasion.qc @@ -1,10 +1,12 @@ #include "gamemode_invasion.qh" -#include +#include #include #include +IntrusiveList g_invasion_spawns; +STATIC_INIT(g_invasion_spawns) { g_invasion_spawns = IL_NEW(); } float autocvar_g_invasion_round_timelimit; float autocvar_g_invasion_spawnpoint_spawn_delay; @@ -13,55 +15,56 @@ int autocvar_g_invasion_monster_count; bool autocvar_g_invasion_zombies_only; float autocvar_g_invasion_spawn_delay; +.string spawnmob; + spawnfunc(invasion_spawnpoint) { if(!g_invasion) { delete(this); return; } this.classname = "invasion_spawnpoint"; + IL_PUSH(g_invasion_spawns, this); if(autocvar_g_invasion_zombies_only) // precache only if it hasn't been already - if(this.monsterid) { - Monster mon = get_monsterinfo(this.monsterid); - mon.mr_precache(mon); + if(this.spawnmob) + { + FOREACH(Monsters, it.netname == this.spawnmob, + { + it.mr_precache(it); + }); } } -float invasion_PickMonster(float supermonster_count) +Monster invasion_PickMonster(int supermonster_count) { if(autocvar_g_invasion_zombies_only) - return MON_ZOMBIE.monsterid; - - float i; - entity mon; + return MON_ZOMBIE; RandomSelection_Init(); - for(i = MON_FIRST; i <= MON_LAST; ++i) + FOREACH(Monsters, it != MON_Null, { - mon = get_monsterinfo(i); - if((mon.spawnflags & MONSTER_TYPE_FLY) || (mon.spawnflags & MONSTER_TYPE_SWIM) || ((mon.spawnflags & MON_FLAG_SUPERMONSTER) && supermonster_count >= 1)) - continue; // flying/swimming monsters not yet supported - - RandomSelection_Add(NULL, i, string_null, 1, 1); - } + if((it.spawnflags & MONSTER_TYPE_PASSIVE) || (it.spawnflags & MONSTER_TYPE_FLY) || (it.spawnflags & MONSTER_TYPE_SWIM) || (it.spawnflags & MONSTER_SIZE_QUAKE) || ((it.spawnflags & MON_FLAG_SUPERMONSTER) && supermonster_count >= 1)) + continue; + RandomSelection_AddEnt(it, 1, 1); + }); - return RandomSelection_chosen_float; + return RandomSelection_chosen_ent; } entity invasion_PickSpawn() { RandomSelection_Init(); - FOREACH_ENTITY_CLASS("invasion_spawnpoint", true, + IL_EACH(g_invasion_spawns, true, { - RandomSelection_Add(it, 0, string_null, 1, ((time >= it.spawnshieldtime) ? 0.2 : 1)); // give recently used spawnpoints a very low rating + RandomSelection_AddEnt(it, 1, ((time >= it.spawnshieldtime) ? 0.2 : 1)); // give recently used spawnpoints a very low rating it.spawnshieldtime = time + autocvar_g_invasion_spawnpoint_spawn_delay; }); return RandomSelection_chosen_ent; } -void invasion_SpawnChosenMonster(float mon) +void invasion_SpawnChosenMonster(Monster mon) { entity spawn_point, monster; @@ -71,17 +74,14 @@ void invasion_SpawnChosenMonster(float mon) { LOG_TRACE("Warning: couldn't find any invasion_spawnpoint spawnpoints, attempting to spawn monsters in random locations"); entity e = spawn(); - setsize(e, (get_monsterinfo(mon)).mins, (get_monsterinfo(mon)).maxs); + setsize(e, mon.mins, mon.maxs); if(MoveToRandomMapLocation(e, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, 10, 1024, 256)) - monster = spawnmonster("", mon, NULL, NULL, e.origin, false, false, 2); + monster = spawnmonster(e, "", mon.m_id, NULL, NULL, e.origin, false, false, 2); else return; - - setthink(e, SUB_Remove); - e.nextthink = time + 0.1; } - else - monster = spawnmonster("", ((spawn_point.monsterid) ? spawn_point.monsterid : mon), spawn_point, spawn_point, spawn_point.origin, false, false, 2); + else // if spawnmob field falls through (unset), fallback to mon (relying on spawnmonster for that behaviour) + monster = spawnmonster(spawn(), spawn_point.spawnmob, mon.m_id, spawn_point, spawn_point, spawn_point.origin, false, false, 2); if(spawn_point) monster.target2 = spawn_point.target2; monster.spawnshieldtime = time; @@ -93,10 +93,10 @@ void invasion_SpawnChosenMonster(float mon) else { RandomSelection_Init(); - if(inv_monsters_perteam[NUM_TEAM_1] > 0) RandomSelection_Add(NULL, NUM_TEAM_1, string_null, 1, 1); - if(inv_monsters_perteam[NUM_TEAM_2] > 0) RandomSelection_Add(NULL, NUM_TEAM_2, string_null, 1, 1); - if(invasion_teams >= 3) if(inv_monsters_perteam[NUM_TEAM_3] > 0) { RandomSelection_Add(NULL, NUM_TEAM_3, string_null, 1, 1); } - if(invasion_teams >= 4) if(inv_monsters_perteam[NUM_TEAM_4] > 0) { RandomSelection_Add(NULL, NUM_TEAM_4, string_null, 1, 1); } + if(inv_monsters_perteam[NUM_TEAM_1] > 0) RandomSelection_AddFloat(NUM_TEAM_1, 1, 1); + if(inv_monsters_perteam[NUM_TEAM_2] > 0) RandomSelection_AddFloat(NUM_TEAM_2, 1, 1); + if(invasion_teams >= 3) if(inv_monsters_perteam[NUM_TEAM_3] > 0) { RandomSelection_AddFloat(NUM_TEAM_3, 1, 1); } + if(invasion_teams >= 4) if(inv_monsters_perteam[NUM_TEAM_4] > 0) { RandomSelection_AddFloat(NUM_TEAM_4, 1, 1); } monster.team = RandomSelection_chosen_float; } @@ -120,14 +120,14 @@ void invasion_SpawnChosenMonster(float mon) monster.spawnflags |= MONSTERFLAG_MINIBOSS; // last round spawns minibosses } -void invasion_SpawnMonsters(float supermonster_count) +void invasion_SpawnMonsters(int supermonster_count) { - float chosen_monster = invasion_PickMonster(supermonster_count); + Monster chosen_monster = invasion_PickMonster(supermonster_count); invasion_SpawnChosenMonster(chosen_monster); } -float Invasion_CheckWinner() +bool Invasion_CheckWinner() { if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0) { @@ -340,6 +340,8 @@ MUTATOR_HOOKFUNCTION(inv, PlayerSpawn) { entity player = M_ARGV(0, entity); + if(player.bot_attack) + IL_REMOVE(g_bot_targets, player); player.bot_attack = false; } @@ -412,7 +414,7 @@ MUTATOR_HOOKFUNCTION(inv, AllowMobSpawning) return true; } -MUTATOR_HOOKFUNCTION(inv, GetTeamCount, CBC_ORDER_EXCLUSIVE) +MUTATOR_HOOKFUNCTION(inv, CheckAllowedTeams, CBC_ORDER_EXCLUSIVE) { M_ARGV(0, float) = invasion_teams; }