From 339a61a69ee23557d28102aab85c2b0cda376e3f Mon Sep 17 00:00:00 2001
From: Jakob MG <jakob_mg@hotmail.com>
Date: Sun, 20 May 2012 18:56:53 +0200
Subject: [PATCH] Racer rockets new slightly predicts target, and have a cvar
 for ontroling accelerated climb

---
 qcsrc/server/vehicles/racer.qc    |  14 ++--
 qcsrc/server/vehicles/vehicles.qc | 116 +++++++++++++++++++++++++++++-
 vehicle_racer.cfg                 |  13 ++--
 3 files changed, 132 insertions(+), 11 deletions(-)

diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc
index 6c256416a..c6523e4b8 100644
--- a/qcsrc/server/vehicles/racer.qc
+++ b/qcsrc/server/vehicles/racer.qc
@@ -58,6 +58,7 @@ 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_rocket_climbspeed;
 
 float autocvar_g_vehicle_racer_respawntime;
 
@@ -205,11 +206,14 @@ void racer_rocket_tracker()
     newvel = oldvel + self.lip;
     makevectors(vectoangles(olddir));
 
+	float time_to_impact = min(vlen(self.enemy.origin - self.origin) / vlen(self.velocity), 1);
+	vector predicted_origin = self.enemy.origin + self.enemy.velocity * time_to_impact;
+
     traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
-    newdir = normalize(self.enemy.origin - self.origin);
+    newdir = normalize(predicted_origin - self.origin);
 
     //vector
-	float height_diff = self.enemy.origin_z - self.origin_z;
+	float height_diff = predicted_origin_z - self.origin_z;
 
     if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle)
     {
@@ -223,8 +227,8 @@ void racer_rocket_tracker()
         newdir_z += 16 * sys_frametime;
 
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
-    self.velocity_z -= 800 * sys_frametime ;
-    self.velocity_z += max(height_diff, cvar("bajs")) * sys_frametime ;
+    self.velocity_z -= 800 * sys_frametime;
+    self.velocity_z += max(height_diff, autocvar_g_vehicle_racer_rocket_climbspeed) * sys_frametime ;
 
     UpdateCSQCProjectile(self);
     return;
@@ -472,6 +476,8 @@ void racer_enter()
 
     if(self.owner.flagcarried)
        setorigin(self.owner.flagcarried, '-190 0 96');
+
+	//targetdrone_spawn(self.origin + '0 0 512' + randomvec() * 256, 1);
 }
 
 void racer_exit(float eject)
diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc
index 7bbf7fe26..b25177fdf 100644
--- a/qcsrc/server/vehicles/vehicles.qc
+++ b/qcsrc/server/vehicles/vehicles.qc
@@ -115,6 +115,118 @@ void CSQCVehicleSetup(entity own, float vehicle_id)
 .float  lock_strength;
 .float  lock_time;
 .float  lock_soundtime;
