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
11 vector turret_stdproc_aim_simple()
\r
13 float s_bu; // Solidity backup (for ground shooters)
\r
16 if (self.aim_flags & TFL_AIM_NO) return self.idle_aim;
\r
18 aim_pos = self.enemy.origin;
\r
21 if (self.aim_flags & TFL_AIM_GROUND)
\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
30 // This is where its at.
\r
42 TFL_AIM_SHOTTIMECOMPENSATE
\r
52 vector turret_stdproc_aim_generic()
\r
55 float distance,impact_time,i,mintime;
\r
58 //if (self.aim_flags == TFL_AIM_NO)
\r
59 // return self.idle_aim;
\r
62 pre_pos = real_origin(self.enemy);
\r
64 if(self.aim_flags & TFL_AIM_SIMPLE)
\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
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
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
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
82 if (self.aim_flags & TFL_AIM_LEAD)
\r
83 if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE) // Need to conpensate for shot traveltime
\r
85 // FIXME: this cant be the best way to do this..
\r
87 for(i = 0; i < 3; ++i)
\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
97 if not(self.enemy.flags & FL_ONGROUND)
\r
100 z = self.enemy.velocity_z;
\r
101 z = z - (sv_gravity * impact_time);
\r
111 pre_pos = pre_pos + self.enemy.velocity * mintime;
\r
115 // Smooth out predict-Z?
\r
116 if (self.aim_flags & TFL_AIM_ZEASE)
\r
119 v = real_origin(self.enemy);
\r
120 pre_pos_z = (pre_pos_z + v_z) * 0.5;
\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
127 traceline(pre_pos + '0 0 8',pre_pos - '0 0 10000',1,self.enemy);
\r
128 pre_pos = trace_endpos;
\r
141 vector turret_stdproc_aim_rail()
\r
145 if (self.aim_flags & TFL_AIM_NO)
\r
146 return self.idle_aim;
\r
148 pre_pos = real_origin(self.enemy);
\r
150 self.tur_dist_impact_to_aimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);
\r
152 self.tur_impacttime = time;
\r