r4826 - in trunk/data/qcsrc/server/tturrets: system units
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Oct 23 02:39:27 EDT 2008
Author: tzork
Date: 2008-10-23 02:39:27 -0400 (Thu, 23 Oct 2008)
New Revision: 4826
Modified:
trunk/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc
trunk/data/qcsrc/server/tturrets/system/turret_system_main.qc
trunk/data/qcsrc/server/tturrets/system/turret_system_misc.qc
trunk/data/qcsrc/server/tturrets/units/turret_unit_common.qc
trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
Log:
Another round of turret updates.
Modified: trunk/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -7,6 +7,7 @@
supports:
TFL_AIM_NO
*/
+/*
vector turret_stdproc_aim_simple()
{
float s_bu; // Solidity backup (for ground shooters)
@@ -29,6 +30,7 @@
// This is where its at.
return aim_pos;
}
+*/
/*
* Generic aim
@@ -45,9 +47,12 @@
not supported:
TFL_AIM_BALISTIC
*/
+
+
vector turret_stdproc_aim_generic()
{
vector pre_pos;
+ // entity mover;
if (self.aim_flags == TFL_AIM_NO)
return self.idle_aim;
@@ -55,41 +60,57 @@
// Baseline
pre_pos = real_origin(self.enemy);
+ if(self.aim_flags & TFL_AIM_SIMPLE)
+ return pre_pos;
+
// Lead?
+ //pre_pos = pre_pos + bot_shotlead(self.enemy.origin, self.enemy.velocity, self.shot_speed, 0.01); //self.enemy.velocity; * (self.tur_dist_enemy / self.shot_speed);
if (self.aim_flags & TFL_AIM_LEAD)
if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE) // Need to conpensate for shot traveltime
- pre_pos += self.enemy.velocity * (self.tur_dist_enemy / self.shot_speed);
+ {
+ pre_pos = pre_pos + self.enemy.velocity * (self.tur_dist_enemy / self.shot_speed);
+
+ // FIXME slow projectiles misspredict (well all do, bit the slow ons miss :P)
+ }
else if (self.turrcaps_flags & TFL_TURRCAPS_HITSCAN) // Hitscan gun, conpensate for frametime and posibly refire offset.
- pre_pos += self.enemy.velocity * (frametime + min(max(self.attack_finished_single - time,0),self.ticrate*2));
+ pre_pos = pre_pos + self.enemy.velocity * (frametime + min(max(self.attack_finished_single - time,0),self.ticrate*2));
else // No lead
pre_pos += self.enemy.velocity;
+
// Smooth out predict-Z?
+ /*
if (self.aim_flags & TFL_AIM_ZEASE)
{
vector v;
v = real_origin(self.enemy);
- //pre_pos_z = (pre_pos_z * 0.5) + (v_z * 0.5);
pre_pos_z = (pre_pos_z + v_z) * 0.5;
}
+ */
+ /*
if (self.aim_flags & TFL_AIM_INFRONT) // Aim a bit in front of the target
pre_pos -= normalize(self.tur_aimorg_updated - pre_pos) * 32;
if (self.aim_flags & TFL_AIM_BEHIND) // Aim a bit behind the target
pre_pos += normalize(self.tur_aimorg_updated - pre_pos) * 32;
+ */
+ // This turret should hit the ground neer a target rather the do a direct hit
- // This turret should hit the ground neer a target rather the do a direct hit
if ( (self.aim_flags & TFL_AIM_GROUND) ||
((self.aim_flags & TFL_AIM_GROUND2) && (self.enemy.flags & FL_ONGROUND)) )
{
- traceline(pre_pos + '0 0 512',pre_pos - '0 0 2048',1,self.enemy);
+ traceline(pre_pos + '0 0 8',pre_pos - '0 0 10000',1,self.enemy);
pre_pos = trace_endpos;
}
- // self.tur_impacttime = vlen(pre_pos - self.origin) / self.shot_speed;
+
+
+
+
+
return pre_pos;
}
@@ -99,6 +120,7 @@
supports:
TFL_AIM_NO
*/
+/*
vector turret_stdproc_aim_rail()
{
vector pre_pos;
@@ -115,6 +137,4 @@
return pre_pos;
}
-
-
-
+*/
Modified: trunk/data/qcsrc/server/tturrets/system/turret_system_main.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/turret_system_main.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/system/turret_system_main.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -99,8 +99,6 @@
**/
void turret_do_updates(entity e_turret)
{
- //vector trueaimpoint;
-
if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
{
e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
@@ -115,23 +113,20 @@
makevectors(e_turret.tur_head.angles);
e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
}
+ // v_right = (v_right * -1);
+ e_turret.tur_shotorg_updated = e_turret.origin + v_forward * e_turret.tur_shotorg_x + v_right * e_turret.tur_shotorg_y + v_up * e_turret.tur_shotorg_z;
- //traceline_hitcorpse(e_turret, e_turret.origin, e_turret.origin + v_forward * MAX_SHOT_DISTANCE, MOVE_NOMONSTERS, e_turret);
- //trueaimpoint = trace_endpos;
-
- e_turret.tur_shotorg_updated = e_turret.origin + v_forward * e_turret.tur_shotorg_x + v_right * e_turret.tur_shotorg_y + v_up * e_turret.tur_shotorg_z;
- //e_turret.tur_shotdir_updated = normalize(trueaimpoint - e_turret.tur_shotorg_updated);
- e_turret.tur_shotdir_updated = normalize((e_turret.tur_shotorg_updated + v_forward * 512) - e_turret.tur_shotorg_updated);
+ e_turret.tur_shotdir_updated = normalize((e_turret.tur_shotorg_updated + v_forward) - e_turret.tur_shotorg_updated);
e_turret.tur_aimorg_updated = e_turret.origin + v_forward * e_turret.tur_aimorg_x + v_right * e_turret.tur_aimorg_y + v_up * e_turret.tur_aimorg_z;
- //e_turret.tur_aimorg_updated = e_turret.tur_shotorg_updated;
+
e_turret.tur_dist_enemy = vlen(e_turret.tur_aimorg_updated - real_origin(e_turret.enemy));
- //e_turret.tur_dist_enemy = vlen(e_turret.tur_aimpos - e_turret.tur_shotorg_updated);
- traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated+(e_turret.tur_shotdir_updated * e_turret.tur_dist_enemy),TRUE,e_turret);
+ traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated+(e_turret.tur_shotdir_updated * e_turret.tur_dist_enemy),MOVE_NORMAL,e_turret);
e_turret.tur_impactpoint = trace_endpos;
e_turret.tur_impactent = trace_ent;
+ //e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
e_turret.tur_dist_toaimpos = vlen(trace_endpos - e_turret.tur_aimpos);
}
@@ -156,7 +151,8 @@
if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
wish_angle = self.idle_aim + self.angles;
else
- wish_angle = self.idle_aim;
+ wish_angle = self.tur_head.angles;
+ //wish_angle = self.idle_aim;
}
else
{
@@ -175,19 +171,41 @@
else
{
//if(vlen(wish_angle - self.tur_head.angles) > vlen(self.tur_head.angles - wish_angle))
- real_angle = wish_angle - self.tur_head.angles;
+ real_angle = wish_angle - self.tur_head.angles;
//else
// real_angle = self.tur_head.angles - wish_angle;
}
- // Constrain it within +/- 360
- if (real_angle_x <= 0) real_angle_x += 360;
- if (real_angle_x >= 180) real_angle_x -= 360;
+ /*
+ if(real_angle_y > 180)
+ bprint("^3");
+ if(real_angle_y < -180)
+ bprint("^1");
+ string s;
+ s = vtos(real_angle);
+ bprint("RA1: ",s);
+ */
- //if (real_angle_y <= 0) real_angle_y += 360;
+
+ if (real_angle_x < 0) real_angle_x += 360;
+ if (real_angle_x > 180) real_angle_x -= 360;
+
+ if (real_angle_y < 0) real_angle_y += 360;
if (real_angle_y >= 180) real_angle_y -= 360;
+ //s = vtos(real_angle);
+ //bprint(" RA2: ",s,"\n");
+ // Limit pitch
+
+ if (self.track_flags & TFL_TRACK_PITCH)
+ real_angle_x = bound(self.aim_maxpitch * -1,real_angle_x,self.aim_maxpitch);
+
+ // Limit rot
+ if (self.track_flags & TFL_TRACK_ROT)
+ real_angle_y = bound(self.aim_maxrot * -1,real_angle_y,self.aim_maxrot);
+
+
if (self.track_type == TFL_TRACKTYPE_STEPMOTOR)
{
f_tmp = self.aim_speed * self.ticrate; // dgr/sec -> dgr/tic
@@ -228,6 +246,7 @@
}
// Limit pitch
+ /*
if (self.track_flags & TFL_TRACK_PITCH)
{
if (self.tur_head.angles_x > self.aim_maxpitch)
@@ -256,6 +275,7 @@
self.tur_head.avelocity_y = 0;
}
}
+ */
}
@@ -522,9 +542,9 @@
self.nextthink = (time + self.ticrate);
// ONS uses somewhat backwards linking.
- if(teamplay)
+ if (teamplay)
{
- if(g_onslaught)
+ if (g_onslaught)
{
/*
// see turret_stdproc_use()
@@ -538,15 +558,15 @@
}
else
{
- if(self.target)
+ if (self.target)
{
e = find(world,targetname,self.target);
- if(e != world)
+ if (e != world)
self.team = e.team;
}
}
- if(self.team != self.tur_head.team)
+ if (self.team != self.tur_head.team)
turret_stdproc_respawn();
}
@@ -620,7 +640,7 @@
else
{
// Check if we have a vailid enemy, and get one if we dont.
- // turret_do_updates(self);
+ // turret_do_updates(self);
if ((turret_validate_target(self,self.enemy,self.target_validate_flags) <= 0) || (self.cnt < time))
{
self.enemy = turret_select_target();
@@ -641,21 +661,22 @@
// And bail.
return;
}
- // te_lightning1(world,self.origin,self.enemy.origin);
- // Update
+
turret_do_updates(self);
// Predict or whatnot
- if (!self.aim_flags & TFL_AIM_NO)
+ if not((self.aim_flags & TFL_AIM_NO))
self.tur_aimpos = turret_stdproc_aim_generic();
- //self.tur_aimpos = self.turret_aim();
+ // Fire?
+ if (self.turret_firecheckfunc() != 0)
+ turret_fire();
+ turret_do_updates(self);
+
// Turn & pitch
if (!self.track_flags & TFL_TRACK_NO)
turret_stdproc_track();
- //self.turret_track();
- // Update
turret_do_updates(self);
// Fire?
@@ -703,18 +724,18 @@
{
// bprint("Used:",self.netname, " By ",other.netname,"\n");
- if(g_onslaught)
+ if (g_onslaught)
{
entity e;
- if(self.targetname)
+ if (self.targetname)
{
e = find(world,target,self.targetname);
- if(e != world)
+ if (e != world)
self.team = e.team;
}
- if(self.team != self.tur_head.team)
+ if (self.team != self.tur_head.team)
turret_stdproc_respawn();
}
else
@@ -1032,6 +1053,7 @@
}
self.use = turret_stdproc_use;
+ self.bot_attack = TRUE;
// Initiate the main AI loop
self.think = turret_think;
Modified: trunk/data/qcsrc/server/tturrets/system/turret_system_misc.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/turret_system_misc.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/system/turret_system_misc.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -36,7 +36,7 @@
e = spawn();
setmodel(e, "models/turrets/c512.md3"); // precision set above
e.scale = (f_size/512);
- setsize(e, '0 0 0', '0 0 0');
+ //setsize(e, '0 0 0', '0 0 0');
//setattachment(e,onwho,"");
setorigin(e,onwho.origin + '0 0 1');
e.alpha = 0.15;
Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_common.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_common.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_common.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -116,6 +116,8 @@
void turrets_precash()
{
+ precache_model ("models/turrets/c512.md3");
+
precache_sound ("turrets/phaser.ogg");
precache_model ("models/turrets/base-gib1.md3");
Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -52,11 +52,14 @@
self.event_damage = SUB_Null;
- ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
#ifdef TURRET_DEBUG
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
+
+ ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#else
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
#endif
remove (self);
Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -90,7 +90,7 @@
missile = spawn ();
missile.solid = SOLID_BBOX;
setmodel (missile, "models/turrets/hunter2.md3"); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+ setsize (missile, missile.mins,missile.maxs); // give it some size so it can be shot
sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
setorigin(missile, self.tur_shotorg_updated);
@@ -100,8 +100,8 @@
missile.bot_dodge = TRUE;
missile.bot_dodgerating = self.shot_dmg;
missile.takedamage = DAMAGE_YES;
- missile.damageforcescale = 2;
- missile.health = 35;
+ missile.damageforcescale = 4;
+ missile.health = 10;
missile.think = turret_hk_missile_think;
missile.event_damage = turret_hk_missile_damage;
missile.nextthink = time + 0.25;
@@ -153,7 +153,7 @@
vector pre_pos;
float myspeed;
entity e;
- float ad;
+ float ad,edist;
self.nextthink = time + self.ticrate;
@@ -188,8 +188,9 @@
if (self.enemy)
{
+ edist = vlen(self.origin - self.enemy.origin);
// Close enougth to do decent damage?
- if ( vlen(self.origin - self.enemy.origin) <= (self.owner.shot_radius * 0.25) )
+ if ( edist <= (self.owner.shot_radius * 0.25) )
{
turret_hk_missile_explode();
return;
@@ -210,12 +211,12 @@
fe = 0;
}
- if ((fe != 1) || (self.enemy == world))
+ if ((fe != 1) || (self.enemy == world) || (edist > 1000))
{
myspeed = vlen(self.velocity);
- lt_for = myspeed * 2;
- lt_seek = myspeed * 1.5;
+ lt_for = myspeed * 3;
+ lt_seek = myspeed * 2.95;
// Trace forward
traceline(self.origin, self.origin + v_forward * lt_for,FALSE,self);
@@ -225,10 +226,8 @@
// Find angular offset
ad = vlen(vectoangles(normalize(self.enemy.origin - self.origin)) - self.angles);
- //Calculate new speed
-
// To close to something, Slow down!
- if ( ((ff < 0.7) || (ad > 5)) && (myspeed > hk_minspeed) )
+ if ( ((ff < 0.7) || (ad > 4)) && (myspeed > hk_minspeed) )
myspeed = max(myspeed * hk_decel,hk_minspeed);
// Failry clear, accelerate.
@@ -237,7 +236,7 @@
// Setup trace pitch
pt_seek = 1 - ff;
- pt_seek = bound(0.125,pt_seek,0.8);
+ pt_seek = bound(0.15,pt_seek,0.8);
if (ff < 0.5) pt_seek = 1;
// Trace left
@@ -327,7 +326,7 @@
#ifdef TURRET_DEBUG_HK
//if(self.atime < time) {
- if (fe <= 0.99)
+ if ((fe <= 0.99)||(edist > 1000))
{
te_lightning2(world,self.origin, self.origin + vr * lt_seek);
te_lightning2(world,self.origin, self.origin + vl * lt_seek);
Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -6,8 +6,12 @@
void turret_mlrs_postthink()
{
- if ((self.tur_head.frame >= 6) && (self.attack_finished_single <= time))
- self.tur_head.frame = 0;
+ // 0 = full, 6 = empty
+
+ self.tur_head.frame = rint(6 - (self.ammo / self.shot_dmg));
+
+ //if ((self.tur_head.frame >= 6) && (self.attack_finished_single <= time))
+ // self.tur_head.frame = 0;
}
void turret_mlrs_attack()
@@ -44,7 +48,7 @@
te_explosion (missile.origin);
- self.tur_head.frame = 7 - self.volly_counter;
+ //self.tur_head.frame = 7 - self.volly_counter;
}
void turret_mlrs_projectile_explode()
Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc 2008-10-23 06:23:23 UTC (rev 4825)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc 2008-10-23 06:39:27 UTC (rev 4826)
@@ -12,18 +12,20 @@
if (self.tur_head.frame != 0)
self.tur_head.frame = self.tur_head.frame + 1;
- if (self.classname == "turret_plasma_dual")
- {
- if (self.tur_head.frame >= 6)
- self.tur_head.frame = 0;
- }
- else
- {
- if (self.tur_head.frame >= 5)
- self.tur_head.frame = 0;
- }
+ if (self.tur_head.frame >= 5)
+ self.tur_head.frame = 0;
+
}
+void turret_plasma_dualpostthink()
+{
+ if (self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame >= 6)
+ self.tur_head.frame = 0;
+}
+
void turret_plasma_attack()
{
entity proj;
@@ -33,6 +35,44 @@
sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
proj = spawn ();
setorigin(proj, self.tur_shotorg_updated);
+ setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
+ setmodel(proj, "models/elaser.mdl"); // precision set above
+ proj.classname = "plasmabomb";
+ proj.owner = self;
+ proj.bot_dodge = FALSE;
+ //proj.bot_dodgerating = self.shot_dmg;
+ proj.think = turret_plasma_projectile_explode;
+ proj.nextthink = time + 9;
+ proj.solid = SOLID_BBOX;
+ proj.movetype = MOVETYPE_FLYMISSILE;
+ proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+ proj.angles = vectoangles(proj.velocity);
+ proj.touch = turret_plasma_projectile_explode;
+ proj.flags = FL_PROJECTILE;
+ proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
+ proj.enemy = self.enemy;
+ proj.flags = FL_PROJECTILE | FL_NOTARGET;
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = 1;
+
+ // Snapback the head
+ // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
+
+}
+
+void turret_plasma_dual_attack()
+{
+ entity proj;
+
+ if (self.tur_head.frame > 2)
+ self.tur_head.frame = 1;
+
+ turret_tag_fire_update();
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+ proj = spawn ();
+ setorigin(proj, self.tur_shotorg_updated);
setsize(proj, '0 0 0', '0 0 0');
setmodel(proj, "models/elaser.mdl"); // precision set above
proj.classname = "plasmabomb";
@@ -54,14 +94,9 @@
if (self.tur_head.frame == 0)
self.tur_head.frame = 1;
- // trailparticles(proj,particleeffectnum("TR_REDPLASMA"),proj.origin,proj.origin + proj.velocity);
-
// Snapback the head
// self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
- //if(self.classname == "turret_plasma_dual")
- // self.tur_shotorg_y = self.tur_shotorg_y * -1;
-
}
void turret_plasma_projectile_explode()
@@ -117,10 +152,10 @@
dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
// Our fire routine
- self.turret_firefunc = turret_plasma_attack;
+ self.turret_firefunc = turret_plasma_dual_attack;
// re-color badge & handle recoil effect
- self.turret_postthink = turret_plasma_postthink;
+ self.turret_postthink = turret_plasma_dualpostthink;
}
@@ -143,7 +178,7 @@
dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
// select aim
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
// Our fire routine
self.turret_firefunc = turret_plasma_attack;
More information about the nexuiz-commits
mailing list