6 #include <common/monsters/all.qh>
7 #include <common/monsters/sv_monsters.qh>
8 #include <common/stats.qh>
9 #include <common/util.qh>
10 #include <common/weapons/_all.qh>
11 #include <server/autocvars.qh>
12 #include <server/weapons/common.qh>
15 entity spawnmonster (entity e, string monster, Monster monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag)
17 e.spawnflags = MONSTERFLAG_SPAWNED;
19 if(!respwn) { e.spawnflags |= MONSTERFLAG_NORESPAWN; }
20 //if(invincible) { e.spawnflags |= MONSTERFLAG_INVINCIBLE; }
23 bool allow_any = boolean(monster == "anyrandom");
25 if(monster == "random" || allow_any)
27 RandomSelection_Init();
28 FOREACH(Monsters, it != MON_Null && (allow_any || !(it.spawnflags & MON_FLAG_HIDDEN)) && !(it.spawnflags & MONSTER_TYPE_PASSIVE),
30 RandomSelection_AddEnt(it, 1, 1);
33 monster_id = RandomSelection_chosen_ent;
35 else if(monster != "")
38 FOREACH(Monsters, it != MON_Null,
40 if(it.netname == monster)
43 monster_id = it; // we have the monster, old monster id is no longer required
48 if(!found && monster_id == MON_Null)
53 return NULL; // no good
57 // select a random valid monster type if no valid monster was provided
58 return spawnmonster(e, "random", MON_Null, spawnedby, own, orig, respwn, removeifinvalid, moveflag);
63 e.realowner = spawnedby;
66 e.monster_moveflags = moveflag;
68 if(IS_PLAYER(spawnedby))
70 if(teamplay && autocvar_g_monsters_teams)
71 e.team = spawnedby.team; // colors handled in spawn code
73 if(autocvar_g_monsters_owners)
74 e.monster_follow = own; // using .owner makes the monster non-solid for its master
76 e.angles_y = spawnedby.angles_y;
79 // Monster_Spawn checks if monster is valid
80 if(!Monster_Spawn(e, false, monster_id))
83 return NULL; // remove even if told not to, as we didn't spawn any kind of monster