]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/vehicles/vehicles.qc
unwops the projetile damage fix
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / vehicles.qc
index e98e1276131a6d291b3bd620d4d5172d905ed131..69c0f87e51f23528c0fd5caeffb32f3844dc2f29 100644 (file)
@@ -1,5 +1,7 @@
 float autocvar_g_vehicles_crush_dmg;
 float autocvar_g_vehicles_crush_force;
+float autocvar_g_vehicles_delayspawn;
+float autocvar_g_vehicles_delayspawn_jitter;
 
 void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
 void vehicles_return();
@@ -10,8 +12,8 @@ void vehicles_clearrturn();
 void vehicles_setreturn();
 
 
-/** AuxiliaryXhair* 
-    Send addictional points of interest to be drawn, to vehicle owner
+/** AuxiliaryXhair*
+    Send additional points of interest to be drawn, to vehicle owner
 **/
 float MAX_AXH = 4;
 .entity AuxiliaryXhair[MAX_AXH];
@@ -80,6 +82,12 @@ void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id)
 */
 // End AuxiliaryXhair
 
+/**
+    Notifies the client that he enterd a vehicle, and sends 
+    realavent data.
+    
+    only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT)
+**/
 void CSQCVehicleSetup(entity own, float vehicle_id)
 {
        msg_entity = own;
@@ -90,21 +98,22 @@ void CSQCVehicleSetup(entity own, float vehicle_id)
 }
 
 /** vehicles_locktarget
-    
+
     Generic target locking.
-    
+
     Figure out if what target is "locked" (if any), for missile tracking as such.
-    
+
     after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean
     you have a locked in target.
-    
+
     Exspects a crosshair_trace() or equivalent to be
     dont before calling.
-    
+
 **/
 .entity lock_target;
 .float  lock_strength;
 .float  lock_time;
+.float  lock_soundtime;
 void vehicles_locktarget(float incr, float decr, float _lock_time)
 {
     if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
@@ -115,7 +124,16 @@ void vehicles_locktarget(float incr, float decr, float _lock_time)
     }
 
     if(self.lock_time > time)
+    {
+        if(self.lock_target)
+        if(self.lock_soundtime < time)
+        {
+            self.lock_soundtime = time + 0.5;
+            play2(self.owner, "vehicles/locked.wav");
+        }
+        
         return;
+    }
 
     if(trace_ent != world)
     {
@@ -131,7 +149,22 @@ void vehicles_locktarget(float incr, float decr, float _lock_time)
 
     if(self.lock_target == world && trace_ent != world)
         self.lock_target = trace_ent;
-
+    
+    if(self.lock_target && trace_ent == self.lock_target) 
+    {            
+        if(self.lock_strength != 1 && self.lock_strength + incr >= 1)
+        {
+            play2(self.owner, "vehicles/lock.wav");
+            self.lock_soundtime = time + 0.8;
+        }        
+        else if (self.lock_strength != 1 && self.lock_soundtime < time)
+        {            
+            play2(self.owner, "vehicles/locking.wav");
+            self.lock_soundtime = time + 0.3;
+        }
+        
+    }    
+        
     // Have a locking target
     // Trace hit current target
     if(trace_ent == self.lock_target && trace_ent != world)
@@ -201,6 +234,10 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float
 // Generic vehile projectile system
 void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
+    // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
+    if(inflictor.owner == self.owner)
+        return; 
+    
     self.health -= damage;
     self.velocity += force;
     if(self.health < 1)
@@ -235,7 +272,7 @@ void vehicles_projectile_explode()
 entity vehicles_projectile(string _mzlfx, string _mzlsound,
                            vector _org, vector _vel,
                            float _dmg, float _radi, float _force,  float _size,
-                           float _deahtype, float _projtype, float _health, 
+                           float _deahtype, float _projtype, float _health,
                            float _cull, float _clianim)
 {
     entity proj;
@@ -287,7 +324,7 @@ entity vehicles_projectile(string _mzlfx, string _mzlsound,
 // End generic vehile projectile system
 
 /** vehicles_spawn
-    Exetuted for all vehiles on (re)spawn.
+    Exetuted for all vehicles on (re)spawn.
     Sets defaults for newly spawned units.
 **/
 void vehicles_spawn()
@@ -296,7 +333,7 @@ void vehicles_spawn()
 
     // De-own & reset
     self.vehicle_hudmodel.viewmodelforclient = self;
-    
+
     self.owner              = world;
     self.touch              = vehicles_touch;
     self.event_damage       = vehicles_damage;
@@ -309,7 +346,7 @@ void vehicles_spawn()
     self.flags              = FL_NOTARGET;
     self.avelocity          = '0 0 0';
     self.velocity           = '0 0 0';
-    
+
     // Reset locking
     self.lock_strength      = 0;
     self.lock_target        = world;
@@ -400,12 +437,12 @@ void vehicles_enter()
 
     self.owner          = other;
     self.switchweapon   = other.switchweapon;
-    
+
     // .viewmodelforclient works better.
     //self.vehicle_hudmodel.drawonlytoclient = self.owner;
 
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;        
-    
+    self.vehicle_hudmodel.viewmodelforclient = self.owner;
+
     self.event_damage         = vehicles_damage;
     self.nextthink            = 0;
     self.owner.angles         = self.angles;
@@ -438,9 +475,6 @@ void vehicles_enter()
     self.team                 = self.owner.team;
     self.flags               -= FL_NOTARGET;
 
-#if 0    
-    other.clientcamera = self.vehicle_viewport;
-#else
     msg_entity = other;
     WriteByte (MSG_ONE, SVC_SETVIEWPORT);
     WriteEntity(MSG_ONE, self.vehicle_viewport);
@@ -459,7 +493,6 @@ void vehicles_enter()
         WriteAngle(MSG_ONE,  self.angles_y);      // yaw
         WriteAngle(MSG_ONE,  0);                  // roll
     }
-#endif
 
     vehicles_clearrturn();
 
@@ -468,8 +501,65 @@ void vehicles_enter()
     self.vehicle_enter();
 }
 
-void vehicles_exit(float eject)
+/** vehicles_findgoodexit
+    Locates a valid location for the player to exit the vehicle.
+    Will first try prefer_spot, then up 100 random spots arround the vehicle
+    wich are in direct line of sight and empty enougth to hold a players bbox
+**/
+vector vehicles_findgoodexit(vector prefer_spot)
 {
+    vector exitspot;
+    float mysize;
+    
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return prefer_spot;
+    
+    mysize = vlen(self.maxs - self.mins);
+    float i;
+    vector v, v2;
+    v2 = 0.5 * (self.absmin + self.absmax);
+    for(i = 0; i < 100; ++i)
+    {        
+        v = randomvec();
+        v_z = 0;
+        v = v2 + normalize(v) * mysize;
+        tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner);
+        if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+            return v;
+    }
+    
+    /*
+    exitspot = (self.origin + '0 0 48') + v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+
+    exitspot = (self.origin + '0 0 48') + v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    */
+    
+    return self.origin;
+}
+
+/** vehicles_exit
+    Standarrd vehicle release fucntion.
+    custom code goes in self.vehicle_exit
+**/
+void vehicles_exit(float eject)
+{      
        self.flags |= FL_NOTARGET;
 
     if (self.owner)
@@ -618,7 +708,6 @@ void vehicles_clearrturn()
             ret.nextthink   = time + 0.1;
             return;
         }
