]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/physics.qh
minigames: handle program specific definitions internally
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / physics.qh
index e70b489fd6fe0c72a218b438b6c9d81e931c3c5e..66824bbcf6c24c3ee52eee80a231d663619dfd74 100644 (file)
 .float lastflags;
 .float lastground;
 .float wasFlying;
+#ifdef SVQC
+.float spectatorspeed = _STAT(SPECTATORSPEED);
+#elif defined(CSQC)
 .float spectatorspeed;
+#endif
 
 .vector movement_old;
 .float buttons_old;
@@ -24,15 +28,129 @@ float AdjustAirAccelQW(float accelqw, float factor);
 
 bool IsFlying(entity a);
 
-#define PHYS_AMMO_FUEL(s) STAT(FUEL, s)
+#define BUFFS_STAT(s)                       STAT(BUFFS, s)
+
+#define GAMEPLAYFIX_DOWNTRACEONGROUND(s)    STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, s)
+#define GAMEPLAYFIX_EASIERWATERJUMP(s)      STAT(GAMEPLAYFIX_EASIERWATERJUMP, s)
+#define GAMEPLAYFIX_STEPDOWN(s)             STAT(GAMEPLAYFIX_STEPDOWN, s)
+#define GAMEPLAYFIX_STEPMULTIPLETIMES(s)    STAT(GAMEPLAYFIX_STEPMULTIPLETIMES, s)
+#define GAMEPLAYFIX_UNSTICKPLAYERS(s)       STAT(GAMEPLAYFIX_UNSTICKPLAYERS, s)
+
+#define PHYS_ACCELERATE(s)                  STAT(MOVEVARS_ACCELERATE, s)
+#define PHYS_AIRACCELERATE(s)               STAT(MOVEVARS_AIRACCELERATE, s)
+#define PHYS_AIRACCEL_QW(s)                 STAT(MOVEVARS_AIRACCEL_QW, s)
+#define PHYS_AIRACCEL_QW_STRETCHFACTOR(s)   STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, s)
+#define PHYS_AIRACCEL_SIDEWAYS_FRICTION(s)  STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, s)
+#define PHYS_AIRCONTROL(s)                  STAT(MOVEVARS_AIRCONTROL, s)
+#define PHYS_AIRCONTROL_PENALTY(s)          STAT(MOVEVARS_AIRCONTROL_PENALTY, s)
+#define PHYS_AIRCONTROL_POWER(s)            STAT(MOVEVARS_AIRCONTROL_POWER, s)
+#define PHYS_AIRSPEEDLIMIT_NONQW(s)         STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, s)
+#define PHYS_AIRSTOPACCELERATE(s)           STAT(MOVEVARS_AIRSTOPACCELERATE, s)
+#define PHYS_AIRSTRAFEACCELERATE(s)         STAT(MOVEVARS_AIRSTRAFEACCELERATE, s)
+#define PHYS_AIRSTRAFEACCEL_QW(s)           STAT(MOVEVARS_AIRSTRAFEACCEL_QW, s)
+
+#define PHYS_AMMO_FUEL(s)                   STAT(FUEL, s)
+
+#define PHYS_DODGING_FROZEN(s)              STAT(DODGING_FROZEN, s)
+
+#define PHYS_FRICTION(s)                    STAT(MOVEVARS_FRICTION, s)
+#define PHYS_FRICTION_ONLAND(s)             STAT(MOVEVARS_FRICTION_ONLAND, s)
+#define PHYS_FRICTION_SLICK(s)              STAT(MOVEVARS_FRICTION_SLICK, s)
+
+#define PHYS_FROZEN(s)                      STAT(FROZEN, s)
+
+#define PHYS_HIGHSPEED(s)                   STAT(MOVEVARS_HIGHSPEED, s)
+
+#define PHYS_JETPACK_ACCEL_SIDE(s)          STAT(JETPACK_ACCEL_SIDE, s)
+#define PHYS_JETPACK_ACCEL_UP(s)            STAT(JETPACK_ACCEL_UP, s)
+#define PHYS_JETPACK_ANTIGRAVITY(s)         STAT(JETPACK_ANTIGRAVITY, s)
+#define PHYS_JETPACK_FUEL(s)                STAT(JETPACK_FUEL, s)
+#define PHYS_JETPACK_MAXSPEED_SIDE(s)       STAT(JETPACK_MAXSPEED_SIDE, s)
+#define PHYS_JETPACK_MAXSPEED_UP(s)         STAT(JETPACK_MAXSPEED_UP, s)
+
+#define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS(s) STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS, s)
+#define PHYS_JUMPSTEP(s)                    STAT(MOVEVARS_JUMPSTEP, s)
+#define PHYS_JUMPVELOCITY(s)                STAT(MOVEVARS_JUMPVELOCITY, s)
+
+#define PHYS_MAXAIRSPEED(s)                 STAT(MOVEVARS_MAXAIRSPEED, s)
+#define PHYS_MAXAIRSTRAFESPEED(s)           STAT(MOVEVARS_MAXAIRSTRAFESPEED, s)
+#define PHYS_MAXSPEED(s)                    STAT(MOVEVARS_MAXSPEED, s)
+
+#define PHYS_NOSTEP(s)                      STAT(NOSTEP, s)
+#define PHYS_STEPHEIGHT(s)                  STAT(MOVEVARS_STEPHEIGHT, s)
+
+#define PHYS_STOPSPEED(s)                   STAT(MOVEVARS_STOPSPEED, s)
+
+#define PHYS_TRACK_CANJUMP(s)               STAT(MOVEVARS_TRACK_CANJUMP, s)
+
+#define PHYS_WALLFRICTION(s)                STAT(MOVEVARS_WALLFRICTION, s)
+
+#define PHYS_WARSOWBUNNY_ACCEL(s)           STAT(MOVEVARS_WARSOWBUNNY_ACCEL, s)
+#define PHYS_WARSOWBUNNY_AIRFORWARDACCEL(s) STAT(MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, s)
+#define PHYS_WARSOWBUNNY_BACKTOSIDERATIO(s) STAT(MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO, s)
+#define PHYS_WARSOWBUNNY_TOPSPEED(s)        STAT(MOVEVARS_WARSOWBUNNY_TOPSPEED, s)
+#define PHYS_WARSOWBUNNY_TURNACCEL(s)       STAT(MOVEVARS_WARSOWBUNNY_TURNACCEL, s)
+
+#define UPWARD_VELOCITY_CLEARS_ONGROUND(s)  STAT(GAMEPLAYFIX_UPVELOCITYCLEARSONGROUND, s)
+
+#define PHYS_INPUT_BUTTON_ATCK(s)           PHYS_INPUT_BUTTON_BUTTON1(s)
+#define PHYS_INPUT_BUTTON_JUMP(s)           PHYS_INPUT_BUTTON_BUTTON2(s)
+#define PHYS_INPUT_BUTTON_ATCK2(s)          PHYS_INPUT_BUTTON_BUTTON3(s)
+#define PHYS_INPUT_BUTTON_ZOOM(s)           PHYS_INPUT_BUTTON_BUTTON4(s)
+#define PHYS_INPUT_BUTTON_CROUCH(s)         PHYS_INPUT_BUTTON_BUTTON5(s)
+#define PHYS_INPUT_BUTTON_HOOK(s)           PHYS_INPUT_BUTTON_BUTTON6(s)
+#define PHYS_INPUT_BUTTON_INFO(s)           PHYS_INPUT_BUTTON_BUTTON7(s)
+#define PHYS_INPUT_BUTTON_DRAG(s)           PHYS_INPUT_BUTTON_BUTTON8(s)
+#define PHYS_INPUT_BUTTON_USE(s)            PHYS_INPUT_BUTTON_BUTTON_USE(s)
+#define PHYS_INPUT_BUTTON_CHAT(s)           PHYS_INPUT_BUTTON_BUTTON_CHAT(s)
+#define PHYS_INPUT_BUTTON_PRYDON(s)         PHYS_INPUT_BUTTON_BUTTON_PRYDON(s)
+#define PHYS_INPUT_BUTTON_ZOOMSCRIPT(s)     PHYS_INPUT_BUTTON_BUTTON9(s)
+#define PHYS_INPUT_BUTTON_JETPACK(s)        PHYS_INPUT_BUTTON_BUTTON10(s)
+
+// if more buttons are needed, start using impulse bits as buttons
+
+#define PHYS_INPUT_BUTTON_BACKWARD(s)       (PHYS_INPUT_MOVEVALUES(s).x < 0)
+#define PHYS_INPUT_BUTTON_FORWARD(s)        (PHYS_INPUT_MOVEVALUES(s).x > 0)
+#define PHYS_INPUT_BUTTON_LEFT(s)           (PHYS_INPUT_MOVEVALUES(s).y < 0)
+#define PHYS_INPUT_BUTTON_RIGHT(s)          (PHYS_INPUT_MOVEVALUES(s).y > 0)
+
+// used for special commands and idle checking, not from the engine
+// TODO: cache
+#define PHYS_INPUT_BUTTON_MASK(s) ( \
+         (1 <<  0) * PHYS_INPUT_BUTTON_ATCK(s) \
+       | (1 <<  1) * PHYS_INPUT_BUTTON_JUMP(s) \
+       | (1 <<  2) * PHYS_INPUT_BUTTON_ATCK2(s) \
+       | (1 <<  3) * PHYS_INPUT_BUTTON_ZOOM(s) \
+       | (1 <<  4) * PHYS_INPUT_BUTTON_CROUCH(s) \
+       | (1 <<  5) * PHYS_INPUT_BUTTON_HOOK(s) \
+       | (1 <<  6) * PHYS_INPUT_BUTTON_USE(s) \
+       | (1 <<  7) * PHYS_INPUT_BUTTON_BACKWARD(s) \
+       | (1 <<  8) * PHYS_INPUT_BUTTON_FORWARD(s) \
+       | (1 <<  9) * PHYS_INPUT_BUTTON_LEFT(s) \
+       | (1 << 10) * PHYS_INPUT_BUTTON_RIGHT(s) \
+       )
+
+#define IS_JUMP_HELD(s)                     (!((s).flags & FL_JUMPRELEASED))
+#define SET_JUMP_HELD(s)                    ((s).flags &= ~FL_JUMPRELEASED)
+#define UNSET_JUMP_HELD(s)                  ((s).flags |= FL_JUMPRELEASED)
+
+#define IS_ONGROUND(s)                      boolean((s).flags & FL_ONGROUND)
+#define SET_ONGROUND(s)                     ((s).flags |= FL_ONGROUND)
+#define UNSET_ONGROUND(s)                   ((s).flags &= ~FL_ONGROUND)
+
+#define WAS_ONGROUND(s)                     boolean((s).lastflags & FL_ONGROUND)
+
+#define ITEMS_STAT(s)                       ((s).items)
 
 #ifdef CSQC
 
