Пример #1
0
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);
    }
}
Пример #2
0
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);
    }
}
Пример #3
0
 /**
  * Determine whether a point is a starting point (no previous edges).
  */
 constexpr
 bool IsFirst() const {
   return GetStageNumber() == 0;
 }