/* fullname */ _("Racer")
);
#else
-
-#define RSM_FIRST 1
-#define RSM_BOMB 1
-#define RSM_FLARE 2
-#define RSM_LAST 2
-
#ifdef SVQC
float autocvar_g_vehicle_racer;
float autocvar_g_vehicle_racer_speed_afterburn;
float autocvar_g_vehicle_racer_afterburn_cost;
+float autocvar_g_vehicle_racer_waterburn_cost;
+float autocvar_g_vehicle_racer_waterburn_speed;
+
+float autocvar_g_vehicle_racer_water_speed_forward;
+float autocvar_g_vehicle_racer_water_speed_strafe;
+
float autocvar_g_vehicle_racer_anglestabilizer;
float autocvar_g_vehicle_racer_downforce;
bl_push = force_fromtag_normpower;
//vehicles_sweap_collision(force_fromtag_origin, self.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- self.velocity += push_vector * _delta;
+ self.velocity += push_vector * _delta;
+
+ if(pointcontents(self.origin - '0 0 64') == CONTENT_WATER)
+ if(self.owner.BUTTON_CROUCH && time < self.air_finished)
+ self.velocity_z += 30;
+ else
+ self.velocity_z += 200;
// Anti ocilation
if(self.velocity_z > 0)
self.velocity = olddir * newvel;
self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
}
+
+ if(pointcontents(self.origin - '0 0 32') == CONTENT_WATER)
+ self.velocity_z += 200;
UpdateCSQCProjectile(self);
return;
float ftmp;
if(intermission_running)
+ {
+ self.vehicle.velocity = '0 0 0';
return 1;
+ }
player = self;
racer = self.vehicle;
self = racer;
- player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
-
vehicles_painframe();
+ if(pointcontents(racer.origin) != CONTENT_WATER)
+ racer.air_finished = time + 5;
+
if(racer.deadflag != DEAD_NO)
{
self = player;
racer_align4point(frametime);
+ player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
+
crosshair_trace(player);
racer.angles_x *= -1;
if(vlen(player.movement) != 0)
{
- if(player.movement_x)
- df += v_forward * ((player.movement_x > 0) ? autocvar_g_vehicle_racer_speed_forward : -autocvar_g_vehicle_racer_speed_forward);
-
- if(player.movement_y)
- df += v_right * ((player.movement_y > 0) ? autocvar_g_vehicle_racer_speed_strafe : -autocvar_g_vehicle_racer_speed_strafe);
+ if(pointcontents(racer.origin) == CONTENT_WATER)
+ {
+ if(player.movement_x) { df += v_forward * ((player.movement_x > 0) ? autocvar_g_vehicle_racer_water_speed_forward : -autocvar_g_vehicle_racer_water_speed_forward); }
+ if(player.movement_y) { df += v_right * ((player.movement_y > 0) ? autocvar_g_vehicle_racer_water_speed_strafe : -autocvar_g_vehicle_racer_water_speed_strafe); }
+ }
+ else
+ {
+ if(player.movement_x) { df += v_forward * ((player.movement_x > 0) ? autocvar_g_vehicle_racer_speed_forward : -autocvar_g_vehicle_racer_speed_forward); }
+ if(player.movement_y) { df += v_right * ((player.movement_y > 0) ? autocvar_g_vehicle_racer_speed_strafe : -autocvar_g_vehicle_racer_speed_strafe); }
+ }
if(self.sound_nexttime < time || self.sounds != 1)
{
pointparticles(particleeffectnum("wakizashi_booster_smoke"), self.origin - v_forward * 32, v_forward * vlen(self.velocity), 1);
racer.wait = time;
- racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime;
- df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
+
+ if(pointcontents(racer.origin) == CONTENT_WATER)
+ {
+ racer.vehicle_energy -= autocvar_g_vehicle_racer_waterburn_cost * frametime;
+ df += (v_forward * autocvar_g_vehicle_racer_waterburn_speed);
+ }
+ else
+ {
+ racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime;
+ df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
+ }
if(racer.invincible_finished < time)
{
df -= v_up * (vlen(racer.velocity) * autocvar_g_vehicle_racer_downforce);
player.movement = racer.velocity += df * frametime;
+ if(!forbidWeaponUse(player))
if(player.BUTTON_ATCK)
if(time > racer.attack_finished_single)
if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost)
}
}
+ if(!forbidWeaponUse(player))
if(time > racer.delay)
if(player.BUTTON_ATCK2)
{
self.lastpushtime = time;
if(!pushdeltatime) return;
- tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NORMAL, self);
+ tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, self);
vector df = self.velocity * -autocvar_g_vehicle_racer_friction;
df_z += (1 - trace_fraction) * autocvar_g_vehicle_racer_hoverpower + sin(time * 2) * (autocvar_g_vehicle_racer_springlength * 2);
+ if(pointcontents(self.origin - '0 0 64') == CONTENT_WATER)
+ self.velocity_z += 200;
+
self.velocity += df * pushdeltatime;
if(self.velocity_z > 0)
self.velocity_z *= 1 - autocvar_g_vehicle_racer_upforcedamper * pushdeltatime;
self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
+
+ CSQCMODEL_AUTOUPDATE();
}
void racer_exit(float eject)
setorigin(self, self.pos1);
}
+void racer_blowup_think()
+{
+ self.nextthink = time;
+
+ if(time >= self.delay)
+ racer_blowup();
+
+ CSQCMODEL_AUTOUPDATE();
+}
+
void racer_deadtouch()
{
self.avelocity_x *= 0.7;
void spawnfunc_vehicle_racer()
{
if(!autocvar_g_vehicle_racer) { remove(self); return; }
- if(!vehicle_initialize(VEH_RACER, TRUE)) { remove(self); return; }
+ if(!vehicle_initialize(VEH_RACER, FALSE)) { remove(self); return; }
}
float v_racer(float req)
}
case VR_THINK:
{
-
return TRUE;
}
case VR_DEATH:
self.deadflag = DEAD_DYING;
self.movetype = MOVETYPE_BOUNCE;
self.wait = time;
+ self.delay = 2 + time + random() * 3;
self.cnt = 1 + random() * 2;
self.touch = racer_deadtouch;
self.velocity += '0 0 700';
self.colormod = '-0.5 -0.5 -0.5';
- self.think = racer_blowup;
- self.nextthink = 2 + time + random() * 3;
+ self.think = racer_blowup_think;
+ self.nextthink = time;
return TRUE;
}
self.vehicle_health = autocvar_g_vehicle_racer_health;
self.vehicle_shield = autocvar_g_vehicle_racer_shield;
- self.movetype = MOVETYPE_TOSS;
+ self.movetype = MOVETYPE_TOSS;
self.solid = SOLID_SLIDEBOX;
self.delay = time;
self.scale = 0.5;