You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
581 lines
12 KiB
581 lines
12 KiB
/******************************************************************** |
|
* * |
|
* func_vgui.cpp * |
|
* * |
|
* par Julien * |
|
* * |
|
********************************************************************/ |
|
|
|
// code du func_vgui |
|
// et du monster_camera |
|
|
|
|
|
//=========================== |
|
//=========================== |
|
// - include |
|
|
|
#include "extdll.h" |
|
#include "util.h" |
|
#include "cbase.h" |
|
#include "player.h" |
|
#include "effects.h" |
|
#include "../cl_dll/crutches.h" //Needed for cameras. |
|
|
|
extern int gmsgKeypad; |
|
extern int gmsgConveyor; |
|
|
|
|
|
//=========================== |
|
//=========================== |
|
// - definition de la classe |
|
// |
|
|
|
class CFuncVgui : public CBaseToggle |
|
{ |
|
public: |
|
void Spawn( void ); |
|
void Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
void EXPORT VguiThink ( void ); |
|
|
|
|
|
void KeyValue( KeyValueData *pkvd ); |
|
|
|
virtual int Save( CSave &save ); |
|
virtual int Restore( CRestore &restore ); |
|
static TYPEDESCRIPTION m_SaveData[]; |
|
|
|
CBasePlayer *m_pPlayer; |
|
CBaseEntity *m_pCaller; |
|
int m_iparam1; |
|
int m_iparam2; |
|
int m_iparam3; |
|
|
|
}; |
|
|
|
|
|
LINK_ENTITY_TO_CLASS( func_vgui, CFuncVgui ); |
|
|
|
|
|
//============================= |
|
// - savestore |
|
|
|
TYPEDESCRIPTION CFuncVgui::m_SaveData[] = |
|
{ |
|
DEFINE_FIELD( CFuncVgui, m_pPlayer, FIELD_CLASSPTR ), |
|
DEFINE_FIELD( CFuncVgui, m_pCaller, FIELD_CLASSPTR ), |
|
DEFINE_FIELD( CFuncVgui, m_iparam1, FIELD_INTEGER ), |
|
DEFINE_FIELD( CFuncVgui, m_iparam2, FIELD_INTEGER ), |
|
DEFINE_FIELD( CFuncVgui, m_iparam3, FIELD_INTEGER ), |
|
}; |
|
|
|
IMPLEMENT_SAVERESTORE( CFuncVgui, CBaseToggle ); |
|
|
|
|
|
//============================= |
|
//============================= |
|
// - fonctions |
|
|
|
|
|
void CFuncVgui :: Spawn ( void ) |
|
{ |
|
pev->angles = g_vecZero; |
|
pev->movetype = MOVETYPE_PUSH; |
|
pev->solid = SOLID_BSP; |
|
|
|
UTIL_SetOrigin( pev, pev->origin ); |
|
SET_MODEL( ENT(pev), STRING(pev->model) ); |
|
|
|
pev->takedamage = DAMAGE_NO; |
|
|
|
pev->rendermode = kRenderTransTexture; |
|
pev->renderamt = 0; //50; |
|
|
|
pev->flags |= FL_WORLDBRUSH; |
|
|
|
// SetUse ( &CFuncVgui::UseVgui ); |
|
} |
|
|
|
|
|
void CFuncVgui :: KeyValue( KeyValueData *pkvd ) |
|
{ |
|
if (FStrEq(pkvd->szKeyName, "vgui")) |
|
{ |
|
m_iparam1 = atoi( pkvd->szValue ); |
|
pkvd->fHandled = TRUE; |
|
} |
|
else if (FStrEq(pkvd->szKeyName, "iparam2") ) |
|
{ |
|
m_iparam2 = atoi( pkvd->szValue ); |
|
pkvd->fHandled = TRUE; |
|
} |
|
else if (FStrEq(pkvd->szKeyName, "iparam3") ) |
|
{ |
|
m_iparam3 = atoi( pkvd->szValue ); |
|
pkvd->fHandled = TRUE; |
|
} |
|
else |
|
{ |
|
CBaseEntity :: KeyValue( pkvd ); |
|
} |
|
} |
|
|
|
|
|
|
|
void CFuncVgui :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) |
|
{ |
|
//que le joueur |
|
|
|
if ( !pActivator->IsPlayer() ) |
|
return; |
|
|
|
m_pPlayer = (CBasePlayer*)pActivator; |
|
m_pCaller = pCaller; |
|
|
|
m_pPlayer->ShowVGUIordiMenu( m_iparam1, m_iparam2, m_iparam3 ); |
|
SetThink ( &CFuncVgui::VguiThink ); |
|
pev->nextthink = pev->nextthink = pev->ltime + 0.5; |
|
|
|
} |
|
|
|
|
|
void CFuncVgui :: VguiThink ( void ) |
|
{ |
|
pev->nextthink = pev->ltime + 0.5; |
|
|
|
|
|
if ( m_pPlayer == NULL || m_pCaller == NULL || ( m_pPlayer->Center() - m_pCaller->pev->origin ).Length() > 90 ) |
|
{ |
|
SetThink ( NULL ); |
|
m_pPlayer->ShowVGUIordiMenu( m_iparam1, m_iparam2, 0 ); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
//========================================= |
|
// |
|
// monster_camera |
|
// |
|
//========================================= |
|
|
|
|
|
//============================= |
|
// - savestore |
|
|
|
|
|
//=========================== |
|
//=========================== |
|
// - definition de la classe |
|
// |
|
|
|
class CMonsterCamera : public CBaseAnimating |
|
{ |
|
public: |
|
void Precache ( void ); |
|
void Spawn( void ); |
|
void Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
void KeyValue( KeyValueData *pkvd ); |
|
|
|
void EXPORT CamAngles ( void ); |
|
|
|
|
|
virtual int Save( CSave &save ); |
|
virtual int Restore( CRestore &restore ); |
|
static TYPEDESCRIPTION m_SaveData[]; |
|
/*#ifndef DONTSAVECAMERASFIX_INVASION_DLL |
|
#endif*/ |
|
|
|
CSprite *pSprite; |
|
int m_iAlarmState; |
|
}; |
|
|
|
|
|
LINK_ENTITY_TO_CLASS( monster_camera, CMonsterCamera ); |
|
|
|
|
|
TYPEDESCRIPTION CMonsterCamera::m_SaveData[] = |
|
{ |
|
#ifndef DONTSAVECAMERASFIX_INVASION_DLL |
|
DEFINE_FIELD( CMonsterCamera, pSprite, FIELD_CLASSPTR ), |
|
#endif |
|
DEFINE_FIELD( CMonsterCamera, m_iAlarmState, FIELD_INTEGER ), |
|
}; |
|
|
|
IMPLEMENT_SAVERESTORE( CMonsterCamera, CBaseAnimating ); |
|
|
|
|
|
|
|
//============================= |
|
//============================= |
|
// - fonctions |
|
|
|
void CMonsterCamera :: Precache() |
|
{ |
|
PRECACHE_MODEL("models/camera.mdl"); |
|
PRECACHE_MODEL("sprites/yelflare1.spr"); |
|
PRECACHE_SOUND("turret/tu_spinup.wav"); |
|
} |
|
|
|
|
|
void CMonsterCamera :: Spawn ( void ) |
|
{ |
|
Precache(); |
|
|
|
pev->movetype = MOVETYPE_NONE; |
|
pev->solid = SOLID_NOT; |
|
|
|
UTIL_SetOrigin( pev, pev->origin ); |
|
SET_MODEL( ENT(pev), "models/camera.mdl" ); |
|
|
|
pev->takedamage = DAMAGE_NO; |
|
|
|
InitBoneControllers(); |
|
|
|
pSprite = CSprite::SpriteCreate( "sprites/yelflare1.spr", pev->origin, FALSE ); |
|
pSprite->SetTransparency( kRenderTransAdd, 0, 0, 255, 220, kRenderFxNoDissipation ); |
|
pSprite->SetAttachment( edict(), 1 ); |
|
pSprite->SetScale( 0.2 ); |
|
|
|
|
|
SetThink( &CMonsterCamera::CamAngles ); |
|
pev->nextthink = gpGlobals->time + 0.1; |
|
|
|
} |
|
|
|
|
|
void CMonsterCamera :: KeyValue( KeyValueData *pkvd ) |
|
{ |
|
if (FStrEq(pkvd->szKeyName, "viewtarget")) |
|
{ |
|
pev->netname = ALLOC_STRING( pkvd->szValue ); |
|
pkvd->fHandled = TRUE; |
|
} |
|
else |
|
{ |
|
CBaseAnimating :: KeyValue( pkvd ); |
|
} |
|
} |
|
|
|
|
|
void CMonsterCamera :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) |
|
{ |
|
if ( value == 1 ) |
|
{ |
|
//d |
|
#ifndef DONTSAVECAMERASFIX_INVASION_DLL |
|
pSprite->SetThink( &CBaseEntity::SUB_Remove ); |
|
pSprite->pev->nextthink = gpGlobals->time + 0.1; |
|
#endif |
|
|
|
SetBoneController( 0, 90 ); |
|
SetBoneController( 1, 0 ); |
|
m_iAlarmState = 3; |
|
|
|
} |
|
|
|
else if ( m_iAlarmState == 0 ) |
|
{ |
|
//cr |
|
|
|
#ifndef DONTSAVECAMERASFIX_INVASION_DLL |
|
pSprite->SetThink( &CBaseEntity::SUB_Remove ); |
|
pSprite->pev->nextthink = gpGlobals->time + 0.1; |
|
#endif |
|
|
|
pSprite = CSprite::SpriteCreate( "sprites/yelflare1.spr", pev->origin, FALSE ); |
|
pSprite->SetTransparency( kRenderTransAdd, 255, 0, 0, 220, kRenderFxStrobeFast ); |
|
pSprite->SetAttachment( edict(), 1 ); |
|
pSprite->SetScale( 0.2 ); |
|
|
|
SUB_UseTargets( this, USE_TOGGLE, 0 ); |
|
m_iAlarmState = 1; |
|
|
|
EMIT_SOUND ( ENT(pev), CHAN_VOICE, "turret/tu_spinup.wav", 1.0, ATTN_NORM ); |
|
} |
|
} |
|
|
|
|
|
void CMonsterCamera :: CamAngles ( void ) |
|
{ |
|
CBaseEntity *pViewTarget; |
|
edict_t *pentViewTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING(pev->netname)); |
|
|
|
if (!FNullEnt(pentViewTarget)) |
|
{ |
|
pViewTarget = CBaseEntity::Instance( pentViewTarget ); |
|
|
|
Vector vecViewAngles = UTIL_VecToAngles( pViewTarget->pev->origin - pev->origin ); |
|
|
|
SetBoneController( 0, -vecViewAngles.x ); |
|
SetBoneController( 1, vecViewAngles.y - pev->angles.y ); |
|
|
|
} |
|
|
|
SetThink( NULL ); |
|
} |
|
|
|
|
|
|
|
|
|
//=========================== |
|
//=========================== |
|
// - definition de la classe |
|
// |
|
|
|
class CFuncKeypad : public CBaseToggle |
|
{ |
|
public: |
|
void Spawn( void ); |
|
void Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
void EXPORT VguiThink ( void ); |
|
|
|
void Precache ( void ); |
|
|
|
|
|
virtual int ObjectCaps( void ) { return (CBaseEntity ::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_IMPULSE_USE; } |
|
|
|
|
|
void KeyValue( KeyValueData *pkvd ); |
|
|
|
virtual int Save( CSave &save ); |
|
virtual int Restore( CRestore &restore ); |
|
static TYPEDESCRIPTION m_SaveData[]; |
|
|
|
int m_iCode; |
|
|
|
}; |
|
|
|
|
|
LINK_ENTITY_TO_CLASS( func_keypad, CFuncKeypad ); |
|
|
|
|
|
//============================= |
|
// - savestore |
|
|
|
TYPEDESCRIPTION CFuncKeypad::m_SaveData[] = |
|
{ |
|
DEFINE_FIELD( CFuncKeypad, m_iCode, FIELD_INTEGER ), |
|
}; |
|
|
|
IMPLEMENT_SAVERESTORE( CFuncKeypad, CBaseToggle ); |
|
|
|
|
|
//============================= |
|
//============================= |
|
// - fonctions |
|
|
|
|
|
void CFuncKeypad :: Spawn ( void ) |
|
{ |
|
Precache (); |
|
|
|
pev->angles = g_vecZero; |
|
pev->movetype = MOVETYPE_PUSH; |
|
pev->solid = SOLID_BSP; |
|
|
|
UTIL_SetOrigin( pev, pev->origin ); |
|
SET_MODEL( ENT(pev), STRING(pev->model) ); |
|
|
|
pev->takedamage = DAMAGE_NO; |
|
|
|
pev->flags |= FL_WORLDBRUSH; |
|
|
|
} |
|
|
|
|
|
void CFuncKeypad :: Precache ( void ) |
|
{ |
|
PRECACHE_SOUND ( "buttons/button10.wav" ); |
|
} |
|
|
|
void CFuncKeypad :: KeyValue( KeyValueData *pkvd ) |
|
{ |
|
if (FStrEq(pkvd->szKeyName, "code")) |
|
{ |
|
m_iCode = atoi( pkvd->szValue ); |
|
pkvd->fHandled = TRUE; |
|
} |
|
else |
|
{ |
|
CBaseEntity :: KeyValue( pkvd ); |
|
} |
|
} |
|
|
|
|
|
|
|
void CFuncKeypad :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) |
|
{ |
|
//que le joueur |
|
|
|
if ( !pActivator->IsPlayer() ) |
|
return; |
|
|
|
SetThink ( &CFuncKeypad::VguiThink ); |
|
pev->nextthink = pev->nextthink = pev->ltime + 0.5; |
|
|
|
MESSAGE_BEGIN( MSG_ALL, gmsgKeypad, NULL ); |
|
WRITE_BYTE( 1 ); // on-off |
|
WRITE_LONG( m_iCode ); |
|
WRITE_LONG( ENTINDEX(edict() ) ); |
|
MESSAGE_END(); |
|
} |
|
|
|
|
|
void CFuncKeypad :: VguiThink ( void ) |
|
{ |
|
pev->nextthink = pev->ltime + 0.5; |
|
|
|
CBaseEntity *pPlayer = (CBasePlayer *)CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) ); |
|
|
|
|
|
if ( pPlayer == NULL || ( pPlayer->Center() - pev->origin ).Length() > 64 ) |
|
{ |
|
SetThink ( NULL ); |
|
|
|
MESSAGE_BEGIN( MSG_ALL, gmsgKeypad, NULL ); |
|
WRITE_BYTE( 0 ); // on-off |
|
MESSAGE_END(); |
|
} |
|
} |
|
|
|
//----------------------------------------------------- |
|
// - Conveyor control |
|
|
|
//=========================== |
|
//=========================== |
|
// - definition de la classe |
|
// |
|
|
|
class CConveyorControl : public CBaseToggle |
|
{ |
|
public: |
|
void Spawn( void ); |
|
void Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
void EXPORT VguiThink ( void ); |
|
|
|
void Precache ( void ); |
|
|
|
|
|
virtual int ObjectCaps( void ) { return (CBaseEntity ::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_IMPULSE_USE; } |
|
|
|
virtual int Save( CSave &save ); |
|
virtual int Restore( CRestore &restore ); |
|
static TYPEDESCRIPTION m_SaveData[]; |
|
|
|
int m_ibitConveyor; |
|
}; |
|
|
|
|
|
LINK_ENTITY_TO_CLASS( func_conveyorcontrol, CConveyorControl ); |
|
|
|
|
|
//============================= |
|
// - savestore |
|
|
|
TYPEDESCRIPTION CConveyorControl::m_SaveData[] = |
|
{ |
|
DEFINE_FIELD ( CConveyorControl, m_ibitConveyor, FIELD_INTEGER ), |
|
}; |
|
|
|
IMPLEMENT_SAVERESTORE( CConveyorControl, CBaseToggle ); |
|
|
|
|
|
//============================= |
|
//============================= |
|
// - fonctions |
|
|
|
|
|
void CConveyorControl :: Spawn ( void ) |
|
{ |
|
Precache (); |
|
|
|
pev->angles = g_vecZero; |
|
pev->movetype = MOVETYPE_PUSH; |
|
pev->solid = SOLID_BSP; |
|
|
|
UTIL_SetOrigin( pev, pev->origin ); |
|
SET_MODEL( ENT(pev), STRING(pev->model) ); |
|
|
|
pev->takedamage = DAMAGE_NO; |
|
|
|
pev->flags |= FL_WORLDBRUSH; |
|
|
|
m_ibitConveyor = 0; |
|
|
|
for ( int i=0; i<4; i++ ) |
|
m_ibitConveyor |= (1<<i); |
|
|
|
} |
|
|
|
|
|
void CConveyorControl :: Precache ( void ) |
|
{ |
|
PRECACHE_SOUND ( "buttons/button10.wav" ); |
|
} |
|
|
|
|
|
void CConveyorControl :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) |
|
{ |
|
|
|
if ( useType == USE_OFF ) |
|
{ |
|
int iNewBit = value; |
|
|
|
for ( int i=0; i<5; i++ ) |
|
{ |
|
int iOld = m_ibitConveyor & ( 1<<i ); |
|
int iNew = iNewBit & ( 1<<i ); |
|
|
|
if ( iOld != iNew ) |
|
{ |
|
char sz [64]; |
|
sprintf ( sz, "conveyor%i", i+1 ); |
|
|
|
CBaseEntity *pPlayer = (CBasePlayer *)CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) ); |
|
|
|
FireTargets( sz, pPlayer, pPlayer, USE_ON, 0 ); |
|
} |
|
} |
|
|
|
m_ibitConveyor = iNewBit; |
|
} |
|
|
|
|
|
else |
|
{ |
|
//que le joueur |
|
|
|
if ( !pActivator->IsPlayer() ) |
|
return; |
|
|
|
SetThink ( &CConveyorControl::VguiThink ); |
|
pev->nextthink = pev->nextthink = pev->ltime + 0.5; |
|
//ALERT( at_console, "Sending conveyor message: %d \n", m_ibitConveyor ); //just a bit of debug code modif de Roy |
|
|
|
MESSAGE_BEGIN( MSG_ALL, gmsgConveyor, NULL ); |
|
WRITE_BYTE( 1 ); // on-off |
|
WRITE_BYTE( m_ibitConveyor ); |
|
MESSAGE_END(); |
|
} |
|
} |
|
|
|
|
|
void CConveyorControl :: VguiThink ( void ) |
|
{ |
|
pev->nextthink = pev->ltime + 0.5; |
|
|
|
CBaseEntity *pPlayer = (CBasePlayer *)CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) ); |
|
|
|
|
|
if ( pPlayer == NULL || ( pPlayer->Center() - pev->origin ).Length() > 64 ) |
|
{ |
|
SetThink ( NULL ); |
|
|
|
MESSAGE_BEGIN( MSG_ALL, gmsgConveyor, NULL ); |
|
WRITE_BYTE( 0 ); // on-off |
|
MESSAGE_END(); |
|
} |
|
}
|
|
|