Misc prediction fixes
This commit is contained in:
parent
ff7e6b6c41
commit
d1ad1b13bf
17 changed files with 135 additions and 77 deletions
|
@ -162,6 +162,7 @@ string HUD_GetChatColorHEX( float fTeam );
|
|||
|
||||
// This actually belongs in Builtins.h since its an undocumented global
|
||||
.float maxframe;
|
||||
float clframetime;
|
||||
|
||||
// For the player entity
|
||||
.entity eGunModel;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#define CHAT_LINES 5
|
||||
#define CHAT_LINES 5
|
||||
#define CHAT_TIME 20
|
||||
var int iLineScroll = 0;
|
||||
|
||||
|
@ -125,7 +125,7 @@ void CSQC_DrawCenterprint( void ) {
|
|||
}
|
||||
}
|
||||
|
||||
vCenterPrintPos_y = vVideoMins_y + ( vVideoResolution_y / 2 ) - ( fCenterPrintLines - 4 );
|
||||
vCenterPrintPos_y = vVideoMins_y + ( vVideoResolution_y / 2 ) - ( fCenterPrintLines - 4 ) - 69;
|
||||
|
||||
for ( int i = 0; i < ( fCenterPrintLines ); i++ ) {
|
||||
vCenterPrintPos_x = vVideoMins_x + ( vVideoResolution_x / 2 ) - ( stringwidth( sCenterPrintBuffer[ i ], TRUE, '12 12' ) / 2 );
|
||||
|
@ -269,6 +269,7 @@ void CSQC_UpdateView( float fWinWidth, float fWinHeight, float fGameFocus ) {
|
|||
setproperty( VF_ACTIVESEAT, (float)s );
|
||||
|
||||
CSQC_CalcViewport( s, fWinWidth, fWinHeight );
|
||||
Fade_Update ( vVideoMins[0],vVideoMins[1], fWinWidth, fWinHeight );
|
||||
View_DropPunchAngle();
|
||||
Nightvision_PostDraw();
|
||||
|
||||
|
|
|
@ -65,10 +65,8 @@ void CSQC_Ent_Update( float flIsNew ) {
|
|||
self.predraw = Player_PreDraw;
|
||||
self.drawmask = MASK_ENGINE;
|
||||
self.pmove_frame = servercommandframe;
|
||||
} else {
|
||||
Player_PreUpdate();
|
||||
}
|
||||
|
||||
|
||||
self.modelindex = readbyte();
|
||||
self.origin_x = readcoord();
|
||||
self.origin_y = readcoord();
|
||||
|
@ -82,8 +80,6 @@ void CSQC_Ent_Update( float flIsNew ) {
|
|||
self.flags = readfloat();
|
||||
self.weapon = readbyte();
|
||||
|
||||
Player_PostUpdate();
|
||||
|
||||
if ( self.flags & FL_CROUCHING ) {
|
||||
setsize( self, VEC_CHULL_MIN, VEC_CHULL_MAX );
|
||||
} else {
|
||||
|
@ -140,7 +136,7 @@ void CSQC_Ent_Update( float flIsNew ) {
|
|||
self.classname = readstring();
|
||||
self.size = drawgetimagesize(self.classname);
|
||||
|
||||
if (serverkeyfloat("*bspversion") != 30) {
|
||||
if (serverkeyfloat("*bspversion") == 30) {
|
||||
decalname = sprintf("decal_%s", self.classname);
|
||||
decalshader = sprintf("{\npolygonOffset\n{\nclampmap %s\nblendFunc filter\n}\n}", self.classname);
|
||||
shaderforname(decalname, decalshader);
|
||||
|
|
|
@ -632,6 +632,8 @@ void CSQC_Parse_Event( void ) {
|
|||
CSQC_Parse_Print( sprintf( "%s%s^xF80: %s", HUD_GetChatColorHEXTeam( fTeam2 ), getplayerkeyvalue( fSender2, "name" ), sMessage2 ), PRINT_CHAT );
|
||||
} else if ( fHeader == EV_CHAT_VOX ) {
|
||||
Sound_PlayVOX( readstring() );
|
||||
} else if (fHeader == EV_FADE) {
|
||||
Fade_Parse();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -200,6 +200,10 @@ void HUD_DrawTimer(void) {
|
|||
int iMinutes, iSeconds, iTens, iUnits;
|
||||
vector vTimePos = vVideoMins+[(vVideoResolution[0] / 2) - 62, vVideoResolution[1] - 42];
|
||||
|
||||
if (getstatf(STAT_GAMETIME) == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
iMinutes = getstatf(STAT_GAMETIME) / 60;
|
||||
iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes;
|
||||
iTens = iSeconds / 10;
|
||||
|
@ -336,6 +340,9 @@ void HUD_DrawAmmo(void) {
|
|||
static vector vAmmoMagPos;
|
||||
static vector vAmmoCalPos;
|
||||
|
||||
if (getstatf(STAT_ACTIVEWEAPON) == 0) {
|
||||
return;
|
||||
}
|
||||
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -119,6 +119,7 @@ void CSQC_Init(float apilevel, string enginename, float engineversion) {
|
|||
CSQC_ConsoleCommand_Init();
|
||||
CSQC_VGUI_Init();
|
||||
Overview_Init();
|
||||
Fade_Init();
|
||||
|
||||
pSeat.iOverview = FALSE;
|
||||
}
|
||||
|
|
|
@ -24,6 +24,10 @@
|
|||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
void Player_PreUpdate( void );
|
||||
void Player_PostUpdate( void );
|
||||
|
||||
.float pmove_frame;
|
||||
|
||||
.vector netorigin;
|
||||
|
@ -78,6 +82,22 @@ static float Player_Gun_PreDraw (void)
|
|||
return PREDRAW_NEXT;
|
||||
}
|
||||
|
||||
void Player_Gun_Offset(void)
|
||||
{
|
||||
vector v1, v2;
|
||||
self.eGunModel.angles = self.angles; // Set it to something consistent
|
||||
gettaginfo( self, self.fWeaponBoneID ); // Updates the v_ globals for the player hand bone angle
|
||||
v1 = vectoangles( v_right, v_up ); // Create angles from the v_ matrix
|
||||
gettaginfo( self.eGunModel, self.eGunModel.fWeaponBoneID ); // Updates the v_ globals for the weapon hand bone angle
|
||||
v2 = vectoangles( v_right, v_up );
|
||||
self.eGunModel.angles = self.angles + ( v1 - v2 ); // The difference is applied
|
||||
|
||||
// Fix the origin
|
||||
setorigin( self.eGunModel, self.origin ); // Set it to something consistent
|
||||
vector vOffset = gettaginfo( self.eGunModel, self.eGunModel.fWeaponBoneID ) - gettaginfo( self, self.fWeaponBoneID );
|
||||
setorigin( self.eGunModel, self.origin - vOffset );
|
||||
}
|
||||
|
||||
void Player_Draw ( void )
|
||||
{
|
||||
if ( !self.eGunModel ) {
|
||||
|
@ -113,17 +133,46 @@ void Player_Draw ( void )
|
|||
print( sprintf( "fDirection: %d\n", fDirection ) );
|
||||
|
||||
if ( fDirection < 0 ) {
|
||||
self.baseframe1time -= frametime;
|
||||
self.baseframe2time -= frametime;
|
||||
self.frame2time -= frametime;
|
||||
self.frame1time -= frametime;
|
||||
self.baseframe1time -= clframetime;
|
||||
self.baseframe2time -= clframetime;
|
||||
self.frame2time -= clframetime;
|
||||
self.frame1time -= clframetime;
|
||||
} else {*/
|
||||
self.baseframe1time += frametime;
|
||||
self.baseframe2time += frametime;
|
||||
self.frame2time += frametime;
|
||||
self.frame1time += frametime;
|
||||
self.baseframe1time += clframetime;
|
||||
self.baseframe2time += clframetime;
|
||||
self.frame2time += clframetime;
|
||||
self.frame1time += clframetime;
|
||||
/*}*/
|
||||
self.bonecontrol5 = stof( getplayerkeyvalue( player_localnum, INFOKEY_P_VOIPLOUDNESS ) );
|
||||
self.bonecontrol5 = getplayerkeyfloat( self.entnum - 1, "voiploudness" );
|
||||
|
||||
makevectors( [ 0, self.angles[1], 0 ] );
|
||||
float fCorrect = dotproduct(self.velocity, v_right);
|
||||
|
||||
float a, s;
|
||||
if (self.velocity[0] == 0 && self.velocity[1] == 0) {
|
||||
a = 0;
|
||||
s = 0;
|
||||
} else {
|
||||
a = self.angles[1] - vectoyaw(self.velocity);
|
||||
s = vlen(self.velocity);
|
||||
if (s < 100) {
|
||||
a *= s/100;
|
||||
}
|
||||
}
|
||||
s /= 400;
|
||||
if (a < -180)
|
||||
a += 360;
|
||||
if (a > 180)
|
||||
a -= 360;
|
||||
|
||||
if (a > 120)
|
||||
a = 120;
|
||||
if (a < -120)
|
||||
a = -120;
|
||||
//self.bonecontrol1 = self.bonecontrol2 = self.bonecontrol3 = self.bonecontrol4 = (a)/150;///4;
|
||||
self.angles[1] -= a;
|
||||
self.angles[0] = 0;
|
||||
self.subblendfrac = (a)/-120;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -137,6 +186,7 @@ Responsible for player appearance/interpolation.
|
|||
float Player_PreDraw( void )
|
||||
{
|
||||
Player_Draw();
|
||||
Player_Gun_Offset();
|
||||
addentity( self );
|
||||
return PREDRAW_NEXT;
|
||||
}
|
||||
|
@ -151,40 +201,23 @@ Responsible for local player prediction.
|
|||
*/
|
||||
void Player_Predict( void )
|
||||
{
|
||||
vector vOldOrigin = self.origin = self.netorigin;
|
||||
vector vOldAngles = self.angles = self.netangles;
|
||||
vector vOldVelocity = self.velocity = self.netvelocity;
|
||||
float fOldPMoveFlags = self.pmove_flags = self.netpmove_flags;
|
||||
|
||||
// Don't predict if we're frozen/paused FIXME: FTE doesn't have serverkey_float yet!
|
||||
if ( serverkey( SERVERKEY_PAUSESTATE ) == "1" || ( ( getstati( STAT_GAMESTATE ) == GAME_FREEZE ) && ( getstati( STAT_HEALTH ) > 0 ) ) ) {
|
||||
pSeat->vPlayerOrigin = self.origin;
|
||||
vOldOrigin = pSeat->vPlayerOrigin;
|
||||
self.netorigin = pSeat->vPlayerOrigin;
|
||||
|
||||
self.velocity = '0 0 0';
|
||||
vOldVelocity = self.velocity;
|
||||
fOldPMoveFlags = 0;
|
||||
self.netvelocity = self.velocity;
|
||||
self.netpmove_flags = 0;
|
||||
} else {
|
||||
if ( getplayerkeyvalue( player_localnum, "*spec" ) == "0" ) {
|
||||
self.movetype = MOVETYPE_WALK;
|
||||
} else {
|
||||
self.movetype = MOVETYPE_NOCLIP;
|
||||
}
|
||||
|
||||
for ( int i = self.pmove_frame; i <= clientcommandframe; i++ ) {
|
||||
if ( input_timelength == 0 ) {
|
||||
break;
|
||||
}
|
||||
getinputstate( i );
|
||||
QPhysics_Run( self );
|
||||
}
|
||||
Player_PreUpdate();
|
||||
}
|
||||
|
||||
|
||||
if ( autocvar_cl_smoothstairs && self.flags & FL_ONGROUND ) {
|
||||
pSeat->vPlayerOriginOld = pSeat->vPlayerOrigin;
|
||||
|
||||
if ( ( self.jumptime <= 0 ) && ( self.origin_z - pSeat->vPlayerOriginOld.z > 0 ) ) {
|
||||
pSeat->vPlayerOriginOld.z += frametime * 150;
|
||||
pSeat->vPlayerOriginOld.z += clframetime * 150;
|
||||
|
||||
if ( pSeat->vPlayerOriginOld.z > self.origin_z ) {
|
||||
pSeat->vPlayerOriginOld.z = self.origin_z;
|
||||
|
@ -193,16 +226,6 @@ void Player_Predict( void )
|
|||
pSeat->vPlayerOriginOld.z = self.origin_z - 18;
|
||||
}
|
||||
pSeat->vPlayerOrigin.z += pSeat->vPlayerOriginOld.z - self.origin_z;
|
||||
} else if ( ( self.jumptime <= 0 ) && ( self.origin_z - pSeat->vPlayerOriginOld.z < 0 ) ) {
|
||||
pSeat->vPlayerOriginOld.z -= frametime * 250;
|
||||
|
||||
if ( pSeat->vPlayerOriginOld.z < self.origin_z ) {
|
||||
pSeat->vPlayerOriginOld.z = self.origin_z;
|
||||
}
|
||||
if ( self.origin_z - pSeat->vPlayerOriginOld.z > 18 ) {
|
||||
pSeat->vPlayerOriginOld.z = self.origin_z - 18;
|
||||
}
|
||||
pSeat->vPlayerOrigin.z -= pSeat->vPlayerOriginOld.z - self.origin_z;
|
||||
} else {
|
||||
pSeat->vPlayerOriginOld.z = self.origin_z;
|
||||
}
|
||||
|
@ -211,9 +234,10 @@ void Player_Predict( void )
|
|||
pSeat->vPlayerOrigin = [ self.origin_x, self.origin_y, pSeat->vPlayerOriginOld.z ];
|
||||
} else {
|
||||
pSeat->vPlayerOrigin = self.origin;
|
||||
pSeat->vPlayerVelocity = self.velocity;
|
||||
}
|
||||
|
||||
self.movetype = MOVETYPE_NONE;
|
||||
Player_PostUpdate();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -226,21 +250,32 @@ Propagate our pmove state to whatever the current frame before its stomped on (s
|
|||
*/
|
||||
void Player_PreUpdate( void )
|
||||
{
|
||||
self.origin = self.netorigin;
|
||||
self.angles = self.netangles;
|
||||
self.velocity = self.netvelocity;
|
||||
self.pmove_flags = self.netpmove_flags;
|
||||
|
||||
self.netorigin = self.origin;
|
||||
self.netangles = self.angles;
|
||||
self.netvelocity = self.velocity;
|
||||
self.netpmove_flags = self.pmove_flags;
|
||||
|
||||
if ( getplayerkeyvalue( player_localnum, "*spec" ) == "0" ) {
|
||||
if ( getplayerkeyvalue( self.entnum - 1, "*spec" ) == "0" ) {
|
||||
self.movetype = MOVETYPE_WALK;
|
||||
} else {
|
||||
self.movetype = MOVETYPE_NOCLIP;
|
||||
}
|
||||
|
||||
//we want to predict an exact copy of the data in the new packet
|
||||
for ( ; self.pmove_frame <= servercommandframe; self.pmove_frame++ ) {
|
||||
if ( getinputstate( self.pmove_frame ) )
|
||||
QPhysics_Run( self );
|
||||
/*for ( ; self.pmove_frame <= servercommandframe; self.pmove_frame++ ) {
|
||||
float flSuccess = getinputstate( self.pmove_frame );*/
|
||||
for ( int i = servercommandframe + 1; i <= clientcommandframe; i++ ) {
|
||||
float flSuccess = getinputstate( i );
|
||||
if ( flSuccess == FALSE ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Partial frames are the worst
|
||||
if (input_timelength == 0) {
|
||||
break;
|
||||
}
|
||||
QPhysics_Run( self );
|
||||
}
|
||||
|
||||
//we now have self.pmove_flags set properly...
|
||||
|
@ -250,9 +285,9 @@ void Player_PreUpdate( void )
|
|||
|
||||
void Player_PostUpdate( void )
|
||||
{
|
||||
self.netorigin = self.origin;
|
||||
self.netangles = self.angles;
|
||||
self.netvelocity = self.velocity;
|
||||
self.netpmove_flags = self.pmove_flags;
|
||||
self.origin = self.netorigin;
|
||||
self.angles = self.netangles;
|
||||
self.velocity = self.netvelocity;
|
||||
self.pmove_flags = self.netpmove_flags;
|
||||
self.pmove_frame = servercommandframe + 1;
|
||||
}
|
||||
|
|
|
@ -108,6 +108,10 @@ void CSQC_VGUI_Init( void ) {
|
|||
fclose( fmMapDescr );
|
||||
}
|
||||
|
||||
if (serverkeyfloat("slots") == 1) {
|
||||
pSeat->fVGUI_Display = VGUI_NONE;
|
||||
return;
|
||||
}
|
||||
// We start on the MOTD, always
|
||||
for (int s = 0; s < seats.length; s++)
|
||||
{
|
||||
|
|
|
@ -68,7 +68,7 @@ void View_CalcBob( void ) {
|
|||
return;
|
||||
}
|
||||
|
||||
pSeat->fBobTime += frametime;
|
||||
pSeat->fBobTime += clframetime;
|
||||
fCycle = pSeat->fBobTime - (int)( pSeat->fBobTime / autocvar_v_bobcycle ) * autocvar_v_bobcycle;
|
||||
fCycle /= autocvar_v_bobcycle;
|
||||
|
||||
|
@ -95,7 +95,7 @@ Quickly lerp to the original viewposition
|
|||
*/
|
||||
void View_DropPunchAngle( void ) {
|
||||
float fLerp;
|
||||
fLerp = 1.0f - ( frametime * 4 );
|
||||
fLerp = 1.0f - ( clframetime * 4 );
|
||||
pSeat->vPunchAngle *= fLerp;
|
||||
}
|
||||
|
||||
|
@ -221,12 +221,12 @@ void View_DrawViewModel( void ) {
|
|||
|
||||
// Take away alpha once it has drawn fully at least once
|
||||
if ( eMuzzleflash.alpha > 0.0f ) {
|
||||
eMuzzleflash.alpha -= ( frametime * 45 );
|
||||
eMuzzleflash.alpha -= ( clframetime * 45 );
|
||||
}
|
||||
|
||||
float fBaseTime = eViewModel.frame1time;
|
||||
eViewModel.frame1time += frametime;
|
||||
eViewModel.frame2time += frametime;
|
||||
eViewModel.frame1time += clframetime;
|
||||
eViewModel.frame2time += clframetime;
|
||||
processmodelevents( eViewModel.modelindex, eViewModel.frame, fBaseTime, eViewModel.frame1time, View_ProcessEvent );
|
||||
}
|
||||
|
||||
|
@ -234,7 +234,7 @@ void View_DrawViewModel( void ) {
|
|||
eViewModel.origin = '0 0 -1' + ( v_forward * ( pSeat->fBob * 0.4 ) )
|
||||
+ ( v_forward * autocvar_v_gunofs[0] )
|
||||
+ ( v_right * autocvar_v_gunofs[1] )
|
||||
+ ( v_up * autocvar_v_gunofs[2] );;
|
||||
+ ( v_up * autocvar_v_gunofs[2] );
|
||||
|
||||
// Left-handed weapons
|
||||
if ( autocvar_v_lefthanded ) {
|
||||
|
|
|
@ -43,6 +43,8 @@ Defs.h
|
|||
../Shared/Equipment.c
|
||||
../Shared/Animations.c
|
||||
|
||||
../gs-entbase/client/fade.cpp
|
||||
|
||||
Overview.c
|
||||
Player.c
|
||||
View.c
|
||||
|
|
|
@ -251,6 +251,8 @@ enum {
|
|||
EV_SPARK,
|
||||
EV_SMOKE,
|
||||
EV_FLASH,
|
||||
EV_SHAKE,
|
||||
EV_FADE,
|
||||
EV_MODELGIB,
|
||||
EV_CAMERATRIGGER,
|
||||
EV_RADIOMSG,
|
||||
|
@ -336,9 +338,16 @@ Game_GetMaxSpeed
|
|||
=================
|
||||
*/
|
||||
float Game_GetMaxSpeed( entity eTarget ) {
|
||||
if ( eTarget.flags & FL_CROUCHING ) {
|
||||
return ( cvar( "sv_maxspeed" ) * Weapon_GetSpeedM( eTarget.weapon ) * 0.5 );
|
||||
int weap;
|
||||
if (!eTarget.weapon) {
|
||||
weap = WEAPON_KNIFE;
|
||||
} else {
|
||||
return cvar( "sv_maxspeed" ) * Weapon_GetSpeedM( eTarget.weapon );
|
||||
weap = eTarget.weapon;
|
||||
}
|
||||
|
||||
if ( eTarget.flags & FL_CROUCHING ) {
|
||||
return ( cvar( "sv_maxspeed" ) * Weapon_GetSpeedM(weap) * 0.5 );
|
||||
} else {
|
||||
return cvar( "sv_maxspeed" ) * Weapon_GetSpeedM(weap);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ void QPhysics_Jump ( entity eTarget )
|
|||
void QPhysics_Run ( entity eTarget )
|
||||
{
|
||||
int iFixCrouch = FALSE;
|
||||
float flFallVel = ( self.flags & FL_ONGROUND ) ? 0 : -self.velocity_z;
|
||||
float flFallVel = ( eTarget.flags & FL_ONGROUND ) ? 0 : -eTarget.velocity_z;
|
||||
|
||||
// We didn't get any basevelocity this frame, remove the flag
|
||||
/*if ( vlen( eTarget.basevelocity ) ) {
|
||||
|
@ -154,9 +154,9 @@ void QPhysics_Run ( entity eTarget )
|
|||
runstandardplayerphysics( eTarget );
|
||||
|
||||
#ifdef SSQC
|
||||
if ( ( self.flags & FL_ONGROUND ) && self.movetype == MOVETYPE_WALK && ( flFallVel > 580 )) {
|
||||
if ( ( eTarget.flags & FL_ONGROUND ) && eTarget.movetype == MOVETYPE_WALK && ( flFallVel > 580 )) {
|
||||
float fFallDamage = ( flFallVel - 580 ) * ( 100 / ( 1024 - 580 ) );
|
||||
Damage_Apply( self, world, fFallDamage, self.origin, FALSE );
|
||||
Damage_Apply( eTarget, world, fFallDamage, eTarget.origin, FALSE );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -90,7 +90,7 @@ void btn_multiplayer_start(void)
|
|||
|
||||
void btn_training(void)
|
||||
{
|
||||
localcmd("map t0a0\n");
|
||||
localcmd("maxplayers 1\nmap t0a0\n");
|
||||
}
|
||||
|
||||
void btn_quit(void)
|
||||
|
|
|
@ -17,7 +17,7 @@ void ng_btneasy_start(void)
|
|||
{
|
||||
static void ng_btneasy_end(void) {
|
||||
g_menupage = PAGE_MAIN;
|
||||
localcmd("map c0a0\n");
|
||||
localcmd("maxplayers 1\nmap c0a0\n");
|
||||
}
|
||||
localsound("../media/launch_upmenu1.wav");
|
||||
header.SetStartEndPos(45,45,70,208);
|
||||
|
|
Binary file not shown.
BIN
freecs/menu.dat
BIN
freecs/menu.dat
Binary file not shown.
BIN
freecs/progs.dat
BIN
freecs/progs.dat
Binary file not shown.
Loading…
Reference in a new issue