Misc prediction fixes

This commit is contained in:
Marco Cawthorne 2018-12-30 06:37:53 +01:00
parent ff7e6b6c41
commit d1ad1b13bf
17 changed files with 135 additions and 77 deletions

View file

@ -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;

View file

@ -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();

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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++)
{

View file

@ -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 ) {

View file

@ -43,6 +43,8 @@ Defs.h
../Shared/Equipment.c
../Shared/Animations.c
../gs-entbase/client/fade.cpp
Overview.c
Player.c
View.c

View file

@ -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);
}
}

View file

@ -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
}

View file

@ -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)

View file

@ -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.

Binary file not shown.

Binary file not shown.