-MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
- // print("dodging_PlayerPhysics\n");
-
- float length;
- vector tap_direction = '0 0 0';
-
- float frozen_dodging, frozen_no_doubletap;
- frozen_dodging = (self.frozen && autocvar_sv_dodging_frozen);
- frozen_no_doubletap = (frozen_dodging && !autocvar_sv_dodging_frozen_doubletap);
-
- float dodge_detected;
- if (g_dodging == 0)
- return 0;
-
- dodge_detected = 0;
-
- // first check if the last dodge is far enough back in time so we can dodge again
- if ((time - self.last_dodging_time) < autocvar_sv_dodging_delay)
- return 0;
-
- if (check_close_to_ground(autocvar_sv_dodging_height_threshold) != 1
- && check_close_to_wall(autocvar_sv_dodging_wall_distance_threshold) != 1)
- return 0;
-
- if (self.movement.x > 0) {
- // is this a state change?
- if (!(self.pressedkeys & KEY_FORWARD) || frozen_no_doubletap) {
- if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) {
- tap_direction.x = 1.0;
- dodge_detected = 1;
- }
- self.last_FORWARD_KEY_time = time;
- }
- }
-
- if (self.movement.x < 0) {
- // is this a state change?
- if (!(self.pressedkeys & KEY_BACKWARD) || frozen_no_doubletap) {
- tap_direction.x = -1.0;
- if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout) {
- dodge_detected = 1;
- }
- self.last_BACKWARD_KEY_time = time;
- }
- }
-
- if (self.movement.y > 0) {
- // is this a state change?
- if (!(self.pressedkeys & KEY_RIGHT) || frozen_no_doubletap) {
- tap_direction.y = 1.0;
- if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout) {
- dodge_detected = 1;
- }
- self.last_RIGHT_KEY_time = time;
- }
- }
-
- if (self.movement.y < 0) {
- // is this a state change?
- if (!(self.pressedkeys & KEY_LEFT) || frozen_no_doubletap) {
- tap_direction.y = -1.0;
- if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout) {
- dodge_detected = 1;
- }
- self.last_LEFT_KEY_time = time;
- }
- }
-
- if (dodge_detected == 1) {
- self.last_dodging_time = time;
-
- self.dodging_action = 1;
- self.dodging_single_action = 1;
-
- self.dodging_velocity_gain = autocvar_sv_dodging_horiz_speed;
-
- self.dodging_direction_x = tap_direction.x;
- self.dodging_direction_y = tap_direction.y;
-
- // normalize the dodging_direction vector.. (unlike UT99) XD
- length = self.dodging_direction.x * self.dodging_direction.x;
- length = length + self.dodging_direction.y * self.dodging_direction.y;
- length = sqrt(length);
-
- self.dodging_direction_x = self.dodging_direction.x * 1.0/length;
- self.dodging_direction_y = self.dodging_direction.y * 1.0/length;
- }
-
- return 0;