Ejemplo n.º 1
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);
    }
}
Ejemplo n.º 2
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);
    }
}
Ejemplo n.º 3
0
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);
}