6 float monster_precached[MONSTER_LAST];
7 void monster_mid2info(float _mid);
9 void monster_precache(float _mid)
11 monster_mid2info(_mid);
12 if(monster_precached[_mid])
19 precache_model(ZOMBIE_MODEL);
24 precache_model(OGRE_MODEL);
29 precache_model(ANIMUS_MODEL);
32 case MONSTER_SHAMBLER:
34 precache_model(SHAMBLER_MODEL);
39 precache_model(BRUISER_MODEL);
44 precache_model(SOLDIER_MODEL);
45 precache_sound("weapons/shotgun_fire.wav");
46 precache_sound("weapons/uzi_fire.wav");
47 precache_sound("weapons/laser_fire.wav");
48 precache_sound("weapons/reload.wav");
49 precache_model("models/weapons/v_seeker.md3");
54 precache_model(WYVERN_MODEL);
57 case MONSTER_CERBERUS:
59 precache_model(CERBERUS_MODEL);
64 precache_model(SLIME_MODEL);
65 precache_sound("weapons/rocket_impact.wav");
70 precache_model(KNIGHT_MODEL);
75 precache_model(FISH_MODEL);
80 precache_model(MAGE_MODEL);
85 precache_model(SPIDER_MODEL);
90 monster_precached[_mid] = TRUE;
93 void Monsters_Precache()
96 for(i = MONSTER_FIRST + 1; i < MONSTER_LAST; ++i)
100 void monster_mid2info(float _mid)
106 mid2info_model = ZOMBIE_MODEL;
107 mid2info_name = "Zombie";
108 mid2info_min = ZOMBIE_MIN;
109 mid2info_max = ZOMBIE_MAX;
114 mid2info_model = OGRE_MODEL;
115 mid2info_name = "Ogre";
116 mid2info_min = OGRE_MIN;
117 mid2info_max = OGRE_MAX;
122 mid2info_model = ANIMUS_MODEL;
123 mid2info_name = "Animus";
124 mid2info_min = ANIMUS_MIN;
125 mid2info_max = ANIMUS_MAX;
126 if(self) self.scale = 1.3;
129 case MONSTER_SHAMBLER:
131 mid2info_model = SHAMBLER_MODEL;
132 mid2info_name = "Shambler";
133 mid2info_min = SHAMBLER_MIN;
134 mid2info_max = SHAMBLER_MAX;
135 if(self) self.scale = 1.3;
138 case MONSTER_BRUISER:
140 mid2info_model = BRUISER_MODEL;
141 mid2info_name = "Bruiser";
142 mid2info_min = BRUISER_MIN;
143 mid2info_max = BRUISER_MAX;
144 if(self) self.scale = 1.3;
149 mid2info_model = SOLDIER_MODEL;
150 mid2info_name = "Marine";
151 mid2info_min = SOLDIER_MIN;
152 mid2info_max = SOLDIER_MAX;
157 mid2info_model = WYVERN_MODEL;
158 mid2info_name = "Wyvern";
159 mid2info_min = WYVERN_MIN;
160 mid2info_max = WYVERN_MAX;
161 if(self) self.scale = 1.3;
164 case MONSTER_CERBERUS:
166 mid2info_model = CERBERUS_MODEL;
167 mid2info_name = "Cerberus";
168 mid2info_min = CERBERUS_MIN;
169 mid2info_max = CERBERUS_MAX;
174 mid2info_model = SLIME_MODEL;
175 mid2info_name = "Slime";
176 mid2info_min = SLIME_MIN;
177 mid2info_max = SLIME_MAX;
182 mid2info_model = KNIGHT_MODEL;
183 mid2info_name = "Knight";
184 mid2info_min = KNIGHT_MIN;
185 mid2info_max = KNIGHT_MAX;
186 if(self) self.scale = 1.3;
191 mid2info_model = FISH_MODEL;
192 mid2info_name = "Rotfish";
193 mid2info_min = FISH_MIN;
194 mid2info_max = FISH_MAX;
195 if(self) self.scale = 1.3;
200 mid2info_model = MAGE_MODEL;
201 mid2info_name = "Mage";
202 mid2info_min = MAGE_MIN;
203 mid2info_max = MAGE_MAX;
208 mid2info_model = SPIDER_MODEL;
209 mid2info_name = "Spider";
210 mid2info_min = SPIDER_MIN;
211 mid2info_max = SPIDER_MAX;
216 dprint("WARNING: Unknown monster in CSQC\n");
223 void monster_changeteam()
225 self.glowmod = Team_ColorRGB(self.team - 1);
226 self.teamradar_color = Team_ColorRGB(self.team - 1);
229 self.colormap = 1024 + (self.team - 1) * 17;
231 self.colormap = 1024;
236 if(self.monsterid == MONSTER_SPIDER)
237 self.angles += '180 0 0';
239 self.solid = SOLID_CORPSE;
246 dt = time - self.move_time;
247 self.move_time = time;
251 fixedmakevectors(self.angles);
252 //movelib_groundalign4point(300, 100, 0.25, 45);
253 setorigin(self, self.origin + self.velocity * dt);
254 self.angles_y = self.move_angles_y;
257 void monster_construct()
259 monster_mid2info(self.monsterid);
260 self.netname = mid2info_name;
262 setorigin(self, self.origin);
263 setmodel(self, mid2info_model);
264 setsize(self, mid2info_min, mid2info_max);
266 self.move_movetype = MOVETYPE_BOUNCE;
268 self.solid = SOLID_BBOX;
269 self.movetype = MOVETYPE_BOUNCE;
270 self.move_origin = self.origin;
271 self.move_time = time;
272 self.drawmask = MASK_NORMAL;
274 self.draw = monster_draw;
284 self.monsterid = ReadByte();
286 self.origin_x = ReadCoord();
287 self.origin_y = ReadCoord();
288 self.origin_z = ReadCoord();
289 setorigin(self, self.origin);
291 self.angles_x = ReadAngle();
292 self.angles_y = ReadAngle();
294 self.skin = ReadByte();
295 self.team = ReadByte();
297 monster_precache(self.monsterid);
299 monster_changeteam();
304 self.move_angles_x = ReadShort();
305 self.move_angles_y = ReadShort();
306 self.angles = self.move_angles;
311 self.origin_x = ReadShort();
312 self.origin_y = ReadShort();
313 self.origin_z = ReadShort();
314 setorigin(self, self.origin);
316 self.velocity_x = ReadShort();
317 self.velocity_y = ReadShort();
318 self.velocity_z = ReadShort();
320 self.move_angles_y = ReadShort();
322 self.move_time = time;
323 self.move_velocity = self.velocity;
324 self.move_origin = self.origin;
329 self.frame1time = ReadCoord();
330 self.frame = ReadByte();
335 self.skin = ReadByte();
339 if(_tmp != self.team)
342 monster_changeteam();
346 if(_tmp == 4) // respawning
347 setmodel(self, "null");
351 if(_tmp == 0 && self.health != 0)