From ba9ba69d1ed8f043a981585a0fabe21642b4dbc6 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Sat, 18 May 2024 18:31:21 +0200 Subject: [PATCH 1/7] inital antiping percent commit{ --- src/engine/shared/config_variables.h | 1 + src/game/client/gameclient.cpp | 32 +++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index 36ea125e6..ede2cf1ee 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -14,6 +14,7 @@ MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict client movements") MACRO_CONFIG_INT(ClPredictDummy, cl_predict_dummy, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict dummy movements") MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Antiping limit (0 to disable)") +MACRO_CONFIG_INT(ClAntiPingPercent, cl_antiping_percent, 100, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "how far ahead Antiping predicts") MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable antiping, i. e. more aggressive prediction.") MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict other player's movement more aggressively (only enabled if cl_antiping is set to 1)") MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict grenades (only enabled if cl_antiping is set to 1)") diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index d41cd9607..007e77e01 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2013,17 +2013,30 @@ void CGameClient::OnPredict() if(PredictDummy()) pDummyChar = m_PredictedWorld.GetCharacterById(m_PredictedDummyId); + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + + // predict for(int Tick = Client()->GameTick(g_Config.m_ClDummy) + 1; Tick <= Client()->PredGameTick(g_Config.m_ClDummy); Tick++) { // fetch the previous characters + if(Tick == predictTick) + { + for(int i = 0; i < MAX_CLIENTS; i++) + if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) + m_aClients[i].m_PrevPredicted = pChar->GetCore(); + } + if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) { m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); m_PredictedPrevChar = pLocalChar->GetCore(); - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) - m_aClients[i].m_PrevPredicted = pChar->GetCore(); + m_aClients[m_Snap.m_LocalClientId].m_PrevPredicted = pLocalChar->GetCore(); + + if(pDummyChar) + m_aClients[m_PredictedDummyId].m_PrevPredicted = pDummyChar->GetCore(); } // optionally allow some movement in freeze by not predicting freeze the last one to two ticks @@ -2049,14 +2062,23 @@ void CGameClient::OnPredict() m_PredictedWorld.Tick(); // fetch the current characters - if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) + // if(Tick == Client()->PredGameTick(g_Config.m_ClDummy) || + if(Tick == predictTick) { - m_PredictedChar = pLocalChar->GetCore(); for(int i = 0; i < MAX_CLIENTS; i++) if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) m_aClients[i].m_Predicted = pChar->GetCore(); } + if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) + { + m_PredictedChar = pLocalChar->GetCore(); + m_aClients[m_Snap.m_LocalClientId].m_Predicted = pLocalChar->GetCore(); + + if(pDummyChar) + m_aClients[m_PredictedDummyId].m_Predicted = pDummyChar->GetCore(); + } + for(int i = 0; i < MAX_CLIENTS; i++) if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) { From ac806a37f904b8848528b8c353afb927859da47c Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Sat, 18 May 2024 20:12:12 +0200 Subject: [PATCH 2/7] weapons and projectiles are properly delayed / predicted as well --- src/game/client/components/items.cpp | 27 ++++++++++++++++++++------- src/game/client/gameclient.cpp | 5 +++++ src/game/client/gameclient.h | 2 ++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index 93ce892a6..cf5543f6d 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -58,9 +58,13 @@ void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + float Ct; if(m_pClient->Predict() && m_pClient->AntiPingGrenade() && LocalPlayerInGame && !IsOtherTeam) - Ct = ((float)(Client()->PredGameTick(g_Config.m_ClDummy) - 1 - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); + Ct = ((float)(predictTick - 1 - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); else Ct = (Client()->PrevGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) / (float)Client()->GameTickSpeed() + s_LastGameTickTime; if(Ct < 0) @@ -304,9 +308,13 @@ void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) { Dir = normalize_pre_length(Pos - From, Len); + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + float Ticks; if(IsPredicted) - Ticks = (float)(Client()->PredGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy); + Ticks = (float)(predictTick - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy); else Ticks = (float)(Client()->GameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->IntraGameTick(g_Config.m_ClDummy); float Ms = (Ticks / Client()->GameTickSpeed()) * 1000.0f; @@ -377,7 +385,7 @@ void CItems::OnRender() auto &aSwitchers = GameClient()->Switchers(); if(UsePredicted) { - for(auto *pProj = (CProjectile *)GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->NextEntity()) + for(auto *pProj = (CProjectile *)GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->NextEntity()) { if(!IsSuper && pProj->m_Number > 0 && pProj->m_Number < (int)aSwitchers.size() && !aSwitchers[pProj->m_Number].m_aStatus[SwitcherTeam] && (pProj->m_Explosive ? BlinkingProjEx : BlinkingProj)) continue; @@ -385,7 +393,7 @@ void CItems::OnRender() CProjectileData Data = pProj->GetData(); RenderProjectile(&Data, pProj->GetId()); } - for(CEntity *pEnt = GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->NextEntity()) + for(CEntity *pEnt = GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->NextEntity()) { auto *const pLaser = dynamic_cast(pEnt); if(!pLaser || pLaser->GetOwner() < 0 || !GameClient()->m_aClients[pLaser->GetOwner()].m_IsPredictedLocal) @@ -393,7 +401,7 @@ void CItems::OnRender() CLaserData Data = pLaser->GetData(); RenderLaser(&Data, true); } - for(auto *pPickup = (CPickup *)GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_PICKUP); pPickup; pPickup = (CPickup *)pPickup->NextEntity()) + for(auto *pPickup = (CPickup *)GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PICKUP); pPickup; pPickup = (CPickup *)pPickup->NextEntity()) { if(!IsSuper && pPickup->m_Layer == LAYER_SWITCH && pPickup->m_Number > 0 && pPickup->m_Number < (int)aSwitchers.size() && !aSwitchers[pPickup->m_Number].m_aStatus[SwitcherTeam] && BlinkingPickup) continue; @@ -602,7 +610,12 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT LocalPlayerInGame = m_pClient->m_aClients[m_pClient->m_Snap.m_pLocalInfo->m_ClientId].m_Team != TEAM_SPECTATORS; if(!m_pClient->AntiPingGunfire() || !LocalPlayerInGame) return; - if(Client()->PredGameTick(g_Config.m_ClDummy) == pCurrent->m_StartTick) + + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + + if(predictTick == pCurrent->m_StartTick) return; // get positions @@ -626,7 +639,7 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT Speed = pTuning->m_GunSpeed; } - float Pt = ((float)(Client()->PredGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); + float Pt = ((float)(predictTick - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); if(Pt < 0) return; // projectile haven't been shot yet diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 007e77e01..c402e1e43 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2117,6 +2117,11 @@ void CGameClient::OnPredict() if(Events & COREEVENT_AIR_JUMP) m_Effects.AirJump(Pos, 1.0f); } + + if(Tick == predictTick) + { + m_PartialPredictedWorld.CopyWorld(&m_PredictedWorld); + } } // detect mispredictions of other players and make corrections smoother when possible diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index 553cf8bc5..d95b8dfd2 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -547,6 +547,8 @@ public: CGameWorld m_PredictedWorld; CGameWorld m_PrevPredictedWorld; + CGameWorld m_PartialPredictedWorld; + std::vector &Switchers() { return m_GameWorld.m_Core.m_vSwitchers; } std::vector &PredSwitchers() { return m_PredictedWorld.m_Core.m_vSwitchers; } From 01f77c60598a769ddeaa414478a5f308b85eacd1 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Sat, 18 May 2024 22:35:53 +0200 Subject: [PATCH 3/7] Fixed code style and removed commented out code --- src/game/client/components/items.cpp | 14 +++++++------- src/game/client/gameclient.cpp | 10 ++++------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index cf5543f6d..c61fba635 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -58,8 +58,8 @@ void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); float Ct; @@ -308,8 +308,8 @@ void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) { Dir = normalize_pre_length(Pos - From, Len); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); float Ticks; @@ -610,9 +610,9 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT LocalPlayerInGame = m_pClient->m_aClients[m_pClient->m_Snap.m_pLocalInfo->m_ClientId].m_Team != TEAM_SPECTATORS; if(!m_pClient->AntiPingGunfire() || !LocalPlayerInGame) return; - - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); if(predictTick == pCurrent->m_StartTick) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index c402e1e43..15b4df400 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2013,11 +2013,10 @@ void CGameClient::OnPredict() if(PredictDummy()) pDummyChar = m_PredictedWorld.GetCharacterById(m_PredictedDummyId); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0; + float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); - // predict for(int Tick = Client()->GameTick(g_Config.m_ClDummy) + 1; Tick <= Client()->PredGameTick(g_Config.m_ClDummy); Tick++) { @@ -2034,7 +2033,7 @@ void CGameClient::OnPredict() m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); m_PredictedPrevChar = pLocalChar->GetCore(); m_aClients[m_Snap.m_LocalClientId].m_PrevPredicted = pLocalChar->GetCore(); - + if(pDummyChar) m_aClients[m_PredictedDummyId].m_PrevPredicted = pDummyChar->GetCore(); } @@ -2062,7 +2061,6 @@ void CGameClient::OnPredict() m_PredictedWorld.Tick(); // fetch the current characters - // if(Tick == Client()->PredGameTick(g_Config.m_ClDummy) || if(Tick == predictTick) { for(int i = 0; i < MAX_CLIENTS; i++) @@ -2074,7 +2072,7 @@ void CGameClient::OnPredict() { m_PredictedChar = pLocalChar->GetCore(); m_aClients[m_Snap.m_LocalClientId].m_Predicted = pLocalChar->GetCore(); - + if(pDummyChar) m_aClients[m_PredictedDummyId].m_Predicted = pDummyChar->GetCore(); } From 849fa743ba876ae095813507201faa7a36a2c974 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Wed, 29 May 2024 20:10:41 +0200 Subject: [PATCH 4/7] fixed crash? --- src/game/client/components/items.cpp | 6 +++--- src/game/client/gameclient.cpp | 15 +++++++++------ src/game/client/gameclient.h | 2 -- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index c61fba635..8c56d27b9 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -385,7 +385,7 @@ void CItems::OnRender() auto &aSwitchers = GameClient()->Switchers(); if(UsePredicted) { - for(auto *pProj = (CProjectile *)GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->NextEntity()) + for(auto *pProj = (CProjectile *)GameClient()->m_PrevPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->NextEntity()) { if(!IsSuper && pProj->m_Number > 0 && pProj->m_Number < (int)aSwitchers.size() && !aSwitchers[pProj->m_Number].m_aStatus[SwitcherTeam] && (pProj->m_Explosive ? BlinkingProjEx : BlinkingProj)) continue; @@ -393,7 +393,7 @@ void CItems::OnRender() CProjectileData Data = pProj->GetData(); RenderProjectile(&Data, pProj->GetId()); } - for(CEntity *pEnt = GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->NextEntity()) + for(CEntity *pEnt = GameClient()->m_PrevPredictedWorld.FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->NextEntity()) { auto *const pLaser = dynamic_cast(pEnt); if(!pLaser || pLaser->GetOwner() < 0 || !GameClient()->m_aClients[pLaser->GetOwner()].m_IsPredictedLocal) @@ -401,7 +401,7 @@ void CItems::OnRender() CLaserData Data = pLaser->GetData(); RenderLaser(&Data, true); } - for(auto *pPickup = (CPickup *)GameClient()->m_PartialPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PICKUP); pPickup; pPickup = (CPickup *)pPickup->NextEntity()) + for(auto *pPickup = (CPickup *)GameClient()->m_PrevPredictedWorld.FindFirst(CGameWorld::ENTTYPE_PICKUP); pPickup; pPickup = (CPickup *)pPickup->NextEntity()) { if(!IsSuper && pPickup->m_Layer == LAYER_SWITCH && pPickup->m_Number > 0 && pPickup->m_Number < (int)aSwitchers.size() && !aSwitchers[pPickup->m_Number].m_aStatus[SwitcherTeam] && BlinkingPickup) continue; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 15b4df400..fe8e7d6fa 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2017,6 +2017,10 @@ void CGameClient::OnPredict() int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + if(predictTick < Client()->GameTick(g_Config.m_ClDummy) + 1) + { + predictTick = Client()->GameTick(g_Config.m_ClDummy) + 1; + } // predict for(int Tick = Client()->GameTick(g_Config.m_ClDummy) + 1; Tick <= Client()->PredGameTick(g_Config.m_ClDummy); Tick++) { @@ -2030,7 +2034,6 @@ void CGameClient::OnPredict() if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) { - m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); m_PredictedPrevChar = pLocalChar->GetCore(); m_aClients[m_Snap.m_LocalClientId].m_PrevPredicted = pLocalChar->GetCore(); @@ -2038,6 +2041,11 @@ void CGameClient::OnPredict() m_aClients[m_PredictedDummyId].m_PrevPredicted = pDummyChar->GetCore(); } + if(Tick == predictTick) + { + m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); + } + // optionally allow some movement in freeze by not predicting freeze the last one to two ticks if(g_Config.m_ClPredictFreeze == 2 && Client()->PredGameTick(g_Config.m_ClDummy) - 1 - Client()->PredGameTick(g_Config.m_ClDummy) % 2 <= Tick) pLocalChar->m_CanMoveInFreeze = true; @@ -2115,11 +2123,6 @@ void CGameClient::OnPredict() if(Events & COREEVENT_AIR_JUMP) m_Effects.AirJump(Pos, 1.0f); } - - if(Tick == predictTick) - { - m_PartialPredictedWorld.CopyWorld(&m_PredictedWorld); - } } // detect mispredictions of other players and make corrections smoother when possible diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index d95b8dfd2..553cf8bc5 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -547,8 +547,6 @@ public: CGameWorld m_PredictedWorld; CGameWorld m_PrevPredictedWorld; - CGameWorld m_PartialPredictedWorld; - std::vector &Switchers() { return m_GameWorld.m_Core.m_vSwitchers; } std::vector &PredSwitchers() { return m_PredictedWorld.m_Core.m_vSwitchers; } From 4dc74376e5a49d368cd63e637b183a2d73d96ae1 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Wed, 29 May 2024 20:41:26 +0200 Subject: [PATCH 5/7] renamed to cl_antiping_max --- src/engine/shared/config_variables.h | 2 +- src/game/client/components/items.cpp | 6 +++--- src/game/client/gameclient.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index ede2cf1ee..904dcda72 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -14,7 +14,7 @@ MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict client movements") MACRO_CONFIG_INT(ClPredictDummy, cl_predict_dummy, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict dummy movements") MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Antiping limit (0 to disable)") -MACRO_CONFIG_INT(ClAntiPingPercent, cl_antiping_percent, 100, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "how far ahead Antiping predicts") +MACRO_CONFIG_INT(ClAntiPingMax, cl_antiping_max, 100, 0, 500, CFGFLAG_CLIENT | CFGFLAG_SAVE, "how far ahead Antiping predicts") MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable antiping, i. e. more aggressive prediction.") MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict other player's movement more aggressively (only enabled if cl_antiping is set to 1)") MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict grenades (only enabled if cl_antiping is set to 1)") diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index 8c56d27b9..c91989e0a 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -58,7 +58,7 @@ void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); @@ -308,7 +308,7 @@ void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) { Dir = normalize_pre_length(Pos - From, Len); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); @@ -611,7 +611,7 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT if(!m_pClient->AntiPingGunfire() || !LocalPlayerInGame) return; - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; + float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index fe8e7d6fa..19d8a4379 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2013,8 +2013,8 @@ void CGameClient::OnPredict() if(PredictDummy()) pDummyChar = m_PredictedWorld.GetCharacterById(m_PredictedDummyId); - float predictPercentage = 1 - g_Config.m_ClAntiPingPercent / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; + float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); if(predictTick < Client()->GameTick(g_Config.m_ClDummy) + 1) From 38324489a25c83f13b20ecfaca754dd3d90291f4 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Thu, 30 May 2024 17:14:32 +0200 Subject: [PATCH 6/7] replaced floor with std::floor --- src/game/client/components/items.cpp | 6 +++--- src/game/client/gameclient.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index c91989e0a..f64924860 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -60,7 +60,7 @@ void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); float Ct; if(m_pClient->Predict() && m_pClient->AntiPingGrenade() && LocalPlayerInGame && !IsOtherTeam) @@ -310,7 +310,7 @@ void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); float Ticks; if(IsPredicted) @@ -613,7 +613,7 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); if(predictTick == pCurrent->m_StartTick) return; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 19d8a4379..9af5b5a69 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2015,7 +2015,7 @@ void CGameClient::OnPredict() int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - floor(predictTick * predictPercentage); + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); if(predictTick < Client()->GameTick(g_Config.m_ClDummy) + 1) { From 6c0427d23c176ec93bc8181eb85019f1936abea8 Mon Sep 17 00:00:00 2001 From: JSaurusRex Date: Wed, 4 Sep 2024 14:52:04 +0200 Subject: [PATCH 7/7] made antiping limit have new functionality as a limit to the amount of antiping there is but backwards, higher number means less antiping. Basically the amount of time antiping doesn't predict --- src/engine/client/client.cpp | 10 +++++----- src/engine/shared/config_variables.h | 4 ++-- src/game/client/components/items.cpp | 12 +++-------- src/game/client/gameclient.cpp | 30 +++++++++++++++++++--------- src/game/client/gameclient.h | 1 + 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 2665ee0c5..b13d967f9 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -905,11 +905,11 @@ void CClient::Render() GameClient()->OnRender(); DebugRender(); - if(State() == IClient::STATE_ONLINE && g_Config.m_ClAntiPingLimit) - { - int64_t Now = time_get(); - g_Config.m_ClAntiPing = (m_PredictedTime.Get(Now) - m_aGameTime[g_Config.m_ClDummy].Get(Now)) * 1000 / (float)time_freq() > g_Config.m_ClAntiPingLimit; - } + // if(State() == IClient::STATE_ONLINE && g_Config.m_ClAntiPingLimit) + // { + // int64_t Now = time_get(); + // g_Config.m_ClAntiPing = (m_PredictedTime.Get(Now) - m_aGameTime[g_Config.m_ClDummy].Get(Now)) * 1000 / (float)time_freq() > g_Config.m_ClAntiPingLimit; + // } } const char *CClient::LoadMap(const char *pName, const char *pFilename, SHA256_DIGEST *pWantedSha256, unsigned WantedCrc) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index 904dcda72..96409e113 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -13,8 +13,8 @@ // client MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict client movements") MACRO_CONFIG_INT(ClPredictDummy, cl_predict_dummy, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict dummy movements") -MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Antiping limit (0 to disable)") -MACRO_CONFIG_INT(ClAntiPingMax, cl_antiping_max, 100, 0, 500, CFGFLAG_CLIENT | CFGFLAG_SAVE, "how far ahead Antiping predicts") +MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Adds delay to antiping (0 to disable)") +MACRO_CONFIG_INT(ClAntiPingpercent, cl_antiping_percent, 100, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "how far ahead Antiping predicts, ignored when antiping limit is used") MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable antiping, i. e. more aggressive prediction.") MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict other player's movement more aggressively (only enabled if cl_antiping is set to 1)") MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict grenades (only enabled if cl_antiping is set to 1)") diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index f64924860..2ef3e501a 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -58,9 +58,7 @@ void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); - float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); + int predictTick = GameClient()->GetPredictionTick(); float Ct; if(m_pClient->Predict() && m_pClient->AntiPingGrenade() && LocalPlayerInGame && !IsOtherTeam) @@ -308,9 +306,7 @@ void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) { Dir = normalize_pre_length(Pos - From, Len); - float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); + int predictTick = GameClient()->GetPredictionTick(); float Ticks; if(IsPredicted) @@ -611,9 +607,7 @@ void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyT if(!m_pClient->AntiPingGunfire() || !LocalPlayerInGame) return; - float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); + int predictTick = GameClient()->GetPredictionTick(); if(predictTick == pCurrent->m_StartTick) return; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 9af5b5a69..622f4dd9c 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1956,6 +1956,25 @@ void CGameClient::UpdateEditorIngameMoved() } } +int CGameClient::GetPredictionTick() +{ + int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; + + float predictPercentage = 1 - g_Config.m_ClAntiPingpercent / 100.0f; + int predictMin = std::floor(predictTick * predictPercentage); + int predictMin2 = g_Config.m_ClAntiPingLimit * Client()->GameTickSpeed() / 1000.0f; + if (g_Config.m_ClAntiPingLimit != 0) + predictMin = predictMin2; + + predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - predictMin; + + if(predictTick < Client()->GameTick(g_Config.m_ClDummy) + 1) + { + predictTick = Client()->GameTick(g_Config.m_ClDummy) + 1; + } + return predictTick; +} + void CGameClient::OnPredict() { // store the previous values so we can detect prediction errors @@ -2012,15 +2031,8 @@ void CGameClient::OnPredict() CCharacter *pDummyChar = 0; if(PredictDummy()) pDummyChar = m_PredictedWorld.GetCharacterById(m_PredictedDummyId); - - int predictTick = Client()->GetPredictionTime() * Client()->GameTickSpeed() / 1000.0f; - float predictPercentage = 1 - g_Config.m_ClAntiPingMax / 100.0f; - predictTick = Client()->PredGameTick(g_Config.m_ClDummy) - std::floor(predictTick * predictPercentage); - - if(predictTick < Client()->GameTick(g_Config.m_ClDummy) + 1) - { - predictTick = Client()->GameTick(g_Config.m_ClDummy) + 1; - } + + int predictTick = GetPredictionTick(); // predict for(int Tick = Client()->GameTick(g_Config.m_ClDummy) + 1; Tick <= Client()->PredGameTick(g_Config.m_ClDummy); Tick++) { diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index 553cf8bc5..20531787c 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -466,6 +466,7 @@ public: CRenderTools m_RenderTools; void OnReset(); + int GetPredictionTick(); size_t ComponentCount() { return m_vpAll.size(); }