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); } }
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 CTriggerTimerStop::StartTouch(CBaseEntity *pOther) { CMomentumPlayer *pPlayer = ToCMOMPlayer(pOther); IGameEvent *stageEvent = nullptr; // If timer is already stopped, there's nothing to stop (No run state effect to play) if (pPlayer) { g_Timer->SetEndTrigger(this); if (g_Timer->IsRunning() && !pPlayer->IsWatchingReplay()) { int zoneNum = pPlayer->m_RunData.m_iCurrentZone; // This is needed so we have an ending velocity. pPlayer->m_RunStats.SetZoneExitSpeed(zoneNum, pPlayer->GetLocalVelocity().Length(), pPlayer->GetLocalVelocity().Length2D()); //Check to see if we should calculate the timer offset fix if (ContainsPosition(pPlayer->GetPrevOrigin())) DevLog("PrevOrigin inside of end trigger, not calculating offset!\n"); else { DevLog("Previous origin is NOT inside the trigger, calculating offset...\n"); g_Timer->CalculateTickIntervalOffset(pPlayer, g_Timer->ZONETYPE_END); } //This is needed for the final stage pPlayer->m_RunStats.SetZoneTime(zoneNum, g_Timer->GetCurrentTime() - pPlayer->m_RunStats.GetZoneEnterTime(zoneNum)); //Ending velocity checks float endvel = pPlayer->GetLocalVelocity().Length(); float endvel2D = pPlayer->GetLocalVelocity().Length2D(); float finalVel = endvel; float finalVel2D = endvel2D; if (endvel <= pPlayer->m_RunStats.GetZoneVelocityMax(0, false)) finalVel = pPlayer->m_RunStats.GetZoneVelocityMax(0, false); if (endvel2D <= pPlayer->m_RunStats.GetZoneVelocityMax(0, true)) finalVel2D = pPlayer->m_RunStats.GetZoneVelocityMax(0, true); pPlayer->m_RunStats.SetZoneVelocityMax(0, finalVel, finalVel2D); pPlayer->m_RunStats.SetZoneExitSpeed(0, endvel, endvel2D); //Stop the timer g_Timer->Stop(true); pPlayer->m_RunData.m_flRunTime = g_Timer->GetLastRunTime(); //The map is now finished, show the mapfinished panel pPlayer->m_RunData.m_bMapFinished = true; pPlayer->m_RunData.m_bTimerRunning = false; } stageEvent = gameeventmanager->CreateEvent("zone_enter"); pPlayer->m_RunData.m_bIsInZone = true; } else { CMomentumReplayGhostEntity *pGhost = dynamic_cast<CMomentumReplayGhostEntity*>(pOther); if (pGhost) { stageEvent = gameeventmanager->CreateEvent("zone_enter"); pGhost->m_RunData.m_bMapFinished = true; pGhost->m_RunData.m_bTimerRunning = false; pGhost->m_RunData.m_bIsInZone = true; //Needed for hud_comparisons IGameEvent *timerStateEvent = gameeventmanager->CreateEvent("timer_state"); if (timerStateEvent) { timerStateEvent->SetInt("ent", pGhost->entindex()); timerStateEvent->SetBool("is_running", false); gameeventmanager->FireEvent(timerStateEvent); } pGhost->StopTimer(); //MOM_TODO: Maybe play effects if the player is racing against us and lost? } } //Used by speedometer if (stageEvent) { gameeventmanager->FireEvent(stageEvent); } BaseClass::StartTouch(pOther); }