#ifndef VEHICLE_RACER
#define VEHICLE_RACER
-#include "racer_weapon.qc"
+#include "racer_weapon.qh"
CLASS(Racer, Vehicle)
/* spawnflags */ ATTRIB(Racer, spawnflags, int, VHF_DMGSHAKE | VHF_DMGROLL);
/* mins */ ATTRIB(Racer, mins, vector, '-120 -120 -40' * 0.5);
/* maxs */ ATTRIB(Racer, maxs, vector, '120 120 40' * 0.5);
+/* view offset*/ ATTRIB(Racer, view_ofs, vector, '0 0 50');
+/* view dist */ ATTRIB(Racer, height, float, 200);
/* model */ ATTRIB(Racer, mdl, string, "models/vehicles/wakizashi.dpm");
/* model */ ATTRIB(Racer, model, string, "models/vehicles/wakizashi.dpm");
/* head_model */ ATTRIB(Racer, head_model, string, "null");
#ifdef IMPLEMENTATION
-#include "racer_weapon.qc"
-
#ifdef SVQC
#include <common/triggers/trigger/impulse.qh>
-bool autocvar_g_vehicle_racer;
+bool autocvar_g_vehicle_racer = true;
+
+float autocvar_g_vehicle_racer_thinkrate = 0.05; // TODO: any higher causes it to sink in liquids
-float autocvar_g_vehicle_racer_speed_afterburn;
-float autocvar_g_vehicle_racer_afterburn_cost;
+float autocvar_g_vehicle_racer_speed_afterburn = 3000;
+// energy consumed per second
+float autocvar_g_vehicle_racer_afterburn_cost = 100;
-float autocvar_g_vehicle_racer_waterburn_cost;
-float autocvar_g_vehicle_racer_waterburn_speed;
+float autocvar_g_vehicle_racer_waterburn_cost = 5;
+float autocvar_g_vehicle_racer_waterburn_speed = 750;
-float autocvar_g_vehicle_racer_water_speed_forward;
-float autocvar_g_vehicle_racer_water_speed_strafe;
+float autocvar_g_vehicle_racer_water_speed_forward = 600;
+float autocvar_g_vehicle_racer_water_speed_strafe = 600;
float autocvar_g_vehicle_racer_pitchlimit = 30;
float autocvar_g_vehicle_racer_water_downforce = 0.03;
float autocvar_g_vehicle_racer_water_upforcedamper = 15;
-float autocvar_g_vehicle_racer_anglestabilizer;
-float autocvar_g_vehicle_racer_downforce;
+float autocvar_g_vehicle_racer_anglestabilizer = 1.75;
+float autocvar_g_vehicle_racer_downforce = 0.01;
-float autocvar_g_vehicle_racer_speed_forward;
-float autocvar_g_vehicle_racer_speed_strafe;
-float autocvar_g_vehicle_racer_springlength;
-float autocvar_g_vehicle_racer_upforcedamper;
-float autocvar_g_vehicle_racer_friction;
+float autocvar_g_vehicle_racer_speed_forward = 650;
+float autocvar_g_vehicle_racer_speed_strafe = 650;
+float autocvar_g_vehicle_racer_springlength = 70;
+float autocvar_g_vehicle_racer_upforcedamper = 10;
+float autocvar_g_vehicle_racer_friction = 0.45;
float autocvar_g_vehicle_racer_water_time = 5;
-float autocvar_g_vehicle_racer_hovertype;
-float autocvar_g_vehicle_racer_hoverpower;
+float autocvar_g_vehicle_racer_collision_multiplier = 0.05;
+
+// 0 = hover, != 0 = maglev
+int autocvar_g_vehicle_racer_hovertype = 0;
+// NOTE!! x 4 (4 engines)
+float autocvar_g_vehicle_racer_hoverpower = 8000;
-float autocvar_g_vehicle_racer_turnroll;
-float autocvar_g_vehicle_racer_turnspeed;
-float autocvar_g_vehicle_racer_pitchspeed;
+float autocvar_g_vehicle_racer_turnroll = 30;
+float autocvar_g_vehicle_racer_turnspeed = 220;
+float autocvar_g_vehicle_racer_pitchspeed = 125;
-float autocvar_g_vehicle_racer_energy;
-float autocvar_g_vehicle_racer_energy_regen;
-float autocvar_g_vehicle_racer_energy_regen_pause;
+float autocvar_g_vehicle_racer_energy = 100;
+float autocvar_g_vehicle_racer_energy_regen = 50;
+float autocvar_g_vehicle_racer_energy_regen_pause = 1;
-float autocvar_g_vehicle_racer_health;
-float autocvar_g_vehicle_racer_health_regen;
-float autocvar_g_vehicle_racer_health_regen_pause;
+float autocvar_g_vehicle_racer_health = 200;
+float autocvar_g_vehicle_racer_health_regen = 0;
+float autocvar_g_vehicle_racer_health_regen_pause = 0;
-float autocvar_g_vehicle_racer_shield;
-float autocvar_g_vehicle_racer_shield_regen;
-float autocvar_g_vehicle_racer_shield_regen_pause;
+float autocvar_g_vehicle_racer_shield = 100;
+float autocvar_g_vehicle_racer_shield_regen = 30;
+float autocvar_g_vehicle_racer_shield_regen_pause = 1;
-float autocvar_g_vehicle_racer_rocket_locktarget;
-float autocvar_g_vehicle_racer_rocket_locking_time;
-float autocvar_g_vehicle_racer_rocket_locking_releasetime;
-float autocvar_g_vehicle_racer_rocket_locked_time;
+bool autocvar_g_vehicle_racer_rocket_locktarget = true;
+float autocvar_g_vehicle_racer_rocket_locking_time = 0.9;
+float autocvar_g_vehicle_racer_rocket_locking_releasetime = 0.5;
+float autocvar_g_vehicle_racer_rocket_locked_time = 4;
-float autocvar_g_vehicle_racer_respawntime;
+float autocvar_g_vehicle_racer_respawntime = 35;
-float autocvar_g_vehicle_racer_blowup_radius;
-float autocvar_g_vehicle_racer_blowup_coredamage;
-float autocvar_g_vehicle_racer_blowup_edgedamage;
-float autocvar_g_vehicle_racer_blowup_forceintensity;
+float autocvar_g_vehicle_racer_blowup_radius = 250;
+float autocvar_g_vehicle_racer_blowup_coredamage = 250;
+float autocvar_g_vehicle_racer_blowup_edgedamage = 15;
+float autocvar_g_vehicle_racer_blowup_forceintensity = 250;
-float autocvar_g_vehicle_racer_bouncefactor;
-float autocvar_g_vehicle_racer_bouncestop;
-vector autocvar_g_vehicle_racer_bouncepain;
+// Factor of old velocity to keep after collision
+float autocvar_g_vehicle_racer_bouncefactor = 0.25;
+// if != 0, New veloctiy after bounce = 0 if new velocity < this
+float autocvar_g_vehicle_racer_bouncestop = 0;
+// "minspeed_for_pain speedchange_to_pain_factor max_damage"
+vector autocvar_g_vehicle_racer_bouncepain = '60 0.75 300';
.float racer_watertime;
-var vector racer_force_from_tag(string tag_name, float spring_length, float max_power);
+var vector racer_force_from_tag(entity this, string tag_name, float spring_length, float max_power);
-void racer_align4point(float _delta)
-{SELFPARAM();
+void racer_align4point(entity this, float _delta)
+{
vector push_vector;
float fl_push, fr_push, bl_push, br_push;
- push_vector = racer_force_from_tag("tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ push_vector = racer_force_from_tag(this, "tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
fr_push = force_fromtag_normpower;
- //vehicles_sweap_collision(force_fromtag_origin, self.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+ //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_force_from_tag("tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ push_vector += racer_force_from_tag(this, "tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
fl_push = force_fromtag_normpower;
- //vehicles_sweap_collision(force_fromtag_origin, self.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+ //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_force_from_tag("tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ push_vector += racer_force_from_tag(this, "tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
br_push = force_fromtag_normpower;
- //vehicles_sweap_collision(force_fromtag_origin, self.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+ //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_force_from_tag("tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ push_vector += racer_force_from_tag(this, "tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
bl_push = force_fromtag_normpower;
- //vehicles_sweap_collision(force_fromtag_origin, self.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+ //vehicles_sweap_collision(force_fromtag_origin, this.velocity, _delta, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- self.velocity += push_vector * _delta;
+ this.velocity += push_vector * _delta;
float uforce = autocvar_g_vehicle_racer_upforcedamper;
- int cont = pointcontents(self.origin - '0 0 64');
+ int cont = pointcontents(this.origin - '0 0 64');
if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
{
uforce = autocvar_g_vehicle_racer_water_upforcedamper;
- if(self.owner.BUTTON_CROUCH && time < self.air_finished)
- self.velocity_z += 30;
+ if(PHYS_INPUT_BUTTON_CROUCH(this.owner) && time < this.air_finished)
+ this.velocity_z += 30;
else
- self.velocity_z += 200;
+ this.velocity_z += 200;
}
// Anti ocilation
- if(self.velocity_z > 0)
- self.velocity_z *= 1 - uforce * _delta;
+ if(this.velocity_z > 0)
+ this.velocity_z *= 1 - uforce * _delta;
push_vector_x = (fl_push - bl_push);
push_vector_x += (fr_push - br_push);
push_vector_z *= 360;
// Apply angle diffrance
- self.angles_z += push_vector_z * _delta;
- self.angles_x += push_vector_x * _delta;
+ this.angles_z += push_vector_z * _delta;
+ this.angles_x += push_vector_x * _delta;
// Apply stabilizer
- self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * _delta);
- self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * _delta);
+ this.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * _delta);
+ this.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * _delta);
}
void racer_fire_rocket_aim(entity player, string tagname, entity trg)
racer_fire_rocket(player, v, v_forward, trg);
}
-float racer_frame()
-{SELFPARAM();
- entity player, racer;
- vector df;
- float ftmp;
+bool racer_frame(entity this)
+{
+ entity vehic = this.vehicle;
+ return = true;
if(intermission_running)
{
- self.vehicle.velocity = '0 0 0';
- self.vehicle.avelocity = '0 0 0';
- return 1;
+ vehic.velocity = '0 0 0';
+ vehic.avelocity = '0 0 0';
+ return;
}
- player = self;
- racer = self.vehicle;
- setself(racer);
-
- vehicles_painframe();
+ vehicles_frame(vehic, this);
- if(pointcontents(racer.origin) != CONTENT_WATER)
- racer.air_finished = time + autocvar_g_vehicle_racer_water_time;
+ traceline(vehic.origin, vehic.origin + '0 0 1', MOVE_NOMONSTERS, this);
+ int cont = trace_dpstartcontents;
+ if(cont & DPCONTENTS_WATER)
+ vehic.air_finished = time + autocvar_g_vehicle_racer_water_time;
- if(racer.deadflag != DEAD_NO)
+ if(IS_DEAD(vehic))
{
- setself(player);
- player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
- return 1;
+ PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_ATCK2(this) = false;
+ return;
}
- racer_align4point(PHYS_INPUT_TIMELENGTH);
+ racer_align4point(vehic, PHYS_INPUT_TIMELENGTH);
- player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
+ PHYS_INPUT_BUTTON_ZOOM(this) = PHYS_INPUT_BUTTON_CROUCH(this) = false;
- crosshair_trace(player);
+ if(time >= vehic.vehicle_last_trace)
+ {
+ crosshair_trace(this);
+ vehic.vehicle_last_trace = time + autocvar_g_vehicle_racer_thinkrate;
+ }
- racer.angles_x *= -1;
+ vehic.angles_x *= -1;
// Yaw
- ftmp = autocvar_g_vehicle_racer_turnspeed * PHYS_INPUT_TIMELENGTH;
- ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
- racer.angles_y = anglemods(racer.angles_y + ftmp);
+ float ftmp = autocvar_g_vehicle_racer_turnspeed * PHYS_INPUT_TIMELENGTH;
+ ftmp = bound(-ftmp, shortangle_f(this.v_angle_y - vehic.angles_y, vehic.angles_y), ftmp);
+ vehic.angles_y = anglemods(vehic.angles_y + ftmp);
// Roll
- racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * PHYS_INPUT_TIMELENGTH;
+ vehic.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * PHYS_INPUT_TIMELENGTH;
// Pitch
ftmp = autocvar_g_vehicle_racer_pitchspeed * PHYS_INPUT_TIMELENGTH;
- ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp);
- racer.angles_x = bound(-autocvar_g_vehicle_racer_pitchlimit, anglemods(racer.angles_x + ftmp), autocvar_g_vehicle_racer_pitchlimit);
+ ftmp = bound(-ftmp, shortangle_f(this.v_angle_x - vehic.angles_x, vehic.angles_x), ftmp);
+ vehic.angles_x = bound(-autocvar_g_vehicle_racer_pitchlimit, anglemods(vehic.angles_x + ftmp), autocvar_g_vehicle_racer_pitchlimit);
- makevectors(racer.angles);
- racer.angles_x *= -1;
+ makevectors(vehic.angles);
+ vehic.angles_x *= -1;
- //ftmp = racer.velocity_z;
- df = racer.velocity * -autocvar_g_vehicle_racer_friction;
- //racer.velocity_z = ftmp;
+ //ftmp = vehic.velocity_z;
+ vector df = vehic.velocity * -autocvar_g_vehicle_racer_friction;
+ //vehic.velocity_z = ftmp;
- int cont = pointcontents(racer.origin);
- if(vlen(player.movement) != 0)
+ if(this.movement)
{
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(cont & DPCONTENTS_LIQUIDSMASK)
{
- 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); }
+ if(this.movement_x) { df += v_forward * ((this.movement_x > 0) ? autocvar_g_vehicle_racer_water_speed_forward : -autocvar_g_vehicle_racer_water_speed_forward); }
+ if(this.movement_y) { df += v_right * ((this.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(this.movement_x) { df += v_forward * ((this.movement_x > 0) ? autocvar_g_vehicle_racer_speed_forward : -autocvar_g_vehicle_racer_speed_forward); }
+ if(this.movement_y) { df += v_right * ((this.movement_y > 0) ? autocvar_g_vehicle_racer_speed_strafe : -autocvar_g_vehicle_racer_speed_strafe); }
}
#ifdef SVQC
- if(self.sound_nexttime < time || self.sounds != 1)
+ if(vehic.sound_nexttime < time || vehic.sounds != 1)
{
- self.sounds = 1;
- self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
- sound (self, CH_TRIGGER_SINGLE, SND_VEH_RACER_MOVE, VOL_VEHICLEENGINE, ATTEN_NORM);
+ vehic.sounds = 1;
+ vehic.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
+ sound (vehic, CH_TRIGGER_SINGLE, SND_VEH_RACER_MOVE, VOL_VEHICLEENGINE, ATTEN_NORM);
}
#endif
}
#ifdef SVQC
else
{
- if(self.sound_nexttime < time || self.sounds != 0)
+ if(vehic.sound_nexttime < time || vehic.sounds != 0)
{
- self.sounds = 0;
- self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
- sound (self, CH_TRIGGER_SINGLE, SND_VEH_RACER_IDLE, VOL_VEHICLEENGINE, ATTEN_NORM);
+ vehic.sounds = 0;
+ vehic.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
+ sound (vehic, CH_TRIGGER_SINGLE, SND_VEH_RACER_IDLE, VOL_VEHICLEENGINE, ATTEN_NORM);
}
}
#endif
// Afterburn
- if (PHYS_INPUT_BUTTON_JUMP(player) && racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * PHYS_INPUT_TIMELENGTH))
+ if (PHYS_INPUT_BUTTON_JUMP(this) && vehic.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * PHYS_INPUT_TIMELENGTH))
{
#ifdef SVQC
- if(time - racer.wait > 0.2)
- pointparticles(EFFECT_RACER_BOOSTER, self.origin - v_forward * 32, v_forward * vlen(self.velocity), 1);
+ if(time - vehic.wait > 0.2)
+ pointparticles(EFFECT_RACER_BOOSTER, vehic.origin - v_forward * 32, v_forward * vlen(vehic.velocity), 1);
#endif
- racer.wait = time;
+ vehic.wait = time;
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(cont & DPCONTENTS_LIQUIDSMASK)
{
- racer.vehicle_energy -= autocvar_g_vehicle_racer_waterburn_cost * PHYS_INPUT_TIMELENGTH;
+ vehic.vehicle_energy -= autocvar_g_vehicle_racer_waterburn_cost * PHYS_INPUT_TIMELENGTH;
df += (v_forward * autocvar_g_vehicle_racer_waterburn_speed);
}
else
{
- racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * PHYS_INPUT_TIMELENGTH;
+ vehic.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * PHYS_INPUT_TIMELENGTH;
df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
}
#ifdef SVQC
- if(racer.invincible_finished < time)
+ if(vehic.invincible_finished < time)
{
- traceline(racer.origin, racer.origin - '0 0 256', MOVE_NORMAL, self);
+ traceline(vehic.origin, vehic.origin - '0 0 256', MOVE_NORMAL, vehic);
if(trace_fraction != 1.0)
pointparticles(EFFECT_SMOKE_SMALL, trace_endpos, '0 0 0', 1);
- racer.invincible_finished = time + 0.1 + (random() * 0.1);
+ vehic.invincible_finished = time + 0.1 + (random() * 0.1);
}
- if(racer.strength_finished < time)
+ if(vehic.strength_finished < time)
{
- racer.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
- sound (racer.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RACER_BOOST, VOL_VEHICLEENGINE, ATTEN_NORM);
+ vehic.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
+ sound (vehic.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RACER_BOOST, VOL_VEHICLEENGINE, ATTEN_NORM);
}
#endif
}
else
{
- racer.strength_finished = 0;
- sound (racer.tur_head, CH_TRIGGER_SINGLE, SND_Null, VOL_VEHICLEENGINE, ATTEN_NORM);
+ vehic.strength_finished = 0;
+ sound (vehic.tur_head, CH_TRIGGER_SINGLE, SND_Null, VOL_VEHICLEENGINE, ATTEN_NORM);
}
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
- racer.racer_watertime = time;
+ if(cont & DPCONTENTS_LIQUIDSMASK)
+ vehic.racer_watertime = time;
float dforce = autocvar_g_vehicle_racer_downforce;
- if(time - racer.racer_watertime <= 3)
+ if(time - vehic.racer_watertime <= 3)
dforce = autocvar_g_vehicle_racer_water_downforce;
- df -= v_up * (vlen(racer.velocity) * dforce);
- player.movement = racer.velocity += df * PHYS_INPUT_TIMELENGTH;
+ df -= v_up * (vlen(vehic.velocity) * dforce);
+ this.movement = vehic.velocity += df * PHYS_INPUT_TIMELENGTH;
#ifdef SVQC
+ setself(vehic);
+
Weapon wep1 = WEP_RACER;
- if (!forbidWeaponUse(player))
- if (player.BUTTON_ATCK)
+ if (!forbidWeaponUse(this))
+ if (PHYS_INPUT_BUTTON_ATCK(this))
if (wep1.wr_checkammo1(wep1))
{
- string tagname = (racer.cnt)
- ? (racer.cnt = 0, "tag_fire1")
- : (racer.cnt = 1, "tag_fire2");
- vector org = gettaginfo(self, gettagindex(self, tagname));
+ string tagname = (vehic.cnt)
+ ? (vehic.cnt = 0, "tag_fire1")
+ : (vehic.cnt = 1, "tag_fire2");
+ vector org = gettaginfo(vehic, gettagindex(vehic, tagname));
w_shotorg = org;
w_shotdir = v_forward;
// Fix z-aim (for chase mode)
- crosshair_trace(player);
+ crosshair_trace(this);
w_shotdir.z = normalize(trace_endpos - org).z * 0.5;
.entity weaponentity = weaponentities[0];
- wep1.wr_think(wep1, self, weaponentity, 1);
+ wep1.wr_think(wep1, vehic, weaponentity, 1);
}
+ setself(this);
+
if(autocvar_g_vehicle_racer_rocket_locktarget)
{
- vehicles_locktarget((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
+ if(vehic.vehicle_last_trace == time + autocvar_g_vehicle_racer_thinkrate)
+ vehicles_locktarget(vehic, (1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
(1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
autocvar_g_vehicle_racer_rocket_locked_time);
- if(self.lock_target)
+ if(vehic.lock_target)
{
- if(racer.lock_strength == 1)
- UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '1 0 0', 0);
- else if(self.lock_strength > 0.5)
- UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 1 0', 0);
- else if(self.lock_strength < 0.5)
- UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 0 1', 0);
+ if(vehic.lock_strength == 1)
+ UpdateAuxiliaryXhair(this, real_origin(vehic.lock_target), '1 0 0', 0);
+ else if(vehic.lock_strength > 0.5)
+ UpdateAuxiliaryXhair(this, real_origin(vehic.lock_target), '0 1 0', 0);
+ else if(vehic.lock_strength < 0.5)
+ UpdateAuxiliaryXhair(this, real_origin(vehic.lock_target), '0 0 1', 0);
}
}
- if(!forbidWeaponUse(player))
- if(time > racer.delay)
- if(player.BUTTON_ATCK2)
+ if(!forbidWeaponUse(this))
+ if(time > vehic.delay)
+ if(PHYS_INPUT_BUTTON_ATCK2(this))
{
- racer.misc_bulletcounter += 1;
- racer.delay = time + 0.3;
+ vehic.misc_bulletcounter += 1;
+ vehic.delay = time + 0.3;
- if(racer.misc_bulletcounter == 1)
+ if(vehic.misc_bulletcounter == 1)
{
- racer_fire_rocket_aim(player, "tag_rocket_r", (racer.lock_strength == 1 && racer.lock_target) ? racer.lock_target : world);
- player.vehicle_ammo2 = 50;
+ racer_fire_rocket_aim(this, "tag_rocket_r", (vehic.lock_strength == 1 && vehic.lock_target) ? vehic.lock_target : world);
+ this.vehicle_ammo2 = 50;
}
- else if(racer.misc_bulletcounter == 2)
+ else if(vehic.misc_bulletcounter == 2)
{
- racer_fire_rocket_aim(player, "tag_rocket_l", (racer.lock_strength == 1 && racer.lock_target) ? racer.lock_target : world);
- racer.lock_strength = 0;
- racer.lock_target = world;
- racer.misc_bulletcounter = 0;
- racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
- racer.lip = time;
- player.vehicle_ammo2 = 0;
+ racer_fire_rocket_aim(this, "tag_rocket_l", (vehic.lock_strength == 1 && vehic.lock_target) ? vehic.lock_target : world);
+ vehic.lock_strength = 0;
+ vehic.lock_target = world;
+ vehic.misc_bulletcounter = 0;
+ vehic.delay = time + autocvar_g_vehicle_racer_rocket_refire;
+ vehic.lip = time;
+ this.vehicle_ammo2 = 0;
}
}
- else if(racer.misc_bulletcounter == 0)
- player.vehicle_ammo2 = 100;
-
- player.vehicle_reload2 = bound(0, 100 * ((time - racer.lip) / (racer.delay - racer.lip)), 100);
+ else if(vehic.misc_bulletcounter == 0)
+ this.vehicle_ammo2 = 100;
- if(racer.vehicle_flags & VHF_SHIELDREGEN)
- vehicles_regen(racer.dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime, true);
+ this.vehicle_reload2 = bound(0, 100 * ((time - vehic.lip) / (vehic.delay - vehic.lip)), 100);
- if(racer.vehicle_flags & VHF_HEALTHREGEN)
- vehicles_regen(racer.dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime, false);
+ if(vehic.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(vehic, vehic.dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime, true);
- if(racer.vehicle_flags & VHF_ENERGYREGEN)
- vehicles_regen(racer.wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime, false);
+ if(vehic.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(vehic, vehic.dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime, false);
+ if(vehic.vehicle_flags & VHF_ENERGYREGEN)
+ vehicles_regen(vehic, vehic.wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime, false);
- VEHICLE_UPDATE_PLAYER(player, health, racer);
- VEHICLE_UPDATE_PLAYER(player, energy, racer);
+ VEHICLE_UPDATE_PLAYER(this, vehic, health, racer);
+ VEHICLE_UPDATE_PLAYER(this, vehic, energy, racer);
- if(racer.vehicle_flags & VHF_HASSHIELD)
- VEHICLE_UPDATE_PLAYER(player, shield, racer);
+ if(vehic.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(this, vehic, shield, racer);
- player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+ PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_ATCK2(this) = false;
#endif
- setorigin(player,racer.origin + '0 0 32');
- player.velocity = racer.velocity;
-
- setself(player);
- return 1;
+ setorigin(this, vehic.origin + '0 0 32');
+ this.velocity = vehic.velocity;
}
void racer_think()
{SELFPARAM();
- self.nextthink = time;
+ this.nextthink = time + autocvar_g_vehicle_racer_thinkrate;
- float pushdeltatime = time - self.lastpushtime;
- if (pushdeltatime > 0.15) pushdeltatime = 0;
- self.lastpushtime = time;
- if(!pushdeltatime) return;
-
- tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, self);
+ tracebox(this.origin, this.mins, this.maxs, this.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, this);
- vector df = self.velocity * -autocvar_g_vehicle_racer_friction;
+ vector df = this.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);
float forced = autocvar_g_vehicle_racer_upforcedamper;
- int cont = pointcontents(self.origin - '0 0 64');
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ //int cont = pointcontents(self.origin - '0 0 64');
+ traceline(this.origin - '0 0 64', this.origin - '0 0 64', MOVE_NOMONSTERS, this);
+ //if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(trace_dpstartcontents & DPCONTENTS_LIQUIDSMASK)
{
forced = autocvar_g_vehicle_racer_water_upforcedamper;
- self.velocity_z += 200;
+ this.velocity_z += 200;
}
- self.velocity += df * pushdeltatime;
- if(self.velocity_z > 0)
- self.velocity_z *= 1 - forced * pushdeltatime;
+ this.velocity += df * autocvar_g_vehicle_racer_thinkrate;
+ if(this.velocity_z > 0)
+ this.velocity_z *= 1 - forced * autocvar_g_vehicle_racer_thinkrate;
- self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
- self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
+ this.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
+ this.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
- CSQCMODEL_AUTOUPDATE(self);
+ CSQCMODEL_AUTOUPDATE(this);
}
void racer_exit(float eject)
}
else
{
- if(vlen(self.velocity) > 2 * autocvar_sv_maxairspeed)
+ if(vdist(self.velocity, >, 2 * autocvar_sv_maxairspeed))
{
self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed * 2;
self.owner.velocity_z += 200;
self.owner.oldvelocity = self.owner.velocity;
setorigin(self.owner , spot);
}
- antilag_clear(self.owner);
+ antilag_clear(self.owner, CS(self.owner));
self.owner = world;
}
spawnfunc(vehicle_racer)
{
- if(!autocvar_g_vehicle_racer) { remove(self); return; }
- if(!vehicle_initialize(VEH_RACER, false)) { remove(self); return; }
+ if(!autocvar_g_vehicle_racer) { remove(this); return; }
+ if(!vehicle_initialize(this, VEH_RACER, false)) { remove(this); return; }
}
#endif // SVQC
#endif
#endif
- METHOD(Racer, vr_impact, void(Racer thisveh))
- {
- #ifdef SVQC
- if(autocvar_g_vehicle_racer_bouncepain)
- vehicles_impact(autocvar_g_vehicle_racer_bouncepain_x, autocvar_g_vehicle_racer_bouncepain_y, autocvar_g_vehicle_racer_bouncepain_z);
- #endif
- }
+METHOD(Racer, vr_impact, void(Racer thisveh, entity instance))
+{
+#ifdef SVQC
+ if(autocvar_g_vehicle_racer_bouncepain)
+ vehicles_impact(instance, autocvar_g_vehicle_racer_bouncepain_x, autocvar_g_vehicle_racer_bouncepain_y, autocvar_g_vehicle_racer_bouncepain_z);
+#endif
+}
- METHOD(Racer, vr_enter, void(Racer thisveh))
- {
- #ifdef SVQC
- self.movetype = MOVETYPE_BOUNCE;
- self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health) * 100;
- self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield) * 100;
+METHOD(Racer, vr_enter, void(Racer thisveh, entity instance))
+{
+#ifdef SVQC
+ SELFPARAM();
+ self.movetype = MOVETYPE_BOUNCE;
+ self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health) * 100;
+ self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield) * 100;
+
+ if(self.owner.flagcarried)
+ setorigin(self.owner.flagcarried, '-190 0 96');
+#elif defined(CSQC)
+ SELFPARAM();
+ self.move_movetype = MOVETYPE_BOUNCE;
+#endif
+}
- if(self.owner.flagcarried)
- setorigin(self.owner.flagcarried, '-190 0 96');
- #elif defined(CSQC)
+METHOD(Racer, vr_spawn, void(Racer thisveh, entity instance))
+{
+#ifdef SVQC
+ SELFPARAM();
+ if(self.scale != 0.5)
+ {
+ if(autocvar_g_vehicle_racer_hovertype != 0)
+ racer_force_from_tag = vehicles_force_fromtag_maglev;
+ else
+ racer_force_from_tag = vehicles_force_fromtag_hover;
+
+ // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
+ self.scale = 0.5;
+ setattachment(self.vehicle_hudmodel, self, "");
+ setattachment(self.vehicle_viewport, self, "tag_viewport");
+
+ self.mass = 900;
+ }
+
+ self.think = racer_think;
+ self.nextthink = time;
+ self.vehicle_health = autocvar_g_vehicle_racer_health;
+ self.vehicle_shield = autocvar_g_vehicle_racer_shield;
+
+ self.movetype = MOVETYPE_TOSS;
+ self.solid = SOLID_SLIDEBOX;
+ self.delay = time;
+ self.scale = 0.5;
+
+ self.PlayerPhysplug = racer_frame;
+
+ self.bouncefactor = autocvar_g_vehicle_racer_bouncefactor;
+ self.bouncestop = autocvar_g_vehicle_racer_bouncestop;
+ self.damageforcescale = 0.5;
+ self.vehicle_health = autocvar_g_vehicle_racer_health;
+ self.vehicle_shield = autocvar_g_vehicle_racer_shield;
+#endif
+}
- self.move_movetype = MOVETYPE_BOUNCE;
- #endif
- }
+METHOD(Racer, vr_death, void(Racer thisveh, entity instance))
+{
+#ifdef SVQC
+ instance.SendEntity = func_null; // stop networking this racer (for now)
+ instance.health = 0;
+ instance.event_damage = func_null;
+ instance.solid = SOLID_CORPSE;
+ instance.takedamage = DAMAGE_NO;
+ instance.deadflag = DEAD_DYING;
+ instance.movetype = MOVETYPE_BOUNCE;
+ instance.wait = time;
+ instance.delay = 2 + time + random() * 3;
+ instance.cnt = 1 + random() * 2;
+ instance.touch = racer_deadtouch;
+
+ Send_Effect(EFFECT_EXPLOSION_MEDIUM, instance.origin, '0 0 0', 1);
+
+ if(random() < 0.5)
+ instance.avelocity_z = 32;
+ else
+ instance.avelocity_z = -32;
+
+ instance.avelocity_x = -vlen(instance.velocity) * 0.2;
+ instance.velocity += '0 0 700';
+ instance.colormod = '-0.5 -0.5 -0.5';
+
+ instance.think = racer_blowup_think;
+ instance.nextthink = time;
+#endif
+}
- METHOD(Racer, vr_spawn, void(Racer thisveh))
- {
- #ifdef SVQC
- if(self.scale != 0.5)
- {
- if(autocvar_g_vehicle_racer_hovertype != 0)
- racer_force_from_tag = vehicles_force_fromtag_maglev;
- else
- racer_force_from_tag = vehicles_force_fromtag_hover;
-
- // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
- self.scale = 0.5;
- setattachment(self.vehicle_hudmodel, self, "");
- setattachment(self.vehicle_viewport, self, "tag_viewport");
-
- self.mass = 900;
- }
-
- self.think = racer_think;
- self.nextthink = time;
- self.vehicle_health = autocvar_g_vehicle_racer_health;
- self.vehicle_shield = autocvar_g_vehicle_racer_shield;
-
- self.movetype = MOVETYPE_TOSS;
- self.solid = SOLID_SLIDEBOX;
- self.delay = time;
- self.scale = 0.5;
-
- self.PlayerPhysplug = racer_frame;
-
- self.bouncefactor = autocvar_g_vehicle_racer_bouncefactor;
- self.bouncestop = autocvar_g_vehicle_racer_bouncestop;
- self.damageforcescale = 0.5;
- self.vehicle_health = autocvar_g_vehicle_racer_health;
- self.vehicle_shield = autocvar_g_vehicle_racer_shield;
- #endif
- }
+#ifdef CSQC
+METHOD(Racer, vr_hud, void(Racer thisveh))
+{
+ Vehicles_drawHUD(VEH_RACER.m_icon, "vehicle_racer_weapon1", "vehicle_racer_weapon2",
+ "vehicle_icon_ammo1", autocvar_hud_progressbar_vehicles_ammo1_color,
+ "vehicle_icon_ammo2", autocvar_hud_progressbar_vehicles_ammo2_color);
+}
+METHOD(Racer, vr_crosshair, void(Racer thisveh))
+{
+ Vehicles_drawCrosshair(vCROSS_GUIDE);
+}
+#endif
+METHOD(Racer, vr_setup, void(Racer thisveh, entity instance))
+{
+#ifdef SVQC
+ instance.vehicle_exit = racer_exit;
- METHOD(Racer, vr_death, void(Racer thisveh))
- {
- #ifdef SVQC
- self.SendEntity = func_null; // stop networking this racer (for now)
- self.health = 0;
- self.event_damage = func_null;
- self.solid = SOLID_CORPSE;
- self.takedamage = DAMAGE_NO;
- 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;
-
- Send_Effect(EFFECT_EXPLOSION_MEDIUM, self.origin, '0 0 0', 1);
-
- if(random() < 0.5)
- self.avelocity_z = 32;
- else
- self.avelocity_z = -32;
-
- self.avelocity_x = -vlen(self.velocity) * 0.2;
- self.velocity += '0 0 700';
- self.colormod = '-0.5 -0.5 -0.5';
-
- self.think = racer_blowup_think;
- self.nextthink = time;
- #endif
- }
+ // we have no need to network energy
+ if(autocvar_g_vehicle_racer_energy)
+ if(autocvar_g_vehicle_racer_energy_regen)
+ instance.vehicle_flags |= VHF_ENERGYREGEN;
+
+ if(autocvar_g_vehicle_racer_shield)
+ instance.vehicle_flags |= VHF_HASSHIELD;
+
+ if(autocvar_g_vehicle_racer_shield_regen)
+ instance.vehicle_flags |= VHF_SHIELDREGEN;
+
+ if(autocvar_g_vehicle_racer_health_regen)
+ instance.vehicle_flags |= VHF_HEALTHREGEN;
+
+ instance.respawntime = autocvar_g_vehicle_racer_respawntime;
+ instance.vehicle_health = autocvar_g_vehicle_racer_health;
+ instance.vehicle_shield = autocvar_g_vehicle_racer_shield;
+ instance.max_health = instance.vehicle_health;
+#endif
#ifdef CSQC
- METHOD(Racer, vr_hud, void(Racer thisveh))
- {
- Vehicles_drawHUD(VEH_RACER.m_icon, "vehicle_racer_weapon1", "vehicle_racer_weapon2",
- "vehicle_icon_ammo1", autocvar_hud_progressbar_vehicles_ammo1_color,
- "vehicle_icon_ammo2", autocvar_hud_progressbar_vehicles_ammo2_color);
- }
- METHOD(Racer, vr_crosshair, void(Racer thisveh))
- {
- Vehicles_drawCrosshair(vCROSS_GUIDE);
- }
+ AuxiliaryXhair[0].axh_image = vCROSS_LOCK; // Rocket
#endif
- METHOD(Racer, vr_setup, void(Racer thisveh))
- {
- #ifdef SVQC
- self.vehicle_exit = racer_exit;
- #endif
-
- #ifdef SVQC
- // we have no need to network energy
- if(autocvar_g_vehicle_racer_energy)
- if(autocvar_g_vehicle_racer_energy_regen)
- self.vehicle_flags |= VHF_ENERGYREGEN;
-
- if(autocvar_g_vehicle_racer_shield)
- self.vehicle_flags |= VHF_HASSHIELD;
-
- if(autocvar_g_vehicle_racer_shield_regen)
- self.vehicle_flags |= VHF_SHIELDREGEN;
-
- if(autocvar_g_vehicle_racer_health_regen)
- self.vehicle_flags |= VHF_HEALTHREGEN;
-
- self.respawntime = autocvar_g_vehicle_racer_respawntime;
- self.vehicle_health = autocvar_g_vehicle_racer_health;
- self.vehicle_shield = autocvar_g_vehicle_racer_shield;
- self.max_health = self.vehicle_health;
- #endif
-
- #ifdef CSQC
- AuxiliaryXhair[0].axh_image = vCROSS_LOCK; // Rocket
- #endif
- }
+}
#endif