[nexuiz-commits] r6258 - trunk/data/qcsrc/server/tturrets/system

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Mar 23 16:52:12 EDT 2009


Author: tzork
Date: 2009-03-23 16:52:12 -0400 (Mon, 23 Mar 2009)
New Revision: 6258

Modified:
   trunk/data/qcsrc/server/tturrets/system/system_aimprocs.qc
   trunk/data/qcsrc/server/tturrets/system/system_main.qc
   trunk/data/qcsrc/server/tturrets/system/system_misc.qc
Log:
fix turret NaN crash due to runaway angles.

Modified: trunk/data/qcsrc/server/tturrets/system/system_aimprocs.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/system_aimprocs.qc	2009-03-23 19:08:58 UTC (rev 6257)
+++ trunk/data/qcsrc/server/tturrets/system/system_aimprocs.qc	2009-03-23 20:52:12 UTC (rev 6258)
@@ -34,12 +34,11 @@
         mintime = max(self.attack_finished_single - time,0) + sys_ticrate;
 
     // Baseline
-    pre_pos = real_origin(self.enemy) + (self.enemy.velocity * mintime);
+    pre_pos = real_origin(self.enemy);// + (self.enemy.velocity * mintime);
 
     if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target
         pre_pos = pre_pos + (normalize(self.enemy.velocity) * 64);
 
-
     if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target
         pre_pos = pre_pos - (normalize(self.enemy.velocity) * 32);
 
@@ -48,6 +47,8 @@
     if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime
     {
         // FIXME: this cant be the best way to do this..
+
+
         prep = pre_pos;
         for(i = 0; i < 4; ++i)
         {
@@ -56,18 +57,20 @@
             prep = pre_pos + self.enemy.velocity * impact_time;
         }
 
-        /*
+
         // tnx and all credit to Rudolf "div0" Polzer for this solution.
         // hmm tobad it dont work.
+        /*
+        vector q;
         q = solve_quadratic(self.enemy.velocity*self.enemy.velocity - self.shot_speed*self.shot_speed, 2*(pre_pos*self.enemy.velocity), pre_pos * pre_pos);
         if(q_x > 0)
             impact_time = q_x;
         else
             impact_time = q_y;
-
-        prep = self.enemy.origin + (self.enemy.velocity * impact_time);
         */
 
+        prep = pre_pos + (self.enemy.velocity * (impact_time+mintime));
+
         if(self.aim_flags & TFL_AIM_ZPREDICT)
         if not(self.enemy.flags & FL_ONGROUND)
         if(self.enemy.movetype == MOVETYPE_WALK || self.enemy.movetype == MOVETYPE_TOSS || self.enemy.movetype == MOVETYPE_BOUNCE)
@@ -101,7 +104,7 @@
 
     if(self.aim_flags & TFL_AIM_GROUND2)
     {
-        tracebox(pre_pos + '0 0 32',self.enemy.mins,self.enemy.maxs,pre_pos -'0 0 48',MOVE_WORLDONLY,self.enemy);
+        tracebox(pre_pos + '0 0 32',self.enemy.mins,self.enemy.maxs,pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
         if(trace_fraction != 1.0)
             pre_pos = trace_endpos;
     }

Modified: trunk/data/qcsrc/server/tturrets/system/system_main.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/system_main.qc	2009-03-23 19:08:58 UTC (rev 6257)
+++ trunk/data/qcsrc/server/tturrets/system/system_main.qc	2009-03-23 20:52:12 UTC (rev 6258)
@@ -116,12 +116,14 @@
         makevectors(self.tur_head.angles);
         self.tur_head.angles_x = self.tur_head.angles_x * -1;
     }
+
     enemy_pos = real_origin(self.enemy);
 
     turret_tag_fire_update();
-    self.tur_shotdir_updated = normalize(v_forward);
 
-    self.tur_dist_enemy = vlen(self.tur_shotorg - enemy_pos);
+    self.tur_shotdir_updated = v_forward;
+
+    self.tur_dist_enemy  = vlen(self.tur_shotorg - enemy_pos);
     self.tur_dist_aimpos = vlen(self.tur_shotorg - self.tur_aimpos);
 
     if(self.firecheck_flags & TFL_FIRECHECK_VERIFIED)
@@ -131,6 +133,8 @@
         setorigin(self.enemy,self.tur_aimpos);
     }
 
+    //dprint("NN: ", self.netname," THVN: ",self.tur_head.classname," frame:",ftos(self.tur_head.frame),"\n");
+    //dprint("self.tur_shotorg: ",vtos(self.tur_shotorg),"\n");
     tracebox(self.tur_shotorg, '-1 -1 -1','1 1 1',self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos),MOVE_NORMAL,self);
 
     if(self.firecheck_flags & TFL_FIRECHECK_VERIFIED)
@@ -143,7 +147,6 @@
     self.tur_impacttime            = vlen(self.tur_shotorg - trace_endpos) / self.shot_speed;
 
     self = oldself;
