Xonotic
walker.qc
Go to the documentation of this file.
1 #include "walker.qh"
2 
3 #ifdef SVQC
4 
5 float autocvar_g_turrets_unit_walker_melee_damage;
6 float autocvar_g_turrets_unit_walker_melee_force;
7 float autocvar_g_turrets_unit_walker_melee_range;
8 float autocvar_g_turrets_unit_walker_rocket_damage;
9 float autocvar_g_turrets_unit_walker_rocket_radius;
10 float autocvar_g_turrets_unit_walker_rocket_force;
11 float autocvar_g_turrets_unit_walker_rocket_speed;
12 float autocvar_g_turrets_unit_walker_rocket_range;
13 float autocvar_g_turrets_unit_walker_rocket_range_min;
14 float autocvar_g_turrets_unit_walker_rocket_refire;
15 float autocvar_g_turrets_unit_walker_rocket_turnrate;
16 float autocvar_g_turrets_unit_walker_speed_stop;
17 float autocvar_g_turrets_unit_walker_speed_walk;
18 float autocvar_g_turrets_unit_walker_speed_run;
19 float autocvar_g_turrets_unit_walker_speed_jump;
20 float autocvar_g_turrets_unit_walker_speed_swim;
21 float autocvar_g_turrets_unit_walker_speed_roam;
22 float autocvar_g_turrets_unit_walker_turn;
23 float autocvar_g_turrets_unit_walker_turn_walk;
24 float autocvar_g_turrets_unit_walker_turn_strafe;
25 float autocvar_g_turrets_unit_walker_turn_swim;
26 float autocvar_g_turrets_unit_walker_turn_run;
27 
28 const int ANIM_NO = 0;
29 const int ANIM_TURN = 1;
30 const int ANIM_WALK = 2;
31 const int ANIM_RUN = 3;
32 const int ANIM_STRAFE_L = 4;
33 const int ANIM_STRAFE_R = 5;
34 const int ANIM_JUMP = 6;
35 const int ANIM_LAND = 7;
36 const int ANIM_PAIN = 8;
37 const int ANIM_MELEE = 9;
38 const int ANIM_SWIM = 10;
39 const int ANIM_ROAM = 11;
40 
41 .float animflag;
42 .float idletime;
43 
44 bool walker_firecheck(entity this)
45 {
46  if (this.animflag == ANIM_MELEE)
47  return false;
48 
49  return turret_firecheck(this);
50 }
51 
52 void walker_melee_do_dmg(entity this)
53 {
54  vector where;
55  entity e;
56 
57  makevectors(this.angles);
58  where = this.origin + v_forward * 128;
59 
60  e = findradius(where,32);
61  while (e)
62  {
64  if (e != this && e.owner != this)
65  Damage(e, this, this, (autocvar_g_turrets_unit_walker_melee_damage), DEATH_TURRET_WALK_MELEE.m_id, DMG_NOWEP, '0 0 0', v_forward * (autocvar_g_turrets_unit_walker_melee_force));
66 
67  e = e.chain;
68  }
69 }
70 
71 void walker_setnoanim(entity this)
72 {
73  turrets_setframe(this, ANIM_NO, false);
74  this.animflag = this.frame;
75 }
76 void walker_rocket_explode(entity this)
77 {
78  RadiusDamage (this, this.owner, (autocvar_g_turrets_unit_walker_rocket_damage), 0, (autocvar_g_turrets_unit_walker_rocket_radius), this, NULL, (autocvar_g_turrets_unit_walker_rocket_force), DEATH_TURRET_WALK_ROCKET.m_id, DMG_NOWEP, NULL);
79  delete(this);
80 }
81 
82 void walker_rocket_touch(entity this, entity toucher)
83 {
84  walker_rocket_explode(this);
85 }
86 
87 void walker_rocket_damage(entity this, entity inflictor, entity attacker, float damage, float deathtype, .entity weaponentity, vector hitloc, vector vforce)
88 {
89  TakeResource(this, RES_HEALTH, damage);
90  this.velocity = this.velocity + vforce;
91 
92  if (GetResource(this, RES_HEALTH) <= 0)
93  W_PrepareExplosionByDamage(this, this.owner, walker_rocket_explode);
94 }
95 
96 #define WALKER_ROCKET_MOVE(s) movelib_move_simple((s), newdir, (autocvar_g_turrets_unit_walker_rocket_speed), (autocvar_g_turrets_unit_walker_rocket_turnrate)); UpdateCSQCProjectile(s)
97 void walker_rocket_loop(entity this);
98 void walker_rocket_think(entity this)
99 {
100  vector newdir;
101  float edist;
102  float itime;
103  float m_speed;
104 
105  this.nextthink = time;
106 
107  edist = vlen(this.enemy.origin - this.origin);
108 
109  // Simulate crude guidance
110  if (this.cnt < time)
111  {
112  if (edist < 1000)
113  this.tur_shotorg = randomvec() * min(edist, 64);
114  else
115  this.tur_shotorg = randomvec() * min(edist, 256);
116 
117  this.cnt = time + 0.5;
118  }
119 
120  if (edist < 128)
121  this.tur_shotorg = '0 0 0';
122 
123  if (this.max_health < time)
124  {
125  setthink(this, walker_rocket_explode);
126  this.nextthink = time;
127  return;
128  }
129 
130  if (this.shot_dmg != 1337 && random() < 0.01)
131  {
132  walker_rocket_loop(this);
133  return;
134  }
135 
136  m_speed = vlen(this.velocity);
137 
138  // Enemy dead? just keep on the current heading then.
139  if (this.enemy == NULL || IS_DEAD(this.enemy))
140  this.enemy = NULL;
141 
142  if (this.enemy)
143  {
144  itime = max(edist / m_speed, 1);
145  newdir = steerlib_pull(this, this.enemy.origin + this.tur_shotorg);
146  }
147  else
148  newdir = normalize(this.velocity);
149 
150  WALKER_ROCKET_MOVE(this);
151 }
152 
153 void walker_rocket_loop3(entity this)
154 {
155  this.nextthink = time;
156 
157  if (this.max_health < time)
158  {
159  setthink(this, walker_rocket_explode);
160  return;
161  }
162 
163  if(vdist(this.origin - this.tur_shotorg, <, 100))
164  {
165  setthink(this, walker_rocket_think);
166  return;
167  }
168 
169  vector newdir = steerlib_pull(this, this.tur_shotorg);
170  WALKER_ROCKET_MOVE(this);
171 
172  this.angles = vectoangles(this.velocity);
173 }
174 
175 void walker_rocket_loop2(entity this)
176 {
177  this.nextthink = time;
178 
179  if (this.max_health < time)
180  {
181  setthink(this, walker_rocket_explode);
182  return;
183  }
184 
185  if(vdist(this.origin - this.tur_shotorg, <, 100))
186  {
187  this.tur_shotorg = this.origin - '0 0 200';
188  setthink(this, walker_rocket_loop3);
189  return;
190  }
191 
192  vector newdir = steerlib_pull(this, this.tur_shotorg);
193  WALKER_ROCKET_MOVE(this);
194 }
195 
196 void walker_rocket_loop(entity this)
197 {
198  this.nextthink = time;
199  this.tur_shotorg = this.origin + '0 0 300';
200  setthink(this, walker_rocket_loop2);
201  this.shot_dmg = 1337;
202 }
203 
204 void walker_fire_rocket(entity this, vector org)
205 {
206  fixedmakevectors(this.angles);
207 
208  te_explosion (org);
209 
210  entity rocket = new(walker_rocket);
211  setorigin(rocket, org);
212 
213  sound (this, CH_WEAPON_A, SND_HAGAR_FIRE, VOL_BASE, ATTEN_NORM);
214  setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
215 
216  rocket.owner = this;
217  rocket.bot_dodge = true;
218  rocket.bot_dodgerating = 50;
219  rocket.takedamage = DAMAGE_YES;
220  rocket.damageforcescale = 2;
221  SetResourceExplicit(rocket, RES_HEALTH, 25);
222  rocket.tur_shotorg = randomvec() * 512;
223  rocket.cnt = time + 1;
224  rocket.enemy = this.enemy;
225 
226  if (random() < 0.01)
227  setthink(rocket, walker_rocket_loop);
228  else
229  setthink(rocket, walker_rocket_think);
230 
231  rocket.event_damage = walker_rocket_damage;
232 
233  rocket.nextthink = time;
234  set_movetype(rocket, MOVETYPE_FLY);
235  rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * (autocvar_g_turrets_unit_walker_rocket_speed);
236  rocket.angles = vectoangles(rocket.velocity);
237  settouch(rocket, walker_rocket_touch);
238  rocket.flags = FL_PROJECTILE;
239  IL_PUSH(g_projectiles, rocket);
240  IL_PUSH(g_bot_dodge, rocket);
241  rocket.solid = SOLID_BBOX;
242  rocket.max_health = time + 9;
243  rocket.missile_flags = MIF_SPLASH | MIF_PROXY | MIF_GUIDED_HEAT;
244 
245  CSQCProjectile(rocket, false, PROJECTILE_ROCKET, false); // no culling, has fly sound
246 }
247 
248 .vector enemy_last_loc;
249 .float enemy_last_time;
250 void walker_move_to(entity this, vector _target, float _dist)
251 {
252  switch (this.waterlevel)
253  {
254  case WATERLEVEL_NONE:
255  if (_dist > 500)
256  this.animflag = ANIM_RUN;
257  else
258  this.animflag = ANIM_WALK;
259  case WATERLEVEL_WETFEET:
260  case WATERLEVEL_SWIMMING:
261  if (this.animflag != ANIM_SWIM)
262  this.animflag = ANIM_WALK;
263  else
264  this.animflag = ANIM_SWIM;
265  break;
267  this.animflag = ANIM_SWIM;
268  }
269 
270  this.moveto = _target;
271  this.steerto = steerlib_attract2(this, this.moveto, 0.5, 500, 0.95);
272 
273  if(this.enemy)
274  {
275  this.enemy_last_loc = _target;
276  this.enemy_last_time = time;
277  }
278 }
279 
280 void walker_move_path(entity this)
281 {
282 #ifdef WALKER_FANCYPATHING
283  // Are we close enougth to a path node to switch to the next?
284  if(turret_closetotarget(this, this.pathcurrent.origin))
285  {
286  if (this.pathcurrent.path_next == NULL)
287  {
288  // Path endpoint reached
289  pathlib_deletepath(this.pathcurrent.owner);
290  this.pathcurrent = NULL;
291 
292  if (this.pathgoal)
293  {
294  if (this.pathgoal.use)
295  this.pathgoal.use(this, NULL, NULL);
296 
297  if (this.pathgoal.enemy)
298  {
299  this.pathcurrent = pathlib_astar(this, this.pathgoal.origin, this.pathgoal.enemy.origin);
300  this.pathgoal = this.pathgoal.enemy;
301  }
302  }
303  else
304  this.pathgoal = NULL;
305  }
306  else
307  this.pathcurrent = this.pathcurrent.path_next;
308  }
309 
310  this.moveto = this.pathcurrent.origin;
311  this.steerto = steerlib_attract2(this, this.moveto,0.5,500,0.95);
312  walker_move_to(this, this.moveto, 0);
313 
314 #else
315  if(turret_closetotarget(this, this.pathcurrent.origin))
316  this.pathcurrent = this.pathcurrent.enemy;
317 
318  if(!this.pathcurrent)
319  return;
320 
321  this.moveto = this.pathcurrent.origin;
322  this.steerto = steerlib_attract2(this, this.moveto, 0.5, 500, 0.95);
323  walker_move_to(this, this.moveto, 0);
324 #endif
325 }
326 
327 void walker_findtarget(entity this)
328 {
329  entity e = find(NULL, targetname, this.target);
330  if (!e)
331  {
332  LOG_TRACE("Initital waypoint for walker does NOT exist, fix your map!");
333  this.target = "";
334  }
335 
336  if (e.classname != "turret_checkpoint")
337  LOG_TRACE("Warning: not a turrret path");
338  else
339  {
340 #ifdef WALKER_FANCYPATHING
341  this.pathcurrent = pathlib_astar(this, this.origin, e.origin);
342  this.pathgoal = e;
343 #else
344  this.pathcurrent = e;
345 #endif
346  }
347 
348  // TODO: this doesn't reset target, so tur_defend will be the checkpoint too!
349 }
350 
351 spawnfunc(turret_walker) { if(!turret_initialize(this, TUR_WALKER)) delete(this); }
352 
353 METHOD(WalkerTurret, tr_think, void(WalkerTurret thistur, entity it))
354 {
355  fixedmakevectors(it.angles);
356 
357  if ((it.spawnflags & TSF_NO_PATHBREAK) && it.pathcurrent)
358  walker_move_path(it);
359  else if (it.enemy == NULL)
360  {
361  if(it.pathcurrent)
362  walker_move_path(it);
363  else
364  {
365  if(it.enemy_last_time != 0)
366  {
367  if(vdist(it.origin - it.enemy_last_loc, <, 128) || time - it.enemy_last_time > 10)
368  it.enemy_last_time = 0;
369  else
370  walker_move_to(it, it.enemy_last_loc, 0);
371  }
372  else
373  {
374  if(it.animflag != ANIM_NO)
375  {
376  traceline(it.origin + '0 0 64', it.origin + '0 0 64' + v_forward * 128, MOVE_NORMAL, it);
377 
378  if(trace_fraction != 1.0)
379  it.tur_head.idletime = -1337;
380  else
381  {
382  traceline(trace_endpos, trace_endpos - '0 0 256', MOVE_NORMAL, it);
383  if(trace_fraction == 1.0)
384  it.tur_head.idletime = -1337;
385  }
386 
387  if(it.tur_head.idletime == -1337)
388  {
389  it.moveto = it.origin + randomvec() * 256;
390  it.tur_head.idletime = 0;
391  }
392 
393  it.moveto = it.moveto * 0.9 + ((it.origin + v_forward * 500) + randomvec() * 400) * 0.1;
394  it.moveto_z = it.origin_z + 64;
395  walker_move_to(it, it.moveto, 0);
396  }
397 
398  if(it.idletime < time)
399  {
400  if(random() < 0.5 || !(it.spawnflags & TSL_ROAM))
401  {
402  it.idletime = time + 1 + random() * 5;
403  it.moveto = it.origin;
404  it.animflag = ANIM_NO;
405  }
406  else
407  {
408  it.animflag = ANIM_WALK;
409  it.idletime = time + 4 + random() * 2;
410  it.moveto = it.origin + randomvec() * 256;
411  it.tur_head.moveto = it.moveto;
412  it.tur_head.idletime = 0;
413  }
414  }
415  }
416  }
417  }
418  else
419  {
420  if (it.tur_dist_enemy < (autocvar_g_turrets_unit_walker_melee_range) && it.animflag != ANIM_MELEE)
421  {
422  vector wish_angle;
423 
424  wish_angle = angleofs(it, it.enemy);
425  if (it.animflag != ANIM_SWIM)
426  if (fabs(wish_angle_y) < 15)
427  {
428  it.moveto = it.enemy.origin;
429  it.steerto = steerlib_attract2(it, it.moveto, 0.5, 500, 0.95);
430  it.animflag = ANIM_MELEE;
431  }
432  }
433  else if (it.tur_head.attack_finished_single[0] < time)
434  {
435  if(it.tur_head.shot_volly)
436  {
437  it.animflag = ANIM_NO;
438 
439  it.tur_head.shot_volly = it.tur_head.shot_volly -1;
440  if(it.tur_head.shot_volly == 0)
441  it.tur_head.attack_finished_single[0] = time + (autocvar_g_turrets_unit_walker_rocket_refire);
442  else
443  it.tur_head.attack_finished_single[0] = time + 0.2;
444 
445  if(it.tur_head.shot_volly > 1)
446  walker_fire_rocket(it, gettaginfo(it, gettagindex(it, "tag_rocket01")));
447  else
448  walker_fire_rocket(it, gettaginfo(it, gettagindex(it, "tag_rocket02")));
449  }
450  else
451  {
452  if (it.tur_dist_enemy > (autocvar_g_turrets_unit_walker_rocket_range_min))
453  if (it.tur_dist_enemy < (autocvar_g_turrets_unit_walker_rocket_range))
454  it.tur_head.shot_volly = 4;
455  }
456  }
457  else
458  {
459  if (it.animflag != ANIM_MELEE)
460  walker_move_to(it, it.enemy.origin, it.tur_dist_enemy);
461  }
462  }
463 
464  {
465  vector real_angle;
466  float turny = 0, turnx = 0;
467  float vz;
468 
469  real_angle = vectoangles(it.steerto) - it.angles;
470  vz = it.velocity_z;
471 
472  switch (it.animflag)
473  {
474  case ANIM_NO:
475  movelib_brake_simple(it, (autocvar_g_turrets_unit_walker_speed_stop));
476  break;
477 
478  case ANIM_TURN:
479  turny = (autocvar_g_turrets_unit_walker_turn);
480  movelib_brake_simple(it, (autocvar_g_turrets_unit_walker_speed_stop));
481  break;
482 
483  case ANIM_WALK:
484  turny = (autocvar_g_turrets_unit_walker_turn_walk);
485  movelib_move_simple(it, v_forward, (autocvar_g_turrets_unit_walker_speed_walk), 0.6);
486  break;
487 
488  case ANIM_RUN:
489  turny = (autocvar_g_turrets_unit_walker_turn_run);
490  movelib_move_simple(it, v_forward, (autocvar_g_turrets_unit_walker_speed_run), 0.6);
491  break;
492 
493  case ANIM_STRAFE_L:
494  turny = (autocvar_g_turrets_unit_walker_turn_strafe);
495  movelib_move_simple(it, v_right * -1, (autocvar_g_turrets_unit_walker_speed_walk), 0.8);
496  break;
497 
498  case ANIM_STRAFE_R:
499  turny = (autocvar_g_turrets_unit_walker_turn_strafe);
500  movelib_move_simple(it, v_right, (autocvar_g_turrets_unit_walker_speed_walk), 0.8);
501  break;
502 
503  case ANIM_JUMP:
504  it.velocity += '0 0 1' * (autocvar_g_turrets_unit_walker_speed_jump);
505  break;
506 
507  case ANIM_LAND:
508  break;
509 
510  case ANIM_PAIN:
511  if(it.frame != ANIM_PAIN)
512  defer(it, 0.25, walker_setnoanim);
513 
514  break;
515 
516  case ANIM_MELEE:
517  if(it.frame != ANIM_MELEE)
518  {
519  defer(it, 0.41, walker_setnoanim);
520  defer(it, 0.21, walker_melee_do_dmg);
521  }
522 
523  movelib_brake_simple(it, (autocvar_g_turrets_unit_walker_speed_stop));
524  break;
525 
526  case ANIM_SWIM:
527  turny = (autocvar_g_turrets_unit_walker_turn_swim);
528  turnx = (autocvar_g_turrets_unit_walker_turn_swim);
529 
530  it.angles_x += bound(-10, shortangle_f(real_angle_x, it.angles_x), 10);
531  movelib_move_simple(it, v_forward, (autocvar_g_turrets_unit_walker_speed_swim), 0.3);
532  vz = it.velocity_z + sin(time * 4) * 8;
533  break;
534 
535  case ANIM_ROAM:
536  turny = (autocvar_g_turrets_unit_walker_turn_walk);
537  movelib_move_simple(it, v_forward ,(autocvar_g_turrets_unit_walker_speed_roam), 0.5);
538  break;
539  }
540 
541  if(turny)
542  {
543  turny = bound( turny * -1, shortangle_f(real_angle_y, it.angles_y), turny );
544  it.angles_y += turny;
545  }
546 
547  if(turnx)
548  {
549  turnx = bound( turnx * -1, shortangle_f(real_angle_x, it.angles_x), turnx );
550  it.angles_x += turnx;
551  }
552 
553  it.velocity_z = vz;
554  }
555 
556 
557  if(it.origin != it.oldorigin)
558  it.SendFlags |= TNSF_MOVE;
559 
560  it.oldorigin = it.origin;
561  turrets_setframe(it, it.animflag, false);
562 }
563 METHOD(WalkerTurret, tr_death, void(WalkerTurret this, entity it))
564 {
565 #ifdef WALKER_FANCYPATHING
566  if (it.pathcurrent)
567  pathlib_deletepath(it.pathcurrent.owner);
568 #endif
569  it.pathcurrent = NULL;
570 }
571 METHOD(WalkerTurret, tr_setup, void(WalkerTurret this, entity it))
572 {
573  it.ticrate = 0.05;
574 
575  // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
576  if(it.move_movetype == MOVETYPE_WALK)
577  {
578  if(it.pos1)
579  setorigin(it, it.pos1);
580  if(it.pos2)
581  it.angles = it.pos2;
582  }
583 
585  it.aim_flags = TFL_AIM_LEAD;
586  it.turret_flags |= TUR_FLAG_HITSCAN;
587 
590  it.iscreature = true;
591  it.teleportable = TELEPORT_NORMAL;
592  if(!it.damagedbycontents)
594  it.damagedbycontents = true;
595  it.solid = SOLID_SLIDEBOX;
596  it.takedamage = DAMAGE_AIM;
597  if(it.move_movetype != MOVETYPE_WALK)
598  {
599  setorigin(it, it.origin);
600  tracebox(it.origin + '0 0 128', it.mins, it.maxs, it.origin - '0 0 10000', MOVE_NORMAL, it);
601  setorigin(it, trace_endpos + '0 0 4');
602  it.pos1 = it.origin;
603  it.pos2 = it.angles;
604  }
606  it.idle_aim = '0 0 0';
607  it.turret_firecheckfunc = walker_firecheck;
608 
609  if (it.target != "")
610  InitializeEntity(it, walker_findtarget, INITPRIO_FINDTARGET);
611 }
612 
613 #endif // SVQC
614 #ifdef CSQC
615 
616 #include <common/physics/movelib.qh>
617 
618 void walker_draw(entity this)
619 {
620  float dt;
621 
622  dt = time - this.move_time;
623  this.move_time = time;
624  if(dt <= 0)
625  return;
626 
627  fixedmakevectors(this.angles);
628  movelib_groundalign4point(this, 300, 100, 0.25, 45);
629  setorigin(this, this.origin + this.velocity * dt);
630  this.tur_head.angles += dt * this.tur_head.avelocity;
631 
632  if(GetResource(this, RES_HEALTH) < 127)
633  if(random() < 0.15)
634  te_spark(this.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
635 }
636 
637 METHOD(WalkerTurret, tr_setup, void(WalkerTurret this, entity it))
638 {
639  it.gravity = 1;
641  it.move_time = time;
642  it.draw = walker_draw;
643 }
644 
645 #endif // CSQC
const float SOLID_SLIDEBOX
Definition: csprogsdefs.qc:247
vector tur_shotorg
Definition: sv_turrets.qh:31
float MOVETYPE_WALK
Definition: progsdefs.qc:249
float turret_validate_target(entity e_turret, entity e_target, float validate_flags)
void movelib_groundalign4point(entity this, float spring_length, float spring_up, float blendrate, float _max)
Definition: movelib.qc:185
const int WATERLEVEL_SUBMERGED
Definition: movetypes.qh:14
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
Definition: cl_resources.qc:15
entity pathgoal
Definition: sv_turrets.qh:89
const int MIF_SPLASH
Definition: common.qh:34
float waterlevel
Definition: progsdefs.qc:181
const int TELEPORT_NORMAL
Definition: teleporters.qh:26
entity pathlib_astar(entity this, vector from, vector to)
Definition: main.qc:353
vector steerto
Definition: steerlib.qh:3
entity tur_head
Definition: sv_turrets.qh:29
IntrusiveList g_damagedbycontents
Definition: damage.qh:155
entity() spawn
float DAMAGE_AIM
Definition: progsdefs.qc:284
int target_validate_flags
Definition: turret.qh:62
const float MOVE_NORMAL
Definition: csprogsdefs.qc:252
bool turret_initialize(entity this, Turret tur)
spawnfunc(info_player_attacker)
Definition: sv_assault.qc:283
origin
Definition: ent_cs.qc:114
void turrets_setframe(entity this, float _frame, float client_only)
#define gettaginfo
Definition: post.qh:32
float MOVETYPE_BOUNCE
Definition: progsdefs.qc:256
#define METHOD(cname, name, prototype)
Definition: oo.qh:257
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
#define DMG_NOWEP
Definition: damage.qh:126
entity owner
Definition: main.qh:73
const int TFL_AMMO_RECHARGE
Definition: turret.qh:143
#define gettagindex
Definition: dpextensions.qh:16
IntrusiveList g_bot_dodge
Definition: api.qh:150
const int WATERLEVEL_NONE
Definition: movetypes.qh:11
void TakeResource(entity receiver, Resource res_type, float amount)
Takes an entity some resource.
Definition: cl_resources.qc:31
const int TFL_TARGETSELECT_PLAYERS
Definition: turret.qh:65
const int TFL_TARGETSELECT_LOS
Definition: turret.qh:64
RES_HEALTH
Definition: ent_cs.qc:126
entity enemy
Definition: sv_ctf.qh:143
float cnt
Definition: powerups.qc:24
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
const int CH_WEAPON_A
Definition: sound.qh:7
vector v_up
Definition: csprogsdefs.qc:31
#define angleofs(from, to)
Definition: angle.qc:90
const int PROJECTILE_ROCKET
Definition: projectiles.qh:4
const int TFL_AMMO_BULLETS
Definition: turret.qh:141
void W_PrepareExplosionByDamage(entity this, entity attacker, void(entity this) explode)
Definition: common.qc:91
const int TFL_AIM_LEAD
Definition: turret.qh:82
bool turret_firecheck(entity this)
#define NULL
Definition: post.qh:17
float max_health
ERASEABLE float shortangle_f(float ang1, float ang2)
Definition: angle.qc:29
const float VOL_BASE
Definition: sound.qh:36
vector trace_endpos
Definition: csprogsdefs.qc:37
const int TFL_AMMO_RECIEVE
Definition: turret.qh:144
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition: damage.qc:583
const int TSF_NO_PATHBREAK
Definition: turret.qh:162
const int TSL_ROAM
Definition: turret.qh:164
const int WATERLEVEL_WETFEET
Definition: movetypes.qh:12
#define IS_DEAD(s)
Definition: utils.qh:26
const float ATTEN_NORM
Definition: sound.qh:30
float nextthink
Definition: csprogsdefs.qc:121
entity pathcurrent
Definition: sv_turrets.qh:87
vector(float skel, float bonenum) _skel_get_boneabs_hidden
IntrusiveList g_projectiles
Definition: common.qh:46
const int TFL_TARGETSELECT_TEAMCHECK
Definition: turret.qh:70
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
Definition: cl_resources.qc:10
void InitializeEntity(entity e, void(entity this) func, int order)
Definition: world.qc:2146
float move_time
Definition: movetypes.qh:77
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
#define LOG_TRACE(...)
Definition: log.qh:81
vector steerlib_attract2(entity this, vector point, float min_influense, float max_distance, float max_influense)
Definition: steerlib.qc:45
bool turret_closetotarget(entity this, vector targ)
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
Definition: damage.qc:1057
string targetname
Definition: progsdefs.qc:194
vector v_right
Definition: csprogsdefs.qc:31
const int WATERLEVEL_SWIMMING
Definition: movetypes.qh:13
const float SOLID_BBOX
Definition: csprogsdefs.qc:246
float frame
primary framegroup animation (strength = 1 - lerpfrac - lerpfrac3 - lerpfrac4)
Definition: anim.qh:6
setorigin(ent, v)
#define setthink(e, f)
vector angles
Definition: csprogsdefs.qc:104
const int MIF_GUIDED_HEAT
Definition: common.qh:38
string target
Definition: progsdefs.qc:193
#define sound(e, c, s, v, a)
Definition: sound.qh:52
#define steerlib_pull(ent, point)
Uniform pull towards a point.
Definition: steerlib.qc:8
void pathlib_deletepath(entity start)
Definition: main.qc:10
float time
Definition: csprogsdefs.qc:16
vector velocity
Definition: csprogsdefs.qc:103
const int TNSF_MOVE
Definition: turret.qh:172
const int MIF_PROXY
Definition: common.qh:36
#define makevectors
Definition: post.qh:21
float trace_fraction
Definition: csprogsdefs.qc:36
#define fixedmakevectors
void set_movetype(entity this, int mt)
float MOVETYPE_FLY
Definition: progsdefs.qc:251
const int TUR_FLAG_HITSCAN
Definition: turret.qh:122
const int TFL_TARGETSELECT_RANGELIMITS
Definition: turret.qh:69
vector v_forward
Definition: csprogsdefs.qc:31
float DAMAGE_YES
Definition: progsdefs.qc:283