]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/vehicles/racer.qc
Merge remote branch 'origin/terencehill/arena_and_ca_fixes'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / racer.qc
index 7f7a73691d893fa35974f18c524df4174b9bb425..777820e48c261c26f18cc8c9b093b42abfa71a85 100644 (file)
@@ -1,6 +1,5 @@
 #define RACER_MIN '-120 -120 -40'
 #define RACER_MAX '120 120 40'
-#define RACER_ENGINE "sound/vehicles/racer.wav"
 
 #ifdef SVQC
 void racer_exit(float eject);
@@ -67,6 +66,10 @@ float autocvar_g_vehicle_racer_blowup_coredamage;
 float autocvar_g_vehicle_racer_blowup_edgedamage;
 float autocvar_g_vehicle_racer_blowup_forceintensity;
 
+float autocvar_g_vehicle_racer_bouncefactor;
+float autocvar_g_vehicle_racer_bouncestop;
+vector autocvar_g_vehicle_racer_bouncepain;
+
 var vector racer_force_from_tag(string tag_name, float spring_length, float max_power);
 
 void racer_align4point()
@@ -256,13 +259,17 @@ float racer_frame()
     vector df;
     float ftmp;
 
-    player          = self;
-    racer           = self.vehicle;
+       if(intermission_running)
+               return 1;
 
+    player  = self;
+    racer   = self.vehicle;
+    self    = racer;
+    
     player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
-
-    self = racer;
-
+    
+    vehicles_painframe();
+    
     if(racer.deadflag != DEAD_NO)
     {
         self = player;
@@ -319,7 +326,7 @@ float racer_frame()
         {        
             self.sounds = 1;
             self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
-            sound (self, CHAN_TRIGGER, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTN_NORM);
         }
     }
     else
@@ -328,7 +335,7 @@ float racer_frame()
         {        
             self.sounds = 0;
             self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
-            sound (self, CHAN_TRIGGER, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
         }        
     }
     
@@ -346,23 +353,22 @@ float racer_frame()
         {            
             traceline(self.origin, self.origin - '0 0 256', MOVE_NORMAL, self);
             if(trace_fraction != 1.0)
-                pointparticles(particleeffectnum("smoke_small"), trace_endpos, '0 0 0', 1);                
+                pointparticles(particleeffectnum("smoke_small"), trace_endpos, '0 0 0', 1);
             
             self.invincible_finished = time + 0.1 + (random() * 0.1);
         }
-        
 
         if(self.strength_finished < time)
         {        
             //self.sounds = 2;
             self.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
-            sound (self, CHAN_PAIN, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTN_NORM);            
+            sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTN_NORM);            
         }        
     }
     else
     {
         self.strength_finished = 0;
-        sound (self, CHAN_PAIN, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+        sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
     }
         
 
@@ -489,8 +495,8 @@ void racer_think()
 void racer_enter()
 {
     self.movetype = MOVETYPE_BOUNCE;
-    self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
-    self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
+    self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health)  * 100;
+    self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield)  * 100;
     
     if(self.owner.flagcarried)
        setorigin(self.owner.flagcarried, '-190 0 96');
@@ -503,7 +509,7 @@ void racer_exit(float eject)
     self.think      = racer_think;
     self.nextthink  = time;
     self.movetype   = MOVETYPE_TOSS;
-    sound (self, CHAN_PAIN, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+    sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
     
     if not (self.owner)
         return;
@@ -515,16 +521,24 @@ void racer_exit(float eject)
            spot = vehicles_findgoodexit(spot);
            setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
+           self.owner.oldvelocity = self.owner.velocity;
        }
        else
        {
+           self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed;
+           self.owner.oldvelocity = self.owner.velocity;
            spot = self.origin - v_forward * 200 + '0 0 64';
            spot = vehicles_findgoodexit(spot);
            setorigin(self.owner , spot);
        }
-       
+       antilag_clear(self.owner);
     self.owner = world;
 }
+void racer_impact()
+{
+    if(autocvar_g_vehicle_racer_bouncepain_x)
+        vehilces_impact(autocvar_g_vehicle_racer_bouncepain_x, autocvar_g_vehicle_racer_bouncepain_y, autocvar_g_vehicle_racer_bouncepain_z);
+}
 
 void racer_spawn()
 {
@@ -539,14 +553,15 @@ void racer_spawn()
     self.scale          = 0.5;
 
     setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5);
+    self.bouncefactor = autocvar_g_vehicle_racer_bouncefactor;
+    self.bouncestop = autocvar_g_vehicle_racer_bouncestop;    
+    self.vehicle_impact = racer_impact;
+    //self.destvec = autocvar_g_vehicle_racer_bouncepain;
 }
 
 
 void racer_blowup()
 {
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("explosion_big"), self.origin, '0 0 0', 1);
-
     self.deadflag    = DEAD_DEAD;
     self.vehicle_exit(VHEF_NORMAL);
 
@@ -556,7 +571,6 @@ void racer_blowup()
                                        autocvar_g_vehicle_racer_blowup_forceintensity,
                                        DEATH_WAKIBLOWUP, world);
 
-    self.alpha = -1;
     self.nextthink  = time + autocvar_g_vehicle_racer_respawntime;
     self.think      = racer_spawn;
     self.movetype   = MOVETYPE_NONE;
@@ -573,7 +587,6 @@ void racer_blowup()
 
 void racer_deadtouch()
 {
-    dprint("Boink!\n");
     self.avelocity_x *= 0.7;
     self.cnt -= 1;
     if(self.cnt <= 0)
@@ -584,7 +597,6 @@ void racer_die()
 {
     self.health       = 0;
     self.event_damage = SUB_Null;
-    self.iscreature   = FALSE;
     self.solid        = SOLID_CORPSE;
     self.takedamage   = DAMAGE_NO;
     self.deadflag     = DEAD_DYING;
@@ -613,7 +625,7 @@ void racer_dinit()
     if not (vehicle_initialize(
              "Wakizashi",
              "models/vehicles/wakizashi.dpm",
-             "",
+             "null", // we need this so tur_head is networked and usable for sounds
              "models/vehicles/wakizashi_cockpit.dpm",
              "", "", "tag_viewport",
              HUD_WAKIZASHI,
@@ -644,11 +656,11 @@ void racer_dinit()
 
 void spawnfunc_vehicle_racer()
 {
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    self.vehicle_flags |= VHF_DMGROLL;
 
-    precache_sound ("weapons/laserimpact.wav");
     precache_sound ("weapons/lasergun_fire.wav");
     precache_sound ("weapons/rocket_fire.wav");
-    precache_sound ("weapons/rocket_impact.wav");
     
     precache_sound ("vehicles/racer_idle.wav");
     precache_sound ("vehicles/racer_move.wav");
@@ -673,6 +685,10 @@ void spawnfunc_vehicle_racer()
         self.vehicle_flags |= VHF_HEALTHREGEN;
 
     self.think = racer_dinit;
-    self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
+    
+    if(g_assault)
+        self.nextthink = time + 0.5;
+    else
+        self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
 #endif // SVQC