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
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
}
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));
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);
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
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) \
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)
{
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)
{
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)