// ----------------------------------------------------------------------- // // // ROUTINE: CoreDump::Update // // PURPOSE: Update function - drain some health/energy // // ----------------------------------------------------------------------- // LTBOOL CoreDump::Update() { // If we're updating, then we need to be decaying ASSERT(!m_bActive && !m_pPlayer); // If we've got -1.0f energy, we don't decay if(m_fTotalEnergy <= 0.0f) { SetNextUpdate(0.0f); return LTTRUE; } SetNextUpdate(0.001f); // Figure out how much to decay based on how much time has passed float fLastFrameDelta = g_pLTServer->GetFrameTime(); float fEnergyLoss = CORE_DUMP_DECAY_AMOUNT_PER_SECOND * fLastFrameDelta; if(fEnergyLoss >= m_fCurrentEnergy) { // We're done Term(); return LTTRUE; } else { // Take away some energy m_fCurrentEnergy -= fEnergyLoss; // See if we need to kill any clientFX float fPercentRemaining = m_fCurrentEnergy / m_fTotalEnergy; int nClientFX = (int)((fPercentRemaining * (float)MAX_CORE_DUMP_FX) + 1.0f); if(nClientFX >= MAX_CORE_DUMP_FX) return LTTRUE; char szFX[512]; // Go through and delete them for(int i=nClientFX;i<MAX_CORE_DUMP_FX;i++) { if(m_collFX[i]) { // If we delete one, let's spawn in a removal effect for it. sprintf(szFX,"CoreDumpRemove_%d",i); PlayClientFX(szFX,m_hObject); g_pLTServer->RemoveObject(m_collFX[i]); m_collFX[i] = NULL; } } } return LTTRUE; }
bool DoomsDayDevice::BeginFire( ) { TRACE( "DoomsDayDevice::BeginFire\n" ); // Change to the doomsday proptype. if( !SetPropType( "Doomsday" )) return false; HMODELANIM hAnim = g_pLTServer->GetAnimIndex( m_hObject, "Idle1" ); if( hAnim == INVALID_ANI ) { ASSERT( !"DoomsDayDevice::BeginFire: Invalid animation." ); return false; } CDoomsDayMissionMgr* pDoomsDayMissionMgr = dynamic_cast< CDoomsDayMissionMgr* >( g_pServerMissionMgr ); if( !pDoomsDayMissionMgr ) { ASSERT( !"DoomsDayDevice::BeginEffect: Invalid missionmgr." ); return false; } // Tell the missionmgr we started firing. pDoomsDayMissionMgr->SetDeviceFiring( m_nOwningTeamID ); // Get the Fx to play. char szDoomsDayDeviceFxName[256] = ""; if( !g_pServerButeMgr->GetDoomsDayDeviceFxName( szDoomsDayDeviceFxName, ARRAY_LEN( szDoomsDayDeviceFxName ))) return false; // Play the fx. PlayClientFX( szDoomsDayDeviceFxName, m_hObject ); // Hide the target models and the piece models... TargetList::const_iterator iterTarget; for( iterTarget = m_lsthTargets.begin(); iterTarget != m_lsthTargets.end(); ++iterTarget ) { g_pCommonLT->SetObjectFlags( *iterTarget, OFT_Flags, 0, FLAG_VISIBLE ); } DoomsDayPieceList::const_iterator iterPiece; for( iterPiece = m_lstPiecesOnDevice.begin(); iterPiece != m_lstPiecesOnDevice.end(); ++iterPiece ) { g_pCommonLT->SetObjectFlags( (*iterPiece)->m_hObject, OFT_Flags, 0, FLAG_VISIBLE ); } g_pLTServer->SetModelAnimation( m_hObject, hAnim ); g_pLTServer->SetModelLooping( m_hObject, LTFALSE ); g_pLTServer->ResetModelAnimation( m_hObject ); SetNextUpdate( UPDATE_NEXT_FRAME ); m_eDoomsDayDeviceState = kDoomsDayDeviceState_Fire; // Do the effect for a little bit before damaging players. float fDamageDelay = g_pServerButeMgr->GetDoomsDayDeviceDamageDelay( ); m_Timer.Start( fDamageDelay ); return true; }