]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/weapons/w_devastator.qc
Replace `vector_[xyz]` with `vector.[xyz]` where possible
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / w_devastator.qc
index b0d7a0a1a26d8896cc08f86f6b56240c198524dd..617beed18f5762b884a212a830fdc7081772517c 100644 (file)
@@ -36,6 +36,11 @@ REGISTER_WEAPON(
        w_cvar(id, sn, NONE, remote_damage) \
        w_cvar(id, sn, NONE, remote_edgedamage) \
        w_cvar(id, sn, NONE, remote_force) \
+       w_cvar(id, sn, NONE, remote_jump_damage) \
+       w_cvar(id, sn, NONE, remote_jump_radius) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_add) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_max) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_min) \
        w_cvar(id, sn, NONE, remote_radius) \
        w_cvar(id, sn, NONE, speed) \
        w_cvar(id, sn, NONE, speedaccel) \
@@ -82,7 +87,18 @@ void W_Devastator_Explode(void)
        self.event_damage = func_null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage(self, self.realowner, WEP_CVAR(devastator, damage), WEP_CVAR(devastator, edgedamage), WEP_CVAR(devastator, radius), world, world, WEP_CVAR(devastator, force), self.projectiledeathtype, other);
+       RadiusDamage(
+               self,
+               self.realowner,
+               WEP_CVAR(devastator, damage),
+               WEP_CVAR(devastator, edgedamage),
+               WEP_CVAR(devastator, radius),
+               world,
+               world,
+               WEP_CVAR(devastator, force),
+               self.projectiledeathtype,
+               other
+       );
 
        if(self.realowner.weapon == WEP_DEVASTATOR)
        {
@@ -103,7 +119,64 @@ void W_Devastator_DoRemoteExplode(void)
        self.event_damage = func_null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage(self, self.realowner, WEP_CVAR(devastator, remote_damage), WEP_CVAR(devastator, remote_edgedamage), WEP_CVAR(devastator, remote_radius), world, world, WEP_CVAR(devastator, remote_force), self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       float handled_as_rocketjump = FALSE;
+
+       entity head = WarpZone_FindRadius(
+               self.origin,
+               WEP_CVAR(devastator, remote_jump_radius),
+               FALSE
+       );
+       
+       while(head)
+       {
+               if(head.takedamage && (head == self.realowner))
+               {
+                       float distance_to_head = vlen(self.origin - head.WarpZone_findradius_nearest);
+                       if(distance_to_head <= WEP_CVAR(devastator, remote_jump_radius))
+                       {
+                               // we handled this as a rocketjump :)
+                               handled_as_rocketjump = TRUE;
+
+                               // modify velocity 
+                               head.velocity_x *= 0.9;
+                               head.velocity_y *= 0.9;
+                               head.velocity_z = bound(
+                                       WEP_CVAR(devastator, remote_jump_velocity_z_min),
+                                       head.velocity.z + WEP_CVAR(devastator, remote_jump_velocity_z_add),
+                                       WEP_CVAR(devastator, remote_jump_velocity_z_max)
+                               );
+
+                               // now do the damage
+                               RadiusDamage(
+                                       self,
+                                       head,
+                                       WEP_CVAR(devastator, remote_jump_damage),
+                                       WEP_CVAR(devastator, remote_jump_damage),
+                                       WEP_CVAR(devastator, remote_jump_radius),
+                                       world,
+                                       head,
+                                       0,
+                                       self.projectiledeathtype | HITTYPE_BOUNCE,
+                                       world
+                               );
+                               break;
+                       }
+               }
+               head = head.chain;
+       }
+
+       RadiusDamage(
+               self,
+               self.realowner,
+               WEP_CVAR(devastator, remote_damage),
+               WEP_CVAR(devastator, remote_edgedamage),
+               WEP_CVAR(devastator, remote_radius),
+               (handled_as_rocketjump ? head : world),
+               world,
+               WEP_CVAR(devastator, remote_force),
+               self.projectiledeathtype | HITTYPE_BOUNCE,
+               world
+       );
 
        if(self.realowner.weapon == WEP_DEVASTATOR)
        {
@@ -153,7 +226,7 @@ vector W_Devastator_SteerTo(vector thisdir, vector goaldir, float maxturn_cos)
        //   0 = (m^2 - f^2) * x^2 + (2 * f * (m^2 - 1)) * x + (m^2 - 1)
        m2 = maxturn_cos * maxturn_cos;
        v = solve_quadratic(m2 - f * f, 2 * f * (m2 - 1), m2 - 1);
-       return normalize(thisdir + goaldir * v_y); // the larger solution!
+       return normalize(thisdir + goaldir * v.y); // the larger solution!
 }
 // assume thisdir == -goaldir:
 //   f == -1
@@ -168,9 +241,6 @@ vector W_Devastator_SteerTo(vector thisdir, vector goaldir, float maxturn_cos)
 void W_Devastator_Think(void)
 {
        vector desireddir, olddir, newdir, desiredorigin, goal;
-#if 0
-       float cosminang, cosmaxang, cosang;
-#endif
        float velspeed, f;
        self.nextthink = time;
        if(time > self.cnt)
@@ -182,7 +252,7 @@ void W_Devastator_Think(void)
        }
 
        // accelerate
-       makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
+       makevectors(self.angles.x * '-1 0 0' + self.angles.y * '0 1 0');
        velspeed = WEP_CVAR(devastator, speed) * g_weaponspeedfactor - (self.velocity * v_forward);
        if(velspeed > 0)
                self.velocity = self.velocity + v_forward * min(WEP_CVAR(devastator, speedaccel) * g_weaponspeedfactor * frametime, velspeed);
@@ -474,6 +544,7 @@ float W_Devastator(float req)
                                        self.rl_release = 1;
 
                                if(self.BUTTON_ATCK2)
+                               if(self.switchweapon == WEP_DEVASTATOR)
                                {
                                        rockfound = 0;
                                        for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.realowner == self)
@@ -493,8 +564,8 @@ float W_Devastator(float req)
                }
                case WR_INIT:
                {
-                       if(autocvar_sv_precacheweapons)
-                       {
+                       //if(autocvar_sv_precacheweapons)
+                       //{
                                precache_model("models/flash.md3");
                                precache_model("models/weapons/g_rl.md3");
                                precache_model("models/weapons/v_rl.md3");
@@ -502,7 +573,7 @@ float W_Devastator(float req)
                                precache_sound("weapons/rocket_det.wav");
                                precache_sound("weapons/rocket_fire.wav");
                                precache_sound("weapons/rocket_mode.wav");
-                       }
+                       //}
                        DEVASTATOR_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP)
                        return TRUE;
                }