]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc
fix to race winning condition
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / system / turret_system_aimprocs.qc
1 /*\r
2 * Straight line, Dead-on (no prediction)\r
3 * Usefull for "stupid turrets" or ones\r
4 * that launch guided weapons and just need to apeer to\r
5 * somewhat face (and/or track) the target.\r
6 \r
7 supports:\r
8 TFL_AIM_NO\r
9 */\r
10 vector turret_stdproc_aim_simple()\r
11 {\r
12     float s_bu;     // Solidity backup (for ground shooters)\r
13     vector aim_pos;\r
14 \r
15     if (self.aim_flags & TFL_AIM_NO) return self.idle_aim;\r
16 \r
17     aim_pos = self.enemy.origin;\r
18 \r
19     // Target ground?\r
20     if (self.aim_flags & TFL_AIM_GROUND)\r
21     {\r
22         s_bu = self.enemy.solid;\r
23         self.enemy.solid = SOLID_NOT;\r
24         traceline(self.enemy.origin + '0 0 128',self.enemy.origin + '0 0 -99999',1,self.enemy);\r
25         self.enemy.solid = s_bu;\r
26         aim_pos = trace_endpos;\r
27     }\r
28 \r
29     // This is where its at.\r
30     return aim_pos;\r
31 }\r
32 \r
33 /*\r
34 * Generic aim\r
35 \r
36 supports:\r
37 TFL_AIM_NO\r
38 TFL_AIM_GROUND\r
39 TFL_AIM_LEAD\r
40 TFL_AIM_SHOTTIMECOMPENSATE\r
41 TFL_AIM_INFRONT\r
42 TFL_AIM_BEHIND\r
43 TFL_AIM_ZEASE\r
44 \r
45 not supported:\r
46 TFL_AIM_BALISTIC\r
47 */\r
48 vector turret_stdproc_aim_generic()\r
49 {\r
50     vector pre_pos;\r
51 \r
52     if (self.aim_flags == TFL_AIM_NO)\r
53         return self.idle_aim;\r
54 \r
55     // Baseline\r
56     pre_pos = real_origin(self.enemy);\r
57 \r
58     // Lead?\r
59     if (self.aim_flags & TFL_AIM_LEAD)\r
60         if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime\r
61             pre_pos += self.enemy.velocity * (self.tur_dist_enemy / self.shot_speed);\r
62         else if (self.turrcaps_flags & TFL_TURRCAPS_HITSCAN)   // Hitscan gun, conpensate for frametime and posibly refire offset.\r
63             pre_pos += self.enemy.velocity * (frametime + min(max(self.attack_finished - time,0),self.ticrate*2));\r
64         else                                                   // No lead\r
65             pre_pos += self.enemy.velocity;\r
66 \r
67     // Smooth out predict-Z?\r
68     if (self.aim_flags & TFL_AIM_ZEASE)\r
69     {\r
70         vector v;\r
71         v = real_origin(self.enemy);\r
72         //pre_pos_z = (pre_pos_z * 0.5) + (v_z * 0.5);\r
73         pre_pos_z = (pre_pos_z  + v_z) * 0.5;\r
74     }\r
75 \r
76     if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target\r
77         pre_pos -= normalize(self.tur_aimorg_updated - pre_pos) * 32;\r
78 \r
79     if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target\r
80         pre_pos += normalize(self.tur_aimorg_updated - pre_pos) * 32;\r
81 \r
82 \r
83     // This turret should hit the ground neer a target rather the do a direct hit\r
84     if (self.aim_flags & TFL_AIM_GROUND)\r
85     {\r
86         traceline(pre_pos + '0 0 512',pre_pos - '0 0 2048',1,self.enemy);\r
87         pre_pos = trace_endpos;\r
88     }\r
89 \r
90     // self.tur_impacttime = vlen(pre_pos - self.origin) / self.shot_speed;\r
91 \r
92     return pre_pos;\r
93 }\r
94 \r
95 \r
96 /*\r
97 * Aim where it is\r
98 supports:\r
99 TFL_AIM_NO\r
100 */\r
101 vector turret_stdproc_aim_rail()\r
102 {\r
103     vector pre_pos;\r
104 \r
105     if (self.aim_flags & TFL_AIM_NO)\r
106         return self.idle_aim;\r
107 \r
108     pre_pos = real_origin(self.enemy);\r
109 \r
110     self.tur_dist_toaimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);\r
111 \r
112     self.tur_impacttime = time;\r
113 \r
114     return pre_pos;\r
115 \r
116 }\r
117 \r
118 \r
119 \r