void CTriggerStage::StartTouch(CBaseEntity *pOther) { BaseClass::StartTouch(pOther); int stageNum = GetStageNumber(); IGameEvent *stageEvent = nullptr; CMomentumPlayer *pPlayer = ToCMOMPlayer(pOther); if (pPlayer) { //Set the current stage to this g_Timer->SetCurrentStage(this); //Set player run data pPlayer->m_RunData.m_bIsInZone = true; pPlayer->m_RunData.m_iCurrentZone = stageNum; stageEvent = gameeventmanager->CreateEvent("zone_enter"); if (g_Timer->IsRunning()) { pPlayer->m_RunStats.SetZoneExitSpeed(stageNum - 1, pPlayer->GetLocalVelocity().Length(), pPlayer->GetLocalVelocity().Length2D()); g_Timer->CalculateTickIntervalOffset(pPlayer, g_Timer->ZONETYPE_END); pPlayer->m_RunStats.SetZoneEnterTime(stageNum, g_Timer->CalculateStageTime(stageNum)); pPlayer->m_RunStats.SetZoneTime(stageNum - 1, pPlayer->m_RunStats.GetZoneEnterTime(stageNum) - pPlayer->m_RunStats.GetZoneEnterTime(stageNum - 1)); } } else { CMomentumReplayGhostEntity *pGhost = dynamic_cast<CMomentumReplayGhostEntity*>(pOther); if (pGhost) { stageEvent = gameeventmanager->CreateEvent("zone_enter"); pGhost->m_RunData.m_iCurrentZone = stageNum; pGhost->m_RunData.m_bIsInZone = true; } } //Used by speedometer UI if (stageEvent) { gameeventmanager->FireEvent(stageEvent); } }
void CTriggerStage::EndTouch(CBaseEntity *pOther) { BaseClass::EndTouch(pOther); int stageNum = GetStageNumber(); CMomentumPlayer *pPlayer = ToCMOMPlayer(pOther); IGameEvent *stageEvent = nullptr; if (pPlayer) { if (stageNum == 1 || g_Timer->IsRunning())//Timer won't be running if it's the start trigger { //This handles both the start and stage triggers g_Timer->CalculateTickIntervalOffset(pPlayer, g_Timer->ZONETYPE_START); //Status pPlayer->m_RunData.m_bIsInZone = false; float enterVel3D = pPlayer->GetLocalVelocity().Length(), enterVel2D = pPlayer->GetLocalVelocity().Length2D(); pPlayer->m_RunStats.SetZoneEnterSpeed(stageNum, enterVel3D, enterVel2D); if (stageNum == 1) pPlayer->m_RunStats.SetZoneEnterSpeed(0, enterVel3D, enterVel2D); stageEvent = gameeventmanager->CreateEvent("zone_exit"); } } else { CMomentumReplayGhostEntity *pGhost = dynamic_cast<CMomentumReplayGhostEntity*>(pOther); if (pGhost) { pGhost->m_RunData.m_bIsInZone = false; stageEvent = gameeventmanager->CreateEvent("zone_exit"); } } if (stageEvent) { gameeventmanager->FireEvent(stageEvent); } }
/** * Determine whether a point is a starting point (no previous edges). */ constexpr bool IsFirst() const { return GetStageNumber() == 0; }