]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/system/system_aimprocs.qc
make TFL_DMG_HEADSHAKE work
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / system / 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 /*\r
11 vector turret_stdproc_aim_simple()\r
12 {\r
13     float s_bu;     // Solidity backup (for ground shooters)\r
14     vector aim_pos;\r
15 \r
16     if (self.aim_flags & TFL_AIM_NO) return self.idle_aim;\r
17 \r
18     aim_pos = self.enemy.origin;\r
19 \r
20     // Target ground?\r
21     if (self.aim_flags & TFL_AIM_GROUND)\r
22     {\r
23         s_bu = self.enemy.solid;\r
24         self.enemy.solid = SOLID_NOT;\r
25         traceline(self.enemy.origin + '0 0 128',self.enemy.origin + '0 0 -99999',1,self.enemy);\r
26         self.enemy.solid = s_bu;\r
27         aim_pos = trace_endpos;\r
28     }\r
29 \r
30     // This is where its at.\r
31     return aim_pos;\r
32 }\r
33 */\r
34 \r
35 /*\r
36 * Generic aim\r
37 \r
38 supports:\r
39 TFL_AIM_NO\r
40 TFL_AIM_GROUND\r
41 TFL_AIM_LEAD\r
42 TFL_AIM_SHOTTIMECOMPENSATE\r
43 TFL_AIM_INFRONT\r
44 TFL_AIM_BEHIND\r
45 TFL_AIM_ZEASE\r
46 \r
47 not supported:\r
48 TFL_AIM_BALISTIC\r
49 */\r
50 \r
51 \r
52 vector turret_stdproc_aim_generic()\r
53 {\r
54     vector pre_pos;\r
55     float distance,impact_time,i,mintime;\r
56     vector prep;\r
57 \r
58     //if (self.aim_flags == TFL_AIM_NO)\r
59     //  return self.idle_aim;\r
60 \r
61     // Baseline\r
62     pre_pos = real_origin(self.enemy);\r
63 \r
64     if(self.aim_flags & TFL_AIM_SIMPLE)\r
65         return pre_pos;\r
66 \r
67     // This is not accurate enougth\r
68     //pre_pos = bot_shotlead(pre_pos, self.enemy.velocity, self.shot_speed, 0.01); //self.enemy.velocity;  * (self.tur_dist_aimpos / self.shot_speed);\r
69 \r
70     // Keep track of when we can shoot the next tim and\r
71     // try to predict where the target will be then, so we can put our aimpoint there.\r
72     // + sys_ticrate becouse projectiles dont move during the first tic of their life.\r
73     mintime = max(self.attack_finished_single - time,0) + (sys_ticrate * 2);\r
74 \r
75     if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target\r
76         pre_pos += normalize(normalize(self.enemy.velocity) * 16);\r
77 \r
78     if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target\r
79         pre_pos -= normalize(normalize(self.enemy.velocity) * 16);\r
80 \r
81     // Lead?\r
82     if (self.aim_flags & TFL_AIM_LEAD)\r
83     if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime\r
84     {\r
85         // FIXME: this cant be the best way to do this..\r
86         prep = pre_pos;\r
87         for(i = 0; i < 3; ++i)\r
88         {\r
89             distance = vlen(prep - self.tur_shotorg_updated);\r
90             impact_time = distance / self.shot_speed;\r
91             prep = pre_pos + self.enemy.velocity * (impact_time + mintime);\r
92 \r
93 \r
94         }\r
95 \r
96         /* no worky well :/\r
97         if not(self.enemy.flags & FL_ONGROUND)\r
98         {\r
99             float z;\r
100             z = self.enemy.velocity_z;\r
101             z = z - (sv_gravity * impact_time);\r
102             prep_z += z;\r
103         }\r
104         */\r
105 \r
106 \r
107         pre_pos = prep;\r
108     }\r
109     else\r
110     {\r
111         pre_pos = pre_pos + self.enemy.velocity * mintime;\r
112     }\r
113 \r
114 \r
115     // Smooth out predict-Z?\r
116     if (self.aim_flags & TFL_AIM_ZEASE)\r
117     {\r
118         vector v;\r
119         v = real_origin(self.enemy);\r
120         pre_pos_z = (pre_pos_z + v_z) * 0.5;\r
121     }\r
122 \r
123     // This turret should hit the ground neer a target rather the do a direct hit\r
124     if ( (self.aim_flags & TFL_AIM_GROUND) ||\r
125          ((self.aim_flags & TFL_AIM_GROUND2) && (self.enemy.flags & FL_ONGROUND)) )\r
126     {\r
127         traceline(pre_pos + '0 0 8',pre_pos - '0 0 10000',1,self.enemy);\r
128         pre_pos = trace_endpos;\r
129     }\r
130 \r
131     return pre_pos;\r
132 }\r
133 \r
134 \r
135 /*\r
136 * Aim where it is\r
137 supports:\r
138 TFL_AIM_NO\r
139 */\r
140 /*\r
141 vector turret_stdproc_aim_rail()\r
142 {\r
143     vector pre_pos;\r
144 \r
145     if (self.aim_flags & TFL_AIM_NO)\r
146         return self.idle_aim;\r
147 \r
148     pre_pos = real_origin(self.enemy);\r
149 \r
150     self.tur_dist_impact_to_aimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);\r
151 \r
152     self.tur_impacttime = time;\r
153 \r
154     return pre_pos;\r
155 \r
156 }\r
157 */\r