diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 4dd5c9d..0ad8072 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -1182,6 +1182,10 @@ extern vmCvar_t cg_singlePlayerActive; extern vmCvar_t cg_recordSPDemo; extern vmCvar_t cg_recordSPDemoName; extern vmCvar_t cg_obeliskRespawnDelay; +extern vmCvar_t pmove_AutoHop; +extern vmCvar_t pmove_JumpVelocity; +extern vmCvar_t pmove_JumpTimeDeltaMin; +extern vmCvar_t cg_autoHop; #endif // diff --git a/code/cgame/cg_main.c b/code/cgame/cg_main.c index aa9ec27..dd57817 100644 --- a/code/cgame/cg_main.c +++ b/code/cgame/cg_main.c @@ -195,6 +195,10 @@ vmCvar_t cg_singlePlayerActive; vmCvar_t cg_recordSPDemo; vmCvar_t cg_recordSPDemoName; vmCvar_t cg_obeliskRespawnDelay; +vmCvar_t pmove_AutoHop; +vmCvar_t pmove_JumpVelocity; +vmCvar_t pmove_JumpTimeDeltaMin; +vmCvar_t cg_autoHop; #endif typedef struct { @@ -314,8 +318,14 @@ static cvarTable_t cvarTable[] = { // bk001129 { &cg_oldRail, "cg_oldRail", "1", CVAR_ARCHIVE}, { &cg_oldRocket, "cg_oldRocket", "1", CVAR_ARCHIVE}, { &cg_oldPlasma, "cg_oldPlasma", "1", CVAR_ARCHIVE}, - { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE} + { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE}, // { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE } +#ifdef MISSIONPACK + { &pmove_AutoHop, "pmove_AutoHop", "0", 0 }, + { &pmove_JumpVelocity, "pmove_JumpVelocity", "270.0", 0 }, + { &pmove_JumpTimeDeltaMin, "pmove_JumpTimeDeltaMin", "100.0", 0 }, + { &cg_autoHop, "cg_autoHop", "1", CVAR_USERINFO | CVAR_ARCHIVE } +#endif }; static int cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] ); diff --git a/code/cgame/cg_marks.c b/code/cgame/cg_marks.c index 4c648d2..5bd9080 100644 --- a/code/cgame/cg_marks.c +++ b/code/cgame/cg_marks.c @@ -153,7 +153,9 @@ void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, //} // create the texture axis - VectorNormalize2( dir, axis[0] ); + if ( VectorNormalize2( dir, axis[0] ) == 0.0f ) { + return; // degenerate dir (e.g. zero plane normal from a grazing trace) + } PerpendicularVector( axis[1], axis[0] ); RotatePointAroundVector( axis[2], axis[0], axis[1], orientation ); CrossProduct( axis[0], axis[2], axis[1] ); diff --git a/code/game/bg_misc.c b/code/game/bg_misc.c index f729f06..6e29496 100644 --- a/code/game/bg_misc.c +++ b/code/game/bg_misc.c @@ -1229,7 +1229,7 @@ void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) result[2] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... break; default: - Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trTime ); + Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trType ); break; } } diff --git a/code/game/bg_pmove.c b/code/game/bg_pmove.c index 3711869..7f989f8 100644 --- a/code/game/bg_pmove.c +++ b/code/game/bg_pmove.c @@ -357,8 +357,14 @@ PM_CheckJump ============= */ static qboolean PM_CheckJump( void ) { - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { - return qfalse; // don't allow jump until all buttons are up +#ifdef MISSIONPACK + // PMF_RESPAWNED blocks jumps except when autohop is enabled and player opted in + if ( !( pmove_AutoHop.integer && !( pm->ps->pm_flags & PMF_AUTOHOP_HELD ) ) ) +#endif + { + if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + return qfalse; // don't allow jump until all buttons are up + } } if ( pm->cmd.upmove < 10 ) { @@ -366,19 +372,36 @@ static qboolean PM_CheckJump( void ) { return qfalse; } - // must wait for jump to be released - if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { - // clear upmove so cmdscale doesn't lower running speed - pm->cmd.upmove = 0; +#ifdef MISSIONPACK + // Rate-limit all jumps by JumpTimeDeltaMin (autohop and vanilla alike) + if ( pmove_JumpTimeDeltaMin.value > 0.0f && pm->ps->lastJumpTime > 0 && + (float)( pm->cmd.serverTime - pm->ps->lastJumpTime ) < pmove_JumpTimeDeltaMin.value ) { return qfalse; } + // Vanilla JUMP_HELD check: only when not in autohop opted-in mode + if ( !( pmove_AutoHop.integer && !( pm->ps->pm_flags & PMF_AUTOHOP_HELD ) ) ) +#endif + { + // Vanilla: must release jump between jumps. + if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { + // clear upmove so cmdscale doesn't lower running speed + pm->cmd.upmove = 0; + return qfalse; + } + } + pml.groundPlane = qfalse; // jumping away pml.walking = qfalse; pm->ps->pm_flags |= PMF_JUMP_HELD; pm->ps->groundEntityNum = ENTITYNUM_NONE; +#ifdef MISSIONPACK + pm->ps->velocity[2] = pmove_JumpVelocity.value; + pm->ps->lastJumpTime = pm->cmd.serverTime; +#else pm->ps->velocity[2] = JUMP_VELOCITY; +#endif PM_AddEvent( EV_JUMP ); if ( pm->cmd.forwardmove >= 0 ) { diff --git a/code/game/bg_public.h b/code/game/bg_public.h index 0214949..2ebda9c 100644 --- a/code/game/bg_public.h +++ b/code/game/bg_public.h @@ -749,3 +749,9 @@ qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTim #define KAMI_BOOMSPHERE_MAXRADIUS 720 #define KAMI_SHOCKWAVE2_MAXRADIUS 704 +#ifdef MISSIONPACK +extern vmCvar_t pmove_AutoHop; +extern vmCvar_t pmove_JumpVelocity; +extern vmCvar_t pmove_JumpTimeDeltaMin; +#endif + diff --git a/code/game/g_client.c b/code/game/g_client.c index 5a584d4..040ccf2 100644 --- a/code/game/g_client.c +++ b/code/game/g_client.c @@ -734,6 +734,21 @@ void ClientUserinfoChanged( int clientNum ) { client->pers.predictItemPickup = qtrue; } +#ifdef MISSIONPACK + // AutoHop: per-player opt-out via cg_autoHop 0 in userinfo. + // PMF_AUTOHOP_HELD set = vanilla jump-held behaviour for this client. + if ( pmove_AutoHop.integer ) { + s = Info_ValueForKey( userinfo, "cg_autoHop" ); + if ( atoi( s ) ) { + client->ps.pm_flags &= ~PMF_AUTOHOP_HELD; + } else { + client->ps.pm_flags |= PMF_AUTOHOP_HELD; + } + } else { + client->ps.pm_flags &= ~PMF_AUTOHOP_HELD; + } +#endif + // set name Q_strncpyz ( oldname, client->pers.netname, sizeof( oldname ) ); s = Info_ValueForKey (userinfo, "name"); @@ -1063,6 +1078,7 @@ void ClientSpawn(gentity_t *ent) { int accuracy_hits, accuracy_shots; int eventSequence; char userinfo[MAX_INFO_STRING]; + char *s; index = ent - g_entities; client = ent->client; @@ -1196,6 +1212,19 @@ void ClientSpawn(gentity_t *ent) { // the respawned flag will be cleared after the attack and jump keys come up client->ps.pm_flags |= PMF_RESPAWNED; +#ifdef MISSIONPACK + // AutoHop: initialise per-player opt-out from userinfo (read above). + // lastJumpTime is already 0 from the memset; just set the hold flag. + if ( pmove_AutoHop.integer ) { + s = Info_ValueForKey( userinfo, "cg_autoHop" ); + if ( atoi( s ) ) { + client->ps.pm_flags &= ~PMF_AUTOHOP_HELD; + } else { + client->ps.pm_flags |= PMF_AUTOHOP_HELD; + } + } +#endif + trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd ); SetClientViewAngle( ent, spawn_angles ); diff --git a/code/game/q_shared.h b/code/game/q_shared.h index eed5689..9d0c406 100644 --- a/code/game/q_shared.h +++ b/code/game/q_shared.h @@ -1212,6 +1212,9 @@ typedef struct playerState_s { int pmove_framecount; // FIXME: don't transmit over the network int jumppad_frame; int entityEventSequence; +#ifdef MISSIONPACK + int lastJumpTime; // commandTime of the last jump, for pmove_JumpTimeDeltaMin +#endif } playerState_t; diff --git a/code/qcommon/msg.c b/code/qcommon/msg.c index 27891cc..527ea32 100644 --- a/code/qcommon/msg.c +++ b/code/qcommon/msg.c @@ -1119,7 +1119,7 @@ netField_t playerStateFields[] = { PSF(events[0]), 8 }, { PSF(legsAnim), 8 }, { PSF(events[1]), 8 }, -{ PSF(pm_flags), 16 }, +{ PSF(pm_flags), 21 }, // QL: highest flag is PMF_JUMP_SCALE (0x100000 = bit 20) { PSF(groundEntityNum), GENTITYNUM_BITS }, { PSF(weaponstate), 4 }, { PSF(eFlags), 16 }, diff --git a/code/quake3.vcxproj b/code/quake3.vcxproj index d306c62..66424fe 100644 --- a/code/quake3.vcxproj +++ b/code/quake3.vcxproj @@ -1,10 +1,6 @@ - - Debug TA DEMO - Win32 - Debug TA Win32 @@ -13,10 +9,6 @@ Debug Win32 - - Release TA DEMO - Win32 - Release TA Win32 @@ -25,10 +17,6 @@ Release Win32 - - vector - Win32 - 17.0 @@ -44,26 +32,11 @@ v143 false - - Application - v143 - false - - - Application - v143 - false - Application v143 false - - Application - v143 - false - Application v143 @@ -80,18 +53,9 @@ - - - - - - - - - @@ -112,26 +76,11 @@ .\Debug\ true - - .\quake3___Win32_Release_TA_DEMO\ - .\quake3___Win32_Release_TA_DEMO\ - false - .\Release\ .\Release\ false - - .\quake3___Win32_Debug_TA_DEMO\ - .\quake3___Win32_Debug_TA_DEMO\ - true - - - .\quake3___Win32_vector0\ - .\quake3___Win32_vector0\ - false - .\Debug_TA\ .\Debug_TA\ @@ -146,7 +95,7 @@ MaxSpeed AnySuitable - _WIN32;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + _WIN32;WIN32;NDEBUG;_WINDOWS;MISSIONPACK;%(PreprocessorDefinitions) true MultiThreaded true @@ -233,48 +182,6 @@ win32\winquake.res - - - MaxSpeed - AnySuitable - _WIN32;WIN32;NDEBUG;_WINDOWS;PRE_RELEASE_TADEMO;PRE_RELEASE_DEMO;%(PreprocessorDefinitions) - true - MultiThreaded - true - - .\quake3___Win32_Release_TA_DEMO/quake3.pch - .\quake3___Win32_Release_TA_DEMO/ - .\quake3___Win32_Release_TA_DEMO/ - .\quake3___Win32_Release_TA_DEMO/ - Level4 - true - OldStyle - - - dinput8.lib;winmm.lib;wsock32.lib;%(AdditionalDependencies) - .\quake3___Win32_Release_TA_DEMO/quake3.exe - true - true - Release_TA/quake3.pdb - true - Release_TA/quake3.map - Windows - 8388608 - MachineX86 - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\quake3___Win32_Release_TA_DEMO/quake3.tlb - - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - MaxSpeed @@ -316,95 +223,10 @@ 0x0409 - - - Disabled - WIN32;_DEBUG;_WINDOWS;PRE_RELEASE_TADEMO;PRE_RELEASE_DEMO;%(PreprocessorDefinitions) - MultiThreadedDebug - - .\quake3___Win32_Debug_TA_DEMO/quake3.pch - .\quake3___Win32_Debug_TA_DEMO/ - .\quake3___Win32_Debug_TA_DEMO/ - .\quake3___Win32_Debug_TA_DEMO/ - true - .\quake3___Win32_Debug_TA_DEMO/ - Level3 - true - EditAndContinue - - - dinput8.lib;winmm.lib;wsock32.lib;%(AdditionalDependencies) - .\quake3___Win32_Debug_TA_DEMO/quake3.exe - true - true - .\quake3___Win32_Debug_TA_DEMO/quake3.pdb - true - Debug_TA/quake3.map - Windows - 8388608 - MachineX86 - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\quake3___Win32_Debug_TA_DEMO/quake3.tlb - - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - win32\winquake.res - - - - - /vec /vec:stats /vec:pii /vec:o10 /vec:yes %(AdditionalOptions) - MaxSpeed - AnySuitable - _WIN32;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - .\quake3___Win32_vector0/quake3.pch - .\quake3___Win32_vector0/ - .\quake3___Win32_vector0/ - .\quake3___Win32_vector0/ - Level4 - true - ProgramDatabase - - - dinput8.lib;winmm.lib;wsock32.lib;%(AdditionalDependencies) - .\quake3___Win32_vector0/quake3.exe - true - true - Release_TA/quake3.pdb - true - Release_TA/quake3.map - Windows - 8388608 - MachineX86 - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\quake3___Win32_vector0/quake3.tlb - - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;MISSIONPACK;%(PreprocessorDefinitions) MultiThreadedDebug .\Debug_TA/quake3.pch @@ -449,654 +271,454 @@ - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed - Disabled - true Disabled true Disabled true - MaxSpeed MaxSpeed true MaxSpeed - MaxSpeed @@ -1137,13 +759,10 @@ - win32;%(AdditionalIncludeDirectories) win32;%(AdditionalIncludeDirectories) win32;%(AdditionalIncludeDirectories) - win32;%(AdditionalIncludeDirectories) win32;%(AdditionalIncludeDirectories) win32;%(AdditionalIncludeDirectories) - win32;%(AdditionalIncludeDirectories)