]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_dodging.qc
Hook: merge offhand and weapon behaviour
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_dodging.qc
index 2bd794f1b3b29d49c46788665326a58509430102..b5dc32fdfe0d924a233b099ab47f802eaceba6e3 100644 (file)
@@ -1,5 +1,5 @@
 #ifdef CSQC
-       #define PHYS_DODGING_FRAMETIME                          (1 / frametime <= 0 ? 60 : frametime)
+       #define PHYS_DODGING_FRAMETIME                          (1 / (frametime <= 0 ? 60 : frametime))
        #define PHYS_DODGING                                            getstati(STAT_DODGING)
        #define PHYS_DODGING_DELAY                                      getstatf(STAT_DODGING_DELAY)
        #define PHYS_DODGING_TIMEOUT(s)                         getstatf(STAT_DODGING_TIMEOUT)
 #endif
 
 #ifdef SVQC
+#include "mutator_dodging.qh"
+#include "../_all.qh"
+
+#include "mutator.qh"
+
+#include "../../common/animdecide.qh"
 
 .float cvar_cl_dodging_timeout;
 
@@ -60,8 +66,7 @@
 .float last_RIGHT_KEY_time;
 
 // these store the movement direction at the time of the dodge action happening.
-.float dodging_direction_x;
-.float dodging_direction_y;
+.vector dodging_direction;
 
 // this indicates the last time a dodge was executed. used to check if another one is allowed
 // and to ramp up the dodge acceleration in the physics hook.
 .float dodging_velocity_gain;
 
 #ifdef CSQC
-.float pressedkeys;
+.int pressedkeys;
 
 #elif defined(SVQC)
 
 void dodging_UpdateStats()
