r5842 - in trunk/data/qcsrc/server: . tturrets/units

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Feb 11 16:41:19 EST 2009


Author: tzork
Date: 2009-02-11 16:41:19 -0500 (Wed, 11 Feb 2009)
New Revision: 5842

Modified:
   trunk/data/qcsrc/server/pathlib.qc
   trunk/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
   trunk/data/qcsrc/server/tturrets/units/unit_ewheel.qc
   trunk/data/qcsrc/server/tturrets/units/unit_flac.qc
   trunk/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
   trunk/data/qcsrc/server/tturrets/units/unit_hellion.qc
   trunk/data/qcsrc/server/tturrets/units/unit_machinegun.qc
   trunk/data/qcsrc/server/tturrets/units/unit_mlrs.qc
   trunk/data/qcsrc/server/tturrets/units/unit_plasma.qc
   trunk/data/qcsrc/server/tturrets/units/unit_walker.qc
Log:
Make all turrets use csqc projectiles
use TFL_DMG_HEADSHAKE for some units.
make flac turret somewhat functional (sponsored by uglyhakk inc)


Modified: trunk/data/qcsrc/server/pathlib.qc
===================================================================
--- trunk/data/qcsrc/server/pathlib.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/pathlib.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -1,6 +1,6 @@
-#define PLF_GROUNDSNAP 1
-#define PLF_NOOPTIMIZE 2
-#define PLF_SUBPATH3D  4
+#define PFL_GROUNDSNAP 1
+#define PFL_NOOPTIMIZE 2
+#define PFL_SUBPATH3D  4
 
 #define PT_QUICKSTAR 1
 #define PT_QUICKBOX  2
@@ -76,7 +76,7 @@
     else
         point.classname = "path_end";
 
-    if (point.owner.path_flags & PLF_GROUNDSNAP)
+    if (point.owner.path_flags & PFL_GROUNDSNAP)
         where = pathlib_groundsnap(where);
 
     setorigin(point,where);
@@ -115,7 +115,7 @@
 
     step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
 
-    if(start.owner.path_flags & PLF_SUBPATH3D)
+    if(start.owner.path_flags & PFL_SUBPATH3D)
     {
         zmin = maxsize * -1;
         zmax = maxsize;
@@ -133,7 +133,7 @@
 
         point = vcrash + box;
 
-        if(start.owner.path_flags & PLF_GROUNDSNAP)
+        if(start.owner.path_flags & PFL_GROUNDSNAP)
             point = pathlib_groundsnap(point);
 
         if(self.path_validate(start.origin,point))
@@ -363,9 +363,8 @@
     if(subpathing_bboxexpand < 1)
         subpathing_bboxexpand = 1;
 
-    if(pathflags & PLF_GROUNDSNAP)
+    if(pathflags & PFL_GROUNDSNAP)
     {
-        //bprint("SnapIT!\n");
         from = pathlib_groundsnap(from);
         to = pathlib_groundsnap(to);
     }
@@ -458,7 +457,7 @@
     }
 
     setsize(self,'-50 -50 0','50 50 50');
