Example #1
0
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);
	}
}