-       const int FL_WATERJUMP = 2048;  // player jumping out of water
-       const int FL_JUMPRELEASED = 4096;       // for jump debouncing
+       string autocvar_cl_jumpspeedcap_min;
+       string autocvar_cl_jumpspeedcap_max;
+
+       noref float pmove_waterjumptime;
 
-       float PM_multijump_checkjump();
-       void PM_multijump();
+       const int FL_WATERJUMP = 2048;  // player jumping out of water
+       const int FL_JUMPRELEASED = 4096;  // for jump debouncing
 
        .float watertype;
        .float waterlevel;
@@ -42,330 +160,151 @@ bool IsFlying(entity a);
        .vector v_angle;
 
 // TODO
-       #define IS_CLIENT(s)                                            (s).isplayermodel
-       #define IS_PLAYER(s)                                            (s).isplayermodel
-       #define isPushable(s)                                           (s).isplayermodel
+       #define IS_CLIENT(s)                        ((s).isplayermodel)
+       #define IS_PLAYER(s)                        ((s).isplayermodel)
+       #define IS_NOT_A_CLIENT(s)                  (!(s).isplayermodel)
+       #define isPushable(s)                       ((s).isplayermodel || (s).pushable || ((s).flags & FL_PROJECTILE))
 
        //float player_multijump;
        //float player_jumpheight;
 
