X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator_dodging.qc;h=12bb7e600fc9bcf611f7a0d342ad5481aed3b29f;hb=2c2a6c64265405e5f461f3848d1f3a47feee0641;hp=4b1660b6707421b0fc708ee75d04ecb95efb45a7;hpb=f98880536b885ff5e31321bedf58be3c9014c3b7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc index 4b1660b67..12bb7e600 100644 --- a/qcsrc/server/mutators/mutator_dodging.qc +++ b/qcsrc/server/mutators/mutator_dodging.qc @@ -1,4 +1,7 @@ +.float cvar_cl_dodging_timeout; + + // these are used to store the last key press time for each of the keys.. .float last_FORWARD_KEY_time; .float last_BACKWARD_KEY_time; @@ -20,6 +23,8 @@ .float dodging_single_action; void dodging_Initialize() { + // print("dodging_Initialize\n"); + self.last_FORWARD_KEY_time = 0; self.last_BACKWARD_KEY_time = 0; self.last_RIGHT_KEY_time = 0; @@ -31,7 +36,14 @@ void dodging_Initialize() { self.dodging_direction_y = 0; } +MUTATOR_HOOKFUNCTION(dodging_GetCvars) { + GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout"); + return 0; +} + MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { + // print("dodging_PlayerPhysics\n"); + float common_factor; // is dodging enabled at all? if not, do nothing.. @@ -53,6 +65,9 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { // ramp up dodging speed by adding some velocity each frame.. TODO: do it! :D if (self.dodging_action == 1) { + //disable jump key during dodge accel phase + if (self.movement_z > 0) self.movement_z = 0; + self.velocity = self.velocity + (common_factor * (self.dodging_direction_y * cvar("sv_dodging_horiz_speed")) * v_right) @@ -65,6 +80,11 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { self.velocity + (cvar("sv_dodging_up_speed") * v_up); + if (cvar("sv_dodging_sound") == 1) + PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND); + + setanim(self, self.anim_jump, TRUE, FALSE, TRUE); + self.dodging_single_action = 0; } @@ -80,24 +100,79 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { return 0; } + +// returns 1 if the player is close to a wall +float check_close_to_wall(float threshold) { + if (cvar("sv_dodging_wall_dodging") == 0) + return 0; + + vector trace_start; + vector trace_end; + + trace_start = self.origin; + + trace_end = self.origin + (1000*v_right); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin - (1000*v_right); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin + (1000*v_forward); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin - (1000*v_forward); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + return 0; +} + MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { + // print("dodging_PlayerPhysics\n"); + float length; float dodge_detected; - //print("dodging_hook\n"); + vector trace_start; + vector trace_end; + float height_above_ground; if (g_dodging == 0) return 0; dodge_detected = 0; + // no dodging and jumping at the same time.. + if (self.BUTTON_JUMP) + return 0; + // first check if the last dodge is far enough back in time so we can dodge again if ((time - self.last_dodging_time) < cvar("sv_dodging_delay")) return 0; - // check if our feet are on the ground :D - if (!(self.lastflags & FL_ONGROUND)) + // determine height above ground is below a threshold + trace_start = self.origin; + trace_end = self.origin - (1000*v_up); + + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + + // check if the trace hit anything at all + if (trace_fraction > 1) return 0; + height_above_ground = self.origin_z - trace_endpos_z; + + // check if our feet are on the ground or at least close or we are + // near a wall,,, + if ((height_above_ground > (fabs(PL_MIN_z) + cvar("sv_dodging_height_threshold"))) + && (check_close_to_wall(cvar("sv_dodging_wall_distance_threshold")) != 1)) + return 0; if (self.movement_x > 0) { // is this a state change? @@ -105,7 +180,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; self.dodging_direction_x = 1.0; - self.last_dodging_time = time; } self.last_FORWARD_KEY_time = time; } @@ -117,7 +191,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; self.dodging_direction_x = -1.0; - self.last_dodging_time = time; } self.last_BACKWARD_KEY_time = time; } @@ -129,7 +202,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; self.dodging_direction_y = 1.0; - self.last_dodging_time = time; } self.last_RIGHT_KEY_time = time; } @@ -141,7 +213,6 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout) { dodge_detected = 1; self.dodging_direction_y = -1.0; - self.last_dodging_time = time; } self.last_LEFT_KEY_time = time; } @@ -150,6 +221,11 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) { if (dodge_detected == 1) { + if (self.movement_z > 0) + self.movement_z = 0; + + self.last_dodging_time = time; + self.dodging_action = 1; self.dodging_single_action = 1; @@ -174,6 +250,9 @@ MUTATOR_DEFINITION(dodging) // in the physics hook we actually implement the dodge.. MUTATOR_HOOK(PlayerPhysics, dodging_PlayerPhysics, CBC_ORDER_ANY); + // get timeout information from the client, so the client can configure it.. + MUTATOR_HOOK(GetCvars, dodging_GetCvars, CBC_ORDER_ANY); + // this just turns on the cvar. MUTATOR_ONADD { @@ -188,4 +267,4 @@ MUTATOR_DEFINITION(dodging) } return 0; -} \ No newline at end of file +}