Skip to content

Commit

Permalink
Misc network fixes
Browse files Browse the repository at this point in the history
Fixed missing teleport specials when predicting. Added rubberband limit; if too far away from the predicted position, will instead instantly snap the player's view to their new spot. Deprecated cl_noprediction; this was pointless as you'd never not want to predict your position/angles. Fixed angle targets not being backed up. Fixed oldbuttons not being set. Updated menu
  • Loading branch information
Boondorl authored and RicardoLuis0 committed Jul 7, 2024
1 parent a82e3b9 commit 10d0f94
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 20 deletions.
4 changes: 3 additions & 1 deletion src/playsim/p_spec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,9 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType)

// Only predict a very specifc section of specials
if (line->special != Teleport_Line &&
line->special != Teleport)
line->special != Teleport &&
line->special != Teleport_NoFog &&
line->special != Teleport_NoStop)
{
return false;
}
Expand Down
43 changes: 29 additions & 14 deletions src/playsim/p_user.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ static FRandom pr_skullpop ("SkullPop");
CVAR(Bool, sv_singleplayerrespawn, false, CVAR_SERVERINFO | CVAR_CHEAT)

// Variables for prediction
CVAR (Bool, cl_noprediction, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(Bool, cl_predict_specials, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
// Deprecated
CVAR(Bool, cl_noprediction, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)

Expand All @@ -124,6 +124,11 @@ CUSTOM_CVAR(Float, cl_rubberband_minmove, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFI
if (self < 0.1f)
self = 0.1f;
}
CUSTOM_CVAR(Float, cl_rubberband_limit, 756.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
if (self < 0.0f)
self = 0.0f;
}

ColorSetList ColorSets;
PainFlashList PainFlashes;
Expand Down Expand Up @@ -353,6 +358,7 @@ void player_t::CopyFrom(player_t &p, bool copyPSP)
MUSINFOactor = p.MUSINFOactor;
MUSINFOtics = p.MUSINFOtics;
SoundClass = p.SoundClass;
angleOffsetTargets = p.angleOffsetTargets;
if (copyPSP)
{
// This needs to transfer ownership completely.
Expand Down Expand Up @@ -1422,8 +1428,7 @@ void P_PredictPlayer (player_t *player)
{
int maxtic;

if (cl_noprediction ||
singletics ||
if (singletics ||
demoplayback ||
player->mo == NULL ||
player != player->mo->Level->GetConsolePlayer() ||
Expand Down Expand Up @@ -1497,7 +1502,7 @@ void P_PredictPlayer (player_t *player)

// This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually
// called. Call order is preserved.
bool rubberband = false;
bool rubberband = false, rubberbandLimit = false;
DVector3 rubberbandPos = {};
const bool canRubberband = LastPredictedTic >= 0 && cl_rubberband_scale > 0.0f && cl_rubberband_scale < 1.0f;
const double rubberbandThreshold = max<float>(cl_rubberband_minmove, cl_rubberband_threshold);
Expand All @@ -1521,9 +1526,11 @@ void P_PredictPlayer (player_t *player)
{
rubberband = true;
rubberbandPos = player->mo->Pos();
rubberbandLimit = cl_rubberband_limit > 0.0f && dist > cl_rubberband_limit * cl_rubberband_limit;
}
}

player->oldbuttons = player->cmd.ucmd.buttons;
player->cmd = localcmds[i % LOCALCMDTICS];
player->mo->ClearInterpolation();
player->mo->ClearFOVInterpolation();
Expand All @@ -1533,21 +1540,29 @@ void P_PredictPlayer (player_t *player)

if (rubberband)
{
R_ClearInterpolationPath();
player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW;

DPrintf(DMSG_NOTIFY, "Prediction mismatch at (%.3f, %.3f, %.3f)\nExpected: (%.3f, %.3f, %.3f)\nCorrecting to (%.3f, %.3f, %.3f)\n",
LastPredictedPosition.X, LastPredictedPosition.Y, LastPredictedPosition.Z,
rubberbandPos.X, rubberbandPos.Y, rubberbandPos.Z,
player->mo->X(), player->mo->Y(), player->mo->Z());

DVector3 snapPos = {};
P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove);
player->mo->PrevPortalGroup = LastPredictedPortalGroup;
player->mo->Prev = LastPredictedPosition;
const double zOfs = player->viewz - player->mo->Z();
player->mo->SetXYZ(snapPos);
player->viewz = snapPos.Z + zOfs;
if (rubberbandLimit)
{
// If too far away, instantly snap the player's view to their correct position.
player->mo->renderflags |= RF_NOINTERPOLATEVIEW;
}
else
{
R_ClearInterpolationPath();
player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW;

DVector3 snapPos = {};
P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove);
player->mo->PrevPortalGroup = LastPredictedPortalGroup;
player->mo->Prev = LastPredictedPosition;
const double zOfs = player->viewz - player->mo->Z();
player->mo->SetXYZ(snapPos);
player->viewz = snapPos.Z + zOfs;
}
}

// This is intentionally done after rubberbanding starts since it'll automatically smooth itself towards
Expand Down
2 changes: 0 additions & 2 deletions src/rendering/r_utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,6 @@ void R_Shutdown ()
//==========================================================================

//CVAR (Int, tf, 0, 0)
EXTERN_CVAR (Bool, cl_noprediction)

bool P_NoInterpolation(player_t const *player, AActor const *actor)
{
Expand All @@ -455,7 +454,6 @@ bool P_NoInterpolation(player_t const *player, AActor const *actor)
&& player->mo->reactiontime == 0
&& !NoInterpolateView
&& !paused
&& (!netgame || !cl_noprediction)
&& !LocalKeyboardTurner;
}

Expand Down
5 changes: 2 additions & 3 deletions wadsrc/static/menudef.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2363,10 +2363,9 @@ OptionMenu NetworkOptions protected
{
Title "$NETMNU_TITLE"
StaticText "$NETMNU_LOCALOPTIONS", 1
Option "$NETMNU_MOVEPREDICTION", "cl_noprediction", "OffOn"
Option "$NETMNU_LINESPECIALPREDICTION", "cl_predict_specials", "OnOff"
Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_predict_lerpscale", 0.0, 0.5, 0.05, 2
Slider "$NETMNU_LERPTHRESHOLD", "cl_predict_lerpthreshold", 0.1, 16.0, 0.1
Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_rubberband_scale", 0.0, 1.0, 0.05, 2
Slider "$NETMNU_LERPTHRESHOLD", "cl_rubberband_threshold", 0.0, 256.0, 8.0
StaticText " "
StaticText "$NETMNU_HOSTOPTIONS", 1
Option "$NETMNU_EXTRATICS", "net_extratic", "ExtraTicMode"
Expand Down

0 comments on commit 10d0f94

Please sign in to comment.