예제 #1
0
// ----------------------------------------------------------------------- //
//
//	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;
}
예제 #2
0
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;
}