void CReplayManager::TakeSnapshot() { Snapshot *pSnap = new Snapshot; pSnap->snaptime = gpGlobals->curtime; pSnap->replayCount = 0; BallSnapshot *pBallSnap = new BallSnapshot; GetMatchBall()->VPhysicsGetObject()->GetPosition(&pBallSnap->pos, &pBallSnap->ang); GetMatchBall()->VPhysicsGetObject()->GetVelocity(&pBallSnap->vel, &pBallSnap->rot); pSnap->pBallSnapshot = pBallSnap; for (int i = 0; i < 2; i++) { for (int j = 0; j < 11; j++) { pSnap->pPlayerSnapshot[i][j] = NULL; } } for (int i = 1; i <= gpGlobals->maxClients; i++) { CSDKPlayer *pPl = ToSDKPlayer(UTIL_PlayerByIndex(i)); if (!CSDKPlayer::IsOnField(pPl)) continue; PlayerSnapshot *pPlSnap = new PlayerSnapshot; pPlSnap->pos = pPl->GetLocalOrigin(); pPlSnap->vel = pPl->GetLocalVelocity(); pPlSnap->ang = pPl->GetLocalAngles(); for(int layerIndex = 0; layerIndex < NUM_LAYERS_WANTED; layerIndex++) { const CAnimationLayer *pSourceLayer = pPl->GetAnimOverlay(layerIndex); if(!pSourceLayer) continue; LayerRecord *pTargetLayer = &pPlSnap->layerRecords[layerIndex]; if(!pTargetLayer) continue; pTargetLayer->cycle = pSourceLayer->m_flCycle; pTargetLayer->order = pSourceLayer->m_nOrder; pTargetLayer->sequence = pSourceLayer->m_nSequence; pTargetLayer->weight = pSourceLayer->m_flWeight; pTargetLayer->playbackRate = pSourceLayer->m_flPlaybackRate; pTargetLayer->looping = pSourceLayer->m_bLooping; pTargetLayer->sequenceFinished = pSourceLayer->m_bSequenceFinished; pTargetLayer->flags = pSourceLayer->m_fFlags; pTargetLayer->priority = pSourceLayer->m_nPriority; pTargetLayer->activity = pSourceLayer->m_nActivity; pTargetLayer->layerAnimtime = pSourceLayer->m_flLayerAnimtime; pTargetLayer->blendIn = pSourceLayer->m_flBlendIn; pTargetLayer->blendOut = pSourceLayer->m_flBlendOut; pTargetLayer->prevCycle = pSourceLayer->m_flPrevCycle; pTargetLayer->killDelay = pSourceLayer->m_flKillDelay; pTargetLayer->killRate = pSourceLayer->m_flKillRate; pTargetLayer->lastAccess = pSourceLayer->m_flLastAccess; pTargetLayer->lastEventCheck = pSourceLayer->m_flLastEventCheck; pTargetLayer->layerFadeOuttime = pSourceLayer->m_flLayerFadeOuttime; } pPlSnap->masterSequence = pPl->GetSequence(); pPlSnap->masterCycle = pPl->GetCycle(); pPlSnap->simulationTime = pPl->GetSimulationTime(); pPlSnap->moveX = pPl->GetPoseParameter(4); pPlSnap->moveY = pPl->GetPoseParameter(3); pPlSnap->teamNumber = pPl->GetTeamNumber(); pPlSnap->teamPosIndex = pPl->GetTeamPosIndex(); pPlSnap->isKeeper = pPl->GetTeamPosType() == POS_GK; pPlSnap->shirtNumber = pPl->GetShirtNumber(); pPlSnap->skinIndex = pPl->GetSkinIndex(); pPlSnap->body = pPl->m_nBody; pPlSnap->pPlayerData = pPl->GetPlayerData(); pSnap->pPlayerSnapshot[pPl->GetTeamNumber() - TEAM_HOME][pPl->GetTeamPosIndex()] = pPlSnap; } m_Snapshots.AddToTail(pSnap); // Add the snapshot to existing highlights if their end time hasn't been reached yet for (int i = 0; i < m_MatchEvents.Count(); i++) { if (m_MatchEvents[i]->snapshotEndTime >= gpGlobals->curtime) { m_MatchEvents[i]->snapshots.AddToTail(pSnap); pSnap->replayCount += 1; } } float replayStartTime = GetReplayStartTime(); // Remove old snapshots from the list. Only free a snapshot's memory if it isn't part of any highlight. while (m_Snapshots.Count() >= 2 && m_Snapshots[0]->snaptime < replayStartTime && m_Snapshots[1]->snaptime <= replayStartTime) { if (m_Snapshots[0]->replayCount == 0) delete m_Snapshots[0]; m_Snapshots.Remove(0); } }