]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/vehicles/racer.qc
Switching branch
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / racer.qc
index c8caa2f077f0338392ea0344f443588af3b5696f..81fbea5f46e055db80e27f038d716b51064289db 100644 (file)
@@ -53,6 +53,7 @@ float autocvar_g_vehicle_racer_rocket_locktarget;
 float autocvar_g_vehicle_racer_rocket_locking_time;
 float autocvar_g_vehicle_racer_rocket_locking_releasetime;
 float autocvar_g_vehicle_racer_rocket_locked_time;
+float autocvar_g_vehicle_racer_rocket_locked_maxangle;
 
 float autocvar_g_vehicle_racer_respawntime;
 float autocvar_g_vehicle_racer_collision_multiplier;
@@ -199,18 +200,15 @@ void racer_rocket_groundhugger()
         return;
     }
 
-    if(self.enemy != world)
-        newdir = normalize(self.enemy.origin - self.origin);
-
     traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self);
     if(trace_fraction != 1.0)
     {
-        newdir += normalize(trace_endpos + '0 0 64' - self.origin);
-        self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+        newdir = normalize(trace_endpos + '0 0 64' - self.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
+        self.velocity = normalize(olddir + newdir) * newvel;
     }
     else
     {
-        self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+        self.velocity = olddir * newvel;
         self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
     }
 
@@ -218,6 +216,51 @@ void racer_rocket_groundhugger()
     return;
 }
 
