#include "racer_weapon.qh"
-#ifdef IMPLEMENTATION
-
#ifdef SVQC
void racer_fire_rocket(entity player, vector org, vector dir, entity trg);
veh.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
veh.wait = time;
}
- if (isPlayer) W_SetupShot_Dir(player, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0);
+ string tagname = (veh.cnt)
+ ? (veh.cnt = 0, "tag_fire1")
+ : (veh.cnt = 1, "tag_fire2");
+ vector shotorg = gettaginfo(veh, gettagindex(veh, tagname));
+ w_shotorg = shotorg;
+ w_shotdir = v_forward;
+ // Fix z-aim (for chase mode)
+ crosshair_trace(player);
+ w_shotdir.z = normalize(trace_endpos - shotorg).z * 0.5;
+
+ if (isPlayer) W_SetupShot_Dir(player, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_WAKI_GUN.m_id);
vector org = w_shotorg;
vector dir = w_shotdir;
- entity bolt = vehicles_projectile(veh, EFFECT_RACER_MUZZLEFLASH.eent_eff_name, SND_LASERGUN_FIRE,
+ entity bolt = vehicles_projectile(veh, EFFECT_RACER_MUZZLEFLASH, SND_LASERGUN_FIRE,
org, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force, 0,
DEATH_VH_WAKI_GUN.m_id, PROJECTILE_WAKICANNON, 0, true, true, player);
}
if (fire & 2)
if (!isPlayer || weapon_prepareattack(thiswep, actor, weaponentity, false, 0.2)) {
- if (isPlayer) W_SetupShot_Dir(actor, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0);
+ if (isPlayer) W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_WAKI_ROCKET.m_id);
racer_fire_rocket(player, w_shotorg, w_shotdir, NULL);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, 0, w_ready);
}
}
-METHOD(RacerAttack, wr_checkammo1, bool(RacerAttack thiswep, entity actor))
+METHOD(RacerAttack, wr_checkammo1, bool(RacerAttack thiswep, entity actor, .entity weaponentity))
{
bool isPlayer = IS_PLAYER(actor);
entity player = isPlayer ? actor : actor.owner;
void racer_fire_rocket(entity player, vector org, vector dir, entity trg)
{
- entity rocket = vehicles_projectile(player.vehicle, EFFECT_RACER_ROCKETLAUNCH.eent_eff_name, SND_ROCKET_FIRE,
+ entity rocket = vehicles_projectile(player.vehicle, EFFECT_RACER_ROCKETLAUNCH, SND_ROCKET_FIRE,
org, dir * autocvar_g_vehicle_racer_rocket_speed,
autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
DEATH_VH_WAKI_ROCKET.m_id, PROJECTILE_WAKIROCKET, 20, false, false, player);
vector olddir, newdir;
float oldvel, newvel;
- self.nextthink = time;
+ this.nextthink = time;
- if (IS_DEAD(self.owner) || self.cnt < time)
+ if (IS_DEAD(this.owner) || this.cnt < time)
{
- self.use(self, NULL, NULL);
+ this.use(this, NULL, NULL);
return;
}
- if(!self.realowner.vehicle)
+ if(!this.realowner.vehicle)
{
- UpdateCSQCProjectile(self);
+ UpdateCSQCProjectile(this);
return;
}
- olddir = normalize(self.velocity);
- oldvel = vlen(self.velocity);
- newvel = oldvel + self.lip;
+ olddir = normalize(this.velocity);
+ oldvel = vlen(this.velocity);
+ newvel = oldvel + this.lip;
makevectors(vectoangles(olddir));
- float time_to_impact = min(vlen(self.enemy.origin - self.origin) / vlen(self.velocity), 1);
- vector predicted_origin = self.enemy.origin + self.enemy.velocity * time_to_impact;
+ float time_to_impact = min(vlen(this.enemy.origin - this.origin) / vlen(this.velocity), 1);
+ vector predicted_origin = this.enemy.origin + this.enemy.velocity * time_to_impact;
- traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
- newdir = normalize(predicted_origin - self.origin);
+ traceline(this.origin, this.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, this);
+ newdir = normalize(predicted_origin - this.origin);
//vector
- float height_diff = predicted_origin_z - self.origin_z;
+ float height_diff = predicted_origin_z - this.origin_z;
if(vdist(newdir - v_forward, >, autocvar_g_vehicle_racer_rocket_locked_maxangle))
{
//bprint("Target lost!\n");
//dprint("OF:", ftos(vlen(newdir - v_forward)), "\n");
- setthink(self, racer_rocket_groundhugger);
+ setthink(this, racer_rocket_groundhugger);
return;
}
- if(trace_fraction != 1.0 && trace_ent != self.enemy)
+ if(trace_fraction != 1.0 && trace_ent != this.enemy)
newdir_z += 16 * sys_frametime;
- self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
- self.velocity_z -= 800 * sys_frametime;
- self.velocity_z += max(height_diff, autocvar_g_vehicle_racer_rocket_climbspeed) * sys_frametime ;
+ this.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+ this.velocity_z -= 800 * sys_frametime;
+ this.velocity_z += max(height_diff, autocvar_g_vehicle_racer_rocket_climbspeed) * sys_frametime ;
- UpdateCSQCProjectile(self);
+ UpdateCSQCProjectile(this);
return;
}
vector olddir, newdir;
float oldvel, newvel;
- self.nextthink = time;
+ this.nextthink = time;
- if(IS_DEAD(self.owner) || self.cnt < time)
+ if(IS_DEAD(this.owner) || this.cnt < time)
{
- self.use(self, NULL, NULL);
+ this.use(this, NULL, NULL);
return;
}
- if(!self.realowner.vehicle)
+ if(!this.realowner.vehicle)
{
- UpdateCSQCProjectile(self);
+ UpdateCSQCProjectile(this);
return;
}
- olddir = normalize(self.velocity);
- oldvel = vlen(self.velocity);
- newvel = oldvel + self.lip;
+ olddir = normalize(this.velocity);
+ oldvel = vlen(this.velocity);
+ newvel = oldvel + this.lip;
- tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self);
+ tracebox(this.origin, this.mins, this.maxs, this.origin + olddir * 64, MOVE_WORLDONLY,this);
if(trace_fraction <= 0.5)
{
// Hitting somethign soon, just speed ahead
- self.velocity = olddir * newvel;
- UpdateCSQCProjectile(self);
+ this.velocity = olddir * newvel;
+ UpdateCSQCProjectile(this);
return;
}
- traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self);
+ traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, this);
if(trace_fraction != 1.0)
{
- newdir = normalize(trace_endpos + '0 0 64' - self.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
- self.velocity = normalize(olddir + newdir) * newvel;
+ newdir = normalize(trace_endpos + '0 0 64' - this.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
+ this.velocity = normalize(olddir + newdir) * newvel;
}
else
{
- self.velocity = olddir * newvel;
- self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
+ this.velocity = olddir * newvel;
+ this.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
}
- int cont = pointcontents(self.origin - '0 0 32');
+ int cont = pointcontents(this.origin - '0 0 32');
if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
- self.velocity_z += 200;
+ this.velocity_z += 200;
- UpdateCSQCProjectile(self);
+ UpdateCSQCProjectile(this);
return;
}
#endif
-
-#endif