-{
+{SELFPARAM();
        self.stat_dodging = PHYS_DODGING;
        self.stat_dodging_delay = PHYS_DODGING_DELAY;
        self.stat_dodging_horiz_speed_frozen = PHYS_DODGING_HORIZ_SPEED_FROZEN;
@@ -107,72 +112,55 @@ void dodging_Initialize()
        addstat(STAT_DODGING_WALL, AS_FLOAT, stat_dodging_wall);
 }
 
-#endif
-#ifdef CSQC
-// instantly updates pressed keys, for use with dodging (may be out of date, but we can't care)
-void PM_dodging_updatepressedkeys()
-{
-       #define X(var,bit,flag) (flag ? var |= bit : var &= ~bit)
-       X(self.pressedkeys, KEY_FORWARD,        PHYS_INPUT_MOVEVALUES(self)_x > 0);
-       X(self.pressedkeys, KEY_BACKWARD,       PHYS_INPUT_MOVEVALUES(self)_x < 0);
-       X(self.pressedkeys, KEY_RIGHT,          PHYS_INPUT_MOVEVALUES(self)_y > 0);
-       X(self.pressedkeys, KEY_LEFT,           PHYS_INPUT_MOVEVALUES(self)_y < 0);
-
-       X(self.pressedkeys, KEY_ATCK,           PHYS_INPUT_BUTTONS(self) & 1);
-       X(self.pressedkeys, KEY_ATCK2,          PHYS_INPUT_BUTTONS(self) & 2);
-       X(self.pressedkeys, KEY_JUMP,           PHYS_INPUT_BUTTONS(self) & 4);
-       X(self.pressedkeys, KEY_CROUCH,         PHYS_INPUT_BUTTONS(self) & 16);
-       #undef X
-}
 #endif
 
 // returns 1 if the player is close to a wall
-float check_close_to_wall(float threshold)
-{
-       if (PHYS_DODGING_WALL == 0) { return FALSE; }
+bool check_close_to_wall(float threshold)
+{SELFPARAM();
+       if (PHYS_DODGING_WALL == 0) { return false; }
 
        #define X(OFFSET)                                                                                                                               \
-       tracebox(self.origin, self.mins, self.maxs, self.origin + OFFSET, TRUE, self);  \
+       tracebox(self.origin, self.mins, self.maxs, self.origin + OFFSET, true, self);  \
        if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)                \
-               return TRUE;
+               return true;
        X(1000*v_right);
        X(-1000*v_right);
        X(1000*v_forward);
        X(-1000*v_forward);
        #undef X
 
-       return FALSE;
+       return false;
 }
 
-float check_close_to_ground(float threshold)
-{
-       return IS_ONGROUND(self) ? TRUE : FALSE;
+bool check_close_to_ground(float threshold)
+{SELFPARAM();
+       return IS_ONGROUND(self) ? true : false;
 }
 
-void PM_dodging_checkpressedkeys()
-{
+float PM_dodging_checkpressedkeys()
+{SELFPARAM();
        if(!PHYS_DODGING)
-               return;
+               return false;
 
        float frozen_dodging = (PHYS_FROZEN(self) && PHYS_DODGING_FROZEN);
        float frozen_no_doubletap = (frozen_dodging && !PHYS_DODGING_FROZEN_NODOUBLETAP);
 
        // first check if the last dodge is far enough back in time so we can dodge again
        if ((time - self.last_dodging_time) < PHYS_DODGING_DELAY)
-               return;
+               return false;
 
-       makevectors(PHYS_WORLD_ANGLES(self));
+       makevectors(self.angles);
 
        if (check_close_to_ground(PHYS_DODGING_HEIGHT_THRESHOLD) != 1
                && check_close_to_wall(PHYS_DODGING_DISTANCE_THRESHOLD) != 1)
-               return;
+               return true;
 
        float tap_direction_x = 0;
        float tap_direction_y = 0;
        float dodge_detected = 0;
 
        #define X(COND,BTN,RESULT)                                                                                                                      \
-       if (PHYS_INPUT_MOVEVALUES(self)_##COND)                                                                                         \
+       if (self.movement_##COND)                                                                                               \
                /* is this a state change? */                                                                                                   \
                if(!(PHYS_DODGING_PRESSED_KEYS(self) & KEY_##BTN) || frozen_no_doubletap) {             \
                                tap_direction_##RESULT;                                                                                                 \
@@ -180,10 +168,10 @@ void PM_dodging_checkpressedkeys()
                                        dodge_detected = 1;                                                                                                     \
                                self.last_##BTN##_KEY_time = time;                                                                              \
                }
-       X(x > 0, FORWARD, x = 1);
-       X(x < 0, BACKWARD, x = -1);
-       X(y > 0, RIGHT, y = 1);
-       X(y < 0, LEFT, y = -1);
+       X(x < 0, BACKWARD,      x--);
+       X(x > 0, FORWARD,       x++);
+       X(y < 0, LEFT,          y--);
+       X(y > 0, RIGHT,         y++);
        #undef X
 
        if (dodge_detected == 1)
@@ -203,13 +191,15 @@ void PM_dodging_checkpressedkeys()
                                        + 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;
+               self.dodging_direction_x = self.dodging_direction_x * 1.0 / length;
+               self.dodging_direction_y = self.dodging_direction_y * 1.0 / length;
+               return true;
        }
+       return false;
 }
 
 void PM_dodging()
-{
+{SELFPARAM();
        if (!PHYS_DODGING)
                return;
 
@@ -230,7 +220,7 @@ void PM_dodging()
        }
 
        // make sure v_up, v_right and v_forward are sane
-       makevectors(PHYS_WORLD_ANGLES(self));
+       makevectors(self.angles);
 
        // if we have e.g. 0.5 sec ramptime and a frametime of 0.25, then the ramp code
        // will be called ramp_time/frametime times = 2 times. so, we need to
@@ -250,7 +240,7 @@ void PM_dodging()
        if (self.dodging_action == 1)
        {
                //disable jump key during dodge accel phase
-               if(PHYS_INPUT_MOVEVALUES(self)_z > 0) { PHYS_INPUT_MOVEVALUES(self)_z = 0; }
+               if(self.movement_z > 0) { self.movement_z = 0; }
 
                self.velocity += ((self.dodging_direction_y * velocity_difference) * v_right)
                                        + ((self.dodging_direction_x * velocity_difference) * v_forward);
@@ -266,10 +256,10 @@ void PM_dodging()
                self.velocity += PHYS_DODGING_UP_SPEED * v_up;
 
 #ifdef SVQC
-               if (autocvar_sv_dodging_sound == 1)
+               if (autocvar_sv_dodging_sound)
                        PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
 
-               animdecide_setaction(self, ANIMACTION_JUMP, TRUE);
+               animdecide_setaction(self, ANIMACTION_JUMP, true);
 #endif
 
                self.dodging_single_action = 0;
@@ -290,7 +280,7 @@ void PM_dodging()
 MUTATOR_HOOKFUNCTION(dodging_GetCvars)
 {
        GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout");
-       return FALSE;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics)
@@ -298,14 +288,14 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics)
        // print("dodging_PlayerPhysics\n");
        PM_dodging();
 
-       return FALSE;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys)
 {
        PM_dodging_checkpressedkeys();
 
-       return FALSE;
+       return false;
 }
 
 MUTATOR_DEFINITION(mutator_dodging)
@@ -333,6 +323,6 @@ MUTATOR_DEFINITION(mutator_dodging)
                g_dodging = 0;
        }
 
-       return FALSE;
+       return false;
 }
 #endif