]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/tturrets.qc
Merge remote branch 'origin/master' into terencehill/essential_weapons_panel
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / tturrets.qc
index 803671d2ca99df78536c2bf73bdb26ce7c03768b..1332d60ca106f35fd90f1658be69f978b20a22f4 100644 (file)
@@ -4,30 +4,89 @@ string tid2info_name;
 vector  tid2info_min;
 vector  tid2info_max;
 
+void turret_tid2info(float _tid);
+void turret_precache(float _tid);
+float turret_is_precache[TID_LAST];
+
 void turrets_precache()
 {
-    precache_model ("models/turrets/ewheel-base2.md3");
-    precache_model ("models/turrets/ewheel-gun1.md3");
-    precache_model ("models/turrets/base.md3");
-    precache_model ("models/turrets/flac.md3");
-    precache_model ("models/turrets/reactor.md3");
-    precache_model ("models/turrets/hellion.md3");
-    precache_model ("models/turrets/hk.md3");
-    precache_model ("models/turrets/machinegun.md3");
-    precache_model ("models/turrets/mlrs.md3");
-    precache_model ("models/turrets/phaser.md3");
-    precache_model ("models/turrets/phaser_beam.md3");
-    precache_model ("models/turrets/plasma.md3");
-    precache_model ("models/turrets/plasmad.md3");
-    precache_model ("models/turrets/tesla_head.md3");
-    precache_model ("models/turrets/tesla_base.md3");
-    precache_model ("models/turrets/walker_head_minigun.md3");
-    precache_model ("models/turrets/walker_body.md3");
-    precache_model ("models/turrets/rocket.md3");
-    
-    precache_sound ("turrets/phaser.wav");
-    precache_sound ("weapons/rocket_impact.wav");
-    precache_sound ("weapons/uzi_fire.wav");
+    turret_precache(TID_COMMON);
+}
+
+void turret_precache(float _tid)
+{    
+    if (!turret_is_precache[TID_COMMON])
+    {
+        dprint("turret_precache TID_COMMON\n");
+        precache_sound ("weapons/rocket_impact.wav");
+        precache_model ("models/turrets/base-gib1.md3");
+        precache_model ("models/turrets/base-gib2.md3");
+        precache_model ("models/turrets/base-gib3.md3");
+        precache_model ("models/turrets/base-gib4.md3");
+        precache_model ("models/turrets/head-gib1.md3");
+        precache_model ("models/turrets/head-gib2.md3");
+        precache_model ("models/turrets/head-gib3.md3");
+        precache_model ("models/turrets/head-gib4.md3");
+        precache_model ("models/turrets/terrainbase.md3");
+        precache_model ("models/turrets/base.md3");
+        precache_model ("models/turrets/rocket.md3");
+    }
+    turret_tid2info(_tid);
+    if(turret_is_precache[_tid])
+    {
+        dprint("turret_precache: ", tid2info_name, " allready precachd, skipping.\n");
+        return;
+    }
+    else
+        dprint("turret_precache: ", tid2info_name, " precaching.\n");
+
+    switch(_tid)
+    {
+        case TID_EWHEEL:
+            precache_model ("models/turrets/ewheel-base2.md3");
+            precache_model ("models/turrets/ewheel-gun1.md3");            
+            break;
+        case TID_FLAC:
+            precache_model ("models/turrets/flac.md3");
+            break;
+        case TID_FUSION:
+            precache_model ("models/turrets/reactor.md3");    
+            break;
+        case TID_HELLION:
+            precache_model ("models/turrets/hellion.md3");
+            break;
+        case TID_HK:
+            precache_model ("models/turrets/hk.md3");
+            break;
+        case TID_MACHINEGUN:
+            precache_model ("models/turrets/machinegun.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+        case TID_MLRS:
+            precache_model ("models/turrets/mlrs.md3");
+            break;
+        case TID_PHASER:
+            precache_model ("models/turrets/phaser.md3");
+            precache_model ("models/turrets/phaser_beam.md3");
+            precache_sound ("turrets/phaser.wav");
+            break;
+        case TID_PLASMA:
+            precache_model ("models/turrets/plasma.md3");
+            break;
+        case TID_PLASMA_DUAL:
+            precache_model ("models/turrets/plasmad.md3");
+            break;
+        case TID_TESLA:
+            precache_model ("models/turrets/tesla_head.md3");
+            precache_model ("models/turrets/tesla_base.md3");
+            break;
+        case TID_WALKER:
+            precache_model ("models/turrets/walker_head_minigun.md3");
+            precache_model ("models/turrets/walker_body.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+    }    
+    turret_is_precache[_tid] = TRUE;
 }
 
 void turret_tid2info(float _tid)
@@ -142,8 +201,6 @@ void turret_draw()
 {        
     float dt;
 
-    self.drawmask = MASK_NORMAL;
-    
     dt = time - self.move_time;
     self.move_time = time;
     if(dt <= 0)
@@ -152,21 +209,52 @@ void turret_draw()
     self.tur_head.angles += dt * self.tur_head.move_avelocity;
 
     if (self.health < 127)
-    if(random() < 0.25)
-        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+    {
+        dt = random();
+        
+        if(dt < 0.25)
+            te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+        
+    }
+    
+    if(self.health < 85)    
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
+    if(self.health < 32)
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_large"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
 }
 
-void turret_moving_head_draw()
+void turret_walker_draw()
 {        
-    self.drawmask = MASK_NORMAL;
+    float dt;
+            
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    fixedmakevectors(self.angles);
+    movelib_groundalign4point(300, 100, 0.25);
+    
+    setorigin(self, self.origin + self.velocity * dt);
+    setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+    
+    self.angles_y = self.move_angles_y;
+    
+    if (self.health < 127)
+    if(random() < 0.25)
+        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
 }
 
-void turret_moving_draw()
+void turret_ewheel_draw()
 {        
     float dt;
-
-    self.drawmask = MASK_NORMAL;
-        
+            
     dt = time - self.move_time;
     self.move_time = time;
     if(dt <= 0)
@@ -176,13 +264,15 @@ void turret_moving_draw()
     movelib_groundalign4point(300, 100, 0.25);
     
     setorigin(self, self.origin + self.velocity * dt);
-    if(self.turret_type == TID_WALKER)
-        setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
-    else
-        setorigin(self.tur_head, self.origin);
+    setorigin(self.tur_head, self.origin);
+    
     self.tur_head.angles += dt * self.tur_head.move_avelocity;
     
-    //self.angles_y += (self.move_angles_y - self.angles_y)* dt;
+    // Simulate banking
+    //self.angles_z -= self.angles_z * dt * 2;
+    //self.angles_z = bound(-45, self.angles_z  + ((self.move_angles_y - self.angles_y * -25) * dt), 45);
+    
+    self.angles_y = self.move_angles_y;
     
     if (self.health < 127)
     if(random() < 0.25)
@@ -215,17 +305,25 @@ void turret_construct()
     self.movetype               = MOVETYPE_NOCLIP;
     self.tur_head.movetype      = MOVETYPE_NOCLIP;    
     self.draw                   = turret_draw;
-    self.tur_head.draw          = turret_head_draw;
     self.entremove              = turret_remove;
+    self.drawmask = MASK_NORMAL;
+    self.tur_head.drawmask = MASK_NORMAL;
 
     if(self.turret_type == TID_EWHEEL || self.turret_type == TID_WALKER)
     {
         self.gravity            = 1;
+        self.movetype           = MOVETYPE_BOUNCE;
         self.move_movetype      = MOVETYPE_BOUNCE;
         self.move_origin        = self.origin;                
-        self.move_time          = time;        
-        self.draw               = turret_moving_draw;
-        self.tur_head.draw      = turret_moving_head_draw;
+        self.move_time          = time;
+        switch(self.turret_type)
+        {
+            case TID_EWHEEL:
+                self.draw               = turret_ewheel_draw;
+                break;
+            case TID_WALKER:
+                self.draw               = turret_walker_draw;
+        }        
     }
 }
 
@@ -257,7 +355,7 @@ void turret_gibboom()
 {
     float i;
     
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
 
     for (i = 1; i < 5; i = i + 1)
@@ -301,7 +399,7 @@ void turret_die()
     
     setmodel(self, "");
     setmodel(self.tur_head, "");
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
     turret_tid2info(self.turret_type);
     dprint("Turret ", tid2info_name, " dies.\n");
@@ -348,6 +446,7 @@ void ent_turret()
            self.angles_x = ReadAngle();
            self.angles_y = ReadAngle();
            
+           turret_precache(self.turret_type);
            turret_construct();
     }
     
@@ -375,10 +474,11 @@ void ent_turret()
         self.velocity_y = ReadShort();
         self.velocity_z = ReadShort();
         
-        self.angles_y       = ReadShort();
-        self.move_time      = time;
-        self.move_velocity  = self.velocity;
-        self.move_origin    = self.origin;
+        self.move_angles_y = ReadShort();
+            
+        self.move_time     = time;
+        self.move_velocity = self.velocity;
+        self.move_origin   = self.origin;
     }
         
     if(sf & TNSF_ANIM)
@@ -388,7 +488,7 @@ void ent_turret()
     }
 
     if(sf & TNSF_STATUS)
-    {        
+    {
         float _team;
         _team = ReadByte();
         _team -= 1; // /&)=(%&#)&%)/#&)=½!!!½!!". thanks.
@@ -398,8 +498,9 @@ void ent_turret()
             self.team = _team;
             turret_changeteam();        
         }
+        
+        if(self.health == 0)
+            turret_die();
     } 
     
-    if(self.health == 0)
-        turret_die();
 }