]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add explicit rocket jump functionality which saves you from falling better
authorSamual Lenks <samual@xonotic.org>
Mon, 31 Mar 2014 22:57:37 +0000 (18:57 -0400)
committerSamual Lenks <samual@xonotic.org>
Mon, 31 Mar 2014 22:57:37 +0000 (18:57 -0400)
bal-wep-xonotic.cfg
qcsrc/common/weapons/w_devastator.qc

index 65783f4a091a92fa88604310f44e94cd55bfe342..562119b7e65c305ab8f0bdb2ab3b7f65cfee3525 100644 (file)
@@ -264,6 +264,7 @@ set g_balance_arc_beam_range 1000
 set g_balance_arc_beam_refire 0.5
 set g_balance_arc_beam_returnspeed 8
 set g_balance_arc_beam_tightness 0.5
+set g_balance_arc_burst_ammo 0
 set g_balance_arc_burst_damage 500
 set g_balance_arc_burst_healing_aps 100
 set g_balance_arc_burst_healing_hps 100
@@ -444,13 +445,18 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 400
+set g_balance_devastator_remote_jump_damage 40
+set g_balance_devastator_remote_jump_radius 200
+set g_balance_devastator_remote_jump_velocity_z_add 500
+set g_balance_devastator_remote_jump_velocity_z_max 1500
+set g_balance_devastator_remote_jump_velocity_z_min 500
 set g_balance_devastator_remote_radius 110
 set g_balance_devastator_speed 1300
 set g_balance_devastator_speedaccel 1300
 set g_balance_devastator_speedstart 1000
 set g_balance_devastator_switchdelay_drop 0.3
 set g_balance_devastator_switchdelay_raise 0.2
-set g_balance_devastator_weaponreplace "arc"
+set g_balance_devastator_weaponreplace ""
 set g_balance_devastator_weaponstart 0
 set g_balance_devastator_weaponstartoverride -1
 set g_balance_devastator_weaponthrowable 1
index b0d7a0a1a26d8896cc08f86f6b56240c198524dd..90df8bfd9da49712bcb5d8711f9168bc1cc0c8a1 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,63 @@ 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))
+                       {
+                               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)
+                               );
+
+                               handled_as_rocketjump = TRUE;
+                               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;
+       }
+
+       if(!handled_as_rocketjump)
+       {
+               RadiusDamage(
+                       self,
+                       self.realowner,
+                       WEP_CVAR(devastator, remote_damage),
+                       WEP_CVAR(devastator, remote_edgedamage),
+                       WEP_CVAR(devastator, remote_radius),
+                       self,
+                       world,
+                       WEP_CVAR(devastator, remote_force),
+                       self.projectiledeathtype | HITTYPE_BOUNCE,
+                       world
+               );
+       }
 
        if(self.realowner.weapon == WEP_DEVASTATOR)
        {
@@ -168,9 +240,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)