]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/system/system_aimprocs.qc
Merge remote-tracking branch 'origin/master' into terencehill/menu_focus_stuff
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / tturrets / system / system_aimprocs.qc
1 /*
2 * Generic aim
3
4 supports:
5 TFL_AIM_NO
6 TFL_AIM_GROUNDGROUND
7 TFL_AIM_LEAD
8 TFL_AIM_SHOTTIMECOMPENSATE
9 */
10 vector turret_stdproc_aim_generic()
11 {
12
13     vector pre_pos, prep;
14     float distance, impact_time, i, mintime;
15
16     turret_tag_fire_update();
17
18     if(self.aim_flags & TFL_AIM_SIMPLE)
19         return real_origin(self.enemy);
20
21         mintime = max(self.attack_finished_single - time,0) + sys_frametime;
22
23     // Baseline
24     pre_pos = real_origin(self.enemy);
25
26     // Lead?
27     if (self.aim_flags & TFL_AIM_LEAD)
28     {           
29                 if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime
30                 {
31                         // FIXME: this cant be the best way to do this..
32                         prep = pre_pos;
33 #ifdef GMQCC
34                         impact_time = 0;
35 #endif
36                         for(i = 0; i < 4; ++i)
37                         {
38                                 distance = vlen(prep - self.tur_shotorg);
39                                 impact_time = distance / self.shot_speed;
40                                 prep = pre_pos + self.enemy.velocity * impact_time;
41                         }
42
43                         prep = pre_pos + (self.enemy.velocity * (impact_time + mintime));
44
45                         if(self.aim_flags & TFL_AIM_ZPREDICT)
46                         if not(self.enemy.flags & FL_ONGROUND)
47                         if(self.enemy.movetype == MOVETYPE_WALK || self.enemy.movetype == MOVETYPE_TOSS || self.enemy.movetype == MOVETYPE_BOUNCE)
48                         {
49                                 float vz;
50                                 prep_z = pre_pos_z;
51                                 vz = self.enemy.velocity_z;
52                                 for(i = 0; i < impact_time; i += sys_frametime)
53                                 {
54                                         vz = vz - (autocvar_sv_gravity * sys_frametime);
55                                         prep_z = prep_z + vz * sys_frametime;
56                                 }
57                         }
58                         pre_pos = prep;
59                 }
60                 else
61                         pre_pos = pre_pos + self.enemy.velocity * mintime;
62     }
63     
64     if(self.aim_flags & TFL_AIM_GROUNDGROUND)
65     {
66         //tracebox(pre_pos + '0 0 32',self.enemy.mins,self.enemy.maxs,pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
67         traceline(pre_pos + '0 0 32',pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
68         if(trace_fraction != 1.0)
69             pre_pos = trace_endpos;
70     }
71
72     return pre_pos;
73 }