|
|
|
/***
|
|
|
|
*
|
|
|
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
|
|
|
*
|
|
|
|
* This product contains software technology licensed from Id
|
|
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
|
|
* without written permission from Valve LLC.
|
|
|
|
*
|
|
|
|
****/
|
|
|
|
#include "extdll.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "cbase.h"
|
|
|
|
#include "monsters.h"
|
|
|
|
#include "customentity.h"
|
|
|
|
#include "effects.h"
|
|
|
|
#include "weapons.h"
|
|
|
|
#include "decals.h"
|
|
|
|
#include "func_break.h"
|
|
|
|
#include "shake.h"
|
|
|
|
|
|
|
|
// pev->scale is amplitude
|
|
|
|
// pev->dmg_save is frequency
|
|
|
|
// pev->dmg_take is duration
|
|
|
|
// pev->dmg is radius
|
|
|
|
// radius of 0 means all players
|
|
|
|
// NOTE: UTIL_ScreenShake() will only shake players who are on the ground
|
|
|
|
|
|
|
|
#define SF_SHAKE_TYPE_SMALL 0x0001
|
|
|
|
#define SF_SHAKE_TYPE_MEDIUM 0x0002
|
|
|
|
#define SF_SHAKE_TYPE_HUGE 0x0004
|
|
|
|
|
|
|
|
// ==========================================
|
|
|
|
// Code changes for- Night at the Office:
|
|
|
|
// ==========================================
|
|
|
|
//
|
|
|
|
// -Entity: env_random_shake. An entity that randomly shakes
|
|
|
|
// the screen globally across the map, includes sounds effects.
|
|
|
|
// Purpose is to allow multiple shakes without the need of many
|
|
|
|
// entitys and triggers. The intensity of the shake is random,
|
|
|
|
// the duration is random and the delay between fires is also
|
|
|
|
// random.
|
|
|
|
|
|
|
|
class CRandomShake : public CBaseDelay
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
void Spawn();
|
|
|
|
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
|
|
|
void KeyValue( KeyValueData *pkvd );
|
|
|
|
|
|
|
|
void Shake();
|
|
|
|
|
|
|
|
inline float Amplitude() { return pev->scale; }
|
|
|
|
inline float Frequency() { return pev->dmg_save; }
|
|
|
|
inline float Duration() { return pev->dmg_take; }
|
|
|
|
inline float Radius() { return pev->dmg; }
|
|
|
|
|
|
|
|
inline void SetAmplitude( float amplitude ) { pev->scale = amplitude; }
|
|
|
|
inline void SetFrequency( float frequency ) { pev->dmg_save = frequency; }
|
|
|
|
inline void SetDuration( float duration ) { pev->dmg_take = duration; }
|
|
|
|
inline void SetRadius( float radius ) { pev->dmg = radius; }
|
|
|
|
|
|
|
|
void EXPORT ShootThink();
|
|
|
|
|
|
|
|
int m_iShakeCount;
|
|
|
|
};
|
|
|
|
|
|
|
|
LINK_ENTITY_TO_CLASS( env_random_shake, CRandomShake )
|
|
|
|
|
|
|
|
void CRandomShake::Spawn()
|
|
|
|
{
|
|
|
|
pev->solid = SOLID_NOT;
|
|
|
|
pev->movetype = MOVETYPE_NONE;
|
|
|
|
pev->effects = 0;
|
|
|
|
pev->frame = 0;
|
|
|
|
|
|
|
|
SetRadius( 0 );
|
|
|
|
SetDuration( RANDOM_LONG( 2, 8 ) );
|
|
|
|
|
|
|
|
m_iShakeCount = 10;
|
|
|
|
|
|
|
|
if( m_flDelay == 0.0f )
|
|
|
|
m_flDelay = 0.1f;
|
|
|
|
|
|
|
|
SetAmplitude( 4.0f );
|
|
|
|
|
|
|
|
if( pev->spawnflags & SF_SHAKE_TYPE_SMALL )
|
|
|
|
SetAmplitude( RANDOM_FLOAT( 1.0f, 5.0f ) );
|
|
|
|
|
|
|
|
if( pev->spawnflags & SF_SHAKE_TYPE_MEDIUM )
|
|
|
|
SetAmplitude( RANDOM_FLOAT( 4.0f, 10.0f ) );
|
|
|
|
|
|
|
|
if( pev->spawnflags & SF_SHAKE_TYPE_HUGE )
|
|
|
|
SetAmplitude( RANDOM_FLOAT( 8.0f, 16.0f ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CRandomShake::KeyValue( KeyValueData *pkvd )
|
|
|
|
{
|
|
|
|
if( FStrEq( pkvd->szKeyName, "frequency" ) )
|
|
|
|
{
|
|
|
|
SetFrequency( atof( pkvd->szValue ) );
|
|
|
|
pkvd->fHandled = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
CBaseDelay::KeyValue( pkvd );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CRandomShake::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
|
|
|
{
|
|
|
|
SetThink( &CRandomShake::ShootThink );
|
|
|
|
|
|
|
|
pev->nextthink = gpGlobals->time;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CRandomShake::Shake()
|
|
|
|
{
|
|
|
|
UTIL_ScreenShake( pev->origin, Amplitude(), Frequency(), Duration(), Radius() );
|
|
|
|
|
|
|
|
EMIT_GROUPNAME_SUIT( ENT( pev ), "FRAGILE" );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CRandomShake::ShootThink()
|
|
|
|
{
|
|
|
|
m_flDelay = RANDOM_FLOAT( 9.0f, 24.0f );
|
|
|
|
|
|
|
|
pev->nextthink = gpGlobals->time + m_flDelay;
|
|
|
|
|
|
|
|
Shake();
|
|
|
|
|
|
|
|
if( --m_iShakeCount <= 0 )
|
|
|
|
{
|
|
|
|
m_iShakeCount += 10;
|
|
|
|
|
|
|
|
pev->nextthink = gpGlobals->time;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|