//-------------------------------------------------------------------------------------------------- // Name: GameRulesInitialise // Desc: Game Rules initialise //-------------------------------------------------------------------------------------------------- void GameSDKCGameEffectsSystem::GameRulesInitialise() { // Add as game rules listener if(g_pGame) { CGameRules* pGameRules = g_pGame->GetGameRules(); if(pGameRules) { pGameRules->AddGameRulesListener(this); } } }//-------------------------------------------------------------------------------------------------
//--------------------------------------- void CMiscAnnouncer::Init() { CryLog("CMiscAnnouncer::Init()"); IEntityClassRegistry *pEntityClassRegistry = gEnv->pEntitySystem->GetClassRegistry(); XmlNodeRef xmlData = GetISystem()->LoadXmlFromFile("Scripts/Sounds/MiscAnnouncements.xml"); InitXML(xmlData); CGameRules *pGameRules = g_pGame->GetGameRules(); pGameRules->RegisterRoundsListener(this); pGameRules->AddGameRulesListener(this); g_pGame->GetIGameFramework()->GetIItemSystem()->RegisterListener(this); }
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; } }