@@ -1295,7 +1295,6 @@ void CGameClient::OnNewSnapshot()
12951295
12961296 // limit evolving to 3 seconds
12971297 int EvolvePrevTick = minimum (pCharInfo->m_Prev .m_Tick + Client ()->GameTickSpeed () * 3 , Client ()->PrevGameTick ());
1298- int EvolveCurTick = minimum (pCharInfo->m_Cur .m_Tick + Client ()->GameTickSpeed () * 3 , Client ()->GameTick ());
12991298
13001299 // reuse the evolved char
13011300 if (m_aClients[Item.m_ID ].m_Evolved .m_Tick == EvolvePrevTick)
@@ -1304,17 +1303,7 @@ void CGameClient::OnNewSnapshot()
13041303 if (mem_comp (pData, pOld, sizeof (CNetObj_Character)) == 0 )
13051304 pCharInfo->m_Cur = m_aClients[Item.m_ID ].m_Evolved ;
13061305 }
1307-
1308- if (pCharInfo->m_Prev .m_Tick )
1309- EvolveCharacter (&pCharInfo->m_Prev , EvolvePrevTick);
1310- if (pCharInfo->m_Cur .m_Tick )
1311- EvolveCharacter (&pCharInfo->m_Cur , EvolveCurTick);
1312-
1313- m_aClients[Item.m_ID ].m_Evolved = m_Snap.m_aCharacters [Item.m_ID ].m_Cur ;
13141306 }
1315-
1316- if (Item.m_ID != m_LocalClientID || !Config ()->m_ClPredict || Client ()->State () == IClient::STATE_DEMOPLAYBACK)
1317- ProcessTriggeredEvents (pCharInfo->m_Cur .m_TriggeredEvents , vec2 (pCharInfo->m_Cur .m_X , pCharInfo->m_Cur .m_Y ));
13181307 }
13191308 }
13201309 else if (Item.m_Type == NETOBJTYPE_SPECTATORINFO)
@@ -1370,6 +1359,10 @@ void CGameClient::OnNewSnapshot()
13701359 {
13711360 m_Snap.m_pGameDataRace = (const CNetObj_GameDataRace *) pData;
13721361 }
1362+ else if (Item.m_Type == NETOBJTYPE_GAMEDATAPREDICTION)
1363+ {
1364+ m_Snap.m_pGameDataPrediction = (const CNetObj_GameDataPrediction *) pData;
1365+ }
13731366 else if (Item.m_Type == NETOBJTYPE_FLAG)
13741367 {
13751368 m_Snap.m_apFlags [Item.m_ID % 2 ] = (const CNetObj_Flag *) pData;
@@ -1437,9 +1430,23 @@ void CGameClient::OnNewSnapshot()
14371430 }
14381431 }
14391432
1440- // calc some player stats
1433+ // calc some player stats, also trigger events
14411434 for (int i = 0 ; i < MAX_CLIENTS; ++i)
14421435 {
1436+ if (m_Snap.m_aCharacters [i].m_Active )
1437+ {
1438+ int EvolvePrevTick = minimum (m_Snap.m_aCharacters [i].m_Prev .m_Tick + Client ()->GameTickSpeed () * 3 , Client ()->PrevGameTick ());
1439+ int EvolveCurTick = minimum (m_Snap.m_aCharacters [i].m_Cur .m_Tick + Client ()->GameTickSpeed () * 3 , Client ()->GameTick ());
1440+ if (m_Snap.m_aCharacters [i].m_Prev .m_Tick )
1441+ EvolveCharacter (&m_Snap.m_aCharacters [i].m_Prev , EvolvePrevTick);
1442+ if (m_Snap.m_aCharacters [i].m_Cur .m_Tick )
1443+ EvolveCharacter (&m_Snap.m_aCharacters [i].m_Cur , EvolveCurTick);
1444+
1445+ m_aClients[i].m_Evolved = m_Snap.m_aCharacters [i].m_Cur ;
1446+ if (i != m_LocalClientID || !Config ()->m_ClPredict || Client ()->State () == IClient::STATE_DEMOPLAYBACK || !GameDataPredictInput () || !GameDataPredictEvent ())
1447+ ProcessTriggeredEvents (m_Snap.m_aCharacters [i].m_Cur .m_TriggeredEvents , vec2 (m_Snap.m_aCharacters [i].m_Cur .m_X , m_Snap.m_aCharacters [i].m_Cur .m_Y ));
1448+ }
1449+
14431450 if (!m_Snap.m_apPlayerInfos [i])
14441451 continue ;
14451452
@@ -1581,7 +1588,7 @@ void CGameClient::OnPredict()
15811588
15821589 mem_zero (&World.m_apCharacters [c]->m_Input , sizeof (World.m_apCharacters [c]->m_Input ));
15831590
1584- if (m_LocalClientID == c)
1591+ if (m_LocalClientID == c && GameDataPredictInput () )
15851592 {
15861593 // apply player input
15871594 const int *pInput = Client ()->GetInput (Tick);
@@ -1620,7 +1627,7 @@ void CGameClient::OnPredict()
16201627 // necessary to trigger events for them here. Also, our predictions
16211628 // for other players will often be wrong, so it's safer not to
16221629 // trigger events here.
1623- if (m_LocalClientID != -1 && World.m_apCharacters [m_LocalClientID] && Config ()->m_ClPredict )
1630+ if (m_LocalClientID != -1 && World.m_apCharacters [m_LocalClientID] && Config ()->m_ClPredict && GameDataPredictInput () && GameDataPredictEvent () )
16241631 {
16251632 ProcessTriggeredEvents (
16261633 World.m_apCharacters [m_LocalClientID]->m_TriggeredEvents ,
0 commit comments