+float	DAMAGE_TARGETDRONE = 10;
+
+vector targetdrone_getnewspot()
+{
+
+	vector spot;
+	float i;
+	for(i = 0; i < 100; ++i)
+	{
+		spot = self.origin + randomvec() * 1024;
+		tracebox(spot, self.mins, self.maxs, spot, MOVE_NORMAL, self);
+		if(trace_fraction == 1.0 && trace_startsolid == 0 && trace_allsolid == 0)
+			return spot;
+	}
+	return self.origin;
+}
+void targetdrone_think();
+void targetdrone_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+void targetdrone_renwe()
+{
+	self.think = targetdrone_think;
+	self.nextthink = time + 0.1;
+	setorigin(self, targetdrone_getnewspot());
+	self.health = 200;
+	self.takedamage = DAMAGE_TARGETDRONE;
+	self.event_damage = targetdrone_damage;
+	self.solid = SOLID_BBOX;
+	setmodel(self, "models/runematch/rune.mdl");
+	self.effects = EF_LOWPRECISION;
+	self.scale = 10;
+	self.movetype = MOVETYPE_BOUNCEMISSILE;
+	setsize(self, '-100 -100 -100', '100 100 100');
+
+}
+void targetdrone_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	self.health -= damage;
+	if(self.health <= 0)
+	{
+		pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
+
+		if(!self.cnt)
+			remove(self);
+		else
+		{
+			self.think = targetdrone_renwe;
+			self.nextthink = time + 1 + random() * 2;
+			self.solid = SOLID_NOT;
+			setmodel(self, "");
+		}
+	}
+}
+entity targetdrone_getfear()
+{
+	entity fear;
+	float i;
+
+	for(i = 64; i <= 1024; i += 64)
+	{
+		fear = findradius(self.origin, i);
+		while(fear)
+		{
+			if(fear.bot_dodge)
+				return fear;
+
+			fear = fear.chain;
+		}
+	}
+
+	return world;
+}
+void targetdrone_think()
+{
+	self.nextthink = time + 0.1;
+
+	if(self.enemy)
+	if(self.enemy.deadflag != DEAD_NO)
+		self.enemy = targetdrone_getfear();
+
+	if(!self.enemy)
+		self.enemy = targetdrone_getfear();
+
+	vector newdir;
+
+	if(self.enemy)
+		newdir = steerlib_push(self.enemy.origin) + randomvec() * 0.75;
+	else
+		newdir = randomvec() * 0.75;
+
+	newdir = newdir * 0.5 + normalize(self.velocity) * 0.5;
+
+	if(self.enemy)
+		self.velocity = normalize(newdir) * (500 + (1024 / min(vlen(self.enemy.origin - self.origin), 1024)) * 700);
+	else
+		self.velocity = normalize(newdir) * 750;
+
+	tracebox(self.origin, self.mins, self.maxs, self.origin + self.velocity * 2, MOVE_NORMAL, self);
+	if(!trace_fraction == 1.0)
+		self.velocity = self.velocity * -1;
+
+	//normalize((normalize(self.velocity) * 0.5 + newdir * 0.5)) * 750;
+}
+
+void targetdrone_spawn(vector _where, float _autorenew)
+{
+	entity drone = spawn();
+	setorigin(drone, _where);
+	drone.think = targetdrone_renwe;
+	drone.nextthink = time + 0.1;
+	drone.cnt = _autorenew;
+}
+
 void vehicles_locktarget(float incr, float decr, float _lock_time)
 {
     if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
@@ -144,7 +256,9 @@ void vehicles_locktarget(float incr, float decr, float _lock_time)
         if(trace_ent.deadflag != DEAD_NO)
             trace_ent = world;
 
-        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE ||
+				trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET ||
+				trace_ent.takedamage == DAMAGE_TARGETDRONE)
             trace_ent = world;
     }
 
diff --git a/vehicle_racer.cfg b/vehicle_racer.cfg
index 1c06048ce..a3aa34de8 100644
--- a/vehicle_racer.cfg
+++ b/vehicle_racer.cfg
@@ -30,8 +30,8 @@ set g_vehicle_racer_anglestabilizer      1.75
 
 set g_vehicle_racer_turnspeed          200
 set g_vehicle_racer_pitchspeed         100
-set g_vehicle_racer_maxpitch           25
-set g_vehicle_racer_turnroll           32
+set g_vehicle_racer_maxpitch           20
+set g_vehicle_racer_turnroll           16
 
 set g_vehicle_racer_cannon_speed        9000
 set g_vehicle_racer_cannon_damage       25
@@ -43,18 +43,19 @@ set g_vehicle_racer_cannon_force        50
 
 set g_vehicle_racer_rocket_speed       1000
 set g_vehicle_racer_rocket_accel       1400
-set g_vehicle_racer_rocket_turnrate    0.2
+set g_vehicle_racer_rocket_turnrate    0.1
 set g_vehicle_racer_rocket_damage      165
 set g_vehicle_racer_rocket_force       350
 set g_vehicle_racer_rocket_radius      125
 set g_vehicle_racer_rocket_refire      6
 set g_vehicle_racer_rocket_cost        0
+set g_vehicle_racer_rocket_climbspeed  1750
 
 set g_vehicle_racer_rocket_locktarget           1
-set g_vehicle_racer_rocket_locking_time         0.5
-set g_vehicle_racer_rocket_locking_releasetime  1.6
+set g_vehicle_racer_rocket_locking_time         0.4
+set g_vehicle_racer_rocket_locking_releasetime  1.5
 set g_vehicle_racer_rocket_locked_time          5
-set g_vehicle_racer_rocket_locked_maxangle      1.46
+set g_vehicle_racer_rocket_locked_maxangle      1.75
 
 set g_vehicle_racer_blowup_radius           250
 set g_vehicle_racer_blowup_coredamage       250
-- 
2.39.5