-
 }
 
 /*
@@ -224,43 +227,9 @@
     vector real_angle;  // This is where we can aim
     float f_tmp;
 
-    /*
-    if(!self.aim_mark)
-    {
-        self.aim_mark = mark_misc(self.tur_aimpos,0);
-        self.aim_mark.colormod = '1 1 0';
-    }
-    */
-
-
     if (self.track_flags == TFL_TRACK_NO)
         return;
 
-    /*
-    if not(self.tur_active)
-    {
-        wish_angle = self.idle_aim - ('1 0 0' * self.aim_maxpitch);
-    }
-    else if (self.enemy == world)
-    {
-        if (self.turrcaps_flags & TFL_TURRCAPS_HEADATTACHED)
-            wish_angle = self.idle_aim + self.angles;
-        else
-            if(time > self.lip)
-            {
-                if(self.target_select_flags & TFL_TARGETSELECT_FOV)
-                    wish_angle = self.idle_aim; //turret_fovsearch_steprot();
-            }
-            else
-            {
-                //wish_angle = self.tur_head.angles;
-                wish_angle = self.idle_aim;
-                //wish_angle = normalize(self.tur_aimpos - self.tur_head.origin);
-                //wish_angle = vectoangles(wish_angle); // And make a angle
-            }
-    }
-    else
-    */
 
     if(!self.tur_active)
     {
@@ -274,7 +243,7 @@
             else
                 wish_angle = self.idle_aim;
         else
-            wish_angle = vectoangles(self.tur_aimpos - self.tur_head.origin);
+            wish_angle = vectoangles(normalize(self.tur_aimpos - self.tur_head.origin));
     }
     else
     {
@@ -288,6 +257,9 @@
         wish_angle = vectoangles(wish_angle); // And make a angle
     }
 
+    self.tur_head.angles_x = anglemods(self.tur_head.angles_x);
+    self.tur_head.angles_y = anglemods(self.tur_head.angles_y);
+
     // Find the diffrence between where we currently aim and where we want to aim
     if (self.turrcaps_flags & TFL_TURRCAPS_HEADATTACHED)
     {
@@ -618,7 +590,7 @@
         return -20;
 
 #ifdef TURRET_DEBUG_TARGETSELECT
-    bprint("Target:",e_target.netname," is a valid target for ",e_turret.netname,"\n");
+    dprint("Target:",e_target.netname," is a valid target for ",e_turret.netname,"\n");
 #endif
 
     return 1;
@@ -650,7 +622,6 @@
         f = turret_validate_target(self,e,self.target_select_flags);
         if (f > 0)
         {
-            bprint(e.netname," = ",ftos(f),"\n");
             score = self.turret_score_target(self,e);
             if ((score > m_score) && (score > 0))
             {

Modified: trunk/data/qcsrc/server/tturrets/system/system_misc.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/system_misc.qc	2009-03-23 19:08:58 UTC (rev 6257)
+++ trunk/data/qcsrc/server/tturrets/system/system_misc.qc	2009-03-23 20:52:12 UTC (rev 6258)
@@ -1,7 +1,9 @@
-//--// Some support routines //--//
+//--// Some supptort routines //--//
+
+#define anglemods(a) (a - floor(a / 360) * 360)
+
 float shortangle_f(float ang1,float ang2)
 {
-
     if(ang1 > ang2)
     {
         if(ang1 > 180)
@@ -19,6 +21,7 @@
 vector shortangle_v(vector ang1,vector ang2)
 {
     vector vtmp;
+
     vtmp_x = shortangle_f(ang1_x,ang2_x);
     vtmp_y = shortangle_f(ang1_y,ang2_y);
     vtmp_z = shortangle_f(ang1_z,ang2_z);
@@ -234,34 +237,27 @@
 
 float turret_tag_setup(float linked)
 {
-    vector v;
-    float f;
-
     // Laters dooz
     if (linked)
         return 0;
 
-    f = gettagindex(self,"tag_head");
-    v = gettaginfo(self,f);
-    setorigin(self.tur_head,v);
+    setorigin(self.tur_head,gettaginfo(self,gettagindex(self,"tag_head")));
+    self.tur_shotorg = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
 
-    f = gettagindex(self.tur_head,"tag_fire");
-    v = gettaginfo(self.tur_head,f);
-    self.tur_shotorg = v;
-
     return 1;
 }
 
 float turret_tag_fire_update()
 {
-    vector v;
-    float f;
+    if(!self.tur_head)
+    {
+        self.tur_shotorg = '0 0 0';
+        return 1;
+    }
 
-    f = gettagindex(self.tur_head,"tag_fire");
-    v = gettaginfo(self.tur_head,f);
+    self.tur_shotorg = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
+    //dprint("update: tur_shotorg: ",vtos(self.tur_shotorg)," origin:", vtos(self.tur_head.origin), " angels: ", vtos(self.tur_head.angles),"\n");
 
-    self.tur_shotorg = v;
-
     return 1;
 }
 



More information about the nexuiz-commits mailing list