From b1165a00d02e8f7b902bf8a5462acbacfedcd18a Mon Sep 17 00:00:00 2001
From: Jakob MG <jakob_mg@hotmail.com>
Date: Tue, 22 Nov 2011 09:58:42 +0100
Subject: [PATCH] Ignore sky & softtargets for vehicle impact damage. Extand
 vehile impactdamage to all colissions. Fix potentialy massive bug with raptor
 (missing self re-set after swaping self in frame code)

---
 qcsrc/server/sv_main.qc            |  4 +--
 qcsrc/server/vehicles/racer.qc     |  8 ++---
 qcsrc/server/vehicles/raptor.qc    |  9 +++---
 qcsrc/server/vehicles/spiderbot.qc |  7 ++---
 qcsrc/server/vehicles/vehicles.qc  | 50 ++++++++++++++----------------
 5 files changed, 36 insertions(+), 42 deletions(-)

diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc
index eb386005d..6e4b0ccb7 100644
--- a/qcsrc/server/sv_main.qc
+++ b/qcsrc/server/sv_main.qc
@@ -128,8 +128,8 @@ void CreatureFrame (void)
 				}
 			}
 		}
-
-		self.oldvelocity = self.velocity;
+		
+        self.oldvelocity = self.velocity;
 	}
 	self = oldself;
 }
diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc
index ff7f2e483..998736b5f 100644
--- a/qcsrc/server/vehicles/racer.qc
+++ b/qcsrc/server/vehicles/racer.qc
@@ -531,12 +531,10 @@ void racer_exit(float eject)
 	
     self.owner = world;
 }
-void racer_worldimpact()
+void racer_impact()
 {
-    if(self.play_time < time)
     if(autocvar_g_vehicle_racer_bouncepain_x)
-        vehilces_worldimpact(autocvar_g_vehicle_racer_bouncepain_x, autocvar_g_vehicle_racer_bouncepain_y, autocvar_g_vehicle_racer_bouncepain_z);
-
+        vehilces_impact(autocvar_g_vehicle_racer_bouncepain_x, autocvar_g_vehicle_racer_bouncepain_y, autocvar_g_vehicle_racer_bouncepain_z);
 }
 
 void racer_spawn()
@@ -554,7 +552,7 @@ void racer_spawn()
     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_worldimpact = racer_worldimpact;
+    self.vehicle_impact = racer_impact;
     //self.destvec = autocvar_g_vehicle_racer_bouncepain;
 }
 
diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc
index 63509aecd..f5ecd97e3 100644
--- a/qcsrc/server/vehicles/raptor.qc
+++ b/qcsrc/server/vehicles/raptor.qc
@@ -542,6 +542,8 @@ float raptor_frame()
         VEHICLE_UPDATE_PLAYER(shield, raptor);
 
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
+    
+    self = player;
     return 1;
 }
 
@@ -595,11 +597,10 @@ void raptor_die()
 	self.touch     = raptor_blowup;
 }
 
-void raptor_worldimpact()
+void raptor_impact()
 {
-    if(self.play_time < time)
     if(autocvar_g_vehicle_raptor_bouncepain_x)
-        vehilces_worldimpact(autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z);
+        vehilces_impact(autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z);
 }
 
 void raptor_spawn()
@@ -619,7 +620,7 @@ void raptor_spawn()
         
     self.bouncefactor = autocvar_g_vehicle_raptor_bouncefactor;
     self.bouncestop = autocvar_g_vehicle_raptor_bouncestop;    
-    self.vehicle_worldimpact = raptor_worldimpact;    
+    self.vehicle_impact = raptor_impact;    
 }
 
 // If we dont do this ever now and then, the raptors rotors
diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc
index 903d3b204..79d413e1d 100644
--- a/qcsrc/server/vehicles/spiderbot.qc
+++ b/qcsrc/server/vehicles/spiderbot.qc
@@ -485,11 +485,10 @@ void spiderbot_exit(float eject)
         
     self.owner = world;
 }
-void spider_worldimpact()
+void spider_impact()
 {
-    if(self.play_time < time)
     if(autocvar_g_vehicle_spiderbot_bouncepain_x)
-        vehilces_worldimpact(autocvar_g_vehicle_spiderbot_bouncepain_x, autocvar_g_vehicle_spiderbot_bouncepain_y, autocvar_g_vehicle_spiderbot_bouncepain_z);    
+        vehilces_impact(autocvar_g_vehicle_spiderbot_bouncepain_x, autocvar_g_vehicle_spiderbot_bouncepain_y, autocvar_g_vehicle_spiderbot_bouncepain_z);    
 }
 void spiderbot_spawn()
 {
@@ -506,7 +505,7 @@ void spiderbot_spawn()
 
     setorigin(self, self.pos1 + '0 0 128');
     self.angles = self.pos2;
-    self.vehicle_worldimpact = spider_worldimpact;
+    self.vehicle_impact = spider_impact;
 }
 
 void spiderbot_headfade()
diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc
index 908ccc624..c56715e9b 100644
--- a/qcsrc/server/vehicles/vehicles.qc
+++ b/qcsrc/server/vehicles/vehicles.qc
@@ -376,51 +376,47 @@ float vehicles_crushable(entity e)
     return FALSE;
 }
 
-void vehilces_worldimpact(float _minspeed, float _speedfac, float _maxpain)
-{
+void vehilces_impact(float _minspeed, float _speedfac, float _maxpain)
+{    
+    if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+        return;
+    
     if(self.play_time < time)
     {                    
-        float wc, take;
-        wc = vlen(self.velocity - self.oldvelocity);
+        float wc = vlen(self.velocity - self.oldvelocity);
+        //dprint("oldvel: ", vtos(self.oldvelocity), "\n");
+        //dprint("vel: ", vtos(self.velocity), "\n");
         if(_minspeed < wc)
         {
-            take = min(_speedfac * wc, _maxpain);
+            float take = take = min(_speedfac * wc, _maxpain);
             Damage (self, world, world, take, DEATH_FALL, self.origin, '0 0 0');
             self.play_time = time + 0.25;
             
-            dprint("oldvel: ", vtos(self.oldvelocity), "\n");
-            dprint("vel: ", vtos(self.velocity), "\n");
-            dprint("wc: ", ftos(wc), "\n");
-            dprint("take: ", ftos(take), "\n");
-            
+            //dprint("wc: ", ftos(wc), "\n");
+            //dprint("take: ", ftos(take), "\n");
         }
     }
 }
 
-.void() vehicle_worldimpact;
+.void() vehicle_impact;
 void vehicles_touch()
 {
     // Vehicle currently in use
     if(self.owner)
     {
-        // Colided with world?
-        if(other == world)
-        {
-            if(self.vehicle_worldimpact)
-                self.vehicle_worldimpact();
-        }
-        else
+        if(other != world)
+        if(vehicles_crushable(other))
         {
-            if(other.vehicle_flags & VHF_ISVEHICLE)
-            {
-                //other.velocity += self.velocity * (self.mass / other.mass);
-            }
-            else if(vehicles_crushable(other))
-            {
-                if(vlen(self.velocity) != 0)
-                    Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
-            }
+            if(vlen(self.velocity) != 0)
+                Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+            
+            return; // Dont do selfdamage when hitting "soft targets".
         }
+        
+        if(self.play_time < time)
+        if(self.vehicle_impact)
+            self.vehicle_impact();
+        
         return;
     }
 
-- 
2.39.5