-    path = pathlib_makepath(self.origin,end.origin, PLF_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
+    path = pathlib_makepath(self.origin,end.origin, PFL_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
 
     if(!path)
     {

Modified: trunk/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -21,7 +21,7 @@
     oldself = self;
     self = forwho;
 
-    pth = pathlib_makepath(start.origin,end.origin,PLF_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
+    pth = pathlib_makepath(start.origin,end.origin,PFL_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
 
     self = oldself;
     return pth;

Modified: trunk/data/qcsrc/server/tturrets/units/unit_ewheel.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -39,8 +39,8 @@
 
         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/laser.mdl"); // precision set above
+        //setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
+        //setmodel(proj, "models/laser.mdl"); // precision set above
         proj.classname       = "ewheel bolt";
         proj.owner           = self;
         proj.bot_dodge       = FALSE;
@@ -49,13 +49,15 @@
         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.velocity        = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
         proj.angles          = vectoangles(proj.velocity);
         proj.touch           = turret_ewheel_projectile_explode;
-        proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
+        //proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
         proj.enemy           = self.enemy;
         proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
+        CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
+
         self.tur_head.frame += 2;
 
         if (self.tur_head.frame > 3)
@@ -65,9 +67,9 @@
 }
 
 #define EWHEEL_MASS 50
-#define EWHEEL_MAXSPEED 1500
-#define EWHEEL_ACCEL_SLOW 50
-#define EWHEEL_ACCEL_FAST 150
+#define EWHEEL_MAXSPEED 800
+#define EWHEEL_ACCEL_SLOW 25
+#define EWHEEL_ACCEL_FAST 100
 #define EWHEEL_BREAK_SLOW 100
 #define EWHEEL_BREAK_FAST 250
 
@@ -122,7 +124,7 @@
 
     makevectors(self.angles);
 
-    if (self.tur_dist_enemy > self.target_range_optimal)
+    if (self.tur_dist_aimpos > self.target_range_optimal)
     {
         if ( angle_ofs < 10 )
         {

Modified: trunk/data/qcsrc/server/tturrets/units/unit_flac.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -12,7 +12,7 @@
     sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
-    setmodel(proj, "models/turrets/pd_proj.md3");
+    // setmodel(proj, "models/turrets/pd_proj.md3");
     setsize(proj, '0 0 0', '0 0 0');
     proj.classname          = "turret_fire";
     proj.owner              = self;
@@ -21,15 +21,19 @@
     proj.solid              = SOLID_NOT;
     proj.movetype           = MOVETYPE_FLYMISSILE;
     proj.flags              = FL_PROJECTILE;
-    proj.effects            = EF_LOWPRECISION;
-    proj.takedamage         = DAMAGE_YES;
-    proj.health             = 10;
-    proj.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    // proj.effects            = EF_LOWPRECISION;
+    proj.takedamage         = DAMAGE_NO;
+    //proj.health             =  100;
+    proj.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     proj.angles             = vectoangles(proj.velocity);
     proj.touch              = turret_flac_projectile_explode;
     proj.think              = turret_flac_projectile_explode;
-    proj.nextthink          = time + (vlen(self.tur_aimpos - self.tur_shotorg_updated) / self.shot_speed) + (random() * self.shot_spread);
+    proj.nextthink          = time + max(self.tur_impacttime,(self.shot_radius * 3) / self.shot_speed);
+    proj.enemy              = self.enemy;
+    proj.cnt                = time + 5;
 
+    CSQCProjectile(proj, TRUE, PROJECTILE_HAGAR, TRUE);
+
     self.tur_head.frame = self.tur_head.frame + 1;
     if (self.tur_head.frame >= 4) self.tur_head.frame = 0;
 
@@ -39,6 +43,15 @@
 {
     float ftmp;
 
+    // FIXME: tur_impacttime is not accurate enougth, this is a dirty hakk to make flac work.
+    if(self.enemy != world)
+    if(self.cnt < time)
+    if(vlen(self.origin - self.enemy.origin) > self.owner.shot_radius * 0.5)
+    {
+        self.nextthink = time; //vlen(self.origin - self.enemy.origin) / self.owner.shot_speed;
+        return;
+    }
+
     te_explosion (self.origin);
 
     ftmp = crandom();
@@ -54,12 +67,11 @@
 
 
 #ifdef TURRET_DEBUG
-
     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);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
 
     remove (self);
@@ -81,6 +93,8 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/flac.md3");
 

Modified: trunk/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -11,8 +11,8 @@
 
     if (self.ammo < self.shot_dmg) return 0;
     if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
-    if (self.tur_dist_enemy > self.target_range_fire) return 0;
-    if (self.tur_dist_enemy < self.target_range_min) return 0;
+    if (self.tur_dist_aimpos > self.target_range_fire) return 0;
+    if (self.tur_dist_aimpos < self.target_range_min) return 0;
 
     return 1;
 }

Modified: trunk/data/qcsrc/server/tturrets/units/unit_hellion.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -38,14 +38,15 @@
     missile.bot_dodge          = TRUE;
     missile.bot_dodgerating    = self.shot_dmg;
     missile.takedamage         = DAMAGE_YES;
+    missile.event_damage       = turret_hellion_missile_damage;
     missile.damageforcescale   = 2;
-    missile.health             = 50;
+    missile.health             = 10;
     missile.enemy              = self.enemy;
     missile.think              = turret_hellion_missile_think;
-    missile.nextthink          = time + 0.2;
+    missile.nextthink          = time;// + 0.2;
     missile.solid              = SOLID_BBOX;
-    missile.movetype           = MOVETYPE_FLYMISSILE;
-    missile.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed; // + ('0 0 1' * self.shot_speed * 0.15);
+    missile.movetype           = MOVETYPE_FLY;
+    missile.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     missile.angles             = vectoangles(missile.velocity);
     missile.touch              = turret_hellion_missile_explode;
     missile.flags              = FL_PROJECTILE;
@@ -77,15 +78,12 @@
     vector pre_pos;
     float itime;
 
-    self.nextthink          = time + 0.1;
+    self.nextthink = time + 0.05;
 
-    // Enemy in range?
-    if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.25)
-        turret_hellion_missile_explode();
-
     olddir = normalize(self.velocity);
 
-    if (self.tur_health < time) turret_hellion_missile_explode();
+    if(self.tur_health < time)
+        turret_hellion_missile_explode();
 
     // Enemy dead? just keep on the current heading then.
     if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
@@ -94,55 +92,48 @@
         // Make sure we dont return to tracking a respawned player
         self.enemy = world;
 
-        // Accelerate
-        self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
         // Turn model
         self.angles = vectoangles(self.velocity);
 
-        //if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 10) )
-        //    turret_hellion_missile_explode();
+        if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 5) )
+            turret_hellion_missile_explode();
 
-        // return;
-    }
+        // Accelerate
+        self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
 
-    olddir = normalize(self.velocity);
+        UpdateCSQCProjectile(self);
 
-    if (self.enemy)
-    {
-        // Predict enemy position
-        itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
-        pre_pos = self.enemy.origin + self.enemy.velocity * itime;
+        return;
     }
-    else
-    {
-        pre_pos = self.origin + olddir * 1024;
-    }
 
+    // Enemy in range?
+    if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.2)
+        turret_hellion_missile_explode();
+
+    // Predict enemy position
+    itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
+    pre_pos = self.enemy.origin + self.enemy.velocity * itime;
+
     pre_pos = (pre_pos + self.enemy.origin) * 0.5;
 
     //pre_pos += randomvec() * 128; //self.tur_aimpos * (sin(32) * time) ;
 
