]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/system/system_aimprocs.qc
Merge branch 'master' into terencehill/newpanelhud
[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_GROUND2
7 TFL_AIM_LEAD
8 TFL_AIM_SHOTTIMECOMPENSATE
9 TFL_AIM_INFRONT
10 TFL_AIM_BEHIND
11
12 not supported:
13 TFL_AIM_BALISTIC
14
15 removed
16 TFL_AIM_ZEASE
17 TFL_AIM_GROUND
18 */
19 vector turret_stdproc_aim_generic()
20 {
21
22     vector pre_pos,prep;
23     float distance,impact_time,i,mintime;
24
25     turret_tag_fire_update();
26
27     if(self.aim_flags & TFL_AIM_SIMPLE)
28         return real_origin(self.enemy);
29
30         mintime = max(self.attack_finished_single - time,0) + sys_frametime ;
31
32     // Baseline
33     pre_pos = real_origin(self.enemy);
34
35     if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target
36         pre_pos = pre_pos + (normalize(self.enemy.velocity) * 64);
37
38     if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target
39         pre_pos = pre_pos - (normalize(self.enemy.velocity) * 32);
40
41     // Lead?
42     if (self.aim_flags & TFL_AIM_LEAD)
43     {           
44                 if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime
45                 {
46                         // FIXME: this cant be the best way to do this..
47                         prep = pre_pos;
48                         for(i = 0; i < 4; ++i)
49                         {
50                                 distance = vlen(prep - self.tur_shotorg);
51                                 impact_time = distance / self.shot_speed;
52                                 prep = pre_pos + self.enemy.velocity * impact_time;
53                         }
54
55                         prep = pre_pos + (self.enemy.velocity * (impact_time + mintime));
56
57                         if(self.aim_flags & TFL_AIM_ZPREDICT)
58                         if not(self.enemy.flags & FL_ONGROUND)
59                         if(self.enemy.movetype == MOVETYPE_WALK || self.enemy.movetype == MOVETYPE_TOSS || self.enemy.movetype == MOVETYPE_BOUNCE)
60                         {
61                                 float vz;
62                                 prep_z = pre_pos_z;
63                                 vz = self.enemy.velocity_z;
64                                 for(i = 0; i < impact_time; i += sys_frametime)
65                                 {
66                                         vz = vz - (sv_gravity * sys_frametime);
67                                         prep_z = prep_z + vz * sys_frametime;
68                                 }
69                         }
70                         pre_pos = prep;
71                 }
72                 else
73                         pre_pos = pre_pos + self.enemy.velocity * mintime;
74     }
75     
76     if(self.aim_flags & TFL_AIM_GROUND2)
77     {
78         //tracebox(pre_pos + '0 0 32',self.enemy.mins,self.enemy.maxs,pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
79         traceline(pre_pos + '0 0 32',pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
80         if(trace_fraction != 1.0)
81             pre_pos = trace_endpos;
82     }
83
84     return pre_pos;
85 }