X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics.qh;h=66824bbcf6c24c3ee52eee80a231d663619dfd74;hb=92880db63bb3eae41f73b5d5a994614f595991e7;hp=24528caa4f727f8278659a75d3f82a49ea17f40b;hpb=117fa45380851579df9e6c465a207d733f6ca748;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/physics.qh b/qcsrc/common/physics.qh index 24528caa4..66824bbcf 100644 --- a/qcsrc/common/physics.qh +++ b/qcsrc/common/physics.qh @@ -12,7 +12,11 @@ .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,326 +28,283 @@ float AdjustAirAccelQW(float accelqw, float factor); bool IsFlying(entity a); +#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; - float PM_multijump_checkjump(); - void PM_multijump(); + noref float pmove_waterjumptime; + + const int FL_WATERJUMP = 2048; // player jumping out of water + const int FL_JUMPRELEASED = 4096; // for jump debouncing .float watertype; + .float waterlevel; .int items; .vector movement; .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; - float player_multijump; - float player_jumpheight; + #define PHYS_GRAVITY(s) STAT(MOVEVARS_GRAVITY, s) - #define PHYS_INPUT_ANGLES(s) input_angles + #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 & 2048) - - #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 getstati(STAT_GAMEPLAYFIX_EASIERWATERJUMP) - #define GAMEPLAYFIX_DOWNTRACEONGROUND getstati(STAT_GAMEPLAYFIX_DOWNTRACEONGROUND) - #define GAMEPLAYFIX_STEPMULTIPLETIMES getstati(STAT_GAMEPLAYFIX_STEPMULTIPLETIMES) - #define GAMEPLAYFIX_UNSTICKPLAYERS getstati(STAT_GAMEPLAYFIX_UNSTICKPLAYERS) - #define GAMEPLAYFIX_STEPDOWN getstati(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(s) (s).items - #define BUFFS(s) getstati(STAT_BUFFS) - - #define PHYS_AMMO_FUEL(s) getstati(STAT_FUEL) - - #define PHYS_FROZEN(s) getstati(STAT_FROZEN) - - #define PHYS_DOUBLEJUMP getstati(STAT_DOUBLEJUMP) - - #define PHYS_BUGRIGS getstati(STAT_BUGRIGS) - #define PHYS_BUGRIGS_ANGLE_SMOOTHING getstati(STAT_BUGRIGS_ANGLE_SMOOTHING) - #define PHYS_BUGRIGS_PLANAR_MOVEMENT getstati(STAT_BUGRIGS_PLANAR_MOVEMENT) - #define PHYS_BUGRIGS_REVERSE_SPEEDING getstati(STAT_BUGRIGS_REVERSE_SPEEDING) - #define PHYS_BUGRIGS_FRICTION_FLOOR getstatf(STAT_BUGRIGS_FRICTION_FLOOR) - #define PHYS_BUGRIGS_AIR_STEERING getstati(STAT_BUGRIGS_AIR_STEERING) - #define PHYS_BUGRIGS_FRICTION_BRAKE getstatf(STAT_BUGRIGS_FRICTION_BRAKE) - #define PHYS_BUGRIGS_ACCEL getstatf(STAT_BUGRIGS_ACCEL) - #define PHYS_BUGRIGS_SPEED_REF getstatf(STAT_BUGRIGS_SPEED_REF) - #define PHYS_BUGRIGS_SPEED_POW getstatf(STAT_BUGRIGS_SPEED_POW) - #define PHYS_BUGRIGS_STEER getstatf(STAT_BUGRIGS_STEER) - #define PHYS_BUGRIGS_FRICTION_AIR getstatf(STAT_BUGRIGS_FRICTION_AIR) - #define PHYS_BUGRIGS_CAR_JUMPING getstatf(STAT_BUGRIGS_CAR_JUMPING) - #define PHYS_BUGRIGS_REVERSE_SPINNING getstatf(STAT_BUGRIGS_REVERSE_SPINNING) - #define PHYS_BUGRIGS_REVERSE_STOPPING getstatf(STAT_BUGRIGS_REVERSE_STOPPING) - - #define PHYS_JUMPSPEEDCAP_MIN getstatf(STAT_MOVEVARS_JUMPSPEEDCAP_MIN) - #define PHYS_JUMPSPEEDCAP_MAX getstatf(STAT_MOVEVARS_JUMPSPEEDCAP_MAX) - #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS getstati(STAT_MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS) - - #define PHYS_TRACK_CANJUMP(s) getstati(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) getstatf(STAT_MOVEVARS_AIRACCEL_QW_STRETCHFACTOR) - #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 getstatf(STAT_MOVEVARS_AIRCONTROL_PENALTY) - #define PHYS_AIRCONTROL_POWER getstatf(STAT_MOVEVARS_AIRCONTROL_POWER) - #define PHYS_AIRSPEEDLIMIT_NONQW(s) getstatf(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW) - #define PHYS_AIRSTOPACCELERATE getstatf(STAT_MOVEVARS_AIRSTOPACCELERATE) - #define PHYS_AIRSTRAFEACCEL_QW(s) getstatf(STAT_MOVEVARS_AIRSTRAFEACCEL_QW) - #define PHYS_AIRSTRAFEACCELERATE getstatf(STAT_MOVEVARS_AIRSTRAFEACCELERATE) - #define PHYS_ENTGRAVITY(s) getstatf(STAT_MOVEVARS_ENTGRAVITY) - #define PHYS_FRICTION getstatf(STAT_MOVEVARS_FRICTION) - #define PHYS_FRICTION_SLICK getstatf(STAT_MOVEVARS_FRICTION_SLICK) - #define PHYS_FRICTION_ONLAND getstatf(STAT_MOVEVARS_FRICTION_ONLAND) - #define PHYS_GRAVITY getstatf(STAT_MOVEVARS_GRAVITY) - #define PHYS_HIGHSPEED getstatf(STAT_MOVEVARS_HIGHSPEED) - #define PHYS_JUMPVELOCITY getstatf(STAT_MOVEVARS_JUMPVELOCITY) - #define PHYS_MAXAIRSPEED getstatf(STAT_MOVEVARS_MAXAIRSPEED) - #define PHYS_MAXAIRSTRAFESPEED getstatf(STAT_MOVEVARS_MAXAIRSTRAFESPEED) - #define PHYS_MAXSPEED(s) getstatf(STAT_MOVEVARS_MAXSPEED) - #define PHYS_STEPHEIGHT getstatf(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 getstati(STAT_MOVEVARS_WALLFRICTION) - - #define PHYS_JETPACK_ACCEL_UP getstatf(STAT_JETPACK_ACCEL_UP) - #define PHYS_JETPACK_ACCEL_SIDE getstatf(STAT_JETPACK_ACCEL_SIDE) - #define PHYS_JETPACK_ANTIGRAVITY getstatf(STAT_JETPACK_ANTIGRAVITY) - #define PHYS_JETPACK_FUEL getstatf(STAT_JETPACK_FUEL) - #define PHYS_JETPACK_MAXSPEED_UP getstatf(STAT_JETPACK_MAXSPEED_UP) - #define PHYS_JETPACK_MAXSPEED_SIDE getstatf(STAT_JETPACK_MAXSPEED_SIDE) - - #define PHYS_DODGING_FROZEN getstati(STAT_DODGING_FROZEN) - - #define PHYS_NOSTEP getstati(STAT_NOSTEP) - #define PHYS_JUMPSTEP getstati(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) - .vector stat_pl_view_ofs; - .vector stat_pl_crouch_view_ofs; - - .vector stat_pl_min; - .vector stat_pl_max; - .vector stat_pl_crouch_min; - .vector stat_pl_crouch_max; - - .float stat_sv_airaccel_qw; - .float stat_sv_airstrafeaccel_qw; - .float stat_sv_airspeedlimit_nonqw; - .float stat_sv_maxspeed; - .float stat_movement_highspeed; - - .float stat_sv_friction_on_land; - .float stat_sv_friction_slick; - - .float stat_doublejump; - - .float stat_jumpspeedcap_min; - .float stat_jumpspeedcap_max; - .float stat_jumpspeedcap_disable_onramps; - - .float stat_jetpack_accel_side; - .float stat_jetpack_accel_up; - .float stat_jetpack_antigravity; - .float stat_jetpack_fuel; - .float stat_jetpack_maxspeed_up; - .float stat_jetpack_maxspeed_side; - .float stat_gameplayfix_easierwaterjump; - .float stat_gameplayfix_downtracesupportsongroundflag; - .float stat_gameplayfix_stepmultipletimes; - .float stat_gameplayfix_unstickplayers; - .float stat_gameplayfix_stepdown; - - .float stat_bugrigs; - .float stat_bugrigs_angle_smoothing; - .float stat_bugrigs_planar_movement; - .float stat_bugrigs_reverse_speeding; - .float stat_bugrigs_friction_floor; - .float stat_bugrigs_air_steering; - .float stat_bugrigs_friction_brake; - .float stat_bugrigs_accel; - .float stat_bugrigs_speed_ref; - .float stat_bugrigs_speed_pow; - .float stat_bugrigs_steer; - .float stat_bugrigs_friction_air; - .float stat_bugrigs_car_jumping; - .float stat_bugrigs_reverse_spinning; - .float stat_bugrigs_reverse_stopping; - - .float stat_nostep; - .float stat_jumpstep; - - #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(s) s.items - #define BUFFS(s) (s).buffs - - #define PHYS_AMMO_FUEL(s) s.ammo_fuel - - #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_TRACK_CANJUMP(s) s.cvar_cl_movement_track_canjump - #define PHYS_ACCELERATE autocvar_sv_accelerate - #define PHYS_AIRACCEL_QW(s) s.stat_sv_airaccel_qw - #define PHYS_AIRACCEL_QW_STRETCHFACTOR(s) autocvar_sv_airaccel_qw_stretchfactor - #define PHYS_AIRACCEL_SIDEWAYS_FRICTION autocvar_sv_airaccel_sideways_friction - #define PHYS_AIRACCELERATE autocvar_sv_airaccelerate - #define PHYS_AIRCONTROL autocvar_sv_aircontrol - #define PHYS_AIRCONTROL_PENALTY autocvar_sv_aircontrol_penalty - #define PHYS_AIRCONTROL_POWER autocvar_sv_aircontrol_power - #define PHYS_AIRSPEEDLIMIT_NONQW(s) s.stat_sv_airspeedlimit_nonqw - #define PHYS_AIRSTOPACCELERATE autocvar_sv_airstopaccelerate - #define PHYS_AIRSTRAFEACCEL_QW(s) s.stat_sv_airstrafeaccel_qw - #define PHYS_AIRSTRAFEACCELERATE autocvar_sv_airstrafeaccelerate - #define PHYS_ENTGRAVITY(s) s.gravity - #define PHYS_FRICTION autocvar_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 autocvar_sv_jumpvelocity - #define PHYS_MAXAIRSPEED autocvar_sv_maxairspeed - #define PHYS_MAXAIRSTRAFESPEED autocvar_sv_maxairstrafespeed - #define PHYS_MAXSPEED(s) s.stat_sv_maxspeed - #define PHYS_STEPHEIGHT autocvar_sv_stepheight - #define PHYS_STOPSPEED autocvar_sv_stopspeed - #define PHYS_WARSOWBUNNY_ACCEL autocvar_sv_warsowbunny_accel - #define PHYS_WARSOWBUNNY_BACKTOSIDERATIO autocvar_sv_warsowbunny_backtosideratio - #define PHYS_WARSOWBUNNY_AIRFORWARDACCEL autocvar_sv_warsowbunny_airforwardaccel - #define PHYS_WARSOWBUNNY_TOPSPEED autocvar_sv_warsowbunny_topspeed - #define PHYS_WARSOWBUNNY_TURNACCEL autocvar_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") + bool Physics_Valid(string thecvar); + + .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; + + #define PHYS_TELEPORT_TIME(s) ((s).teleport_time) + + #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