-
         ret = ret.chain;
     }
 }
@@ -634,15 +723,7 @@ void vehicles_setreturn()
     ret.enemy       = self;
     ret.think       = vehicles_return;
     ret.nextthink   = time + self.vehicle_respawntime;
-}
-
-float vehicles_customizeentityforclient()
-{
-    if(self.deadflag  == DEAD_DEAD)
-        return FALSE;
-    else
-        return TRUE;
-}
+} 
 
 void vehicles_configcheck(string  configname, float check_cvar)
 {
@@ -661,7 +742,7 @@ void vehicles_reset_colors()
 
     if(autocvar_g_fullbrightplayers)
         _effects |= EF_FULLBRIGHT;
-        
+
     if(self.team)
         _colormap = 1024 + (self.team - 1) * 17;
     else
@@ -683,7 +764,7 @@ void vehicles_reset_colors()
         }
         e = e.chain;
     }
-    
+
     self.vehicle_hudmodel.effects  = self.effects  = _effects | EF_LOWPRECISION;
     self.vehicle_hudmodel.colormod = self.colormod = _colormod;
     self.vehicle_hudmodel.colormap = self.colormap = _colormap;
@@ -753,15 +834,14 @@ float vehicle_initialize(string  net_name,
     self.iscreature         = TRUE;
     self.hud                = vhud;
 
-    //self.customizeentityforclient = vehicles_customizeentityforclient;
     self.vehicle_die         = dieproc;
     self.vehicle_exit        = exitfunc;
     self.vehicle_enter       = enterproc;
     self.PlayerPhysplug      = physproc;
     self.event_damage        = vehicles_damage;
     self.touch               = vehicles_touch;
-    self.think               = vehicles_spawn;
-    self.nextthink           = time;
+    self.think               = vehicles_spawn;    
+    self.nextthink           = time;        
     self.vehicle_respawntime = _respawntime;
     self.vehicle_spawn       = spawnproc;
 
@@ -796,17 +876,13 @@ float vehicle_initialize(string  net_name,
         tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
         setorigin(self, trace_endpos);
     }
-        
+
     self.pos1 = self.origin;
     self.pos2 = self.angles;
-#ifdef VEHICLES_CSQC
-    if(use_csqc)
-        net_link_vehile();
-#endif    
+
     return TRUE;
 }
 
-
 void bugmenot()
 {
     self.vehicle_exit       = self.vehicle_exit;
@@ -814,4 +890,4 @@ void bugmenot()
     self.vehicle_die        = self.vehicle_exit;
     self.vehicle_spawn      = self.vehicle_exit;
     self.AuxiliaryXhair     = self.AuxiliaryXhair;
-}
\ No newline at end of file
+}