X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fvehicles%2Fvehicle%2Fracer.qc;h=adffbfce002414ebbac5ab7bffea06cb5d5592d4;hb=HEAD;hp=b3cac72e5c8d8dddad0a0e72ae103ccf23d3fdf8;hpb=73295fdedbff00283c27cd8d96c1074606374e0f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/vehicles/vehicle/racer.qc b/qcsrc/common/vehicles/vehicle/racer.qc index b3cac72e5..adffbfce0 100644 --- a/qcsrc/common/vehicles/vehicle/racer.qc +++ b/qcsrc/common/vehicles/vehicle/racer.qc @@ -1,10 +1,13 @@ #include "racer.qh" +#if defined(SVQC) + #include + #include +#endif + #ifdef GAMEQC #ifdef SVQC -#include - bool autocvar_g_vehicle_racer = true; float autocvar_g_vehicle_racer_thinkrate = 0.05; // TODO: any higher causes it to sink in liquids @@ -78,6 +81,7 @@ float autocvar_g_vehicle_racer_bouncestop = 0; 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; @@ -111,7 +115,7 @@ void racer_align4point(entity this, entity player, float _delta) { 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; @@ -142,7 +146,7 @@ void racer_align4point(entity this, entity player, float _delta) 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) @@ -151,6 +155,7 @@ bool racer_frame(entity this, float dt) entity vehic = player.vehicle; return = true; +#ifdef SVQC if(game_stopped) { vehic.solid = SOLID_NOT; @@ -158,24 +163,29 @@ bool racer_frame(entity this, float dt) 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; @@ -199,17 +209,17 @@ bool racer_frame(entity this, float dt) 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 @@ -255,6 +265,8 @@ bool racer_frame(entity this, float dt) } #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); @@ -264,6 +276,7 @@ bool racer_frame(entity this, float dt) 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"); @@ -285,7 +298,7 @@ bool racer_frame(entity this, float dt) 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 @@ -322,7 +335,7 @@ bool racer_frame(entity this, float dt) } } - if(!weaponLocked(player)) + if (!weaponLocked(player) && !weaponUseForbidden(player)) if(time > vehic.delay) if(PHYS_INPUT_BUTTON_ATCK2(player)) { @@ -369,10 +382,14 @@ bool racer_frame(entity this, float dt) #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;