3 void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove;
4 void() SUB_CalcMoveDone;
5 void() SUB_CalcAngleMoveDone;
6 //void() SUB_UseTargets;
20 void SUB_Remove (void)
29 Makes client invisible or removes non-client
32 void SUB_VanishOrRemove (entity ent)
34 if (ent.flags & FL_CLIENT)
49 void SUB_SetFade_Think (void)
51 self.think = SUB_SetFade_Think;
52 self.nextthink = self.fade_time;
53 self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
54 if (self.alpha < 0.01)
55 SUB_VanishOrRemove(self);
56 self.alpha = bound(0.01, self.alpha, 1);
63 Fade 'ent' out when time >= 'when'
66 void SUB_SetFade (entity ent, float when, float fadetime)
68 //if (ent.flags & FL_CLIENT) // && ent.deadflag != DEAD_NO)
71 ent.fade_rate = 1/fadetime;
73 ent.think = SUB_SetFade_Think;
81 calculate self.velocity and self.nextthink to reach dest from
82 self.origin traveling at speed
85 void SUB_CalcMoveDone (void)
87 // After moving, set origin to exact final destination
89 setorigin (self, self.finaldest);
90 self.velocity = '0 0 0';
96 void SUB_CalcMove (vector tdest, float tspeed, void() func)
102 objerror ("No speed is defined!");
105 self.finaldest = tdest;
106 self.think = SUB_CalcMoveDone;
108 if (tdest == self.origin)
110 self.velocity = '0 0 0';
111 self.nextthink = self.ltime + 0.1;
115 delta = tdest - self.origin;
116 traveltime = vlen (delta) / tspeed;
118 if (traveltime < 0.1)
120 self.velocity = '0 0 0';
121 self.nextthink = self.ltime + 0.1;
125 self.velocity = delta * (1/traveltime); // QuakeC doesn't allow vector/float division
127 self.nextthink = self.ltime + traveltime;
130 void SUB_CalcMoveEnt (entity ent, vector tdest, float tspeed, void() func)
137 SUB_CalcMove (tdest, tspeed, func);
146 calculate self.avelocity and self.nextthink to reach destangle from
149 The calling function should make sure self.think is valid
152 void SUB_CalcAngleMoveDone (void)
154 // After rotating, set angle to exact final angle
155 self.angles = self.finalangle;
156 self.avelocity = '0 0 0';
162 void SUB_CalcAngleMove (vector destangle, float tspeed, void() func)
168 objerror ("No speed is defined!");
170 delta = destangle - self.angles;
171 traveltime = vlen (delta) / tspeed;
173 self.avelocity = delta * (1 / traveltime);
176 self.finalangle = destangle;
178 self.think = SUB_CalcAngleMoveDone;
179 self.nextthink = self.ltime + traveltime;
182 void SUB_CalcAngleMoveEnt (entity ent, vector destangle, float tspeed, void() func)
189 SUB_CalcAngleMove (destangle, tspeed, func);
198 unused but required by the engine
212 Play a sound at the given location
215 void PointSound (vector org, string snd, float vol, float attn)
220 setorigin (speaker, org);
221 sound (speaker, CHAN_BODY, snd, vol, attn);
231 A version of traceline that must be used by SOLID_SLIDEBOX things that want to hit SOLID_CORPSE things with a trace attack
234 void traceline_hitcorpse (entity source, vector v1, vector v2, float nomonst, entity forent)
238 oldsolid = source.solid;
239 source.solid = SOLID_BBOX;
241 traceline (v1, v2, nomonst, forent);
243 source.solid = oldsolid;
250 Returns a point at least 12 units away from walls
251 (useful for explosion animations, although the blast is performed where it really happened)
255 vector findbetterlocation (vector org, float mindist)
261 vec = mindist * '1 0 0';
265 traceline (org, org + vec, TRUE, world);
267 if (trace_fraction < 1)
270 traceline (loc, loc + vec, TRUE, world);
271 if (trace_fraction >= 1)
290 Returns a random number between -1.0 and 1.0
295 return 2 * (random () - 0.5);
300 Angc used for animations
305 float angc (float a1, float a2)
337 if (self.movedir != '0 0 0')
338 self.movedir = normalize(self.movedir);
341 if (self.angles == '0 -1 0')
342 self.movedir = '0 0 1';
343 else if (self.angles == '0 -2 0')
344 self.movedir = '0 0 -1';
347 makevectors (self.angles);
348 self.movedir = v_forward;
352 self.angles = '0 0 0';
357 // trigger angles are used for one-way touches. An angle of 0 is assumed
358 // to mean no restrictions, so use a yaw of 360 instead.
359 if (self.movedir == '0 0 0')
360 if (self.angles != '0 0 0')
362 self.solid = SOLID_TRIGGER;
363 setmodel (self, self.model); // set size and link into world, no precision needed
364 self.movetype = MOVETYPE_NONE;
369 void() InitSolidBSPTrigger =
371 // trigger angles are used for one-way touches. An angle of 0 is assumed
372 // to mean no restrictions, so use a yaw of 360 instead.
373 if (self.movedir == '0 0 0')
374 if (self.angles != '0 0 0')
376 self.solid = SOLID_BSP;
377 setmodel (self, self.model); // set size and link into world, no precision needed
378 self.movetype = MOVETYPE_PUSH;
379 // self.modelindex = 0;