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(DEMON_MODEL);
32 case MONSTER_SHAMBLER:
34 precache_model(SHAMBLER_MODEL);
39 precache_model(KNIGHT_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(WIZARD_MODEL);
59 precache_model(DOG_MODEL);
64 precache_model(TARBABY_MODEL);
65 precache_sound("weapons/rocket_impact.wav");
68 case MONSTER_HELLKNIGHT:
70 precache_model(HELLKNIGHT_MODEL);
75 precache_model(FISH_MODEL);
80 precache_model(SHALRATH_MODEL);
83 case MONSTER_ENFORCER:
85 precache_model(ENFORCER_MODEL);
86 precache_model("models/turrets/ewheel-gun1.md3");
91 precache_model(SPIDER_MODEL);
96 monster_precached[_mid] = TRUE;
99 void Monsters_Precache()
102 for(i = MONSTER_FIRST; i <= MONSTER_LAST; ++i)
106 void monster_mid2info(float _mid)
112 mid2info_model = ZOMBIE_MODEL;
113 mid2info_name = "Zombie";
114 mid2info_min = ZOMBIE_MIN;
115 mid2info_max = ZOMBIE_MAX;
120 mid2info_model = OGRE_MODEL;
121 mid2info_name = "Ogre";
122 mid2info_min = OGRE_MIN;
123 mid2info_max = OGRE_MAX;
128 mid2info_model = DEMON_MODEL;
129 mid2info_name = "Fiend";
130 mid2info_min = DEMON_MIN;
131 mid2info_max = DEMON_MAX;
134 case MONSTER_SHAMBLER:
136 mid2info_model = SHAMBLER_MODEL;
137 mid2info_name = "Shambler";
138 mid2info_min = SHAMBLER_MIN;
139 mid2info_max = SHAMBLER_MAX;
144 mid2info_model = KNIGHT_MODEL;
145 mid2info_name = "Knight";
146 mid2info_min = KNIGHT_MIN;
147 mid2info_max = KNIGHT_MAX;
152 mid2info_model = SOLDIER_MODEL;
153 mid2info_name = "Marine";
154 mid2info_min = SOLDIER_MIN;
155 mid2info_max = SOLDIER_MAX;
160 mid2info_model = WIZARD_MODEL;
161 mid2info_name = "Scrag";
162 mid2info_min = WIZARD_MIN;
163 mid2info_max = WIZARD_MAX;
168 mid2info_model = DOG_MODEL;
169 mid2info_name = "Cerberus";
170 mid2info_min = DOG_MIN;
171 mid2info_max = DOG_MAX;
174 case MONSTER_TARBABY:
176 mid2info_model = TARBABY_MODEL;
177 mid2info_name = "Spawn";
178 mid2info_min = TARBABY_MIN;
179 mid2info_max = TARBABY_MAX;
182 case MONSTER_HELLKNIGHT:
184 mid2info_model = HELLKNIGHT_MODEL;
185 mid2info_name = "Hell-Knight";
186 mid2info_min = HELLKNIGHT_MIN;
187 mid2info_max = HELLKNIGHT_MAX;
192 mid2info_model = FISH_MODEL;
193 mid2info_name = "Rotfish";
194 mid2info_min = FISH_MIN;
195 mid2info_max = FISH_MAX;
200 mid2info_model = SHALRATH_MODEL;
201 mid2info_name = "Mage";
202 mid2info_min = SHALRATH_MIN;
203 mid2info_max = SHALRATH_MAX;
206 case MONSTER_ENFORCER:
208 mid2info_model = ENFORCER_MODEL;
209 mid2info_name = "Enforcer";
210 mid2info_min = ENFORCER_MIN;
211 mid2info_max = ENFORCER_MAX;
216 mid2info_model = SPIDER_MODEL;
217 mid2info_name = "Spider";
218 mid2info_min = SPIDER_MIN;
219 mid2info_max = SPIDER_MAX;
224 dprint("WARNING: Unknown monster in CSQC\n");
231 void monster_changeteam()
233 switch(self.team - 1)
235 case NUM_TEAM_1: // Red
237 self.glowmod = '2 0 0';
238 self.teamradar_color = '1 0 0';
241 case NUM_TEAM_2: // Blue
243 self.glowmod = '0 0 2';
244 self.teamradar_color = '0 0 1';
247 case NUM_TEAM_3: // Yellow
249 self.glowmod = '1 1 0';
250 self.teamradar_color = '1 1 0';
253 case NUM_TEAM_4: // Pink
255 self.glowmod = '1 0 1';
256 self.teamradar_color = '1 0 1';
262 self.colormap = 1024 + (self.team - 1) * 17;
269 dt = time - self.move_time;
270 self.move_time = time;
274 fixedmakevectors(self.angles);
275 //movelib_groundalign4point(300, 100, 0.25, 45);
276 setorigin(self, self.origin + self.velocity * dt);
277 self.angles_y = self.move_angles_y;
280 void monster_construct()
282 monster_mid2info(self.monsterid);
283 self.netname = mid2info_name;
285 setorigin(self, self.origin);
286 setmodel(self, mid2info_model);
287 setsize(self, mid2info_min, mid2info_max);
289 self.move_movetype = MOVETYPE_BOUNCE;
291 self.solid = SOLID_BBOX;
292 self.movetype = MOVETYPE_BOUNCE;
293 self.move_origin = self.origin;
294 self.move_time = time;
295 self.drawmask = MASK_NORMAL;
297 self.draw = monster_draw;
307 self.monsterid = ReadByte();
309 self.origin_x = ReadCoord();
310 self.origin_y = ReadCoord();
311 self.origin_z = ReadCoord();
312 setorigin(self, self.origin);
314 self.angles_x = ReadAngle();
315 self.angles_y = ReadAngle();
317 self.scale = ReadByte();
318 self.skin = ReadByte();
320 monster_precache(self.monsterid);
322 self.colormap = 1024;
323 self.glowmod = '0 1 1';
328 self.scale = ReadByte();
329 self.mins_x = ReadCoord();
330 self.mins_y = ReadCoord();
331 self.mins_z = ReadCoord();
333 self.maxs_x = ReadCoord();
334 self.maxs_y = ReadCoord();
335 self.maxs_z = ReadCoord();
337 setsize(self, self.mins, self.maxs);
342 self.move_angles_x = ReadShort();
343 self.move_angles_y = ReadShort();
344 self.angles = self.move_angles;
349 self.origin_x = ReadShort();
350 self.origin_y = ReadShort();
351 self.origin_z = ReadShort();
352 setorigin(self, self.origin);
354 self.velocity_x = ReadShort();
355 self.velocity_y = ReadShort();
356 self.velocity_z = ReadShort();
358 self.move_angles_y = ReadShort();
360 self.move_time = time;
361 self.move_velocity = self.velocity;
362 self.move_origin = self.origin;
367 self.frame1time = ReadCoord();
368 self.frame = ReadByte();
373 self.skin = ReadByte();
377 if(_tmp != self.team)
380 monster_changeteam();
385 if(_tmp == 0 && self.health != 0)
386 if(self.monsterid == MONSTER_SPIDER)
387 self.angles += '180 0 0';