]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/vehicles/raptor.qc
Create and use vehicles_projectile(...) to reduce code duplication. Spiderbot deaht...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / raptor.qc
index cf5028bc45f0ea43a1fc7b2ce7b275e2fc8cfd5a..1ba6efbd272055745c62752ccffba91801dd3ec6 100644 (file)
@@ -42,7 +42,7 @@ float autocvar_g_vehicle_raptor_cannon_radius;
 float autocvar_g_vehicle_raptor_cannon_refire;
 float autocvar_g_vehicle_raptor_cannon_speed;
 float autocvar_g_vehicle_raptor_cannon_spread;
-
+float autocvar_g_vehicle_raptor_cannon_force;
 
 float autocvar_g_vehicle_raptor_energy;
 float autocvar_g_vehicle_raptor_energy_regen;
@@ -58,6 +58,7 @@ float autocvar_g_vehicle_raptor_shield_regen_pause;
 
 void raptor_spawn();
 float raptor_frame();
+float raptor_takeoff();
 
 .entity bomb1;
 .entity bomb2;
@@ -117,17 +118,16 @@ void raptor_bomb_burst()
         bomblet = spawn();
         setorigin(bomblet, self.origin);
 
-        bomblet.scale       = 0.5;
-        bomblet.solid       = SOLID_TRIGGER;
+        //bomblet.solid       = SOLID_TRIGGER;
         bomblet.movetype    = MOVETYPE_TOSS;
         bomblet.touch       = raptor_bomblet_touch;
         bomblet.think       = raptor_bomblet_boom;
         bomblet.nextthink   = time + 5;
-        bomblet.owner   = self.owner;
+        bomblet.owner       = self.owner;
         bomblet.realowner   = self.realowner;
         bomblet.velocity    = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
         PROJECTILE_MAKETRIGGER(bomblet);
-        CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
+        CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMBLET, TRUE);
     }
 
     remove(self);
@@ -165,6 +165,7 @@ void raptor_bombdrop()
     bomb_1.owner     = bomb_2.owner      = self;
     bomb_1.realowner = bomb_2.realowner  = self.owner;
     bomb_1.solid     = bomb_2.solid      = SOLID_BBOX;
+    bomb_1.gravity   = bomb_2.gravity    = 1;
 
     PROJECTILE_MAKETRIGGER(bomb_1);
     PROJECTILE_MAKETRIGGER(bomb_2);
@@ -174,40 +175,16 @@ void raptor_bombdrop()
 
 }
 
-void raptor_bolt_explode()
-{
-       PROJECTILE_TOUCH;
-    pointparticles(particleeffectnum("raptor_cannon_impact"), findbetterlocation (self.origin, 8), trace_plane_normal * 1000, 1);
-    RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_cannon_damage, 0, autocvar_g_vehicle_raptor_cannon_radius, world, 25, DEATH_WAKIGUN, world);
-    sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
-    remove (self);
-}
 
 void raptor_fire_cannon(entity gun, string tagname)
 {
     entity bolt;
-
-    bolt = spawn();
-
-    PROJECTILE_MAKETRIGGER(bolt);
-    sound (gun, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
-    setorigin(bolt, gettaginfo(gun, gettagindex(gun, tagname)));
-
-    bolt.movetype        = MOVETYPE_FLYMISSILE;
-    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
-    bolt.owner           = self;
-    bolt.realowner       = self.owner;
-    bolt.touch           = raptor_bolt_explode;
-    bolt.think           = raptor_bolt_explode;
-    bolt.nextthink       = time + 9;
-    bolt.bot_dodge       = TRUE;
-    bolt.bot_dodgerating = autocvar_g_vehicle_raptor_cannon_damage;
-    bolt.velocity        = normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed;
-
-    pointparticles(particleeffectnum("raptor_cannon_muzzleflash"), bolt.origin, bolt.velocity, 1);
-    //pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), bolt.origin, bolt.velocity, 1);
-
-    CSQCProjectile(bolt, TRUE, PROJECTILE_CRYLINK, TRUE);
+    vector b_org;
+    b_org = gettaginfo(gun, gettagindex(gun, tagname));
+    bolt = vehicles_projectile("raptor_cannon_impact", "weapons/laserimpact.wav", "raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav",
+                           b_org, normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
+                           autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force,  0,
+                           DEATH_WAKIGUN, PROJECTILE_RAPTORCANNON, 0);
 }
 
 void raptor_think()
@@ -216,11 +193,13 @@ void raptor_think()
 
 void raptor_enter()
 {
-    self.movetype       = MOVETYPE_BOUNCEMISSILE;
+    self.owner.PlayerPhysplug = raptor_takeoff;
+    self.movetype       = MOVETYPE_FLY;
     self.solid          = SOLID_BBOX;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield);
     self.velocity_z = 1;
+
 #ifdef RAPTOR_RETARDCAMERA
     setorigin(self.vehicle_viewport, self.origin);
 #endif
@@ -275,6 +254,32 @@ void raptor_exit(float eject)
     self.owner = world;
 }
 
