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(WYVERN_MODEL);
47 case MONSTER_CERBERUS:
49 precache_model(CERBERUS_MODEL);
54 precache_model(SLIME_MODEL);
55 precache_sound("weapons/rocket_impact.wav");
60 precache_model(KNIGHT_MODEL);
65 precache_model(FISH_MODEL);
70 precache_model(MAGE_MODEL);
75 precache_model(SPIDER_MODEL);
80 monster_precached[_mid] = TRUE;
83 void Monsters_Precache()
86 for(i = MONSTER_FIRST + 1; i < MONSTER_LAST; ++i)
90 void monster_mid2info(float _mid)
96 mid2info_model = ZOMBIE_MODEL;
97 mid2info_name = "Zombie";
98 mid2info_min = ZOMBIE_MIN;
99 mid2info_max = ZOMBIE_MAX;
104 mid2info_model = OGRE_MODEL;
105 mid2info_name = "Ogre";
106 mid2info_min = OGRE_MIN;
107 mid2info_max = OGRE_MAX;
112 mid2info_model = ANIMUS_MODEL;
113 mid2info_name = "Animus";
114 mid2info_min = ANIMUS_MIN;
115 mid2info_max = ANIMUS_MAX;
116 if(self) self.scale = 1.3;
119 case MONSTER_SHAMBLER:
121 mid2info_model = SHAMBLER_MODEL;
122 mid2info_name = "Shambler";
123 mid2info_min = SHAMBLER_MIN;
124 mid2info_max = SHAMBLER_MAX;
125 if(self) self.scale = 1.3;
128 case MONSTER_BRUISER:
130 mid2info_model = BRUISER_MODEL;
131 mid2info_name = "Bruiser";
132 mid2info_min = BRUISER_MIN;
133 mid2info_max = BRUISER_MAX;
134 if(self) self.scale = 1.3;
139 mid2info_model = WYVERN_MODEL;
140 mid2info_name = "Wyvern";
141 mid2info_min = WYVERN_MIN;
142 mid2info_max = WYVERN_MAX;
143 if(self) self.scale = 1.3;
146 case MONSTER_CERBERUS:
148 mid2info_model = CERBERUS_MODEL;
149 mid2info_name = "Cerberus";
150 mid2info_min = CERBERUS_MIN;
151 mid2info_max = CERBERUS_MAX;
156 mid2info_model = SLIME_MODEL;
157 mid2info_name = "Slime";
158 mid2info_min = SLIME_MIN;
159 mid2info_max = SLIME_MAX;
164 mid2info_model = KNIGHT_MODEL;
165 mid2info_name = "Knight";
166 mid2info_min = KNIGHT_MIN;
167 mid2info_max = KNIGHT_MAX;
168 if(self) self.scale = 1.3;
173 mid2info_model = FISH_MODEL;
174 mid2info_name = "Rotfish";
175 mid2info_min = FISH_MIN;
176 mid2info_max = FISH_MAX;
177 if(self) self.scale = 1.3;
182 mid2info_model = MAGE_MODEL;
183 mid2info_name = "Mage";
184 mid2info_min = MAGE_MIN;
185 mid2info_max = MAGE_MAX;
190 mid2info_model = SPIDER_MODEL;
191 mid2info_name = "Spider";
192 mid2info_min = SPIDER_MIN;
193 mid2info_max = SPIDER_MAX;
198 dprint("WARNING: Unknown monster in CSQC\n");
205 void monster_changeteam()
207 self.glowmod = Team_ColorRGB(self.team - 1);
208 self.teamradar_color = Team_ColorRGB(self.team - 1);
211 self.colormap = 1024 + (self.team - 1) * 17;
213 self.colormap = 1024;
218 if(self.monsterid == MONSTER_SPIDER)
219 self.angles += '180 0 0';
221 self.solid = SOLID_CORPSE;
228 dt = time - self.move_time;
229 self.move_time = time;
233 fixedmakevectors(self.angles);
234 //movelib_groundalign4point(300, 100, 0.25, 45);
235 setorigin(self, self.origin + self.velocity * dt);
236 self.angles_y = self.move_angles_y;
239 void monster_construct()
241 monster_mid2info(self.monsterid);
242 self.netname = mid2info_name;
244 setorigin(self, self.origin);
245 setmodel(self, mid2info_model);
246 setsize(self, mid2info_min, mid2info_max);
248 self.move_movetype = MOVETYPE_BOUNCE;
250 self.solid = SOLID_BBOX;
251 self.movetype = MOVETYPE_BOUNCE;
252 self.move_origin = self.origin;
253 self.move_time = time;
254 self.drawmask = MASK_NORMAL;
256 self.draw = monster_draw;
266 self.monsterid = ReadByte();
268 self.origin_x = ReadCoord();
269 self.origin_y = ReadCoord();
270 self.origin_z = ReadCoord();
271 setorigin(self, self.origin);
273 self.angles_x = ReadAngle();
274 self.angles_y = ReadAngle();
276 self.skin = ReadByte();
277 self.team = ReadByte();
279 monster_precache(self.monsterid);
281 monster_changeteam();
286 self.move_angles_x = ReadShort();
287 self.move_angles_y = ReadShort();
288 self.angles = self.move_angles;
293 self.origin_x = ReadShort();
294 self.origin_y = ReadShort();
295 self.origin_z = ReadShort();
296 setorigin(self, self.origin);
298 self.velocity_x = ReadShort();
299 self.velocity_y = ReadShort();
300 self.velocity_z = ReadShort();
302 self.move_angles_y = ReadShort();
304 self.move_time = time;
305 self.move_velocity = self.velocity;
306 self.move_origin = self.origin;
311 self.frame1time = ReadCoord();
312 self.frame = ReadByte();
317 self.skin = ReadByte();
321 if(_tmp != self.team)
324 monster_changeteam();
328 if(_tmp == 4) // respawning
329 setmodel(self, "null");
333 if(_tmp == 0 && self.health != 0)