]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/vehicles/vehicles.qc
Get rid of 240 tracelines / second for racer by disabelign swept colission code,...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / vehicles.qc
index 1cd45691c8b47e470cc3fd11f4956b1556199cb5..5c484595977a6b441ef90863e7b095c70563b02f 100644 (file)
@@ -1,6 +1,14 @@
+float autocvar_g_vehicles_crush_dmg;
+float autocvar_g_vehicles_crush_force;
+
 void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
 void vehicles_return();
+void vehicles_enter();
+void vehicles_touch();
+void vehicles_reset_colors();
 void vehicles_clearrturn();
+void vehicles_setreturn();
+
 
 #define MAX_AXH 4
 .entity AuxiliaryXhair[MAX_AXH];
@@ -80,10 +88,14 @@ void CSQCVehicleSetup(entity own, float vehicle_id)
 .entity lock_target;
 .float  lock_strength;
 .float  lock_time;
-void vehicles_locktarget2(float incr, float decr, float _lock_time)
+void vehicles_locktarget(float incr, float decr, float _lock_time)
 {
     if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
-        self.lock_target = world;
+    {
+        self.lock_target    = world;
+        self.lock_strength  = 0;
+        self.lock_time      = 0;
+    }
 
     if(trace_ent != world)
     {
@@ -100,11 +112,6 @@ void vehicles_locktarget2(float incr, float decr, float _lock_time)
     if(self.lock_time > time)
         return;
 
-    /*if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
-        self.lock_strength = min(self.lock_strength - decr, 1);
-    else if(trace_ent.deadflag != DEAD_NO)
-        self.lock_strength = min(self.lock_strength - decr, 1);*/
-
     if(self.lock_target == world && trace_ent != world)
         self.lock_target = trace_ent;
 
@@ -168,10 +175,56 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float
     return v_forward  * force_fromtag_power;
 }
 
-void vehicles_enter();
+
+
+void vehicles_spawn()
+{
+    dprint("Spawning vehicle: ", self.netname, "\n");
+
+    // De-own & reset
+    self.vehicle_hudmodel.viewmodelforclient = self;
+    self.owner              = world;
+    self.touch              = vehicles_touch;
+    self.event_damage       = vehicles_damage;
+    self.iscreature         = TRUE;
+    self.movetype           = MOVETYPE_WALK;
+    self.solid              = SOLID_SLIDEBOX;
+    self.takedamage         = DAMAGE_AIM;
+       self.deadflag           = DEAD_NO;
+    self.bot_attack         = TRUE;
+    self.flags              = FL_NOTARGET;
+    self.avelocity          = '0 0 0';
+
+    // Reset locking
+    self.lock_strength      = 0;
+    self.lock_target        = world;
+    self.misc_bulletcounter = 0;
+
+    // Return to spawn
+    self.angles             = self.pos2;
+    setorigin(self, self.pos1 + '0 0 128');
+    // Show it
+    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+
+    vehicles_reset_colors();
+    self.vehicle_spawn();
+}
+
+// Better way of determening whats crushable needed! (fl_crushable?)
+float vehicles_crushable(entity e)
+{
+    if(e.classname == "player")
+        return TRUE;
+
+    if(e.classname == "monster_zombie")
+        return TRUE;
+
+    return FALSE;
+}
+
 void vehicles_touch()
 {
-    // Vehicle currently
+    // Vehicle currently in use
     if(self.owner)
     {
         // Colided with world?
@@ -185,7 +238,13 @@ void vehicles_touch()
             {
                 //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_SBCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+            }
         }
+        return;
     }
 
     if(other.classname != "player")
@@ -218,6 +277,12 @@ void vehicles_enter()
     if(self.team != other.team)
         return;
 
+    self.vehicle_ammo1   = 0;
+    self.vehicle_ammo2   = 0;
+    self.vehicle_reload1 = 0;
+    self.vehicle_reload2 = 0;
+    self.vehicle_energy  = 0;
+
     self.owner          = other;
     self.switchweapon   = other.switchweapon;
 
@@ -273,8 +338,7 @@ void vehicles_enter()
 
     CSQCVehicleSetup(self.owner, self.hud);
 
-    if(self.vehicle_enter)
-        self.vehicle_enter();
+    self.vehicle_enter();
 }
 
 void vehicles_exit(float eject)
@@ -307,17 +371,19 @@ void vehicles_exit(float eject)
         self.owner.switchweapon   = self.switchweapon;
     }
 
