]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'samual/weapons' into Mario/weapons
authorSamual Lenks <samual@xonotic.org>
Tue, 1 Apr 2014 03:01:47 +0000 (23:01 -0400)
committerSamual Lenks <samual@xonotic.org>
Tue, 1 Apr 2014 03:01:47 +0000 (23:01 -0400)
bal-wep-xonotic.cfg
qcsrc/common/weapons/w_arc.qc
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 2d6e54189da971524fa690e596a0ed4f7bbbd4ff..74f51a54177232c3b288a494ceb055b33e4b4d24 100644 (file)
@@ -907,7 +907,7 @@ void Draw_ArcBeam(void)
        }
 
        setorigin(self, start_pos);
-       //self.beam_muzzleentity.angles_z = random() * 360; // WEAPONTODO: use avelocity instead?
+       self.beam_muzzleentity.angles_z = random() * 360; // WEAPONTODO: use avelocity instead?
 
        vector beam_endpos = (start_pos + (beamdir * self.beam_range));
        vector beam_controlpoint = start_pos + wantdir * (self.beam_range * (1 - self.beam_tightness));
@@ -946,9 +946,8 @@ void Draw_ArcBeam(void)
                        Draw_ArcBeam_callback
                );
 
-               // Do all the transforms for warpzones right now, as we already
-               // "are" in the post-trace system (if we hit a player, that's
-               // always BEHIND the last passed wz).
+               // Do all the transforms for warpzones right now, as we already "are" in the post-trace
+               // system (if we hit a player, that's always BEHIND the last passed wz).
                last_origin = trace_endpos;
                start_pos = WarpZone_TransformOrigin(WarpZone_trace_transform, start_pos);
                beam_controlpoint = WarpZone_TransformOrigin(WarpZone_trace_transform, beam_controlpoint);
@@ -957,17 +956,7 @@ void Draw_ArcBeam(void)
                Draw_ArcBeam_callback_last_top = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_top);
                Draw_ArcBeam_callback_last_bottom = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_bottom);
 
-               //printf("segment: %d, warpzone transform: %d\n", i, (WarpZone_trace_transform != world));
-
-               // WEAPONTODO:
-               // Figure out some way to detect a collision with geometry with callback...
-               // That way we can know when we are done drawing the beam and skip
-               // the rest of the segments without breaking warpzone support.
-               //
-               // Not needed to do this in the callback. trace_fraction != 1 is a good abort condition.
-
-               if (trace_fraction < 1)
-                       break;
+               if(trace_fraction < 1) { break; }
        }
 
        // visual effects for startpoint and endpoint
index b0d7a0a1a26d8896cc08f86f6b56240c198524dd..b14d1bcd49dd6599c964c8b72d8ae06693aee04c 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)
        {
@@ -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)