+float raptor_takeoff()
+{
+    entity player, raptor;
+
+    player = self;
+    raptor = self.vehicle;
+    self   = raptor;
+
+    // Takeoff sequense
+    if(raptor.frame < 25)
+    {
+        raptor.frame += 0.25;
+        raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
+        self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000);
+        self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
+
+        setorigin(player, raptor.origin + '0 0 32');
+    }
+    else
+        player.PlayerPhysplug = raptor_frame;
+
+    self = player;
+    return 1;
+}
+
 float raptor_frame()
 {
     entity player, raptor;
@@ -282,8 +287,8 @@ float raptor_frame()
     vector df;
 
     player = self;
-    raptor   = self.vehicle;
-    self    = raptor;
+    raptor = self.vehicle;
+    self   = raptor;
 
     if(player.BUTTON_USE && raptor.deadflag == DEAD_NO)
     {
@@ -300,19 +305,7 @@ float raptor_frame()
         return 1;
     }
 
-    // Takeoff sequense
-    if(raptor.frame < 25)
-    {
-        raptor.frame += 0.25;
-        raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
-        self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 2000);
-        self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
-        player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
-        self = player;
-        return 1;
-    }
 
-    //collision_run();
 
     crosshair_trace(player);
 
@@ -368,7 +361,7 @@ float raptor_frame()
 #endif
 
     if(autocvar_g_vehicle_raptor_movestyle == 1)
-        makevectors(raptor.angles + ('-1 0 0' * raptor.angles_x));
+        makevectors('0 1 0' * raptor.angles_y);
     else
         makevectors(player.v_angle);
 
@@ -403,13 +396,13 @@ float raptor_frame()
         else if(player.movement_y > 0)
             df += v_right * autocvar_g_vehicle_raptor_speed_strafe;
 
-        //raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
+        raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
     }
     else
     {
-        /*raptor.angles_z *= 0.95;
+        raptor.angles_z *= 0.95;
         if(raptor.angles_z >= -1 && raptor.angles_z <= -1)
-            raptor.angles_z = 0;*/
+            raptor.angles_z = 0;
     }
 
     if(player.BUTTON_CROUCH)
@@ -417,8 +410,6 @@ float raptor_frame()
     else if (player.BUTTON_JUMP)
         df +=  v_up * autocvar_g_vehicle_raptor_speed_up;
 
-
-
     raptor.velocity  += df * frametime;
     player.velocity = player.movement  = raptor.velocity;
     setorigin(player,raptor.origin + '0 0 32');
@@ -432,23 +423,22 @@ float raptor_frame()
                              (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
                              autocvar_g_vehicle_raptor_cannon_locked_time);
 
-        if(autocvar_g_vehicle_raptor_cannon_predicttarget && self.lock_strength == 1)
+        if(self.lock_target != world)
+        if(autocvar_g_vehicle_raptor_cannon_predicttarget)
+        if(self.lock_strength == 1)
         {
-            if(self.lock_target != world)
+            float i, distance, impact_time;
+
+            vf = real_origin(raptor.lock_target);
+            ad = vf;
+            for(i = 0; i < 4; ++i)
             {
-                float i, distance, impact_time;
-
-                vf = real_origin(raptor.lock_target);
-                ad = vf;
-                for(i = 0; i < 4; ++i)
-                {
-                    distance = vlen(ad - raptor.origin);
-                    impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
-                    ad = vf + raptor.lock_target.velocity * impact_time;
-                }
-                trace_endpos = ad;
-                UpdateAuxiliaryXhair(player, trace_endpos, '1 1 1', 0);
+                distance = vlen(ad - raptor.origin);
+                impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
+                ad = vf + raptor.lock_target.velocity * impact_time;
             }
+            trace_endpos = ad;
+            //UpdateAuxiliaryXhair(player, trace_endpos, '1 1 1', 0);
         }
 
         if(self.lock_target)
@@ -460,14 +450,6 @@ float raptor_frame()
             else if(self.lock_strength < 0.5)
                 UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1);
         }
-
-        /*
-        if(self.lock_target != world)
-        if(self.lock_strength == 1)
-            UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 0 1', 1);
-        else
-            UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * (1 - self.lock_strength)) + '0 1 0' * self.lock_strength, 1);
-        */
     }
 
     // Aim the gunz
@@ -476,8 +458,8 @@ float raptor_frame()
 
     // Gun1
     df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1"));
-    ad = df;
-    vf = v_forward;
+    //ad = df;
+    //vf = v_forward;
     df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle
     df = shortangle_vxy(df - (raptor.angles + raptor.gun1.angles), raptor.angles + raptor.gun1.angles);     // Find aim offset
     // Bind to aimspeed
@@ -491,8 +473,8 @@ float raptor_frame()
 
     //Gun 2
     df = gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1"));
-    ad += df;
-    vf += v_forward;
+    //ad += df;
+    //vf += v_forward;
     df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle
     df = shortangle_vxy(df - (raptor.angles + raptor.gun2.angles), raptor.angles + raptor.gun2.angles);     // Find aim offset
     // Bind to aimspeed
