void ProcessEvent( EFlowEvent event, SActivationInfo *pActInfo ) { switch (event) { case eFE_Initialize: { CGameRules* pGameRules = g_pGame->GetGameRules(); if(pGameRules) pGameRules->AddGameRulesListener(this); CPlayer* pPlayer = static_cast<CPlayer*>(g_pGame->GetIGameFramework()->GetClientActor()); if(pPlayer) m_localPlayerSpectatorMode = pPlayer->GetSpectatorMode(); m_actInfo = *pActInfo; } break; case eFE_Activate: break; case eFE_Update: { CPlayer* pPlayer = static_cast<CPlayer*>(g_pGame->GetIGameFramework()->GetClientActor()); if(!pPlayer) return; // first check: tac weapons trigger endgamenear / endgameinvalid if(m_MDList.empty() && m_endGameNear) { // if less than 3 min remaining don't return to normal bool cancel = true; if(g_pGame && g_pGame->GetGameRules() && g_pGame->GetGameRules()->IsTimeLimited() && m_timeRemainingTriggered) { float timeRemaining = g_pGame->GetGameRules()->GetRemainingGameTime(); if(timeRemaining < GetPortFloat(pActInfo, EIP_GameEndTime) ) cancel = false; } if(cancel) { if(g_pGame->GetCVars()->i_debug_mp_flowgraph != 0) { CryLog("MP flowgraph: EndGameInvalid"); } ActivateOutput(&m_actInfo, EOP_EndGameInvalid, true); m_endGameNear = false; } } else if(!m_MDList.empty()) { // go through the list of tac/sing weapons and check if they are still present std::list<EntityId>::iterator next; std::list<EntityId>::iterator it = m_MDList.begin(); for(; it != m_MDList.end(); it = next) { next = it; ++next; if(gEnv->pEntitySystem->GetEntity(*it)) { // entity exists so trigger loud music if not already done if(!m_endGameNear) { if(g_pGame->GetCVars()->i_debug_mp_flowgraph != 0) { CryLog("--MP flowgraph: EndGameNear"); } ActivateOutput(&m_actInfo, EOP_EndGameNear, true); m_endGameNear = true; } // in the case of tanks, entity isn't removed for quite some time after destruction. // Check vehicle health directly here... IVehicle* pVehicle = g_pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle(*it); if(pVehicle && pVehicle->IsDestroyed()) { m_MDList.erase(it); } } else { // entity no longer exists - remove from list. m_MDList.erase(it); } } } // get the remaining time from game rules if(!m_timeRemainingTriggered && g_pGame->GetGameRules() && g_pGame->GetGameRules()->IsTimeLimited() && pPlayer->GetSpectatorMode() == 0 && !m_endGameNear) { float timeRemaining = g_pGame->GetGameRules()->GetRemainingGameTime(); if(timeRemaining < GetPortFloat(pActInfo, EIP_GameEndTime) ) { if(g_pGame->GetCVars()->i_debug_mp_flowgraph != 0) { CryLog("--MP flowgraph: EndGameNear"); } ActivateOutput(&m_actInfo, EOP_EndGameNear, timeRemaining); m_timeRemainingTriggered = true; m_endGameNear = true; } } // also check whether the local player is in game yet if(pPlayer->GetSpectatorMode() == 0 && m_localPlayerSpectatorMode != 0) { if(g_pGame->GetCVars()->i_debug_mp_flowgraph != 0) { CryLog("--MP flowgraph: EnteredGame"); } ActivateOutput(&m_actInfo, EOP_EnteredGame, true); m_localPlayerSpectatorMode = pPlayer->GetSpectatorMode(); } } break; } }
virtual void ProcessEvent(EFlowEvent flowEvent, SActivationInfo* pActivationInfo) { if (flowEvent == eFE_Activate && IsPortActive(pActivationInfo, EIP_StartDriving)) { IEntity* pEntity = pActivationInfo->pEntity; if(!pEntity) return; IVehicle* pVehicle; pVehicle = gEnv->pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle( pEntity->GetId() ); if(!pVehicle || pVehicle->IsDestroyed()) { return; } IVehicleMovement* pMovement = pVehicle->GetMovement(); if (!pMovement) return; CVehicleMovementBase* pMovementBase = StaticCast_CVehicleMovementBase(pMovement); if (!pMovementBase) return; IActor* pPlayer = g_pGame->GetIGameFramework()->GetClientActor(); if (!pPlayer) return; const EntityId localPlayer = pPlayer->GetEntityId(); if (pVehicle->GetSeatCount() == 0) // Don't need to remotely enter { pMovement->StartDriving(localPlayer); } else { pVehicle->EvictAllPassengers(); IVehicleSeat* pSeat = pVehicle->GetSeatById(1); if (pSeat) { // Can't use remote entering to control otherwise if vehicle blows up, player dies //pSeat->EnterRemotely(localPlayer); pMovement->StartDriving(localPlayer); m_prevSeatLockStatus = pSeat->GetLockedStatus(); pSeat->SetLocked(eVSLS_Locked); } } m_fDuration = GetPortFloat(pActivationInfo, EIP_Time); m_fSpeed = GetPortFloat(pActivationInfo, EIP_Speed); m_actInfo = *pActivationInfo; m_entityId = pEntity->GetId(); SetActive(true); } else if (flowEvent == eFE_Update) { if (!m_bActive) { if (m_bNeedsCleanup) { Cleanup(); } return; } IEntity* pEntity = pActivationInfo->pEntity; if(!pEntity) { SetActive(false); return; } IVehicle* pVehicle; pVehicle = gEnv->pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle( pEntity->GetId() ); if(!pVehicle || pVehicle->IsDestroyed()) { SetActive(false); return; } const float curTime = gEnv->pTimer->GetFrameStartTime().GetSeconds(); if ((curTime - m_fStartedTime) >= m_fDuration) { SetActive(false); ActivateOutput(pActivationInfo, EOP_TimeComplete, true); } else // Update every frame { IVehicleMovement* pMovement = pVehicle->GetMovement(); if (pMovement) { // prevent full pedal being kept pressed, but give it a bit pMovement->OnAction(eVAI_MoveForward, eAAM_OnPress, 1.0f); } } } }