]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_rocketlauncher.qc
Merge remote branch 'refs/remotes/origin/fruitiex/racefixes'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_rocketlauncher.qc
index f6975b3b6a0d13d6903830adc2526c8c9940110f..c109fc796b68afeb88d1b62d683083bd33062c29 100644 (file)
@@ -14,7 +14,7 @@ void W_Rocket_Unregister()
        }
 }
 
-void W_Rocket_Explode (void)
+void W_Rocket_Explode ()
 {
        W_Rocket_Unregister();
 
@@ -26,6 +26,7 @@ void W_Rocket_Explode (void)
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
+
        RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), self.projectiledeathtype, other);
 
        if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
@@ -42,6 +43,29 @@ void W_Rocket_Explode (void)
        remove (self);
 }
 
+void W_Rocket_DoRemoteExplode ()
+{
+       W_Rocket_Unregister();
+
+       self.event_damage = SUB_Null;
+       self.takedamage = DAMAGE_NO;
+
+       RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_remote_damage"), cvar("g_balance_rocketlauncher_remote_edgedamage"), cvar("g_balance_rocketlauncher_remote_radius"), world, cvar("g_balance_rocketlauncher_remote_force"), self.projectiledeathtype | HITTYPE_BOUNCE, world);
+
+       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       {
+               if(self.owner.ammo_rockets < cvar("g_balance_rocketlauncher_ammo"))
+               {
+                       self.owner.cnt = WEP_ROCKET_LAUNCHER;
+                       ATTACK_FINISHED(self.owner) = time;
+                       self.owner.switchweapon = w_getbestweapon(self.owner);
+               }
+               if(g_laserguided_missile)
+                       ATTACK_FINISHED(self.owner) = time + cvar("g_balance_rocketlauncher_refire") * W_WeaponRateFactor();
+       }
+       remove (self);
+}
+
 entity FindLaserTarget(entity e, float dist_variance, float dot_variance)
 {
        entity head, selected;
@@ -104,12 +128,7 @@ void W_Rocket_RemoteExplode()
                        : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_radius")) // safety device
                )
                {
-                       other = world;
-                       self.projectiledeathtype |= HITTYPE_BOUNCE;
-                       W_Rocket_Explode ();
-               }
-               else
-               {
+                       W_Rocket_DoRemoteExplode();
                }
        }
 }
@@ -272,9 +291,13 @@ void W_Rocket_Think (void)
 
 void W_Rocket_Touch (void)
 {
+       if(WarpZone_Projectile_Touch())
+       {
+               if(wasfreed(self))
+                       W_Rocket_Unregister();
+               return;
+       }
        W_Rocket_Unregister();
-
-       PROJECTILE_TOUCH;
        W_Rocket_Explode ();
 }
 
@@ -344,6 +367,7 @@ void W_Rocket_Attack (void)
        W_AttachToShotorg(flash, '5 0 0');
 
        // common properties
+       other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_rocketlauncher (void); // defined in t_items.qc
@@ -544,17 +568,6 @@ float w_rlauncher(float req)
        }
        else if (req == WR_CHECKAMMO2)
                return FALSE;
-       else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = "exploded";
-       else if (req == WR_KILLMESSAGE)
-       {
-               if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
-                       w_deathtypestring = "got too close to #'s rocket";
-               else if(w_deathtype & HITTYPE_SPLASH)
-                       w_deathtypestring = "almost dodged #'s rocket";
-               else
-                       w_deathtypestring = "ate #'s rocket";
-       }
        else if (req == WR_RESETPLAYER)
        {
                self.rl_release = 0;
@@ -577,6 +590,17 @@ float w_rlauncher(float req)
        {
                precache_sound("weapons/rocket_impact.wav");
        }
+       else if (req == WR_SUICIDEMESSAGE)
+               w_deathtypestring = "%s exploded";
+       else if (req == WR_KILLMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
+                       w_deathtypestring = "%s got too close to %s's rocket";
+               else if(w_deathtype & HITTYPE_SPLASH)
+                       w_deathtypestring = "%s almost dodged %s's rocket";
+               else
+                       w_deathtypestring = "%s ate %s's rocket";
+       }
        return TRUE;
 }
 #endif