-       #define PHYS_INPUT_ANGLES(s)                            input_angles
+       #define PHYS_GRAVITY(s)                     STAT(MOVEVARS_GRAVITY, s)
+
+       #define PHYS_TELEPORT_TIME(s)               ((s).teleport_time)
+
+       #define TICRATE                             ticrate
+
+       #define PHYS_INPUT_ANGLES(s)                input_angles
 // TODO
-       #define PHYS_WORLD_ANGLES(s)                            input_angles
-
-       #define PHYS_INPUT_TIMELENGTH                           input_timelength
-       #define PHYS_INPUT_FRAMETIME                            serverdeltatime
-
-       #define PHYS_INPUT_MOVEVALUES(s)                        input_movevalues
-
-       #define PHYS_INPUT_BUTTON_MASK(s)               (input_buttons | 128 * (input_movevalues_x < 0) | 256 * (input_movevalues_x > 0) | 512 * (input_movevalues_y < 0) | 1024 * (input_movevalues_y > 0))
-       #define PHYS_INPUT_BUTTON_ATCK(s)                       !!(input_buttons & 1)
-       #define PHYS_INPUT_BUTTON_JUMP(s)                       !!(input_buttons & 2)
-       #define PHYS_INPUT_BUTTON_ATCK2(s)                      !!(input_buttons & 4)
-       #define PHYS_INPUT_BUTTON_ZOOM(s)                       !!(input_buttons & 8)
-       #define PHYS_INPUT_BUTTON_CROUCH(s)                     !!(input_buttons & 16)
-       #define PHYS_INPUT_BUTTON_HOOK(s)                       !!(input_buttons & 32)
-       #define PHYS_INPUT_BUTTON_USE(s)                        !!(input_buttons & 64)
-       #define PHYS_INPUT_BUTTON_BACKWARD(s)           !!(input_buttons & 128)
-       #define PHYS_INPUT_BUTTON_FORWARD(s)            !!(input_buttons & 256)
-       #define PHYS_INPUT_BUTTON_LEFT(s)                       !!(input_buttons & 512)
-       #define PHYS_INPUT_BUTTON_RIGHT(s)                      !!(input_buttons & 1024)
-       #define PHYS_INPUT_BUTTON_JETPACK(s)            !!(input_buttons & 4096)
-
-       #define PHYS_DEAD(s)                                            s.csqcmodel_isdead
-
-       #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  !!(moveflags & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE)
-       #define GAMEPLAYFIX_NOGRAVITYONGROUND                   cvar("sv_gameplayfix_nogravityonground")
-       #define GAMEPLAYFIX_Q2AIRACCELERATE                             cvar("sv_gameplayfix_q2airaccelerate")
-       #define GAMEPLAYFIX_EASIERWATERJUMP                     STAT(GAMEPLAYFIX_EASIERWATERJUMP)
-       #define GAMEPLAYFIX_DOWNTRACEONGROUND                   STAT(GAMEPLAYFIX_DOWNTRACEONGROUND)
-       #define GAMEPLAYFIX_STEPMULTIPLETIMES                   STAT(GAMEPLAYFIX_STEPMULTIPLETIMES)
-       #define GAMEPLAYFIX_UNSTICKPLAYERS                              STAT(GAMEPLAYFIX_UNSTICKPLAYERS)
-       #define GAMEPLAYFIX_STEPDOWN                                    STAT(GAMEPLAYFIX_STEPDOWN)
-
-       #define IS_DUCKED(s)                                            !!(s.flags & FL_DUCKED)
-       #define SET_DUCKED(s)                                           s.flags |= FL_DUCKED
-       #define UNSET_DUCKED(s)                                         s.flags &= ~FL_DUCKED
-
-       #define IS_JUMP_HELD(s)                                         !(s.flags & FL_JUMPRELEASED)
-       #define SET_JUMP_HELD(s)                                        s.flags &= ~FL_JUMPRELEASED
-       #define UNSET_JUMP_HELD(s)                                      s.flags |= FL_JUMPRELEASED
-
-       #define IS_ONGROUND(s)                                          !!(s.flags & FL_ONGROUND)
-       #define SET_ONGROUND(s)                                         s.flags |= FL_ONGROUND
-       #define UNSET_ONGROUND(s)                                       s.flags &= ~FL_ONGROUND
-
-       #define WAS_ONGROUND(s)                                         !!(s.lastflags & FL_ONGROUND)
-
-       #define ITEMS_STAT(s)                                           (s).items
-       #define BUFFS_STAT(s)                                           STAT(BUFFS)
-
-       #define PHYS_FROZEN(s)                                          STAT(FROZEN)
-
-       #define PHYS_DOUBLEJUMP                                         STAT(DOUBLEJUMP)
-
-       #define PHYS_BUGRIGS                                            STAT(BUGRIGS)
-       #define PHYS_BUGRIGS_ANGLE_SMOOTHING            STAT(BUGRIGS_ANGLE_SMOOTHING)
-       #define PHYS_BUGRIGS_PLANAR_MOVEMENT            STAT(BUGRIGS_PLANAR_MOVEMENT)
-       #define PHYS_BUGRIGS_REVERSE_SPEEDING           STAT(BUGRIGS_REVERSE_SPEEDING)
-       #define PHYS_BUGRIGS_FRICTION_FLOOR             STAT(BUGRIGS_FRICTION_FLOOR)
-       #define PHYS_BUGRIGS_AIR_STEERING                       STAT(BUGRIGS_AIR_STEERING)
-       #define PHYS_BUGRIGS_FRICTION_BRAKE             STAT(BUGRIGS_FRICTION_BRAKE)
-       #define PHYS_BUGRIGS_ACCEL                                      STAT(BUGRIGS_ACCEL)
-       #define PHYS_BUGRIGS_SPEED_REF                          STAT(BUGRIGS_SPEED_REF)
-       #define PHYS_BUGRIGS_SPEED_POW                          STAT(BUGRIGS_SPEED_POW)
-       #define PHYS_BUGRIGS_STEER                                      STAT(BUGRIGS_STEER)
-       #define PHYS_BUGRIGS_FRICTION_AIR                       STAT(BUGRIGS_FRICTION_AIR)
-       #define PHYS_BUGRIGS_CAR_JUMPING                        STAT(BUGRIGS_CAR_JUMPING)
-       #define PHYS_BUGRIGS_REVERSE_SPINNING           STAT(BUGRIGS_REVERSE_SPINNING)
-       #define PHYS_BUGRIGS_REVERSE_STOPPING           STAT(BUGRIGS_REVERSE_STOPPING)
-
-       #define PHYS_JUMPSPEEDCAP_MIN                           cvar_string("cl_jumpspeedcap_min")
-       #define PHYS_JUMPSPEEDCAP_MAX                           cvar_string("cl_jumpspeedcap_max")
-       #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS       STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS)
-
-       #define PHYS_CL_TRACK_CANJUMP(s)                        STAT(MOVEVARS_CL_TRACK_CANJUMP)
-       #define PHYS_TRACK_CANJUMP(s)                           STAT(MOVEVARS_TRACK_CANJUMP)
-       #define PHYS_ACCELERATE                                         getstatf(STAT_MOVEVARS_ACCELERATE)
-       #define PHYS_AIRACCEL_QW(s)                                     getstatf(STAT_MOVEVARS_AIRACCEL_QW)
-       #define PHYS_AIRACCEL_QW_STRETCHFACTOR(s)       STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, s)
-       #define PHYS_AIRACCEL_SIDEWAYS_FRICTION         getstatf(STAT_MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION)
-       #define PHYS_AIRACCELERATE                                      getstatf(STAT_MOVEVARS_AIRACCELERATE)
-       #define PHYS_AIRCONTROL                                         getstatf(STAT_MOVEVARS_AIRCONTROL)
-       #define PHYS_AIRCONTROL_PENALTY                         STAT(MOVEVARS_AIRCONTROL_PENALTY)
-       #define PHYS_AIRCONTROL_POWER                           STAT(MOVEVARS_AIRCONTROL_POWER)
-       #define PHYS_AIRSPEEDLIMIT_NONQW(s)                     STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, s)
-       #define PHYS_AIRSTOPACCELERATE                          getstatf(STAT_MOVEVARS_AIRSTOPACCELERATE)
-       #define PHYS_AIRSTRAFEACCEL_QW(s)                       STAT(MOVEVARS_AIRSTRAFEACCEL_QW, s)
-       #define PHYS_AIRSTRAFEACCELERATE(s)                     getstatf(STAT_MOVEVARS_AIRSTRAFEACCELERATE)
-       #define PHYS_ENTGRAVITY(s)                                      STAT(MOVEVARS_ENTGRAVITY)
-       #define PHYS_FRICTION                                           getstatf(STAT_MOVEVARS_FRICTION)
-       #define PHYS_FRICTION_SLICK                                     STAT(MOVEVARS_FRICTION_SLICK)
-       #define PHYS_FRICTION_ONLAND                            STAT(MOVEVARS_FRICTION_ONLAND)
-       #define PHYS_GRAVITY                                            STAT(MOVEVARS_GRAVITY)
-       #define PHYS_HIGHSPEED                                          STAT(MOVEVARS_HIGHSPEED)
-       #define PHYS_JUMPVELOCITY                                       getstatf(STAT_MOVEVARS_JUMPVELOCITY)
-       #define PHYS_MAXAIRSPEED(s)                                     getstatf(STAT_MOVEVARS_MAXAIRSPEED)
-       #define PHYS_MAXAIRSTRAFESPEED                          getstatf(STAT_MOVEVARS_MAXAIRSTRAFESPEED)
-       #define PHYS_MAXSPEED(s)                                        getstatf(STAT_MOVEVARS_MAXSPEED)
-       #define PHYS_STEPHEIGHT                                         STAT(MOVEVARS_STEPHEIGHT)
-       #define PHYS_STOPSPEED                                          getstatf(STAT_MOVEVARS_STOPSPEED)
-       #define PHYS_WARSOWBUNNY_ACCEL                          getstatf(STAT_MOVEVARS_WARSOWBUNNY_ACCEL)
-       #define PHYS_WARSOWBUNNY_BACKTOSIDERATIO        getstatf(STAT_MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO)
-       #define PHYS_WARSOWBUNNY_AIRFORWARDACCEL        getstatf(STAT_MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL)
-       #define PHYS_WARSOWBUNNY_TOPSPEED                       getstatf(STAT_MOVEVARS_WARSOWBUNNY_TOPSPEED)
-       #define PHYS_WARSOWBUNNY_TURNACCEL                      getstatf(STAT_MOVEVARS_WARSOWBUNNY_TURNACCEL)
-
-       #define PHYS_WALLFRICTION                                       STAT(MOVEVARS_WALLFRICTION)
-
-       #define PHYS_JETPACK_ACCEL_UP                           STAT(JETPACK_ACCEL_UP)
-       #define PHYS_JETPACK_ACCEL_SIDE                         STAT(JETPACK_ACCEL_SIDE)
-       #define PHYS_JETPACK_ANTIGRAVITY                        STAT(JETPACK_ANTIGRAVITY)
-       #define PHYS_JETPACK_FUEL                                       STAT(JETPACK_FUEL)
-       #define PHYS_JETPACK_MAXSPEED_UP                        STAT(JETPACK_MAXSPEED_UP)
-       #define PHYS_JETPACK_MAXSPEED_SIDE                      STAT(JETPACK_MAXSPEED_SIDE)
-
-       #define PHYS_DODGING_FROZEN                                     STAT(DODGING_FROZEN)
-
-       #define PHYS_NOSTEP                                                     STAT(NOSTEP)
-       #define PHYS_JUMPSTEP                                           STAT(MOVEVARS_JUMPSTEP)
+       #define PHYS_WORLD_ANGLES(s)                input_angles
+
+       #define PHYS_INPUT_TIMELENGTH               input_timelength
+       #define PHYS_INPUT_FRAMETIME                serverdeltatime
+
+       #define PHYS_INPUT_MOVEVALUES(s)            input_movevalues
+
+       #define PHYS_INPUT_BUTTON_BUTTON1(s)        boolean(input_buttons & BIT(0))
+       #define PHYS_INPUT_BUTTON_BUTTON2(s)        boolean(input_buttons & BIT(1))
+       #define PHYS_INPUT_BUTTON_BUTTON3(s)        boolean(input_buttons & BIT(2))
+       #define PHYS_INPUT_BUTTON_BUTTON4(s)        boolean(input_buttons & BIT(3))
+       #define PHYS_INPUT_BUTTON_BUTTON5(s)        boolean(input_buttons & BIT(4))
+       #define PHYS_INPUT_BUTTON_BUTTON6(s)        boolean(input_buttons & BIT(5))
+       #define PHYS_INPUT_BUTTON_BUTTON7(s)        boolean(input_buttons & BIT(6))
+       #define PHYS_INPUT_BUTTON_BUTTON8(s)        boolean(input_buttons & BIT(7))
+       #define PHYS_INPUT_BUTTON_BUTTON_USE(s)     boolean(input_buttons & BIT(8))
+       #define PHYS_INPUT_BUTTON_BUTTON_CHAT(s)    boolean(input_buttons & BIT(9))
+       #define PHYS_INPUT_BUTTON_BUTTON_PRYDON(s)  boolean(input_buttons & BIT(10))
+       #define PHYS_INPUT_BUTTON_BUTTON9(s)        boolean(input_buttons & BIT(11))
+       #define PHYS_INPUT_BUTTON_BUTTON10(s)       boolean(input_buttons & BIT(12))
+       #define PHYS_INPUT_BUTTON_BUTTON11(s)       boolean(input_buttons & BIT(13))
+       #define PHYS_INPUT_BUTTON_BUTTON12(s)       boolean(input_buttons & BIT(14))
+       #define PHYS_INPUT_BUTTON_BUTTON13(s)       boolean(input_buttons & BIT(15))
+       #define PHYS_INPUT_BUTTON_BUTTON14(s)       boolean(input_buttons & BIT(16))
+       #define PHYS_INPUT_BUTTON_BUTTON15(s)       boolean(input_buttons & BIT(17))
+       #define PHYS_INPUT_BUTTON_BUTTON16(s)       boolean(input_buttons & BIT(18))
+
+       #define PHYS_DEAD(s)                        ((s).csqcmodel_isdead)
+
+       #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  (boolean(moveflags & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE))
+       #define GAMEPLAYFIX_NOGRAVITYONGROUND           (boolean(moveflags & MOVEFLAG_NOGRAVITYONGROUND))
+       #define GAMEPLAYFIX_Q2AIRACCELERATE             (boolean(moveflags & MOVEFLAG_Q2AIRACCELERATE))
+
+       #define IS_DUCKED(s)                        (boolean((s).flags & FL_DUCKED))
+       #define SET_DUCKED(s)                       ((s).flags |= FL_DUCKED)
+       #define UNSET_DUCKED(s)                     ((s).flags &= ~FL_DUCKED)
+
+       #define PHYS_JUMPSPEEDCAP_MIN               autocvar_cl_jumpspeedcap_min
+       #define PHYS_JUMPSPEEDCAP_MAX               autocvar_cl_jumpspeedcap_max
+
+       #define PHYS_CL_TRACK_CANJUMP(s)            STAT(MOVEVARS_CL_TRACK_CANJUMP, s)
+       // FIXME: 0 doesn't mean zero gravity
+       #define PHYS_ENTGRAVITY(s)                  STAT(MOVEVARS_ENTGRAVITY, s)
 
 #elif defined(SVQC)
 
        bool Physics_Valid(string thecvar);
 
