X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fvehicles%2Fracer.qc;h=34302074d8172fa0a158bc3c8d0639eaac8dc3de;hb=d88aaf89d5bc44e3529b7317718825b6f02a505c;hp=6f40e0b4d05b6ca6aa7a2c4e69ec60f0ffcec4ce;hpb=81046f42baf4ec980a069a5e9ba88b1e5fc7f2c9;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc index 6f40e0b4d..34302074d 100644 --- a/qcsrc/server/vehicles/racer.qc +++ b/qcsrc/server/vehicles/racer.qc @@ -1,122 +1,106 @@ -#define RACER_MIN '-80 -80 -40' -#define RACER_MAX '80 80 40' -#define RACER_TICRATE 0.05 +#define RACER_MIN '-120 -120 -40' +#define RACER_MAX '120 120 40' +#define RACER_ENGINE "sound/vehicles/racer.wav" +#ifdef SVQC void racer_exit(float eject); void racer_enter(); -//void racer_think(); -float racer_power_air; -float racer_power_solid; -float racer_power_min; -float racer_anglestabilizer; -float racer_springlength; - -float racer_healthmax; -float racer_shieldmax; -float racer_energymax; - -float racer_pitchspeed; -float racer_turnspeed; -float racer_turnroll; -float racer_speed_forward; -float racer_speed_strafe; - -float racer_afterburn_cost; - -float jetfromtag_power; -float jetfromtag_normpower; -vector jetfromtag_origin; -float jetfromtag_groundcontact; - -void racer_loadsettings() -{ - racer_power_min = cvar("g_vehicle_racer_power_min") * 0.25; - racer_power_air = cvar("g_vehicle_racer_power_air") * 0.25; - racer_power_solid = cvar("g_vehicle_racer_power_solid") * 0.25; - - racer_springlength = cvar("g_vehicle_racer_springlength"); - racer_anglestabilizer = cvar("g_vehicle_racer_anglestabilizer"); - racer_pitchspeed = cvar("g_vehicle_racer_pitchspeed"); - racer_turnspeed = cvar("g_vehicle_racer_turnspeed"); - racer_turnroll = cvar("g_vehicle_racer_turnroll"); - racer_speed_forward = cvar("g_vehicle_racer_speed_forward"); - racer_speed_strafe = cvar("g_vehicle_racer_speed_strafe"); - - racer_afterburn_cost = cvar("g_vehicle_racer_afterburn_cost"); - - racer_healthmax = cvar("g_vehicle_racer_health"); - racer_shieldmax = cvar("g_vehicle_racer_shield"); - racer_energymax = cvar("g_vehicle_racer_energy"); - -} - -vector racer_jetfromtag(string tagname) -{ - vector force_dir; - float air_frac, solid_frac, air_pwr, solid_pwr; - - jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname)); - v_forward = normalize(v_forward) * -1; - - force_dir = jetfromtag_origin - (v_forward * racer_springlength); - traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self); - //te_lightning1(world,jetfromtag_origin, force_dir); - - //trace_fraction *= trace_fraction; - - solid_frac = 1 - trace_fraction; - air_frac = trace_fraction; - - if (trace_fraction != 1.0) - jetfromtag_groundcontact = 1; - - solid_pwr = solid_frac * racer_power_solid; - air_pwr = air_frac * racer_power_air; - - jetfromtag_power = solid_pwr + air_pwr; - jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid); - - //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min)); - //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min); - return v_forward * max(jetfromtag_power, racer_power_min); -} +// Auto cvars +float autocvar_g_vehicle_racer_speed_afterburn; +float autocvar_g_vehicle_racer_afterburn_cost; + +float autocvar_g_vehicle_racer_anglestabilizer; +float autocvar_g_vehicle_racer_downforce; + +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_hovertype; +float autocvar_g_vehicle_racer_hoverpower; + +float autocvar_g_vehicle_racer_turnroll; +float autocvar_g_vehicle_racer_turnspeed; +float autocvar_g_vehicle_racer_pitchspeed; + +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_health; +float autocvar_g_vehicle_racer_health_regen; +float autocvar_g_vehicle_racer_health_regen_pause; + +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_cannon_cost; +float autocvar_g_vehicle_racer_cannon_damage; +float autocvar_g_vehicle_racer_cannon_radius; +float autocvar_g_vehicle_racer_cannon_refire; +float autocvar_g_vehicle_racer_cannon_speed; +float autocvar_g_vehicle_racer_cannon_spread; +float autocvar_g_vehicle_racer_cannon_force; + +float autocvar_g_vehicle_racer_rocket_accel; +float autocvar_g_vehicle_racer_rocket_damage; +float autocvar_g_vehicle_racer_rocket_radius; +float autocvar_g_vehicle_racer_rocket_force; +float autocvar_g_vehicle_racer_rocket_refire; +float autocvar_g_vehicle_racer_rocket_speed; +float autocvar_g_vehicle_racer_rocket_turnrate; + +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; +float autocvar_g_vehicle_racer_rocket_locked_maxangle; + +float autocvar_g_vehicle_racer_respawntime; + +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; + +var vector racer_force_from_tag(string tag_name, float spring_length, float max_power); void racer_align4point() { - vector push_vector; + vector push_vector, v_add; float fl_push, fr_push, bl_push, br_push; - jetfromtag_groundcontact = 0; - push_vector = racer_jetfromtag("tag_engine_fr"); - fr_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); + push_vector = racer_force_from_tag("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, frametime, 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); + fl_push = force_fromtag_normpower; + //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, 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); + br_push = force_fromtag_normpower; + //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - push_vector += racer_jetfromtag("tag_engine_fl"); - fl_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); + push_vector += racer_force_from_tag("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, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - push_vector += racer_jetfromtag("tag_engine_br"); - br_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); + self.velocity += (push_vector * frametime); - push_vector += racer_jetfromtag("tag_engine_bl"); - bl_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); + // Anti ocilation + if(self.velocity_z > 0) + self.velocity_z *= 1 - (autocvar_g_vehicle_racer_upforcedamper * frametime); - self.velocity = self.velocity + (push_vector * frametime); - self.velocity_z -= sv_gravity * frametime; + self.velocity += v_add; + //self.velocity_z -= autocvar_sv_gravity * frametime; - push_vector_x = (fl_push - bl_push); + push_vector_x = (fl_push - bl_push); push_vector_x += (fr_push - br_push); push_vector_x *= 360; @@ -124,105 +108,42 @@ void racer_align4point() push_vector_z += (br_push - bl_push); push_vector_z *= 360; - //if (push_vector_z != 0) - if(self.angles_z > 0) - self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime)); - else - self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime)); - //else - self.angles_z += push_vector_z * frametime; - - //if (push_vector_x != 0) - if(self.angles_x > 0) - self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime)); - else - self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime)); - //else - self.angles_x += push_vector_x * frametime; -} + // Apply angle diffrance + self.angles_z += push_vector_z * frametime; + self.angles_x += push_vector_x * frametime; -void racer_bolt_explode() -{ - vector org2; - - org2 = findbetterlocation (self.origin, 8); - pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1); - RadiusDamage (self, self.realowner, cvar("g_vehicle_racer_laser_damage"), 0, cvar("g_vehicle_racer_laser_radius"), world, 150, DEATH_WAKIGUN, world); - sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - - remove (self); -} - -void racer_rocket_explode() -{ - vector org2; - - //if not(self.owner) - // self.owner = self.realowner; - - sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - org2 = findbetterlocation (self.origin, 16); - pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); - RadiusDamage (self, self.realowner ,cvar("g_vehicle_racer_rocket_damage"), 0, cvar("g_vehicle_racer_rocket_radius"), world, 150, DEATH_WAKIROCKET, world); - - remove (self); -} - -void racer_rocket_touch() -{ - if(other.owner == self.owner) - return; - - PROJECTILE_TOUCH; - /* - if(pointcontents(self.origin) == CONTENT_SKY) - { - self.think = SUB_Remove; - self.nextthink = time; - return; - } - */ - - racer_rocket_explode(); + // Apply stabilizer + self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime); + self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime); } void racer_fire_cannon(string tagname) { + vector v; entity bolt; - bolt = spawn(); - bolt.solid = SOLID_TRIGGER; - bolt.movetype = MOVETYPE_FLYMISSILE; - bolt.flags = FL_PROJECTILE | FL_NOTARGET; - bolt.owner = self; - bolt.realowner = self.owner; - bolt.touch = racer_bolt_explode; - bolt.think = racer_bolt_explode; - bolt.nextthink = time + 9; - bolt.bot_dodge = TRUE; - bolt.bot_dodgerating = cvar("g_vehicle_racer_laser_damage"); - setorigin(bolt, gettaginfo(self,gettagindex(self,tagname))); + v = gettaginfo(self, gettagindex(self, tagname)); + bolt = vehicles_projectile("wakizashi_gun_muzzleflash", "weapons/lasergun_fire.wav", + v, 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_WAKIGUN, PROJECTILE_WAKICANNON, 0, TRUE, TRUE); - vector v; - // FIXME this uses prydon cursor - v = normalize(self.owner.cursor_trace_endpos - bolt.origin); + // Fix z-aim (for chase mode) + v = normalize(trace_endpos - bolt.origin); v_forward_z = v_z * 0.5; - - bolt.velocity = v_forward * cvar("g_vehicle_racer_laser_speed"); - - CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE); + bolt.velocity = v_forward * autocvar_g_vehicle_racer_cannon_speed; } void racer_rocket_groundhugger() { - vector newdir,olddir; - float oldspeed, newspeed; + vector olddir, newdir; + float oldvel, newvel; self.nextthink = time; - if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time)) + if(self.owner.deadflag != DEAD_NO || self.cnt < time) { - racer_rocket_explode(); + self.use(); return; } @@ -232,35 +153,45 @@ void racer_rocket_groundhugger() return; } - olddir = normalize(self.velocity); - oldspeed = vlen(self.velocity); + olddir = normalize(self.velocity); + oldvel = vlen(self.velocity); + newvel = oldvel + self.lip; - tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self); - if(trace_fraction >= 0.35) + tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self); + if(trace_fraction <= 0.5) { - traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self); - if(trace_fraction != 1.0) - newdir = trace_endpos + '0 0 32'; - - newdir = normalize(newdir - self.origin); + // Hitting somethign soon, just speed ahead + self.velocity = olddir * newvel; + UpdateCSQCProjectile(self); + return; } - newspeed = oldspeed + self.lip; - self.velocity = normalize(olddir + newdir * self.wait) * newspeed; + traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self); + 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; + } + else + { + self.velocity = olddir * newvel; + self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one + } UpdateCSQCProjectile(self); + return; } -void racer_rocket_think() +void racer_rocket_tracker() { - vector newdir,olddir, eorg, edir; - float oldspeed, newspeed, dist; + vector olddir, newdir; + float oldvel, newvel; self.nextthink = time; - if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time)) + if (self.owner.deadflag != DEAD_NO || self.cnt < time) { - racer_rocket_explode(); + self.use(); return; } @@ -271,111 +202,82 @@ void racer_rocket_think() } olddir = normalize(self.velocity); - oldspeed = vlen(self.velocity); - fixedmakevectors(olddir); - eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax); - edir = normalize(eorg - self.origin); - dist = vlen(self.origin - self.enemy.origin); + oldvel = vlen(self.velocity); + newvel = oldvel + self.lip; + makevectors(vectoangles(olddir)); - if(dist > 512) + traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self); + newdir = normalize(self.enemy.origin - self.origin); + + if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle) { - vector ddir; - float p; - p = dist / self.delay; - p = max(0.05, p * 0.25); - ddir = steerlib_traceavoid(p, oldspeed * 0.25); - edir += ddir * 0.95; + //bprint("Target lost!\n"); + //dprint("OF:", ftos(vlen(newdir - v_forward)), "\n"); + self.think = racer_rocket_groundhugger; + return; } - newdir = normalize(olddir + edir * self.wait); - newspeed = oldspeed + self.lip; - self.velocity = normalize(olddir + newdir * self.wait) * newspeed; + if(trace_fraction != 1.0) + newdir_z += 16 * sys_frametime; + + self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel; + self.velocity_z -= 800 * sys_frametime; UpdateCSQCProjectile(self); + return; } -void racer_fire_rocket(string tagname) +void racer_fire_rocket(string tagname, entity trg) { + vector v; entity rocket; - rocket = spawn(); - setsize (rocket, '-1 -1 -1', '1 1 1'); - rocket.lip = cvar("g_vehicle_racer_rocket_accel") * sys_frametime; - rocket.wait = cvar("g_vehicle_racer_rocket_turnrate"); - rocket.solid = SOLID_BBOX; - rocket.movetype = MOVETYPE_FLYMISSILE; - rocket.flags = FL_PROJECTILE; - rocket.owner = self; - rocket.realowner = self.owner; - rocket.touch = racer_rocket_touch; - rocket.bot_dodge = TRUE; - rocket.bot_dodgerating = cvar("g_vehicle_racer_rocket_damage"); - setorigin(rocket, gettaginfo(self,gettagindex(self,tagname))); + v = gettaginfo(self, gettagindex(self, tagname)); + rocket = vehicles_projectile("wakizashi_rocket_launch", "weapons/rocket_fire.wav", + v, v_forward * 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_WAKIROCKET, PROJECTILE_WAKIROCKET, 20, FALSE, FALSE); - /* - if( (self.tur_head.gun1) && (self.tur_head.cnt > time)) - rocket.enemy = self.tur_head.gun1; + rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime; + rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate; + rocket.nextthink = time; + rocket.enemy = trg; + rocket.cnt = time + 15; - if(rocket.enemy) - { - rocket.delay = vlen(rocket.enemy.origin - rocket.origin); - rocket.cnt = time + 9; - rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed"); - rocket.think = racer_rocket_think; - rocket.nextthink = time; - CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound - } + if(trg) + rocket.think = racer_rocket_tracker; else - { - */ - rocket.cnt = time + 9; - rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed"); - rocket.think = racer_rocket_groundhugger; - rocket.nextthink = time; - CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE); - //} + rocket.think = racer_rocket_groundhugger; } -float racer_customizeentityforclient() -{ - - if(self.deadflag == DEAD_DEAD) - return FALSE; - - /* - if(other == self.owner) - self.alpha = -1; - else - self.alpha = 1; - */ - - return TRUE; -} - -float racer_pplug() +float racer_frame() { entity player, racer; - float ftmp, ftmp2; vector df; - - if(cvar("g_vehicle_racer_reload")) - { - racer_loadsettings(); - cvar_set("g_vehicle_racer_reload","0"); - } + float ftmp; player = self; racer = self.vehicle; - player.BUTTON_ZOOM = 0; - player.BUTTON_CROUCH = 0; + player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0; self = racer; + +#ifdef VEHICLES_CSQC + racer.SendFlags |= VSF_MOVEMENT; + + // Send a origin update every 10'th serevr frame. + racer.framecounter += 1; + if(racer.framecounter >= 600) + { + racer.SendFlags |= VSF_ORIGIN; + racer.framecounter = 0; + } +#endif if(player.BUTTON_USE) { - self = racer; - racer_exit(0); + vehicles_exit(VHEF_NORMAL); self = player; return 0; } @@ -387,90 +289,137 @@ float racer_pplug() return 1; } - racer_align4point(); - racer.angles_x *= -1; - makevectors(racer.angles); + crosshair_trace(player); - // Rotate Body - ftmp = racer_turnspeed * sys_frametime; +#if VEHICLES_VIEWROTATE_CROSSHAIR + float ftmp2; + racer.angles_x *= -1; + df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32')); + if(df_x > 180) df_x -= 360; + if(df_x < -180) df_x += 360; + if(df_y > 180) df_y -= 360; + if(df_y < -180) df_y += 360; + + // Yaw + ftmp = autocvar_g_vehicle_racer_turnspeed * frametime; ftmp2 = ftmp * -1; - ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp); + ftmp = bound(ftmp2, shortangle_f(df_y - racer.angles_y, racer.angles_y), ftmp); ftmp2 = anglemods(racer.angles_y + ftmp); // Roll - ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45); - ftmp = anglemods(racer.angles_z + ftmp); - racer.angles_z = bound(-85, ftmp, 85); + ftmp = bound(-45, shortangle_f(df_z + ((racer.angles_y - ftmp2) * autocvar_g_vehicle_racer_turnroll), racer.angles_z), 45); + ftmp = anglemods(racer.angles_z + ftmp) * frametime; + racer.angles_z = bound(-65, racer.angles_z + ftmp, 65); // Turn racer.angles_y = ftmp2; - // Pitch Body - ftmp = racer_pitchspeed * sys_frametime; + // Pitch + ftmp = autocvar_g_vehicle_racer_pitchspeed * frametime; ftmp2 = ftmp * -1; - ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp); + ftmp = bound(ftmp2, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp); racer.angles_x = anglemods(racer.angles_x + ftmp); + + makevectors(racer.angles); racer.angles_x *= -1; +#else + racer.angles_x *= -1; + + // Yaw + ftmp = autocvar_g_vehicle_racer_turnspeed * frametime; + ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp); + racer.angles_y = anglemods(racer.angles_y + ftmp); + + // Roll + racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * frametime; + + // Pitch + ftmp = autocvar_g_vehicle_racer_pitchspeed * frametime; + ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp); + racer.angles_x = bound(-30, anglemods(racer.angles_x + ftmp), 30); + + makevectors(racer.angles); + racer.angles_x *= -1; +#endif - df = racer.velocity * -0.5; + ftmp = racer.velocity_z; + df = racer.velocity * -autocvar_g_vehicle_racer_friction; + racer.velocity_z = ftmp; if(player.movement_x != 0) { if(player.movement_x > 0) - df += v_forward * racer_speed_forward; + df += v_forward * autocvar_g_vehicle_racer_speed_forward; else if(player.movement_x < 0) - df -= v_forward * racer_speed_forward; + df -= v_forward * autocvar_g_vehicle_racer_speed_forward; } if(player.movement_y != 0) { if(player.movement_y < 0) - df -= v_right * racer_speed_strafe; + df -= v_right * autocvar_g_vehicle_racer_speed_strafe; else if(player.movement_y > 0) - df += v_right * racer_speed_strafe; + df += v_right * autocvar_g_vehicle_racer_speed_strafe; } - - // limit _z to avoid flying on normal thrust - if(df_z > 0) - df_z = min(df_z,700); - - + + if(vlen(player.movement) != 0) + { + if(self.sound_nexttime < time || self.sounds != 1) + { + self.sounds = 1; + self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav"); + sound (self, CHAN_VOICE, "vehicles/racer_move.wav", VOL_BASE, ATTN_NORM); + } + } + else + { + if(self.sound_nexttime < time || self.sounds != 0) + { + self.sounds = 0; + self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav"); + sound (self, CHAN_VOICE, "vehicles/racer_idle.wav", VOL_BASE, ATTN_NORM); + } + } + // Afterburn - if (player.BUTTON_JUMP) - if(racer.vehicle_energy >= (racer_afterburn_cost * frametime)) + if (player.BUTTON_JUMP && racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * frametime)) { - racer.wait = time + cvar("g_vehicle_racer_energy_usepause"); - racer.vehicle_energy -= racer_afterburn_cost * frametime; - df += (v_forward * cvar("g_vehicle_racer_speed_afterburn")); + racer.wait = time; + racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime; + df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn); + + if(self.strength_finished < time) + { + //self.sounds = 2; + self.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav"); + sound (self, CHAN_PLAYER, "vehicles/racer_boost.wav", VOL_BASE, ATTN_NORM); + } } + else + { + self.strength_finished = 0; + sound (self, CHAN_PLAYER, "misc/null.wav", VOL_BASE, ATTN_NORM); + } + racer.velocity += df * frametime; - df = (vlen(racer.velocity) * cvar("g_vehicle_racer_downforce") * v_up) * frametime; + df = (vlen(racer.velocity) * autocvar_g_vehicle_racer_downforce * v_up) * frametime; racer.velocity = racer.velocity - df; player.movement = racer.velocity; - /* - // for homing rockets - // FIXME this uses prydon cursor - if(self.owner.cursor_trace_ent) - { - self.tur_head.gun1 = self.owner.cursor_trace_ent; - self.tur_head.cnt = time + 1; - } - */ - if(player.BUTTON_ATCK) if(time > racer.attack_finished_single) - if(racer.vehicle_energy >= cvar("g_vehicle_racer_laser_cost")) + if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost) { - racer.vehicle_energy -= cvar("g_vehicle_racer_laser_cost"); - racer.wait = time + cvar("g_vehicle_racer_energy_usepause"); + racer.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost; + racer.wait = time; + crosshair_trace(player); if(racer.cnt) { racer_fire_cannon("tag_fire1"); @@ -481,306 +430,204 @@ float racer_pplug() racer_fire_cannon("tag_fire2"); racer.cnt = 1; } - racer.attack_finished_single = time + cvar("g_vehicle_racer_laser_refire"); + racer.attack_finished_single = time + autocvar_g_vehicle_racer_cannon_refire; + //self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy; } - if(player.BUTTON_ATCK2) - if(time > racer.delay) + if(autocvar_g_vehicle_racer_rocket_locktarget) { - racer_fire_rocket("tag_rocket_r"); - racer_fire_rocket("tag_rocket_l"); - racer.delay = time + cvar("g_vehicle_racer_rocket_refire"); - racer.lip = time; + vehicles_locktarget((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(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); + } } - player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip); - vehicle_stdproc_shiledregen(racer_shieldmax, frametime); - vehicle_stdproc_healthregen(racer_healthmax, frametime); - - if (racer.wait < time) - vehicle_stdproc_energyregen(racer_energymax, frametime); - else - player.vehicle_energy = (racer.vehicle_energy / racer_energymax); - - self = player; + if(time > racer.delay) + if(player.BUTTON_ATCK2) + { + self.misc_bulletcounter += 1; + racer.delay = time + 0.2; + if(self.misc_bulletcounter == 1) + racer_fire_rocket("tag_rocket_r", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world); + else if(self.misc_bulletcounter == 2) + { + racer_fire_rocket("tag_rocket_l", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world); + self.lock_strength = 0; + self.lock_target = world; + self.misc_bulletcounter = 0; - player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; - setorigin(player,racer.origin + '0 0 32'); - player.velocity = racer.velocity; + racer.delay = time + autocvar_g_vehicle_racer_rocket_refire; + racer.lip = time; + } + } + player.vehicle_reload1 = bound(0, 100 * ((time - racer.lip) / (racer.delay - racer.lip)), 100); - return 1; -} + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime); -void racer_exitthink() -{ - float a, b, c; + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime); - self.nextthink = time; + if(self.vehicle_flags & VHF_ENERGYREGEN) + vehicles_regen(wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime); - a = racer_anglestabilizer; - b = racer_springlength; - c = racer_power_solid; - racer_anglestabilizer = 36; - racer_springlength = 96; - racer_power_solid = 300; + VEHICLE_UPDATE_PLAYER(health, racer); + VEHICLE_UPDATE_PLAYER(energy, racer); - racer_align4point(); + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, racer); - if(self.velocity_z < 0) - self.velocity_z *= 0.95; - racer_anglestabilizer = a; - racer_springlength = b; - racer_power_solid = c; + player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; + setorigin(player,racer.origin + '0 0 32'); + player.velocity = racer.velocity; - self.velocity_x *= 0.95; - self.velocity_y *= 0.95; + self = player; + return 1; } -void racer_spawnthink() +void racer_think() { - float a, b, c; - vector dorg; - - self.nextthink = time; - - a = racer_anglestabilizer; - b = racer_springlength; - c = racer_power_solid; - - racer_anglestabilizer = 36; - racer_springlength = 96; - racer_power_solid = 300; - - // self.velocity_z += sin(time * 128) * 4; - - racer_align4point(); + /* + float a, b, c;a = autocvar_g_vehicle_racer_anglestabilizer; + b = autocvar_g_vehicle_racer_springlength; + c = autocvar_g_vehicle_racer_hoverpower; - if(self.velocity_z < 0) - self.velocity_z *= 0.98; + autocvar_g_vehicle_racer_anglestabilizer = 36; + autocvar_g_vehicle_racer_springlength = 96; + autocvar_g_vehicle_racer_hoverpower = 300; + */ - racer_anglestabilizer = a; - racer_springlength = b; - racer_power_solid = c; + racer_align4point(); //time - self.nextthink); +#ifdef VEHICLES_CSQC + self.SendFlags |= VSF_MOVEMENT; - self.velocity_x *= 0.95; - self.velocity_y *= 0.95; + // Send a origin update every 10'th serevr frame. + self.framecounter += 1; + if(self.framecounter >= 10) + { + self.SendFlags |= VSF_ORIGIN; + self.framecounter = 0; + } +#endif + /* + //if(self.velocity_z > 0) + // self.velocity_z *= 0.95; - dorg = self.pos1 - self.origin ; + autocvar_g_vehicle_racer_anglestabilizer = a; + autocvar_g_vehicle_racer_springlength = b; + autocvar_g_vehicle_racer_hoverpower = c; + */ - self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32); - self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32); + self.velocity_x *= 0.9; + self.velocity_y *= 0.9; + self.velocity_z *= 0.8; + self.velocity_z += sin(time * 2) * 16; + self.nextthink = time; // + 0.05; } void racer_enter() { - self.owner = other; - - - self.nextthink = 0; - self.flags = 0; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - self.colormap = self.owner.colormap; - - self.owner.PlayerPhysplug = racer_pplug; - self.owner.takedamage = DAMAGE_NO; - self.owner.event_damage = SUB_Null; - self.owner.vehicle = self; - self.owner.angles = self.angles; - self.owner.solid = SOLID_NOT; - self.owner.movetype = MOVETYPE_NOCLIP; - self.owner.alpha = -1; - self.owner.hud = HUD_WAKIZASHI; - self.owner.effects |= EF_NODRAW; - self.owner.view_ofs = '0 0 0'; - - self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_racer_health")); - self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_racer_shield")); - - setorigin(other,self.origin + '0 0 32'); - other.velocity = self.velocity; - - other.flags &~= FL_ONGROUND; - msg_entity = other; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.vehicle_viewport); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, self.angles_x * -1); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll -} - -void racer_spawn(); -void racer_return() -{ - pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); - self.enemy.think = racer_spawn; - self.enemy.nextthink = time; - remove(self); + self.movetype = MOVETYPE_BOUNCE; + self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health); + self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield); +#ifdef VEHICLES_CSQC + if(self.SendEntity) + self.SendFlags |= VSF_SETUP; +#endif } void racer_exit(float eject) { - self.colormap = 1024; - self.flags = FL_NOTARGET; + vector spot; + + self.think = racer_think; + self.nextthink = time; + self.movetype = MOVETYPE_TOSS; if not (self.owner) return; - msg_entity = self.owner; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.owner); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll - - if (self.deadflag == DEAD_NO) - { - self.think = racer_exitthink; - self.nextthink = time; - } - - self.owner.takedamage = DAMAGE_AIM; - self.owner.solid = SOLID_SLIDEBOX; - self.owner.movetype = MOVETYPE_WALK; - - setsize(self.owner,PL_MIN,PL_MAX); - - self.owner.effects &~= EF_NODRAW; - self.owner.alpha = 1; - self.owner.PlayerPhysplug = SUB_Null; - self.owner.vehicle = world; - self.owner.view_ofs = PL_VIEW_OFS; - self.owner.event_damage = PlayerDamage; - self.owner.hud = HUD_NORMAL; - - self.vehicle_hudmodel.viewmodelforclient = self; - + makevectors(self.angles); if(eject) { - makevectors(self.angles); - setorigin(self.owner,self.origin + v_forward * 100); + spot = self.origin + v_forward * 100 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else { - self.owner.velocity = (v_forward) * -150; - setorigin(self.owner,self.origin - v_forward * 128); + spot = self.origin - v_forward * 200 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); } - + self.owner = world; - - if (self.deadflag != DEAD_NO) - { - entity ret; - ret = spawn(); - ret.enemy = self; - ret.think = racer_return; - ret.nextthink = time + cvar("g_vehicle_racer_respawntime"); - } -} - -void racer_touch() -{ - if(self.owner) - { - if(vlen(self.velocity) == 0) - return; - - if(other.classname != "player") - return; - - vector a; - a = normalize(other.origin - self.origin); - a = a - normalize(self.velocity); - - return; - } - - if(other.classname != "player") - return; - - if(other.deadflag != DEAD_NO) - return; - - if(other.vehicle != world) - return; - - racer_enter(); } void racer_spawn() { - self.think = racer_spawnthink; - self.nextthink = time; - - self.flags = FL_NOTARGET; - self.effects = 0; - - self.vehicle_health = racer_healthmax; - self.vehicle_shield = racer_shieldmax; - - self.event_damage = vehicle_stdproc_damage; - self.touch = racer_touch; - - self.iscreature = TRUE; - self.scale = 0.5; - self.movetype = MOVETYPE_FLY; - self.solid = SOLID_SLIDEBOX; - self.takedamage = DAMAGE_AIM; - - self.alpha = 1; - self.colormap = 1024; - self.deadflag = DEAD_NO; - self.bot_attack = TRUE; - - self.vehicle_energy = 1; - self.vehicle_hudmodel.viewmodelforclient = self; + self.think = racer_think; + self.nextthink = time; + self.vehicle_health = autocvar_g_vehicle_racer_health; + self.vehicle_shield = autocvar_g_vehicle_racer_shield; - setorigin(self, self.pos1); - self.angles = self.pos2; + self.movetype = MOVETYPE_TOSS; + self.solid = SOLID_SLIDEBOX; + self.delay = time; + self.scale = 0.5; - setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5); - pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1); - self.delay = time; + setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5); } void racer_blowup() { - sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + pointparticles(particleeffectnum("explosion_big"), self.origin, '0 0 0', 1); self.deadflag = DEAD_DEAD; self.vehicle_exit(VHEF_NORMAL); - RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world); + + RadiusDamage (self, self, autocvar_g_vehicle_racer_blowup_coredamage, + autocvar_g_vehicle_racer_blowup_edgedamage, + autocvar_g_vehicle_racer_blowup_radius, world, + autocvar_g_vehicle_racer_blowup_forceintensity, + DEATH_WAKIBLOWUP, world); self.alpha = -1; - self.nextthink = time + cvar("g_vehicle_racer_respawntime"); + self.nextthink = time + autocvar_g_vehicle_racer_respawntime; self.think = racer_spawn; self.movetype = MOVETYPE_NONE; self.effects = EF_NODRAW; - self.avelocity_z = 0; - self.colormod = '0 0 0'; + self.colormod = '0 0 0'; + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; - setorigin(self,self.pos1); + setorigin(self, self.pos1); + self.think = racer_spawn; + self.nextthink = time + autocvar_g_vehicle_racer_respawntime; } -void racer_dietouch() +void racer_deadtouch() { - if(self.wait > time) - return; - - self.wait = time + 0.75; - - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + dprint("Boink!\n"); + self.avelocity_x *= 0.7; + self.cnt -= 1; + if(self.cnt <= 0) + racer_blowup(); } void racer_die() @@ -788,111 +635,174 @@ void racer_die() self.health = 0; self.event_damage = SUB_Null; self.iscreature = FALSE; - self.solid = SOLID_NOT; + self.solid = SOLID_CORPSE; self.takedamage = DAMAGE_NO; - self.touch = racer_dietouch; self.deadflag = DEAD_DYING; self.movetype = MOVETYPE_BOUNCE; - self.wait = time; - - pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); - - self.velocity += '0 0 128'; + self.wait = time; + self.cnt = 1 + random() * 2; + self.touch = racer_deadtouch; + + pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1); if(random() < 0.5) - self.avelocity_z = 16; + self.avelocity_z = 32; else - self.avelocity_z = -16; + self.avelocity_z = -32; - self.colormod = '-0.5 -0.5 -0.5'; + 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; - self.nextthink = time + 3; + self.nextthink = 2 + time + random() * 3; +} + +#ifdef VEHICLES_CSQC +void racer_send_exta(entity to) +{ + } +#endif void racer_dinit() { + if not (vehicle_initialize( + "Wakizashi", + "models/vehicles/wakizashi.dpm", + "", + "models/vehicles/wakizashi_cockpit.dpm", + "", "", "tag_viewport", + HUD_WAKIZASHI, + 0.5 * RACER_MIN, 0.5 * RACER_MAX, + FALSE, + racer_spawn, autocvar_g_vehicle_racer_respawntime, + racer_frame, + racer_enter, racer_exit, + racer_die, racer_think, + TRUE)) + { + remove(self); + return; + } +#ifdef VEHICLES_CSQC + self.vehile_send_exta = racer_send_exta; +#endif + if(autocvar_g_vehicle_racer_hovertype != 0) + racer_force_from_tag = vehicles_force_fromtag_maglev; + else + racer_force_from_tag = vehicles_force_fromtag_hover; - tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self); - setorigin(self,trace_endpos); + // 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"); - if (self.netname == "") - self.netname = "Race PoD"; + self.mass = 900; +} + +void spawnfunc_vehicle_racer() +{ - self.cvar_basename = "g_vehicle_racer"; + precache_sound ("weapons/laserimpact.wav"); + precache_sound ("weapons/lasergun_fire.wav"); + precache_sound ("weapons/rocket_fire.wav"); + precache_sound ("weapons/rocket_impact.wav"); + + precache_sound ("vehicles/racer_idle.wav"); + precache_sound ("vehicles/racer_move.wav"); + precache_sound ("vehicles/racer_boost.wav"); - self.vehicle_viewport = spawn(); - self.vehicle_hudmodel = spawn(); - //self.ccamera = spawn(); + precache_model ("models/vhshield.md3"); + precache_model ("models/vehicles/wakizashi.dpm"); + precache_model ("models/vehicles/wakizashi_cockpit.dpm"); - setorigin(self, self.origin); + vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health); + if(autocvar_g_vehicle_racer_energy) + if(autocvar_g_vehicle_racer_energy_regen) + self.vehicle_flags |= VHF_ENERGYREGEN; - setmodel(self,"models/vehicles/wakizashi.dpm"); - setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm"); - setmodel (self.vehicle_viewport, "null"); + if(autocvar_g_vehicle_racer_shield) + self.vehicle_flags |= VHF_HASSHIELD; - setattachment(self.vehicle_hudmodel, self, ""); - setattachment(self.vehicle_viewport, self, "tag_viewport"); + if(autocvar_g_vehicle_racer_shield_regen) + self.vehicle_flags |= VHF_SHIELDREGEN; - self.vehicle_hudmodel.viewmodelforclient = self; - self.customizeentityforclient = racer_customizeentityforclient; + if(autocvar_g_vehicle_racer_health_regen) + self.vehicle_flags |= VHF_HEALTHREGEN; - self.tur_head = spawn(); + self.think = racer_dinit; + self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5); +} - self.pos1 = self.origin; - self.pos2 = self.angles; - self.angles = '0 0 0'; - self.angles = self.pos1; +#endif // SVQC - self.vehicle_die = racer_die; - self.vehicle_exit = racer_exit; +#ifdef CSQC +#ifdef VEHICLES_CSQC +void racer_draw() +{ + /*float dt; - addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); + dt = time - self.lastupdate; + self.lastupdate = time; + if(dt < 0) + return; + */ + //self.origin += dt * self.velocity; + //self.origin_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY); + //setorigin(self, self.origin); - addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); + if(vehicle_hudmodel.owner == self) + { + setorigin(vehicle_hudmodel, self.origin); + vehicle_hudmodel.angles = self.angles; + } - addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); - racer_spawn(); } -void spawnfunc_vehicle_racer() +void racer_draw2d() { - g_turrets_common_precash(); - racer_loadsettings(); - self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN; +} - /* - traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid) - { - dprint("WARNING: vehicle_racer placed in solid\n"); - traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid || trace_fraction == 1.0) - { - dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n"); - remove(self); - return; - } - } - */ +void racer_read_extra() +{ - if(trace_fraction != 1.0) - setorigin(self,trace_endpos + '0 0 128'); - else - dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n"); +} - precache_model ("models/vehicles/wakizashi.dpm"); - precache_model ("models/vehicles/wakizashi_cockpit.dpm"); - precache_model ("maps/bspmodel.bsp"); +entity racer_hud; +entity racer_vp; +void racer_hud_draw() +{ +} - self.think = racer_dinit; - self.nextthink = time + 1; +void vehicle_racer_assemble() +{ + setmodel(self, "models/vehicles/wakizashi.dpm"); + self.scale = 0.5; + self.movetype = MOVETYPE_BOUNCE; + + //self.entremove = VehicleRacerRemove; + setsize(self, '-60 -60 -20', '60 60 20'); + self.draw = racer_draw; + self.drawmask = MASK_NORMAL; + self.solid = SOLID_BBOX; + self.lastupdate = time; + self.vehile_read_exta = racer_read_extra; + + if(racer_hud == world) + { + dprint("SpawnHUUUOOOUUUDDD\n"); + racer_hud = spawn(); + setmodel(racer_hud, "models/vehicles/wakizashi_cockpit.dpm"); + racer_hud.drawmask = MASK_NORMAL; + racer_hud.renderflags = RF_VIEWMODEL; + racer_hud.scale = 0.5; + } + vehicle_hudmodel = racer_hud; // FIXME!! + racer_hud.draw = racer_hud_draw; } +#endif +#endif //CSQC