#include "racer.qh"
+#if defined(SVQC)
+ #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
+ #include <common/mapobjects/trigger/impulse.qh>
+#endif
+
#ifdef GAMEQC
#ifdef SVQC
-#include <common/mapobjects/trigger/impulse.qh>
-
bool autocvar_g_vehicle_racer = true;
float autocvar_g_vehicle_racer_thinkrate = 0.05; // TODO: any higher causes it to sink in liquids
vector autocvar_g_vehicle_racer_bouncepain = '200 0.15 150';
.float racer_watertime;
+.float racer_air_finished; // TODO: use a standard air meter for entities
var .vector(entity this, string tag_name, float spring_length, float max_power) racer_force_from_tag;
{
uforce = autocvar_g_vehicle_racer_water_upforcedamper;
- if(PHYS_INPUT_BUTTON_CROUCH(player) && time < this.air_finished)
+ if(PHYS_INPUT_BUTTON_CROUCH(player) && time < this.racer_air_finished)
this.velocity_z += 30;
else
this.velocity_z += 200;
void racer_fire_rocket_aim(entity this, entity player, string tagname, entity trg)
{
vector v = gettaginfo(this, gettagindex(this, tagname));
- racer_fire_rocket(player, v, v_forward, trg);
+ racer_fire_rocket(this, player, v, v_forward, trg);
}
bool racer_frame(entity this, float dt)
entity vehic = player.vehicle;
return = true;
+#ifdef SVQC
if(game_stopped)
{
vehic.solid = SOLID_NOT;
set_movetype(vehic, MOVETYPE_NONE);
return;
}
+#endif
vehicles_frame(vehic, player);
int cont = Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(vehic.origin));
if(!(cont & DPCONTENTS_WATER))
- vehic.air_finished = 0;
- else if (!vehic.air_finished)
- vehic.air_finished = time + autocvar_g_vehicle_racer_water_time;
+ vehic.racer_air_finished = 0;
+ else if (!vehic.racer_air_finished)
+ vehic.racer_air_finished = time + autocvar_g_vehicle_racer_water_time;
+#ifdef SVQC
if(IS_DEAD(vehic))
{
PHYS_INPUT_BUTTON_ATCK(player) = PHYS_INPUT_BUTTON_ATCK2(player) = false;
return;
}
+#endif
racer_align4point(vehic, player, dt);
+#ifdef SVQC
PHYS_INPUT_BUTTON_ZOOM(player) = PHYS_INPUT_BUTTON_CROUCH(player) = false;
+#endif
vehic.angles_x *= -1;
vector df = vehic.velocity * -autocvar_g_vehicle_racer_friction;
//vehic.velocity_z = ftmp;
- if(CS(player).movement)
+ if(PHYS_CS(player).movement)
{
if(cont & DPCONTENTS_LIQUIDSMASK)
{
- if(CS(player).movement_x) { df += v_forward * ((CS(player).movement_x > 0) ? autocvar_g_vehicle_racer_water_speed_forward : -autocvar_g_vehicle_racer_water_speed_forward); }
- if(CS(player).movement_y) { df += v_right * ((CS(player).movement_y > 0) ? autocvar_g_vehicle_racer_water_speed_strafe : -autocvar_g_vehicle_racer_water_speed_strafe); }
+ if(PHYS_CS(player).movement_x) { df += v_forward * ((PHYS_CS(player).movement_x > 0) ? autocvar_g_vehicle_racer_water_speed_forward : -autocvar_g_vehicle_racer_water_speed_forward); }
+ if(PHYS_CS(player).movement_y) { df += v_right * ((PHYS_CS(player).movement_y > 0) ? autocvar_g_vehicle_racer_water_speed_strafe : -autocvar_g_vehicle_racer_water_speed_strafe); }
}
else
{
- if(CS(player).movement_x) { df += v_forward * ((CS(player).movement_x > 0) ? autocvar_g_vehicle_racer_speed_forward : -autocvar_g_vehicle_racer_speed_forward); }
- if(CS(player).movement_y) { df += v_right * ((CS(player).movement_y > 0) ? autocvar_g_vehicle_racer_speed_strafe : -autocvar_g_vehicle_racer_speed_strafe); }
+ if(PHYS_CS(player).movement_x) { df += v_forward * ((PHYS_CS(player).movement_x > 0) ? autocvar_g_vehicle_racer_speed_forward : -autocvar_g_vehicle_racer_speed_forward); }
+ if(PHYS_CS(player).movement_y) { df += v_right * ((PHYS_CS(player).movement_y > 0) ? autocvar_g_vehicle_racer_speed_strafe : -autocvar_g_vehicle_racer_speed_strafe); }
}
#ifdef SVQC
}
#ifdef SVQC
+ // TODO: move these to the client side where they belong
+ // NOTE: reusing .invincible_finished here as delay counter for the smoke effect
if(vehic.invincible_finished < time)
{
traceline(vehic.origin, vehic.origin - '0 0 256', MOVE_NORMAL, vehic);
vehic.invincible_finished = time + 0.1 + (random() * 0.1);
}
+ // NOTE: reusing .strength_finished here as a sound delay counter
if(vehic.strength_finished < time)
{
vehic.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
dforce = autocvar_g_vehicle_racer_water_downforce;
df -= v_up * (vlen(vehic.velocity) * dforce);
- CS(player).movement = vehic.velocity += df * dt;
+ PHYS_CS(player).movement = vehic.velocity += df * dt;
#ifdef SVQC
}
}
- if(!weaponLocked(player))
+ if (!weaponLocked(player) && !weaponUseForbidden(player))
if(time > vehic.delay)
if(PHYS_INPUT_BUTTON_ATCK2(player))
{
#endif
setorigin(player, vehic.origin + '0 0 32');
+#ifdef SVQC
player.oldorigin = player.origin; // negate fall damage
+#endif
player.velocity = vehic.velocity;
}
+#endif
+#ifdef SVQC
void racer_think(entity this)
{
float dt = autocvar_g_vehicle_racer_thinkrate;