#ifndef COMMON_PHYSICS_H #define COMMON_PHYSICS_H // Client/server mappings .entity conveyor; .float race_penalty; .float gravity; .float swamp_slowdown; .float lastflags; .float lastground; .float wasFlying; .float spectatorspeed; .vector movement_old; .float buttons_old; .vector v_angle_old; .string lastclassname; .float() PlayerPhysplug; float AdjustAirAccelQW(float accelqw, float factor); bool IsFlying(entity a); #define BUFFS_STAT(s) STAT(BUFFS, s) #define GAMEPLAYFIX_DOWNTRACEONGROUND STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, this) #define GAMEPLAYFIX_EASIERWATERJUMP STAT(GAMEPLAYFIX_EASIERWATERJUMP, this) #define GAMEPLAYFIX_STEPDOWN STAT(GAMEPLAYFIX_STEPDOWN, this) #define GAMEPLAYFIX_STEPMULTIPLETIMES STAT(GAMEPLAYFIX_STEPMULTIPLETIMES, this) #define GAMEPLAYFIX_UNSTICKPLAYERS STAT(GAMEPLAYFIX_UNSTICKPLAYERS, this) #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 STAT(DODGING_FROZEN, this) #define PHYS_FRICTION(s) STAT(MOVEVARS_FRICTION, s) #define PHYS_FRICTION_ONLAND STAT(MOVEVARS_FRICTION_ONLAND, this) #define PHYS_FRICTION_SLICK STAT(MOVEVARS_FRICTION_SLICK, this) #define PHYS_FROZEN(s) STAT(FROZEN, s) #define PHYS_GRAVITY(s) STAT(MOVEVARS_GRAVITY, s) #define PHYS_HIGHSPEED STAT(MOVEVARS_HIGHSPEED, this) #define PHYS_JETPACK_ACCEL_SIDE STAT(JETPACK_ACCEL_SIDE, this) #define PHYS_JETPACK_ACCEL_UP STAT(JETPACK_ACCEL_UP, this) #define PHYS_JETPACK_ANTIGRAVITY STAT(JETPACK_ANTIGRAVITY, this) #define PHYS_JETPACK_FUEL STAT(JETPACK_FUEL, this) #define PHYS_JETPACK_MAXSPEED_SIDE STAT(JETPACK_MAXSPEED_SIDE, this) #define PHYS_JETPACK_MAXSPEED_UP STAT(JETPACK_MAXSPEED_UP, this) #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS, this) #define PHYS_JUMPSTEP STAT(MOVEVARS_JUMPSTEP, this) #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 STAT(NOSTEP, this) #define PHYS_STEPHEIGHT STAT(MOVEVARS_STEPHEIGHT, this) #define PHYS_STOPSPEED(s) STAT(MOVEVARS_STOPSPEED, s) #define PHYS_TRACK_CANJUMP(s) STAT(MOVEVARS_TRACK_CANJUMP, s) #define PHYS_WALLFRICTION STAT(MOVEVARS_WALLFRICTION, this) #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 STAT(GAMEPLAYFIX_UPVELOCITYCLEARSONGROUND, this) #ifdef CSQC 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 //float player_multijump; //float player_jumpheight; #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 | BIT(7) * (input_movevalues.x < 0) | BIT(8) * (input_movevalues.x > 0) | BIT(9) * (input_movevalues.y < 0) | BIT(10) * (input_movevalues.y > 0)) #define PHYS_INPUT_BUTTON_ATCK(s) boolean(input_buttons & BIT(0)) #define PHYS_INPUT_BUTTON_JUMP(s) boolean(input_buttons & BIT(1)) #define PHYS_INPUT_BUTTON_ATCK2(s) boolean(input_buttons & BIT(2)) #define PHYS_INPUT_BUTTON_ZOOM(s) boolean(input_buttons & BIT(3)) #define PHYS_INPUT_BUTTON_CROUCH(s) boolean(input_buttons & BIT(4)) #define PHYS_INPUT_BUTTON_HOOK(s) boolean(input_buttons & BIT(5)) #define PHYS_INPUT_BUTTON_USE(s) boolean(input_buttons & BIT(6)) #define PHYS_INPUT_BUTTON_BACKWARD(s) boolean(input_buttons & BIT(7)) #define PHYS_INPUT_BUTTON_FORWARD(s) boolean(input_buttons & BIT(8)) #define PHYS_INPUT_BUTTON_LEFT(s) boolean(input_buttons & BIT(9)) #define PHYS_INPUT_BUTTON_RIGHT(s) boolean(input_buttons & BIT(10)) #define PHYS_INPUT_BUTTON_JETPACK(s) boolean(input_buttons & BIT(12)) #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 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 #define PHYS_JUMPSPEEDCAP_MIN cvar_string("cl_jumpspeedcap_min") #define PHYS_JUMPSPEEDCAP_MAX cvar_string("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); .float stat_sv_airspeedlimit_nonqw = _STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW); .float stat_sv_maxspeed = _STAT(MOVEVARS_MAXSPEED); /** Not real stats */ .string stat_jumpspeedcap_min, stat_jumpspeedcap_max; #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 // 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 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 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 #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 #endif