+void racer_rocket_tracker()
+{
+    vector olddir, newdir;
+    float oldvel, newvel;
+
+    self.nextthink  = time;
+
+    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    {
+        racer_rocket_explode();
+        return;
+    }
+
+    if not (self.realowner.vehicle)
+    {
+        UpdateCSQCProjectile(self);
+        return;
+    }
+
+    olddir = normalize(self.velocity);
+    oldvel = vlen(self.velocity);
+    newvel = oldvel + self.lip;
+    makevectors(vectoangles(olddir));
+
+    traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
+    newdir = normalize(self.enemy.origin - self.origin);
+
+    if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle)
+    {
+        //bprint("Target lost!\n");
+        //dprint("OF:", ftos(vlen(newdir - v_forward)), "\n");
+        self.think = racer_rocket_groundhugger;
+        return;
+    }
+
+    if(trace_fraction != 1.0)
+        newdir_z += 16 * sys_frametime;
+
+    self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+    self.velocity_z -= 800 * sys_frametime;
+
+    UpdateCSQCProjectile(self);
+    return;
+}
+
 void racer_fire_rocket(string tagname, entity trg)
 {
     entity rocket;
@@ -240,8 +283,13 @@ void racer_fire_rocket(string tagname, entity trg)
     rocket.bot_dodgerating  = autocvar_g_vehicle_racer_rocket_damage;
     rocket.cnt              = time + 9;
     rocket.velocity         = v_forward * autocvar_g_vehicle_racer_rocket_speed;
-    rocket.think            = racer_rocket_groundhugger;
-    rocket.nextthink        = time + 0.5;
+
+    if(trg)
+        rocket.think            = racer_rocket_tracker;
+    else
+        rocket.think            = racer_rocket_groundhugger;
+
+    rocket.nextthink        = time;
     rocket.enemy            = trg;
 
     CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
@@ -252,8 +300,8 @@ void racer_fire_rocket(string tagname, entity trg)
 float racer_frame()
 {
     entity player, racer;
-    float ftmp, ftmp2;
     vector df;
+    float ftmp, ftmp2;
 
     player          = self;
     racer           = self.vehicle;
@@ -279,6 +327,7 @@ float racer_frame()
     racer_align4point();
     // Move abt crosshir insted of v_angle. this allows custom chase camera.
     crosshair_trace(player);
+#if VEHICLES_VIEWROTATE_CROSSHAIR
     racer.angles_x *= -1;
     df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
     if(df_x > 180)  df_x -= 360;
@@ -301,7 +350,7 @@ float racer_frame()
     // Turn
     racer.angles_y = ftmp2;
 
-    // Pitch Body
+    // Pitch
     ftmp = autocvar_g_vehicle_racer_pitchspeed * sys_frametime;
     ftmp2 = ftmp * -1;
 
@@ -310,6 +359,25 @@ float racer_frame()
 
     makevectors(racer.angles);
     racer.angles_x *= -1;
+#else
+    racer.angles_x *= -1;
+
+    // Yaw
+    ftmp = autocvar_g_vehicle_racer_turnspeed * sys_frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
+    racer.angles_y = anglemods(racer.angles_y + ftmp);
+
+    // Roll
+    racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * sys_frametime;
+
+    // Pitch
+    ftmp = autocvar_g_vehicle_racer_pitchspeed  * sys_frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp);
+    racer.angles_x = bound(-30, anglemods(racer.angles_x + ftmp), 30);
+
+    makevectors(racer.angles);
+    racer.angles_x *= -1;
+#endif
 
     df = racer.velocity * -0.5;
 
@@ -373,7 +441,7 @@ float racer_frame()
 
     if(autocvar_g_vehicle_racer_rocket_locktarget)
     {
-        vehicles_locktarget2((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
+        vehicles_locktarget((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
                          (1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
                          autocvar_g_vehicle_racer_rocket_locked_time);
 
@@ -391,14 +459,22 @@ float racer_frame()
     if(time > racer.delay)
     if(player.BUTTON_ATCK2)
     {
-        racer_fire_rocket("tag_rocket_r", ((self.lock_strength == 1 && self.lock_target) ? self.lock_target : world));
-        racer_fire_rocket("tag_rocket_l", ((self.lock_strength == 1 && self.lock_target) ? self.lock_target : world));
+        self.misc_bulletcounter += 1;
+        racer.delay = time + 0.2;
+        if(self.misc_bulletcounter == 1)
+            racer_fire_rocket("tag_rocket_r", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+        else if(self.misc_bulletcounter == 2)
+            racer_fire_rocket("tag_rocket_l", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+        else
+        {
+            self.lock_strength  = 0;
+            self.lock_target    = world;
+            self.misc_bulletcounter = 0;
 
-        self.lock_strength  = 0;
-        self.lock_target    = world;
+            racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
+            racer.lip = time;
 
-        racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
-        racer.lip = time;
+        }
     }
 
     player.fire2_waspressed = player.BUTTON_ATCK2;
@@ -458,18 +534,16 @@ void racer_think()
 
 void racer_enter()
 {
+    self.movetype = MOVETYPE_BOUNCEMISSILE;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
 }
 
-void racer_spawn();
-
 void racer_exit(float eject)
 {
-    vehicles_setreturn(autocvar_g_vehicle_racer_respawntime, racer_spawn);
-
     self.think      = racer_think;
     self.nextthink  = time;
+    self.movetype   = MOVETYPE_BOUNCEMISSILE;
 
     if not (self.owner)
         return;
@@ -488,65 +562,20 @@ void racer_exit(float eject)
     self.owner = world;
 }
 
-void racer_touch()
-{
-    if(self.owner)
-    {
-        //self.velocity = 0.999 * self.velocity;
-        // TO-DO Impact reaction (crush players, damage self on high speed impact etc)
-        return;
-    }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    vehicles_enter();
-}
-
 void racer_spawn()
 {
-    self.think = racer_think;
-    self.nextthink = time;
-
-    self.flags      = FL_NOTARGET;
-    self.effects   = 0;
-
+    self.think          = racer_think;
+    self.nextthink      = time;
     self.vehicle_health = autocvar_g_vehicle_racer_health;
     self.vehicle_shield = autocvar_g_vehicle_racer_shield;
-
-    self.event_damage = vehicles_damage;
-    self.touch      = racer_touch;
-
-    self.iscreature = TRUE;
-    self.scale      = 0.5;
-    self.movetype   = MOVETYPE_BOUNCEMISSILE;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-
-    self.alpha      = 1;
-       self.colormap   = 1024;
-       self.deadflag   = DEAD_NO;
-    self.bot_attack = TRUE;
-
-    self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
-
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
-
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_SLIDEBOX;
+    self.delay          = time;
+    self.scale          = 0.5;
     setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5);
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
-    self.delay = time;
-
-    vehicles_common_spawn();
 }
 
+
 void racer_blowup()
 {
 
@@ -573,6 +602,8 @@ void racer_blowup()
     self.velocity  = '0 0 0';
 
     setorigin(self, self.pos1);
+       self.think     = racer_spawn;
+       self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
 }
 
 void racer_deadtouch()
@@ -598,15 +629,13 @@ void racer_die()
 
     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
 
-    self.velocity     += '0 0 700';
-
     if(random() < 0.5)
         self.avelocity_z  = 16;
     else
         self.avelocity_z  = -16;
 
     self.avelocity_x = -vlen(self.velocity) * 0.2;
-
+    self.velocity     += '0 0 700';
     self.colormod = '-0.5 -0.5 -0.5';
 
        self.think     = racer_blowup;
@@ -624,7 +653,8 @@ void racer_dinit()
              HUD_WAKIZASHI,
              0.5 * RACER_MIN, 0.5 * RACER_MAX,
              FALSE,
-             racer_spawn, racer_frame,
+             racer_spawn, autocvar_g_vehicle_racer_respawntime,
+             racer_frame,
              racer_enter, racer_exit,
              racer_die,   racer_think))
     {
@@ -641,6 +671,8 @@ void racer_dinit()
     self.scale = 0.5;
     setattachment(self.vehicle_hudmodel, self, "");
     setattachment(self.vehicle_viewport, self, "tag_viewport");
+
+    self.mass               = 900;
 }
 
 void spawnfunc_vehicle_racer()