@@ -502,7 +484,6 @@ float raptor_frame()
     raptor.gun2.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
     raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit,  df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
 
-
     /*
     ad = ad * 0.5;
     v_forward = vf * 0.5;
@@ -516,7 +497,6 @@ float raptor_frame()
     {
         raptor.misc_bulletcounter += 1;
         raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire;
-        //if(mod(raptor.misc_bulletcounter, 2))
         if(raptor.misc_bulletcounter <= 2)
             raptor_fire_cannon(self.gun1, "fire1");
         else if(raptor.misc_bulletcounter == 3)
@@ -527,10 +507,7 @@ float raptor_frame()
             raptor_fire_cannon(self.gun2, "fire1");
             raptor.misc_bulletcounter = 0;
         }
-
-
         raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
-
         self.cnt = time;
     }
 
@@ -543,29 +520,25 @@ float raptor_frame()
     if(self.vehicle_flags  & VHF_ENERGYREGEN)
         vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
 
-    player.vehicle_energy = raptor.vehicle_energy / autocvar_g_vehicle_raptor_energy;
-
 
     if(time > raptor.delay)
+    if(player.BUTTON_ATCK2)
     {
-        if(player.BUTTON_ATCK2)
-        {
-            raptor_bombdrop();
-            raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
-        }
-        player.vehicle_reload1 = 1;
-    }
-    else
-    {
-        player.vehicle_reload1 = min(time / raptor.delay, 1);
-        //raptor.bomb1.alpha = raptor.bomb2.alpha = player.vehicle_reload1;
+        raptor_bombdrop();
+        raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+        raptor.lip   = time;
     }
 
-    VEHICLE_UPDATE_PLAYER(health, raptor);
+    player.vehicle_reload1 = (time - raptor.lip) / (raptor.delay - raptor.lip);
+    raptor.bomb1.alpha = raptor.bomb2.alpha = player.vehicle_reload1;
 
+    VEHICLE_UPDATE_PLAYER(health, raptor);
+    VEHICLE_UPDATE_PLAYER(energy, raptor);
     if(self.vehicle_flags & VHF_HASSHIELD)
         VEHICLE_UPDATE_PLAYER(shield, raptor);
 
+
+
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
     return 1;
 }
@@ -599,7 +572,6 @@ void raptor_die()
     self.takedamage   = DAMAGE_NO;
     self.deadflag     = DEAD_DYING;
     self.movetype     = MOVETYPE_BOUNCE;
-    //self.wait         = time;
 
     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
 
@@ -611,42 +583,23 @@ void raptor_die()
         self.avelocity_z  = -45 + random() * -270;
 
     self.colormod = '-0.5 -0.5 -0.5';
-
        self.touch     = raptor_blowup;
-       self.think     = raptor_spawn;
-       self.nextthink = time + autocvar_g_vehicle_raptor_respawntime;
 }
 
 void raptor_spawn()
 {
-    self.flags     = FL_NOTARGET;
-    self.effects   = 0;
-
+    self.frame          = 0;
     self.vehicle_health = autocvar_g_vehicle_raptor_health;
     self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
-    self.event_damage   = vehicles_damage;
-    self.touch          = vehicles_touch;
-    self.iscreature     = TRUE;
-    self.movetype       = MOVETYPE_FLY;
+    self.movetype       = MOVETYPE_TOSS;
     self.solid          = SOLID_BBOX;
-    self.takedamage     = DAMAGE_AIM;
-       self.deadflag       = DEAD_NO;
-    self.bot_attack     = TRUE;
     self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
 
     self.bomb1.gun1.avelocity_y = 90;
     self.bomb1.gun2.avelocity_y = -90;
-    self.frame = 0;
-
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
 
     setsize(self, RAPTOR_MIN, RAPTOR_MAX );
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
     self.delay = time;
-
-    vehicles_reset_colors();
 }
 
 void raptor_dinit()
@@ -671,9 +624,8 @@ void raptor_dinit()
         remove(self);
         return;
     }
-    setorigin(self, self.origin + '0 0 50');
     //FIXME: Camera is in a bad place in HUD model.
-    setorigin(self.vehicle_viewport, '5 0 5');
+    setorigin(self.vehicle_viewport, '25 0 5');
 
     self.frame = 0;
 
@@ -686,8 +638,8 @@ void raptor_dinit()
     setattachment(self.vehicle_viewport, world, "");
 #endif
 
-    setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm");
-    setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm");
+    setmodel(self.bomb1,"models/vehicles/clusterbomb.md3");
+    setmodel(self.bomb2,"models/vehicles/clusterbomb.md3");
     setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
     setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
 
@@ -754,7 +706,7 @@ void spawnfunc_vehicle_raptor()
     precache_model ("models/vehicles/raptor_gun.dpm");
     precache_model ("models/vehicles/spinner.dpm");
     precache_model ("models/vehicles/raptor_cockpit.dpm");
-    precache_model ("models/vehicles/raptor_bomb.dpm");
+    precache_model ("models/vehicles/clusterbomb.md3");
 
     self.think = raptor_dinit;
     self.nextthink = time + 1;