-
     // Find out the direction to that place
     newdir = normalize(pre_pos - self.origin);
 
     // Turn
-    newdir = normalize(olddir + newdir * 0.5);
+    newdir = normalize(olddir + newdir * 0.35);
 
-    // Accelerate
-    self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
     // Turn model
     self.angles = vectoangles(self.velocity);
 
-    if (time+itime < time+0.1)
-    {
+    // Accelerate
+    self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
+
+    if (itime < 0.05)
         self.think = turret_hellion_missile_explode;
-        self.nextthink = time + itime;
-    }
 
-	UpdateCSQCProjectile(self);
+    UpdateCSQCProjectile(self);
 }
 
 void turret_hellion_missile_explode()

Modified: trunk/data/qcsrc/server/tturrets/units/unit_machinegun.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -7,11 +7,12 @@
 {
 
     entity flash;
+
     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, cvar("g_balance_uzi_speed"), 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
 
     te_smallflash(self.tur_shotorg_updated);
-    trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
+    //  trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
 
     // muzzle flash for 3rd person view
     flash = spawn();
@@ -32,8 +33,8 @@
     if (self.netname == "")      self.netname     = "Machinegun Turret";
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
-    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;// | TFL_TURRCAPS_MISSILEKILL;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
 
     if (turret_stdproc_init("machinegun_std") == 0)
     {
@@ -41,6 +42,8 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/machinegun.md3");
 
@@ -64,6 +67,7 @@
 {
     //precache_model ("models/turrets/machinegun.md3");
     //precache_model ("models/turrets/base.md3");
+    precache_sound ("weapons/uzi_fire.wav");
 
     self.think = turret_machinegun_std_init;
     self.nextthink = time + 0.5;

Modified: trunk/data/qcsrc/server/tturrets/units/unit_mlrs.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -7,11 +7,7 @@
 {
 
     // 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()
@@ -29,14 +25,17 @@
     missile.owner              = self;
     missile.bot_dodge          = TRUE;
     missile.bot_dodgerating    = self.shot_dmg;
-    missile.takedamage         = DAMAGE_YES;
+    missile.takedamage         = DAMAGE_NO;
     missile.damageforcescale   = 4;
-    missile.health             = 30;
+    //missile.health             = 25;
     missile.think              = turret_mlrs_rocket_explode;
+
     missile.nextthink          = time + max(self.tur_impacttime,(self.shot_radius * 2) / self.shot_speed);
+    //missile.nextthink          = missile.nextthink + random() * self.shot_spread;
+
     missile.solid              = SOLID_BBOX;
     missile.movetype           = MOVETYPE_FLYMISSILE;
-    missile.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    missile.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     missile.angles             = vectoangles(missile.velocity);
     missile.touch              = turret_mlrs_rocket_explode;
     missile.flags              = FL_PROJECTILE;
@@ -74,10 +73,10 @@
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //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);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
 
-    // Target dead, get another is still targeting the same.
+    // Target dead, Tell turret.
     if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
         self.owner.enemy = world;
 
@@ -90,7 +89,7 @@
 
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_INFRONT;
 
     if (turret_stdproc_init("mlrs_std") == 0)
     {
@@ -98,6 +97,11 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
+    self.shoot_flags |= TFL_SHOOT_VOLLYALWAYS;
+    self.volly_counter = self.shot_volly;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/mlrs.md3");
 

Modified: trunk/data/qcsrc/server/tturrets/units/unit_plasma.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -9,20 +9,35 @@
 
 void turret_plasma_postthink()
 {
+
+
     if (self.tur_head.frame != 0)
         self.tur_head.frame = self.tur_head.frame + 1;
 
-    if (self.tur_head.frame >= 5)
+    if (self.tur_head.frame > 5)
         self.tur_head.frame = 0;
 
+    /*
+    float h;
+    h = self.health / self.tur_health;
+    if(h<0.95)
+    {
+        if( (0.5 + random()) > h)
+        {
+            //bprint("Spark!\n");
+            //void(vector org, vector vel, float howmany) te_spark = #411;
+            te_spark(0.5 * (self.absmin + self.absmax) + (randomvec() * 64),randomvec() * 256,(1 - h) * 50);
+        }
+    }
+    */
 }
 
-void turret_plasma_dualpostthink()
+void turret_plasma_dual_postthink()
 {
     if (self.tur_head.frame != 0)
         self.tur_head.frame = self.tur_head.frame + 1;
 
-    if (self.tur_head.frame >= 6)
+    if (self.tur_head.frame > 6)
         self.tur_head.frame = 0;
 }
 
@@ -38,33 +53,36 @@
     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
+    //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.bot_dodge       = TRUE;
+    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.velocity        = normalize(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.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
     proj.enemy           = self.enemy;
     proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
-    if(self.tur_head.frame )
-        self.tur_head.frame = 0;
+    CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
 
+    if (self.tur_head.frame == 0)
+        self.tur_head.frame = 1;
 }
 
 void turret_plasma_dual_attack()
 {
     entity proj;
 
-    if (self.tur_head.frame > 2)
+    if (self.tur_head.frame != 0)
+        self.tur_head.frame = 3;
+    else
         self.tur_head.frame = 1;
 
     turret_tag_fire_update();
@@ -73,7 +91,7 @@
     proj                    = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
     setsize(proj, '0 0 0', '0 0 0');
-    setmodel(proj, "models/elaser.mdl"); // precision set above
+    //setmodel(proj, "models/elaser.mdl"); // precision set above
     proj.classname       = "plasmabomb";
     proj.owner           = self;
     proj.bot_dodge       = TRUE;
@@ -82,20 +100,15 @@
     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.velocity        = normalize(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.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);
-
+    CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
 }
 
 void turret_plasma_projectile_explode()
@@ -115,7 +128,6 @@
 
     self.event_damage = SUB_Null;
 
-
 #ifdef TURRET_DEBUG
     float d;
 
@@ -134,27 +146,32 @@
 {
     if (self.netname == "")      self.netname     = "Plasma Cannon";
 
+    // What ammo to use
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+
+    // How to aim
     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     if (turret_stdproc_init("plasma_std") == 0)
     {
         remove(self);
         return;
     }
+    self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/plasma.md3");
 
-
     if (!turret_tag_setup(0))
         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
 
-    // Our fire routine
-    self.turret_firefunc  = turret_plasma_dual_attack;
+    // Our fireing routine
+    self.turret_firefunc  = turret_plasma_attack;
 
-    // re-color badge & handle recoil effect
-    self.turret_postthink = turret_plasma_dualpostthink;
+    // Custom per turret frame stuff. usualy animation.
+    self.turret_postthink = turret_plasma_postthink;
 }
 
 
@@ -162,8 +179,14 @@
 {
     if (self.netname == "")      self.netname     = "Dual Plasma Cannon";
 
+    // What ammo to use
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
 
+    // How to aim at targets
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
+
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     if (turret_stdproc_init("plasma_dual") == 0)
     {
         remove(self);
@@ -173,17 +196,15 @@
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/plasmad.md3");
 
+
     if (!turret_tag_setup(0))
         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 | TFL_AIM_GROUND2;
+    // Our fireing routine
+    self.turret_firefunc  = turret_plasma_dual_attack;
 
-    // Our fire routine
-    self.turret_firefunc  = turret_plasma_attack;
-
-    // re-color badge & handle recoil effect
-    self.turret_postthink = turret_plasma_postthink;
+    // Custom per turret frame stuff. usualy animation.
+    self.turret_postthink = turret_plasma_dual_postthink;
 }
 
 

Modified: trunk/data/qcsrc/server/tturrets/units/unit_walker.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-02-11 21:35:32 UTC (rev 5841)
+++ trunk/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-02-11 21:41:19 UTC (rev 5842)
@@ -48,11 +48,8 @@
     {
         if (turret_validate_target(self,e,self.target_validate_flags))
             if (e != self)
-            {
-                //bprint(self.netname, " is meele hitting ",e.netname,"\n");
                 Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg"),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );
 
-            }
         e = e.chain;
     }
 }
@@ -71,7 +68,6 @@
         self.frame = self.frame + 1;
         if (self.frame > 25)
             self.frame = 5;
-
         break;
 
     case ANIM_RUN:
@@ -154,7 +150,8 @@
 {
     self.health = self.health - damage;
     self.velocity = self.velocity + vforce;
-    if (self.health <= 0) walker_rocket_explode();
+    if (self.health <= 0)
+        walker_rocket_explode();
 }
 
 //#define WALKER_ROCKET_MOVE movelib_move(newdir * 275,900,0.1,10)
@@ -162,14 +159,13 @@
 void walker_rocket_loop();
 void walker_rocket_think()
 {
-    vector olddir,newdir;
+    vector newdir;
     float edist;
     float itime;
     float m_speed;
 
-    self.nextthink          = time + 0.1;
+    self.nextthink = time;
 
-    olddir = normalize(self.velocity);
     edist = vlen(self.enemy.origin - self.origin);
 
     // Simulate crude guidance
@@ -179,8 +175,10 @@
             self.tur_shotorg = randomvec() * min(edist,64);
         else
             self.tur_shotorg = randomvec() * min(edist,256);
+
         self.cnt = time + 0.5;
     }
+
     if (edist < 256)
         self.tur_shotorg = '0 0 0';
 
@@ -192,14 +190,13 @@
         return;
     }
 
-    if ((random() < 0.01) && (self.shot_dmg != 1337))
+    if (self.shot_dmg != 1337)
+    if (random() < 0.01)
     {
         walker_rocket_loop();
         return;
     }
 
-    olddir = normalize(self.velocity);
-
     m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
 
     // Enemy dead? just keep on the current heading then.
@@ -220,40 +217,34 @@
     }
     else
     {
-        newdir  = olddir;
+        newdir  = normalize(self.velocity);
     }
 
-    WALKER_ROCKET_MOVE;
-
-
     // Turn model
     self.angles = vectoangles(self.velocity);
 
-    if (time + itime < time + 0.1)
-    {
-        self.think = walker_rocket_explode;
-        self.nextthink = time + itime;
-    }
+
+    WALKER_ROCKET_MOVE;
+    //UpdateCSQCProjectile(self);
 }
 
 void walker_rocket_loop3()
 {
+    vector newdir;
+    self.nextthink = time;
+
     if (self.tur_health < time)
     {
         self.think = walker_rocket_explode;
-        self.nextthink = time;
         return;
     }
 
-    self.nextthink = time + 0.1;
-
     if (vlen(self.origin - self.tur_shotorg) < 128 )
     {
         self.think = walker_rocket_think;
         return;
     }
 
-    vector newdir;
 
     newdir = steerlib_pull(self.tur_shotorg);
     WALKER_ROCKET_MOVE;
@@ -263,15 +254,16 @@
 
 void walker_rocket_loop2()
 {
+    vector newdir;
+
+    self.nextthink = time;
+
     if (self.tur_health < time)
     {
         self.think = walker_rocket_explode;
-        self.nextthink = time;
         return;
     }
 
-    self.nextthink = time;
-
     if (vlen(self.origin - self.tur_shotorg) < 128 )
     {
         self.tur_shotorg = self.origin - '0 0 200';
@@ -279,18 +271,14 @@
         return;
     }
 
-    vector newdir;
-
+    self.angles = vectoangles(self.velocity);
     newdir = steerlib_pull(self.tur_shotorg);
     WALKER_ROCKET_MOVE;
-
-    self.angles = vectoangles(self.velocity);
-
 }
 
 void walker_rocket_loop()
 {
-    self.nextthink= time + 0;
+    self.nextthink = time;
     self.tur_shotorg = self.origin + '0 0 400';
     self.think = walker_rocket_loop2;
     self.shot_dmg = 1337;
@@ -306,6 +294,8 @@
     makevectors(self.angles);
     //self.angles_x *= -1;
 
+    te_explosion (org);
+
     rocket = spawn ();
     setorigin(rocket, org);
 
@@ -314,12 +304,14 @@
 
     rocket.classname          = "walker_rocket";
     rocket.owner              = self;
+
     rocket.bot_dodge          = TRUE;
     rocket.bot_dodgerating    = 50;
+
     rocket.takedamage         = DAMAGE_YES;
 
     rocket.damageforcescale   = 2;
-    rocket.health             = 10;
+    rocket.health             = 25;
     rocket.tur_shotorg        = randomvec() * 512;
     rocket.cnt                = time + 1;
     rocket.enemy              = self.enemy;
@@ -331,20 +323,16 @@
 
     rocket.event_damage       = walker_rocket_damage;
 
-    rocket.nextthink          = time + 0.25;
-    rocket.solid              = SOLID_BBOX;
-    rocket.movetype           = MOVETYPE_FLYMISSILE;
-    rocket.velocity           = ((v_forward + v_up * 0.25) +(randomvec() * 0.1))* cvar("g_turrets_unit_walker_std_rocket_speed");
+    rocket.nextthink          = time;// + 0.25;
+    rocket.movetype           = MOVETYPE_FLY;
+    rocket.velocity           = normalize((v_forward + v_up * 0.25) + (randomvec() * 0.1)) * cvar("g_turrets_unit_walker_std_rocket_speed");
     rocket.angles             = vectoangles(rocket.velocity);
     rocket.touch              = walker_rocket_explode;
     rocket.flags              = FL_PROJECTILE;
     rocket.solid              = SOLID_BBOX;
     rocket.tur_health         = time + 9;
 
-	CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, FALSE); // no cull, fly sound
-
-    te_explosion (rocket.origin);
-
+	CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
 }
 
 /*
@@ -383,13 +371,11 @@
 
     org = self.owner.origin + gettaginfo(self.owner,f);
 
-
-
     self.nextthink = time + 0.2;
     oldself = self;
     self = self.owner;
     walker_fire_rocket(org);
-    self=oldself;
+    self = oldself;
 }
 
 /*
@@ -470,7 +456,7 @@
 
                     if(self.pathgoal.enemy)
                     {
-                        self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PLF_GROUNDSNAP,1500,2,PT_QUICKBOX);
+                        self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PFL_GROUNDSNAP,1500,2,PT_QUICKBOX);
                         self.pathgoal = self.pathgoal.enemy;
                     }
                 }
@@ -490,7 +476,7 @@
             wish_angle = angleofs(self,self.enemy);
             steer = steerlib_pull(self.enemy.origin);
 
-            if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
+            if (self.tur_dist_aimpos < cvar("g_turrets_unit_walker_std_meele_range"))
             {
                 if (fabs(wish_angle_y) < 15)
                 {
@@ -588,7 +574,7 @@
 
     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
 
-    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, cvar("g_balance_uzi_speed"), 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
     te_smallflash(self.tur_shotorg_updated);
 
     if (!(self.uzi_bulletcounter & 3))
@@ -641,7 +627,7 @@
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);
             self.pathgoal = e;
         }
     }
@@ -681,8 +667,8 @@
     self.wkr_spawn = spawn();
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
-    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+    self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
 
     self.turret_respawnhook = walker_respawnhook;
     self.turret_diehook = walker_diehook;
@@ -712,8 +698,9 @@
     self.wkr_spawn.solid    = SOLID_NOT;
 
 
-    traceline(self.wkr_spawn.origin + '0 0 10', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
+    traceline(self.wkr_spawn.origin + '0 0 16', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
     setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
+    setorigin(self,self.wkr_spawn.origin);
 
     setmodel(self,"models/turrets/walker_body.md3");
     setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");
@@ -749,7 +736,7 @@
         e = find(world,targetname,self.target);
         if (!e)
         {
-            bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
+            dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
             self.target = "";
         }
 
@@ -757,7 +744,7 @@
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);
             self.pathgoal = e;
         }
     }




More information about the nexuiz-commits mailing list