+    if(self.deadflag == DEAD_NO)
+        self.avelocity          = '0 0 0';
+
     self.vehicle_hudmodel.viewmodelforclient = self;
        self.tur_head.nodrawtoclient             = self;
+    vehicles_setreturn();
 
     self.phase = time + 1;
 
     if(!teams_matter)
         self.team = 0;
 
-    if(self.vehicle_exit)
-        self.vehicle_exit(eject);
-
+    self.vehicle_exit(eject);
     self.owner = world;
 }
 
@@ -385,6 +451,8 @@ void vehicles_damage(entity inflictor, entity attacker, float damage, float deat
     else
         self.vehicle_health -= damage;
 
+    self.velocity += force; // * (vlen(force) / self.mass);
+
     if(self.vehicle_health <= 0)
     {
         if(self.owner)
@@ -394,14 +462,17 @@ void vehicles_damage(entity inflictor, entity attacker, float damage, float deat
                 vehicles_exit(VHEF_RELESE);
 
         self.vehicle_die();
+        vehicles_setreturn();
     }
 }
 
 void vehicles_return()
 {
     pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
-    self.enemy.think = self.use;
+
+    self.enemy.think     = vehicles_spawn;
     self.enemy.nextthink = time;
+
     remove(self);
 }
 
@@ -414,29 +485,27 @@ void vehicles_clearrturn()
     {
         if(ret.enemy == self)
         {
-            ret.think = SUB_Remove;
-            ret.nextthink = time + 0.1;
+            ret.classname   = "";
+            ret.think       = SUB_Remove;
+            ret.nextthink   = time + 0.1;
             return;
         }
+
         ret = ret.chain;
     }
 }
 
-void vehicles_setreturn(float retime, void() respawn_proc)
+void vehicles_setreturn()
 {
+    entity ret;
+
     vehicles_clearrturn();
 
-    if (self.deadflag == DEAD_NO)
-    {
-        entity ret;
-
-        ret = spawn();
-        ret.classname = "vehicle_return";
-        ret.enemy = self;
-        ret.think = vehicles_return;
-        ret.nextthink = time + retime;
-        ret.use = respawn_proc;
-    }
+    ret = spawn();
+    ret.classname   = "vehicle_return";
+    ret.enemy       = self;
+    ret.think       = vehicles_return;
+    ret.nextthink   = time + self.vehicle_respawntime;
 }
 
 float vehicles_customizeentityforclient()
@@ -507,6 +576,7 @@ float vehicle_initialize(string  net_name,
                          vector max_s,
                          float  nodrop,
                          void()  spawnproc,
+                         float   _respawntime,
                          float() physproc,
                          void()  enterproc,
                          void(float extflag) exitfunc,
@@ -524,7 +594,6 @@ float vehicle_initialize(string  net_name,
        addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
        addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
 
-
     if(bodymodel == "")
         error("vehicles: missing bodymodel!");
 
@@ -553,14 +622,16 @@ float vehicle_initialize(string  net_name,
     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              = spawnproc;
-    self.nextthink          = time;
+    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.vehicle_respawntime = _respawntime;
+    self.vehicle_spawn       = spawnproc;
 
     if(autocvar_g_nodepthtestplayers)
         self.effects = self.effects | EF_NODEPTHTEST;
@@ -571,6 +642,7 @@ float vehicle_initialize(string  net_name,
     setmodel(self.vehicle_hudmodel, hudmodel);
     setmodel(self.vehicle_viewport, "null");
 
+
     if(topmodel != "")
     {
         setmodel(self.tur_head, topmodel);
@@ -607,5 +679,4 @@ void bugmenot()
     self.vehicle_die        = self.vehicle_exit;
     self.vehicle_spawn      = self.vehicle_exit;
     self.AuxiliaryXhair     = self.AuxiliaryXhair;
-    //self.vehicle_message    = self.vehicle_exit;
 }