1 // =========================
2 // CSQC Monster Properties
3 // =========================
7 void monster_changeteam()
9 self.glowmod = Team_ColorRGB(self.team - 1);
10 self.teamradar_color = Team_ColorRGB(self.team - 1);
13 self.colormap = 1024 + (self.team - 1) * 17;
20 MON_ACTION(self.monsterid, MR_DEATH);
22 self.solid = SOLID_CORPSE;
27 if(self.netname == "")
30 if(!autocvar_g_waypointsprite_monsters)
33 if(autocvar_cl_hidewaypoints)
39 float dist = vlen(self.origin - view_origin);
40 float t = (GetPlayerColor(player_localnum) + 1);
45 if(autocvar_cl_vehicles_hud_tactical)
46 if(dist < 10240 && t != self.team)
48 // TODO: Vehicle tactical hud
49 o = project_3d_to_2d(self.origin + '0 0 32');
51 || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
52 || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
53 || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
54 || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
55 return; // Dont draw wp's for monsters out of view
65 vector pz = drawgetimagesize("gfx/vehicles/vth-mover.tga") * 0.25;
66 drawpic(o - pz * 0.5, "gfx/vehicles/vth-mover.tga", pz , '1 1 1', 0.75, DRAWFLAG_NORMAL);
72 if(dist > self.maxdistance)
75 string spriteimage = self.netname;
76 float a = self.alpha * autocvar_hud_panel_fg_alpha;
77 vector rgb = spritelookupcolor(spriteimage, self.teamradar_color);
80 if(self.maxdistance > waypointsprite_normdistance)
81 a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent);
82 else if(self.maxdistance > 0)
83 a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
87 self.teamradar_color = '1 0 0';
88 print(sprintf("WARNING: sprite of name %s has no color, using red so you notice it\n", spriteimage));
92 if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
95 txt = spritelookuptext(spriteimage);
97 if(autocvar_g_waypointsprite_uppercase)
98 txt = strtoupper(txt);
109 rgb = fixrgbexcess(rgb);
111 o = project_3d_to_2d(self.origin + '0 0 64');
113 || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
114 || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
115 || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
116 || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
117 return; // Dont draw wp's for monsters out of view
121 float edgedistance_min, crosshairdistance;
122 edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
123 (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
124 (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
125 (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
127 float vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
129 crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
131 t = waypointsprite_scale * vidscale;
132 a *= waypointsprite_alpha;
135 a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
136 t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
138 if (edgedistance_min < waypointsprite_edgefadedistance) {
139 a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
140 t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
142 if(crosshairdistance < waypointsprite_crosshairfadedistance) {
143 a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
144 t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
147 draw_beginBoldFont();
148 o = drawspritearrow(o, M_PI, rgb, a, SPRITE_ARROW_SCALE * t);
149 o = drawspritetext(o, M_PI, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
156 0.5 * SPRITE_HEALTHBAR_WIDTH * t,
157 0.5 * SPRITE_HEALTHBAR_HEIGHT * t,
158 SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize,
159 SPRITE_HEALTHBAR_BORDER * t,
162 a * SPRITE_HEALTHBAR_BORDERALPHA,
164 a * SPRITE_HEALTHBAR_HEALTHALPHA,
174 dt = time - self.move_time;
175 self.move_time = time;
179 fixedmakevectors(self.angles);
180 //movelib_groundalign4point(50, 25, 0.25, 45);
181 setorigin(self, self.origin + self.velocity * dt);
182 self.angles_y = self.move_angles_y;
185 void monster_construct()
187 entity mon = get_monsterinfo(self.monsterid);
189 if(mon.spawnflags & MONSTER_SIZE_BROKEN)
192 self.netname = M_NAME(self.monsterid);
194 setorigin(self, self.origin);
195 setmodel(self, mon.model);
196 setsize(self, mon.mins, mon.maxs);
198 self.move_movetype = MOVETYPE_BOUNCE;
200 self.solid = SOLID_BBOX;
201 self.movetype = MOVETYPE_BOUNCE;
202 self.move_origin = self.origin;
203 self.move_time = time;
204 self.drawmask = MASK_NORMAL;
207 self.draw = monster_draw;
208 self.draw2d = monster_draw2d;
209 self.maxdistance = autocvar_g_waypointsprite_monsters_maxdist;
210 self.teamradar_color = '1 0 0';
220 self.monsterid = ReadByte();
222 self.origin_x = ReadCoord();
223 self.origin_y = ReadCoord();
224 self.origin_z = ReadCoord();
225 setorigin(self, self.origin);
227 self.angles_x = ReadAngle();
228 self.angles_y = ReadAngle();
230 self.skin = ReadByte();
231 self.team = ReadByte();
234 monster_changeteam();
239 self.move_angles_x = ReadShort();
240 self.move_angles_y = ReadShort();
241 self.angles = self.move_angles;
246 self.origin_x = ReadShort();
247 self.origin_y = ReadShort();
248 self.origin_z = ReadShort();
249 setorigin(self, self.origin);
251 self.velocity_x = ReadShort();
252 self.velocity_y = ReadShort();
253 self.velocity_z = ReadShort();
255 self.move_angles_y = ReadShort();
257 self.move_time = time;
258 self.move_velocity = self.velocity;
259 self.move_origin = self.origin;
264 self.frame1time = ReadCoord();
265 self.frame = ReadByte();
270 self.skin = ReadByte();
274 if(_tmp != self.team)
277 monster_changeteam();
281 if(_tmp == 4) // respawning
282 setmodel(self, "null");
286 if(_tmp == 0 && self.health != 0)