7 #include "sv_monsters.qh"
8 #include <server/autocvars.qh>
9 #include <server/defs.qh>
11 entity spawnmonster(entity e, string monster, int monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag)
13 e.spawnflags = MONSTERFLAG_SPAWNED;
15 if (!respwn) { e.spawnflags |= MONSTERFLAG_NORESPAWN; }
16 // if(invincible) { e.spawnflags |= MONSTERFLAG_INVINCIBLE; }
19 bool allow_any = boolean(monster == "anyrandom");
21 if (monster == "random" || allow_any) {
22 RandomSelection_Init();
23 FOREACH(Monsters, it != MON_Null && (allow_any || (!(it.spawnflags & MONSTER_TYPE_PASSIVE) && !(it.spawnflags & MON_FLAG_HIDDEN))),
25 RandomSelection_AddEnt(it, 1, 1);
28 monster_id = RandomSelection_chosen_ent.monsterid;
29 } else if (monster != "") {
31 FOREACH(Monsters, it != MON_Null,
33 if (it.netname == monster) {
35 monster_id = it.monsterid; // we have the monster, old monster id is no longer required
40 if (!found && !monster_id) {
41 if (removeifinvalid) {
43 return NULL; // no good
45 monster_id = MON_FIRST;
50 e.realowner = spawnedby;
53 e.monster_moveflags = moveflag;
56 if (IS_PLAYER(spawnedby)) {
57 if (teamplay && autocvar_g_monsters_teams) {
58 e.team = spawnedby.team; // colors handled in spawn code
60 if (autocvar_g_monsters_owners) {
61 e.monster_follow = own; // using .owner makes the monster non-solid for its master
63 e.angles_y = spawnedby.angles_y;
66 // Monster_Spawn checks if monster is valid
67 if (!Monster_Spawn(e, false, monster_id)) {
69 return NULL; // remove even if told not to, as we didn't spawn any kind of monster