-       .vector stat_pl_view_ofs;
-       .vector stat_pl_crouch_view_ofs;
+       .float stat_sv_airspeedlimit_nonqw = _STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW);
+       .float stat_sv_maxspeed = _STAT(MOVEVARS_MAXSPEED);
+
+       /** Not real stats */
+       .string jumpspeedcap_min;
+       .string jumpspeedcap_max;
 
-       .vector stat_pl_min;
-       .vector stat_pl_max;
-       .vector stat_pl_crouch_min;
-       .vector stat_pl_crouch_max;
+       #define PHYS_TELEPORT_TIME(s)               ((s).teleport_time)
 
-       .float stat_sv_airaccel_qw;
-       .float stat_sv_airspeedlimit_nonqw = _STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW);
-       .float stat_sv_maxspeed;
-       .float stat_movement_highspeed = _STAT(MOVEVARS_HIGHSPEED);
-
-       .float stat_sv_friction_on_land = _STAT(MOVEVARS_FRICTION_ONLAND);
-       .float stat_sv_friction_slick = _STAT(MOVEVARS_FRICTION_SLICK);
-
-       .float stat_doublejump = _STAT(DOUBLEJUMP);
-
-       .string stat_jumpspeedcap_min;
-       .string stat_jumpspeedcap_max;
-       .float stat_jumpspeedcap_disable_onramps = _STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS);
-
-       .float stat_jetpack_accel_side = _STAT(JETPACK_ACCEL_SIDE);
-       .float stat_jetpack_accel_up = _STAT(JETPACK_ACCEL_UP);
-       .float stat_jetpack_antigravity = _STAT(JETPACK_ANTIGRAVITY);
-       .float stat_jetpack_fuel = _STAT(JETPACK_FUEL);
-       .float stat_jetpack_maxspeed_up = _STAT(JETPACK_MAXSPEED_UP);
-       .float stat_jetpack_maxspeed_side = _STAT(JETPACK_MAXSPEED_SIDE);
-       .float stat_gameplayfix_easierwaterjump = _STAT(GAMEPLAYFIX_EASIERWATERJUMP);
-       .float stat_gameplayfix_downtracesupportsongroundflag = _STAT(GAMEPLAYFIX_DOWNTRACEONGROUND);
-       .float stat_gameplayfix_stepmultipletimes = _STAT(GAMEPLAYFIX_STEPMULTIPLETIMES);
-       .float stat_gameplayfix_unstickplayers = _STAT(GAMEPLAYFIX_UNSTICKPLAYERS);
-       .float stat_gameplayfix_stepdown = _STAT(GAMEPLAYFIX_STEPDOWN);
-
-       .float stat_bugrigs = _STAT(BUGRIGS);
-       .float stat_bugrigs_angle_smoothing = _STAT(BUGRIGS_ANGLE_SMOOTHING);
-       .float stat_bugrigs_planar_movement = _STAT(BUGRIGS_PLANAR_MOVEMENT);
-       .float stat_bugrigs_reverse_speeding = _STAT(BUGRIGS_REVERSE_SPEEDING);
-       .float stat_bugrigs_friction_floor = _STAT(BUGRIGS_FRICTION_FLOOR);
-       .float stat_bugrigs_air_steering = _STAT(BUGRIGS_AIR_STEERING);
-       .float stat_bugrigs_friction_brake = _STAT(BUGRIGS_FRICTION_BRAKE);
-       .float stat_bugrigs_accel = _STAT(BUGRIGS_ACCEL);
-       .float stat_bugrigs_speed_ref = _STAT(BUGRIGS_SPEED_REF);
-       .float stat_bugrigs_speed_pow = _STAT(BUGRIGS_SPEED_POW);
-       .float stat_bugrigs_steer = _STAT(BUGRIGS_STEER);
-       .float stat_bugrigs_friction_air = _STAT(BUGRIGS_FRICTION_AIR);
-       .float stat_bugrigs_car_jumping = _STAT(BUGRIGS_CAR_JUMPING);
-       .float stat_bugrigs_reverse_spinning = _STAT(BUGRIGS_REVERSE_SPINNING);
-       .float stat_bugrigs_reverse_stopping = _STAT(BUGRIGS_REVERSE_STOPPING);
-
-       // new properties
-       .float stat_sv_jumpvelocity;
-       .float stat_sv_maxairstrafespeed;
-       .float stat_sv_maxairspeed;
-       .float stat_sv_airstrafeaccelerate;
-       .float stat_sv_warsowbunny_turnaccel;
-       .float stat_sv_airaccel_sideways_friction;
-       .float stat_sv_aircontrol;
-       .float stat_sv_warsowbunny_airforwardaccel;
-       .float stat_sv_warsowbunny_topspeed;
-       .float stat_sv_warsowbunny_accel;
-       .float stat_sv_warsowbunny_backtosideratio;
-       .float stat_sv_friction;
-       .float stat_sv_accelerate;
-       .float stat_sv_stopspeed;
-       .float stat_sv_airaccelerate;
-       .float stat_sv_airstopaccelerate;
-
-       .float stat_nostep = _STAT(NOSTEP);
-       .float stat_jumpstep = _STAT(MOVEVARS_JUMPSTEP);
-
-       .bool stat_sv_track_canjump = _STAT(MOVEVARS_TRACK_CANJUMP);
-
-       #define PHYS_INPUT_ANGLES(s)                            s.v_angle
-       #define PHYS_WORLD_ANGLES(s)                            s.angles
-
-       #define PHYS_INPUT_TIMELENGTH                           frametime
-       #define PHYS_INPUT_FRAMETIME                            sys_frametime
-
-       #define PHYS_INPUT_MOVEVALUES(s)                        s.movement
-       // TODO: cache
-       #define PHYS_INPUT_BUTTON_MASK(s)               (s.BUTTON_ATCK | 2 * s.BUTTON_JUMP | 4 * s.BUTTON_ATCK2 | 8 * s.BUTTON_ZOOM | 16 * s.BUTTON_CROUCH | 32 * s.BUTTON_HOOK | 64 * s.BUTTON_USE | 128 * (s.movement_x < 0) | 256 * (s.movement_x > 0) | 512 * (s.movement_y < 0) | 1024 * (s.movement_y > 0))
-       #define PHYS_INPUT_BUTTON_ATCK(s)                       s.BUTTON_ATCK
-       #define PHYS_INPUT_BUTTON_JUMP(s)                       s.BUTTON_JUMP
-       #define PHYS_INPUT_BUTTON_ATCK2(s)                      s.BUTTON_ATCK2
-       #define PHYS_INPUT_BUTTON_ZOOM(s)                       s.BUTTON_ZOOM
-       #define PHYS_INPUT_BUTTON_CROUCH(s)                     s.BUTTON_CROUCH
-       #define PHYS_INPUT_BUTTON_HOOK(s)                       s.BUTTON_HOOK
-       #define PHYS_INPUT_BUTTON_USE(s)                        s.BUTTON_USE
-       #define PHYS_INPUT_BUTTON_BACKWARD(s)           (s.movement_x < 0)
-       #define PHYS_INPUT_BUTTON_FORWARD(s)            (s.movement_x > 0)
-       #define PHYS_INPUT_BUTTON_LEFT(s)                       (s.movement_y < 0)
-       #define PHYS_INPUT_BUTTON_RIGHT(s)                      (s.movement_y > 0)
-       #define PHYS_INPUT_BUTTON_JETPACK(s)            s.BUTTON_JETPACK
-
-       #define PHYS_DEAD(s)                                            s.deadflag != DEAD_NO
-
-       #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  autocvar_sv_gameplayfix_gravityunaffectedbyticrate
-       #define GAMEPLAYFIX_NOGRAVITYONGROUND                   cvar("sv_gameplayfix_nogravityonground")
-       #define GAMEPLAYFIX_Q2AIRACCELERATE                             autocvar_sv_gameplayfix_q2airaccelerate
-       #define GAMEPLAYFIX_EASIERWATERJUMP                             cvar("sv_gameplayfix_easierwaterjump")
-       #define GAMEPLAYFIX_DOWNTRACEONGROUND                   cvar("sv_gameplayfix_downtracesupportsongroundflag")
-       #define GAMEPLAYFIX_STEPMULTIPLETIMES                   cvar("sv_gameplayfix_stepmultipletimes")
-       #define GAMEPLAYFIX_UNSTICKPLAYERS                              cvar("sv_gameplayfix_unstickplayers")
-       #define GAMEPLAYFIX_STEPDOWN                                    cvar("sv_gameplayfix_stepdown")
-
-       #define IS_DUCKED(s)                                            s.crouch
-       #define SET_DUCKED(s)                                           s.crouch = true
-       #define UNSET_DUCKED(s)                                         s.crouch = false
-
-       #define IS_JUMP_HELD(s)                                         !(s.flags & FL_JUMPRELEASED)
-       #define SET_JUMP_HELD(s)                                        s.flags &= ~FL_JUMPRELEASED
-       #define UNSET_JUMP_HELD(s)                                      s.flags |= FL_JUMPRELEASED
-
-       #define IS_ONGROUND(s)                                          !!(s.flags & FL_ONGROUND)
-       #define SET_ONGROUND(s)                                         s.flags |= FL_ONGROUND
-       #define UNSET_ONGROUND(s)                                       s.flags &= ~FL_ONGROUND
-
-       #define WAS_ONGROUND(s)                                         !!((s).lastflags & FL_ONGROUND)
-
-       #define ITEMS_STAT(s)                                           s.items
-       #define BUFFS_STAT(s)                                           (s).buffs
-
-       #define PHYS_FROZEN(s)                                          s.frozen
-
-       #define PHYS_DOUBLEJUMP                                         autocvar_sv_doublejump
-
-       #define PHYS_BUGRIGS                                            g_bugrigs
-       #define PHYS_BUGRIGS_ANGLE_SMOOTHING            g_bugrigs_angle_smoothing
-       #define PHYS_BUGRIGS_PLANAR_MOVEMENT            g_bugrigs_planar_movement
-       #define PHYS_BUGRIGS_REVERSE_SPEEDING           g_bugrigs_reverse_speeding
-       #define PHYS_BUGRIGS_FRICTION_FLOOR                     g_bugrigs_friction_floor
-       #define PHYS_BUGRIGS_AIR_STEERING                       g_bugrigs_air_steering
-       #define PHYS_BUGRIGS_FRICTION_BRAKE                     g_bugrigs_friction_brake
-       #define PHYS_BUGRIGS_ACCEL                                      g_bugrigs_accel
-       #define PHYS_BUGRIGS_SPEED_REF                          g_bugrigs_speed_ref
-       #define PHYS_BUGRIGS_SPEED_POW                          g_bugrigs_speed_pow
-       #define PHYS_BUGRIGS_STEER                                      g_bugrigs_steer
-       #define PHYS_BUGRIGS_FRICTION_AIR                       g_bugrigs_friction_air
-       #define PHYS_BUGRIGS_CAR_JUMPING                        g_bugrigs_planar_movement_car_jumping
-       #define PHYS_BUGRIGS_REVERSE_SPINNING           g_bugrigs_reverse_spinning
-       #define PHYS_BUGRIGS_REVERSE_STOPPING           g_bugrigs_reverse_stopping
-
-       #define PHYS_JUMPSPEEDCAP_MIN                           autocvar_sv_jumpspeedcap_min
-       #define PHYS_JUMPSPEEDCAP_MAX                           autocvar_sv_jumpspeedcap_max
-       #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS       autocvar_sv_jumpspeedcap_max_disable_on_ramps
-
-       #define PHYS_CL_TRACK_CANJUMP(s)                        s.cvar_cl_movement_track_canjump
-       #define PHYS_TRACK_CANJUMP(s)                           s.stat_sv_track_canjump
-       #define PHYS_ACCELERATE                                         self.stat_sv_accelerate
-       #define PHYS_AIRACCEL_QW(s)                                     s.stat_sv_airaccel_qw
-       #define PHYS_AIRACCEL_QW_STRETCHFACTOR(s)       STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, s)
-       #define PHYS_AIRACCEL_SIDEWAYS_FRICTION         self.stat_sv_airaccel_sideways_friction
-       #define PHYS_AIRACCELERATE                                      self.stat_sv_airaccelerate
-       #define PHYS_AIRCONTROL                                         self.stat_sv_aircontrol
-       #define PHYS_AIRCONTROL_PENALTY                         STAT(MOVEVARS_AIRCONTROL_PENALTY, self)
-       #define PHYS_AIRCONTROL_POWER                           STAT(MOVEVARS_AIRCONTROL_POWER, self)
-       #define PHYS_AIRSPEEDLIMIT_NONQW(s)                     STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, s)
-       #define PHYS_AIRSTOPACCELERATE                          self.stat_sv_airstopaccelerate
-       #define PHYS_AIRSTRAFEACCEL_QW(s)                       STAT(MOVEVARS_AIRSTRAFEACCEL_QW, s)
-       #define PHYS_AIRSTRAFEACCELERATE(s)                     s.stat_sv_airstrafeaccelerate
-       #define PHYS_ENTGRAVITY(s)                                      s.gravity
-       #define PHYS_FRICTION                                           self.stat_sv_friction
-       #define PHYS_FRICTION_SLICK                                     autocvar_sv_friction_slick
-       #define PHYS_FRICTION_ONLAND                            autocvar_sv_friction_on_land
-       #define PHYS_GRAVITY                                            autocvar_sv_gravity
-       #define PHYS_HIGHSPEED                                          autocvar_g_movement_highspeed
-       #define PHYS_JUMPVELOCITY                                       self.stat_sv_jumpvelocity
-       #define PHYS_MAXAIRSPEED(s)                                     self.stat_sv_maxairspeed
-       #define PHYS_MAXAIRSTRAFESPEED                          self.stat_sv_maxairstrafespeed
-       #define PHYS_MAXSPEED(s)                                        s.stat_sv_maxspeed
-       #define PHYS_STEPHEIGHT                                         autocvar_sv_stepheight
-       #define PHYS_STOPSPEED                                          self.stat_sv_stopspeed
-       #define PHYS_WARSOWBUNNY_ACCEL                          self.stat_sv_warsowbunny_accel
-       #define PHYS_WARSOWBUNNY_BACKTOSIDERATIO        self.stat_sv_warsowbunny_backtosideratio
-       #define PHYS_WARSOWBUNNY_AIRFORWARDACCEL        self.stat_sv_warsowbunny_airforwardaccel
-       #define PHYS_WARSOWBUNNY_TOPSPEED                       self.stat_sv_warsowbunny_topspeed
-       #define PHYS_WARSOWBUNNY_TURNACCEL                      self.stat_sv_warsowbunny_turnaccel
-
-       #define PHYS_WALLFRICTION                                       cvar("sv_wallfriction")
-
-       #define PHYS_JETPACK_ACCEL_UP                           autocvar_g_jetpack_acceleration_up
-       #define PHYS_JETPACK_ACCEL_SIDE                         autocvar_g_jetpack_acceleration_side
-       #define PHYS_JETPACK_ANTIGRAVITY                        autocvar_g_jetpack_antigravity
-       #define PHYS_JETPACK_FUEL                                       autocvar_g_jetpack_fuel
-       #define PHYS_JETPACK_MAXSPEED_UP                        autocvar_g_jetpack_maxspeed_up
-       #define PHYS_JETPACK_MAXSPEED_SIDE                      autocvar_g_jetpack_maxspeed_side
-
-       #define PHYS_DODGING_FROZEN                                     autocvar_sv_dodging_frozen
-
-       #define PHYS_NOSTEP                                                     cvar("sv_nostep")
-       #define PHYS_JUMPSTEP                                           cvar("sv_jumpstep")
+       #define PHYS_GRAVITY(s)                     autocvar_sv_gravity
+
+       #define TICRATE sys_frametime
+
+       #define PHYS_INPUT_ANGLES(s)                ((s).v_angle)
+       #define PHYS_WORLD_ANGLES(s)                ((s).angles)
+
+       #define PHYS_INPUT_TIMELENGTH               frametime
+       #define PHYS_INPUT_FRAMETIME                sys_frametime
+
+       #define PHYS_INPUT_MOVEVALUES(s)            ((s).movement)
+
+       #define PHYS_INPUT_BUTTON_BUTTON1(s)        ((s).button0)
+       #define PHYS_INPUT_BUTTON_BUTTON2(s)        ((s).button2)
+       #define PHYS_INPUT_BUTTON_BUTTON3(s)        ((s).button3)
+       #define PHYS_INPUT_BUTTON_BUTTON4(s)        ((s).button4)
+       #define PHYS_INPUT_BUTTON_BUTTON5(s)        ((s).button5)
+       #define PHYS_INPUT_BUTTON_BUTTON6(s)        ((s).button6)
+       #define PHYS_INPUT_BUTTON_BUTTON7(s)        ((s).button7)
+       #define PHYS_INPUT_BUTTON_BUTTON8(s)        ((s).button8)
+       #define PHYS_INPUT_BUTTON_BUTTON_USE(s)     ((s).buttonuse)
+       #define PHYS_INPUT_BUTTON_BUTTON_CHAT(s)    ((s).buttonchat)
+       #define PHYS_INPUT_BUTTON_BUTTON_PRYDON(s)  ((s).cursor_active)
+       #define PHYS_INPUT_BUTTON_BUTTON9(s)        ((s).button9)
+       #define PHYS_INPUT_BUTTON_BUTTON10(s)       ((s).button10)
+       #define PHYS_INPUT_BUTTON_BUTTON11(s)       ((s).button11)
+       #define PHYS_INPUT_BUTTON_BUTTON12(s)       ((s).button12)
+       #define PHYS_INPUT_BUTTON_BUTTON13(s)       ((s).button13)
+       #define PHYS_INPUT_BUTTON_BUTTON14(s)       ((s).button14)
+       #define PHYS_INPUT_BUTTON_BUTTON15(s)       ((s).button15)
+       #define PHYS_INPUT_BUTTON_BUTTON16(s)       ((s).button16)
+
+       #define PHYS_DEAD(s)                        ((s).deadflag != DEAD_NO)
+
+       #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  autocvar_sv_gameplayfix_gravityunaffectedbyticrate
+       #define GAMEPLAYFIX_NOGRAVITYONGROUND           autocvar_sv_gameplayfix_nogravityonground
+       #define GAMEPLAYFIX_Q2AIRACCELERATE             autocvar_sv_gameplayfix_q2airaccelerate
+
+       #define IS_DUCKED(s)                        ((s).crouch)
+       #define SET_DUCKED(s)                       ((s).crouch = true)
+       #define UNSET_DUCKED(s)                     ((s).crouch = false)
+
+       #define PHYS_JUMPSPEEDCAP_MIN               autocvar_sv_jumpspeedcap_min
+       #define PHYS_JUMPSPEEDCAP_MAX               autocvar_sv_jumpspeedcap_max
+
+       #define PHYS_CL_TRACK_CANJUMP(s)            ((s).cvar_cl_movement_track_canjump)
+       #define PHYS_ENTGRAVITY(s)                  ((s).gravity)
 
 #endif
+
+REGISTER_NET_C2S(setpause)
+#ifdef CSQC
+void unpause_update()
+{
+       static bool waspaused;
+       bool ispaused = PHYS_INPUT_BUTTON_CHAT(this);
+       if (ispaused == waspaused) return;
+       waspaused = ispaused;
+       // if (!serverispaused) return; // TODO: find out somehow
+       if (ispaused) return; // ignore setting pause, server will get those presses anyway, but it won't get releases
+       int channel = MSG_C2S;
+       WriteHeader(channel, setpause);
+       WriteByte(channel, ispaused);
+}
+#endif
+#ifdef SVQC
+NET_HANDLE(setpause, bool)
+{
+       bool ispaused = boolean(ReadByte());
+       PHYS_INPUT_BUTTON_CHAT(sender) = ispaused;
+       return true;
+}
+#endif
+
 #endif