2 const vector SPAWNER_MIN = '-35 -35 -10';
3 const vector SPAWNER_MAX = '35 35 70';
6 float autocvar_g_monster_spawner;
7 float autocvar_g_monster_spawner_health;
8 float autocvar_g_monster_spawner_maxmobs;
9 string autocvar_g_monster_spawner_forcespawn;
15 if(self.spawner_monstercount >= autocvar_g_monster_spawner_maxmobs || self.frozen || self.freezetag_frozen)
18 vector p1, p2, p3, p4, chosenposi;
23 self.spawner_monstercount += 1;
25 if(self.spawnmob != "")
28 if(autocvar_g_monster_spawner_forcespawn != "")
29 type = autocvar_g_monster_spawner_forcespawn;
31 if(type == "" || type == "spawner") // spawner spawning spawners?!
34 p1 = self.origin - '0 70 -50' * self.scale;
35 p2 = self.origin + '0 70 50' * self.scale;
36 p3 = self.origin - '70 0 -50' * self.scale;
37 p4 = self.origin + '70 0 -50' * self.scale;
48 e = spawnmonster(type, self, self, chosenposi, FALSE, MONSTER_MOVE_WANDER);
50 if(teamplay && autocvar_g_monsters_teams)
53 if(self.spawnflags & MONSTERFLAG_GIANT)
54 e.spawnflags = MONSTERFLAG_GIANT;
56 if(self.flags & MONSTERFLAG_MINIBOSS)
57 e.spawnflags = MONSTERFLAG_MINIBOSS;
63 pointparticles(particleeffectnum(((self.scale > 3) ? "explosion_big" : "explosion_medium")), self.origin, '0 0 0', 1);
64 sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
66 self.solid = SOLID_NOT;
67 self.takedamage = DAMAGE_NO;
68 self.event_damage = func_null;
70 self.think = Monster_Fade;
71 self.nextthink = time + 1;
73 monster_hook_death(); // for post-death mods
78 float finished = FALSE;
79 self.think = spawner_think;
81 if(self.spawner_monstercount >= autocvar_g_monster_spawner_maxmobs)
83 self.nextthink = time + 5;
86 if (self.spawner_monstercount <= autocvar_g_monster_spawner_maxmobs)
92 self.nextthink = time + 1;
94 if(self.spawner_monstercount <= autocvar_g_monster_spawner_maxmobs || !finished)
95 self.nextthink = time + 0.1;
101 self.health = autocvar_g_monster_spawner_health * self.scale;
103 self.classname = "monster_spawner";
104 self.nextthink = time + 0.2;
105 self.velocity = '0 0 0';
106 self.think = spawner_think;
107 self.touch = func_null;
108 self.sprite_height = 80 * self.scale;
110 self.spawner_monstercount = 0;
113 self.movetype = MOVETYPE_NONE;
115 monster_hook_spawn(); // for post-spawn mods
118 /*QUAKED monster_spawner (1 0 0) (-18 -18 -25) (18 18 47)
119 ---------NOTES----------
120 Spawns monsters when a player is nearby
121 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
122 modeldisabled="models/containers/crate01.md3"
124 void spawnfunc_monster_spawner()
126 if not(autocvar_g_monster_spawner)
132 self.monster_spawnfunc = spawnfunc_monster_spawner;
134 if(self.spawnflags & MONSTERFLAG_APPEAR)
136 self.think = func_null;
138 self.use = Monster_Appear;
144 if not (monster_initialize(
146 "models/containers/crate01.md3",
147 SPAWNER_MIN, SPAWNER_MAX,
149 spawner_die, spawner_spawn))
155 precache_sound("weapons/rocket_impact.wav");