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