Server format.

This commit is contained in:
Night Owl 2016-07-31 18:48:50 +05:00
parent 7b24b6a6db
commit 5890ff41ee
125 changed files with 20171 additions and 19881 deletions

View File

@ -16,7 +16,6 @@
#ifndef ACTIVITY_H #ifndef ACTIVITY_H
#define ACTIVITY_H #define ACTIVITY_H
typedef enum { typedef enum {
ACT_RESET = 0, // Set m_Activity to this invalid value to force a reset to m_IdealActivity ACT_RESET = 0, // Set m_Activity to this invalid value to force a reset to m_IdealActivity
ACT_IDLE = 1, ACT_IDLE = 1,
@ -97,13 +96,11 @@ typedef enum {
ACT_FLINCH_RIGHTLEG ACT_FLINCH_RIGHTLEG
} Activity; } Activity;
typedef struct
typedef struct { {
int type; int type;
char *name; char *name;
} activity_map_t; } activity_map_t;
extern activity_map_t activity_map[]; extern activity_map_t activity_map[];
#endif //ACTIVITY_H #endif //ACTIVITY_H

View File

@ -14,13 +14,14 @@
****/ ****/
//========================================================= //=========================================================
//========================================================= //=========================================================
#include "extdll.h" #include "extdll.h"
#include "util.h" #include "util.h"
#include "cbase.h" #include "cbase.h"
#include "monsters.h" #include "monsters.h"
#include "squadmonster.h" #include "squadmonster.h"
#define AFLOCK_MAX_RECRUIT_RADIUS 1024 #define AFLOCK_MAX_RECRUIT_RADIUS 1024
#define AFLOCK_FLY_SPEED 125 #define AFLOCK_FLY_SPEED 125
#define AFLOCK_TURN_RATE 75 #define AFLOCK_TURN_RATE 75
#define AFLOCK_ACCELERATE 10 #define AFLOCK_ACCELERATE 10
@ -38,18 +39,18 @@ public:
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void SpawnFlock( void ); void SpawnFlock( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
// Sounds are shared by the flock // Sounds are shared by the flock
static void PrecacheFlockSounds( void ); static void PrecacheFlockSounds( void );
int m_cFlockSize; int m_cFlockSize;
float m_flFlockRadius; float m_flFlockRadius;
}; };
TYPEDESCRIPTION CFlockingFlyerFlock::m_SaveData[] = TYPEDESCRIPTION CFlockingFlyerFlock::m_SaveData[] =
{ {
DEFINE_FIELD( CFlockingFlyerFlock, m_cFlockSize, FIELD_INTEGER ), DEFINE_FIELD( CFlockingFlyerFlock, m_cFlockSize, FIELD_INTEGER ),
DEFINE_FIELD( CFlockingFlyerFlock, m_flFlockRadius, FIELD_FLOAT ), DEFINE_FIELD( CFlockingFlyerFlock, m_flFlockRadius, FIELD_FLOAT ),
@ -81,13 +82,13 @@ public:
BOOL FPathBlocked( void ); BOOL FPathBlocked( void );
//void KeyValue( KeyValueData *pkvd ); //void KeyValue( KeyValueData *pkvd );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int IsLeader( void ) { return m_pSquadLeader == this; } int IsLeader( void ) { return m_pSquadLeader == this; }
int InSquad( void ) { return m_pSquadLeader != NULL; } int InSquad( void ) { return m_pSquadLeader != NULL; }
int SquadCount( void ); int SquadCount( void );
void SquadRemove( CFlockingFlyer *pRemove ); void SquadRemove( CFlockingFlyer *pRemove );
void SquadUnlink( void ); void SquadUnlink( void );
void SquadAdd( CFlockingFlyer *pAdd ); void SquadAdd( CFlockingFlyer *pAdd );
@ -95,22 +96,22 @@ public:
CFlockingFlyer *m_pSquadLeader; CFlockingFlyer *m_pSquadLeader;
CFlockingFlyer *m_pSquadNext; CFlockingFlyer *m_pSquadNext;
BOOL m_fTurning;// is this boid turning? BOOL m_fTurning;// is this boid turning?
BOOL m_fCourseAdjust;// followers set this flag TRUE to override flocking while they avoid something BOOL m_fCourseAdjust;// followers set this flag TRUE to override flocking while they avoid something
BOOL m_fPathBlocked;// TRUE if there is an obstacle ahead BOOL m_fPathBlocked;// TRUE if there is an obstacle ahead
Vector m_vecReferencePoint;// last place we saw leader Vector m_vecReferencePoint;// last place we saw leader
Vector m_vecAdjustedVelocity;// adjusted velocity (used when fCourseAdjust is TRUE) Vector m_vecAdjustedVelocity;// adjusted velocity (used when fCourseAdjust is TRUE)
float m_flGoalSpeed; float m_flGoalSpeed;
float m_flLastBlockedTime; float m_flLastBlockedTime;
float m_flFakeBlockedTime; float m_flFakeBlockedTime;
float m_flAlertTime; float m_flAlertTime;
float m_flFlockNextSoundTime; float m_flFlockNextSoundTime;
}; };
LINK_ENTITY_TO_CLASS( monster_flyer, CFlockingFlyer ) LINK_ENTITY_TO_CLASS( monster_flyer, CFlockingFlyer )
LINK_ENTITY_TO_CLASS( monster_flyer_flock, CFlockingFlyerFlock ) LINK_ENTITY_TO_CLASS( monster_flyer_flock, CFlockingFlyerFlock )
TYPEDESCRIPTION CFlockingFlyer::m_SaveData[] = TYPEDESCRIPTION CFlockingFlyer::m_SaveData[] =
{ {
DEFINE_FIELD( CFlockingFlyer, m_pSquadLeader, FIELD_CLASSPTR ), DEFINE_FIELD( CFlockingFlyer, m_pSquadLeader, FIELD_CLASSPTR ),
DEFINE_FIELD( CFlockingFlyer, m_pSquadNext, FIELD_CLASSPTR ), DEFINE_FIELD( CFlockingFlyer, m_pSquadNext, FIELD_CLASSPTR ),
@ -123,59 +124,59 @@ TYPEDESCRIPTION CFlockingFlyer::m_SaveData[] =
DEFINE_FIELD( CFlockingFlyer, m_flLastBlockedTime, FIELD_TIME ), DEFINE_FIELD( CFlockingFlyer, m_flLastBlockedTime, FIELD_TIME ),
DEFINE_FIELD( CFlockingFlyer, m_flFakeBlockedTime, FIELD_TIME ), DEFINE_FIELD( CFlockingFlyer, m_flFakeBlockedTime, FIELD_TIME ),
DEFINE_FIELD( CFlockingFlyer, m_flAlertTime, FIELD_TIME ), DEFINE_FIELD( CFlockingFlyer, m_flAlertTime, FIELD_TIME ),
// DEFINE_FIELD( CFlockingFlyer, m_flFlockNextSoundTime, FIELD_TIME ), // don't need to save //DEFINE_FIELD( CFlockingFlyer, m_flFlockNextSoundTime, FIELD_TIME ), // don't need to save
}; };
IMPLEMENT_SAVERESTORE( CFlockingFlyer, CBaseMonster ) IMPLEMENT_SAVERESTORE( CFlockingFlyer, CBaseMonster )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyerFlock :: KeyValue( KeyValueData *pkvd ) void CFlockingFlyerFlock::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "iFlockSize")) if( FStrEq( pkvd->szKeyName, "iFlockSize" ) )
{ {
m_cFlockSize = atoi(pkvd->szValue); m_cFlockSize = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "flFlockRadius")) else if( FStrEq( pkvd->szKeyName, "flFlockRadius" ) )
{ {
m_flFlockRadius = atof(pkvd->szValue); m_flFlockRadius = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyerFlock :: Spawn( ) void CFlockingFlyerFlock::Spawn()
{ {
Precache( ); Precache();
SpawnFlock(); SpawnFlock();
REMOVE_ENTITY(ENT(pev)); // dump the spawn ent REMOVE_ENTITY( ENT( pev ) ); // dump the spawn ent
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyerFlock :: Precache( ) void CFlockingFlyerFlock::Precache()
{ {
//PRECACHE_MODEL("models/aflock.mdl"); //PRECACHE_MODEL( "models/aflock.mdl" );
PRECACHE_MODEL("models/boid.mdl"); PRECACHE_MODEL( "models/boid.mdl ");
PrecacheFlockSounds(); PrecacheFlockSounds();
} }
void CFlockingFlyerFlock :: PrecacheFlockSounds( void ) void CFlockingFlyerFlock::PrecacheFlockSounds( void )
{ {
PRECACHE_SOUND("boid/boid_alert1.wav" ); PRECACHE_SOUND( "boid/boid_alert1.wav" );
PRECACHE_SOUND("boid/boid_alert2.wav" ); PRECACHE_SOUND( "boid/boid_alert2.wav" );
PRECACHE_SOUND("boid/boid_idle1.wav" ); PRECACHE_SOUND( "boid/boid_idle1.wav" );
PRECACHE_SOUND("boid/boid_idle2.wav" ); PRECACHE_SOUND( "boid/boid_idle2.wav" );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyerFlock :: SpawnFlock( void ) void CFlockingFlyerFlock::SpawnFlock( void )
{ {
float R = m_flFlockRadius; float R = m_flFlockRadius;
int iCount; int iCount;
@ -184,15 +185,15 @@ void CFlockingFlyerFlock :: SpawnFlock( void )
pLeader = pBoid = NULL; pLeader = pBoid = NULL;
for ( iCount = 0 ; iCount < m_cFlockSize ; iCount++ ) for( iCount = 0; iCount < m_cFlockSize; iCount++ )
{ {
pBoid = GetClassPtr( (CFlockingFlyer *)NULL ); pBoid = GetClassPtr( (CFlockingFlyer *)NULL );
if ( !pLeader ) if( !pLeader )
{ {
// make this guy the leader. // make this guy the leader.
pLeader = pBoid; pLeader = pBoid;
pLeader->m_pSquadLeader = pLeader; pLeader->m_pSquadLeader = pLeader;
pLeader->m_pSquadNext = NULL; pLeader->m_pSquadNext = NULL;
} }
@ -202,18 +203,18 @@ void CFlockingFlyerFlock :: SpawnFlock( void )
vecSpot.z = RANDOM_FLOAT( 0, 16 ); vecSpot.z = RANDOM_FLOAT( 0, 16 );
vecSpot = pev->origin + vecSpot; vecSpot = pev->origin + vecSpot;
UTIL_SetOrigin(pBoid->pev, vecSpot); UTIL_SetOrigin( pBoid->pev, vecSpot );
pBoid->pev->movetype = MOVETYPE_FLY; pBoid->pev->movetype = MOVETYPE_FLY;
pBoid->SpawnCommonCode(); pBoid->SpawnCommonCode();
pBoid->pev->flags &= ~FL_ONGROUND; pBoid->pev->flags &= ~FL_ONGROUND;
pBoid->pev->velocity = g_vecZero; pBoid->pev->velocity = g_vecZero;
pBoid->pev->angles = pev->angles; pBoid->pev->angles = pev->angles;
pBoid->pev->frame = 0; pBoid->pev->frame = 0;
pBoid->pev->nextthink = gpGlobals->time + 0.2; pBoid->pev->nextthink = gpGlobals->time + 0.2;
pBoid->SetThink( &CFlockingFlyer :: IdleThink ); pBoid->SetThink( &CFlockingFlyer::IdleThink );
if ( pBoid != pLeader ) if( pBoid != pLeader )
{ {
pLeader->SquadAdd( pBoid ); pLeader->SquadAdd( pBoid );
} }
@ -222,11 +223,11 @@ void CFlockingFlyerFlock :: SpawnFlock( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: Spawn( ) void CFlockingFlyer::Spawn()
{ {
Precache( ); Precache();
SpawnCommonCode(); SpawnCommonCode();
pev->frame = 0; pev->frame = 0;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
SetThink( &CFlockingFlyer::IdleThink ); SetThink( &CFlockingFlyer::IdleThink );
@ -234,52 +235,60 @@ void CFlockingFlyer :: Spawn( )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: Precache( ) void CFlockingFlyer::Precache()
{ {
//PRECACHE_MODEL("models/aflock.mdl"); //PRECACHE_MODEL( "models/aflock.mdl" );
PRECACHE_MODEL("models/boid.mdl"); PRECACHE_MODEL( "models/boid.mdl" );
CFlockingFlyerFlock::PrecacheFlockSounds(); CFlockingFlyerFlock::PrecacheFlockSounds();
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: MakeSound( void ) void CFlockingFlyer::MakeSound( void )
{ {
if ( m_flAlertTime > gpGlobals->time ) if( m_flAlertTime > gpGlobals->time )
{ {
// make agitated sounds // make agitated sounds
switch ( RANDOM_LONG( 0, 1 ) ) switch ( RANDOM_LONG( 0, 1 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_alert1.wav", 1, ATTN_NORM ); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_alert2.wav", 1, ATTN_NORM ); break; EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "boid/boid_alert1.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "boid/boid_alert2.wav", 1, ATTN_NORM );
break;
} }
return; return;
} }
// make normal sound // make normal sound
switch ( RANDOM_LONG( 0, 1 ) ) switch( RANDOM_LONG( 0, 1 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_idle1.wav", 1, ATTN_NORM ); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_idle2.wav", 1, ATTN_NORM ); break; EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_idle1.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT(pev), CHAN_WEAPON, "boid/boid_idle2.wav", 1, ATTN_NORM );
break;
} }
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: Killed( entvars_t *pevAttacker, int iGib ) void CFlockingFlyer::Killed( entvars_t *pevAttacker, int iGib )
{ {
CFlockingFlyer *pSquad; CFlockingFlyer *pSquad;
pSquad = (CFlockingFlyer *)m_pSquadLeader; pSquad = (CFlockingFlyer *)m_pSquadLeader;
while ( pSquad ) while( pSquad )
{ {
pSquad->m_flAlertTime = gpGlobals->time + 15; pSquad->m_flAlertTime = gpGlobals->time + 15;
pSquad = (CFlockingFlyer *)pSquad->m_pSquadNext; pSquad = (CFlockingFlyer *)pSquad->m_pSquadNext;
} }
if ( m_pSquadLeader ) if( m_pSquadLeader )
{ {
m_pSquadLeader->SquadRemove( this ); m_pSquadLeader->SquadRemove( this );
} }
@ -289,18 +298,18 @@ void CFlockingFlyer :: Killed( entvars_t *pevAttacker, int iGib )
pev->framerate = 0; pev->framerate = 0;
pev->effects = EF_NOINTERP; pev->effects = EF_NOINTERP;
UTIL_SetSize( pev, Vector(0,0,0), Vector(0,0,0) ); UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
pev->movetype = MOVETYPE_TOSS; pev->movetype = MOVETYPE_TOSS;
SetThink( &CFlockingFlyer::FallHack ); SetThink( &CFlockingFlyer::FallHack );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
void CFlockingFlyer :: FallHack( void ) void CFlockingFlyer::FallHack( void )
{ {
if ( pev->flags & FL_ONGROUND ) if( pev->flags & FL_ONGROUND )
{ {
if ( !FClassnameIs ( pev->groundentity, "worldspawn" ) ) if( !FClassnameIs ( pev->groundentity, "worldspawn" ) )
{ {
pev->flags &= ~FL_ONGROUND; pev->flags &= ~FL_ONGROUND;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
@ -315,56 +324,59 @@ void CFlockingFlyer :: FallHack( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: SpawnCommonCode( ) void CFlockingFlyer::SpawnCommonCode()
{ {
pev->deadflag = DEAD_NO; pev->deadflag = DEAD_NO;
pev->classname = MAKE_STRING("monster_flyer"); pev->classname = MAKE_STRING( "monster_flyer" );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
pev->health = 1; pev->health = 1;
m_fPathBlocked = FALSE;// obstacles will be detected m_fPathBlocked = FALSE;// obstacles will be detected
m_flFieldOfView = 0.2; m_flFieldOfView = 0.2;
//SET_MODEL(ENT(pev), "models/aflock.mdl"); //SET_MODEL( ENT( pev ), "models/aflock.mdl" );
SET_MODEL(ENT(pev), "models/boid.mdl"); SET_MODEL( ENT( pev ), "models/boid.mdl" );
// UTIL_SetSize(pev, Vector(0,0,0), Vector(0,0,0)); //UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
UTIL_SetSize(pev, Vector(-5,-5,0), Vector(5,5,2)); UTIL_SetSize( pev, Vector( -5, -5, 0 ), Vector( 5, 5, 2 ) );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: BoidAdvanceFrame ( ) void CFlockingFlyer::BoidAdvanceFrame()
{ {
float flapspeed = (pev->speed - pev->armorvalue) / AFLOCK_ACCELERATE; float flapspeed = ( pev->speed - pev->armorvalue ) / AFLOCK_ACCELERATE;
pev->armorvalue = pev->armorvalue * .8 + pev->speed * .2; pev->armorvalue = pev->armorvalue * .8 + pev->speed * .2;
if (flapspeed < 0) flapspeed = -flapspeed; if( flapspeed < 0 )
if (flapspeed < 0.25) flapspeed = 0.25; flapspeed = -flapspeed;
if (flapspeed > 1.9) flapspeed = 1.9; if( flapspeed < 0.25 )
flapspeed = 0.25;
if( flapspeed > 1.9 )
flapspeed = 1.9;
pev->framerate = flapspeed; pev->framerate = flapspeed;
// lean // lean
pev->avelocity.x = - (pev->angles.x + flapspeed * 5); pev->avelocity.x = -( pev->angles.x + flapspeed * 5 );
// bank // bank
pev->avelocity.z = - (pev->angles.z + pev->avelocity.y); pev->avelocity.z = -( pev->angles.z + pev->avelocity.y );
// pev->framerate = flapspeed; // pev->framerate = flapspeed;
StudioFrameAdvance( 0.1 ); StudioFrameAdvance( 0.1 );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CFlockingFlyer :: IdleThink( void ) void CFlockingFlyer::IdleThink( void )
{ {
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
// see if there's a client in the same pvs as the monster // see if there's a client in the same pvs as the monster
if ( !FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) ) if( !FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) )
{ {
SetThink( &CFlockingFlyer::Start ); SetThink( &CFlockingFlyer::Start );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
@ -374,11 +386,11 @@ void CFlockingFlyer :: IdleThink( void )
//========================================================= //=========================================================
// Start - player enters the pvs, so get things going. // Start - player enters the pvs, so get things going.
//========================================================= //=========================================================
void CFlockingFlyer :: Start( void ) void CFlockingFlyer::Start( void )
{ {
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if ( IsLeader() ) if( IsLeader() )
{ {
SetThink( &CFlockingFlyer::FlockLeaderThink ); SetThink( &CFlockingFlyer::FlockLeaderThink );
} }
@ -386,24 +398,22 @@ void CFlockingFlyer :: Start( void )
{ {
SetThink( &CFlockingFlyer::FlockFollowerThink ); SetThink( &CFlockingFlyer::FlockFollowerThink );
} }
/* /*
Vector vecTakeOff; Vector vecTakeOff;
vecTakeOff = Vector ( 0 , 0 , 0 ); vecTakeOff = Vector( 0, 0, 0 );
vecTakeOff.z = 50 + RANDOM_FLOAT ( 0, 100 ); vecTakeOff.z = 50 + RANDOM_FLOAT( 0, 100 );
vecTakeOff.x = 20 - RANDOM_FLOAT ( 0, 40); vecTakeOff.x = 20 - RANDOM_FLOAT( 0, 40 );
vecTakeOff.y = 20 - RANDOM_FLOAT ( 0, 40); vecTakeOff.y = 20 - RANDOM_FLOAT( 0, 40 );
pev->velocity = vecTakeOff; pev->velocity = vecTakeOff;
pev->speed = pev->velocity.Length(); pev->speed = pev->velocity.Length();
pev->sequence = 0; pev->sequence = 0;
*/ */
SetActivity ( ACT_FLY ); SetActivity( ACT_FLY );
ResetSequenceInfo( ); ResetSequenceInfo();
BoidAdvanceFrame( ); BoidAdvanceFrame();
pev->speed = AFLOCK_FLY_SPEED;// no delay! pev->speed = AFLOCK_FLY_SPEED;// no delay!
} }
@ -411,9 +421,9 @@ void CFlockingFlyer :: Start( void )
//========================================================= //=========================================================
// Leader boid calls this to form a flock from surrounding boids // Leader boid calls this to form a flock from surrounding boids
//========================================================= //=========================================================
void CFlockingFlyer :: FormFlock( void ) void CFlockingFlyer::FormFlock( void )
{ {
if ( !InSquad() ) if( !InSquad() )
{ {
// I am my own leader // I am my own leader
m_pSquadLeader = this; m_pSquadLeader = this;
@ -421,15 +431,15 @@ void CFlockingFlyer :: FormFlock( void )
int squadCount = 1; int squadCount = 1;
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
while ((pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, AFLOCK_MAX_RECRUIT_RADIUS )) != NULL)
{
CBaseMonster *pRecruit = pEntity->MyMonsterPointer( );
if ( pRecruit && pRecruit != this && pRecruit->IsAlive() && !pRecruit->m_pCine ) while( ( pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, AFLOCK_MAX_RECRUIT_RADIUS ) ) != NULL )
{
CBaseMonster *pRecruit = pEntity->MyMonsterPointer();
if( pRecruit && pRecruit != this && pRecruit->IsAlive() && !pRecruit->m_pCine )
{ {
// Can we recruit this guy? // Can we recruit this guy?
if ( FClassnameIs ( pRecruit->pev, "monster_flyer" ) ) if( FClassnameIs ( pRecruit->pev, "monster_flyer" ) )
{ {
squadCount++; squadCount++;
SquadAdd( (CFlockingFlyer *)pRecruit ); SquadAdd( (CFlockingFlyer *)pRecruit );
@ -445,18 +455,18 @@ void CFlockingFlyer :: FormFlock( void )
//========================================================= //=========================================================
// Searches for boids that are too close and pushes them away // Searches for boids that are too close and pushes them away
//========================================================= //=========================================================
void CFlockingFlyer :: SpreadFlock( ) void CFlockingFlyer::SpreadFlock()
{ {
Vector vecDir; Vector vecDir;
float flSpeed;// holds vector magnitude while we fiddle with the direction float flSpeed;// holds vector magnitude while we fiddle with the direction
CFlockingFlyer *pList = m_pSquadLeader; CFlockingFlyer *pList = m_pSquadLeader;
while ( pList ) while( pList )
{ {
if ( pList != this && ( pev->origin - pList->pev->origin ).Length() <= AFLOCK_TOO_CLOSE ) if( pList != this && ( pev->origin - pList->pev->origin ).Length() <= AFLOCK_TOO_CLOSE )
{ {
// push the other away // push the other away
vecDir = ( pList->pev->origin - pev->origin ); vecDir = pList->pev->origin - pev->origin;
vecDir = vecDir.Normalize(); vecDir = vecDir.Normalize();
// store the magnitude of the other boid's velocity, and normalize it so we // store the magnitude of the other boid's velocity, and normalize it so we
@ -476,19 +486,19 @@ void CFlockingFlyer :: SpreadFlock( )
// //
// This function should **ONLY** be called when Caller's velocity is normalized!! // This function should **ONLY** be called when Caller's velocity is normalized!!
//========================================================= //=========================================================
void CFlockingFlyer :: SpreadFlock2 ( ) void CFlockingFlyer::SpreadFlock2()
{ {
Vector vecDir; Vector vecDir;
CFlockingFlyer *pList = m_pSquadLeader; CFlockingFlyer *pList = m_pSquadLeader;
while ( pList ) while( pList )
{ {
if ( pList != this && ( pev->origin - pList->pev->origin ).Length() <= AFLOCK_TOO_CLOSE ) if( pList != this && ( pev->origin - pList->pev->origin ).Length() <= AFLOCK_TOO_CLOSE )
{ {
vecDir = ( pev->origin - pList->pev->origin ); vecDir = pev->origin - pList->pev->origin;
vecDir = vecDir.Normalize(); vecDir = vecDir.Normalize();
pev->velocity = (pev->velocity + vecDir); pev->velocity = pev->velocity + vecDir;
} }
pList = pList->m_pSquadNext; pList = pList->m_pSquadNext;
@ -498,14 +508,14 @@ void CFlockingFlyer :: SpreadFlock2 ( )
//========================================================= //=========================================================
// FBoidPathBlocked - returns TRUE if there is an obstacle ahead // FBoidPathBlocked - returns TRUE if there is an obstacle ahead
//========================================================= //=========================================================
BOOL CFlockingFlyer :: FPathBlocked( ) BOOL CFlockingFlyer::FPathBlocked()
{ {
TraceResult tr; TraceResult tr;
Vector vecDist;// used for general measurements Vector vecDist;// used for general measurements
Vector vecDir;// used for general measurements Vector vecDir;// used for general measurements
BOOL fBlocked; BOOL fBlocked;
if ( m_flFakeBlockedTime > gpGlobals->time ) if( m_flFakeBlockedTime > gpGlobals->time )
{ {
m_flLastBlockedTime = gpGlobals->time; m_flLastBlockedTime = gpGlobals->time;
return TRUE; return TRUE;
@ -518,32 +528,32 @@ BOOL CFlockingFlyer :: FPathBlocked( )
fBlocked = FALSE;// assume the way ahead is clear fBlocked = FALSE;// assume the way ahead is clear
// check for obstacle ahead // check for obstacle ahead
UTIL_TraceLine(pev->origin, pev->origin + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
m_flLastBlockedTime = gpGlobals->time; m_flLastBlockedTime = gpGlobals->time;
fBlocked = TRUE; fBlocked = TRUE;
} }
// extra wide checks // extra wide checks
UTIL_TraceLine(pev->origin + gpGlobals->v_right * 12, pev->origin + gpGlobals->v_right * 12 + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin + gpGlobals->v_right * 12, pev->origin + gpGlobals->v_right * 12 + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
m_flLastBlockedTime = gpGlobals->time; m_flLastBlockedTime = gpGlobals->time;
fBlocked = TRUE; fBlocked = TRUE;
} }
UTIL_TraceLine(pev->origin - gpGlobals->v_right * 12, pev->origin - gpGlobals->v_right * 12 + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin - gpGlobals->v_right * 12, pev->origin - gpGlobals->v_right * 12 + gpGlobals->v_forward * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
m_flLastBlockedTime = gpGlobals->time; m_flLastBlockedTime = gpGlobals->time;
fBlocked = TRUE; fBlocked = TRUE;
} }
if ( !fBlocked && gpGlobals->time - m_flLastBlockedTime > 6 ) if( !fBlocked && gpGlobals->time - m_flLastBlockedTime > 6 )
{ {
// not blocked, and it's been a few seconds since we've actually been blocked. // not blocked, and it's been a few seconds since we've actually been blocked.
m_flFakeBlockedTime = gpGlobals->time + RANDOM_LONG(1, 3); m_flFakeBlockedTime = gpGlobals->time + RANDOM_LONG( 1, 3 );
} }
return fBlocked; return fBlocked;
@ -552,25 +562,24 @@ BOOL CFlockingFlyer :: FPathBlocked( )
//========================================================= //=========================================================
// Leader boids use this think every tenth // Leader boids use this think every tenth
//========================================================= //=========================================================
void CFlockingFlyer :: FlockLeaderThink( void ) void CFlockingFlyer::FlockLeaderThink( void )
{ {
TraceResult tr; TraceResult tr;
Vector vecDist;// used for general measurements Vector vecDist;// used for general measurements
Vector vecDir;// used for general measurements Vector vecDir;// used for general measurements
int cProcessed = 0;// keep track of how many other boids we've processed int cProcessed = 0;// keep track of how many other boids we've processed
float flLeftSide; float flLeftSide;
float flRightSide; float flRightSide;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
UTIL_MakeVectors ( pev->angles ); UTIL_MakeVectors( pev->angles );
// is the way ahead clear? // is the way ahead clear?
if ( !FPathBlocked () ) if( !FPathBlocked () )
{ {
// if the boid is turning, stop the trend. // if the boid is turning, stop the trend.
if ( m_fTurning ) if( m_fTurning )
{ {
m_fTurning = FALSE; m_fTurning = FALSE;
pev->avelocity.y = 0; pev->avelocity.y = 0;
@ -578,12 +587,12 @@ void CFlockingFlyer :: FlockLeaderThink( void )
m_fPathBlocked = FALSE; m_fPathBlocked = FALSE;
if (pev->speed <= AFLOCK_FLY_SPEED ) if( pev->speed <= AFLOCK_FLY_SPEED )
pev->speed+= 5; pev->speed += 5;
pev->velocity = gpGlobals->v_forward * pev->speed; pev->velocity = gpGlobals->v_forward * pev->speed;
BoidAdvanceFrame( ); BoidAdvanceFrame();
return; return;
} }
@ -591,25 +600,25 @@ void CFlockingFlyer :: FlockLeaderThink( void )
// IF we get this far in the function, the leader's path is blocked! // IF we get this far in the function, the leader's path is blocked!
m_fPathBlocked = TRUE; m_fPathBlocked = TRUE;
if ( !m_fTurning)// something in the way and boid is not already turning to avoid if( !m_fTurning )// something in the way and boid is not already turning to avoid
{ {
// measure clearance on left and right to pick the best dir to turn // measure clearance on left and right to pick the best dir to turn
UTIL_TraceLine(pev->origin, pev->origin + gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin + gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
vecDist = (tr.vecEndPos - pev->origin); vecDist = ( tr.vecEndPos - pev->origin );
flRightSide = vecDist.Length(); flRightSide = vecDist.Length();
UTIL_TraceLine(pev->origin, pev->origin - gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin - gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
vecDist = (tr.vecEndPos - pev->origin); vecDist = tr.vecEndPos - pev->origin;
flLeftSide = vecDist.Length(); flLeftSide = vecDist.Length();
// turn right if more clearance on right side // turn right if more clearance on right side
if ( flRightSide > flLeftSide ) if( flRightSide > flLeftSide )
{ {
pev->avelocity.y = -AFLOCK_TURN_RATE; pev->avelocity.y = -AFLOCK_TURN_RATE;
m_fTurning = TRUE; m_fTurning = TRUE;
} }
// default to left turn :) // default to left turn :)
else if ( flLeftSide > flRightSide ) else if( flLeftSide > flRightSide )
{ {
pev->avelocity.y = AFLOCK_TURN_RATE; pev->avelocity.y = AFLOCK_TURN_RATE;
m_fTurning = TRUE; m_fTurning = TRUE;
@ -619,7 +628,7 @@ void CFlockingFlyer :: FlockLeaderThink( void )
// equidistant. Pick randomly between left and right. // equidistant. Pick randomly between left and right.
m_fTurning = TRUE; m_fTurning = TRUE;
if ( RANDOM_LONG( 0, 1 ) == 0 ) if( RANDOM_LONG( 0, 1 ) == 0 )
{ {
pev->avelocity.y = AFLOCK_TURN_RATE; pev->avelocity.y = AFLOCK_TURN_RATE;
} }
@ -629,47 +638,47 @@ void CFlockingFlyer :: FlockLeaderThink( void )
} }
} }
} }
SpreadFlock( ); SpreadFlock();
pev->velocity = gpGlobals->v_forward * pev->speed; pev->velocity = gpGlobals->v_forward * pev->speed;
// check and make sure we aren't about to plow into the ground, don't let it happen // check and make sure we aren't about to plow into the ground, don't let it happen
UTIL_TraceLine(pev->origin, pev->origin - gpGlobals->v_up * 16, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin - gpGlobals->v_up * 16, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0 && pev->velocity.z < 0 ) if( tr.flFraction != 1.0 && pev->velocity.z < 0 )
pev->velocity.z = 0; pev->velocity.z = 0;
// maybe it did, though. // maybe it did, though.
if ( FBitSet (pev->flags, FL_ONGROUND) ) if( FBitSet( pev->flags, FL_ONGROUND ) )
{ {
UTIL_SetOrigin (pev, pev->origin + Vector ( 0 , 0 , 1 ) ); UTIL_SetOrigin( pev, pev->origin + Vector( 0, 0, 1 ) );
pev->velocity.z = 0; pev->velocity.z = 0;
} }
if ( m_flFlockNextSoundTime < gpGlobals->time ) if( m_flFlockNextSoundTime < gpGlobals->time )
{ {
MakeSound(); MakeSound();
m_flFlockNextSoundTime = gpGlobals->time + RANDOM_FLOAT( 1, 3 ); m_flFlockNextSoundTime = gpGlobals->time + RANDOM_FLOAT( 1, 3 );
} }
BoidAdvanceFrame( ); BoidAdvanceFrame( );
return; return;
} }
//========================================================= //=========================================================
// follower boids execute this code when flocking // follower boids execute this code when flocking
//========================================================= //=========================================================
void CFlockingFlyer :: FlockFollowerThink( void ) void CFlockingFlyer::FlockFollowerThink( void )
{ {
TraceResult tr; TraceResult tr;
Vector vecDist; Vector vecDist;
Vector vecDir; Vector vecDir;
Vector vecDirToLeader; Vector vecDirToLeader;
float flDistToLeader; float flDistToLeader;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if ( IsLeader() || !InSquad() ) if( IsLeader() || !InSquad() )
{ {
// the leader has been killed and this flyer suddenly finds himself the leader. // the leader has been killed and this flyer suddenly finds himself the leader.
SetThink( &CFlockingFlyer::FlockLeaderThink ); SetThink( &CFlockingFlyer::FlockLeaderThink );
@ -685,16 +694,16 @@ void CFlockingFlyer :: FlockFollowerThink( void )
// //
// We can see the leader, so try to catch up to it // We can see the leader, so try to catch up to it
// //
if ( FInViewCone ( m_pSquadLeader ) ) if( FInViewCone ( m_pSquadLeader ) )
{ {
// if we're too far away, speed up // if we're too far away, speed up
if ( flDistToLeader > AFLOCK_TOO_FAR ) if( flDistToLeader > AFLOCK_TOO_FAR )
{ {
m_flGoalSpeed = m_pSquadLeader->pev->velocity.Length() * 1.5; m_flGoalSpeed = m_pSquadLeader->pev->velocity.Length() * 1.5;
} }
// if we're too close, slow down // if we're too close, slow down
else if ( flDistToLeader < AFLOCK_TOO_CLOSE ) else if( flDistToLeader < AFLOCK_TOO_CLOSE )
{ {
m_flGoalSpeed = m_pSquadLeader->pev->velocity.Length() * 0.5; m_flGoalSpeed = m_pSquadLeader->pev->velocity.Length() * 0.5;
} }
@ -711,23 +720,23 @@ void CFlockingFlyer :: FlockFollowerThink( void )
pev->velocity = pev->velocity.Normalize(); pev->velocity = pev->velocity.Normalize();
// if we are too far from leader, average a vector towards it into our current velocity // if we are too far from leader, average a vector towards it into our current velocity
if ( flDistToLeader > AFLOCK_TOO_FAR ) if( flDistToLeader > AFLOCK_TOO_FAR )
{ {
vecDirToLeader = vecDirToLeader.Normalize(); vecDirToLeader = vecDirToLeader.Normalize();
pev->velocity = (pev->velocity + vecDirToLeader) * 0.5; pev->velocity = (pev->velocity + vecDirToLeader) * 0.5;
} }
// clamp speeds and handle acceleration // clamp speeds and handle acceleration
if ( m_flGoalSpeed > AFLOCK_FLY_SPEED * 2 ) if( m_flGoalSpeed > AFLOCK_FLY_SPEED * 2 )
{ {
m_flGoalSpeed = AFLOCK_FLY_SPEED * 2; m_flGoalSpeed = AFLOCK_FLY_SPEED * 2;
} }
if ( pev->speed < m_flGoalSpeed ) if( pev->speed < m_flGoalSpeed )
{ {
pev->speed += AFLOCK_ACCELERATE; pev->speed += AFLOCK_ACCELERATE;
} }
else if ( pev->speed > m_flGoalSpeed ) else if( pev->speed > m_flGoalSpeed )
{ {
pev->speed -= AFLOCK_ACCELERATE; pev->speed -= AFLOCK_ACCELERATE;
} }
@ -737,13 +746,13 @@ void CFlockingFlyer :: FlockFollowerThink( void )
BoidAdvanceFrame( ); BoidAdvanceFrame( );
} }
/* /*
// Is this boid's course blocked? // Is this boid's course blocked?
if ( FBoidPathBlocked (pev) ) if( FBoidPathBlocked( pev ) )
{ {
// course is still blocked from last time. Just keep flying along adjusted // course is still blocked from last time. Just keep flying along adjusted
// velocity // velocity
if ( m_fCourseAdjust ) if( m_fCourseAdjust )
{ {
pev->velocity = m_vecAdjustedVelocity * pev->speed; pev->velocity = m_vecAdjustedVelocity * pev->speed;
return; return;
@ -751,24 +760,24 @@ void CFlockingFlyer :: FlockFollowerThink( void )
else // set course adjust flag and calculate adjusted velocity else // set course adjust flag and calculate adjusted velocity
{ {
m_fCourseAdjust = TRUE; m_fCourseAdjust = TRUE;
// use VELOCITY, not angles, not all boids point the direction they are flying // use VELOCITY, not angles, not all boids point the direction they are flying
//vecDir = UTIL_VecToAngles( pev->velocity ); //vecDir = UTIL_VecToAngles( pev->velocity );
//UTIL_MakeVectors ( vecDir ); //UTIL_MakeVectors( vecDir );
UTIL_MakeVectors ( pev->angles ); UTIL_MakeVectors( pev->angles );
// measure clearance on left and right to pick the best dir to turn // measure clearance on left and right to pick the best dir to turn
UTIL_TraceLine(pev->origin, pev->origin + gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin + gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
vecDist = (tr.vecEndPos - pev->origin); vecDist = tr.vecEndPos - pev->origin;
flRightSide = vecDist.Length(); flRightSide = vecDist.Length();
UTIL_TraceLine(pev->origin, pev->origin - gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin - gpGlobals->v_right * AFLOCK_CHECK_DIST, ignore_monsters, ENT( pev ), &tr );
vecDist = (tr.vecEndPos - pev->origin); vecDist = tr.vecEndPos - pev->origin;
flLeftSide = vecDist.Length(); flLeftSide = vecDist.Length();
// slide right if more clearance on right side // slide right if more clearance on right side
if ( flRightSide > flLeftSide ) if( flRightSide > flLeftSide )
{ {
m_vecAdjustedVelocity = gpGlobals->v_right; m_vecAdjustedVelocity = gpGlobals->v_right;
} }
@ -790,10 +799,10 @@ void CFlockingFlyer :: FlockFollowerThink( void )
// SquadUnlink(), Unlink the squad pointers. // SquadUnlink(), Unlink the squad pointers.
// //
//========================================================= //=========================================================
void CFlockingFlyer :: SquadUnlink( void ) void CFlockingFlyer::SquadUnlink( void )
{ {
m_pSquadLeader = NULL; m_pSquadLeader = NULL;
m_pSquadNext = NULL; m_pSquadNext = NULL;
} }
//========================================================= //=========================================================
@ -801,9 +810,9 @@ void CFlockingFlyer :: SquadUnlink( void )
// SquadAdd(), add pAdd to my squad // SquadAdd(), add pAdd to my squad
// //
//========================================================= //=========================================================
void CFlockingFlyer :: SquadAdd( CFlockingFlyer *pAdd ) void CFlockingFlyer::SquadAdd( CFlockingFlyer *pAdd )
{ {
ASSERT( pAdd!=NULL ); ASSERT( pAdd != NULL );
ASSERT( !pAdd->InSquad() ); ASSERT( !pAdd->InSquad() );
ASSERT( this->IsLeader() ); ASSERT( this->IsLeader() );
@ -818,27 +827,27 @@ void CFlockingFlyer :: SquadAdd( CFlockingFlyer *pAdd )
// If I am pRemove, promote m_pSquadNext to leader // If I am pRemove, promote m_pSquadNext to leader
// //
//========================================================= //=========================================================
void CFlockingFlyer :: SquadRemove( CFlockingFlyer *pRemove ) void CFlockingFlyer::SquadRemove( CFlockingFlyer *pRemove )
{ {
ASSERT( pRemove!=NULL ); ASSERT( pRemove != NULL );
ASSERT( this->IsLeader() ); ASSERT( this->IsLeader() );
ASSERT( pRemove->m_pSquadLeader == this ); ASSERT( pRemove->m_pSquadLeader == this );
if ( SquadCount() > 2 ) if( SquadCount() > 2 )
{ {
// Removing the leader, promote m_pSquadNext to leader // Removing the leader, promote m_pSquadNext to leader
if ( pRemove == this ) if( pRemove == this )
{ {
CFlockingFlyer *pLeader = m_pSquadNext; CFlockingFlyer *pLeader = m_pSquadNext;
// copy the enemy LKP to the new leader // copy the enemy LKP to the new leader
pLeader->m_vecEnemyLKP = m_vecEnemyLKP; pLeader->m_vecEnemyLKP = m_vecEnemyLKP;
if ( pLeader ) if( pLeader )
{ {
CFlockingFlyer *pList = pLeader; CFlockingFlyer *pList = pLeader;
while ( pList ) while( pList )
{ {
pList->m_pSquadLeader = pLeader; pList->m_pSquadLeader = pLeader;
pList = pList->m_pSquadNext; pList = pList->m_pSquadNext;
@ -852,7 +861,7 @@ void CFlockingFlyer :: SquadRemove( CFlockingFlyer *pRemove )
CFlockingFlyer *pList = this; CFlockingFlyer *pList = this;
// Find the node before pRemove // Find the node before pRemove
while ( pList->m_pSquadNext != pRemove ) while( pList->m_pSquadNext != pRemove )
{ {
// assert to test valid list construction // assert to test valid list construction
ASSERT( pList->m_pSquadNext != NULL ); ASSERT( pList->m_pSquadNext != NULL );
@ -878,11 +887,11 @@ void CFlockingFlyer :: SquadRemove( CFlockingFlyer *pRemove )
// callable from leaders & followers // callable from leaders & followers
// //
//========================================================= //=========================================================
int CFlockingFlyer :: SquadCount( void ) int CFlockingFlyer::SquadCount( void )
{ {
CFlockingFlyer *pList = m_pSquadLeader; CFlockingFlyer *pList = m_pSquadLeader;
int squadCount = 0; int squadCount = 0;
while ( pList ) while( pList )
{ {
squadCount++; squadCount++;
pList = pList->m_pSquadNext; pList = pList->m_pSquadNext;
@ -896,12 +905,12 @@ int CFlockingFlyer :: SquadCount( void )
// SquadDisband(), Unlink all squad members // SquadDisband(), Unlink all squad members
// //
//========================================================= //=========================================================
void CFlockingFlyer :: SquadDisband( void ) void CFlockingFlyer::SquadDisband( void )
{ {
CFlockingFlyer *pList = m_pSquadLeader; CFlockingFlyer *pList = m_pSquadLeader;
CFlockingFlyer *pNext; CFlockingFlyer *pNext;
while ( pList ) while( pList )
{ {
pNext = pList->m_pSquadNext; pNext = pList->m_pSquadNext;
pList->SquadUnlink(); pList->SquadUnlink();

File diff suppressed because it is too large Load Diff

View File

@ -26,54 +26,54 @@ class CAirtank : public CGrenade
void Precache( void ); void Precache( void );
void EXPORT TankThink( void ); void EXPORT TankThink( void );
void EXPORT TankTouch( CBaseEntity *pOther ); void EXPORT TankTouch( CBaseEntity *pOther );
int BloodColor( void ) { return DONT_BLEED; }; int BloodColor( void ) { return DONT_BLEED; };
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int m_state; int m_state;
}; };
LINK_ENTITY_TO_CLASS( item_airtank, CAirtank ) LINK_ENTITY_TO_CLASS( item_airtank, CAirtank )
TYPEDESCRIPTION CAirtank::m_SaveData[] = TYPEDESCRIPTION CAirtank::m_SaveData[] =
{ {
DEFINE_FIELD( CAirtank, m_state, FIELD_INTEGER ), DEFINE_FIELD( CAirtank, m_state, FIELD_INTEGER ),
}; };
IMPLEMENT_SAVERESTORE( CAirtank, CGrenade ) IMPLEMENT_SAVERESTORE( CAirtank, CGrenade )
void CAirtank :: Spawn( void ) void CAirtank::Spawn( void )
{ {
Precache( ); Precache();
// motor // motor
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/w_oxygen.mdl"); SET_MODEL( ENT( pev ), "models/w_oxygen.mdl" );
UTIL_SetSize(pev, Vector( -16, -16, 0), Vector(16, 16, 36)); UTIL_SetSize( pev, Vector( -16, -16, 0), Vector( 16, 16, 36 ) );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
SetTouch( &CAirtank::TankTouch ); SetTouch( &CAirtank::TankTouch );
SetThink( &CAirtank::TankThink ); SetThink( &CAirtank::TankThink );
pev->flags |= FL_MONSTER; pev->flags |= FL_MONSTER;
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
pev->health = 20; pev->health = 20;
pev->dmg = 50; pev->dmg = 50;
m_state = 1; m_state = 1;
} }
void CAirtank::Precache( void ) void CAirtank::Precache( void )
{ {
PRECACHE_MODEL("models/w_oxygen.mdl"); PRECACHE_MODEL( "models/w_oxygen.mdl" );
PRECACHE_SOUND("doors/aliendoor3.wav"); PRECACHE_SOUND( "doors/aliendoor3.wav" );
} }
void CAirtank :: Killed( entvars_t *pevAttacker, int iGib ) void CAirtank::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->owner = ENT( pevAttacker ); pev->owner = ENT( pevAttacker );
@ -91,21 +91,21 @@ void CAirtank::TankThink( void )
void CAirtank::TankTouch( CBaseEntity *pOther ) void CAirtank::TankTouch( CBaseEntity *pOther )
{ {
if ( !pOther->IsPlayer() ) if( !pOther->IsPlayer() )
return; return;
if (!m_state) if( !m_state )
{ {
// "no oxygen" sound // "no oxygen" sound
EMIT_SOUND( ENT(pev), CHAN_BODY, "player/pl_swim2.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_BODY, "player/pl_swim2.wav", 1.0, ATTN_NORM );
return; return;
} }
// give player 12 more seconds of air // give player 12 more seconds of air
pOther->pev->air_finished = gpGlobals->time + 12; pOther->pev->air_finished = gpGlobals->time + 12;
// suit recharge sound // suit recharge sound
EMIT_SOUND( ENT(pev), CHAN_VOICE, "doors/aliendoor3.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_VOICE, "doors/aliendoor3.wav", 1.0, ATTN_NORM );
// recharge airtank in 30 seconds // recharge airtank in 30 seconds
pev->nextthink = gpGlobals->time + 30; pev->nextthink = gpGlobals->time + 30;

View File

@ -26,7 +26,7 @@
#include "animation.h" #include "animation.h"
#include "saverestore.h" #include "saverestore.h"
TYPEDESCRIPTION CBaseAnimating::m_SaveData[] = TYPEDESCRIPTION CBaseAnimating::m_SaveData[] =
{ {
DEFINE_FIELD( CBaseMonster, m_flFrameRate, FIELD_FLOAT ), DEFINE_FIELD( CBaseMonster, m_flFrameRate, FIELD_FLOAT ),
DEFINE_FIELD( CBaseMonster, m_flGroundSpeed, FIELD_FLOAT ), DEFINE_FIELD( CBaseMonster, m_flGroundSpeed, FIELD_FLOAT ),
@ -41,29 +41,29 @@ IMPLEMENT_SAVERESTORE( CBaseAnimating, CBaseDelay )
// StudioFrameAdvance - advance the animation frame up to the current time // StudioFrameAdvance - advance the animation frame up to the current time
// if an flInterval is passed in, only advance animation that number of seconds // if an flInterval is passed in, only advance animation that number of seconds
//========================================================= //=========================================================
float CBaseAnimating :: StudioFrameAdvance ( float flInterval ) float CBaseAnimating::StudioFrameAdvance( float flInterval )
{ {
if (flInterval == 0.0) if( flInterval == 0.0 )
{ {
flInterval = (gpGlobals->time - pev->animtime); flInterval = gpGlobals->time - pev->animtime;
if (flInterval <= 0.001) if( flInterval <= 0.001 )
{ {
pev->animtime = gpGlobals->time; pev->animtime = gpGlobals->time;
return 0.0; return 0.0;
} }
} }
if (! pev->animtime) if( !pev->animtime )
flInterval = 0.0; flInterval = 0.0;
pev->frame += flInterval * m_flFrameRate * pev->framerate; pev->frame += flInterval * m_flFrameRate * pev->framerate;
pev->animtime = gpGlobals->time; pev->animtime = gpGlobals->time;
if (pev->frame < 0.0 || pev->frame >= 256.0) if( pev->frame < 0.0 || pev->frame >= 256.0 )
{ {
if (m_fSequenceLoops) if( m_fSequenceLoops )
pev->frame -= (int)(pev->frame / 256.0) * 256.0; pev->frame -= (int)( pev->frame / 256.0 ) * 256.0;
else else
pev->frame = (pev->frame < 0.0) ? 0 : 255; pev->frame = ( pev->frame < 0.0 ) ? 0 : 255;
m_fSequenceFinished = TRUE; // just in case it wasn't caught in GetEvents m_fSequenceFinished = TRUE; // just in case it wasn't caught in GetEvents
} }
@ -73,10 +73,10 @@ float CBaseAnimating :: StudioFrameAdvance ( float flInterval )
//========================================================= //=========================================================
// LookupActivity // LookupActivity
//========================================================= //=========================================================
int CBaseAnimating :: LookupActivity ( int activity ) int CBaseAnimating::LookupActivity( int activity )
{ {
ASSERT( activity != 0 ); ASSERT( activity != 0 );
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return ::LookupActivity( pmodel, pev, activity ); return ::LookupActivity( pmodel, pev, activity );
} }
@ -87,30 +87,30 @@ int CBaseAnimating :: LookupActivity ( int activity )
// Get activity with highest 'weight' // Get activity with highest 'weight'
// //
//========================================================= //=========================================================
int CBaseAnimating :: LookupActivityHeaviest ( int activity ) int CBaseAnimating::LookupActivityHeaviest( int activity )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return ::LookupActivityHeaviest( pmodel, pev, activity ); return ::LookupActivityHeaviest( pmodel, pev, activity );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
int CBaseAnimating :: LookupSequence ( const char *label ) int CBaseAnimating::LookupSequence( const char *label )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return ::LookupSequence( pmodel, label ); return ::LookupSequence( pmodel, label );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: ResetSequenceInfo ( ) void CBaseAnimating::ResetSequenceInfo()
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
GetSequenceInfo( pmodel, pev, &m_flFrameRate, &m_flGroundSpeed ); GetSequenceInfo( pmodel, pev, &m_flFrameRate, &m_flGroundSpeed );
m_fSequenceLoops = ((GetSequenceFlags() & STUDIO_LOOPING) != 0); m_fSequenceLoops = ( ( GetSequenceFlags() & STUDIO_LOOPING ) != 0 );
pev->animtime = gpGlobals->time; pev->animtime = gpGlobals->time;
pev->framerate = 1.0; pev->framerate = 1.0;
m_fSequenceFinished = FALSE; m_fSequenceFinished = FALSE;
@ -119,9 +119,9 @@ void CBaseAnimating :: ResetSequenceInfo ( )
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CBaseAnimating :: GetSequenceFlags( ) BOOL CBaseAnimating::GetSequenceFlags()
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return ::GetSequenceFlags( pmodel, pev ); return ::GetSequenceFlags( pmodel, pev );
} }
@ -129,13 +129,13 @@ BOOL CBaseAnimating :: GetSequenceFlags( )
//========================================================= //=========================================================
// DispatchAnimEvents // DispatchAnimEvents
//========================================================= //=========================================================
void CBaseAnimating :: DispatchAnimEvents ( float flInterval ) void CBaseAnimating::DispatchAnimEvents( float flInterval )
{ {
MonsterEvent_t event; MonsterEvent_t event;
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
if ( !pmodel ) if( !pmodel )
{ {
ALERT( at_aiconsole, "Gibbed monster is thinking!\n" ); ALERT( at_aiconsole, "Gibbed monster is thinking!\n" );
return; return;
@ -145,17 +145,17 @@ void CBaseAnimating :: DispatchAnimEvents ( float flInterval )
flInterval = 0.1; flInterval = 0.1;
// FIX: this still sometimes hits events twice // FIX: this still sometimes hits events twice
float flStart = pev->frame + (m_flLastEventCheck - pev->animtime) * m_flFrameRate * pev->framerate; float flStart = pev->frame + ( m_flLastEventCheck - pev->animtime ) * m_flFrameRate * pev->framerate;
float flEnd = pev->frame + flInterval * m_flFrameRate * pev->framerate; float flEnd = pev->frame + flInterval * m_flFrameRate * pev->framerate;
m_flLastEventCheck = pev->animtime + flInterval; m_flLastEventCheck = pev->animtime + flInterval;
m_fSequenceFinished = FALSE; m_fSequenceFinished = FALSE;
if (flEnd >= 256 || flEnd <= 0.0) if( flEnd >= 256 || flEnd <= 0.0 )
m_fSequenceFinished = TRUE; m_fSequenceFinished = TRUE;
int index = 0; int index = 0;
while ( (index = GetAnimationEvent( pmodel, pev, &event, flStart, flEnd, index ) ) != 0 ) while( ( index = GetAnimationEvent( pmodel, pev, &event, flStart, flEnd, index ) ) != 0 )
{ {
HandleAnimEvent( &event ); HandleAnimEvent( &event );
} }
@ -163,18 +163,18 @@ void CBaseAnimating :: DispatchAnimEvents ( float flInterval )
//========================================================= //=========================================================
//========================================================= //=========================================================
float CBaseAnimating :: SetBoneController ( int iController, float flValue ) float CBaseAnimating::SetBoneController( int iController, float flValue )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return SetController( pmodel, pev, iController, flValue ); return SetController( pmodel, pev, iController, flValue );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: InitBoneControllers ( void ) void CBaseAnimating::InitBoneControllers( void )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
SetController( pmodel, pev, 0, 0.0 ); SetController( pmodel, pev, 0, 0.0 );
SetController( pmodel, pev, 1, 0.0 ); SetController( pmodel, pev, 1, 0.0 );
@ -184,38 +184,38 @@ void CBaseAnimating :: InitBoneControllers ( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
float CBaseAnimating :: SetBlending ( int iBlender, float flValue ) float CBaseAnimating::SetBlending( int iBlender, float flValue )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
return ::SetBlending( pmodel, pev, iBlender, flValue ); return ::SetBlending( pmodel, pev, iBlender, flValue );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: GetBonePosition ( int iBone, Vector &origin, Vector &angles ) void CBaseAnimating::GetBonePosition( int iBone, Vector &origin, Vector &angles )
{ {
GET_BONE_POSITION( ENT(pev), iBone, origin, angles ); GET_BONE_POSITION( ENT( pev ), iBone, origin, angles );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: GetAttachment ( int iAttachment, Vector &origin, Vector &angles ) void CBaseAnimating::GetAttachment( int iAttachment, Vector &origin, Vector &angles )
{ {
GET_ATTACHMENT( ENT(pev), iAttachment, origin, angles ); GET_ATTACHMENT( ENT( pev ), iAttachment, origin, angles );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
int CBaseAnimating :: FindTransition( int iEndingSequence, int iGoalSequence, int *piDir ) int CBaseAnimating::FindTransition( int iEndingSequence, int iGoalSequence, int *piDir )
{ {
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
if (piDir == NULL) if( piDir == NULL )
{ {
int iDir; int iDir;
int sequence = ::FindTransition( pmodel, iEndingSequence, iGoalSequence, &iDir ); int sequence = ::FindTransition( pmodel, iEndingSequence, iGoalSequence, &iDir );
if (iDir != 1) if( iDir != 1 )
return -1; return -1;
else else
return sequence; return sequence;
@ -226,80 +226,80 @@ int CBaseAnimating :: FindTransition( int iEndingSequence, int iGoalSequence, in
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: GetAutomovement( Vector &origin, Vector &angles, float flInterval ) void CBaseAnimating::GetAutomovement( Vector &origin, Vector &angles, float flInterval )
{ {
} }
void CBaseAnimating :: SetBodygroup( int iGroup, int iValue ) void CBaseAnimating::SetBodygroup( int iGroup, int iValue )
{ {
::SetBodygroup( GET_MODEL_PTR( ENT(pev) ), pev, iGroup, iValue ); ::SetBodygroup( GET_MODEL_PTR( ENT( pev ) ), pev, iGroup, iValue );
} }
int CBaseAnimating :: GetBodygroup( int iGroup ) int CBaseAnimating::GetBodygroup( int iGroup )
{ {
return ::GetBodygroup( GET_MODEL_PTR( ENT(pev) ), pev, iGroup ); return ::GetBodygroup( GET_MODEL_PTR( ENT( pev ) ), pev, iGroup );
} }
int CBaseAnimating :: ExtractBbox( int sequence, float *mins, float *maxs ) int CBaseAnimating::ExtractBbox( int sequence, float *mins, float *maxs )
{ {
return ::ExtractBbox( GET_MODEL_PTR( ENT(pev) ), sequence, mins, maxs ); return ::ExtractBbox( GET_MODEL_PTR( ENT( pev ) ), sequence, mins, maxs );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBaseAnimating :: SetSequenceBox( void ) void CBaseAnimating::SetSequenceBox( void )
{ {
Vector mins, maxs; Vector mins, maxs;
// Get sequence bbox // Get sequence bbox
if ( ExtractBbox( pev->sequence, mins, maxs ) ) if( ExtractBbox( pev->sequence, mins, maxs ) )
{ {
// expand box for rotation // expand box for rotation
// find min / max for rotations // find min / max for rotations
float yaw = pev->angles.y * (M_PI / 180.0); float yaw = pev->angles.y * ( M_PI / 180.0 );
Vector xvector, yvector; Vector xvector, yvector;
xvector.x = cos(yaw); xvector.x = cos( yaw );
xvector.y = sin(yaw); xvector.y = sin( yaw );
yvector.x = -sin(yaw); yvector.x = -sin( yaw );
yvector.y = cos(yaw); yvector.y = cos( yaw );
Vector bounds[2]; Vector bounds[2];
bounds[0] = mins; bounds[0] = mins;
bounds[1] = maxs; bounds[1] = maxs;
Vector rmin( 9999, 9999, 9999 ); Vector rmin( 9999, 9999, 9999 );
Vector rmax( -9999, -9999, -9999 ); Vector rmax( -9999, -9999, -9999 );
Vector base, transformed; Vector base, transformed;
for (int i = 0; i <= 1; i++ ) for( int i = 0; i <= 1; i++ )
{ {
base.x = bounds[i].x; base.x = bounds[i].x;
for ( int j = 0; j <= 1; j++ ) for( int j = 0; j <= 1; j++ )
{ {
base.y = bounds[j].y; base.y = bounds[j].y;
for ( int k = 0; k <= 1; k++ ) for( int k = 0; k <= 1; k++ )
{ {
base.z = bounds[k].z; base.z = bounds[k].z;
// transform the point // transform the point
transformed.x = xvector.x*base.x + yvector.x*base.y; transformed.x = xvector.x * base.x + yvector.x * base.y;
transformed.y = xvector.y*base.x + yvector.y*base.y; transformed.y = xvector.y * base.x + yvector.y * base.y;
transformed.z = base.z; transformed.z = base.z;
if (transformed.x < rmin.x) if( transformed.x < rmin.x )
rmin.x = transformed.x; rmin.x = transformed.x;
if (transformed.x > rmax.x) if( transformed.x > rmax.x )
rmax.x = transformed.x; rmax.x = transformed.x;
if (transformed.y < rmin.y) if( transformed.y < rmin.y )
rmin.y = transformed.y; rmin.y = transformed.y;
if (transformed.y > rmax.y) if( transformed.y > rmax.y )
rmax.y = transformed.y; rmax.y = transformed.y;
if (transformed.z < rmin.z) if( transformed.z < rmin.z )
rmin.z = transformed.z; rmin.z = transformed.z;
if (transformed.z > rmax.z) if( transformed.z > rmax.z )
rmax.z = transformed.z; rmax.z = transformed.z;
} }
} }
@ -309,4 +309,3 @@ void CBaseAnimating :: SetSequenceBox( void )
UTIL_SetSize( pev, rmin, rmax ); UTIL_SetSize( pev, rmin, rmax );
} }
} }

View File

@ -12,12 +12,13 @@
* without written permission from Valve LLC. * without written permission from Valve LLC.
* *
****/ ****/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
typedef int BOOL; typedef int BOOL;
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
// hack into header files that we can ship // hack into header files that we can ship
@ -56,22 +57,22 @@ extern globalvars_t *gpGlobals;
int ExtractBbox( void *pmodel, int sequence, float *mins, float *maxs ) int ExtractBbox( void *pmodel, int sequence, float *mins, float *maxs )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return 0; return 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex );
mins[0] = pseqdesc[ sequence ].bbmin[0];
mins[1] = pseqdesc[ sequence ].bbmin[1];
mins[2] = pseqdesc[ sequence ].bbmin[2];
maxs[0] = pseqdesc[ sequence ].bbmax[0]; mins[0] = pseqdesc[sequence].bbmin[0];
maxs[1] = pseqdesc[ sequence ].bbmax[1]; mins[1] = pseqdesc[sequence].bbmin[1];
maxs[2] = pseqdesc[ sequence ].bbmax[2]; mins[2] = pseqdesc[sequence].bbmin[2];
maxs[0] = pseqdesc[sequence].bbmax[0];
maxs[1] = pseqdesc[sequence].bbmax[1];
maxs[2] = pseqdesc[sequence].bbmax[2];
return 1; return 1;
} }
@ -79,23 +80,23 @@ int ExtractBbox( void *pmodel, int sequence, float *mins, float *maxs )
int LookupActivity( void *pmodel, entvars_t *pev, int activity ) int LookupActivity( void *pmodel, entvars_t *pev, int activity )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return 0; return 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex );
int weighttotal = 0; int weighttotal = 0;
int seq = ACTIVITY_NOT_AVAILABLE; int seq = ACTIVITY_NOT_AVAILABLE;
for (int i = 0; i < pstudiohdr->numseq; i++) for( int i = 0; i < pstudiohdr->numseq; i++ )
{ {
if (pseqdesc[i].activity == activity) if( pseqdesc[i].activity == activity )
{ {
weighttotal += pseqdesc[i].actweight; weighttotal += pseqdesc[i].actweight;
if (!weighttotal || RANDOM_LONG(0,weighttotal-1) < pseqdesc[i].actweight) if( !weighttotal || RANDOM_LONG( 0, weighttotal - 1 ) < pseqdesc[i].actweight )
seq = i; seq = i;
} }
} }
@ -106,22 +107,22 @@ int LookupActivity( void *pmodel, entvars_t *pev, int activity )
int LookupActivityHeaviest( void *pmodel, entvars_t *pev, int activity ) int LookupActivityHeaviest( void *pmodel, entvars_t *pev, int activity )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if ( !pstudiohdr ) if( !pstudiohdr )
return 0; return 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex );
int weight = 0; int weight = 0;
int seq = ACTIVITY_NOT_AVAILABLE; int seq = ACTIVITY_NOT_AVAILABLE;
for (int i = 0; i < pstudiohdr->numseq; i++) for( int i = 0; i < pstudiohdr->numseq; i++ )
{ {
if (pseqdesc[i].activity == activity) if( pseqdesc[i].activity == activity )
{ {
if ( pseqdesc[i].actweight > weight ) if( pseqdesc[i].actweight > weight )
{ {
weight = pseqdesc[i].actweight; weight = pseqdesc[i].actweight;
seq = i; seq = i;
@ -132,36 +133,36 @@ int LookupActivityHeaviest( void *pmodel, entvars_t *pev, int activity )
return seq; return seq;
} }
void GetEyePosition ( void *pmodel, float *vecEyePosition ) void GetEyePosition( void *pmodel, float *vecEyePosition )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if ( !pstudiohdr ) if( !pstudiohdr )
{ {
ALERT ( at_console, "GetEyePosition() Can't get pstudiohdr ptr!\n" ); ALERT( at_console, "GetEyePosition() Can't get pstudiohdr ptr!\n" );
return; return;
} }
VectorCopy ( pstudiohdr->eyeposition, vecEyePosition ); VectorCopy( pstudiohdr->eyeposition, vecEyePosition );
} }
int LookupSequence( void *pmodel, const char *label ) int LookupSequence( void *pmodel, const char *label )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return 0; return 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex );
for (int i = 0; i < pstudiohdr->numseq; i++) for( int i = 0; i < pstudiohdr->numseq; i++ )
{ {
if (stricmp( pseqdesc[i].label, label ) == 0) if( stricmp( pseqdesc[i].label, label ) == 0 )
return i; return i;
} }
@ -170,7 +171,7 @@ int LookupSequence( void *pmodel, const char *label )
int IsSoundEvent( int eventNumber ) int IsSoundEvent( int eventNumber )
{ {
if ( eventNumber == SCRIPT_EVENT_SOUND || eventNumber == SCRIPT_EVENT_SOUND_VOICE ) if( eventNumber == SCRIPT_EVENT_SOUND || eventNumber == SCRIPT_EVENT_SOUND_VOICE )
return 1; return 1;
return 0; return 0;
} }
@ -178,36 +179,36 @@ int IsSoundEvent( int eventNumber )
void SequencePrecache( void *pmodel, const char *pSequenceName ) void SequencePrecache( void *pmodel, const char *pSequenceName )
{ {
int index = LookupSequence( pmodel, pSequenceName ); int index = LookupSequence( pmodel, pSequenceName );
if ( index >= 0 ) if( index >= 0 )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if ( !pstudiohdr || index >= pstudiohdr->numseq ) if( !pstudiohdr || index >= pstudiohdr->numseq )
return; return;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
mstudioevent_t *pevent; mstudioevent_t *pevent;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + index; pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex ) + index;
pevent = (mstudioevent_t *)((byte *)pstudiohdr + pseqdesc->eventindex); pevent = (mstudioevent_t *)( (byte *)pstudiohdr + pseqdesc->eventindex );
for (int i = 0; i < pseqdesc->numevents; i++) for( int i = 0; i < pseqdesc->numevents; i++ )
{ {
// Don't send client-side events to the server AI // Don't send client-side events to the server AI
if ( pevent[i].event >= EVENT_CLIENT ) if( pevent[i].event >= EVENT_CLIENT )
continue; continue;
// UNDONE: Add a callback to check to see if a sound is precached yet and don't allocate a copy // UNDONE: Add a callback to check to see if a sound is precached yet and don't allocate a copy
// of it's name if it is. // of it's name if it is.
if ( IsSoundEvent( pevent[i].event ) ) if( IsSoundEvent( pevent[i].event ) )
{ {
if ( !strlen(pevent[i].options) ) if( !strlen( pevent[i].options ) )
{ {
ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options ); ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options );
} }
PRECACHE_SOUND( (char *)(gpGlobals->pStringBase + ALLOC_STRING(pevent[i].options) ) ); PRECACHE_SOUND( (char *)( gpGlobals->pStringBase + ALLOC_STRING( pevent[i].options ) ) );
} }
} }
} }
@ -216,27 +217,27 @@ void SequencePrecache( void *pmodel, const char *pSequenceName )
void GetSequenceInfo( void *pmodel, entvars_t *pev, float *pflFrameRate, float *pflGroundSpeed ) void GetSequenceInfo( void *pmodel, entvars_t *pev, float *pflFrameRate, float *pflGroundSpeed )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return; return;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
if (pev->sequence >= pstudiohdr->numseq) if( pev->sequence >= pstudiohdr->numseq )
{ {
*pflFrameRate = 0.0; *pflFrameRate = 0.0;
*pflGroundSpeed = 0.0; *pflGroundSpeed = 0.0;
return; return;
} }
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex ) + (int)pev->sequence;
if (pseqdesc->numframes > 1) if( pseqdesc->numframes > 1 )
{ {
*pflFrameRate = 256 * pseqdesc->fps / (pseqdesc->numframes - 1); *pflFrameRate = 256 * pseqdesc->fps / ( pseqdesc->numframes - 1 );
*pflGroundSpeed = sqrt( pseqdesc->linearmovement[0]*pseqdesc->linearmovement[0]+ pseqdesc->linearmovement[1]*pseqdesc->linearmovement[1]+ pseqdesc->linearmovement[2]*pseqdesc->linearmovement[2] ); *pflGroundSpeed = sqrt( pseqdesc->linearmovement[0] * pseqdesc->linearmovement[0] + pseqdesc->linearmovement[1] * pseqdesc->linearmovement[1] + pseqdesc->linearmovement[2] * pseqdesc->linearmovement[2] );
*pflGroundSpeed = *pflGroundSpeed * pseqdesc->fps / (pseqdesc->numframes - 1); *pflGroundSpeed = *pflGroundSpeed * pseqdesc->fps / ( pseqdesc->numframes - 1 );
} }
else else
{ {
@ -248,13 +249,13 @@ void GetSequenceInfo( void *pmodel, entvars_t *pev, float *pflFrameRate, float *
int GetSequenceFlags( void *pmodel, entvars_t *pev ) int GetSequenceFlags( void *pmodel, entvars_t *pev )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if ( !pstudiohdr || pev->sequence >= pstudiohdr->numseq ) if( !pstudiohdr || pev->sequence >= pstudiohdr->numseq )
return 0; return 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex ) + (int)pev->sequence;
return pseqdesc->flags; return pseqdesc->flags;
} }
@ -262,25 +263,25 @@ int GetSequenceFlags( void *pmodel, entvars_t *pev )
int GetAnimationEvent( void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index ) int GetAnimationEvent( void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEvent, float flStart, float flEnd, int index )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if ( !pstudiohdr || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent ) if( !pstudiohdr || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent )
return 0; return 0;
int events = 0; int events = 0;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
mstudioevent_t *pevent; mstudioevent_t *pevent;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex ) + (int)pev->sequence;
pevent = (mstudioevent_t *)((byte *)pstudiohdr + pseqdesc->eventindex); pevent = (mstudioevent_t *)( (byte *)pstudiohdr + pseqdesc->eventindex );
if (pseqdesc->numevents == 0 || index > pseqdesc->numevents ) if( pseqdesc->numevents == 0 || index > pseqdesc->numevents )
return 0; return 0;
if (pseqdesc->numframes > 1) if( pseqdesc->numframes > 1 )
{ {
flStart *= (pseqdesc->numframes - 1) / 256.0; flStart *= ( pseqdesc->numframes - 1 ) / 256.0;
flEnd *= (pseqdesc->numframes - 1) / 256.0; flEnd *= (pseqdesc->numframes - 1) / 256.0;
} }
else else
@ -289,14 +290,14 @@ int GetAnimationEvent( void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEve
flEnd = 1.0; flEnd = 1.0;
} }
for (; index < pseqdesc->numevents; index++) for( ; index < pseqdesc->numevents; index++ )
{ {
// Don't send client-side events to the server AI // Don't send client-side events to the server AI
if ( pevent[index].event >= EVENT_CLIENT ) if( pevent[index].event >= EVENT_CLIENT )
continue; continue;
if ( (pevent[index].frame >= flStart && pevent[index].frame < flEnd) || if( ( pevent[index].frame >= flStart && pevent[index].frame < flEnd ) ||
((pseqdesc->flags & STUDIO_LOOPING) && flEnd >= pseqdesc->numframes - 1 && pevent[index].frame < flEnd - pseqdesc->numframes + 1) ) ( ( pseqdesc->flags & STUDIO_LOOPING ) && flEnd >= pseqdesc->numframes - 1 && pevent[index].frame < flEnd - pseqdesc->numframes + 1 ) )
{ {
pMonsterEvent->event = pevent[index].event; pMonsterEvent->event = pevent[index].event;
pMonsterEvent->options = pevent[index].options; pMonsterEvent->options = pevent[index].options;
@ -310,119 +311,122 @@ float SetController( void *pmodel, entvars_t *pev, int iController, float flValu
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
int i; int i;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return flValue; return flValue;
mstudiobonecontroller_t *pbonecontroller = (mstudiobonecontroller_t *)((byte *)pstudiohdr + pstudiohdr->bonecontrollerindex); mstudiobonecontroller_t *pbonecontroller = (mstudiobonecontroller_t *)( (byte *)pstudiohdr + pstudiohdr->bonecontrollerindex );
// find first controller that matches the index // find first controller that matches the index
for (i = 0; i < pstudiohdr->numbonecontrollers; i++, pbonecontroller++) for( i = 0; i < pstudiohdr->numbonecontrollers; i++, pbonecontroller++ )
{ {
if (pbonecontroller->index == iController) if( pbonecontroller->index == iController )
break; break;
} }
if (i >= pstudiohdr->numbonecontrollers) if( i >= pstudiohdr->numbonecontrollers )
return flValue; return flValue;
// wrap 0..360 if it's a rotational controller // wrap 0..360 if it's a rotational controller
if( pbonecontroller->type & ( STUDIO_XR | STUDIO_YR | STUDIO_ZR ) )
if (pbonecontroller->type & (STUDIO_XR | STUDIO_YR | STUDIO_ZR))
{ {
// ugly hack, invert value if end < start // ugly hack, invert value if end < start
if (pbonecontroller->end < pbonecontroller->start) if( pbonecontroller->end < pbonecontroller->start )
flValue = -flValue; flValue = -flValue;
// does the controller not wrap? // does the controller not wrap?
if (pbonecontroller->start + 359.0 >= pbonecontroller->end) if( pbonecontroller->start + 359.0 >= pbonecontroller->end )
{ {
if (flValue > ((pbonecontroller->start + pbonecontroller->end) / 2.0) + 180) if( flValue > ( ( pbonecontroller->start + pbonecontroller->end ) / 2.0 ) + 180 )
flValue = flValue - 360; flValue = flValue - 360;
if (flValue < ((pbonecontroller->start + pbonecontroller->end) / 2.0) - 180) if( flValue < ( ( pbonecontroller->start + pbonecontroller->end) / 2.0 ) - 180 )
flValue = flValue + 360; flValue = flValue + 360;
} }
else else
{ {
if (flValue > 360) if( flValue > 360 )
flValue = flValue - (int)(flValue / 360.0) * 360.0; flValue = flValue - (int)( flValue / 360.0 ) * 360.0;
else if (flValue < 0) else if( flValue < 0 )
flValue = flValue + (int)((flValue / -360.0) + 1) * 360.0; flValue = flValue + (int)( ( flValue / -360.0 ) + 1 ) * 360.0;
} }
} }
int setting = 255 * (flValue - pbonecontroller->start) / (pbonecontroller->end - pbonecontroller->start); int setting = 255 * ( flValue - pbonecontroller->start ) / ( pbonecontroller->end - pbonecontroller->start );
if (setting < 0) setting = 0; if( setting < 0 )
if (setting > 255) setting = 255; setting = 0;
if( setting > 255 )
setting = 255;
pev->controller[iController] = setting; pev->controller[iController] = setting;
return setting * (1.0 / 255.0) * (pbonecontroller->end - pbonecontroller->start) + pbonecontroller->start; return setting * ( 1.0 / 255.0 ) * (pbonecontroller->end - pbonecontroller->start ) + pbonecontroller->start;
} }
float SetBlending( void *pmodel, entvars_t *pev, int iBlender, float flValue ) float SetBlending( void *pmodel, entvars_t *pev, int iBlender, float flValue )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return flValue; return flValue;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + (int)pev->sequence; pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex ) + (int)pev->sequence;
if (pseqdesc->blendtype[iBlender] == 0) if( pseqdesc->blendtype[iBlender] == 0 )
return flValue; return flValue;
if (pseqdesc->blendtype[iBlender] & (STUDIO_XR | STUDIO_YR | STUDIO_ZR)) if( pseqdesc->blendtype[iBlender] & ( STUDIO_XR | STUDIO_YR | STUDIO_ZR ) )
{ {
// ugly hack, invert value if end < start // ugly hack, invert value if end < start
if (pseqdesc->blendend[iBlender] < pseqdesc->blendstart[iBlender]) if( pseqdesc->blendend[iBlender] < pseqdesc->blendstart[iBlender] )
flValue = -flValue; flValue = -flValue;
// does the controller not wrap? // does the controller not wrap?
if (pseqdesc->blendstart[iBlender] + 359.0 >= pseqdesc->blendend[iBlender]) if( pseqdesc->blendstart[iBlender] + 359.0 >= pseqdesc->blendend[iBlender] )
{ {
if (flValue > ((pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender]) / 2.0) + 180) if( flValue > ( ( pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender] ) / 2.0 ) + 180 )
flValue = flValue - 360; flValue = flValue - 360;
if (flValue < ((pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender]) / 2.0) - 180) if( flValue < ( ( pseqdesc->blendstart[iBlender] + pseqdesc->blendend[iBlender] ) / 2.0 ) - 180 )
flValue = flValue + 360; flValue = flValue + 360;
} }
} }
int setting = 255 * (flValue - pseqdesc->blendstart[iBlender]) / (pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender]); int setting = 255 * ( flValue - pseqdesc->blendstart[iBlender] ) / ( pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender] );
if (setting < 0) setting = 0; if( setting < 0 )
if (setting > 255) setting = 255; setting = 0;
if(setting > 255)
setting = 255;
pev->blending[iBlender] = setting; pev->blending[iBlender] = setting;
return setting * (1.0 / 255.0) * (pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender]) + pseqdesc->blendstart[iBlender]; return setting * ( 1.0 / 255.0 ) * ( pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender] ) + pseqdesc->blendstart[iBlender];
} }
int FindTransition( void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir ) int FindTransition( void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return iGoalAnim; return iGoalAnim;
mstudioseqdesc_t *pseqdesc; mstudioseqdesc_t *pseqdesc;
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex); pseqdesc = (mstudioseqdesc_t *)( (byte *)pstudiohdr + pstudiohdr->seqindex );
// bail if we're going to or from a node 0 // bail if we're going to or from a node 0
if (pseqdesc[iEndingAnim].entrynode == 0 || pseqdesc[iGoalAnim].entrynode == 0) if( pseqdesc[iEndingAnim].entrynode == 0 || pseqdesc[iGoalAnim].entrynode == 0 )
{ {
return iGoalAnim; return iGoalAnim;
} }
int iEndNode; int iEndNode;
// ALERT( at_console, "from %d to %d: ", pEndNode->iEndNode, pGoalNode->iStartNode ); // ALERT( at_console, "from %d to %d: ", pEndNode->iEndNode, pGoalNode->iStartNode );
if (*piDir > 0) if( *piDir > 0 )
{ {
iEndNode = pseqdesc[iEndingAnim].exitnode; iEndNode = pseqdesc[iEndingAnim].exitnode;
} }
@ -431,32 +435,32 @@ int FindTransition( void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir )
iEndNode = pseqdesc[iEndingAnim].entrynode; iEndNode = pseqdesc[iEndingAnim].entrynode;
} }
if (iEndNode == pseqdesc[iGoalAnim].entrynode) if( iEndNode == pseqdesc[iGoalAnim].entrynode )
{ {
*piDir = 1; *piDir = 1;
return iGoalAnim; return iGoalAnim;
} }
byte *pTransition = ((byte *)pstudiohdr + pstudiohdr->transitionindex); byte *pTransition = ( (byte *)pstudiohdr + pstudiohdr->transitionindex );
int iInternNode = pTransition[(iEndNode-1)*pstudiohdr->numtransitions + (pseqdesc[iGoalAnim].entrynode-1)]; int iInternNode = pTransition[( iEndNode - 1 ) * pstudiohdr->numtransitions + ( pseqdesc[iGoalAnim].entrynode - 1 )];
if (iInternNode == 0) if( iInternNode == 0 )
return iGoalAnim; return iGoalAnim;
int i; int i;
// look for someone going // look for someone going
for (i = 0; i < pstudiohdr->numseq; i++) for( i = 0; i < pstudiohdr->numseq; i++ )
{ {
if (pseqdesc[i].entrynode == iEndNode && pseqdesc[i].exitnode == iInternNode) if( pseqdesc[i].entrynode == iEndNode && pseqdesc[i].exitnode == iInternNode )
{ {
*piDir = 1; *piDir = 1;
return i; return i;
} }
if (pseqdesc[i].nodeflags) if( pseqdesc[i].nodeflags )
{ {
if (pseqdesc[i].exitnode == iEndNode && pseqdesc[i].entrynode == iInternNode) if( pseqdesc[i].exitnode == iEndNode && pseqdesc[i].entrynode == iInternNode )
{ {
*piDir = -1; *piDir = -1;
return i; return i;
@ -471,41 +475,41 @@ int FindTransition( void *pmodel, int iEndingAnim, int iGoalAnim, int *piDir )
void SetBodygroup( void *pmodel, entvars_t *pev, int iGroup, int iValue ) void SetBodygroup( void *pmodel, entvars_t *pev, int iGroup, int iValue )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return; return;
if (iGroup > pstudiohdr->numbodyparts) if( iGroup > pstudiohdr->numbodyparts )
return; return;
mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex) + iGroup; mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex ) + iGroup;
if (iValue >= pbodypart->nummodels) if( iValue >= pbodypart->nummodels )
return; return;
int iCurrent = (pev->body / pbodypart->base) % pbodypart->nummodels; int iCurrent = ( pev->body / pbodypart->base ) % pbodypart->nummodels;
pev->body = (pev->body - (iCurrent * pbodypart->base) + (iValue * pbodypart->base)); pev->body = ( pev->body - ( iCurrent * pbodypart->base ) + ( iValue * pbodypart->base ) );
} }
int GetBodygroup( void *pmodel, entvars_t *pev, int iGroup ) int GetBodygroup( void *pmodel, entvars_t *pev, int iGroup )
{ {
studiohdr_t *pstudiohdr; studiohdr_t *pstudiohdr;
pstudiohdr = (studiohdr_t *)pmodel; pstudiohdr = (studiohdr_t *)pmodel;
if (! pstudiohdr) if( !pstudiohdr )
return 0; return 0;
if (iGroup > pstudiohdr->numbodyparts) if( iGroup > pstudiohdr->numbodyparts )
return 0; return 0;
mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex) + iGroup; mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex ) + iGroup;
if (pbodypart->nummodels <= 1) if( pbodypart->nummodels <= 1 )
return 0; return 0;
int iCurrent = (pev->body / pbodypart->base) % pbodypart->nummodels; int iCurrent = ( pev->body / pbodypart->base ) % pbodypart->nummodels;
return iCurrent; return iCurrent;
} }

View File

@ -42,6 +42,4 @@ int ExtractBbox( void *pmodel, int sequence, float *mins, float *maxs );
// From /engine/studio.h // From /engine/studio.h
#define STUDIO_LOOPING 0x0001 #define STUDIO_LOOPING 0x0001
#endif //ANIMATION_H #endif //ANIMATION_H

File diff suppressed because it is too large Load Diff

View File

@ -36,23 +36,23 @@ class CBarnacle : public CBaseMonster
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
CBaseEntity *TongueTouchEnt ( float *pflLength ); CBaseEntity *TongueTouchEnt( float *pflLength );
int Classify ( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
void EXPORT BarnacleThink ( void ); void EXPORT BarnacleThink( void );
void EXPORT WaitTillDead ( void ); void EXPORT WaitTillDead( void );
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
float m_flAltitude; float m_flAltitude;
float m_flCachedLength; // tongue cached length float m_flCachedLength; // tongue cached length
float m_flKillVictimTime; float m_flKillVictimTime;
int m_cGibs; // barnacle loads up on gibs each time it kills something. int m_cGibs; // barnacle loads up on gibs each time it kills something.
BOOL m_fTongueExtended; BOOL m_fTongueExtended;
BOOL m_fLiftingPrey; BOOL m_fLiftingPrey;
float m_flTongueAdj; float m_flTongueAdj;
// FIXME: need a custom barnacle model with non-generic hitgroup // FIXME: need a custom barnacle model with non-generic hitgroup
@ -68,7 +68,7 @@ public:
LINK_ENTITY_TO_CLASS( monster_barnacle, CBarnacle ) LINK_ENTITY_TO_CLASS( monster_barnacle, CBarnacle )
TYPEDESCRIPTION CBarnacle::m_SaveData[] = TYPEDESCRIPTION CBarnacle::m_SaveData[] =
{ {
DEFINE_FIELD( CBarnacle, m_flAltitude, FIELD_FLOAT ), DEFINE_FIELD( CBarnacle, m_flAltitude, FIELD_FLOAT ),
DEFINE_FIELD( CBarnacle, m_flKillVictimTime, FIELD_TIME ), DEFINE_FIELD( CBarnacle, m_flKillVictimTime, FIELD_TIME ),
@ -85,9 +85,9 @@ IMPLEMENT_SAVERESTORE( CBarnacle, CBaseMonster )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CBarnacle :: Classify ( void ) int CBarnacle::Classify( void )
{ {
return CLASS_ALIEN_MONSTER; return CLASS_ALIEN_MONSTER;
} }
//========================================================= //=========================================================
@ -96,7 +96,7 @@ int CBarnacle :: Classify ( void )
// //
// Returns number of events handled, 0 if none. // Returns number of events handled, 0 if none.
//========================================================= //=========================================================
void CBarnacle :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CBarnacle::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -112,40 +112,40 @@ void CBarnacle :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CBarnacle :: Spawn() void CBarnacle::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/barnacle.mdl"); SET_MODEL( ENT( pev ), "models/barnacle.mdl" );
UTIL_SetSize( pev, Vector(-16, -16, -32), Vector(16, 16, 0) ); UTIL_SetSize( pev, Vector( -16, -16, -32 ), Vector( 16, 16, 0 ) );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->takedamage = DAMAGE_AIM; pev->takedamage = DAMAGE_AIM;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->effects = EF_INVLIGHT; // take light from the ceiling pev->effects = EF_INVLIGHT; // take light from the ceiling
pev->health = 25; pev->health = 25;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
m_flKillVictimTime = 0; m_flKillVictimTime = 0;
m_flCachedLength = 32; // mins.z m_flCachedLength = 32; // mins.z
m_cGibs = 0; m_cGibs = 0;
m_fLiftingPrey = FALSE; m_fLiftingPrey = FALSE;
m_flTongueAdj = -100; m_flTongueAdj = -100;
InitBoneControllers(); InitBoneControllers();
SetActivity ( ACT_IDLE ); SetActivity( ACT_IDLE );
SetThink( &CBarnacle::BarnacleThink ); SetThink( &CBarnacle::BarnacleThink );
pev->nextthink = gpGlobals->time + 0.5; pev->nextthink = gpGlobals->time + 0.5;
UTIL_SetOrigin ( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
} }
int CBarnacle::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) int CBarnacle::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
if ( bitsDamageType & DMG_CLUB ) if( bitsDamageType & DMG_CLUB )
{ {
flDamage = pev->health; flDamage = pev->health;
} }
@ -155,26 +155,25 @@ int CBarnacle::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, floa
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBarnacle :: BarnacleThink ( void ) void CBarnacle::BarnacleThink( void )
{ {
CBaseEntity *pTouchEnt; CBaseEntity *pTouchEnt;
CBaseMonster *pVictim; CBaseMonster *pVictim;
float flLength; float flLength;
#ifdef BARNACLE_FIX_VISIBILITY #ifdef BARNACLE_FIX_VISIBILITY
if( m_flCachedLength != ( m_flAltitude + m_flTongueAdj ) || ( pev->absmin.z != pev->origin.z + -m_flCachedLength )) if( m_flCachedLength != ( m_flAltitude + m_flTongueAdj ) || ( pev->absmin.z != pev->origin.z + -m_flCachedLength ) )
{ {
// recalc collision box here to avoid barnacle disappears bug // recalc collision box here to avoid barnacle disappears bug
m_flCachedLength = (m_flAltitude + m_flTongueAdj); m_flCachedLength = m_flAltitude + m_flTongueAdj;
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
} }
#endif #endif
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
// barnacle has prey. // barnacle has prey.
if ( !m_hEnemy->IsAlive() ) if( !m_hEnemy->IsAlive() )
{ {
// someone (maybe even the barnacle) killed the prey. Reset barnacle. // someone (maybe even the barnacle) killed the prey. Reset barnacle.
m_fLiftingPrey = FALSE;// indicate that we're not lifting prey. m_fLiftingPrey = FALSE;// indicate that we're not lifting prey.
@ -182,9 +181,9 @@ void CBarnacle :: BarnacleThink ( void )
return; return;
} }
if ( m_fLiftingPrey ) if( m_fLiftingPrey )
{ {
if ( m_hEnemy != NULL && m_hEnemy->pev->deadflag != DEAD_NO ) if( m_hEnemy != NULL && m_hEnemy->pev->deadflag != DEAD_NO )
{ {
// crap, someone killed the prey on the way up. // crap, someone killed the prey on the way up.
m_hEnemy = NULL; m_hEnemy = NULL;
@ -198,43 +197,43 @@ void CBarnacle :: BarnacleThink ( void )
vecNewEnemyOrigin.y = pev->origin.y; vecNewEnemyOrigin.y = pev->origin.y;
// guess as to where their neck is // guess as to where their neck is
vecNewEnemyOrigin.x -= 6 * cos(m_hEnemy->pev->angles.y * M_PI/180.0); vecNewEnemyOrigin.x -= 6 * cos( m_hEnemy->pev->angles.y * M_PI / 180.0 );
vecNewEnemyOrigin.y -= 6 * sin(m_hEnemy->pev->angles.y * M_PI/180.0); vecNewEnemyOrigin.y -= 6 * sin( m_hEnemy->pev->angles.y * M_PI / 180.0 );
m_flAltitude -= BARNACLE_PULL_SPEED; m_flAltitude -= BARNACLE_PULL_SPEED;
vecNewEnemyOrigin.z += BARNACLE_PULL_SPEED; vecNewEnemyOrigin.z += BARNACLE_PULL_SPEED;
if ( fabs( pev->origin.z - ( vecNewEnemyOrigin.z + m_hEnemy->pev->view_ofs.z - 8 ) ) < BARNACLE_BODY_HEIGHT ) if( fabs( pev->origin.z - ( vecNewEnemyOrigin.z + m_hEnemy->pev->view_ofs.z - 8 ) ) < BARNACLE_BODY_HEIGHT )
{ {
// prey has just been lifted into position ( if the victim origin + eye height + 8 is higher than the bottom of the barnacle, it is assumed that the head is within barnacle's body ) // prey has just been lifted into position ( if the victim origin + eye height + 8 is higher than the bottom of the barnacle, it is assumed that the head is within barnacle's body )
m_fLiftingPrey = FALSE; m_fLiftingPrey = FALSE;
EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_bite3.wav", 1, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_bite3.wav", 1, ATTN_NORM );
pVictim = m_hEnemy->MyMonsterPointer(); pVictim = m_hEnemy->MyMonsterPointer();
m_flKillVictimTime = gpGlobals->time + 10;// now that the victim is in place, the killing bite will be administered in 10 seconds. m_flKillVictimTime = gpGlobals->time + 10;// now that the victim is in place, the killing bite will be administered in 10 seconds.
if ( pVictim ) if( pVictim )
{ {
pVictim->BarnacleVictimBitten( pev ); pVictim->BarnacleVictimBitten( pev );
SetActivity ( ACT_EAT ); SetActivity( ACT_EAT );
} }
} }
UTIL_SetOrigin ( m_hEnemy->pev, vecNewEnemyOrigin ); UTIL_SetOrigin( m_hEnemy->pev, vecNewEnemyOrigin );
} }
else else
{ {
// prey is lifted fully into feeding position and is dangling there. // prey is lifted fully into feeding position and is dangling there.
pVictim = m_hEnemy->MyMonsterPointer(); pVictim = m_hEnemy->MyMonsterPointer();
if ( m_flKillVictimTime != -1 && gpGlobals->time > m_flKillVictimTime ) if( m_flKillVictimTime != -1 && gpGlobals->time > m_flKillVictimTime )
{ {
// kill! // kill!
if ( pVictim ) if( pVictim )
{ {
pVictim->TakeDamage ( pev, pev, pVictim->pev->health, DMG_SLASH | DMG_ALWAYSGIB ); pVictim->TakeDamage( pev, pev, pVictim->pev->health, DMG_SLASH | DMG_ALWAYSGIB );
m_cGibs = 3; m_cGibs = 3;
} }
@ -242,58 +241,69 @@ void CBarnacle :: BarnacleThink ( void )
} }
// bite prey every once in a while // bite prey every once in a while
if ( pVictim && ( RANDOM_LONG(0,49) == 0 ) ) if( pVictim && ( RANDOM_LONG( 0, 49 ) == 0 ) )
{ {
switch ( RANDOM_LONG(0,2) ) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew1.wav", 1, ATTN_NORM ); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew2.wav", 1, ATTN_NORM ); break; EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew1.wav", 1, ATTN_NORM );
case 2: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew3.wav", 1, ATTN_NORM ); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew2.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew3.wav", 1, ATTN_NORM );
break;
} }
pVictim->BarnacleVictimBitten( pev ); pVictim->BarnacleVictimBitten( pev );
} }
} }
} }
else else
{ {
// barnacle has no prey right now, so just idle and check to see if anything is touching the tongue. // barnacle has no prey right now, so just idle and check to see if anything is touching the tongue.
// If idle and no nearby client, don't think so often // If idle and no nearby client, don't think so often
if ( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) ) if( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) )
pev->nextthink = gpGlobals->time + RANDOM_FLOAT(1,1.5); // Stagger a bit to keep barnacles from thinking on the same frame pev->nextthink = gpGlobals->time + RANDOM_FLOAT( 1, 1.5 ); // Stagger a bit to keep barnacles from thinking on the same frame
if ( m_fSequenceFinished ) if( m_fSequenceFinished )
{ {
// this is done so barnacle will fidget. // this is done so barnacle will fidget.
SetActivity ( ACT_IDLE ); SetActivity ( ACT_IDLE );
m_flTongueAdj = -100; m_flTongueAdj = -100;
} }
if ( m_cGibs && RANDOM_LONG(0,99) == 1 ) if( m_cGibs && RANDOM_LONG( 0, 99 ) == 1 )
{ {
// cough up a gib. // cough up a gib.
CGib::SpawnRandomGibs( pev, 1, 1 ); CGib::SpawnRandomGibs( pev, 1, 1 );
m_cGibs--; m_cGibs--;
switch ( RANDOM_LONG(0,2) ) switch ( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew1.wav", 1, ATTN_NORM ); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew2.wav", 1, ATTN_NORM ); break; EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew1.wav", 1, ATTN_NORM );
case 2: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_chew3.wav", 1, ATTN_NORM ); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew2.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_chew3.wav", 1, ATTN_NORM );
break;
} }
} }
pTouchEnt = TongueTouchEnt( &flLength ); pTouchEnt = TongueTouchEnt( &flLength );
if ( pTouchEnt != NULL && m_fTongueExtended ) if( pTouchEnt != NULL && m_fTongueExtended )
{ {
// tongue is fully extended, and is touching someone. // tongue is fully extended, and is touching someone.
if ( pTouchEnt->FBecomeProne() ) if( pTouchEnt->FBecomeProne() )
{ {
EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_alert2.wav", 1, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_alert2.wav", 1, ATTN_NORM );
SetSequenceByName ( "attack1" ); SetSequenceByName( "attack1" );
m_flTongueAdj = -20; m_flTongueAdj = -20;
m_hEnemy = pTouchEnt; m_hEnemy = pTouchEnt;
@ -307,13 +317,13 @@ void CBarnacle :: BarnacleThink ( void )
m_fLiftingPrey = TRUE;// indicate that we should be lifting prey. m_fLiftingPrey = TRUE;// indicate that we should be lifting prey.
m_flKillVictimTime = -1;// set this to a bogus time while the victim is lifted. m_flKillVictimTime = -1;// set this to a bogus time while the victim is lifted.
m_flAltitude = (pev->origin.z - pTouchEnt->EyePosition().z); m_flAltitude = pev->origin.z - pTouchEnt->EyePosition().z;
} }
} }
else else
{ {
// calculate a new length for the tongue to be clear of anything else that moves under it. // calculate a new length for the tongue to be clear of anything else that moves under it.
if ( m_flAltitude < flLength ) if( m_flAltitude < flLength )
{ {
// if tongue is higher than is should be, lower it kind of slowly. // if tongue is higher than is should be, lower it kind of slowly.
m_flAltitude += BARNACLE_PULL_SPEED; m_flAltitude += BARNACLE_PULL_SPEED;
@ -324,45 +334,47 @@ void CBarnacle :: BarnacleThink ( void )
m_flAltitude = flLength; m_flAltitude = flLength;
m_fTongueExtended = TRUE; m_fTongueExtended = TRUE;
} }
} }
} }
// ALERT( at_console, "tounge %f\n", m_flAltitude + m_flTongueAdj ); // ALERT( at_console, "tounge %f\n", m_flAltitude + m_flTongueAdj );
SetBoneController( 0, -(m_flAltitude + m_flTongueAdj) ); SetBoneController( 0, -( m_flAltitude + m_flTongueAdj ) );
StudioFrameAdvance( 0.1 ); StudioFrameAdvance( 0.1 );
} }
//========================================================= //=========================================================
// Killed. // Killed.
//========================================================= //=========================================================
void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) void CBarnacle::Killed( entvars_t *pevAttacker, int iGib )
{ {
CBaseMonster *pVictim; CBaseMonster *pVictim;
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
pVictim = m_hEnemy->MyMonsterPointer(); pVictim = m_hEnemy->MyMonsterPointer();
if ( pVictim ) if( pVictim )
{ {
pVictim->BarnacleVictimReleased(); pVictim->BarnacleVictimReleased();
} }
} }
// CGib::SpawnRandomGibs( pev, 4, 1 ); //CGib::SpawnRandomGibs( pev, 4, 1 );
switch ( RANDOM_LONG ( 0, 1 ) ) switch( RANDOM_LONG ( 0, 1 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM );
break;
} }
SetActivity ( ACT_DIESIMPLE ); SetActivity( ACT_DIESIMPLE );
SetBoneController( 0, 0 ); SetBoneController( 0, 0 );
StudioFrameAdvance( 0.1 ); StudioFrameAdvance( 0.1 );
@ -373,14 +385,14 @@ void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CBarnacle :: WaitTillDead ( void ) void CBarnacle::WaitTillDead( void )
{ {
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
float flInterval = StudioFrameAdvance( 0.1 ); float flInterval = StudioFrameAdvance( 0.1 );
DispatchAnimEvents ( flInterval ); DispatchAnimEvents( flInterval );
if ( m_fSequenceFinished ) if( m_fSequenceFinished )
{ {
// death anim finished. // death anim finished.
StopAnimation(); StopAnimation();
@ -391,17 +403,17 @@ void CBarnacle :: WaitTillDead ( void )
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CBarnacle :: Precache() void CBarnacle::Precache()
{ {
PRECACHE_MODEL("models/barnacle.mdl"); PRECACHE_MODEL( "models/barnacle.mdl" );
PRECACHE_SOUND("barnacle/bcl_alert2.wav");//happy, lifting food up PRECACHE_SOUND( "barnacle/bcl_alert2.wav" );//happy, lifting food up
PRECACHE_SOUND("barnacle/bcl_bite3.wav");//just got food to mouth PRECACHE_SOUND( "barnacle/bcl_bite3.wav" );//just got food to mouth
PRECACHE_SOUND("barnacle/bcl_chew1.wav"); PRECACHE_SOUND( "barnacle/bcl_chew1.wav" );
PRECACHE_SOUND("barnacle/bcl_chew2.wav"); PRECACHE_SOUND( "barnacle/bcl_chew2.wav" );
PRECACHE_SOUND("barnacle/bcl_chew3.wav"); PRECACHE_SOUND( "barnacle/bcl_chew3.wav" );
PRECACHE_SOUND("barnacle/bcl_die1.wav" ); PRECACHE_SOUND( "barnacle/bcl_die1.wav" );
PRECACHE_SOUND("barnacle/bcl_die3.wav" ); PRECACHE_SOUND( "barnacle/bcl_die3.wav" );
} }
//========================================================= //=========================================================
@ -410,15 +422,15 @@ void CBarnacle :: Precache()
// of the trace in the int pointer provided. // of the trace in the int pointer provided.
//========================================================= //=========================================================
#define BARNACLE_CHECK_SPACING 8 #define BARNACLE_CHECK_SPACING 8
CBaseEntity *CBarnacle :: TongueTouchEnt ( float *pflLength ) CBaseEntity *CBarnacle::TongueTouchEnt( float *pflLength )
{ {
TraceResult tr; TraceResult tr;
float length; float length;
// trace once to hit architecture and see if the tongue needs to change position. // trace once to hit architecture and see if the tongue needs to change position.
UTIL_TraceLine ( pev->origin, pev->origin - Vector ( 0 , 0 , 2048 ), ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( pev->origin, pev->origin - Vector ( 0, 0, 2048 ), ignore_monsters, ENT( pev ), &tr );
length = fabs( pev->origin.z - tr.vecEndPos.z ); length = fabs( pev->origin.z - tr.vecEndPos.z );
if ( pflLength ) if( pflLength )
{ {
*pflLength = length; *pflLength = length;
} }
@ -430,13 +442,13 @@ CBaseEntity *CBarnacle :: TongueTouchEnt ( float *pflLength )
mins.z -= length; mins.z -= length;
CBaseEntity *pList[10]; CBaseEntity *pList[10];
int count = UTIL_EntitiesInBox( pList, 10, mins, maxs, (FL_CLIENT|FL_MONSTER) ); int count = UTIL_EntitiesInBox( pList, 10, mins, maxs, ( FL_CLIENT | FL_MONSTER ) );
if ( count ) if( count )
{ {
for ( int i = 0; i < count; i++ ) for( int i = 0; i < count; i++ )
{ {
// only clients and monsters // only clients and monsters
if ( pList[i] != this && IRelationship( pList[i] ) > R_NO && pList[ i ]->pev->deadflag == DEAD_NO ) // this ent is one of our enemies. Barnacle tries to eat it. if( pList[i] != this && IRelationship( pList[i] ) > R_NO && pList[ i ]->pev->deadflag == DEAD_NO ) // this ent is one of our enemies. Barnacle tries to eat it.
{ {
return pList[i]; return pList[i];
} }

View File

@ -38,7 +38,7 @@
#define BARNEY_BODY_GUNHOLSTERED 0 #define BARNEY_BODY_GUNHOLSTERED 0
#define BARNEY_BODY_GUNDRAWN 1 #define BARNEY_BODY_GUNDRAWN 1
#define BARNEY_BODY_GUNGONE 2 #define BARNEY_BODY_GUNGONE 2
class CBarney : public CTalkMonster class CBarney : public CTalkMonster
{ {
@ -46,51 +46,51 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int ISoundMask( void ); int ISoundMask( void );
void BarneyFirePistol( void ); void BarneyFirePistol( void );
void AlertSound( void ); void AlertSound( void );
int Classify ( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
void RunTask( Task_t *pTask ); void RunTask( Task_t *pTask );
void StartTask( Task_t *pTask ); void StartTask( Task_t *pTask );
virtual int ObjectCaps( void ) { return CTalkMonster :: ObjectCaps() | FCAP_IMPULSE_USE; } virtual int ObjectCaps( void ) { return CTalkMonster :: ObjectCaps() | FCAP_IMPULSE_USE; }
int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType); int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType);
BOOL CheckRangeAttack1 ( float flDot, float flDist ); BOOL CheckRangeAttack1( float flDot, float flDist );
void DeclineFollowing( void ); void DeclineFollowing( void );
// Override these to set behavior // Override these to set behavior
Schedule_t *GetScheduleOfType ( int Type ); Schedule_t *GetScheduleOfType( int Type );
Schedule_t *GetSchedule ( void ); Schedule_t *GetSchedule( void );
MONSTERSTATE GetIdealState ( void ); MONSTERSTATE GetIdealState( void );
void DeathSound( void ); void DeathSound( void );
void PainSound( void ); void PainSound( void );
void TalkInit( void ); void TalkInit( void );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
BOOL m_fGunDrawn; virtual int Save( CSave &save );
float m_painTime; virtual int Restore( CRestore &restore );
float m_checkAttackTime; static TYPEDESCRIPTION m_SaveData[];
BOOL m_lastAttackCheck;
BOOL m_fGunDrawn;
float m_painTime;
float m_checkAttackTime;
BOOL m_lastAttackCheck;
// UNDONE: What is this for? It isn't used? // UNDONE: What is this for? It isn't used?
float m_flPlayerDamage;// how much pain has the player inflicted on me? float m_flPlayerDamage;// how much pain has the player inflicted on me?
CUSTOM_SCHEDULES CUSTOM_SCHEDULES
}; };
LINK_ENTITY_TO_CLASS( monster_barney, CBarney ) LINK_ENTITY_TO_CLASS( monster_barney, CBarney )
TYPEDESCRIPTION CBarney::m_SaveData[] = TYPEDESCRIPTION CBarney::m_SaveData[] =
{ {
DEFINE_FIELD( CBarney, m_fGunDrawn, FIELD_BOOLEAN ), DEFINE_FIELD( CBarney, m_fGunDrawn, FIELD_BOOLEAN ),
DEFINE_FIELD( CBarney, m_painTime, FIELD_TIME ), DEFINE_FIELD( CBarney, m_painTime, FIELD_TIME ),
@ -104,20 +104,20 @@ IMPLEMENT_SAVERESTORE( CBarney, CTalkMonster )
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================
Task_t tlBaFollow[] = Task_t tlBaFollow[] =
{ {
{ TASK_MOVE_TO_TARGET_RANGE,(float)128 }, // Move within 128 of target ent (client) { TASK_MOVE_TO_TARGET_RANGE, (float)128 }, // Move within 128 of target ent (client)
{ TASK_SET_SCHEDULE, (float)SCHED_TARGET_FACE }, { TASK_SET_SCHEDULE, (float)SCHED_TARGET_FACE },
}; };
Schedule_t slBaFollow[] = Schedule_t slBaFollow[] =
{ {
{ {
tlBaFollow, tlBaFollow,
ARRAYSIZE ( tlBaFollow ), ARRAYSIZE( tlBaFollow ),
bits_COND_NEW_ENEMY | bits_COND_NEW_ENEMY |
bits_COND_LIGHT_DAMAGE | bits_COND_LIGHT_DAMAGE |
bits_COND_HEAVY_DAMAGE | bits_COND_HEAVY_DAMAGE |
bits_COND_HEAR_SOUND | bits_COND_HEAR_SOUND |
bits_COND_PROVOKED, bits_COND_PROVOKED,
bits_SOUND_DANGER, bits_SOUND_DANGER,
@ -126,44 +126,44 @@ Schedule_t slBaFollow[] =
}; };
//========================================================= //=========================================================
// BarneyDraw- much better looking draw schedule for when // BarneyDraw - much better looking draw schedule for when
// barney knows who he's gonna attack. // barney knows who he's gonna attack.
//========================================================= //=========================================================
Task_t tlBarneyEnemyDraw[] = Task_t tlBarneyEnemyDraw[] =
{ {
{ TASK_STOP_MOVING, 0 }, { TASK_STOP_MOVING, 0 },
{ TASK_FACE_ENEMY, 0 }, { TASK_FACE_ENEMY, 0 },
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float) ACT_ARM }, { TASK_PLAY_SEQUENCE_FACE_ENEMY, (float) ACT_ARM },
}; };
Schedule_t slBarneyEnemyDraw[] = Schedule_t slBarneyEnemyDraw[] =
{ {
{ {
tlBarneyEnemyDraw, tlBarneyEnemyDraw,
ARRAYSIZE ( tlBarneyEnemyDraw ), ARRAYSIZE( tlBarneyEnemyDraw ),
0, 0,
0, 0,
"Barney Enemy Draw" "Barney Enemy Draw"
} }
}; };
Task_t tlBaFaceTarget[] = Task_t tlBaFaceTarget[] =
{ {
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, { TASK_SET_ACTIVITY, (float)ACT_IDLE },
{ TASK_FACE_TARGET, (float)0 }, { TASK_FACE_TARGET, (float)0 },
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, { TASK_SET_ACTIVITY, (float)ACT_IDLE },
{ TASK_SET_SCHEDULE, (float)SCHED_TARGET_CHASE }, { TASK_SET_SCHEDULE, (float)SCHED_TARGET_CHASE },
}; };
Schedule_t slBaFaceTarget[] = Schedule_t slBaFaceTarget[] =
{ {
{ {
tlBaFaceTarget, tlBaFaceTarget,
ARRAYSIZE ( tlBaFaceTarget ), ARRAYSIZE( tlBaFaceTarget ),
bits_COND_CLIENT_PUSH | bits_COND_CLIENT_PUSH |
bits_COND_NEW_ENEMY | bits_COND_NEW_ENEMY |
bits_COND_LIGHT_DAMAGE | bits_COND_LIGHT_DAMAGE |
bits_COND_HEAVY_DAMAGE | bits_COND_HEAVY_DAMAGE |
bits_COND_HEAR_SOUND | bits_COND_HEAR_SOUND |
bits_COND_PROVOKED, bits_COND_PROVOKED,
bits_SOUND_DANGER, bits_SOUND_DANGER,
@ -171,33 +171,31 @@ Schedule_t slBaFaceTarget[] =
}, },
}; };
Task_t tlIdleBaStand[] = Task_t tlIdleBaStand[] =
{ {
{ TASK_STOP_MOVING, 0 }, { TASK_STOP_MOVING, 0 },
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, { TASK_SET_ACTIVITY, (float)ACT_IDLE },
{ TASK_WAIT, (float)2 }, // repick IDLESTAND every two seconds. { TASK_WAIT, (float)2 }, // repick IDLESTAND every two seconds.
{ TASK_TLK_HEADRESET, (float)0 }, // reset head position { TASK_TLK_HEADRESET, (float)0 }, // reset head position
}; };
Schedule_t slIdleBaStand[] = Schedule_t slIdleBaStand[] =
{ {
{ {
tlIdleBaStand, tlIdleBaStand,
ARRAYSIZE ( tlIdleBaStand ), ARRAYSIZE( tlIdleBaStand ),
bits_COND_NEW_ENEMY | bits_COND_NEW_ENEMY |
bits_COND_LIGHT_DAMAGE | bits_COND_LIGHT_DAMAGE |
bits_COND_HEAVY_DAMAGE | bits_COND_HEAVY_DAMAGE |
bits_COND_HEAR_SOUND | bits_COND_HEAR_SOUND |
bits_COND_SMELL | bits_COND_SMELL |
bits_COND_PROVOKED, bits_COND_PROVOKED,
bits_SOUND_COMBAT |// sound flags - change these, and you'll break the talking code.
bits_SOUND_COMBAT |// sound flags - change these, and you'll break the talking code. //bits_SOUND_PLAYER |
//bits_SOUND_PLAYER | //bits_SOUND_WORLD |
//bits_SOUND_WORLD | bits_SOUND_DANGER |
bits_SOUND_MEAT |// scents
bits_SOUND_DANGER | bits_SOUND_CARCASS |
bits_SOUND_MEAT |// scents
bits_SOUND_CARCASS |
bits_SOUND_GARBAGE, bits_SOUND_GARBAGE,
"IdleStand" "IdleStand"
}, },
@ -213,17 +211,17 @@ DEFINE_CUSTOM_SCHEDULES( CBarney )
IMPLEMENT_CUSTOM_SCHEDULES( CBarney, CTalkMonster ) IMPLEMENT_CUSTOM_SCHEDULES( CBarney, CTalkMonster )
void CBarney :: StartTask( Task_t *pTask ) void CBarney::StartTask( Task_t *pTask )
{ {
CTalkMonster::StartTask( pTask ); CTalkMonster::StartTask( pTask );
} }
void CBarney :: RunTask( Task_t *pTask ) void CBarney::RunTask( Task_t *pTask )
{ {
switch ( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_RANGE_ATTACK1: case TASK_RANGE_ATTACK1:
if (m_hEnemy != NULL && (m_hEnemy->IsPlayer())) if( m_hEnemy != NULL && ( m_hEnemy->IsPlayer() ) )
{ {
pev->framerate = 1.5; pev->framerate = 1.5;
} }
@ -239,14 +237,14 @@ void CBarney :: RunTask( Task_t *pTask )
// ISoundMask - returns a bit mask indicating which types // ISoundMask - returns a bit mask indicating which types
// of sounds this monster regards. // of sounds this monster regards.
//========================================================= //=========================================================
int CBarney :: ISoundMask ( void) int CBarney::ISoundMask( void)
{ {
return bits_SOUND_WORLD | return bits_SOUND_WORLD |
bits_SOUND_COMBAT | bits_SOUND_COMBAT |
bits_SOUND_CARCASS | bits_SOUND_CARCASS |
bits_SOUND_MEAT | bits_SOUND_MEAT |
bits_SOUND_GARBAGE | bits_SOUND_GARBAGE |
bits_SOUND_DANGER | bits_SOUND_DANGER |
bits_SOUND_PLAYER; bits_SOUND_PLAYER;
} }
@ -254,21 +252,21 @@ int CBarney :: ISoundMask ( void)
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CBarney :: Classify ( void ) int CBarney::Classify( void )
{ {
return CLASS_PLAYER_ALLY; return CLASS_PLAYER_ALLY;
} }
//========================================================= //=========================================================
// ALertSound - barney says "Freeze!" // ALertSound - barney says "Freeze!"
//========================================================= //=========================================================
void CBarney :: AlertSound( void ) void CBarney::AlertSound( void )
{ {
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
if ( FOkToSpeak() ) if( FOkToSpeak() )
{ {
PlaySentence( "BA_ATTACK", RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_IDLE ); PlaySentence( "BA_ATTACK", RANDOM_FLOAT( 2.8, 3.2 ), VOL_NORM, ATTN_IDLE );
} }
} }
} }
@ -277,7 +275,7 @@ void CBarney :: AlertSound( void )
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CBarney :: SetYawSpeed ( void ) void CBarney::SetYawSpeed( void )
{ {
int ys; int ys;
@ -305,20 +303,20 @@ void CBarney :: SetYawSpeed ( void )
//========================================================= //=========================================================
// CheckRangeAttack1 // CheckRangeAttack1
//========================================================= //=========================================================
BOOL CBarney :: CheckRangeAttack1 ( float flDot, float flDist ) BOOL CBarney::CheckRangeAttack1( float flDot, float flDist )
{ {
if ( flDist <= 1024 && flDot >= 0.5 ) if( flDist <= 1024 && flDot >= 0.5 )
{ {
if ( gpGlobals->time > m_checkAttackTime ) if( gpGlobals->time > m_checkAttackTime )
{ {
TraceResult tr; TraceResult tr;
Vector shootOrigin = pev->origin + Vector( 0, 0, 55 ); Vector shootOrigin = pev->origin + Vector( 0, 0, 55 );
CBaseEntity *pEnemy = m_hEnemy; CBaseEntity *pEnemy = m_hEnemy;
Vector shootTarget = ( (pEnemy->BodyTarget( shootOrigin ) - pEnemy->pev->origin) + m_vecEnemyLKP ); Vector shootTarget = ( ( pEnemy->BodyTarget( shootOrigin ) - pEnemy->pev->origin ) + m_vecEnemyLKP );
UTIL_TraceLine( shootOrigin, shootTarget, dont_ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( shootOrigin, shootTarget, dont_ignore_monsters, ENT( pev ), &tr );
m_checkAttackTime = gpGlobals->time + 1; m_checkAttackTime = gpGlobals->time + 1;
if ( tr.flFraction == 1.0 || (tr.pHit != NULL && CBaseEntity::Instance(tr.pHit) == pEnemy) ) if( tr.flFraction == 1.0 || ( tr.pHit != NULL && CBaseEntity::Instance( tr.pHit ) == pEnemy ) )
m_lastAttackCheck = TRUE; m_lastAttackCheck = TRUE;
else else
m_lastAttackCheck = FALSE; m_lastAttackCheck = FALSE;
@ -333,11 +331,11 @@ BOOL CBarney :: CheckRangeAttack1 ( float flDot, float flDist )
// BarneyFirePistol - shoots one round from the pistol at // BarneyFirePistol - shoots one round from the pistol at
// the enemy barney is facing. // the enemy barney is facing.
//========================================================= //=========================================================
void CBarney :: BarneyFirePistol ( void ) void CBarney::BarneyFirePistol( void )
{ {
Vector vecShootOrigin; Vector vecShootOrigin;
UTIL_MakeVectors(pev->angles); UTIL_MakeVectors( pev->angles );
vecShootOrigin = pev->origin + Vector( 0, 0, 55 ); vecShootOrigin = pev->origin + Vector( 0, 0, 55 );
Vector vecShootDir = ShootAtEnemy( vecShootOrigin ); Vector vecShootDir = ShootAtEnemy( vecShootOrigin );
@ -345,49 +343,46 @@ void CBarney :: BarneyFirePistol ( void )
SetBlending( 0, angDir.x ); SetBlending( 0, angDir.x );
pev->effects = EF_MUZZLEFLASH; pev->effects = EF_MUZZLEFLASH;
FireBullets(1, vecShootOrigin, vecShootDir, VECTOR_CONE_2DEGREES, 1024, BULLET_MONSTER_9MM ); FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_2DEGREES, 1024, BULLET_MONSTER_9MM );
int pitchShift = RANDOM_LONG( 0, 20 ); int pitchShift = RANDOM_LONG( 0, 20 );
// Only shift about half the time // Only shift about half the time
if ( pitchShift > 10 ) if( pitchShift > 10 )
pitchShift = 0; pitchShift = 0;
else else
pitchShift -= 5; pitchShift -= 5;
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "barney/ba_attack2.wav", 1, ATTN_NORM, 0, 100 + pitchShift ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "barney/ba_attack2.wav", 1, ATTN_NORM, 0, 100 + pitchShift );
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, 384, 0.3 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, 384, 0.3 );
// UNDONE: Reload? // UNDONE: Reload?
m_cAmmoLoaded--;// take away a bullet! m_cAmmoLoaded--;// take away a bullet!
} }
//========================================================= //=========================================================
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
// //
// Returns number of events handled, 0 if none. // Returns number of events handled, 0 if none.
//========================================================= //=========================================================
void CBarney :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CBarney::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
case BARNEY_AE_SHOOT: case BARNEY_AE_SHOOT:
BarneyFirePistol(); BarneyFirePistol();
break; break;
case BARNEY_AE_DRAW: case BARNEY_AE_DRAW:
// barney's bodygroup switches here so he can pull gun from holster // barney's bodygroup switches here so he can pull gun from holster
pev->body = BARNEY_BODY_GUNDRAWN; pev->body = BARNEY_BODY_GUNDRAWN;
m_fGunDrawn = TRUE; m_fGunDrawn = TRUE;
break; break;
case BARNEY_AE_HOLSTER: case BARNEY_AE_HOLSTER:
// change bodygroup to replace gun in holster // change bodygroup to replace gun in holster
pev->body = BARNEY_BODY_GUNHOLSTERED; pev->body = BARNEY_BODY_GUNHOLSTERED;
m_fGunDrawn = FALSE; m_fGunDrawn = FALSE;
break; break;
default: default:
CTalkMonster::HandleAnimEvent( pEvent ); CTalkMonster::HandleAnimEvent( pEvent );
} }
@ -396,25 +391,25 @@ void CBarney :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CBarney :: Spawn() void CBarney::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/barney.mdl"); SET_MODEL( ENT( pev ), "models/barney.mdl" );
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->health = gSkillData.barneyHealth; pev->health = gSkillData.barneyHealth;
pev->view_ofs = Vector ( 0, 0, 50 );// position of the eyes relative to monster's origin. pev->view_ofs = Vector ( 0, 0, 50 );// position of the eyes relative to monster's origin.
m_flFieldOfView = VIEW_FIELD_WIDE; // NOTE: we need a wide field of view so npc will notice player and say hello m_flFieldOfView = VIEW_FIELD_WIDE; // NOTE: we need a wide field of view so npc will notice player and say hello
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
pev->body = 0; // gun in holster pev->body = 0; // gun in holster
m_fGunDrawn = FALSE; m_fGunDrawn = FALSE;
m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP; m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP;
MonsterInit(); MonsterInit();
SetUse( &CTalkMonster::FollowerUse ); SetUse( &CTalkMonster::FollowerUse );
@ -423,21 +418,21 @@ void CBarney :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CBarney :: Precache() void CBarney::Precache()
{ {
PRECACHE_MODEL("models/barney.mdl"); PRECACHE_MODEL( "models/barney.mdl" );
PRECACHE_SOUND("barney/ba_attack1.wav" ); PRECACHE_SOUND( "barney/ba_attack1.wav" );
PRECACHE_SOUND("barney/ba_attack2.wav" ); PRECACHE_SOUND( "barney/ba_attack2.wav" );
PRECACHE_SOUND("barney/ba_pain1.wav"); PRECACHE_SOUND( "barney/ba_pain1.wav" );
PRECACHE_SOUND("barney/ba_pain2.wav"); PRECACHE_SOUND( "barney/ba_pain2.wav" );
PRECACHE_SOUND("barney/ba_pain3.wav"); PRECACHE_SOUND( "barney/ba_pain3.wav" );
PRECACHE_SOUND( "barney/ba_die1.wav" );
PRECACHE_SOUND( "barney/ba_die2.wav" );
PRECACHE_SOUND( "barney/ba_die3.wav" );
PRECACHE_SOUND("barney/ba_die1.wav");
PRECACHE_SOUND("barney/ba_die2.wav");
PRECACHE_SOUND("barney/ba_die3.wav");
// every new barney must call this, otherwise // every new barney must call this, otherwise
// when a level is loaded, nobody will talk (time is reset to 0) // when a level is loaded, nobody will talk (time is reset to 0)
TalkInit(); TalkInit();
@ -445,35 +440,34 @@ void CBarney :: Precache()
} }
// Init talk data // Init talk data
void CBarney :: TalkInit() void CBarney::TalkInit()
{ {
CTalkMonster::TalkInit(); CTalkMonster::TalkInit();
// scientists speach group names (group names are in sentences.txt) // scientists speach group names (group names are in sentences.txt)
m_szGrp[TLK_ANSWER] = "BA_ANSWER";
m_szGrp[TLK_ANSWER] = "BA_ANSWER";
m_szGrp[TLK_QUESTION] = "BA_QUESTION"; m_szGrp[TLK_QUESTION] = "BA_QUESTION";
m_szGrp[TLK_IDLE] = "BA_IDLE"; m_szGrp[TLK_IDLE] = "BA_IDLE";
m_szGrp[TLK_STARE] = "BA_STARE"; m_szGrp[TLK_STARE] = "BA_STARE";
m_szGrp[TLK_USE] = "BA_OK"; m_szGrp[TLK_USE] = "BA_OK";
m_szGrp[TLK_UNUSE] = "BA_WAIT"; m_szGrp[TLK_UNUSE] = "BA_WAIT";
m_szGrp[TLK_STOP] = "BA_STOP"; m_szGrp[TLK_STOP] = "BA_STOP";
m_szGrp[TLK_NOSHOOT] = "BA_SCARED"; m_szGrp[TLK_NOSHOOT] = "BA_SCARED";
m_szGrp[TLK_HELLO] = "BA_HELLO"; m_szGrp[TLK_HELLO] = "BA_HELLO";
m_szGrp[TLK_PLHURT1] = "!BA_CUREA"; m_szGrp[TLK_PLHURT1] = "!BA_CUREA";
m_szGrp[TLK_PLHURT2] = "!BA_CUREB"; m_szGrp[TLK_PLHURT2] = "!BA_CUREB";
m_szGrp[TLK_PLHURT3] = "!BA_CUREC"; m_szGrp[TLK_PLHURT3] = "!BA_CUREC";
m_szGrp[TLK_PHELLO] = NULL; //"BA_PHELLO"; // UNDONE m_szGrp[TLK_PHELLO] = NULL; //"BA_PHELLO"; // UNDONE
m_szGrp[TLK_PIDLE] = NULL; //"BA_PIDLE"; // UNDONE m_szGrp[TLK_PIDLE] = NULL; //"BA_PIDLE"; // UNDONE
m_szGrp[TLK_PQUESTION] = "BA_PQUEST"; // UNDONE m_szGrp[TLK_PQUESTION] = "BA_PQUEST"; // UNDONE
m_szGrp[TLK_SMELL] = "BA_SMELL"; m_szGrp[TLK_SMELL] = "BA_SMELL";
m_szGrp[TLK_WOUND] = "BA_WOUND"; m_szGrp[TLK_WOUND] = "BA_WOUND";
m_szGrp[TLK_MORTAL] = "BA_MORTAL"; m_szGrp[TLK_MORTAL] = "BA_MORTAL";
// get voice for head - just one barney voice for now // get voice for head - just one barney voice for now
m_voicePitch = 100; m_voicePitch = 100;
@ -481,7 +475,7 @@ void CBarney :: TalkInit()
static BOOL IsFacing( entvars_t *pevTest, const Vector &reference ) static BOOL IsFacing( entvars_t *pevTest, const Vector &reference )
{ {
Vector vecDir = (reference - pevTest->origin); Vector vecDir = reference - pevTest->origin;
vecDir.z = 0; vecDir.z = 0;
vecDir = vecDir.Normalize(); vecDir = vecDir.Normalize();
Vector forward, angle; Vector forward, angle;
@ -490,30 +484,30 @@ static BOOL IsFacing( entvars_t *pevTest, const Vector &reference )
UTIL_MakeVectorsPrivate( angle, forward, NULL, NULL ); UTIL_MakeVectorsPrivate( angle, forward, NULL, NULL );
// He's facing me, he meant it // He's facing me, he meant it
if ( DotProduct( forward, vecDir ) > 0.96 ) // +/- 15 degrees or so if( DotProduct( forward, vecDir ) > 0.96 ) // +/- 15 degrees or so
{ {
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
int CBarney :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType) int CBarney::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
// make sure friends talk about it if player hurts talkmonsters... // make sure friends talk about it if player hurts talkmonsters...
int ret = CTalkMonster::TakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType); int ret = CTalkMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
if ( !IsAlive() || pev->deadflag == DEAD_DYING ) if( !IsAlive() || pev->deadflag == DEAD_DYING )
return ret; return ret;
if ( m_MonsterState != MONSTERSTATE_PRONE && (pevAttacker->flags & FL_CLIENT) ) if( m_MonsterState != MONSTERSTATE_PRONE && ( pevAttacker->flags & FL_CLIENT ) )
{ {
m_flPlayerDamage += flDamage; m_flPlayerDamage += flDamage;
// This is a heurstic to determine if the player intended to harm me // This is a heurstic to determine if the player intended to harm me
// If I have an enemy, we can't establish intent (may just be crossfire) // If I have an enemy, we can't establish intent (may just be crossfire)
if ( m_hEnemy == NULL ) if( m_hEnemy == NULL )
{ {
// If the player was facing directly at me, or I'm already suspicious, get mad // If the player was facing directly at me, or I'm already suspicious, get mad
if ( (m_afMemory & bits_MEMORY_SUSPICIOUS) || IsFacing( pevAttacker, pev->origin ) ) if( ( m_afMemory & bits_MEMORY_SUSPICIOUS ) || IsFacing( pevAttacker, pev->origin ) )
{ {
// Alright, now I'm pissed! // Alright, now I'm pissed!
PlaySentence( "BA_MAD", 4, VOL_NORM, ATTN_NORM ); PlaySentence( "BA_MAD", 4, VOL_NORM, ATTN_NORM );
@ -528,7 +522,7 @@ int CBarney :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, floa
Remember( bits_MEMORY_SUSPICIOUS ); Remember( bits_MEMORY_SUSPICIOUS );
} }
} }
else if ( !(m_hEnemy->IsPlayer()) && pev->deadflag == DEAD_NO ) else if( !( m_hEnemy->IsPlayer()) && pev->deadflag == DEAD_NO )
{ {
PlaySentence( "BA_SHOT", 4, VOL_NORM, ATTN_NORM ); PlaySentence( "BA_SHOT", 4, VOL_NORM, ATTN_NORM );
} }
@ -536,55 +530,66 @@ int CBarney :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, floa
return ret; return ret;
} }
//========================================================= //=========================================================
// PainSound // PainSound
//========================================================= //=========================================================
void CBarney :: PainSound ( void ) void CBarney::PainSound( void )
{ {
if (gpGlobals->time < m_painTime) if( gpGlobals->time < m_painTime )
return; return;
m_painTime = gpGlobals->time + RANDOM_FLOAT(0.5, 0.75);
switch (RANDOM_LONG(0,2)) m_painTime = gpGlobals->time + RANDOM_FLOAT( 0.5, 0.75 );
switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_pain1.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; case 0:
case 1: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_pain2.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_pain1.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
case 2: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_pain3.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; break;
case 1:
EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_pain2.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
break;
case 2:
EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_pain3.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
break;
} }
} }
//========================================================= //=========================================================
// DeathSound // DeathSound
//========================================================= //=========================================================
void CBarney :: DeathSound ( void ) void CBarney::DeathSound( void )
{ {
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_die1.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; case 0:
case 1: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_die2.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_die1.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
case 2: EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "barney/ba_die3.wav", 1, ATTN_NORM, 0, GetVoicePitch()); break; break;
case 1:
EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_die2.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
break;
case 2:
EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "barney/ba_die3.wav", 1, ATTN_NORM, 0, GetVoicePitch() );
break;
} }
} }
void CBarney::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
void CBarney::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
{ {
switch( ptr->iHitgroup) switch( ptr->iHitgroup )
{ {
case HITGROUP_CHEST: case HITGROUP_CHEST:
case HITGROUP_STOMACH: case HITGROUP_STOMACH:
if (bitsDamageType & (DMG_BULLET | DMG_SLASH | DMG_BLAST)) if (bitsDamageType & ( DMG_BULLET | DMG_SLASH | DMG_BLAST ) )
{ {
flDamage = flDamage / 2; flDamage = flDamage / 2;
} }
break; break;
case 10: case 10:
if (bitsDamageType & (DMG_BULLET | DMG_SLASH | DMG_CLUB)) if( bitsDamageType & ( DMG_BULLET | DMG_SLASH | DMG_CLUB ) )
{ {
flDamage -= 20; flDamage -= 20;
if (flDamage <= 0) if( flDamage <= 0 )
{ {
UTIL_Ricochet( ptr->vecEndPos, 1.0 ); UTIL_Ricochet( ptr->vecEndPos, 1.0 );
flDamage = 0.01; flDamage = 0.01;
@ -601,7 +606,7 @@ void CBarney::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir
void CBarney::Killed( entvars_t *pevAttacker, int iGib ) void CBarney::Killed( entvars_t *pevAttacker, int iGib )
{ {
if ( pev->body < BARNEY_BODY_GUNGONE ) if( pev->body < BARNEY_BODY_GUNGONE )
{ {
// drop the gun! // drop the gun!
Vector vecGunPos; Vector vecGunPos;
@ -610,7 +615,7 @@ void CBarney::Killed( entvars_t *pevAttacker, int iGib )
pev->body = BARNEY_BODY_GUNGONE; pev->body = BARNEY_BODY_GUNGONE;
GetAttachment( 0, vecGunPos, vecGunAngles ); GetAttachment( 0, vecGunPos, vecGunAngles );
CBaseEntity *pGun = DropItem( "weapon_9mmhandgun", vecGunPos, vecGunAngles ); CBaseEntity *pGun = DropItem( "weapon_9mmhandgun", vecGunPos, vecGunAngles );
} }
@ -621,41 +626,37 @@ void CBarney::Killed( entvars_t *pevAttacker, int iGib )
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================
Schedule_t *CBarney::GetScheduleOfType( int Type )
Schedule_t* CBarney :: GetScheduleOfType ( int Type )
{ {
Schedule_t *psched; Schedule_t *psched;
switch( Type ) switch( Type )
{ {
case SCHED_ARM_WEAPON: case SCHED_ARM_WEAPON:
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
// face enemy, then draw. // face enemy, then draw.
return slBarneyEnemyDraw; return slBarneyEnemyDraw;
} }
break; break;
// Hook these to make a looping schedule // Hook these to make a looping schedule
case SCHED_TARGET_FACE: case SCHED_TARGET_FACE:
// call base class default so that barney will talk // call base class default so that barney will talk
// when 'used' // when 'used'
psched = CTalkMonster::GetScheduleOfType(Type); psched = CTalkMonster::GetScheduleOfType( Type );
if (psched == slIdleStand) if( psched == slIdleStand )
return slBaFaceTarget; // override this for different target face behavior return slBaFaceTarget; // override this for different target face behavior
else else
return psched; return psched;
case SCHED_TARGET_CHASE: case SCHED_TARGET_CHASE:
return slBaFollow; return slBaFollow;
case SCHED_IDLE_STAND: case SCHED_IDLE_STAND:
// call base class default so that scientist will talk // call base class default so that scientist will talk
// when standing during idle // when standing during idle
psched = CTalkMonster::GetScheduleOfType(Type); psched = CTalkMonster::GetScheduleOfType( Type );
if (psched == slIdleStand) if( psched == slIdleStand )
{ {
// just look straight ahead. // just look straight ahead.
return slIdleBaStand; return slIdleBaStand;
@ -673,18 +674,18 @@ Schedule_t* CBarney :: GetScheduleOfType ( int Type )
// monster's member function to get a pointer to a schedule // monster's member function to get a pointer to a schedule
// of the proper type. // of the proper type.
//========================================================= //=========================================================
Schedule_t *CBarney :: GetSchedule ( void ) Schedule_t *CBarney::GetSchedule( void )
{ {
if ( HasConditions( bits_COND_HEAR_SOUND ) ) if( HasConditions( bits_COND_HEAR_SOUND ) )
{ {
CSound *pSound; CSound *pSound;
pSound = PBestSound(); pSound = PBestSound();
ASSERT( pSound != NULL ); ASSERT( pSound != NULL );
if ( pSound && (pSound->m_iType & bits_SOUND_DANGER) ) if( pSound && (pSound->m_iType & bits_SOUND_DANGER) )
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_BEST_SOUND ); return GetScheduleOfType( SCHED_TAKE_COVER_FROM_BEST_SOUND );
} }
if ( HasConditions( bits_COND_ENEMY_DEAD ) && FOkToSpeak() ) if( HasConditions( bits_COND_ENEMY_DEAD ) && FOkToSpeak() )
{ {
PlaySentence( "BA_KILL", 4, VOL_NORM, ATTN_NORM ); PlaySentence( "BA_KILL", 4, VOL_NORM, ATTN_NORM );
} }
@ -694,36 +695,35 @@ Schedule_t *CBarney :: GetSchedule ( void )
case MONSTERSTATE_COMBAT: case MONSTERSTATE_COMBAT:
{ {
// dead enemy // dead enemy
if ( HasConditions( bits_COND_ENEMY_DEAD ) ) if( HasConditions( bits_COND_ENEMY_DEAD ) )
{ {
// call base class, all code to handle dead enemies is centralized there. // call base class, all code to handle dead enemies is centralized there.
return CBaseMonster :: GetSchedule(); return CBaseMonster::GetSchedule();
} }
// always act surprized with a new enemy // always act surprized with a new enemy
if ( HasConditions( bits_COND_NEW_ENEMY ) && HasConditions( bits_COND_LIGHT_DAMAGE) ) if( HasConditions( bits_COND_NEW_ENEMY ) && HasConditions( bits_COND_LIGHT_DAMAGE ) )
return GetScheduleOfType( SCHED_SMALL_FLINCH ); return GetScheduleOfType( SCHED_SMALL_FLINCH );
// wait for one schedule to draw gun // wait for one schedule to draw gun
if (!m_fGunDrawn ) if( !m_fGunDrawn )
return GetScheduleOfType( SCHED_ARM_WEAPON ); return GetScheduleOfType( SCHED_ARM_WEAPON );
if ( HasConditions( bits_COND_HEAVY_DAMAGE ) ) if( HasConditions( bits_COND_HEAVY_DAMAGE ) )
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY ); return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
} }
break; break;
case MONSTERSTATE_ALERT: case MONSTERSTATE_ALERT:
case MONSTERSTATE_IDLE: case MONSTERSTATE_IDLE:
if ( HasConditions(bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE)) if( HasConditions( bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE ) )
{ {
// flinch if hurt // flinch if hurt
return GetScheduleOfType( SCHED_SMALL_FLINCH ); return GetScheduleOfType( SCHED_SMALL_FLINCH );
} }
if ( m_hEnemy == NULL && IsFollowing() ) if( m_hEnemy == NULL && IsFollowing() )
{ {
if ( !m_hTargetEnt->IsAlive() ) if( !m_hTargetEnt->IsAlive() )
{ {
// UNDONE: Comment about the recently dead player here? // UNDONE: Comment about the recently dead player here?
StopFollowing( FALSE ); StopFollowing( FALSE );
@ -731,7 +731,7 @@ Schedule_t *CBarney :: GetSchedule ( void )
} }
else else
{ {
if ( HasConditions( bits_COND_CLIENT_PUSH ) ) if( HasConditions( bits_COND_CLIENT_PUSH ) )
{ {
return GetScheduleOfType( SCHED_MOVE_AWAY_FOLLOW ); return GetScheduleOfType( SCHED_MOVE_AWAY_FOLLOW );
} }
@ -739,7 +739,7 @@ Schedule_t *CBarney :: GetSchedule ( void )
} }
} }
if ( HasConditions( bits_COND_CLIENT_PUSH ) ) if( HasConditions( bits_COND_CLIENT_PUSH ) )
{ {
return GetScheduleOfType( SCHED_MOVE_AWAY ); return GetScheduleOfType( SCHED_MOVE_AWAY );
} }
@ -750,11 +750,11 @@ Schedule_t *CBarney :: GetSchedule ( void )
default: default:
break; break;
} }
return CTalkMonster::GetSchedule(); return CTalkMonster::GetSchedule();
} }
MONSTERSTATE CBarney :: GetIdealState ( void ) MONSTERSTATE CBarney::GetIdealState( void )
{ {
return CTalkMonster::GetIdealState(); return CTalkMonster::GetIdealState();
} }
@ -778,11 +778,11 @@ class CDeadBarney : public CBaseMonster
{ {
public: public:
void Spawn( void ); void Spawn( void );
int Classify ( void ) { return CLASS_PLAYER_ALLY; } int Classify( void ) { return CLASS_PLAYER_ALLY; }
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
int m_iPose;// which sequence to display -- temporary, don't need to save int m_iPose;// which sequence to display -- temporary, don't need to save
static char *m_szPoses[3]; static char *m_szPoses[3];
}; };
@ -790,12 +790,12 @@ char *CDeadBarney::m_szPoses[] = { "lying_on_back", "lying_on_side", "lying_on_s
void CDeadBarney::KeyValue( KeyValueData *pkvd ) void CDeadBarney::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "pose")) if( FStrEq( pkvd->szKeyName, "pose" ) )
{ {
m_iPose = atoi(pkvd->szValue); m_iPose = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
CBaseMonster::KeyValue( pkvd ); CBaseMonster::KeyValue( pkvd );
} }
@ -804,23 +804,23 @@ LINK_ENTITY_TO_CLASS( monster_barney_dead, CDeadBarney )
//========================================================= //=========================================================
// ********** DeadBarney SPAWN ********** // ********** DeadBarney SPAWN **********
//========================================================= //=========================================================
void CDeadBarney :: Spawn( ) void CDeadBarney::Spawn()
{ {
PRECACHE_MODEL("models/barney.mdl"); PRECACHE_MODEL( "models/barney.mdl" );
SET_MODEL(ENT(pev), "models/barney.mdl"); SET_MODEL( ENT( pev ), "models/barney.mdl" );
pev->effects = 0; pev->effects = 0;
pev->yaw_speed = 8; pev->yaw_speed = 8;
pev->sequence = 0; pev->sequence = 0;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->sequence = LookupSequence( m_szPoses[m_iPose] ); pev->sequence = LookupSequence( m_szPoses[m_iPose] );
if (pev->sequence == -1) if( pev->sequence == -1 )
{ {
ALERT ( at_console, "Dead barney with bad pose\n" ); ALERT( at_console, "Dead barney with bad pose\n" );
} }
// Corpses have less health // Corpses have less health
pev->health = 8;//gSkillData.barneyHealth; pev->health = 8;//gSkillData.barneyHealth;
MonsterInitDead(); MonsterInitDead();
} }

View File

@ -22,314 +22,310 @@
class CBaseMonster : public CBaseToggle class CBaseMonster : public CBaseToggle
{ {
private: private:
int m_afConditions; int m_afConditions;
public: public:
typedef enum typedef enum
{ {
SCRIPT_PLAYING = 0, // Playing the sequence SCRIPT_PLAYING = 0, // Playing the sequence
SCRIPT_WAIT, // Waiting on everyone in the script to be ready SCRIPT_WAIT, // Waiting on everyone in the script to be ready
SCRIPT_CLEANUP, // Cancelling the script / cleaning up SCRIPT_CLEANUP, // Cancelling the script / cleaning up
SCRIPT_WALK_TO_MARK, SCRIPT_WALK_TO_MARK,
SCRIPT_RUN_TO_MARK SCRIPT_RUN_TO_MARK
} SCRIPTSTATE; } SCRIPTSTATE;
// these fields have been added in the process of reworking the state machine. (sjb)
EHANDLE m_hEnemy; // the entity that the monster is fighting.
EHANDLE m_hTargetEnt; // the entity that the monster is trying to reach
EHANDLE m_hOldEnemy[MAX_OLD_ENEMIES];
Vector m_vecOldEnemy[MAX_OLD_ENEMIES];
float m_flFieldOfView;// width of monster's field of view ( dot product )
// these fields have been added in the process of reworking the state machine. (sjb) float m_flWaitFinished;// if we're told to wait, this is the time that the wait will be over.
EHANDLE m_hEnemy; // the entity that the monster is fighting. float m_flMoveWaitFinished;
EHANDLE m_hTargetEnt; // the entity that the monster is trying to reach
EHANDLE m_hOldEnemy[ MAX_OLD_ENEMIES ];
Vector m_vecOldEnemy[ MAX_OLD_ENEMIES ];
float m_flFieldOfView;// width of monster's field of view ( dot product ) Activity m_Activity;// what the monster is doing (animation)
float m_flWaitFinished;// if we're told to wait, this is the time that the wait will be over. Activity m_IdealActivity;// monster should switch to this activity
float m_flMoveWaitFinished;
Activity m_Activity;// what the monster is doing (animation) int m_LastHitGroup; // the last body region that took damage
Activity m_IdealActivity;// monster should switch to this activity
int m_LastHitGroup; // the last body region that took damage
MONSTERSTATE m_MonsterState;// monster's current state
MONSTERSTATE m_IdealMonsterState;// monster should change to this state
int m_iTaskStatus;
Schedule_t *m_pSchedule;
int m_iScheduleIndex;
WayPoint_t m_Route[ ROUTE_SIZE ]; // Positions of movement MONSTERSTATE m_MonsterState;// monster's current state
int m_movementGoal; // Goal that defines route MONSTERSTATE m_IdealMonsterState;// monster should change to this state
int m_iRouteIndex; // index into m_Route[]
float m_moveWaitTime; // How long I should wait for something to move
Vector m_vecMoveGoal; // kept around for node graph moves, so we know our ultimate goal int m_iTaskStatus;
Activity m_movementActivity; // When moving, set this activity Schedule_t *m_pSchedule;
int m_iScheduleIndex;
int m_iAudibleList; // first index of a linked list of sounds that the monster can hear. WayPoint_t m_Route[ROUTE_SIZE]; // Positions of movement
int m_afSoundTypes; int m_movementGoal; // Goal that defines route
int m_iRouteIndex; // index into m_Route[]
float m_moveWaitTime; // How long I should wait for something to move
Vector m_vecLastPosition;// monster sometimes wants to return to where it started after an operation. Vector m_vecMoveGoal; // kept around for node graph moves, so we know our ultimate goal
Activity m_movementActivity; // When moving, set this activity
int m_iHintNode; // this is the hint node that the monster is moving towards or performing active idle on. int m_iAudibleList; // first index of a linked list of sounds that the monster can hear.
int m_afSoundTypes;
int m_afMemory; Vector m_vecLastPosition;// monster sometimes wants to return to where it started after an operation.
int m_iMaxHealth;// keeps track of monster's maximum health value (for re-healing, etc) int m_iHintNode; // this is the hint node that the monster is moving towards or performing active idle on.
Vector m_vecEnemyLKP;// last known position of enemy. (enemy's origin) int m_afMemory;
int m_cAmmoLoaded; // how much ammo is in the weapon (used to trigger reload anim sequences) int m_iMaxHealth;// keeps track of monster's maximum health value (for re-healing, etc)
int m_afCapability;// tells us what a monster can/can't do. Vector m_vecEnemyLKP;// last known position of enemy. (enemy's origin)
float m_flNextAttack; // cannot attack again until this time int m_cAmmoLoaded; // how much ammo is in the weapon (used to trigger reload anim sequences)
int m_bitsDamageType; // what types of damage has monster (player) taken int m_afCapability;// tells us what a monster can/can't do.
BYTE m_rgbTimeBasedDamage[CDMG_TIMEBASED];
int m_lastDamageAmount;// how much damage did monster (player) last take float m_flNextAttack; // cannot attack again until this time
// time based damage counters, decr. 1 per 2 seconds
int m_bloodColor; // color of blood particless
int m_failSchedule; // Schedule type to choose if current schedule fails int m_bitsDamageType; // what types of damage has monster (player) taken
BYTE m_rgbTimeBasedDamage[CDMG_TIMEBASED];
float m_flHungryTime;// set this is a future time to stop the monster from eating for a while. int m_lastDamageAmount;// how much damage did monster (player) last take
// time based damage counters, decr. 1 per 2 seconds
int m_bloodColor; // color of blood particless
float m_flDistTooFar; // if enemy farther away than this, bits_COND_ENEMY_TOOFAR set in CheckEnemy int m_failSchedule; // Schedule type to choose if current schedule fails
float m_flDistLook; // distance monster sees (Default 2048)
int m_iTriggerCondition;// for scripted AI, this is the condition that will cause the activation of the monster's TriggerTarget float m_flHungryTime;// set this is a future time to stop the monster from eating for a while.
string_t m_iszTriggerTarget;// name of target that should be fired.
Vector m_HackedGunPos; // HACK until we can query end of gun float m_flDistTooFar; // if enemy farther away than this, bits_COND_ENEMY_TOOFAR set in CheckEnemy
float m_flDistLook; // distance monster sees (Default 2048)
int m_iTriggerCondition;// for scripted AI, this is the condition that will cause the activation of the monster's TriggerTarget
string_t m_iszTriggerTarget;// name of target that should be fired.
Vector m_HackedGunPos; // HACK until we can query end of gun
// Scripted sequence Info // Scripted sequence Info
SCRIPTSTATE m_scriptState; // internal cinematic state SCRIPTSTATE m_scriptState; // internal cinematic state
CCineMonster *m_pCine; CCineMonster *m_pCine;
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static TYPEDESCRIPTION m_SaveData[];
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
// monster use function // monster use function
void EXPORT MonsterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT MonsterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void EXPORT CorpseUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT CorpseUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
// overrideable Monster member functions // overrideable Monster member functions
virtual int BloodColor( void ) { return m_bloodColor; }
virtual int BloodColor( void ) { return m_bloodColor; }
virtual CBaseMonster *MyMonsterPointer( void ) { return this; } virtual CBaseMonster *MyMonsterPointer( void ) { return this; }
virtual void Look ( int iDistance );// basic sight function for monsters virtual void Look( int iDistance );// basic sight function for monsters
virtual void RunAI ( void );// core ai function! virtual void RunAI( void );// core ai function!
void Listen ( void ); void Listen( void );
virtual BOOL IsAlive( void ) { return (pev->deadflag != DEAD_DEAD); } virtual BOOL IsAlive( void ) { return ( pev->deadflag != DEAD_DEAD ); }
virtual BOOL ShouldFadeOnDeath( void ); virtual BOOL ShouldFadeOnDeath( void );
// Basic Monster AI functions // Basic Monster AI functions
virtual float ChangeYaw ( int speed ); virtual float ChangeYaw( int speed );
float VecToYaw( Vector vecDir ); float VecToYaw( Vector vecDir );
float FlYawDiff ( void ); float FlYawDiff( void );
float DamageForce( float damage ); float DamageForce( float damage );
// stuff written for new state machine // stuff written for new state machine
virtual void MonsterThink( void ); virtual void MonsterThink( void );
void EXPORT CallMonsterThink( void ) { this->MonsterThink(); } void EXPORT CallMonsterThink( void ) { this->MonsterThink(); }
virtual int IRelationship ( CBaseEntity *pTarget ); virtual int IRelationship( CBaseEntity *pTarget );
virtual void MonsterInit ( void ); virtual void MonsterInit( void );
virtual void MonsterInitDead( void ); // Call after animation/pose is set up virtual void MonsterInitDead( void ); // Call after animation/pose is set up
virtual void BecomeDead( void ); virtual void BecomeDead( void );
void EXPORT CorpseFallThink( void ); void EXPORT CorpseFallThink( void );
void EXPORT MonsterInitThink ( void ); void EXPORT MonsterInitThink( void );
virtual void StartMonster ( void ); virtual void StartMonster( void );
virtual CBaseEntity* BestVisibleEnemy ( void );// finds best visible enemy for attack virtual CBaseEntity *BestVisibleEnemy( void );// finds best visible enemy for attack
virtual BOOL FInViewCone ( CBaseEntity *pEntity );// see if pEntity is in monster's view cone virtual BOOL FInViewCone( CBaseEntity *pEntity );// see if pEntity is in monster's view cone
virtual BOOL FInViewCone ( Vector *pOrigin );// see if given location is in monster's view cone virtual BOOL FInViewCone( Vector *pOrigin );// see if given location is in monster's view cone
virtual void HandleAnimEvent( MonsterEvent_t *pEvent ); virtual void HandleAnimEvent( MonsterEvent_t *pEvent );
virtual int CheckLocalMove ( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist );// check validity of a straight move through space virtual int CheckLocalMove ( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist );// check validity of a straight move through space
virtual void Move( float flInterval = 0.1 ); virtual void Move( float flInterval = 0.1 );
virtual void MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval ); virtual void MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval );
virtual BOOL ShouldAdvanceRoute( float flWaypointDist ); virtual BOOL ShouldAdvanceRoute( float flWaypointDist );
virtual Activity GetStoppedActivity( void ) { return ACT_IDLE; } virtual Activity GetStoppedActivity( void ) { return ACT_IDLE; }
virtual void Stop( void ) { m_IdealActivity = GetStoppedActivity(); } virtual void Stop( void ) { m_IdealActivity = GetStoppedActivity(); }
// This will stop animation until you call ResetSequenceInfo() at some point in the future // This will stop animation until you call ResetSequenceInfo() at some point in the future
inline void StopAnimation( void ) { pev->framerate = 0; } inline void StopAnimation( void ) { pev->framerate = 0; }
// these functions will survey conditions and set appropriate conditions bits for attack types. // these functions will survey conditions and set appropriate conditions bits for attack types.
virtual BOOL CheckRangeAttack1( float flDot, float flDist ); virtual BOOL CheckRangeAttack1( float flDot, float flDist );
virtual BOOL CheckRangeAttack2( float flDot, float flDist ); virtual BOOL CheckRangeAttack2( float flDot, float flDist );
virtual BOOL CheckMeleeAttack1( float flDot, float flDist ); virtual BOOL CheckMeleeAttack1( float flDot, float flDist );
virtual BOOL CheckMeleeAttack2( float flDot, float flDist ); virtual BOOL CheckMeleeAttack2( float flDot, float flDist );
BOOL FHaveSchedule( void ); BOOL FHaveSchedule( void );
BOOL FScheduleValid ( void ); BOOL FScheduleValid( void );
void ClearSchedule( void ); void ClearSchedule( void );
BOOL FScheduleDone ( void ); BOOL FScheduleDone( void );
void ChangeSchedule ( Schedule_t *pNewSchedule ); void ChangeSchedule( Schedule_t *pNewSchedule );
void NextScheduledTask ( void ); void NextScheduledTask( void );
Schedule_t *ScheduleInList( const char *pName, Schedule_t **pList, int listCount ); Schedule_t *ScheduleInList( const char *pName, Schedule_t **pList, int listCount );
virtual Schedule_t *ScheduleFromName( const char *pName ); virtual Schedule_t *ScheduleFromName( const char *pName );
static Schedule_t *m_scheduleList[]; static Schedule_t *m_scheduleList[];
void MaintainSchedule ( void );
virtual void StartTask ( Task_t *pTask );
virtual void RunTask ( Task_t *pTask );
virtual Schedule_t *GetScheduleOfType( int Type );
virtual Schedule_t *GetSchedule( void );
virtual void ScheduleChange( void ) {}
// virtual int CanPlaySequence( void ) { return ((m_pCine == NULL) && (m_MonsterState == MONSTERSTATE_NONE || m_MonsterState == MONSTERSTATE_IDLE || m_IdealMonsterState == MONSTERSTATE_IDLE)); }
virtual int CanPlaySequence( BOOL fDisregardState, int interruptLevel );
virtual int CanPlaySentence( BOOL fDisregardState ) { return IsAlive(); }
virtual void PlaySentence( const char *pszSentence, float duration, float volume, float attenuation );
virtual void PlayScriptedSentence( const char *pszSentence, float duration, float volume, float attenuation, BOOL bConcurrent, CBaseEntity *pListener );
virtual void SentenceStop( void ); void MaintainSchedule( void );
virtual void StartTask( Task_t *pTask );
virtual void RunTask( Task_t *pTask );
virtual Schedule_t *GetScheduleOfType( int Type );
virtual Schedule_t *GetSchedule( void );
virtual void ScheduleChange( void ) {}
// virtual int CanPlaySequence( void ) { return ((m_pCine == NULL) && (m_MonsterState == MONSTERSTATE_NONE || m_MonsterState == MONSTERSTATE_IDLE || m_IdealMonsterState == MONSTERSTATE_IDLE)); }
virtual int CanPlaySequence( BOOL fDisregardState, int interruptLevel );
virtual int CanPlaySentence( BOOL fDisregardState ) { return IsAlive(); }
virtual void PlaySentence( const char *pszSentence, float duration, float volume, float attenuation );
virtual void PlayScriptedSentence( const char *pszSentence, float duration, float volume, float attenuation, BOOL bConcurrent, CBaseEntity *pListener );
Task_t *GetTask ( void ); virtual void SentenceStop( void );
virtual MONSTERSTATE GetIdealState ( void );
virtual void SetActivity ( Activity NewActivity );
void SetSequenceByName ( char *szSequence );
void SetState ( MONSTERSTATE State );
virtual void ReportAIState( void );
void CheckAttacks ( CBaseEntity *pTarget, float flDist ); Task_t *GetTask( void );
virtual int CheckEnemy ( CBaseEntity *pEnemy ); virtual MONSTERSTATE GetIdealState( void );
void PushEnemy( CBaseEntity *pEnemy, Vector &vecLastKnownPos ); virtual void SetActivity( Activity NewActivity );
BOOL PopEnemy( void ); void SetSequenceByName( char *szSequence );
void SetState( MONSTERSTATE State );
virtual void ReportAIState( void );
BOOL FGetNodeRoute ( Vector vecDest ); void CheckAttacks( CBaseEntity *pTarget, float flDist );
virtual int CheckEnemy( CBaseEntity *pEnemy );
inline void TaskComplete( void ) { if ( !HasConditions(bits_COND_TASK_FAILED) ) m_iTaskStatus = TASKSTATUS_COMPLETE; } void PushEnemy( CBaseEntity *pEnemy, Vector &vecLastKnownPos );
void MovementComplete( void ); BOOL PopEnemy( void );
inline void TaskFail( void ) { SetConditions(bits_COND_TASK_FAILED); }
inline void TaskBegin( void ) { m_iTaskStatus = TASKSTATUS_RUNNING; }
int TaskIsRunning( void );
inline int TaskIsComplete( void ) { return (m_iTaskStatus == TASKSTATUS_COMPLETE); }
inline int MovementIsComplete( void ) { return (m_movementGoal == MOVEGOAL_NONE); }
int IScheduleFlags ( void ); BOOL FGetNodeRoute( Vector vecDest );
BOOL FRefreshRoute( void );
BOOL FRouteClear ( void ); inline void TaskComplete( void ) { if ( !HasConditions( bits_COND_TASK_FAILED ) ) m_iTaskStatus = TASKSTATUS_COMPLETE; }
void RouteSimplify( CBaseEntity *pTargetEnt ); void MovementComplete( void );
void AdvanceRoute ( float distance ); inline void TaskFail( void ) { SetConditions( bits_COND_TASK_FAILED ); }
virtual BOOL FTriangulate ( const Vector &vecStart , const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex ); inline void TaskBegin( void ) { m_iTaskStatus = TASKSTATUS_RUNNING; }
void MakeIdealYaw( Vector vecTarget ); int TaskIsRunning( void );
virtual void SetYawSpeed ( void ) { return; };// allows different yaw_speeds for each activity inline int TaskIsComplete( void ) { return ( m_iTaskStatus == TASKSTATUS_COMPLETE ); }
BOOL BuildRoute ( const Vector &vecGoal, int iMoveFlag, CBaseEntity *pTarget ); inline int MovementIsComplete( void ) { return ( m_movementGoal == MOVEGOAL_NONE ); }
virtual BOOL BuildNearestRoute ( Vector vecThreat, Vector vecViewOffset, float flMinDist, float flMaxDist );
int RouteClassify( int iMoveFlag );
void InsertWaypoint ( Vector vecLocation, int afMoveFlags );
BOOL FindLateralCover ( const Vector &vecThreat, const Vector &vecViewOffset );
virtual BOOL FindCover ( Vector vecThreat, Vector vecViewOffset, float flMinDist, float flMaxDist );
virtual BOOL FValidateCover ( const Vector &vecCoverLocation ) { return TRUE; };
virtual float CoverRadius( void ) { return 784; } // Default cover radius
virtual BOOL FCanCheckAttacks ( void ); int IScheduleFlags( void );
virtual void CheckAmmo( void ) { return; }; BOOL FRefreshRoute( void );
virtual int IgnoreConditions ( void ); BOOL FRouteClear( void );
void RouteSimplify( CBaseEntity *pTargetEnt );
inline void SetConditions( int iConditions ) { m_afConditions |= iConditions; } void AdvanceRoute( float distance );
inline void ClearConditions( int iConditions ) { m_afConditions &= ~iConditions; } virtual BOOL FTriangulate( const Vector &vecStart , const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex );
inline BOOL HasConditions( int iConditions ) { if ( m_afConditions & iConditions ) return TRUE; return FALSE; } void MakeIdealYaw( Vector vecTarget );
inline BOOL HasAllConditions( int iConditions ) { if ( (m_afConditions & iConditions) == iConditions ) return TRUE; return FALSE; } virtual void SetYawSpeed( void ) { return; };// allows different yaw_speeds for each activity
BOOL BuildRoute( const Vector &vecGoal, int iMoveFlag, CBaseEntity *pTarget );
virtual BOOL BuildNearestRoute( Vector vecThreat, Vector vecViewOffset, float flMinDist, float flMaxDist );
int RouteClassify( int iMoveFlag );
void InsertWaypoint( Vector vecLocation, int afMoveFlags );
virtual BOOL FValidateHintType( short sHint ); BOOL FindLateralCover( const Vector &vecThreat, const Vector &vecViewOffset );
int FindHintNode ( void ); virtual BOOL FindCover( Vector vecThreat, Vector vecViewOffset, float flMinDist, float flMaxDist );
virtual BOOL FCanActiveIdle ( void ); virtual BOOL FValidateCover( const Vector &vecCoverLocation ) { return TRUE; };
void SetTurnActivity ( void ); virtual float CoverRadius( void ) { return 784; } // Default cover radius
float FLSoundVolume ( CSound *pSound );
BOOL MoveToNode( Activity movementAct, float waitTime, const Vector &goal ); virtual BOOL FCanCheckAttacks( void );
BOOL MoveToTarget( Activity movementAct, float waitTime ); virtual void CheckAmmo( void ) { return; };
BOOL MoveToLocation( Activity movementAct, float waitTime, const Vector &goal ); virtual int IgnoreConditions( void );
BOOL MoveToEnemy( Activity movementAct, float waitTime );
// Returns the time when the door will be open inline void SetConditions( int iConditions ) { m_afConditions |= iConditions; }
float OpenDoorAndWait( entvars_t *pevDoor ); inline void ClearConditions( int iConditions ) { m_afConditions &= ~iConditions; }
inline BOOL HasConditions( int iConditions ) { if ( m_afConditions & iConditions ) return TRUE; return FALSE; }
inline BOOL HasAllConditions( int iConditions ) { if ( (m_afConditions & iConditions) == iConditions ) return TRUE; return FALSE; }
virtual int ISoundMask( void ); virtual BOOL FValidateHintType( short sHint );
virtual CSound* PBestSound ( void ); int FindHintNode( void );
virtual CSound* PBestScent ( void ); virtual BOOL FCanActiveIdle( void );
virtual float HearingSensitivity( void ) { return 1.0; }; void SetTurnActivity( void );
float FLSoundVolume( CSound *pSound );
BOOL FBecomeProne ( void ); BOOL MoveToNode( Activity movementAct, float waitTime, const Vector &goal );
virtual void BarnacleVictimBitten( entvars_t *pevBarnacle ); BOOL MoveToTarget( Activity movementAct, float waitTime );
virtual void BarnacleVictimReleased( void ); BOOL MoveToLocation( Activity movementAct, float waitTime, const Vector &goal );
BOOL MoveToEnemy( Activity movementAct, float waitTime );
void SetEyePosition ( void ); // Returns the time when the door will be open
float OpenDoorAndWait( entvars_t *pevDoor );
BOOL FShouldEat( void );// see if a monster is 'hungry' virtual int ISoundMask( void );
void Eat ( float flFullDuration );// make the monster 'full' for a while. virtual CSound* PBestSound( void );
virtual CSound* PBestScent( void );
virtual float HearingSensitivity( void ) { return 1.0; };
CBaseEntity *CheckTraceHullAttack( float flDist, int iDamage, int iDmgType ); BOOL FBecomeProne( void );
BOOL FacingIdeal( void ); virtual void BarnacleVictimBitten( entvars_t *pevBarnacle );
virtual void BarnacleVictimReleased( void );
BOOL FCheckAITrigger( void );// checks and, if necessary, fires the monster's trigger target. void SetEyePosition( void );
BOOL NoFriendlyFire( void );
BOOL BBoxFlat( void ); BOOL FShouldEat( void );// see if a monster is 'hungry'
void Eat( float flFullDuration );// make the monster 'full' for a while.
// PrescheduleThink CBaseEntity *CheckTraceHullAttack( float flDist, int iDamage, int iDmgType );
virtual void PrescheduleThink( void ) { return; }; BOOL FacingIdeal( void );
BOOL GetEnemy ( void ); BOOL FCheckAITrigger( void );// checks and, if necessary, fires the monster's trigger target.
void MakeDamageBloodDecal ( int cCount, float flNoise, TraceResult *ptr, const Vector &vecDir ); BOOL NoFriendlyFire( void );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
BOOL BBoxFlat( void );
// PrescheduleThink
virtual void PrescheduleThink( void ) { return; };
BOOL GetEnemy( void );
void MakeDamageBloodDecal( int cCount, float flNoise, TraceResult *ptr, const Vector &vecDir );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
// combat functions // combat functions
float UpdateTarget ( entvars_t *pevTarget ); float UpdateTarget( entvars_t *pevTarget );
virtual Activity GetDeathActivity ( void ); virtual Activity GetDeathActivity( void );
Activity GetSmallFlinchActivity( void ); Activity GetSmallFlinchActivity( void );
virtual void Killed( entvars_t *pevAttacker, int iGib ); virtual void Killed( entvars_t *pevAttacker, int iGib );
virtual void GibMonster( void ); virtual void GibMonster( void );
BOOL ShouldGibMonster( int iGib ); BOOL ShouldGibMonster( int iGib );
void CallGibMonster( void ); void CallGibMonster( void );
virtual BOOL HasHumanGibs( void ); virtual BOOL HasHumanGibs( void );
virtual BOOL HasAlienGibs( void ); virtual BOOL HasAlienGibs( void );
virtual void FadeMonster( void ); // Called instead of GibMonster() when gibs are disabled virtual void FadeMonster( void ); // Called instead of GibMonster() when gibs are disabled
Vector ShootAtEnemy( const Vector &shootOrigin ); Vector ShootAtEnemy( const Vector &shootOrigin );
virtual Vector BodyTarget( const Vector &posSrc ) { return Center( ) * 0.75 + EyePosition() * 0.25; }; // position to shoot at virtual Vector BodyTarget( const Vector &posSrc ) { return Center() * 0.75 + EyePosition() * 0.25; }; // position to shoot at
virtual Vector GetGunPosition( void ); virtual Vector GetGunPosition( void );
virtual int TakeHealth( float flHealth, int bitsDamageType ); virtual int TakeHealth( float flHealth, int bitsDamageType );
virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType); virtual int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
int DeadTakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); int DeadTakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
void RadiusDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType ); void RadiusDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType );
void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType ); void RadiusDamage( Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType );
virtual int IsMoving( void ) { return m_movementGoal != MOVEGOAL_NONE; } virtual int IsMoving( void ) { return m_movementGoal != MOVEGOAL_NONE; }
void RouteClear( void ); void RouteClear( void );
void RouteNew( void ); void RouteNew( void );
virtual void DeathSound ( void ) { return; }; virtual void DeathSound( void ) { return; };
virtual void AlertSound ( void ) { return; }; virtual void AlertSound( void ) { return; };
virtual void IdleSound ( void ) { return; }; virtual void IdleSound( void ) { return; };
virtual void PainSound ( void ) { return; }; virtual void PainSound( void ) { return; };
virtual void StopFollowing( BOOL clearSchedule ) {} virtual void StopFollowing( BOOL clearSchedule ) {}
inline void Remember( int iMemory ) { m_afMemory |= iMemory; } inline void Remember( int iMemory ) { m_afMemory |= iMemory; }
inline void Forget( int iMemory ) { m_afMemory &= ~iMemory; } inline void Forget( int iMemory ) { m_afMemory &= ~iMemory; }
inline BOOL HasMemory( int iMemory ) { if ( m_afMemory & iMemory ) return TRUE; return FALSE; } inline BOOL HasMemory( int iMemory ) { if ( m_afMemory & iMemory ) return TRUE; return FALSE; }
inline BOOL HasAllMemories( int iMemory ) { if ( (m_afMemory & iMemory) == iMemory ) return TRUE; return FALSE; } inline BOOL HasAllMemories( int iMemory ) { if ( (m_afMemory & iMemory) == iMemory ) return TRUE; return FALSE; }
BOOL ExitScriptedSequence( ); BOOL ExitScriptedSequence();
BOOL CineCleanup( ); BOOL CineCleanup();
CBaseEntity* DropItem ( char *pszItemName, const Vector &vecPos, const Vector &vecAng );// drop an item. CBaseEntity* DropItem ( char *pszItemName, const Vector &vecPos, const Vector &vecAng );// drop an item.
}; };

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,7 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify ( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
void PainSound( void ); void PainSound( void );
@ -42,8 +42,8 @@ public:
void AttackSnd( void ); void AttackSnd( void );
// No range attacks // No range attacks
BOOL CheckRangeAttack1 ( float flDot, float flDist ) { return FALSE; } BOOL CheckRangeAttack1( float flDot, float flDist ) { return FALSE; }
BOOL CheckRangeAttack2 ( float flDot, float flDist ) { return FALSE; } BOOL CheckRangeAttack2( float flDot, float flDist ) { return FALSE; }
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
}; };
@ -53,46 +53,46 @@ LINK_ENTITY_TO_CLASS( monster_bloater, CBloater )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CBloater :: Classify ( void ) int CBloater::Classify( void )
{ {
return CLASS_ALIEN_MONSTER; return CLASS_ALIEN_MONSTER;
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CBloater :: SetYawSpeed ( void ) void CBloater::SetYawSpeed( void )
{ {
int ys; int ys;
ys = 120; ys = 120;
#if 0 #if 0
switch ( m_Activity ) switch( m_Activity )
{ {
} }
#endif #endif
pev->yaw_speed = ys; pev->yaw_speed = ys;
} }
int CBloater :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) int CBloater::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
PainSound(); PainSound();
return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType ); return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
} }
void CBloater :: PainSound( void ) void CBloater::PainSound( void )
{ {
#if 0 #if 0
int pitch = 95 + RANDOM_LONG(0,9); int pitch = 95 + RANDOM_LONG( 0, 9 );
switch (RANDOM_LONG(0,5)) switch( RANDOM_LONG( 0, 5 ) )
{ {
case 0: case 0:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_pain1.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_pain1.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 1: case 1:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_pain2.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_pain2.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
default: default:
break; break;
@ -100,58 +100,58 @@ void CBloater :: PainSound( void )
#endif #endif
} }
void CBloater :: AlertSound( void ) void CBloater::AlertSound( void )
{ {
#if 0 #if 0
int pitch = 95 + RANDOM_LONG(0,9); int pitch = 95 + RANDOM_LONG( 0, 9 );
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: case 0:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_alert10.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_alert10.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 1: case 1:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_alert20.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_alert20.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 2: case 2:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_alert30.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_alert30.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
} }
#endif #endif
} }
void CBloater :: IdleSound( void ) void CBloater::IdleSound( void )
{ {
#if 0 #if 0
int pitch = 95 + RANDOM_LONG(0,9); int pitch = 95 + RANDOM_LONG( 0, 9 );
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: case 0:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_idle1.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_idle1.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 1: case 1:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_idle2.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_idle2.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 2: case 2:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_idle3.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_idle3.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
} }
#endif #endif
} }
void CBloater :: AttackSnd( void ) void CBloater::AttackSnd( void )
{ {
#if 0 #if 0
int pitch = 95 + RANDOM_LONG(0,9); int pitch = 95 + RANDOM_LONG( 0, 9 );
switch (RANDOM_LONG(0,1)) switch( RANDOM_LONG( 0, 1 ) )
{ {
case 0: case 0:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_attack1.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_attack1.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
case 1: case 1:
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "zombie/zo_attack2.wav", 1.0, ATTN_NORM, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "zombie/zo_attack2.wav", 1.0, ATTN_NORM, 0, pitch );
break; break;
} }
#endif #endif
@ -161,7 +161,7 @@ void CBloater :: AttackSnd( void )
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
//========================================================= //=========================================================
void CBloater :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CBloater::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -171,7 +171,6 @@ void CBloater :: HandleAnimEvent( MonsterEvent_t *pEvent )
AttackSnd(); AttackSnd();
} }
break; break;
default: default:
CBaseMonster::HandleAnimEvent( pEvent ); CBaseMonster::HandleAnimEvent( pEvent );
break; break;
@ -181,21 +180,21 @@ void CBloater :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CBloater :: Spawn() void CBloater::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/floater.mdl"); SET_MODEL( ENT( pev ), "models/floater.mdl" );
UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->spawnflags |= FL_FLY; pev->spawnflags |= FL_FLY;
m_bloodColor = BLOOD_COLOR_GREEN; m_bloodColor = BLOOD_COLOR_GREEN;
pev->health = 40; pev->health = 40;
pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin.
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
MonsterInit(); MonsterInit();
} }
@ -203,12 +202,11 @@ void CBloater :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CBloater :: Precache() void CBloater::Precache()
{ {
PRECACHE_MODEL("models/floater.mdl"); PRECACHE_MODEL( "models/floater.mdl" );
} }
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -29,10 +29,10 @@ extern "C" void PM_Init ( struct playermove_s *ppmove );
extern "C" char PM_FindTextureType( char *name ); extern "C" char PM_FindTextureType( char *name );
extern Vector VecBModelOrigin( entvars_t* pevBModel ); extern Vector VecBModelOrigin( entvars_t* pevBModel );
extern DLL_GLOBAL Vector g_vecAttackDir; extern DLL_GLOBAL Vector g_vecAttackDir;
extern DLL_GLOBAL int g_iSkillLevel; extern DLL_GLOBAL int g_iSkillLevel;
static DLL_FUNCTIONS gFunctionTable = static DLL_FUNCTIONS gFunctionTable =
{ {
GameDLLInit, //pfnGameInit GameDLLInit, //pfnGameInit
DispatchSpawn, //pfnSpawn DispatchSpawn, //pfnSpawn
@ -80,7 +80,7 @@ static DLL_FUNCTIONS gFunctionTable =
PM_Move, //pfnPM_Move PM_Move, //pfnPM_Move
PM_Init, //pfnPM_Init Server version of player movement initialization PM_Init, //pfnPM_Init Server version of player movement initialization
PM_FindTextureType, //pfnPM_FindTextureType PM_FindTextureType, //pfnPM_FindTextureType
SetupVisibility, //pfnSetupVisibility Set up PVS and PAS for networking for this client SetupVisibility, //pfnSetupVisibility Set up PVS and PAS for networking for this client
UpdateClientData, //pfnUpdateClientData Set up data sent only to specific client UpdateClientData, //pfnUpdateClientData Set up data sent only to specific client
AddToFullPack, //pfnAddToFullPack AddToFullPack, //pfnAddToFullPack
@ -103,25 +103,25 @@ extern "C" {
#endif #endif
int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ) int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion )
{ {
if ( !pFunctionTable || interfaceVersion != INTERFACE_VERSION ) if( !pFunctionTable || interfaceVersion != INTERFACE_VERSION )
{ {
return FALSE; return FALSE;
} }
memcpy( pFunctionTable, &gFunctionTable, sizeof( DLL_FUNCTIONS ) ); memcpy( pFunctionTable, &gFunctionTable, sizeof(DLL_FUNCTIONS) );
return TRUE; return TRUE;
} }
int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ) int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion )
{ {
if ( !pFunctionTable || *interfaceVersion != INTERFACE_VERSION ) if( !pFunctionTable || *interfaceVersion != INTERFACE_VERSION )
{ {
// Tell engine what version we had, so it can figure out who is out of date. // Tell engine what version we had, so it can figure out who is out of date.
*interfaceVersion = INTERFACE_VERSION; *interfaceVersion = INTERFACE_VERSION;
return FALSE; return FALSE;
} }
memcpy( pFunctionTable, &gFunctionTable, sizeof( DLL_FUNCTIONS ) ); memcpy( pFunctionTable, &gFunctionTable, sizeof(DLL_FUNCTIONS) );
return TRUE; return TRUE;
} }
@ -131,40 +131,39 @@ int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion )
int DispatchSpawn( edict_t *pent ) int DispatchSpawn( edict_t *pent )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if (pEntity) if( pEntity )
{ {
// Initialize these or entities who don't link to the world won't have anything in here // Initialize these or entities who don't link to the world won't have anything in here
pEntity->pev->absmin = pEntity->pev->origin - Vector(1,1,1); pEntity->pev->absmin = pEntity->pev->origin - Vector( 1, 1, 1 );
pEntity->pev->absmax = pEntity->pev->origin + Vector(1,1,1); pEntity->pev->absmax = pEntity->pev->origin + Vector( 1, 1, 1 );
pEntity->Spawn(); pEntity->Spawn();
// Try to get the pointer again, in case the spawn function deleted the entity. // Try to get the pointer again, in case the spawn function deleted the entity.
// UNDONE: Spawn() should really return a code to ask that the entity be deleted, but // UNDONE: Spawn() should really return a code to ask that the entity be deleted, but
// that would touch too much code for me to do that right now. // that would touch too much code for me to do that right now.
pEntity = (CBaseEntity *)GET_PRIVATE(pent); pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if ( pEntity ) if( pEntity )
{ {
if ( g_pGameRules && !g_pGameRules->IsAllowedToSpawn( pEntity ) ) if( g_pGameRules && !g_pGameRules->IsAllowedToSpawn( pEntity ) )
return -1; // return that this entity should be deleted return -1; // return that this entity should be deleted
if ( pEntity->pev->flags & FL_KILLME ) if( pEntity->pev->flags & FL_KILLME )
return -1; return -1;
} }
// Handle global stuff here // Handle global stuff here
if ( pEntity && pEntity->pev->globalname ) if( pEntity && pEntity->pev->globalname )
{ {
const globalentity_t *pGlobal = gGlobalState.EntityFromTable( pEntity->pev->globalname ); const globalentity_t *pGlobal = gGlobalState.EntityFromTable( pEntity->pev->globalname );
if ( pGlobal ) if( pGlobal )
{ {
// Already dead? delete // Already dead? delete
if ( pGlobal->state == GLOBAL_DEAD ) if( pGlobal->state == GLOBAL_DEAD )
return -1; return -1;
else if ( !FStrEq( STRING(gpGlobals->mapname), pGlobal->levelName ) ) else if( !FStrEq( STRING( gpGlobals->mapname ), pGlobal->levelName ) )
pEntity->MakeDormant(); // Hasn't been moved to this level yet, wait but stay alive pEntity->MakeDormant(); // Hasn't been moved to this level yet, wait but stay alive
// In this level & not dead, continue on as normal // In this level & not dead, continue on as normal
} }
@ -172,7 +171,7 @@ int DispatchSpawn( edict_t *pent )
{ {
// Spawned entities default to 'On' // Spawned entities default to 'On'
gGlobalState.EntityAdd( pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON ); gGlobalState.EntityAdd( pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON );
// ALERT( at_console, "Added global entity %s (%s)\n", STRING(pEntity->pev->classname), STRING(pEntity->pev->globalname) ); //ALERT( at_console, "Added global entity %s (%s)\n", STRING( pEntity->pev->classname ), STRING( pEntity->pev->globalname ) );
} }
} }
@ -183,10 +182,10 @@ int DispatchSpawn( edict_t *pent )
void DispatchKeyValue( edict_t *pentKeyvalue, KeyValueData *pkvd ) void DispatchKeyValue( edict_t *pentKeyvalue, KeyValueData *pkvd )
{ {
if ( !pkvd || !pentKeyvalue ) if( !pkvd || !pentKeyvalue )
return; return;
EntvarsKeyvalue( VARS(pentKeyvalue), pkvd ); EntvarsKeyvalue( VARS( pentKeyvalue ), pkvd );
// If the key was an entity variable, or there's no class set yet, don't look for the object, it may // If the key was an entity variable, or there's no class set yet, don't look for the object, it may
// not exist yet. // not exist yet.
@ -194,9 +193,9 @@ void DispatchKeyValue( edict_t *pentKeyvalue, KeyValueData *pkvd )
return; return;
// Get the actualy entity object // Get the actualy entity object
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentKeyvalue); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pentKeyvalue );
if ( !pEntity ) if( !pEntity )
return; return;
pEntity->KeyValue( pkvd ); pEntity->KeyValue( pkvd );
@ -208,33 +207,33 @@ BOOL gTouchDisabled = FALSE;
void DispatchTouch( edict_t *pentTouched, edict_t *pentOther ) void DispatchTouch( edict_t *pentTouched, edict_t *pentOther )
{ {
if ( gTouchDisabled ) if( gTouchDisabled )
return; return;
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentTouched); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pentTouched );
CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther ); CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther );
if ( pEntity && pOther && ! ((pEntity->pev->flags | pOther->pev->flags) & FL_KILLME) ) if( pEntity && pOther && ! ( ( pEntity->pev->flags | pOther->pev->flags ) & FL_KILLME ) )
pEntity->Touch( pOther ); pEntity->Touch( pOther );
} }
void DispatchUse( edict_t *pentUsed, edict_t *pentOther ) void DispatchUse( edict_t *pentUsed, edict_t *pentOther )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pentUsed); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pentUsed );
CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE(pentOther); CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther );
if (pEntity && !(pEntity->pev->flags & FL_KILLME) ) if( pEntity && !( pEntity->pev->flags & FL_KILLME ) )
pEntity->Use( pOther, pOther, USE_TOGGLE, 0 ); pEntity->Use( pOther, pOther, USE_TOGGLE, 0 );
} }
void DispatchThink( edict_t *pent ) void DispatchThink( edict_t *pent )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if (pEntity) if( pEntity )
{ {
if ( FBitSet( pEntity->pev->flags, FL_DORMANT ) ) if( FBitSet( pEntity->pev->flags, FL_DORMANT ) )
ALERT( at_error, "Dormant entity %s is thinking!!\n", STRING(pEntity->pev->classname) ); ALERT( at_error, "Dormant entity %s is thinking!!\n", STRING( pEntity->pev->classname ) );
pEntity->Think(); pEntity->Think();
} }
} }
@ -244,26 +243,26 @@ void DispatchBlocked( edict_t *pentBlocked, edict_t *pentOther )
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pentBlocked ); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pentBlocked );
CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther ); CBaseEntity *pOther = (CBaseEntity *)GET_PRIVATE( pentOther );
if (pEntity) if( pEntity )
pEntity->Blocked( pOther ); pEntity->Blocked( pOther );
} }
void DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData ) void DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if ( pEntity && pSaveData )
{
ENTITYTABLE *pTable = &pSaveData->pTable[ pSaveData->currentIndex ];
if ( pTable->pent != pent ) if( pEntity && pSaveData )
{
ENTITYTABLE *pTable = &pSaveData->pTable[pSaveData->currentIndex];
if( pTable->pent != pent )
ALERT( at_error, "ENTITY TABLE OR INDEX IS WRONG!!!!\n" ); ALERT( at_error, "ENTITY TABLE OR INDEX IS WRONG!!!!\n" );
if ( pEntity->ObjectCaps() & FCAP_DONT_SAVE ) if( pEntity->ObjectCaps() & FCAP_DONT_SAVE )
return; return;
// These don't use ltime & nextthink as times really, but we'll fudge around it. // These don't use ltime & nextthink as times really, but we'll fudge around it.
if ( pEntity->pev->movetype == MOVETYPE_PUSH ) if( pEntity->pev->movetype == MOVETYPE_PUSH )
{ {
float delta = pEntity->pev->nextthink - pEntity->pev->ltime; float delta = pEntity->pev->nextthink - pEntity->pev->ltime;
pEntity->pev->ltime = gpGlobals->time; pEntity->pev->ltime = gpGlobals->time;
@ -284,13 +283,13 @@ void DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData )
// different classes with the same global name // different classes with the same global name
CBaseEntity *FindGlobalEntity( string_t classname, string_t globalname ) CBaseEntity *FindGlobalEntity( string_t classname, string_t globalname )
{ {
edict_t *pent = FIND_ENTITY_BY_STRING( NULL, "globalname", STRING(globalname) ); edict_t *pent = FIND_ENTITY_BY_STRING( NULL, "globalname", STRING( globalname ) );
CBaseEntity *pReturn = CBaseEntity::Instance( pent ); CBaseEntity *pReturn = CBaseEntity::Instance( pent );
if ( pReturn ) if( pReturn )
{ {
if ( !FClassnameIs( pReturn->pev, STRING(classname) ) ) if( !FClassnameIs( pReturn->pev, STRING( classname ) ) )
{ {
ALERT( at_console, "Global entity found %s, wrong class %s\n", STRING(globalname), STRING(pReturn->pev->classname) ); ALERT( at_console, "Global entity found %s, wrong class %s\n", STRING( globalname ), STRING( pReturn->pev->classname ) );
pReturn = NULL; pReturn = NULL;
} }
} }
@ -300,15 +299,15 @@ CBaseEntity *FindGlobalEntity( string_t classname, string_t globalname )
int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ) int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if ( pEntity && pSaveData ) if( pEntity && pSaveData )
{ {
entvars_t tmpVars; entvars_t tmpVars;
Vector oldOffset; Vector oldOffset;
CRestore restoreHelper( pSaveData ); CRestore restoreHelper( pSaveData );
if ( globalEntity ) if( globalEntity )
{ {
CRestore tmpRestore( pSaveData ); CRestore tmpRestore( pSaveData );
tmpRestore.PrecacheMode( 0 ); tmpRestore.PrecacheMode( 0 );
@ -320,23 +319,23 @@ int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity
// ------------------- // -------------------
const globalentity_t *pGlobal = gGlobalState.EntityFromTable( tmpVars.globalname ); const globalentity_t *pGlobal = gGlobalState.EntityFromTable( tmpVars.globalname );
// Don't overlay any instance of the global that isn't the latest // Don't overlay any instance of the global that isn't the latest
// pSaveData->szCurrentMapName is the level this entity is coming from // pSaveData->szCurrentMapName is the level this entity is coming from
// pGlobla->levelName is the last level the global entity was active in. // pGlobla->levelName is the last level the global entity was active in.
// If they aren't the same, then this global update is out of date. // If they aren't the same, then this global update is out of date.
if ( !FStrEq( pSaveData->szCurrentMapName, pGlobal->levelName ) ) if( !FStrEq( pSaveData->szCurrentMapName, pGlobal->levelName ) )
return 0; return 0;
// Compute the new global offset // Compute the new global offset
oldOffset = pSaveData->vecLandmarkOffset; oldOffset = pSaveData->vecLandmarkOffset;
CBaseEntity *pNewEntity = FindGlobalEntity( tmpVars.classname, tmpVars.globalname ); CBaseEntity *pNewEntity = FindGlobalEntity( tmpVars.classname, tmpVars.globalname );
if ( pNewEntity ) if( pNewEntity )
{ {
// ALERT( at_console, "Overlay %s with %s\n", STRING(pNewEntity->pev->classname), STRING(tmpVars.classname) ); //ALERT( at_console, "Overlay %s with %s\n", STRING( pNewEntity->pev->classname ), STRING( tmpVars.classname ) );
// Tell the restore code we're overlaying a global entity from another level // Tell the restore code we're overlaying a global entity from another level
restoreHelper.SetGlobalMode( 1 ); // Don't overwrite global fields restoreHelper.SetGlobalMode( 1 ); // Don't overwrite global fields
pSaveData->vecLandmarkOffset = (pSaveData->vecLandmarkOffset - pNewEntity->pev->mins) + tmpVars.mins; pSaveData->vecLandmarkOffset = ( pSaveData->vecLandmarkOffset - pNewEntity->pev->mins ) + tmpVars.mins;
pEntity = pNewEntity;// we're going to restore this data OVER the old entity pEntity = pNewEntity;// we're going to restore this data OVER the old entity
pent = ENT( pEntity->pev ); pent = ENT( pEntity->pev );
// Update the global table to say that the global definition of this entity should come from this level // Update the global table to say that the global definition of this entity should come from this level
@ -348,10 +347,9 @@ int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity
// or call EntityUpdate() to move it to this level, we haven't changed global state at all. // or call EntityUpdate() to move it to this level, we haven't changed global state at all.
return 0; return 0;
} }
} }
if ( pEntity->ObjectCaps() & FCAP_MUST_SPAWN ) if( pEntity->ObjectCaps() & FCAP_MUST_SPAWN )
{ {
pEntity->Restore( restoreHelper ); pEntity->Restore( restoreHelper );
pEntity->Spawn(); pEntity->Spawn();
@ -359,37 +357,37 @@ int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity
else else
{ {
pEntity->Restore( restoreHelper ); pEntity->Restore( restoreHelper );
pEntity->Precache( ); pEntity->Precache();
} }
// Again, could be deleted, get the pointer again. // Again, could be deleted, get the pointer again.
pEntity = (CBaseEntity *)GET_PRIVATE(pent); pEntity = (CBaseEntity *)GET_PRIVATE( pent );
#if 0 #if 0
if ( pEntity && pEntity->pev->globalname && globalEntity ) if( pEntity && pEntity->pev->globalname && globalEntity )
{ {
ALERT( at_console, "Global %s is %s\n", STRING(pEntity->pev->globalname), STRING(pEntity->pev->model) ); ALERT( at_console, "Global %s is %s\n", STRING( pEntity->pev->globalname ), STRING( pEntity->pev->model ) );
} }
#endif #endif
// Is this an overriding global entity (coming over the transition), or one restoring in a level // Is this an overriding global entity (coming over the transition), or one restoring in a level
if ( globalEntity ) if( globalEntity )
{ {
// ALERT( at_console, "After: %f %f %f %s\n", pEntity->pev->origin.x, pEntity->pev->origin.y, pEntity->pev->origin.z, STRING(pEntity->pev->model) ); //ALERT( at_console, "After: %f %f %f %s\n", pEntity->pev->origin.x, pEntity->pev->origin.y, pEntity->pev->origin.z, STRING( pEntity->pev->model ) );
pSaveData->vecLandmarkOffset = oldOffset; pSaveData->vecLandmarkOffset = oldOffset;
if ( pEntity ) if( pEntity )
{ {
UTIL_SetOrigin( pEntity->pev, pEntity->pev->origin ); UTIL_SetOrigin( pEntity->pev, pEntity->pev->origin );
pEntity->OverrideReset(); pEntity->OverrideReset();
} }
} }
else if ( pEntity && pEntity->pev->globalname ) else if( pEntity && pEntity->pev->globalname )
{ {
const globalentity_t *pGlobal = gGlobalState.EntityFromTable( pEntity->pev->globalname ); const globalentity_t *pGlobal = gGlobalState.EntityFromTable( pEntity->pev->globalname );
if ( pGlobal ) if( pGlobal )
{ {
// Already dead? delete // Already dead? delete
if ( pGlobal->state == GLOBAL_DEAD ) if( pGlobal->state == GLOBAL_DEAD )
return -1; return -1;
else if ( !FStrEq( STRING(gpGlobals->mapname), pGlobal->levelName ) ) else if( !FStrEq( STRING( gpGlobals->mapname ), pGlobal->levelName ) )
{ {
pEntity->MakeDormant(); // Hasn't been moved to this level yet, wait but stay alive pEntity->MakeDormant(); // Hasn't been moved to this level yet, wait but stay alive
} }
@ -397,7 +395,7 @@ int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity
} }
else else
{ {
ALERT( at_error, "Global Entity %s (%s) not in table!!!\n", STRING(pEntity->pev->globalname), STRING(pEntity->pev->classname) ); ALERT( at_error, "Global Entity %s (%s) not in table!!!\n", STRING( pEntity->pev->globalname ), STRING( pEntity->pev->classname ) );
// Spawned entities default to 'On' // Spawned entities default to 'On'
gGlobalState.EntityAdd( pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON ); gGlobalState.EntityAdd( pEntity->pev->globalname, gpGlobals->mapname, GLOBAL_ON );
} }
@ -408,8 +406,8 @@ int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity
void DispatchObjectCollsionBox( edict_t *pent ) void DispatchObjectCollsionBox( edict_t *pent )
{ {
CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEntity = (CBaseEntity *)GET_PRIVATE( pent );
if (pEntity) if( pEntity )
{ {
pEntity->SetObjectCollisionBox(); pEntity->SetObjectCollisionBox();
} }
@ -429,11 +427,11 @@ void SaveReadFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseD
restoreHelper.ReadFields( pname, pBaseData, pFields, fieldCount ); restoreHelper.ReadFields( pname, pBaseData, pFields, fieldCount );
} }
edict_t * EHANDLE::Get( void ) edict_t *EHANDLE::Get( void )
{ {
if (m_pent) if( m_pent )
{ {
if (m_pent->serialnumber == m_serialnumber) if( m_pent->serialnumber == m_serialnumber )
return m_pent; return m_pent;
else else
return NULL; return NULL;
@ -441,25 +439,25 @@ edict_t * EHANDLE::Get( void )
return NULL; return NULL;
} }
edict_t * EHANDLE::Set( edict_t *pent ) edict_t *EHANDLE::Set( edict_t *pent )
{ {
m_pent = pent; m_pent = pent;
if (pent) if( pent )
m_serialnumber = m_pent->serialnumber; m_serialnumber = m_pent->serialnumber;
return pent; return pent;
} }
EHANDLE :: operator CBaseEntity *() EHANDLE::operator CBaseEntity *()
{ {
return (CBaseEntity *)GET_PRIVATE( Get( ) ); return (CBaseEntity *)GET_PRIVATE( Get() );
} }
CBaseEntity * EHANDLE :: operator = (CBaseEntity *pEntity) CBaseEntity *EHANDLE::operator = ( CBaseEntity *pEntity )
{ {
if (pEntity) if( pEntity )
{ {
m_pent = ENT( pEntity->pev ); m_pent = ENT( pEntity->pev );
if (m_pent) if( m_pent )
m_serialnumber = m_pent->serialnumber; m_serialnumber = m_pent->serialnumber;
} }
else else
@ -470,29 +468,29 @@ CBaseEntity * EHANDLE :: operator = (CBaseEntity *pEntity)
return pEntity; return pEntity;
} }
EHANDLE :: operator int () EHANDLE::operator int ()
{ {
return Get() != NULL; return Get() != NULL;
} }
CBaseEntity * EHANDLE :: operator -> () CBaseEntity * EHANDLE::operator -> ()
{ {
return (CBaseEntity *)GET_PRIVATE( Get( ) ); return (CBaseEntity *)GET_PRIVATE( Get() );
} }
// give health // give health
int CBaseEntity :: TakeHealth( float flHealth, int bitsDamageType ) int CBaseEntity::TakeHealth( float flHealth, int bitsDamageType )
{ {
if (!pev->takedamage) if( !pev->takedamage )
return 0; return 0;
// heal // heal
if ( pev->health >= pev->max_health ) if( pev->health >= pev->max_health )
return 0; return 0;
pev->health += flHealth; pev->health += flHealth;
if (pev->health > pev->max_health) if( pev->health > pev->max_health )
pev->health = pev->max_health; pev->health = pev->max_health;
return 1; return 1;
@ -500,47 +498,47 @@ int CBaseEntity :: TakeHealth( float flHealth, int bitsDamageType )
// inflict damage on this entity. bitsDamageType indicates type of damage inflicted, ie: DMG_CRUSH // inflict damage on this entity. bitsDamageType indicates type of damage inflicted, ie: DMG_CRUSH
int CBaseEntity :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ) int CBaseEntity::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
Vector vecTemp; Vector vecTemp;
if (!pev->takedamage) if( !pev->takedamage )
return 0; return 0;
// UNDONE: some entity types may be immune or resistant to some bitsDamageType // UNDONE: some entity types may be immune or resistant to some bitsDamageType
// if Attacker == Inflictor, the attack was a melee or other instant-hit attack. // if Attacker == Inflictor, the attack was a melee or other instant-hit attack.
// (that is, no actual entity projectile was involved in the attack so use the shooter's origin). // (that is, no actual entity projectile was involved in the attack so use the shooter's origin).
if ( pevAttacker == pevInflictor ) if( pevAttacker == pevInflictor )
{ {
vecTemp = pevInflictor->origin - ( VecBModelOrigin(pev) ); vecTemp = pevInflictor->origin - VecBModelOrigin( pev );
} }
else else
// an actual missile was involved. // an actual missile was involved.
{ {
vecTemp = pevInflictor->origin - ( VecBModelOrigin(pev) ); vecTemp = pevInflictor->origin - VecBModelOrigin( pev );
} }
// this global is still used for glass and other non-monster killables, along with decals. // this global is still used for glass and other non-monster killables, along with decals.
g_vecAttackDir = vecTemp.Normalize(); g_vecAttackDir = vecTemp.Normalize();
// save damage based on the target's armor level // save damage based on the target's armor level
// figure momentum add (don't let hurt brushes or other triggers move player) // figure momentum add (don't let hurt brushes or other triggers move player)
if ((!FNullEnt(pevInflictor)) && (pev->movetype == MOVETYPE_WALK || pev->movetype == MOVETYPE_STEP) && (pevAttacker->solid != SOLID_TRIGGER) ) if( ( !FNullEnt( pevInflictor ) ) && (pev->movetype == MOVETYPE_WALK || pev->movetype == MOVETYPE_STEP ) && ( pevAttacker->solid != SOLID_TRIGGER ) )
{ {
Vector vecDir = pev->origin - (pevInflictor->absmin + pevInflictor->absmax) * 0.5; Vector vecDir = pev->origin - ( pevInflictor->absmin + pevInflictor->absmax ) * 0.5;
vecDir = vecDir.Normalize(); vecDir = vecDir.Normalize();
float flForce = flDamage * ((32 * 32 * 72.0) / (pev->size.x * pev->size.y * pev->size.z)) * 5; float flForce = flDamage * ( ( 32 * 32 * 72.0 ) / ( pev->size.x * pev->size.y * pev->size.z ) ) * 5;
if (flForce > 1000.0) if( flForce > 1000.0 )
flForce = 1000.0; flForce = 1000.0;
pev->velocity = pev->velocity + vecDir * flForce; pev->velocity = pev->velocity + vecDir * flForce;
} }
// do the damage // do the damage
pev->health -= flDamage; pev->health -= flDamage;
if (pev->health <= 0) if( pev->health <= 0 )
{ {
Killed( pevAttacker, GIB_NORMAL ); Killed( pevAttacker, GIB_NORMAL );
return 0; return 0;
@ -549,7 +547,7 @@ int CBaseEntity :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker,
return 1; return 1;
} }
void CBaseEntity :: Killed( entvars_t *pevAttacker, int iGib ) void CBaseEntity::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
pev->deadflag = DEAD_DEAD; pev->deadflag = DEAD_DEAD;
@ -558,17 +556,17 @@ void CBaseEntity :: Killed( entvars_t *pevAttacker, int iGib )
CBaseEntity *CBaseEntity::GetNextTarget( void ) CBaseEntity *CBaseEntity::GetNextTarget( void )
{ {
if ( FStringNull( pev->target ) ) if( FStringNull( pev->target ) )
return NULL; return NULL;
edict_t *pTarget = FIND_ENTITY_BY_TARGETNAME ( NULL, STRING(pev->target) ); edict_t *pTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) );
if ( FNullEnt(pTarget) ) if( FNullEnt( pTarget ) )
return NULL; return NULL;
return Instance( pTarget ); return Instance( pTarget );
} }
// Global Savedata for Delay // Global Savedata for Delay
TYPEDESCRIPTION CBaseEntity::m_SaveData[] = TYPEDESCRIPTION CBaseEntity::m_SaveData[] =
{ {
DEFINE_FIELD( CBaseEntity, m_pGoalEnt, FIELD_CLASSPTR ), DEFINE_FIELD( CBaseEntity, m_pGoalEnt, FIELD_CLASSPTR ),
@ -580,8 +578,8 @@ TYPEDESCRIPTION CBaseEntity::m_SaveData[] =
int CBaseEntity::Save( CSave &save ) int CBaseEntity::Save( CSave &save )
{ {
if ( save.WriteEntVars( "ENTVARS", pev ) ) if( save.WriteEntVars( "ENTVARS", pev ) )
return save.WriteFields( "BASE", this, m_SaveData, ARRAYSIZE(m_SaveData) ); return save.WriteFields( "BASE", this, m_SaveData, ARRAYSIZE( m_SaveData ) );
return 0; return 0;
} }
@ -591,18 +589,18 @@ int CBaseEntity::Restore( CRestore &restore )
int status; int status;
status = restore.ReadEntVars( "ENTVARS", pev ); status = restore.ReadEntVars( "ENTVARS", pev );
if ( status ) if( status )
status = restore.ReadFields( "BASE", this, m_SaveData, ARRAYSIZE(m_SaveData) ); status = restore.ReadFields( "BASE", this, m_SaveData, ARRAYSIZE( m_SaveData ) );
if ( pev->modelindex != 0 && !FStringNull(pev->model) ) if( pev->modelindex != 0 && !FStringNull( pev->model ) )
{ {
Vector mins, maxs; Vector mins, maxs;
mins = pev->mins; // Set model is about to destroy these mins = pev->mins; // Set model is about to destroy these
maxs = pev->maxs; maxs = pev->maxs;
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
SET_MODEL(ENT(pev), STRING(pev->model)); SET_MODEL( ENT( pev ), STRING( pev->model ) );
UTIL_SetSize(pev, mins, maxs); // Reset them UTIL_SetSize( pev, mins, maxs ); // Reset them
} }
return status; return status;
@ -611,26 +609,27 @@ int CBaseEntity::Restore( CRestore &restore )
// Initialize absmin & absmax to the appropriate box // Initialize absmin & absmax to the appropriate box
void SetObjectCollisionBox( entvars_t *pev ) void SetObjectCollisionBox( entvars_t *pev )
{ {
if ( (pev->solid == SOLID_BSP) && if( ( pev->solid == SOLID_BSP ) &&
(pev->angles.x || pev->angles.y|| pev->angles.z) ) ( pev->angles.x || pev->angles.y || pev->angles.z ) )
{ // expand for rotation {
float max, v; // expand for rotation
int i; float max, v;
int i;
max = 0; max = 0;
for (i=0 ; i<3 ; i++) for( i = 0; i < 3; i++ )
{ {
v = fabs( ((float *)pev->mins)[i]); v = fabs( ( (float *)pev->mins )[i] );
if (v > max) if( v > max )
max = v; max = v;
v = fabs( ((float *)pev->maxs)[i]); v = fabs( ( (float *)pev->maxs )[i] );
if (v > max) if( v > max )
max = v; max = v;
} }
for (i=0 ; i<3 ; i++) for( i = 0; i < 3; i++ )
{ {
((float *)pev->absmin)[i] = ((float *)pev->origin)[i] - max; ( (float *)pev->absmin )[i] = ( (float *)pev->origin )[i] - max;
((float *)pev->absmax)[i] = ((float *)pev->origin)[i] + max; ( (float *)pev->absmax )[i] = ( (float *)pev->origin )[i] + max;
} }
} }
else else
@ -652,19 +651,19 @@ void CBaseEntity::SetObjectCollisionBox( void )
::SetObjectCollisionBox( pev ); ::SetObjectCollisionBox( pev );
} }
int CBaseEntity :: Intersects( CBaseEntity *pOther ) int CBaseEntity::Intersects( CBaseEntity *pOther )
{ {
if ( pOther->pev->absmin.x > pev->absmax.x || if( pOther->pev->absmin.x > pev->absmax.x ||
pOther->pev->absmin.y > pev->absmax.y || pOther->pev->absmin.y > pev->absmax.y ||
pOther->pev->absmin.z > pev->absmax.z || pOther->pev->absmin.z > pev->absmax.z ||
pOther->pev->absmax.x < pev->absmin.x || pOther->pev->absmax.x < pev->absmin.x ||
pOther->pev->absmax.y < pev->absmin.y || pOther->pev->absmax.y < pev->absmin.y ||
pOther->pev->absmax.z < pev->absmin.z ) pOther->pev->absmax.z < pev->absmin.z )
return 0; return 0;
return 1; return 1;
} }
void CBaseEntity :: MakeDormant( void ) void CBaseEntity::MakeDormant( void )
{ {
SetBits( pev->flags, FL_DORMANT ); SetBits( pev->flags, FL_DORMANT );
@ -680,62 +679,73 @@ void CBaseEntity :: MakeDormant( void )
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
} }
int CBaseEntity :: IsDormant( void ) int CBaseEntity::IsDormant( void )
{ {
return FBitSet( pev->flags, FL_DORMANT ); return FBitSet( pev->flags, FL_DORMANT );
} }
BOOL CBaseEntity :: IsInWorld( void ) BOOL CBaseEntity::IsInWorld( void )
{ {
// position // position
if (pev->origin.x >= 4096) return FALSE; if( pev->origin.x >= 4096 )
if (pev->origin.y >= 4096) return FALSE; return FALSE;
if (pev->origin.z >= 4096) return FALSE; if( pev->origin.y >= 4096 )
if (pev->origin.x <= -4096) return FALSE; return FALSE;
if (pev->origin.y <= -4096) return FALSE; if( pev->origin.z >= 4096 )
if (pev->origin.z <= -4096) return FALSE; return FALSE;
if( pev->origin.x <= -4096 )
return FALSE;
if( pev->origin.y <= -4096 )
return FALSE;
if( pev->origin.z <= -4096 )
return FALSE;
// speed // speed
if (pev->velocity.x >= 2000) return FALSE; if( pev->velocity.x >= 2000 )
if (pev->velocity.y >= 2000) return FALSE; return FALSE;
if (pev->velocity.z >= 2000) return FALSE; if( pev->velocity.y >= 2000 )
if (pev->velocity.x <= -2000) return FALSE; return FALSE;
if (pev->velocity.y <= -2000) return FALSE; if( pev->velocity.z >= 2000 )
if (pev->velocity.z <= -2000) return FALSE; return FALSE;
if( pev->velocity.x <= -2000 )
return FALSE;
if( pev->velocity.y <= -2000 )
return FALSE;
if( pev->velocity.z <= -2000 )
return FALSE;
return TRUE; return TRUE;
} }
int CBaseEntity::ShouldToggle( USE_TYPE useType, BOOL currentState ) int CBaseEntity::ShouldToggle( USE_TYPE useType, BOOL currentState )
{ {
if ( useType != USE_TOGGLE && useType != USE_SET ) if( useType != USE_TOGGLE && useType != USE_SET )
{ {
if ( (currentState && useType == USE_ON) || (!currentState && useType == USE_OFF) ) if( ( currentState && useType == USE_ON ) || ( !currentState && useType == USE_OFF ) )
return 0; return 0;
} }
return 1; return 1;
} }
int CBaseEntity::DamageDecal( int bitsDamageType )
int CBaseEntity :: DamageDecal( int bitsDamageType )
{ {
if ( pev->rendermode == kRenderTransAlpha ) if( pev->rendermode == kRenderTransAlpha )
return -1; return -1;
if ( pev->rendermode != kRenderNormal ) if( pev->rendermode != kRenderNormal )
return DECAL_BPROOF1; return DECAL_BPROOF1;
return DECAL_GUNSHOT1 + RANDOM_LONG(0,4); return DECAL_GUNSHOT1 + RANDOM_LONG( 0, 4 );
} }
// NOTE: szName must be a pointer to constant memory, e.g. "monster_class" because the entity // NOTE: szName must be a pointer to constant memory, e.g. "monster_class" because the entity
// will keep a pointer to it after this call. // will keep a pointer to it after this call.
CBaseEntity * CBaseEntity::Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner ) CBaseEntity *CBaseEntity::Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner )
{ {
edict_t *pent; edict_t *pent;
CBaseEntity *pEntity; CBaseEntity *pEntity;
pent = CREATE_NAMED_ENTITY( MAKE_STRING( szName )); pent = CREATE_NAMED_ENTITY( MAKE_STRING( szName ) );
if ( FNullEnt( pent ) ) if( FNullEnt( pent ) )
{ {
ALERT ( at_console, "NULL Ent in Create!\n" ); ALERT ( at_console, "NULL Ent in Create!\n" );
return NULL; return NULL;

View File

@ -30,14 +30,14 @@ CBaseEntity
// These are caps bits to indicate what an object's capabilities (currently used for save/restore and level transitions) // These are caps bits to indicate what an object's capabilities (currently used for save/restore and level transitions)
#define FCAP_CUSTOMSAVE 0x00000001 #define FCAP_CUSTOMSAVE 0x00000001
#define FCAP_ACROSS_TRANSITION 0x00000002 // should transfer between transitions #define FCAP_ACROSS_TRANSITION 0x00000002 // should transfer between transitions
#define FCAP_MUST_SPAWN 0x00000004 // Spawn after restore #define FCAP_MUST_SPAWN 0x00000004 // Spawn after restore
#define FCAP_DONT_SAVE 0x80000000 // Don't save this #define FCAP_DONT_SAVE 0x80000000 // Don't save this
#define FCAP_IMPULSE_USE 0x00000008 // can be used by the player #define FCAP_IMPULSE_USE 0x00000008 // can be used by the player
#define FCAP_CONTINUOUS_USE 0x00000010 // can be used by the player #define FCAP_CONTINUOUS_USE 0x00000010 // can be used by the player
#define FCAP_ONOFF_USE 0x00000020 // can be used by the player #define FCAP_ONOFF_USE 0x00000020 // can be used by the player
#define FCAP_DIRECTIONAL_USE 0x00000040 // Player sends +/- 1 when using (currently only tracktrains) #define FCAP_DIRECTIONAL_USE 0x00000040 // Player sends +/- 1 when using (currently only tracktrains)
#define FCAP_MASTER 0x00000080 // Can be used to "master" other entities (like multisource) #define FCAP_MASTER 0x00000080 // Can be used to "master" other entities (like multisource)
// UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!! // UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!!
#define FCAP_FORCE_TRANSITION 0x00000080 // ALWAYS goes across transitions #define FCAP_FORCE_TRANSITION 0x00000080 // ALWAYS goes across transitions
@ -64,37 +64,43 @@ extern void DispatchUse( edict_t *pentUsed, edict_t *pentOther );
extern void DispatchThink( edict_t *pent ); extern void DispatchThink( edict_t *pent );
extern void DispatchBlocked( edict_t *pentBlocked, edict_t *pentOther ); extern void DispatchBlocked( edict_t *pentBlocked, edict_t *pentOther );
extern void DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData ); extern void DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData );
extern int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); extern int DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity );
extern void DispatchObjectCollsionBox( edict_t *pent ); extern void DispatchObjectCollsionBox( edict_t *pent );
extern void SaveWriteFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); extern void SaveWriteFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount );
extern void SaveReadFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); extern void SaveReadFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount );
extern void SaveGlobalState( SAVERESTOREDATA *pSaveData ); extern void SaveGlobalState( SAVERESTOREDATA *pSaveData );
extern void RestoreGlobalState( SAVERESTOREDATA *pSaveData ); extern void RestoreGlobalState( SAVERESTOREDATA *pSaveData );
extern void ResetGlobalState( void ); extern void ResetGlobalState( void );
typedef enum { USE_OFF = 0, USE_ON = 1, USE_SET = 2, USE_TOGGLE = 3 } USE_TYPE; typedef enum
{
USE_OFF = 0,
USE_ON = 1,
USE_SET = 2,
USE_TOGGLE = 3
} USE_TYPE;
extern void FireTargets( const char *targetName, CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); extern void FireTargets( const char *targetName, CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
typedef void (CBaseEntity::*BASEPTR)(void); typedef void(CBaseEntity::*BASEPTR)( void );
typedef void (CBaseEntity::*ENTITYFUNCPTR)(CBaseEntity *pOther ); typedef void(CBaseEntity::*ENTITYFUNCPTR)( CBaseEntity *pOther );
typedef void (CBaseEntity::*USEPTR)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); typedef void(CBaseEntity::*USEPTR)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
// For CLASSIFY // For CLASSIFY
#define CLASS_NONE 0 #define CLASS_NONE 0
#define CLASS_MACHINE 1 #define CLASS_MACHINE 1
#define CLASS_PLAYER 2 #define CLASS_PLAYER 2
#define CLASS_HUMAN_PASSIVE 3 #define CLASS_HUMAN_PASSIVE 3
#define CLASS_HUMAN_MILITARY 4 #define CLASS_HUMAN_MILITARY 4
#define CLASS_ALIEN_MILITARY 5 #define CLASS_ALIEN_MILITARY 5
#define CLASS_ALIEN_PASSIVE 6 #define CLASS_ALIEN_PASSIVE 6
#define CLASS_ALIEN_MONSTER 7 #define CLASS_ALIEN_MONSTER 7
#define CLASS_ALIEN_PREY 8 #define CLASS_ALIEN_PREY 8
#define CLASS_ALIEN_PREDATOR 9 #define CLASS_ALIEN_PREDATOR 9
#define CLASS_INSECT 10 #define CLASS_INSECT 10
#define CLASS_PLAYER_ALLY 11 #define CLASS_PLAYER_ALLY 11
#define CLASS_PLAYER_BIOWEAPON 12 // hornets and snarks.launched by players #define CLASS_PLAYER_BIOWEAPON 12 // hornets and snarks.launched by players
#define CLASS_ALIEN_BIOWEAPON 13 // hornets and snarks.launched by the alien menace #define CLASS_ALIEN_BIOWEAPON 13 // hornets and snarks.launched by the alien menace
#define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures. #define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures.
class CBaseEntity; class CBaseEntity;
@ -102,7 +108,6 @@ class CBaseMonster;
class CBasePlayerItem; class CBasePlayerItem;
class CSquadMonster; class CSquadMonster;
#define SF_NORESPAWN ( 1 << 30 )// !!!set this bit on guns and stuff that should never respawn. #define SF_NORESPAWN ( 1 << 30 )// !!!set this bit on guns and stuff that should never respawn.
// //
@ -112,7 +117,7 @@ class EHANDLE
{ {
private: private:
edict_t *m_pent; edict_t *m_pent;
int m_serialnumber; int m_serialnumber;
public: public:
edict_t *Get( void ); edict_t *Get( void );
edict_t *Set( edict_t *pent ); edict_t *Set( edict_t *pent );
@ -121,11 +126,10 @@ public:
operator CBaseEntity *(); operator CBaseEntity *();
CBaseEntity * operator = (CBaseEntity *pEntity); CBaseEntity *operator = ( CBaseEntity *pEntity );
CBaseEntity * operator ->(); CBaseEntity *operator ->();
}; };
// //
// Base Entity. All entity types derive from this // Base Entity. All entity types derive from this
// //
@ -137,91 +141,89 @@ public:
entvars_t *pev; // Don't need to save/restore this pointer, the engine resets it entvars_t *pev; // Don't need to save/restore this pointer, the engine resets it
// path corners // path corners
CBaseEntity *m_pGoalEnt;// path corner we are heading towards CBaseEntity *m_pGoalEnt;// path corner we are heading towards
CBaseEntity *m_pLink;// used for temporary link-list operations. CBaseEntity *m_pLink;// used for temporary link-list operations.
// initialization functions // initialization functions
virtual void Spawn( void ) { return; } virtual void Spawn( void ) { return; }
virtual void Precache( void ) { return; } virtual void Precache( void ) { return; }
virtual void KeyValue( KeyValueData* pkvd) { pkvd->fHandled = FALSE; } virtual void KeyValue( KeyValueData* pkvd ) { pkvd->fHandled = FALSE; }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
virtual int ObjectCaps( void ) { return FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return FCAP_ACROSS_TRANSITION; }
virtual void Activate( void ) {} virtual void Activate( void ) {}
// Setup the object->object collision box (pev->mins / pev->maxs is the object->world collision box) // Setup the object->object collision box (pev->mins / pev->maxs is the object->world collision box)
virtual void SetObjectCollisionBox( void ); virtual void SetObjectCollisionBox( void );
// Classify - returns the type of group (i.e, "houndeye", or "human military" so that monsters with different classnames // Classify - returns the type of group (i.e, "houndeye", or "human military" so that monsters with different classnames
// still realize that they are teammates. (overridden for monsters that form groups) // still realize that they are teammates. (overridden for monsters that form groups)
virtual int Classify ( void ) { return CLASS_NONE; }; virtual int Classify( void ) { return CLASS_NONE; };
virtual void DeathNotice ( entvars_t *pevChild ) {}// monster maker children use this to tell the monster maker that they have died. virtual void DeathNotice( entvars_t *pevChild ) {}// monster maker children use this to tell the monster maker that they have died.
static TYPEDESCRIPTION m_SaveData[];
static TYPEDESCRIPTION m_SaveData[]; virtual void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
virtual int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
virtual void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); virtual int TakeHealth( float flHealth, int bitsDamageType );
virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); virtual void Killed( entvars_t *pevAttacker, int iGib );
virtual int TakeHealth( float flHealth, int bitsDamageType ); virtual int BloodColor( void ) { return DONT_BLEED; }
virtual void Killed( entvars_t *pevAttacker, int iGib ); virtual void TraceBleed( float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType );
virtual int BloodColor( void ) { return DONT_BLEED; } virtual BOOL IsTriggered( CBaseEntity *pActivator ) {return TRUE; }
virtual void TraceBleed( float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType ); virtual CBaseMonster *MyMonsterPointer( void ) { return NULL; }
virtual BOOL IsTriggered( CBaseEntity *pActivator ) {return TRUE;} virtual CSquadMonster *MySquadMonsterPointer( void ) { return NULL; }
virtual CBaseMonster *MyMonsterPointer( void ) { return NULL;} virtual int GetToggleState( void ) { return TS_AT_TOP; }
virtual CSquadMonster *MySquadMonsterPointer( void ) { return NULL;} virtual void AddPoints( int score, BOOL bAllowNegativeScore ) {}
virtual int GetToggleState( void ) { return TS_AT_TOP; } virtual void AddPointsToTeam( int score, BOOL bAllowNegativeScore ) {}
virtual void AddPoints( int score, BOOL bAllowNegativeScore ) {} virtual BOOL AddPlayerItem( CBasePlayerItem *pItem ) { return 0; }
virtual void AddPointsToTeam( int score, BOOL bAllowNegativeScore ) {} virtual BOOL RemovePlayerItem( CBasePlayerItem *pItem ) { return 0; }
virtual BOOL AddPlayerItem( CBasePlayerItem *pItem ) { return 0; } virtual int GiveAmmo( int iAmount, char *szName, int iMax ) { return -1; };
virtual BOOL RemovePlayerItem( CBasePlayerItem *pItem ) { return 0; } virtual float GetDelay( void ) { return 0; }
virtual int GiveAmmo( int iAmount, char *szName, int iMax ) { return -1; }; virtual int IsMoving( void ) { return pev->velocity != g_vecZero; }
virtual float GetDelay( void ) { return 0; } virtual void OverrideReset( void ) {}
virtual int IsMoving( void ) { return pev->velocity != g_vecZero; } virtual int DamageDecal( int bitsDamageType );
virtual void OverrideReset( void ) {}
virtual int DamageDecal( int bitsDamageType );
// This is ONLY used by the node graph to test movement through a door // This is ONLY used by the node graph to test movement through a door
virtual void SetToggleState( int state ) {} virtual void SetToggleState( int state ) {}
virtual void StartSneaking( void ) {} virtual void StartSneaking( void ) {}
virtual void StopSneaking( void ) {} virtual void StopSneaking( void ) {}
virtual BOOL OnControls( entvars_t *pev ) { return FALSE; } virtual BOOL OnControls( entvars_t *pev ) { return FALSE; }
virtual BOOL IsSneaking( void ) { return FALSE; } virtual BOOL IsSneaking( void ) { return FALSE; }
virtual BOOL IsAlive( void ) { return (pev->deadflag == DEAD_NO) && pev->health > 0; } virtual BOOL IsAlive( void ) { return (pev->deadflag == DEAD_NO) && pev->health > 0; }
virtual BOOL IsBSPModel( void ) { return pev->solid == SOLID_BSP || pev->movetype == MOVETYPE_PUSHSTEP; } virtual BOOL IsBSPModel( void ) { return pev->solid == SOLID_BSP || pev->movetype == MOVETYPE_PUSHSTEP; }
virtual BOOL ReflectGauss( void ) { return ( IsBSPModel() && !pev->takedamage ); } virtual BOOL ReflectGauss( void ) { return ( IsBSPModel() && !pev->takedamage ); }
virtual BOOL HasTarget( string_t targetname ) { return FStrEq(STRING(targetname), STRING(pev->targetname) ); } virtual BOOL HasTarget( string_t targetname ) { return FStrEq(STRING(targetname), STRING(pev->targetname) ); }
virtual BOOL IsInWorld( void ); virtual BOOL IsInWorld( void );
virtual BOOL IsPlayer( void ) { return FALSE; } virtual BOOL IsPlayer( void ) { return FALSE; }
virtual BOOL IsNetClient( void ) { return FALSE; } virtual BOOL IsNetClient( void ) { return FALSE; }
virtual const char *TeamID( void ) { return ""; } virtual const char *TeamID( void ) { return ""; }
//virtual void SetActivator( CBaseEntity *pActivator ) {}
// virtual void SetActivator( CBaseEntity *pActivator ) {}
virtual CBaseEntity *GetNextTarget( void ); virtual CBaseEntity *GetNextTarget( void );
// fundamental callbacks // fundamental callbacks
void (CBaseEntity ::*m_pfnThink)(void); void ( CBaseEntity ::*m_pfnThink )( void);
void (CBaseEntity ::*m_pfnTouch)( CBaseEntity *pOther ); void ( CBaseEntity ::*m_pfnTouch )( CBaseEntity *pOther );
void (CBaseEntity ::*m_pfnUse)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void ( CBaseEntity ::*m_pfnUse )( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void (CBaseEntity ::*m_pfnBlocked)( CBaseEntity *pOther ); void ( CBaseEntity ::*m_pfnBlocked )( CBaseEntity *pOther );
virtual void Think( void ) { if (m_pfnThink) (this->*m_pfnThink)(); }; virtual void Think( void ) { if( m_pfnThink ) ( this->*m_pfnThink )(); }
virtual void Touch( CBaseEntity *pOther ) { if (m_pfnTouch) (this->*m_pfnTouch)( pOther ); }; virtual void Touch( CBaseEntity *pOther ) { if( m_pfnTouch ) (this->*m_pfnTouch)( pOther ); }
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
if (m_pfnUse) if( m_pfnUse )
(this->*m_pfnUse)( pActivator, pCaller, useType, value ); ( this->*m_pfnUse )( pActivator, pCaller, useType, value );
} }
virtual void Blocked( CBaseEntity *pOther ) { if (m_pfnBlocked) (this->*m_pfnBlocked)( pOther ); }; virtual void Blocked( CBaseEntity *pOther ) { if( m_pfnBlocked ) ( this->*m_pfnBlocked )( pOther ); };
// allow engine to allocate instance data // allow engine to allocate instance data
void *operator new( size_t stAllocateBlock, entvars_t *pev ) void *operator new( size_t stAllocateBlock, entvars_t *pev )
{ {
return (void *)ALLOC_PRIVATE(ENT(pev), stAllocateBlock); return (void *)ALLOC_PRIVATE( ENT( pev ), stAllocateBlock );
}; };
// don't use this. // don't use this.
#if _MSC_VER >= 1200 // only build this code if MSVC++ 6.0 or higher #if _MSC_VER >= 1200 // only build this code if MSVC++ 6.0 or higher
void operator delete(void *pMem, entvars_t *pev) void operator delete( void *pMem, entvars_t *pev )
{ {
pev->flags |= FL_KILLME; pev->flags |= FL_KILLME;
}; };
@ -233,26 +235,26 @@ public:
void EXPORT SUB_Remove( void ); void EXPORT SUB_Remove( void );
void EXPORT SUB_DoNothing( void ); void EXPORT SUB_DoNothing( void );
void EXPORT SUB_StartFadeOut ( void ); void EXPORT SUB_StartFadeOut ( void );
void EXPORT SUB_FadeOut ( void ); void EXPORT SUB_FadeOut( void );
void EXPORT SUB_CallUseToggle( void ) { this->Use( this, this, USE_TOGGLE, 0 ); } void EXPORT SUB_CallUseToggle( void ) { this->Use( this, this, USE_TOGGLE, 0 ); }
int ShouldToggle( USE_TYPE useType, BOOL currentState ); int ShouldToggle( USE_TYPE useType, BOOL currentState );
void FireBullets( ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq = 4, int iDamage = 0, entvars_t *pevAttacker = NULL ); void FireBullets( ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq = 4, int iDamage = 0, entvars_t *pevAttacker = NULL );
Vector FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq = 4, int iDamage = 0, entvars_t *pevAttacker = NULL, int shared_rand = 0 ); Vector FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq = 4, int iDamage = 0, entvars_t *pevAttacker = NULL, int shared_rand = 0 );
virtual CBaseEntity *Respawn( void ) { return NULL; } virtual CBaseEntity *Respawn( void ) { return NULL; }
void SUB_UseTargets( CBaseEntity *pActivator, USE_TYPE useType, float value ); void SUB_UseTargets( CBaseEntity *pActivator, USE_TYPE useType, float value );
// Do the bounding boxes of these two intersect? // Do the bounding boxes of these two intersect?
int Intersects( CBaseEntity *pOther ); int Intersects( CBaseEntity *pOther );
void MakeDormant( void ); void MakeDormant( void );
int IsDormant( void ); int IsDormant( void );
BOOL IsLockedByMaster( void ) { return FALSE; } BOOL IsLockedByMaster( void ) { return FALSE; }
static CBaseEntity *Instance( edict_t *pent ) static CBaseEntity *Instance( edict_t *pent )
{ {
if ( !pent ) if( !pent )
pent = ENT(0); pent = ENT( 0 );
CBaseEntity *pEnt = (CBaseEntity *)GET_PRIVATE(pent); CBaseEntity *pEnt = (CBaseEntity *)GET_PRIVATE( pent );
return pEnt; return pEnt;
} }
@ -262,78 +264,72 @@ public:
CBaseMonster *GetMonsterPointer( entvars_t *pevMonster ) CBaseMonster *GetMonsterPointer( entvars_t *pevMonster )
{ {
CBaseEntity *pEntity = Instance( pevMonster ); CBaseEntity *pEntity = Instance( pevMonster );
if ( pEntity ) if( pEntity )
return pEntity->MyMonsterPointer(); return pEntity->MyMonsterPointer();
return NULL; return NULL;
} }
CBaseMonster *GetMonsterPointer( edict_t *pentMonster ) CBaseMonster *GetMonsterPointer( edict_t *pentMonster )
{ {
CBaseEntity *pEntity = Instance( pentMonster ); CBaseEntity *pEntity = Instance( pentMonster );
if ( pEntity ) if( pEntity )
return pEntity->MyMonsterPointer(); return pEntity->MyMonsterPointer();
return NULL; return NULL;
} }
// Ugly code to lookup all functions to make sure they are exported when set. // Ugly code to lookup all functions to make sure they are exported when set.
#ifdef _DEBUG #ifdef _DEBUG
void FunctionCheck( void *pFunction, char *name ) void FunctionCheck( void *pFunction, char *name )
{ {
if (pFunction && !NAME_FOR_FUNCTION((unsigned long)(pFunction)) ) if( pFunction && !NAME_FOR_FUNCTION( (unsigned long)( pFunction ) ) )
ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING(pev->classname), name, (unsigned long)pFunction ); ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING( pev->classname ), name, (unsigned long)pFunction );
} }
BASEPTR ThinkSet( BASEPTR func, char *name ) BASEPTR ThinkSet( BASEPTR func, char *name )
{ {
m_pfnThink = func; m_pfnThink = func;
FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnThink)))), name ); FunctionCheck( (void *)*( (int *)( (char *)this + ( offsetof( CBaseEntity, m_pfnThink ) ) ) ), name );
return func; return func;
} }
ENTITYFUNCPTR TouchSet( ENTITYFUNCPTR func, char *name ) ENTITYFUNCPTR TouchSet( ENTITYFUNCPTR func, char *name )
{ {
m_pfnTouch = func; m_pfnTouch = func;
FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnTouch)))), name ); FunctionCheck( (void *)*( (int *)( (char *)this + ( offsetof( CBaseEntity, m_pfnTouch ) ) ) ), name );
return func; return func;
} }
USEPTR UseSet( USEPTR func, char *name ) USEPTR UseSet( USEPTR func, char *name )
{ {
m_pfnUse = func; m_pfnUse = func;
FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnUse)))), name ); FunctionCheck( (void *)*( (int *)( (char *)this + ( offsetof( CBaseEntity, m_pfnUse ) ) ) ), name );
return func; return func;
} }
ENTITYFUNCPTR BlockedSet( ENTITYFUNCPTR func, char *name ) ENTITYFUNCPTR BlockedSet( ENTITYFUNCPTR func, char *name )
{ {
m_pfnBlocked = func; m_pfnBlocked = func;
FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnBlocked)))), name ); FunctionCheck( (void *)*( (int *)( (char *)this + ( offsetof( CBaseEntity, m_pfnBlocked ) ) ) ), name );
return func; return func;
} }
#endif #endif
// virtual functions used by a few classes // virtual functions used by a few classes
// used by monsters that are created by the MonsterMaker // used by monsters that are created by the MonsterMaker
virtual void UpdateOwner( void ) { return; }; virtual void UpdateOwner( void ) { return; };
//
static CBaseEntity *Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner = NULL ); static CBaseEntity *Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner = NULL );
virtual BOOL FBecomeProne( void ) {return FALSE;}; virtual BOOL FBecomeProne( void ) {return FALSE;};
edict_t *edict() { return ENT( pev ); }; edict_t *edict() { return ENT( pev ); };
EOFFSET eoffset( ) { return OFFSET( pev ); }; EOFFSET eoffset() { return OFFSET( pev ); };
int entindex( ) { return ENTINDEX( edict() ); }; int entindex() { return ENTINDEX( edict() ); };
virtual Vector Center( ) { return (pev->absmax + pev->absmin) * 0.5; }; // center point of entity virtual Vector Center() { return ( pev->absmax + pev->absmin ) * 0.5; }; // center point of entity
virtual Vector EyePosition( ) { return pev->origin + pev->view_ofs; }; // position of eyes virtual Vector EyePosition() { return pev->origin + pev->view_ofs; }; // position of eyes
virtual Vector EarPosition( ) { return pev->origin + pev->view_ofs; }; // position of ears virtual Vector EarPosition() { return pev->origin + pev->view_ofs; }; // position of ears
virtual Vector BodyTarget( const Vector &posSrc ) { return Center( ); }; // position to shoot at virtual Vector BodyTarget( const Vector &posSrc ) { return Center(); }; // position to shoot at
virtual int Illumination( ) { return GETENTITYILLUM( ENT( pev ) ); }; virtual int Illumination() { return GETENTITYILLUM( ENT( pev ) ); };
virtual BOOL FVisible ( CBaseEntity *pEntity ); virtual BOOL FVisible( CBaseEntity *pEntity );
virtual BOOL FVisible ( const Vector &vecOrigin ); virtual BOOL FVisible( const Vector &vecOrigin );
//We use this variables to store each ammo count. //We use this variables to store each ammo count.
int ammo_9mm; int ammo_9mm;
@ -354,8 +350,6 @@ public:
int m_fireState; int m_fireState;
}; };
// Ugly technique to override base member functions // Ugly technique to override base member functions
// Normally it's illegal to cast a pointer to a member function of a derived class to a pointer to a // Normally it's illegal to cast a pointer to a member function of a derived class to a pointer to a
// member function of a base class. static_cast is a sleezy way around that problem. // member function of a base class. static_cast is a sleezy way around that problem.
@ -378,19 +372,16 @@ public:
#define ResetUse( ) m_pfnUse = static_cast <void (CBaseEntity::*)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )> (NULL) #define ResetUse( ) m_pfnUse = static_cast <void (CBaseEntity::*)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )> (NULL)
#define ResetBlocked( ) m_pfnBlocked = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (NULL) #define ResetBlocked( ) m_pfnBlocked = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (NULL)
#endif #endif
class CPointEntity : public CBaseEntity class CPointEntity : public CBaseEntity
{ {
public: public:
void Spawn( void ); void Spawn( void );
virtual int ObjectCaps( void ) { return CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
private: private:
}; };
typedef struct locksounds // sounds that doors and buttons make when locked/unlocked typedef struct locksounds // sounds that doors and buttons make when locked/unlocked
{ {
string_t sLockedSound; // sound a door makes when it's locked string_t sLockedSound; // sound a door makes when it's locked
@ -407,34 +398,34 @@ typedef struct locksounds // sounds that doors and buttons make when locked/un
BYTE bEOFUnlocked; // true if hit end of list of unlocked sentences BYTE bEOFUnlocked; // true if hit end of list of unlocked sentences
} locksound_t; } locksound_t;
void PlayLockSounds(entvars_t *pev, locksound_t *pls, int flocked, int fbutton); void PlayLockSounds( entvars_t *pev, locksound_t *pls, int flocked, int fbutton );
// //
// MultiSouce // MultiSouce
// //
#define MAX_MULTI_TARGETS 16 // maximum number of targets a single multi_manager entity may be assigned. #define MAX_MULTI_TARGETS 16 // maximum number of targets a single multi_manager entity may be assigned.
#define MS_MAX_TARGETS 32 #define MS_MAX_TARGETS 32
class CMultiSource : public CPointEntity class CMultiSource : public CPointEntity
{ {
public: public:
void Spawn( ); void Spawn();
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
int ObjectCaps( void ) { return (CPointEntity::ObjectCaps() | FCAP_MASTER); } int ObjectCaps( void ) { return ( CPointEntity::ObjectCaps() | FCAP_MASTER ); }
BOOL IsTriggered( CBaseEntity *pActivator ); BOOL IsTriggered( CBaseEntity *pActivator );
void EXPORT Register( void ); void EXPORT Register( void );
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
EHANDLE m_rgEntities[MS_MAX_TARGETS]; EHANDLE m_rgEntities[MS_MAX_TARGETS];
int m_rgTriggered[MS_MAX_TARGETS]; int m_rgTriggered[MS_MAX_TARGETS];
int m_iTotal; int m_iTotal;
string_t m_globalstate; string_t m_globalstate;
}; };
@ -444,58 +435,54 @@ public:
class CBaseDelay : public CBaseEntity class CBaseDelay : public CBaseEntity
{ {
public: public:
float m_flDelay; float m_flDelay;
int m_iszKillTarget; int m_iszKillTarget;
virtual void KeyValue( KeyValueData* pkvd); virtual void KeyValue( KeyValueData *pkvd );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static TYPEDESCRIPTION m_SaveData[];
// common member functions // common member functions
void SUB_UseTargets( CBaseEntity *pActivator, USE_TYPE useType, float value ); void SUB_UseTargets( CBaseEntity *pActivator, USE_TYPE useType, float value );
void EXPORT DelayThink( void ); void EXPORT DelayThink( void );
}; };
class CBaseAnimating : public CBaseDelay class CBaseAnimating : public CBaseDelay
{ {
public: public:
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static TYPEDESCRIPTION m_SaveData[];
// Basic Monster Animation functions // Basic Monster Animation functions
float StudioFrameAdvance( float flInterval = 0.0 ); // accumulate animation frame time from last time called until now float StudioFrameAdvance( float flInterval = 0.0 ); // accumulate animation frame time from last time called until now
int GetSequenceFlags( void ); int GetSequenceFlags( void );
int LookupActivity ( int activity ); int LookupActivity( int activity );
int LookupActivityHeaviest ( int activity ); int LookupActivityHeaviest( int activity );
int LookupSequence ( const char *label ); int LookupSequence( const char *label );
void ResetSequenceInfo ( ); void ResetSequenceInfo();
void DispatchAnimEvents ( float flFutureInterval = 0.1 ); // Handle events that have happend since last time called up until X seconds into the future void DispatchAnimEvents( float flFutureInterval = 0.1 ); // Handle events that have happend since last time called up until X seconds into the future
virtual void HandleAnimEvent( MonsterEvent_t *pEvent ) { return; }; virtual void HandleAnimEvent( MonsterEvent_t *pEvent ) { return; };
float SetBoneController ( int iController, float flValue ); float SetBoneController( int iController, float flValue );
void InitBoneControllers ( void ); void InitBoneControllers( void );
float SetBlending ( int iBlender, float flValue ); float SetBlending( int iBlender, float flValue );
void GetBonePosition ( int iBone, Vector &origin, Vector &angles ); void GetBonePosition( int iBone, Vector &origin, Vector &angles );
void GetAutomovement( Vector &origin, Vector &angles, float flInterval = 0.1 ); void GetAutomovement( Vector &origin, Vector &angles, float flInterval = 0.1 );
int FindTransition( int iEndingSequence, int iGoalSequence, int *piDir ); int FindTransition( int iEndingSequence, int iGoalSequence, int *piDir );
void GetAttachment ( int iAttachment, Vector &origin, Vector &angles ); void GetAttachment( int iAttachment, Vector &origin, Vector &angles );
void SetBodygroup( int iGroup, int iValue ); void SetBodygroup( int iGroup, int iValue );
int GetBodygroup( int iGroup ); int GetBodygroup( int iGroup );
int ExtractBbox( int sequence, float *mins, float *maxs ); int ExtractBbox( int sequence, float *mins, float *maxs );
void SetSequenceBox( void ); void SetSequenceBox( void );
// animation needs // animation needs
float m_flFrameRate; // computed FPS for current sequence float m_flFrameRate; // computed FPS for current sequence
float m_flGroundSpeed; // computed linear movement rate for current sequence float m_flGroundSpeed; // computed linear movement rate for current sequence
float m_flLastEventCheck; // last time the event list was checked float m_flLastEventCheck; // last time the event list was checked
BOOL m_fSequenceFinished;// flag set when StudioAdvanceFrame moves across a frame boundry BOOL m_fSequenceFinished;// flag set when StudioAdvanceFrame moves across a frame boundry
BOOL m_fSequenceLoops; // true if the sequence loops BOOL m_fSequenceLoops; // true if the sequence loops
}; };
// //
// generic Toggle entity. // generic Toggle entity.
// //
@ -671,7 +658,6 @@ class CSound;
char *ButtonSound( int sound ); // get string of button sound number char *ButtonSound( int sound ); // get string of button sound number
// //
// Generic Button // Generic Button
// //
@ -683,29 +669,29 @@ public:
void RotSpawn( void ); void RotSpawn( void );
virtual void KeyValue( KeyValueData* pkvd); virtual void KeyValue( KeyValueData* pkvd);
void ButtonActivate( ); void ButtonActivate();
void SparkSoundCache( void ); void SparkSoundCache( void );
void EXPORT ButtonShot( void ); void EXPORT ButtonShot( void );
void EXPORT ButtonTouch( CBaseEntity *pOther ); void EXPORT ButtonTouch( CBaseEntity *pOther );
void EXPORT ButtonSpark ( void ); void EXPORT ButtonSpark( void );
void EXPORT TriggerAndWait( void ); void EXPORT TriggerAndWait( void );
void EXPORT ButtonReturn( void ); void EXPORT ButtonReturn( void );
void EXPORT ButtonBackHome( void ); void EXPORT ButtonBackHome( void );
void EXPORT ButtonUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT ButtonUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
enum BUTTON_CODE { BUTTON_NOTHING, BUTTON_ACTIVATE, BUTTON_RETURN }; enum BUTTON_CODE { BUTTON_NOTHING, BUTTON_ACTIVATE, BUTTON_RETURN };
BUTTON_CODE ButtonResponseToTouch( void ); BUTTON_CODE ButtonResponseToTouch( void );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
// Buttons that don't take damage can be IMPULSE used // Buttons that don't take damage can be IMPULSE used
virtual int ObjectCaps( void ) { return (CBaseToggle:: ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | (pev->takedamage?0:FCAP_IMPULSE_USE); } virtual int ObjectCaps( void ) { return (CBaseToggle:: ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | (pev->takedamage?0:FCAP_IMPULSE_USE); }
BOOL m_fStayPushed; // button stays pushed in until touched again? BOOL m_fStayPushed; // button stays pushed in until touched again?
BOOL m_fRotating; // a rotating button? default is a sliding button. BOOL m_fRotating; // a rotating button? default is a sliding button.
string_t m_strChangeTarget; // if this field is not null, this is an index into the engine string array. string_t m_strChangeTarget; // if this field is not null, this is an index into the engine string array.
// when this button is touched, it's target entity's TARGET field will be set // when this button is touched, it's target entity's TARGET field will be set
@ -713,17 +699,16 @@ public:
locksound_t m_ls; // door lock sounds locksound_t m_ls; // door lock sounds
BYTE m_bLockedSound; // ordinals from entity selection BYTE m_bLockedSound; // ordinals from entity selection
BYTE m_bLockedSentence; BYTE m_bLockedSentence;
BYTE m_bUnlockedSound; BYTE m_bUnlockedSound;
BYTE m_bUnlockedSentence; BYTE m_bUnlockedSentence;
int m_sounds; int m_sounds;
}; };
// //
// Weapons // Weapons
// //
#define BAD_WEAPON 0x00007FFF #define BAD_WEAPON 0x00007FFF
// //
@ -735,22 +720,21 @@ template <class T> T * GetClassPtr( T *a )
entvars_t *pev = (entvars_t *)a; entvars_t *pev = (entvars_t *)a;
// allocate entity if necessary // allocate entity if necessary
if (pev == NULL) if( pev == NULL )
pev = VARS(CREATE_ENTITY()); pev = VARS( CREATE_ENTITY() );
// get the private data // get the private data
a = (T *)GET_PRIVATE(ENT(pev)); a = (T *)GET_PRIVATE( ENT( pev ) );
if (a == NULL) if( a == NULL )
{ {
// allocate private data // allocate private data
a = new(pev) T; a = new( pev ) T;
a->pev = pev; a->pev = pev;
} }
return a; return a;
} }
/* /*
bit_PUSHBRUSH_DATA | bit_TOGGLE_DATA bit_PUSHBRUSH_DATA | bit_TOGGLE_DATA
bit_MONSTER_DATA bit_MONSTER_DATA
@ -778,13 +762,12 @@ push_trigger_data
typedef struct _SelAmmo typedef struct _SelAmmo
{ {
BYTE Ammo1Type; BYTE Ammo1Type;
BYTE Ammo1; BYTE Ammo1;
BYTE Ammo2Type; BYTE Ammo2Type;
BYTE Ammo2; BYTE Ammo2;
} SelAmmo; } SelAmmo;
// this moved here from world.cpp, to allow classes to be derived from it // this moved here from world.cpp, to allow classes to be derived from it
//======================= //=======================
// CWorld // CWorld

View File

@ -29,11 +29,11 @@
#define HIDEHUD_WEAPONS ( 1<<0 ) #define HIDEHUD_WEAPONS ( 1<<0 )
#define HIDEHUD_FLASHLIGHT ( 1<<1 ) #define HIDEHUD_FLASHLIGHT ( 1<<1 )
#define HIDEHUD_ALL ( 1<<2 ) #define HIDEHUD_ALL ( 1<<2 )
#define HIDEHUD_HEALTH ( 1<<3 ) #define HIDEHUD_HEALTH ( 1<<3 )
#define MAX_AMMO_TYPES 32 // ??? #define MAX_AMMO_TYPES 32 // ???
#define MAX_AMMO_SLOTS 32 // not really slots #define MAX_AMMO_SLOTS 32 // not really slots
#define HUD_PRINTNOTIFY 1 #define HUD_PRINTNOTIFY 1
#define HUD_PRINTCONSOLE 2 #define HUD_PRINTCONSOLE 2
@ -41,6 +41,5 @@
#define HUD_PRINTCENTER 4 #define HUD_PRINTCENTER 4
#define WEAPON_SUIT 31 #define WEAPON_SUIT 31
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
#ifndef CLIENT_H #ifndef CLIENT_H
#define CLIENT_H #define CLIENT_H
extern void respawn( entvars_t* pev, BOOL fCopyCorpse ); extern void respawn( entvars_t *pev, BOOL fCopyCorpse );
extern BOOL ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); extern BOOL ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] );
extern void ClientDisconnect( edict_t *pEntity ); extern void ClientDisconnect( edict_t *pEntity );
extern void ClientKill( edict_t *pEntity ); extern void ClientKill( edict_t *pEntity );
@ -35,31 +35,30 @@ extern void ClientPrecache( void );
extern const char *GetGameDescription( void ); extern const char *GetGameDescription( void );
extern void PlayerCustomization( edict_t *pEntity, customization_t *pCust ); extern void PlayerCustomization( edict_t *pEntity, customization_t *pCust );
extern void SpectatorConnect ( edict_t *pEntity ); extern void SpectatorConnect( edict_t *pEntity );
extern void SpectatorDisconnect ( edict_t *pEntity ); extern void SpectatorDisconnect( edict_t *pEntity );
extern void SpectatorThink ( edict_t *pEntity ); extern void SpectatorThink( edict_t *pEntity );
extern void Sys_Error( const char *error_string ); extern void Sys_Error( const char *error_string );
extern void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ); extern void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas );
extern void UpdateClientData ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); extern void UpdateClientData( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd );
extern int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); extern int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet );
extern void CreateBaseline( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); extern void CreateBaseline( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs );
extern void RegisterEncoders( void ); extern void RegisterEncoders( void );
extern int GetWeaponData( struct edict_s *player, struct weapon_data_s *info ); extern int GetWeaponData( struct edict_s *player, struct weapon_data_s *info );
extern void CmdStart( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); extern void CmdStart( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed );
extern void CmdEnd ( const edict_t *player ); extern void CmdEnd ( const edict_t *player );
extern int ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); extern int ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size );
extern int GetHullBounds( int hullnumber, float *mins, float *maxs ); extern int GetHullBounds( int hullnumber, float *mins, float *maxs );
extern void CreateInstancedBaselines ( void ); extern void CreateInstancedBaselines( void );
extern int InconsistentFile( const edict_t *player, const char *filename, char *disconnect_message ); extern int InconsistentFile( const edict_t *player, const char *filename, char *disconnect_message );
extern int AllowLagCompensation( void ); extern int AllowLagCompensation( void );
#endif // CLIENT_H
#endif // CLIENT_H

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ class CCrossbowBolt : public CBaseEntity
{ {
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int Classify ( void ); int Classify( void );
void EXPORT BubbleThink( void ); void EXPORT BubbleThink( void );
void EXPORT BoltTouch( CBaseEntity *pOther ); void EXPORT BoltTouch( CBaseEntity *pOther );
void EXPORT ExplodeThink( void ); void EXPORT ExplodeThink( void );
@ -53,46 +53,44 @@ CCrossbowBolt *CCrossbowBolt::BoltCreate( void )
{ {
// Create a new entity with CCrossbowBolt private data // Create a new entity with CCrossbowBolt private data
CCrossbowBolt *pBolt = GetClassPtr( (CCrossbowBolt *)NULL ); CCrossbowBolt *pBolt = GetClassPtr( (CCrossbowBolt *)NULL );
pBolt->pev->classname = MAKE_STRING("crossbow_bolt"); // g-cont. enable save\restore pBolt->pev->classname = MAKE_STRING( "crossbow_bolt" ); // g-cont. enable save\restore
pBolt->Spawn(); pBolt->Spawn();
return pBolt; return pBolt;
} }
void CCrossbowBolt::Spawn( ) void CCrossbowBolt::Spawn()
{ {
Precache( ); Precache();
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->gravity = 0.5; pev->gravity = 0.5;
SET_MODEL(ENT(pev), "models/crossbow_bolt.mdl"); SET_MODEL( ENT( pev ), "models/crossbow_bolt.mdl" );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
UTIL_SetSize(pev, Vector(0, 0, 0), Vector(0, 0, 0)); UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
SetTouch( &CCrossbowBolt::BoltTouch ); SetTouch( &CCrossbowBolt::BoltTouch );
SetThink( &CCrossbowBolt::BubbleThink ); SetThink( &CCrossbowBolt::BubbleThink );
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
} }
void CCrossbowBolt::Precache()
void CCrossbowBolt::Precache( )
{ {
PRECACHE_MODEL ("models/crossbow_bolt.mdl"); PRECACHE_MODEL( "models/crossbow_bolt.mdl" );
PRECACHE_SOUND("weapons/xbow_hitbod1.wav"); PRECACHE_SOUND( "weapons/xbow_hitbod1.wav" );
PRECACHE_SOUND("weapons/xbow_hitbod2.wav"); PRECACHE_SOUND( "weapons/xbow_hitbod2.wav" );
PRECACHE_SOUND("weapons/xbow_fly1.wav"); PRECACHE_SOUND( "weapons/xbow_fly1.wav" );
PRECACHE_SOUND("weapons/xbow_hit1.wav"); PRECACHE_SOUND( "weapons/xbow_hit1.wav" );
PRECACHE_SOUND("fvox/beep.wav"); PRECACHE_SOUND( "fvox/beep.wav" );
m_iTrail = PRECACHE_MODEL("sprites/streak.spr"); m_iTrail = PRECACHE_MODEL( "sprites/streak.spr" );
} }
int CCrossbowBolt::Classify( void )
int CCrossbowBolt :: Classify ( void )
{ {
return CLASS_NONE; return CLASS_NONE;
} }
void CCrossbowBolt::BoltTouch( CBaseEntity *pOther ) void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
@ -100,71 +98,73 @@ void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
SetTouch( NULL ); SetTouch( NULL );
SetThink( NULL ); SetThink( NULL );
if (pOther->pev->takedamage) if( pOther->pev->takedamage )
{ {
TraceResult tr = UTIL_GetGlobalTrace( ); TraceResult tr = UTIL_GetGlobalTrace();
entvars_t *pevOwner; entvars_t *pevOwner;
pevOwner = VARS( pev->owner ); pevOwner = VARS( pev->owner );
// UNDONE: this needs to call TraceAttack instead // UNDONE: this needs to call TraceAttack instead
ClearMultiDamage( ); ClearMultiDamage();
if ( pOther->IsPlayer() ) if( pOther->IsPlayer() )
{ {
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowClient, pev->velocity.Normalize(), &tr, DMG_NEVERGIB ); pOther->TraceAttack( pevOwner, gSkillData.plrDmgCrossbowClient, pev->velocity.Normalize(), &tr, DMG_NEVERGIB );
} }
else else
{ {
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowMonster, pev->velocity.Normalize(), &tr, DMG_BULLET | DMG_NEVERGIB ); pOther->TraceAttack( pevOwner, gSkillData.plrDmgCrossbowMonster, pev->velocity.Normalize(), &tr, DMG_BULLET | DMG_NEVERGIB );
} }
ApplyMultiDamage( pev, pevOwner ); ApplyMultiDamage( pev, pevOwner );
pev->velocity = Vector( 0, 0, 0 ); pev->velocity = Vector( 0, 0, 0 );
// play body "thwack" sound // play body "thwack" sound
switch( RANDOM_LONG(0,1) ) switch( RANDOM_LONG( 0, 1 ) )
{ {
case 0: case 0:
EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM );
break;
case 1: case 1:
EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM );
break;
} }
if ( !g_pGameRules->IsMultiplayer() ) if( !g_pGameRules->IsMultiplayer() )
{ {
Killed( pev, GIB_NEVER ); Killed( pev, GIB_NEVER );
} }
} }
else else
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_BODY, "weapons/xbow_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 98 + RANDOM_LONG(0,7)); EMIT_SOUND_DYN( ENT( pev ), CHAN_BODY, "weapons/xbow_hit1.wav", RANDOM_FLOAT( 0.95, 1.0 ), ATTN_NORM, 0, 98 + RANDOM_LONG( 0, 7 ) );
SetThink( &CBaseEntity::SUB_Remove ); SetThink( &CBaseEntity::SUB_Remove );
pev->nextthink = gpGlobals->time;// this will get changed below if the bolt is allowed to stick in what it hit. pev->nextthink = gpGlobals->time;// this will get changed below if the bolt is allowed to stick in what it hit.
if ( FClassnameIs( pOther->pev, "worldspawn" ) ) if( FClassnameIs( pOther->pev, "worldspawn" ) )
{ {
// if what we hit is static architecture, can stay around for a while. // if what we hit is static architecture, can stay around for a while.
Vector vecDir = pev->velocity.Normalize( ); Vector vecDir = pev->velocity.Normalize();
UTIL_SetOrigin( pev, pev->origin - vecDir * 12 ); UTIL_SetOrigin( pev, pev->origin - vecDir * 12 );
pev->angles = UTIL_VecToAngles( vecDir ); pev->angles = UTIL_VecToAngles( vecDir );
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->velocity = Vector( 0, 0, 0 ); pev->velocity = Vector( 0, 0, 0 );
pev->avelocity.z = 0; pev->avelocity.z = 0;
pev->angles.z = RANDOM_LONG(0,360); pev->angles.z = RANDOM_LONG( 0, 360 );
pev->nextthink = gpGlobals->time + 10.0; pev->nextthink = gpGlobals->time + 10.0;
} }
else if ( pOther->pev->movetype == MOVETYPE_PUSH || pOther->pev->movetype == MOVETYPE_PUSHSTEP ) else if( pOther->pev->movetype == MOVETYPE_PUSH || pOther->pev->movetype == MOVETYPE_PUSHSTEP )
{ {
Vector vecDir = pev->velocity.Normalize( ); Vector vecDir = pev->velocity.Normalize();
UTIL_SetOrigin( pev, pev->origin - vecDir * 12 ); UTIL_SetOrigin( pev, pev->origin - vecDir * 12 );
pev->angles = UTIL_VecToAngles( vecDir ); pev->angles = UTIL_VecToAngles( vecDir );
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->velocity = Vector( 0, 0, 0 ); pev->velocity = Vector( 0, 0, 0 );
pev->avelocity.z = 0; pev->avelocity.z = 0;
pev->angles.z = RANDOM_LONG(0,360); pev->angles.z = RANDOM_LONG( 0, 360 );
pev->nextthink = gpGlobals->time + 10.0; pev->nextthink = gpGlobals->time + 10.0;
// g-cont. Setup movewith feature // g-cont. Setup movewith feature
@ -172,13 +172,13 @@ void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
pev->aiment = ENT( pOther->pev ); // set parent pev->aiment = ENT( pOther->pev ); // set parent
} }
if (UTIL_PointContents(pev->origin) != CONTENTS_WATER) if( UTIL_PointContents( pev->origin ) != CONTENTS_WATER )
{ {
UTIL_Sparks( pev->origin ); UTIL_Sparks( pev->origin );
} }
} }
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
SetThink( &CCrossbowBolt::ExplodeThink ); SetThink( &CCrossbowBolt::ExplodeThink );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
@ -189,7 +189,7 @@ void CCrossbowBolt::BubbleThink( void )
{ {
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (pev->waterlevel == 0) if( pev->waterlevel == 0 )
return; return;
UTIL_BubbleTrail( pev->origin - pev->velocity * 0.1, pev->origin, 1 ); UTIL_BubbleTrail( pev->origin - pev->velocity * 0.1, pev->origin, 1 );
@ -197,18 +197,18 @@ void CCrossbowBolt::BubbleThink( void )
void CCrossbowBolt::ExplodeThink( void ) void CCrossbowBolt::ExplodeThink( void )
{ {
int iContents = UTIL_PointContents ( pev->origin ); int iContents = UTIL_PointContents( pev->origin );
int iScale; int iScale;
pev->dmg = 40; pev->dmg = 40;
iScale = 10; iScale = 10;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION); WRITE_BYTE( TE_EXPLOSION );
WRITE_COORD( pev->origin.x ); WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
if (iContents != CONTENTS_WATER) if( iContents != CONTENTS_WATER )
{ {
WRITE_SHORT( g_sModelIndexFireball ); WRITE_SHORT( g_sModelIndexFireball );
} }
@ -216,14 +216,14 @@ void CCrossbowBolt::ExplodeThink( void )
{ {
WRITE_SHORT( g_sModelIndexWExplosion ); WRITE_SHORT( g_sModelIndexWExplosion );
} }
WRITE_BYTE( iScale ); // scale * 10 WRITE_BYTE( iScale ); // scale * 10
WRITE_BYTE( 15 ); // framerate WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE ); WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END(); MESSAGE_END();
entvars_t *pevOwner; entvars_t *pevOwner;
if ( pev->owner ) if( pev->owner )
pevOwner = VARS( pev->owner ); pevOwner = VARS( pev->owner );
else else
pevOwner = NULL; pevOwner = NULL;
@ -232,11 +232,12 @@ void CCrossbowBolt::ExplodeThink( void )
::RadiusDamage( pev->origin, pev, pevOwner, pev->dmg, 128, CLASS_NONE, DMG_BLAST | DMG_ALWAYSGIB ); ::RadiusDamage( pev->origin, pev, pevOwner, pev->dmg, 128, CLASS_NONE, DMG_BLAST | DMG_ALWAYSGIB );
UTIL_Remove(this); UTIL_Remove( this );
} }
#endif #endif
enum crossbow_e { enum crossbow_e
{
CROSSBOW_IDLE1 = 0, // full CROSSBOW_IDLE1 = 0, // full
CROSSBOW_IDLE2, // empty CROSSBOW_IDLE2, // empty
CROSSBOW_FIDGET1, // full CROSSBOW_FIDGET1, // full
@ -253,11 +254,11 @@ enum crossbow_e {
LINK_ENTITY_TO_CLASS( weapon_crossbow, CCrossbow ) LINK_ENTITY_TO_CLASS( weapon_crossbow, CCrossbow )
void CCrossbow::Spawn( ) void CCrossbow::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_CROSSBOW; m_iId = WEAPON_CROSSBOW;
SET_MODEL(ENT(pev), "models/w_crossbow.mdl"); SET_MODEL( ENT( pev ), "models/w_crossbow.mdl" );
m_iDefaultAmmo = CROSSBOW_DEFAULT_GIVE; m_iDefaultAmmo = CROSSBOW_DEFAULT_GIVE;
@ -266,7 +267,7 @@ void CCrossbow::Spawn( )
int CCrossbow::AddToPlayer( CBasePlayer *pPlayer ) int CCrossbow::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -278,12 +279,12 @@ int CCrossbow::AddToPlayer( CBasePlayer *pPlayer )
void CCrossbow::Precache( void ) void CCrossbow::Precache( void )
{ {
PRECACHE_MODEL("models/w_crossbow.mdl"); PRECACHE_MODEL( "models/w_crossbow.mdl" );
PRECACHE_MODEL("models/v_crossbow.mdl"); PRECACHE_MODEL( "models/v_crossbow.mdl" );
PRECACHE_MODEL("models/p_crossbow.mdl"); PRECACHE_MODEL( "models/p_crossbow.mdl" );
PRECACHE_SOUND("weapons/xbow_fire1.wav"); PRECACHE_SOUND( "weapons/xbow_fire1.wav" );
PRECACHE_SOUND("weapons/xbow_reload1.wav"); PRECACHE_SOUND( "weapons/xbow_reload1.wav" );
UTIL_PrecacheOther( "crossbow_bolt" ); UTIL_PrecacheOther( "crossbow_bolt" );
@ -291,10 +292,9 @@ void CCrossbow::Precache( void )
m_usCrossbow2 = PRECACHE_EVENT( 1, "events/crossbow2.sc" ); m_usCrossbow2 = PRECACHE_EVENT( 1, "events/crossbow2.sc" );
} }
int CCrossbow::GetItemInfo( ItemInfo *p )
int CCrossbow::GetItemInfo(ItemInfo *p)
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "bolts"; p->pszAmmo1 = "bolts";
p->iMaxAmmo1 = BOLT_MAX_CARRY; p->iMaxAmmo1 = BOLT_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -308,10 +308,9 @@ int CCrossbow::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CCrossbow::Deploy()
BOOL CCrossbow::Deploy( )
{ {
if (m_iClip) if( m_iClip )
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW1, "bow" ); return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW1, "bow" );
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW2, "bow" ); return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW2, "bow" );
} }
@ -320,13 +319,13 @@ void CCrossbow::Holster( int skiplocal /* = 0 */ )
{ {
m_fInReload = FALSE;// cancel any reload in progress. m_fInReload = FALSE;// cancel any reload in progress.
if ( m_fInZoom ) if( m_fInZoom )
{ {
SecondaryAttack( ); SecondaryAttack();
} }
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
if (m_iClip) if( m_iClip )
SendWeaponAnim( CROSSBOW_HOLSTER1 ); SendWeaponAnim( CROSSBOW_HOLSTER1 );
else else
SendWeaponAnim( CROSSBOW_HOLSTER2 ); SendWeaponAnim( CROSSBOW_HOLSTER2 );
@ -334,11 +333,10 @@ void CCrossbow::Holster( int skiplocal /* = 0 */ )
void CCrossbow::PrimaryAttack( void ) void CCrossbow::PrimaryAttack( void )
{ {
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( m_fInZoom && bIsMultiplayer() ) if( m_fInZoom && bIsMultiplayer() )
#else #else
if ( m_fInZoom && g_pGameRules->IsMultiplayer() ) if( m_fInZoom && g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
FireSniperBolt(); FireSniperBolt();
@ -353,9 +351,9 @@ void CCrossbow::FireSniperBolt()
{ {
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
if (m_iClip == 0) if( m_iClip == 0 )
{ {
PlayEmptySound( ); PlayEmptySound();
return; return;
} }
@ -375,19 +373,19 @@ void CCrossbow::FireSniperBolt()
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
UTIL_MakeVectors( anglesAim ); UTIL_MakeVectors( anglesAim );
Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2; Vector vecSrc = m_pPlayer->GetGunPosition() - gpGlobals->v_up * 2;
Vector vecDir = gpGlobals->v_forward; Vector vecDir = gpGlobals->v_forward;
UTIL_TraceLine(vecSrc, vecSrc + vecDir * 8192, dont_ignore_monsters, m_pPlayer->edict(), &tr); UTIL_TraceLine( vecSrc, vecSrc + vecDir * 8192, dont_ignore_monsters, m_pPlayer->edict(), &tr );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( tr.pHit->v.takedamage ) if( tr.pHit->v.takedamage )
{ {
ClearMultiDamage( ); ClearMultiDamage();
CBaseEntity::Instance(tr.pHit)->TraceAttack(m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB ); CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB );
ApplyMultiDamage( pev, m_pPlayer->pev ); ApplyMultiDamage( pev, m_pPlayer->pev );
} }
#endif #endif
@ -397,9 +395,9 @@ void CCrossbow::FireBolt()
{ {
TraceResult tr; TraceResult tr;
if (m_iClip == 0) if( m_iClip == 0 )
{ {
PlayEmptySound( ); PlayEmptySound();
return; return;
} }
@ -421,10 +419,10 @@ void CCrossbow::FireBolt()
Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
UTIL_MakeVectors( anglesAim ); UTIL_MakeVectors( anglesAim );
anglesAim.x = -anglesAim.x; anglesAim.x = -anglesAim.x;
Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2; Vector vecSrc = m_pPlayer->GetGunPosition() - gpGlobals->v_up * 2;
Vector vecDir = gpGlobals->v_forward; Vector vecDir = gpGlobals->v_forward;
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate(); CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate();
@ -432,7 +430,7 @@ void CCrossbow::FireBolt()
pBolt->pev->angles = anglesAim; pBolt->pev->angles = anglesAim;
pBolt->pev->owner = m_pPlayer->edict(); pBolt->pev->owner = m_pPlayer->edict();
if (m_pPlayer->pev->waterlevel == 3) if( m_pPlayer->pev->waterlevel == 3 )
{ {
pBolt->pev->velocity = vecDir * BOLT_WATER_VELOCITY; pBolt->pev->velocity = vecDir * BOLT_WATER_VELOCITY;
pBolt->pev->speed = BOLT_WATER_VELOCITY; pBolt->pev->speed = BOLT_WATER_VELOCITY;
@ -445,68 +443,65 @@ void CCrossbow::FireBolt()
pBolt->pev->avelocity.z = 10; pBolt->pev->avelocity.z = 10;
#endif #endif
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition // HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
if (m_iClip != 0) if( m_iClip != 0 )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
else else
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75;
} }
void CCrossbow::SecondaryAttack() void CCrossbow::SecondaryAttack()
{ {
if ( m_pPlayer->pev->fov != 0 ) if( m_pPlayer->pev->fov != 0 )
{ {
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov
m_fInZoom = 0; m_fInZoom = 0;
} }
else if ( m_pPlayer->pev->fov != 20 ) else if( m_pPlayer->pev->fov != 20 )
{ {
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 20; m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 20;
m_fInZoom = 1; m_fInZoom = 1;
} }
pev->nextthink = UTIL_WeaponTimeBase() + 0.1; pev->nextthink = UTIL_WeaponTimeBase() + 0.1;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
} }
void CCrossbow::Reload( void ) void CCrossbow::Reload( void )
{ {
if ( m_pPlayer->ammo_bolts <= 0 ) if( m_pPlayer->ammo_bolts <= 0 )
return; return;
if ( m_pPlayer->pev->fov != 0 ) if( m_pPlayer->pev->fov != 0 )
{ {
SecondaryAttack(); SecondaryAttack();
} }
if ( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) ) if( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) )
{ {
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT( 0.95, 1.0 ), ATTN_NORM, 0, 93 + RANDOM_LONG( 0, 0xF ) );
} }
} }
void CCrossbow::WeaponIdle( void ) void CCrossbow::WeaponIdle( void )
{ {
m_pPlayer->GetAutoaimVector( AUTOAIM_2DEGREES ); // get the autoaim vector but ignore it; used for autoaim crosshair in DM m_pPlayer->GetAutoaimVector( AUTOAIM_2DEGREES ); // get the autoaim vector but ignore it; used for autoaim crosshair in DM
ResetEmptySound( ); ResetEmptySound();
if ( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
{ {
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.75) if( flRand <= 0.75 )
{ {
if (m_iClip) if( m_iClip )
{ {
SendWeaponAnim( CROSSBOW_IDLE1 ); SendWeaponAnim( CROSSBOW_IDLE1 );
} }
@ -518,7 +513,7 @@ void CCrossbow::WeaponIdle( void )
} }
else else
{ {
if (m_iClip) if( m_iClip )
{ {
SendWeaponAnim( CROSSBOW_FIDGET1 ); SendWeaponAnim( CROSSBOW_FIDGET1 );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0 / 30.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0 / 30.0;
@ -533,26 +528,24 @@ void CCrossbow::WeaponIdle( void )
} }
} }
class CCrossbowAmmo : public CBasePlayerAmmo class CCrossbowAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_crossbow_clip.mdl"); SET_MODEL( ENT( pev ), "models/w_crossbow_clip.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_crossbow_clip.mdl"); PRECACHE_MODEL( "models/w_crossbow_clip.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther ) BOOL AddAmmo( CBaseEntity *pOther )
{ {
if (pOther->GiveAmmo( AMMO_CROSSBOWCLIP_GIVE, "bolts", BOLT_MAX_CARRY ) != -1) if( pOther->GiveAmmo( AMMO_CROSSBOWCLIP_GIVE, "bolts", BOLT_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -560,7 +553,4 @@ class CCrossbowAmmo : public CBasePlayerAmmo
}; };
LINK_ENTITY_TO_CLASS( ammo_crossbow, CCrossbowAmmo ) LINK_ENTITY_TO_CLASS( ammo_crossbow, CCrossbowAmmo )
#endif #endif

View File

@ -22,13 +22,13 @@
#include "player.h" #include "player.h"
#include "gamerules.h" #include "gamerules.h"
#define CROWBAR_BODYHIT_VOLUME 128 #define CROWBAR_BODYHIT_VOLUME 128
#define CROWBAR_WALLHIT_VOLUME 512 #define CROWBAR_WALLHIT_VOLUME 512
LINK_ENTITY_TO_CLASS( weapon_crowbar, CCrowbar ) LINK_ENTITY_TO_CLASS( weapon_crowbar, CCrowbar )
enum gauss_e { enum gauss_e
{
CROWBAR_IDLE = 0, CROWBAR_IDLE = 0,
CROWBAR_DRAW, CROWBAR_DRAW,
CROWBAR_HOLSTER, CROWBAR_HOLSTER,
@ -43,33 +43,32 @@ enum gauss_e {
void CCrowbar::Spawn( ) void CCrowbar::Spawn( )
{ {
Precache( ); Precache();
m_iId = WEAPON_CROWBAR; m_iId = WEAPON_CROWBAR;
SET_MODEL(ENT(pev), "models/w_crowbar.mdl"); SET_MODEL( ENT( pev ), "models/w_crowbar.mdl" );
m_iClip = -1; m_iClip = -1;
FallInit();// get ready to fall down. FallInit();// get ready to fall down.
} }
void CCrowbar::Precache( void ) void CCrowbar::Precache( void )
{ {
PRECACHE_MODEL("models/v_crowbar.mdl"); PRECACHE_MODEL( "models/v_crowbar.mdl ");
PRECACHE_MODEL("models/w_crowbar.mdl"); PRECACHE_MODEL( "models/w_crowbar.mdl ");
PRECACHE_MODEL("models/p_crowbar.mdl"); PRECACHE_MODEL( "models/p_crowbar.mdl ");
PRECACHE_SOUND("weapons/cbar_hit1.wav"); PRECACHE_SOUND( "weapons/cbar_hit1.wav ");
PRECACHE_SOUND("weapons/cbar_hit2.wav"); PRECACHE_SOUND( "weapons/cbar_hit2.wav ");
PRECACHE_SOUND("weapons/cbar_hitbod1.wav"); PRECACHE_SOUND( "weapons/cbar_hitbod1.wav ");
PRECACHE_SOUND("weapons/cbar_hitbod2.wav"); PRECACHE_SOUND( "weapons/cbar_hitbod2.wav ");
PRECACHE_SOUND("weapons/cbar_hitbod3.wav"); PRECACHE_SOUND( "weapons/cbar_hitbod3.wav ");
PRECACHE_SOUND("weapons/cbar_miss1.wav"); PRECACHE_SOUND( "weapons/cbar_miss1.wav ");
m_usCrowbar = PRECACHE_EVENT ( 1, "events/crowbar.sc" ); m_usCrowbar = PRECACHE_EVENT( 1, "events/crowbar.sc" );
} }
int CCrowbar::GetItemInfo(ItemInfo *p) int CCrowbar::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = NULL; p->pszAmmo1 = NULL;
p->iMaxAmmo1 = -1; p->iMaxAmmo1 = -1;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -82,9 +81,7 @@ int CCrowbar::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CCrowbar::Deploy()
BOOL CCrowbar::Deploy( )
{ {
return DefaultDeploy( "models/v_crowbar.mdl", "models/p_crowbar.mdl", CROWBAR_DRAW, "crowbar" ); return DefaultDeploy( "models/v_crowbar.mdl", "models/p_crowbar.mdl", CROWBAR_DRAW, "crowbar" );
} }
@ -95,41 +92,40 @@ void CCrowbar::Holster( int skiplocal /* = 0 */ )
SendWeaponAnim( CROWBAR_HOLSTER ); SendWeaponAnim( CROWBAR_HOLSTER );
} }
void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity )
{ {
int i, j, k; int i, j, k;
float distance; float distance;
float *minmaxs[2] = {mins, maxs}; float *minmaxs[2] = {mins, maxs};
TraceResult tmpTrace; TraceResult tmpTrace;
Vector vecHullEnd = tr.vecEndPos; Vector vecHullEnd = tr.vecEndPos;
Vector vecEnd; Vector vecEnd;
distance = 1e6f; distance = 1e6f;
vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); vecHullEnd = vecSrc + ( ( vecHullEnd - vecSrc ) * 2 );
UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace );
if ( tmpTrace.flFraction < 1.0 ) if( tmpTrace.flFraction < 1.0 )
{ {
tr = tmpTrace; tr = tmpTrace;
return; return;
} }
for ( i = 0; i < 2; i++ ) for( i = 0; i < 2; i++ )
{ {
for ( j = 0; j < 2; j++ ) for( j = 0; j < 2; j++ )
{ {
for ( k = 0; k < 2; k++ ) for( k = 0; k < 2; k++ )
{ {
vecEnd.x = vecHullEnd.x + minmaxs[i][0]; vecEnd.x = vecHullEnd.x + minmaxs[i][0];
vecEnd.y = vecHullEnd.y + minmaxs[j][1]; vecEnd.y = vecHullEnd.y + minmaxs[j][1];
vecEnd.z = vecHullEnd.z + minmaxs[k][2]; vecEnd.z = vecHullEnd.z + minmaxs[k][2];
UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace );
if ( tmpTrace.flFraction < 1.0 ) if( tmpTrace.flFraction < 1.0 )
{ {
float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); float thisDistance = ( tmpTrace.vecEndPos - vecSrc ).Length();
if ( thisDistance < distance ) if( thisDistance < distance )
{ {
tr = tmpTrace; tr = tmpTrace;
distance = thisDistance; distance = thisDistance;
@ -140,131 +136,130 @@ void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, f
} }
} }
void CCrowbar::PrimaryAttack() void CCrowbar::PrimaryAttack()
{ {
if (! Swing( 1 )) if( !Swing( 1 ) )
{ {
SetThink( &CCrowbar::SwingAgain ); SetThink( &CCrowbar::SwingAgain );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
} }
void CCrowbar::Smack()
void CCrowbar::Smack( )
{ {
DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR );
} }
void CCrowbar::SwingAgain( void ) void CCrowbar::SwingAgain( void )
{ {
Swing( 0 ); Swing( 0 );
} }
int CCrowbar::Swing( int fFirst ) int CCrowbar::Swing( int fFirst )
{ {
int fDidHit = FALSE; int fDidHit = FALSE;
TraceResult tr; TraceResult tr;
UTIL_MakeVectors (m_pPlayer->pev->v_angle); UTIL_MakeVectors( m_pPlayer->pev->v_angle );
Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecEnd = vecSrc + gpGlobals->v_forward * 32; Vector vecEnd = vecSrc + gpGlobals->v_forward * 32;
UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( tr.flFraction >= 1.0 ) if( tr.flFraction >= 1.0 )
{ {
UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr );
if ( tr.flFraction < 1.0 ) if( tr.flFraction < 1.0 )
{ {
// Calculate the point of intersection of the line (or hull) and the object we hit // Calculate the point of intersection of the line (or hull) and the object we hit
// This is and approximation of the "best" intersection // This is and approximation of the "best" intersection
CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit ); CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit );
if ( !pHit || pHit->IsBSPModel() ) if( !pHit || pHit->IsBSPModel() )
FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() ); FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() );
vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space) vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space)
} }
} }
#endif #endif
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
0.0, 0, 0.0 ); 0.0, 0, 0.0 );
if( tr.flFraction >= 1.0 )
if ( tr.flFraction >= 1.0 )
{ {
if (fFirst) if( fFirst )
{ {
// miss // miss
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
} }
} }
else else
{ {
switch( ((m_iSwing++) % 2) + 1 ) switch( ( ( m_iSwing++ ) % 2 ) + 1 )
{ {
case 0: case 0:
SendWeaponAnim( CROWBAR_ATTACK1HIT ); break; SendWeaponAnim( CROWBAR_ATTACK1HIT );
break;
case 1: case 1:
SendWeaponAnim( CROWBAR_ATTACK2HIT ); break; SendWeaponAnim( CROWBAR_ATTACK2HIT );
break;
case 2: case 2:
SendWeaponAnim( CROWBAR_ATTACK3HIT ); break; SendWeaponAnim( CROWBAR_ATTACK3HIT );
break;
} }
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
#ifndef CLIENT_DLL
#ifndef CLIENT_DLL
// hit // hit
fDidHit = TRUE; fDidHit = TRUE;
CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
ClearMultiDamage( ); ClearMultiDamage();
if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() ) if( ( m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
{ {
// first swing does full damage // first swing does full damage
pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB ); pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
} }
else else
{ {
// subsequent swings do half // subsequent swings do half
pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB ); pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
} }
ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
// play thwack, smack, or dong sound // play thwack, smack, or dong sound
float flVol = 1.0; float flVol = 1.0;
int fHitWorld = TRUE; int fHitWorld = TRUE;
if (pEntity) if( pEntity )
{ {
if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) if( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
{ {
// play thwack or smack sound // play thwack or smack sound
switch( RANDOM_LONG(0,2) ) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: case 0:
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM );
break;
case 1: case 1:
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM );
break;
case 2: case 2:
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM );
break;
} }
m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME;
if ( !pEntity->IsAlive() ) if( !pEntity->IsAlive() )
return TRUE; return TRUE;
else else
flVol = 0.1; flVol = 0.1;
fHitWorld = FALSE; fHitWorld = FALSE;
} }
@ -273,11 +268,11 @@ int CCrowbar::Swing( int fFirst )
// play texture hit sound // play texture hit sound
// UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line
if (fHitWorld) if( fHitWorld )
{ {
float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); float fvolbar = TEXTURETYPE_PlaySound( &tr, vecSrc, vecSrc + ( vecEnd - vecSrc ) * 2, BULLET_PLAYER_CROWBAR );
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// override the volume here, cause we don't play texture sounds in multiplayer, // override the volume here, cause we don't play texture sounds in multiplayer,
// and fvolbar is going to be 0 from the above call. // and fvolbar is going to be 0 from the above call.
@ -286,13 +281,13 @@ int CCrowbar::Swing( int fFirst )
} }
// also play crowbar strike // also play crowbar strike
switch( RANDOM_LONG(0,1) ) switch( RANDOM_LONG( 0, 1 ) )
{ {
case 0: case 0:
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG( 0, 3 ) );
break; break;
case 1: case 1:
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG( 0, 3 ) );
break; break;
} }
@ -303,14 +298,9 @@ int CCrowbar::Swing( int fFirst )
m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
#endif #endif
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25;
SetThink( &CCrowbar::Smack ); SetThink( &CCrowbar::Smack );
pev->nextthink = UTIL_WeaponTimeBase() + 0.2; pev->nextthink = UTIL_WeaponTimeBase() + 0.2;
} }
return fDidHit; return fDidHit;
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,16 +18,13 @@
// doors // doors
#define SF_DOOR_ROTATE_Y 0 #define SF_DOOR_ROTATE_Y 0
#define SF_DOOR_START_OPEN 1 #define SF_DOOR_START_OPEN 1
#define SF_DOOR_ROTATE_BACKWARDS 2 #define SF_DOOR_ROTATE_BACKWARDS 2
#define SF_DOOR_PASSABLE 8 #define SF_DOOR_PASSABLE 8
#define SF_DOOR_ONEWAY 16 #define SF_DOOR_ONEWAY 16
#define SF_DOOR_NO_AUTO_RETURN 32 #define SF_DOOR_NO_AUTO_RETURN 32
#define SF_DOOR_ROTATE_Z 64 #define SF_DOOR_ROTATE_Z 64
#define SF_DOOR_ROTATE_X 128 #define SF_DOOR_ROTATE_X 128
#define SF_DOOR_USE_ONLY 256 // door must be opened by player's use button. #define SF_DOOR_USE_ONLY 256 // door must be opened by player's use button.
#define SF_DOOR_NOMONSTERS 512 // Monster can't open #define SF_DOOR_NOMONSTERS 512 // Monster can't open
#define SF_DOOR_SILENT 0x80000000 #define SF_DOOR_SILENT 0x80000000
#endif //DOORS_H #endif //DOORS_H

File diff suppressed because it is too large Load Diff

View File

@ -36,12 +36,12 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int ObjectCaps( void ) int ObjectCaps( void )
{ {
int flags = 0; int flags = 0;
if ( pev->spawnflags & SF_SPRITE_TEMPORARY ) if( pev->spawnflags & SF_SPRITE_TEMPORARY )
flags = FCAP_DONT_SAVE; flags = FCAP_DONT_SAVE;
return (CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | flags; return ( CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION ) | flags;
} }
void EXPORT AnimateThink( void ); void EXPORT AnimateThink( void );
void EXPORT ExpandThink( void ); void EXPORT ExpandThink( void );
@ -52,9 +52,9 @@ public:
inline void SetAttachment( edict_t *pEntity, int attachment ) inline void SetAttachment( edict_t *pEntity, int attachment )
{ {
if ( pEntity ) if( pEntity )
{ {
pev->skin = ENTINDEX(pEntity); pev->skin = ENTINDEX( pEntity );
pev->body = attachment; pev->body = attachment;
pev->aiment = pEntity; pev->aiment = pEntity;
pev->movetype = MOVETYPE_FOLLOW; pev->movetype = MOVETYPE_FOLLOW;
@ -62,7 +62,11 @@ public:
} }
void TurnOff( void ); void TurnOff( void );
void TurnOn( void ); void TurnOn( void );
inline float Frames( void ) { return m_maxFrame; } inline float Frames( void )
{
return m_maxFrame;
}
inline void SetTransparency( int rendermode, int r, int g, int b, int a, int fx ) inline void SetTransparency( int rendermode, int r, int g, int b, int a, int fx )
{ {
pev->rendermode = rendermode; pev->rendermode = rendermode;
@ -72,89 +76,201 @@ public:
pev->renderamt = a; pev->renderamt = a;
pev->renderfx = fx; pev->renderfx = fx;
} }
inline void SetTexture( int spriteIndex ) { pev->modelindex = spriteIndex; }
inline void SetScale( float scale ) { pev->scale = scale; } inline void SetTexture( int spriteIndex )
inline void SetColor( int r, int g, int b ) { pev->rendercolor.x = r; pev->rendercolor.y = g; pev->rendercolor.z = b; } {
inline void SetBrightness( int brightness ) { pev->renderamt = brightness; } pev->modelindex = spriteIndex;
}
inline void SetScale( float scale )
{
pev->scale = scale;
}
inline void SetColor( int r, int g, int b )
{
pev->rendercolor.x = r;
pev->rendercolor.y = g;
pev->rendercolor.z = b;
}
inline void SetBrightness( int brightness )
{
pev->renderamt = brightness;
}
inline void AnimateAndDie( float framerate ) inline void AnimateAndDie( float framerate )
{ {
SetThink( &CSprite::AnimateUntilDead); SetThink( &CSprite::AnimateUntilDead );
pev->framerate = framerate; pev->framerate = framerate;
pev->dmgtime = gpGlobals->time + (m_maxFrame / framerate); pev->dmgtime = gpGlobals->time + ( m_maxFrame / framerate );
pev->nextthink = gpGlobals->time; pev->nextthink = gpGlobals->time;
} }
void EXPORT AnimateUntilDead( void ); void EXPORT AnimateUntilDead( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
static CSprite *SpriteCreate( const char *pSpriteName, const Vector &origin, BOOL animate ); static CSprite *SpriteCreate( const char *pSpriteName, const Vector &origin, BOOL animate );
private: private:
float m_lastTime;
float m_lastTime; float m_maxFrame;
float m_maxFrame;
}; };
class CBeam : public CBaseEntity class CBeam : public CBaseEntity
{ {
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int ObjectCaps( void ) int ObjectCaps( void )
{ {
int flags = 0; int flags = 0;
if ( pev->spawnflags & SF_BEAM_TEMPORARY ) if( pev->spawnflags & SF_BEAM_TEMPORARY )
flags = FCAP_DONT_SAVE; flags = FCAP_DONT_SAVE;
return (CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | flags; return ( CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION ) | flags;
} }
void EXPORT TriggerTouch( CBaseEntity *pOther ); void EXPORT TriggerTouch( CBaseEntity *pOther );
// These functions are here to show the way beams are encoded as entities. // These functions are here to show the way beams are encoded as entities.
// Encoding beams as entities simplifies their management in the client/server architecture // Encoding beams as entities simplifies their management in the client/server architecture
inline void SetType( int type ) { pev->rendermode = (pev->rendermode & 0xF0) | (type&0x0F); } inline void SetType( int type )
inline void SetFlags( int flags ) { pev->rendermode = (pev->rendermode & 0x0F) | (flags&0xF0); } {
inline void SetStartPos( const Vector& pos ) { pev->origin = pos; } pev->rendermode = ( pev->rendermode & 0xF0 ) | ( type & 0x0F );
inline void SetEndPos( const Vector& pos ) { pev->angles = pos; } }
inline void SetFlags( int flags )
{
pev->rendermode = ( pev->rendermode & 0x0F ) | ( flags & 0xF0 );
}
inline void SetStartPos( const Vector& pos )
{
pev->origin = pos;
}
inline void SetEndPos( const Vector& pos )
{
pev->angles = pos;
}
void SetStartEntity( int entityIndex ); void SetStartEntity( int entityIndex );
void SetEndEntity( int entityIndex ); void SetEndEntity( int entityIndex );
inline void SetStartAttachment( int attachment ) { pev->sequence = (pev->sequence & 0x0FFF) | ((attachment&0xF)<<12); } inline void SetStartAttachment( int attachment )
inline void SetEndAttachment( int attachment ) { pev->skin = (pev->skin & 0x0FFF) | ((attachment&0xF)<<12); } {
pev->sequence = ( pev->sequence & 0x0FFF ) | ( ( attachment & 0xF ) << 12 );
}
inline void SetTexture( int spriteIndex ) { pev->modelindex = spriteIndex; } inline void SetEndAttachment( int attachment )
inline void SetWidth( int width ) { pev->scale = width; } {
inline void SetNoise( int amplitude ) { pev->body = amplitude; } pev->skin = ( pev->skin & 0x0FFF ) | ( ( attachment & 0xF ) << 12 );
inline void SetColor( int r, int g, int b ) { pev->rendercolor.x = r; pev->rendercolor.y = g; pev->rendercolor.z = b; } }
inline void SetBrightness( int brightness ) { pev->renderamt = brightness; }
inline void SetFrame( float frame ) { pev->frame = frame; }
inline void SetScrollRate( int speed ) { pev->animtime = speed; }
inline int GetType( void ) { return pev->rendermode & 0x0F; } inline void SetTexture( int spriteIndex )
inline int GetFlags( void ) { return pev->rendermode & 0xF0; } {
inline int GetStartEntity( void ) { return pev->sequence & 0xFFF; } pev->modelindex = spriteIndex;
inline int GetEndEntity( void ) { return pev->skin & 0xFFF; } }
inline void SetWidth( int width )
{
pev->scale = width;
}
inline void SetNoise( int amplitude )
{
pev->body = amplitude;
}
inline void SetColor( int r, int g, int b )
{
pev->rendercolor.x = r;
pev->rendercolor.y = g;
pev->rendercolor.z = b;
}
inline void SetBrightness( int brightness )
{
pev->renderamt = brightness;
}
inline void SetFrame( float frame )
{
pev->frame = frame;
}
inline void SetScrollRate( int speed )
{
pev->animtime = speed;
}
inline int GetType( void )
{
return pev->rendermode & 0x0F;
}
inline int GetFlags( void )
{
return pev->rendermode & 0xF0;
}
inline int GetStartEntity( void )
{
return pev->sequence & 0xFFF;
}
inline int GetEndEntity( void )
{
return pev->skin & 0xFFF;
}
const Vector &GetStartPos( void ); const Vector &GetStartPos( void );
const Vector &GetEndPos( void ); const Vector &GetEndPos( void );
Vector Center( void ) { return (GetStartPos() + GetEndPos()) * 0.5; }; // center point of beam Vector Center( void ) { return (GetStartPos() + GetEndPos()) * 0.5; }; // center point of beam
inline int GetTexture( void ) { return pev->modelindex; } inline int GetTexture( void )
inline int GetWidth( void ) { return pev->scale; } {
inline int GetNoise( void ) { return pev->body; } return pev->modelindex;
// inline void GetColor( int r, int g, int b ) { pev->rendercolor.x = r; pev->rendercolor.y = g; pev->rendercolor.z = b; } }
inline int GetBrightness( void ) { return pev->renderamt; }
inline int GetFrame( void ) { return pev->frame; } inline int GetWidth( void )
inline int GetScrollRate( void ) { return pev->animtime; } {
return pev->scale;
}
inline int GetNoise( void )
{
return pev->body;
}
/* inline void GetColor( int r, int g, int b )
{
pev->rendercolor.x = r;
pev->rendercolor.y = g;
pev->rendercolor.z = b;
}*/
inline int GetBrightness( void )
{
return pev->renderamt;
}
inline int GetFrame( void )
{
return pev->frame;
}
inline int GetScrollRate( void )
{
return pev->animtime;
}
// Call after you change start/end positions // Call after you change start/end positions
void RelinkBeam( void ); void RelinkBeam( void );
// void SetObjectCollisionBox( void ); //void SetObjectCollisionBox( void );
void DoSparks( const Vector &start, const Vector &end ); void DoSparks( const Vector &start, const Vector &end );
CBaseEntity *RandomTargetname( const char *szName ); CBaseEntity *RandomTargetname( const char *szName );
@ -168,20 +284,23 @@ public:
static CBeam *BeamCreate( const char *pSpriteName, int width ); static CBeam *BeamCreate( const char *pSpriteName, int width );
inline void LiveForTime( float time ) { SetThink( &CBaseEntity::SUB_Remove); pev->nextthink = gpGlobals->time + time; } inline void LiveForTime( float time )
inline void BeamDamageInstant( TraceResult *ptr, float damage ) {
SetThink( &CBaseEntity::SUB_Remove );
pev->nextthink = gpGlobals->time + time;
}
inline void BeamDamageInstant( TraceResult *ptr, float damage )
{ {
pev->dmg = damage; pev->dmg = damage;
pev->dmgtime = gpGlobals->time - 1; pev->dmgtime = gpGlobals->time - 1;
BeamDamage(ptr); BeamDamage( ptr );
} }
}; };
#define SF_MESSAGE_ONCE 0x0001 // Fade in, not out #define SF_MESSAGE_ONCE 0x0001 // Fade in, not out
#define SF_MESSAGE_ALL 0x0002 // Send to all clients #define SF_MESSAGE_ALL 0x0002 // Send to all clients
class CLaser : public CBeam class CLaser : public CBeam
{ {
public: public:
@ -191,7 +310,7 @@ public:
void TurnOn( void ); void TurnOn( void );
void TurnOff( void ); void TurnOff( void );
int IsOn( void ); int IsOn( void );
void FireAtPoint( TraceResult &point ); void FireAtPoint( TraceResult &point );
@ -202,8 +321,7 @@ public:
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
CSprite *m_pSprite; CSprite *m_pSprite;
int m_iszSpriteName; int m_iszSpriteName;
Vector m_firePosition; Vector m_firePosition;
}; };
#endif //EFFECTS_H #endif //EFFECTS_H

View File

@ -51,11 +51,11 @@ enum egon_e {
LINK_ENTITY_TO_CLASS( weapon_egon, CEgon ) LINK_ENTITY_TO_CLASS( weapon_egon, CEgon )
void CEgon::Spawn( ) void CEgon::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_EGON; m_iId = WEAPON_EGON;
SET_MODEL(ENT(pev), "models/w_egon.mdl"); SET_MODEL( ENT( pev ), "models/w_egon.mdl" );
m_iDefaultAmmo = EGON_DEFAULT_GIVE; m_iDefaultAmmo = EGON_DEFAULT_GIVE;
@ -64,12 +64,12 @@ void CEgon::Spawn( )
void CEgon::Precache( void ) void CEgon::Precache( void )
{ {
PRECACHE_MODEL("models/w_egon.mdl"); PRECACHE_MODEL( "models/w_egon.mdl" );
PRECACHE_MODEL("models/v_egon.mdl"); PRECACHE_MODEL( "models/v_egon.mdl" );
PRECACHE_MODEL("models/p_egon.mdl"); PRECACHE_MODEL( "models/p_egon.mdl" );
PRECACHE_MODEL("models/w_9mmclip.mdl"); PRECACHE_MODEL( "models/w_9mmclip.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
PRECACHE_SOUND( EGON_SOUND_OFF ); PRECACHE_SOUND( EGON_SOUND_OFF );
PRECACHE_SOUND( EGON_SOUND_RUN ); PRECACHE_SOUND( EGON_SOUND_RUN );
@ -78,13 +78,12 @@ void CEgon::Precache( void )
PRECACHE_MODEL( EGON_BEAM_SPRITE ); PRECACHE_MODEL( EGON_BEAM_SPRITE );
PRECACHE_MODEL( EGON_FLARE_SPRITE ); PRECACHE_MODEL( EGON_FLARE_SPRITE );
PRECACHE_SOUND ("weapons/357_cock1.wav"); PRECACHE_SOUND( "weapons/357_cock1.wav" );
m_usEgonFire = PRECACHE_EVENT ( 1, "events/egon_fire.sc" ); m_usEgonFire = PRECACHE_EVENT( 1, "events/egon_fire.sc" );
m_usEgonStop = PRECACHE_EVENT ( 1, "events/egon_stop.sc" ); m_usEgonStop = PRECACHE_EVENT( 1, "events/egon_stop.sc" );
} }
BOOL CEgon::Deploy( void ) BOOL CEgon::Deploy( void )
{ {
m_deployed = FALSE; m_deployed = FALSE;
@ -94,7 +93,7 @@ BOOL CEgon::Deploy( void )
int CEgon::AddToPlayer( CBasePlayer *pPlayer ) int CEgon::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -104,19 +103,17 @@ int CEgon::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
void CEgon::Holster( int skiplocal /* = 0 */ ) void CEgon::Holster( int skiplocal /* = 0 */ )
{ {
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
SendWeaponAnim( EGON_HOLSTER ); SendWeaponAnim( EGON_HOLSTER );
EndAttack(); EndAttack();
} }
int CEgon::GetItemInfo(ItemInfo *p) int CEgon::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "uranium"; p->pszAmmo1 = "uranium";
p->iMaxAmmo1 = URANIUM_MAX_CARRY; p->iMaxAmmo1 = URANIUM_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -131,7 +128,7 @@ int CEgon::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
#define EGON_PULSE_INTERVAL 0.1 #define EGON_PULSE_INTERVAL 0.1
#define EGON_DISCHARGE_INTERVAL 0.1 #define EGON_DISCHARGE_INTERVAL 0.1
float CEgon::GetPulseInterval( void ) float CEgon::GetPulseInterval( void )
@ -146,7 +143,7 @@ float CEgon::GetDischargeInterval( void )
BOOL CEgon::HasAmmo( void ) BOOL CEgon::HasAmmo( void )
{ {
if ( m_pPlayer->ammo_uranium <= 0 ) if( m_pPlayer->ammo_uranium <= 0 )
return FALSE; return FALSE;
return TRUE; return TRUE;
@ -154,7 +151,7 @@ BOOL CEgon::HasAmmo( void )
void CEgon::UseAmmo( int count ) void CEgon::UseAmmo( int count )
{ {
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= count ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= count )
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= count; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= count;
else else
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] = 0; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] = 0;
@ -163,23 +160,22 @@ void CEgon::UseAmmo( int count )
void CEgon::Attack( void ) void CEgon::Attack( void )
{ {
// don't fire underwater // don't fire underwater
if ( m_pPlayer->pev->waterlevel == 3 ) if( m_pPlayer->pev->waterlevel == 3 )
{ {
if( m_fireState != FIRE_OFF || m_pBeam )
if ( m_fireState != FIRE_OFF || m_pBeam )
{ {
EndAttack(); EndAttack();
} }
else else
{ {
PlayEmptySound( ); PlayEmptySound();
} }
return; return;
} }
UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
Vector vecAiming = gpGlobals->v_forward; Vector vecAiming = gpGlobals->v_forward;
Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecSrc = m_pPlayer->GetGunPosition();
int flags; int flags;
#if defined( CLIENT_WEAPONS ) #if defined( CLIENT_WEAPONS )
@ -192,7 +188,7 @@ void CEgon::Attack( void )
{ {
case FIRE_OFF: case FIRE_OFF:
{ {
if ( !HasAmmo() ) if( !HasAmmo() )
{ {
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25; m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25;
PlayEmptySound( ); PlayEmptySound( );
@ -202,37 +198,35 @@ void CEgon::Attack( void )
m_flAmmoUseTime = gpGlobals->time;// start using ammo ASAP. m_flAmmoUseTime = gpGlobals->time;// start using ammo ASAP.
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 );
m_shakeTime = 0; m_shakeTime = 0;
m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME; m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1;
pev->fuser1 = UTIL_WeaponTimeBase() + 2; pev->fuser1 = UTIL_WeaponTimeBase() + 2;
pev->dmgtime = gpGlobals->time + GetPulseInterval(); pev->dmgtime = gpGlobals->time + GetPulseInterval();
m_fireState = FIRE_CHARGE; m_fireState = FIRE_CHARGE;
break;
} }
break;
case FIRE_CHARGE: case FIRE_CHARGE:
{ {
Fire( vecSrc, vecAiming ); Fire( vecSrc, vecAiming );
m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME; m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME;
if ( pev->fuser1 <= UTIL_WeaponTimeBase() ) if( pev->fuser1 <= UTIL_WeaponTimeBase() )
{ {
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 );
pev->fuser1 = 1000; pev->fuser1 = 1000;
} }
if ( !HasAmmo() ) if( !HasAmmo() )
{ {
EndAttack(); EndAttack();
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
} }
break;
} }
break;
} }
} }
@ -240,13 +234,12 @@ void CEgon::PrimaryAttack( void )
{ {
m_fireMode = FIRE_WIDE; m_fireMode = FIRE_WIDE;
Attack(); Attack();
} }
void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir ) void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
{ {
Vector vecDest = vecOrigSrc + vecDir * 2048; Vector vecDest = vecOrigSrc + vecDir * 2048;
edict_t *pentIgnore; edict_t *pentIgnore;
TraceResult tr; TraceResult tr;
pentIgnore = m_pPlayer->edict(); pentIgnore = m_pPlayer->edict();
@ -256,22 +249,22 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
UTIL_TraceLine( vecOrigSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr ); UTIL_TraceLine( vecOrigSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr );
if (tr.fAllSolid) if( tr.fAllSolid )
return; return;
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
if (pEntity == NULL) if( pEntity == NULL )
return; return;
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
if ( m_pSprite && pEntity->pev->takedamage ) if( m_pSprite && pEntity->pev->takedamage )
{ {
m_pSprite->pev->effects &= ~EF_NODRAW; m_pSprite->pev->effects &= ~EF_NODRAW;
} }
else if ( m_pSprite ) else if( m_pSprite )
{ {
m_pSprite->pev->effects |= EF_NODRAW; m_pSprite->pev->effects |= EF_NODRAW;
} }
@ -279,24 +272,24 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
#endif #endif
float timedist; float timedist;
switch ( m_fireMode ) switch( m_fireMode )
{ {
case FIRE_NARROW: case FIRE_NARROW:
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( pev->dmgtime < gpGlobals->time ) if( pev->dmgtime < gpGlobals->time )
{ {
// Narrow mode only does damage to the entity it hits // Narrow mode only does damage to the entity it hits
ClearMultiDamage(); ClearMultiDamage();
if (pEntity->pev->takedamage) if( pEntity->pev->takedamage )
{ {
pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgEgonNarrow, vecDir, &tr, DMG_ENERGYBEAM ); pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgEgonNarrow, vecDir, &tr, DMG_ENERGYBEAM );
} }
ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// multiplayer uses 1 ammo every 1/10th second // multiplayer uses 1 ammo every 1/10th second
if ( gpGlobals->time >= m_flAmmoUseTime ) if( gpGlobals->time >= m_flAmmoUseTime )
{ {
UseAmmo( 1 ); UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.1; m_flAmmoUseTime = gpGlobals->time + 0.1;
@ -305,7 +298,7 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
else else
{ {
// single player, use 3 ammo/second // single player, use 3 ammo/second
if ( gpGlobals->time >= m_flAmmoUseTime ) if( gpGlobals->time >= m_flAmmoUseTime )
{ {
UseAmmo( 1 ); UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.166; m_flAmmoUseTime = gpGlobals->time + 0.166;
@ -317,32 +310,31 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
#endif #endif
timedist = ( pev->dmgtime - gpGlobals->time ) / GetPulseInterval(); timedist = ( pev->dmgtime - gpGlobals->time ) / GetPulseInterval();
break; break;
case FIRE_WIDE: case FIRE_WIDE:
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( pev->dmgtime < gpGlobals->time ) if( pev->dmgtime < gpGlobals->time )
{ {
// wide mode does damage to the ent, and radius damage // wide mode does damage to the ent, and radius damage
ClearMultiDamage(); ClearMultiDamage();
if (pEntity->pev->takedamage) if( pEntity->pev->takedamage )
{ {
pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgEgonWide, vecDir, &tr, DMG_ENERGYBEAM | DMG_ALWAYSGIB); pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgEgonWide, vecDir, &tr, DMG_ENERGYBEAM | DMG_ALWAYSGIB );
} }
ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// radius damage a little more potent in multiplayer. // radius damage a little more potent in multiplayer.
::RadiusDamage( tr.vecEndPos, pev, m_pPlayer->pev, gSkillData.plrDmgEgonWide/4, 128, CLASS_NONE, DMG_ENERGYBEAM | DMG_BLAST | DMG_ALWAYSGIB ); ::RadiusDamage( tr.vecEndPos, pev, m_pPlayer->pev, gSkillData.plrDmgEgonWide/4, 128, CLASS_NONE, DMG_ENERGYBEAM | DMG_BLAST | DMG_ALWAYSGIB );
} }
if ( !m_pPlayer->IsAlive() ) if( !m_pPlayer->IsAlive() )
return; return;
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
//multiplayer uses 5 ammo/second //multiplayer uses 5 ammo/second
if ( gpGlobals->time >= m_flAmmoUseTime ) if( gpGlobals->time >= m_flAmmoUseTime )
{ {
UseAmmo( 1 ); UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.2; m_flAmmoUseTime = gpGlobals->time + 0.2;
@ -351,7 +343,7 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
else else
{ {
// Wide mode uses 10 charges per second in single player // Wide mode uses 10 charges per second in single player
if ( gpGlobals->time >= m_flAmmoUseTime ) if( gpGlobals->time >= m_flAmmoUseTime )
{ {
UseAmmo( 1 ); UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.1; m_flAmmoUseTime = gpGlobals->time + 0.1;
@ -359,7 +351,7 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
} }
pev->dmgtime = gpGlobals->time + GetDischargeInterval(); pev->dmgtime = gpGlobals->time + GetDischargeInterval();
if ( m_shakeTime < gpGlobals->time ) if( m_shakeTime < gpGlobals->time )
{ {
UTIL_ScreenShake( tr.vecEndPos, 5.0, 150.0, 0.75, 250.0 ); UTIL_ScreenShake( tr.vecEndPos, 5.0, 150.0, 0.75, 250.0 );
m_shakeTime = gpGlobals->time + 1.5; m_shakeTime = gpGlobals->time + 1.5;
@ -370,37 +362,35 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
break; break;
} }
if ( timedist < 0 ) if( timedist < 0 )
timedist = 0; timedist = 0;
else if ( timedist > 1 ) else if( timedist > 1 )
timedist = 1; timedist = 1;
timedist = 1-timedist; timedist = 1 - timedist;
UpdateEffect( tmpSrc, tr.vecEndPos, timedist ); UpdateEffect( tmpSrc, tr.vecEndPos, timedist );
} }
void CEgon::UpdateEffect( const Vector &startPoint, const Vector &endPoint, float timeBlend ) void CEgon::UpdateEffect( const Vector &startPoint, const Vector &endPoint, float timeBlend )
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( !m_pBeam ) if( !m_pBeam )
{ {
CreateEffect(); CreateEffect();
} }
m_pBeam->SetStartPos( endPoint ); m_pBeam->SetStartPos( endPoint );
m_pBeam->SetBrightness( 255 - (timeBlend*180) ); m_pBeam->SetBrightness( 255 - ( timeBlend * 180 ) );
m_pBeam->SetWidth( 40 - (timeBlend*20) ); m_pBeam->SetWidth( 40 - ( timeBlend * 20 ) );
if ( m_fireMode == FIRE_WIDE ) if( m_fireMode == FIRE_WIDE )
m_pBeam->SetColor( 30 + (25*timeBlend), 30 + (30*timeBlend), 64 + 80*fabs(sin(gpGlobals->time*10)) ); m_pBeam->SetColor( 30 + ( 25 * timeBlend ), 30 + ( 30 * timeBlend ), 64 + 80 * fabs( sin( gpGlobals->time * 10 ) ) );
else else
m_pBeam->SetColor( 60 + (25*timeBlend), 120 + (30*timeBlend), 64 + 80*fabs(sin(gpGlobals->time*10)) ); m_pBeam->SetColor( 60 + ( 25 * timeBlend ), 120 + ( 30 * timeBlend ), 64 + 80 * fabs( sin( gpGlobals->time *10 ) ) );
UTIL_SetOrigin( m_pSprite->pev, endPoint ); UTIL_SetOrigin( m_pSprite->pev, endPoint );
m_pSprite->pev->frame += 8 * gpGlobals->frametime; m_pSprite->pev->frame += 8 * gpGlobals->frametime;
if ( m_pSprite->pev->frame > m_pSprite->Frames() ) if( m_pSprite->pev->frame > m_pSprite->Frames() )
m_pSprite->pev->frame = 0; m_pSprite->pev->frame = 0;
m_pNoise->SetStartPos( endPoint ); m_pNoise->SetStartPos( endPoint );
@ -436,7 +426,7 @@ void CEgon::CreateEffect( void )
m_pSprite->pev->flags |= FL_SKIPLOCALHOST; m_pSprite->pev->flags |= FL_SKIPLOCALHOST;
m_pSprite->pev->owner = m_pPlayer->edict(); m_pSprite->pev->owner = m_pPlayer->edict();
if ( m_fireMode == FIRE_WIDE ) if( m_fireMode == FIRE_WIDE )
{ {
m_pBeam->SetScrollRate( 50 ); m_pBeam->SetScrollRate( 50 );
m_pBeam->SetNoise( 20 ); m_pBeam->SetNoise( 20 );
@ -455,21 +445,21 @@ void CEgon::CreateEffect( void )
void CEgon::DestroyEffect( void ) void CEgon::DestroyEffect( void )
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( m_pBeam ) if( m_pBeam )
{ {
UTIL_Remove( m_pBeam ); UTIL_Remove( m_pBeam );
m_pBeam = NULL; m_pBeam = NULL;
} }
if ( m_pNoise )
if( m_pNoise )
{ {
UTIL_Remove( m_pNoise ); UTIL_Remove( m_pNoise );
m_pNoise = NULL; m_pNoise = NULL;
} }
if ( m_pSprite ) if( m_pSprite )
{ {
if ( m_fireMode == FIRE_WIDE ) if( m_fireMode == FIRE_WIDE )
m_pSprite->Expand( 10, 500 ); m_pSprite->Expand( 10, 500 );
else else
UTIL_Remove( m_pSprite ); UTIL_Remove( m_pSprite );
@ -480,19 +470,19 @@ void CEgon::DestroyEffect( void )
void CEgon::WeaponIdle( void ) void CEgon::WeaponIdle( void )
{ {
ResetEmptySound( ); ResetEmptySound();
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
if ( m_fireState != FIRE_OFF ) if( m_fireState != FIRE_OFF )
EndAttack(); EndAttack();
int iAnim; int iAnim;
float flRand = RANDOM_FLOAT(0,1); float flRand = RANDOM_FLOAT( 0, 1 );
if ( flRand <= 0.5 ) if( flRand <= 0.5 )
{ {
iAnim = EGON_IDLE1; iAnim = EGON_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
@ -507,13 +497,11 @@ void CEgon::WeaponIdle( void )
m_deployed = TRUE; m_deployed = TRUE;
} }
void CEgon::EndAttack( void ) void CEgon::EndAttack( void )
{ {
bool bMakeNoise = false; bool bMakeNoise = false;
if ( m_fireState != FIRE_OFF ) //Checking the button just in case!. if( m_fireState != FIRE_OFF ) //Checking the button just in case!.
bMakeNoise = true; bMakeNoise = true;
PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 ); PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 );
@ -526,31 +514,31 @@ void CEgon::EndAttack( void )
DestroyEffect(); DestroyEffect();
} }
class CEgonAmmo : public CBasePlayerAmmo class CEgonAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_chainammo.mdl"); SET_MODEL( ENT( pev ), "models/w_chainammo.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_chainammo.mdl"); PRECACHE_MODEL( "models/w_chainammo.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther )
{ BOOL AddAmmo( CBaseEntity *pOther )
if (pOther->GiveAmmo( AMMO_URANIUMBOX_GIVE, "uranium", URANIUM_MAX_CARRY ) != -1) {
if( pOther->GiveAmmo( AMMO_URANIUMBOX_GIVE, "uranium", URANIUM_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
}; };
LINK_ENTITY_TO_CLASS( ammo_egonclip, CEgonAmmo )
LINK_ENTITY_TO_CLASS( ammo_egonclip, CEgonAmmo )
#endif #endif

View File

@ -69,7 +69,8 @@ extern enginefuncs_t g_engfuncs;
#define RANDOM_FLOAT (*g_engfuncs.pfnRandomFloat) #define RANDOM_FLOAT (*g_engfuncs.pfnRandomFloat)
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) #define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
inline void MESSAGE_BEGIN( int msg_dest, int msg_type, const float *pOrigin = NULL, edict_t *ed = NULL ) { inline void MESSAGE_BEGIN( int msg_dest, int msg_type, const float *pOrigin = NULL, edict_t *ed = NULL )
{
(*g_engfuncs.pfnMessageBegin)(msg_dest, msg_type, pOrigin, ed); (*g_engfuncs.pfnMessageBegin)(msg_dest, msg_type, pOrigin, ed);
} }
#define MESSAGE_END (*g_engfuncs.pfnMessageEnd) #define MESSAGE_END (*g_engfuncs.pfnMessageEnd)
@ -90,9 +91,10 @@ inline void MESSAGE_BEGIN( int msg_dest, int msg_type, const float *pOrigin = NU
#define ALERT (*g_engfuncs.pfnAlertMessage) #define ALERT (*g_engfuncs.pfnAlertMessage)
#define ENGINE_FPRINTF (*g_engfuncs.pfnEngineFprintf) #define ENGINE_FPRINTF (*g_engfuncs.pfnEngineFprintf)
#define ALLOC_PRIVATE (*g_engfuncs.pfnPvAllocEntPrivateData) #define ALLOC_PRIVATE (*g_engfuncs.pfnPvAllocEntPrivateData)
inline void *GET_PRIVATE( edict_t *pent ) inline void *GET_PRIVATE( edict_t *pent )
{ {
if ( pent ) if( pent )
return pent->pvPrivateData; return pent->pvPrivateData;
return NULL; return NULL;
} }
@ -155,4 +157,4 @@ inline void *GET_PRIVATE( edict_t *pent )
#define PLAYER_CNX_STATS ( *g_engfuncs.pfnGetPlayerStats ) #define PLAYER_CNX_STATS ( *g_engfuncs.pfnGetPlayerStats )
#endif //ENGINECALLBACK_H #endif //ENGINECALLBACK_H

View File

@ -39,9 +39,9 @@ LINK_ENTITY_TO_CLASS( spark_shower, CShower )
void CShower::Spawn( void ) void CShower::Spawn( void )
{ {
pev->velocity = RANDOM_FLOAT( 200, 300 ) * pev->angles; pev->velocity = RANDOM_FLOAT( 200, 300 ) * pev->angles;
pev->velocity.x += RANDOM_FLOAT(-100.f,100.f); pev->velocity.x += RANDOM_FLOAT( -100.f, 100.f );
pev->velocity.y += RANDOM_FLOAT(-100.f,100.f); pev->velocity.y += RANDOM_FLOAT( -100.f, 100.f );
if ( pev->velocity.z >= 0 ) if( pev->velocity.z >= 0 )
pev->velocity.z += 200; pev->velocity.z += 200;
else else
pev->velocity.z -= 200; pev->velocity.z -= 200;
@ -49,8 +49,8 @@ void CShower::Spawn( void )
pev->gravity = 0.5; pev->gravity = 0.5;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
SET_MODEL( edict(), "models/grenade.mdl"); // Need a model, just use the grenade, we don't draw it anyway SET_MODEL( edict(), "models/grenade.mdl" ); // Need a model, just use the grenade, we don't draw it anyway
UTIL_SetSize(pev, g_vecZero, g_vecZero ); UTIL_SetSize( pev, g_vecZero, g_vecZero );
pev->effects |= EF_NODRAW; pev->effects |= EF_NODRAW;
pev->speed = RANDOM_FLOAT( 0.5, 1.5 ); pev->speed = RANDOM_FLOAT( 0.5, 1.5 );
@ -62,7 +62,7 @@ void CShower::Think( void )
UTIL_Sparks( pev->origin ); UTIL_Sparks( pev->origin );
pev->speed -= 0.1; pev->speed -= 0.1;
if ( pev->speed > 0 ) if( pev->speed > 0 )
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
else else
UTIL_Remove( this ); UTIL_Remove( this );
@ -71,32 +71,32 @@ void CShower::Think( void )
void CShower::Touch( CBaseEntity *pOther ) void CShower::Touch( CBaseEntity *pOther )
{ {
if ( pev->flags & FL_ONGROUND ) if( pev->flags & FL_ONGROUND )
pev->velocity = pev->velocity * 0.1; pev->velocity = pev->velocity * 0.1;
else else
pev->velocity = pev->velocity * 0.6; pev->velocity = pev->velocity * 0.6;
if ( (pev->velocity.x*pev->velocity.x+pev->velocity.y*pev->velocity.y) < 10.0 ) if( ( pev->velocity.x * pev->velocity.x + pev->velocity.y * pev->velocity.y ) < 10.0 )
pev->speed = 0; pev->speed = 0;
} }
class CEnvExplosion : public CBaseMonster class CEnvExplosion : public CBaseMonster
{ {
public: public:
void Spawn( ); void Spawn();
void EXPORT Smoke ( void ); void EXPORT Smoke( void );
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int m_iMagnitude;// how large is the fireball? how much damage? int m_iMagnitude;// how large is the fireball? how much damage?
int m_spriteScale; // what's the exact fireball sprite scale? int m_spriteScale; // what's the exact fireball sprite scale?
}; };
TYPEDESCRIPTION CEnvExplosion::m_SaveData[] = TYPEDESCRIPTION CEnvExplosion::m_SaveData[] =
{ {
DEFINE_FIELD( CEnvExplosion, m_iMagnitude, FIELD_INTEGER ), DEFINE_FIELD( CEnvExplosion, m_iMagnitude, FIELD_INTEGER ),
DEFINE_FIELD( CEnvExplosion, m_spriteScale, FIELD_INTEGER ), DEFINE_FIELD( CEnvExplosion, m_spriteScale, FIELD_INTEGER ),
@ -107,9 +107,9 @@ LINK_ENTITY_TO_CLASS( env_explosion, CEnvExplosion )
void CEnvExplosion::KeyValue( KeyValueData *pkvd ) void CEnvExplosion::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "iMagnitude")) if( FStrEq( pkvd->szKeyName, "iMagnitude" ) )
{ {
m_iMagnitude = atoi(pkvd->szValue); m_iMagnitude = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -123,22 +123,22 @@ void CEnvExplosion::Spawn( void )
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
/* /*
if ( m_iMagnitude > 250 ) if( m_iMagnitude > 250 )
{ {
m_iMagnitude = 250; m_iMagnitude = 250;
} }
*/ */
float flSpriteScale; float flSpriteScale;
flSpriteScale = ( m_iMagnitude - 50) * 0.6; flSpriteScale = ( m_iMagnitude - 50 ) * 0.6;
/* /*
if ( flSpriteScale > 50 ) if( flSpriteScale > 50 )
{ {
flSpriteScale = 50; flSpriteScale = 50;
} }
*/ */
if ( flSpriteScale < 10 ) if( flSpriteScale < 10 )
{ {
flSpriteScale = 10; flSpriteScale = 10;
} }
@ -153,16 +153,16 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
pev->model = iStringNull;//invisible pev->model = iStringNull;//invisible
pev->solid = SOLID_NOT;// intangible pev->solid = SOLID_NOT;// intangible
Vector vecSpot;// trace starts here! Vector vecSpot;// trace starts here!
vecSpot = pev->origin + Vector( 0, 0, 8 );
UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -40 ), ignore_monsters, ENT( pev ), &tr );
vecSpot = pev->origin + Vector ( 0 , 0 , 8 );
UTIL_TraceLine ( vecSpot, vecSpot + Vector ( 0, 0, -40 ), ignore_monsters, ENT(pev), & tr);
// Pull out of the wall a bit // Pull out of the wall a bit
if ( tr.flFraction != 1.0 ) if( tr.flFraction != 1.0 )
{ {
pev->origin = tr.vecEndPos + (tr.vecPlaneNormal * (m_iMagnitude - 24) * 0.6); pev->origin = tr.vecEndPos + ( tr.vecPlaneNormal * ( m_iMagnitude - 24 ) * 0.6 );
} }
else else
{ {
@ -170,9 +170,9 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
} }
// draw decal // draw decal
if (! ( pev->spawnflags & SF_ENVEXPLOSION_NODECAL)) if( !( pev->spawnflags & SF_ENVEXPLOSION_NODECAL ) )
{ {
if ( RANDOM_FLOAT( 0 , 1 ) < 0.5 ) if( RANDOM_FLOAT( 0, 1 ) < 0.5 )
{ {
UTIL_DecalTrace( &tr, DECAL_SCORCH1 ); UTIL_DecalTrace( &tr, DECAL_SCORCH1 );
} }
@ -183,7 +183,7 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
} }
// draw fireball // draw fireball
if ( !( pev->spawnflags & SF_ENVEXPLOSION_NOFIREBALL ) ) if( !( pev->spawnflags & SF_ENVEXPLOSION_NOFIREBALL ) )
{ {
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION); WRITE_BYTE( TE_EXPLOSION);
@ -192,39 +192,39 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexFireball ); WRITE_SHORT( g_sModelIndexFireball );
WRITE_BYTE( (BYTE)m_spriteScale ); // scale * 10 WRITE_BYTE( (BYTE)m_spriteScale ); // scale * 10
WRITE_BYTE( 15 ); // framerate WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE ); WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END(); MESSAGE_END();
} }
else else
{ {
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION); WRITE_BYTE( TE_EXPLOSION );
WRITE_COORD( pev->origin.x ); WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexFireball ); WRITE_SHORT( g_sModelIndexFireball );
WRITE_BYTE( 0 ); // no sprite WRITE_BYTE( 0 ); // no sprite
WRITE_BYTE( 15 ); // framerate WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE ); WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END(); MESSAGE_END();
} }
// do damage // do damage
if ( !( pev->spawnflags & SF_ENVEXPLOSION_NODAMAGE ) ) if( !( pev->spawnflags & SF_ENVEXPLOSION_NODAMAGE ) )
{ {
RadiusDamage ( pev, pev, m_iMagnitude, CLASS_NONE, DMG_BLAST ); RadiusDamage( pev, pev, m_iMagnitude, CLASS_NONE, DMG_BLAST );
} }
SetThink( &CEnvExplosion::Smoke ); SetThink( &CEnvExplosion::Smoke );
pev->nextthink = gpGlobals->time + 0.3; pev->nextthink = gpGlobals->time + 0.3;
// draw sparks // draw sparks
if ( !( pev->spawnflags & SF_ENVEXPLOSION_NOSPARKS ) ) if( !( pev->spawnflags & SF_ENVEXPLOSION_NOSPARKS ) )
{ {
int sparkCount = RANDOM_LONG(0,3); int sparkCount = RANDOM_LONG( 0, 3 );
for ( int i = 0; i < sparkCount; i++ ) for( int i = 0; i < sparkCount; i++ )
{ {
Create( "spark_shower", pev->origin, tr.vecPlaneNormal, NULL ); Create( "spark_shower", pev->origin, tr.vecPlaneNormal, NULL );
} }
@ -233,7 +233,7 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
void CEnvExplosion::Smoke( void ) void CEnvExplosion::Smoke( void )
{ {
if ( !( pev->spawnflags & SF_ENVEXPLOSION_NOSMOKE ) ) if( !( pev->spawnflags & SF_ENVEXPLOSION_NOSMOKE ) )
{ {
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_SMOKE ); WRITE_BYTE( TE_SMOKE );
@ -242,11 +242,11 @@ void CEnvExplosion::Smoke( void )
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( (BYTE)m_spriteScale ); // scale * 10 WRITE_BYTE( (BYTE)m_spriteScale ); // scale * 10
WRITE_BYTE( 12 ); // framerate WRITE_BYTE( 12 ); // framerate
MESSAGE_END(); MESSAGE_END();
} }
if ( !(pev->spawnflags & SF_ENVEXPLOSION_REPEATABLE) ) if( !( pev->spawnflags & SF_ENVEXPLOSION_REPEATABLE ) )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
} }
@ -255,15 +255,15 @@ void CEnvExplosion::Smoke( void )
// HACKHACK -- create one of these and fake a keyvalue to get the right explosion setup // HACKHACK -- create one of these and fake a keyvalue to get the right explosion setup
void ExplosionCreate( const Vector &center, const Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage ) void ExplosionCreate( const Vector &center, const Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage )
{ {
KeyValueData kvd; KeyValueData kvd;
char buf[128]; char buf[128];
CBaseEntity *pExplosion = CBaseEntity::Create( "env_explosion", center, angles, pOwner ); CBaseEntity *pExplosion = CBaseEntity::Create( "env_explosion", center, angles, pOwner );
sprintf( buf, "%3d", magnitude ); sprintf( buf, "%3d", magnitude );
kvd.szKeyName = "iMagnitude"; kvd.szKeyName = "iMagnitude";
kvd.szValue = buf; kvd.szValue = buf;
pExplosion->KeyValue( &kvd ); pExplosion->KeyValue( &kvd );
if ( !doDamage ) if( !doDamage )
pExplosion->pev->spawnflags |= SF_ENVEXPLOSION_NODAMAGE; pExplosion->pev->spawnflags |= SF_ENVEXPLOSION_NODAMAGE;
pExplosion->Spawn(); pExplosion->Spawn();

View File

@ -15,7 +15,6 @@
#ifndef EXPLODE_H #ifndef EXPLODE_H
#define EXPLODE_H #define EXPLODE_H
#define SF_ENVEXPLOSION_NODAMAGE ( 1 << 0 ) // when set, ENV_EXPLOSION will not actually inflict damage #define SF_ENVEXPLOSION_NODAMAGE ( 1 << 0 ) // when set, ENV_EXPLOSION will not actually inflict damage
#define SF_ENVEXPLOSION_REPEATABLE ( 1 << 1 ) // can this entity be refired? #define SF_ENVEXPLOSION_REPEATABLE ( 1 << 1 ) // can this entity be refired?
#define SF_ENVEXPLOSION_NOFIREBALL ( 1 << 2 ) // don't draw the fireball #define SF_ENVEXPLOSION_NOFIREBALL ( 1 << 2 ) // don't draw the fireball
@ -23,10 +22,8 @@
#define SF_ENVEXPLOSION_NODECAL ( 1 << 4 ) // don't make a scorch mark #define SF_ENVEXPLOSION_NODECAL ( 1 << 4 ) // don't make a scorch mark
#define SF_ENVEXPLOSION_NOSPARKS ( 1 << 5 ) // don't make a scorch mark #define SF_ENVEXPLOSION_NOSPARKS ( 1 << 5 ) // don't make a scorch mark
extern DLL_GLOBAL short g_sModelIndexFireball; extern DLL_GLOBAL short g_sModelIndexFireball;
extern DLL_GLOBAL short g_sModelIndexSmoke; extern DLL_GLOBAL short g_sModelIndexSmoke;
extern void ExplosionCreate( const Vector &center, const Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage ); extern void ExplosionCreate( const Vector &center, const Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage );
#endif //EXPLODE_H #endif //EXPLODE_H

View File

@ -7,11 +7,11 @@
#define EXPORT __declspec(dllexport) // Note: actually gcc seems to also supports this syntax. #define EXPORT __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
#endif #endif
#else #else
#if __GNUC__ >= 4 #if __GNUC__ >= 4
#define EXPORT __attribute__ ((visibility ("default"))) #define EXPORT __attribute__ ((visibility ("default")))
#else #else
#define EXPORT #define EXPORT
#endif #endif
#endif #endif
#define DLLEXPORT EXPORT #define DLLEXPORT EXPORT
#define _DLLEXPORT EXPORT #define _DLLEXPORT EXPORT

View File

@ -23,14 +23,14 @@
#define FLYING_AE_FLAP (8) #define FLYING_AE_FLAP (8)
#define FLYING_AE_FLAPSOUND (9) #define FLYING_AE_FLAPSOUND (9)
extern DLL_GLOBAL edict_t *g_pBodyQueueHead; extern DLL_GLOBAL edict_t *g_pBodyQueueHead;
int CFlyingMonster :: CheckLocalMove ( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist ) int CFlyingMonster::CheckLocalMove( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist )
{ {
// UNDONE: need to check more than the endpoint // UNDONE: need to check more than the endpoint
if (FBitSet(pev->flags, FL_SWIM) && (UTIL_PointContents(vecEnd) != CONTENTS_WATER)) if( FBitSet( pev->flags, FL_SWIM ) && ( UTIL_PointContents( vecEnd ) != CONTENTS_WATER ) )
{ {
// ALERT(at_aiconsole, "can't swim out of water\n"); // ALERT( at_aiconsole, "can't swim out of water\n" );
return FALSE; return FALSE;
} }
@ -41,15 +41,15 @@ int CFlyingMonster :: CheckLocalMove ( const Vector &vecStart, const Vector &vec
// ALERT( at_console, "%.0f %.0f %.0f : ", vecStart.x, vecStart.y, vecStart.z ); // ALERT( at_console, "%.0f %.0f %.0f : ", vecStart.x, vecStart.y, vecStart.z );
// ALERT( at_console, "%.0f %.0f %.0f\n", vecEnd.x, vecEnd.y, vecEnd.z ); // ALERT( at_console, "%.0f %.0f %.0f\n", vecEnd.x, vecEnd.y, vecEnd.z );
if (pflDist) if( pflDist )
{ {
*pflDist = ( (tr.vecEndPos - Vector( 0, 0, 32 )) - vecStart ).Length();// get the distance. *pflDist = ( ( tr.vecEndPos - Vector( 0, 0, 32 ) ) - vecStart ).Length();// get the distance.
} }
// ALERT( at_console, "check %d %d %f\n", tr.fStartSolid, tr.fAllSolid, tr.flFraction ); // ALERT( at_console, "check %d %d %f\n", tr.fStartSolid, tr.fAllSolid, tr.flFraction );
if (tr.fStartSolid || tr.flFraction < 1.0) if( tr.fStartSolid || tr.flFraction < 1.0 )
{ {
if ( pTarget && pTarget->edict() == gpGlobals->trace_ent ) if( pTarget && pTarget->edict() == gpGlobals->trace_ent )
return LOCALMOVE_VALID; return LOCALMOVE_VALID;
return LOCALMOVE_INVALID; return LOCALMOVE_INVALID;
} }
@ -57,23 +57,23 @@ int CFlyingMonster :: CheckLocalMove ( const Vector &vecStart, const Vector &vec
return LOCALMOVE_VALID; return LOCALMOVE_VALID;
} }
BOOL CFlyingMonster :: FTriangulate ( const Vector &vecStart , const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex ) BOOL CFlyingMonster::FTriangulate( const Vector &vecStart, const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex )
{ {
return CBaseMonster::FTriangulate( vecStart, vecEnd, flDist, pTargetEnt, pApex ); return CBaseMonster::FTriangulate( vecStart, vecEnd, flDist, pTargetEnt, pApex );
} }
Activity CFlyingMonster :: GetStoppedActivity( void ) Activity CFlyingMonster::GetStoppedActivity( void )
{ {
if ( pev->movetype != MOVETYPE_FLY ) // UNDONE: Ground idle here, IDLE may be something else if( pev->movetype != MOVETYPE_FLY ) // UNDONE: Ground idle here, IDLE may be something else
return ACT_IDLE; return ACT_IDLE;
return ACT_HOVER; return ACT_HOVER;
} }
void CFlyingMonster :: Stop( void ) void CFlyingMonster::Stop( void )
{ {
Activity stopped = GetStoppedActivity(); Activity stopped = GetStoppedActivity();
if ( m_IdealActivity != stopped ) if( m_IdealActivity != stopped )
{ {
m_flightSpeed = 0; m_flightSpeed = 0;
m_IdealActivity = stopped; m_IdealActivity = stopped;
@ -83,18 +83,18 @@ void CFlyingMonster :: Stop( void )
m_vecTravel = g_vecZero; m_vecTravel = g_vecZero;
} }
float CFlyingMonster :: ChangeYaw( int speed ) float CFlyingMonster::ChangeYaw( int speed )
{ {
if ( pev->movetype == MOVETYPE_FLY ) if( pev->movetype == MOVETYPE_FLY )
{ {
float diff = FlYawDiff(); float diff = FlYawDiff();
float target = 0; float target = 0;
if ( m_IdealActivity != GetStoppedActivity() ) if( m_IdealActivity != GetStoppedActivity() )
{ {
if ( diff < -20 ) if( diff < -20 )
target = 90; target = 90;
else if ( diff > 20 ) else if( diff > 20 )
target = -90; target = -90;
} }
pev->angles.z = UTIL_Approach( target, pev->angles.z, 220.0 * gpGlobals->frametime ); pev->angles.z = UTIL_Approach( target, pev->angles.z, 220.0 * gpGlobals->frametime );
@ -102,7 +102,7 @@ float CFlyingMonster :: ChangeYaw( int speed )
return CBaseMonster::ChangeYaw( speed ); return CBaseMonster::ChangeYaw( speed );
} }
void CFlyingMonster :: Killed( entvars_t *pevAttacker, int iGib ) void CFlyingMonster::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
ClearBits( pev->flags, FL_ONGROUND ); ClearBits( pev->flags, FL_ONGROUND );
@ -111,7 +111,7 @@ void CFlyingMonster :: Killed( entvars_t *pevAttacker, int iGib )
CBaseMonster::Killed( pevAttacker, iGib ); CBaseMonster::Killed( pevAttacker, iGib );
} }
void CFlyingMonster :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CFlyingMonster::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -119,7 +119,7 @@ void CFlyingMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
m_flightSpeed = 400; m_flightSpeed = 400;
break; break;
case FLYING_AE_FLAPSOUND: case FLYING_AE_FLAPSOUND:
if ( m_pFlapSound ) if( m_pFlapSound )
EMIT_SOUND( edict(), CHAN_BODY, m_pFlapSound, 1, ATTN_NORM ); EMIT_SOUND( edict(), CHAN_BODY, m_pFlapSound, 1, ATTN_NORM );
break; break;
default: default:
@ -128,20 +128,20 @@ void CFlyingMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
} }
} }
void CFlyingMonster :: Move( float flInterval ) void CFlyingMonster::Move( float flInterval )
{ {
if ( pev->movetype == MOVETYPE_FLY ) if( pev->movetype == MOVETYPE_FLY )
m_flGroundSpeed = m_flightSpeed; m_flGroundSpeed = m_flightSpeed;
CBaseMonster::Move( flInterval ); CBaseMonster::Move( flInterval );
} }
BOOL CFlyingMonster:: ShouldAdvanceRoute( float flWaypointDist ) BOOL CFlyingMonster::ShouldAdvanceRoute( float flWaypointDist )
{ {
// Get true 3D distance to the goal so we actually reach the correct height // Get true 3D distance to the goal so we actually reach the correct height
if ( m_Route[ m_iRouteIndex ].iType & bits_MF_IS_GOAL ) if( m_Route[m_iRouteIndex].iType & bits_MF_IS_GOAL )
flWaypointDist = ( m_Route[ m_iRouteIndex ].vecLocation - pev->origin ).Length(); flWaypointDist = ( m_Route[m_iRouteIndex].vecLocation - pev->origin ).Length();
if ( flWaypointDist <= 64 + (m_flGroundSpeed * gpGlobals->frametime) ) if( flWaypointDist <= 64 + ( m_flGroundSpeed * gpGlobals->frametime ) )
return TRUE; return TRUE;
return FALSE; return FALSE;
@ -149,32 +149,32 @@ BOOL CFlyingMonster:: ShouldAdvanceRoute( float flWaypointDist )
void CFlyingMonster::MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval ) void CFlyingMonster::MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval )
{ {
if ( pev->movetype == MOVETYPE_FLY ) if( pev->movetype == MOVETYPE_FLY )
{ {
if ( gpGlobals->time - m_stopTime > 1.0 ) if( gpGlobals->time - m_stopTime > 1.0 )
{ {
if ( m_IdealActivity != m_movementActivity ) if( m_IdealActivity != m_movementActivity )
{ {
m_IdealActivity = m_movementActivity; m_IdealActivity = m_movementActivity;
m_flGroundSpeed = m_flightSpeed = 200; m_flGroundSpeed = m_flightSpeed = 200;
} }
} }
Vector vecMove = pev->origin + (( vecDir + (m_vecTravel * m_momentum) ).Normalize() * (m_flGroundSpeed * flInterval)); Vector vecMove = pev->origin + ( ( vecDir + ( m_vecTravel * m_momentum ) ).Normalize() * (m_flGroundSpeed * flInterval ) );
if ( m_IdealActivity != m_movementActivity ) if( m_IdealActivity != m_movementActivity )
{ {
m_flightSpeed = UTIL_Approach( 100, m_flightSpeed, 75 * gpGlobals->frametime ); m_flightSpeed = UTIL_Approach( 100, m_flightSpeed, 75 * gpGlobals->frametime );
if ( m_flightSpeed < 100 ) if( m_flightSpeed < 100 )
m_stopTime = gpGlobals->time; m_stopTime = gpGlobals->time;
} }
else else
m_flightSpeed = UTIL_Approach( 20, m_flightSpeed, 300 * gpGlobals->frametime ); m_flightSpeed = UTIL_Approach( 20, m_flightSpeed, 300 * gpGlobals->frametime );
if ( CheckLocalMove ( pev->origin, vecMove, pTargetEnt, NULL ) ) if( CheckLocalMove( pev->origin, vecMove, pTargetEnt, NULL ) )
{ {
m_vecTravel = (vecMove - pev->origin); m_vecTravel = vecMove - pev->origin;
m_vecTravel = m_vecTravel.Normalize(); m_vecTravel = m_vecTravel.Normalize();
UTIL_MoveToOrigin(ENT(pev), vecMove, (m_flGroundSpeed * flInterval), MOVE_STRAFE); UTIL_MoveToOrigin( ENT( pev ), vecMove, ( m_flGroundSpeed * flInterval ), MOVE_STRAFE );
} }
else else
{ {
@ -195,21 +195,21 @@ float CFlyingMonster::CeilingZ( const Vector &position )
Vector maxUp = position; Vector maxUp = position;
maxUp.z += 4096.0; maxUp.z += 4096.0;
UTIL_TraceLine(position, maxUp, ignore_monsters, NULL, &tr); UTIL_TraceLine( position, maxUp, ignore_monsters, NULL, &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
maxUp.z = tr.vecEndPos.z; maxUp.z = tr.vecEndPos.z;
if ((pev->flags) & FL_SWIM) if( ( pev->flags ) & FL_SWIM )
{ {
return UTIL_WaterLevel( position, minUp.z, maxUp.z ); return UTIL_WaterLevel( position, minUp.z, maxUp.z );
} }
return maxUp.z; return maxUp.z;
} }
BOOL CFlyingMonster::ProbeZ( const Vector &position, const Vector &probe, float *pFraction) BOOL CFlyingMonster::ProbeZ( const Vector &position, const Vector &probe, float *pFraction )
{ {
int conPosition = UTIL_PointContents(position); int conPosition = UTIL_PointContents( position );
if ( (((pev->flags) & FL_SWIM) == FL_SWIM) ^ (conPosition == CONTENTS_WATER)) if( ( ( ( pev->flags ) & FL_SWIM ) == FL_SWIM ) ^ ( conPosition == CONTENTS_WATER ) )
{ {
// SWIMING & !WATER // SWIMING & !WATER
// or FLYING & WATER // or FLYING & WATER
@ -217,8 +217,8 @@ BOOL CFlyingMonster::ProbeZ( const Vector &position, const Vector &probe, float
*pFraction = 0.0; *pFraction = 0.0;
return TRUE; // We hit a water boundary because we are where we don't belong. return TRUE; // We hit a water boundary because we are where we don't belong.
} }
int conProbe = UTIL_PointContents(probe); int conProbe = UTIL_PointContents( probe );
if (conProbe == conPosition) if( conProbe == conPosition )
{ {
// The probe is either entirely inside the water (for fish) or entirely // The probe is either entirely inside the water (for fish) or entirely
// outside the water (for birds). // outside the water (for birds).
@ -227,17 +227,17 @@ BOOL CFlyingMonster::ProbeZ( const Vector &position, const Vector &probe, float
return FALSE; return FALSE;
} }
Vector ProbeUnit = (probe-position).Normalize(); Vector ProbeUnit = ( probe - position ).Normalize();
float ProbeLength = (probe-position).Length(); float ProbeLength = ( probe - position ).Length();
float maxProbeLength = ProbeLength; float maxProbeLength = ProbeLength;
float minProbeLength = 0; float minProbeLength = 0;
float diff = maxProbeLength - minProbeLength; float diff = maxProbeLength - minProbeLength;
while (diff > 1.0) while( diff > 1.0 )
{ {
float midProbeLength = minProbeLength + diff/2.0; float midProbeLength = minProbeLength + diff / 2.0;
Vector midProbeVec = midProbeLength * ProbeUnit; Vector midProbeVec = midProbeLength * ProbeUnit;
if (UTIL_PointContents(position+midProbeVec) == conPosition) if( UTIL_PointContents( position + midProbeVec ) == conPosition )
{ {
minProbeLength = midProbeLength; minProbeLength = midProbeLength;
} }
@ -261,7 +261,7 @@ float CFlyingMonster::FloorZ( const Vector &position )
UTIL_TraceLine( position, down, ignore_monsters, NULL, &tr ); UTIL_TraceLine( position, down, ignore_monsters, NULL, &tr );
if ( tr.flFraction != 1.0 ) if( tr.flFraction != 1.0 )
return tr.vecEndPos.z; return tr.vecEndPos.z;
return down.z; return down.z;

View File

@ -20,8 +20,8 @@
class CFlyingMonster : public CBaseMonster class CFlyingMonster : public CBaseMonster
{ {
public: public:
int CheckLocalMove ( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist );// check validity of a straight move through space int CheckLocalMove( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist );// check validity of a straight move through space
BOOL FTriangulate ( const Vector &vecStart , const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex ); BOOL FTriangulate( const Vector &vecStart, const Vector &vecEnd, float flDist, CBaseEntity *pTargetEnt, Vector *pApex );
Activity GetStoppedActivity( void ); Activity GetStoppedActivity( void );
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
void Stop( void ); void Stop( void );

File diff suppressed because it is too large Load Diff

View File

@ -15,8 +15,25 @@
#ifndef FUNC_BREAK_H #ifndef FUNC_BREAK_H
#define FUNC_BREAK_H #define FUNC_BREAK_H
typedef enum { expRandom, expDirected} Explosions; typedef enum
typedef enum { matGlass = 0, matWood, matMetal, matFlesh, matCinderBlock, matCeilingTile, matComputer, matUnbreakableGlass, matRocks, matNone, matLastMaterial } Materials; {
expRandom,
expDirected
} Explosions;
typedef enum
{
matGlass = 0,
matWood,
matMetal,
matFlesh,
matCinderBlock,
matCeilingTile,
matComputer,
matUnbreakableGlass,
matRocks,
matNone,
matLastMaterial
} Materials;
#define NUM_SHARDS 6 // this many shards spawned when breakable objects break; #define NUM_SHARDS 6 // this many shards spawned when breakable objects break;
@ -32,23 +49,23 @@ public:
void DamageSound( void ); void DamageSound( void );
// breakables use an overridden takedamage // breakables use an overridden takedamage
virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); virtual int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
// To spark when hit // To spark when hit
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType ); void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType );
BOOL IsBreakable( void ); BOOL IsBreakable( void );
BOOL SparkWhenHit( void ); BOOL SparkWhenHit( void );
int DamageDecal( int bitsDamageType ); int DamageDecal( int bitsDamageType );
void EXPORT Die( void ); void EXPORT Die( void );
virtual int ObjectCaps( void ) { return (CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION); } virtual int ObjectCaps( void ) { return ( CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION ); }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
inline BOOL Explodable( void ) { return ExplosionMagnitude() > 0; } inline BOOL Explodable( void ) { return ExplosionMagnitude() > 0; }
inline int ExplosionMagnitude( void ) { return pev->impulse; } inline int ExplosionMagnitude( void ) { return pev->impulse; }
inline void ExplosionSetMagnitude( int magnitude ) { pev->impulse = magnitude; } inline void ExplosionSetMagnitude( int magnitude ) { pev->impulse = magnitude; }
static void MaterialSoundPrecache( Materials precacheMaterial ); static void MaterialSoundPrecache( Materials precacheMaterial );
static void MaterialSoundRandom( edict_t *pEdict, Materials soundMaterial, float volume ); static void MaterialSoundRandom( edict_t *pEdict, Materials soundMaterial, float volume );
@ -61,14 +78,13 @@ public:
static const char *pSoundsConcrete[]; static const char *pSoundsConcrete[];
static const char *pSpawnObjects[]; static const char *pSpawnObjects[];
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
Materials m_Material; Materials m_Material;
Explosions m_Explosion; Explosions m_Explosion;
int m_idShard; int m_idShard;
float m_angle; float m_angle;
int m_iszGibModel; int m_iszGibModel;
int m_iszSpawnObject; int m_iszSpawnObject;
}; };
#endif // FUNC_BREAK_H #endif // FUNC_BREAK_H

View File

@ -46,12 +46,12 @@ enum TANKBULLET
class CFuncTank : public CBaseEntity class CFuncTank : public CBaseEntity
{ {
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void Think( void ); void Think( void );
void TrackTarget( void ); void TrackTarget( void );
virtual void Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ); virtual void Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker );
virtual Vector UpdateTargetPosition( CBaseEntity *pTarget ) virtual Vector UpdateTargetPosition( CBaseEntity *pTarget )
@ -59,17 +59,17 @@ public:
return pTarget->BodyTarget( pev->origin ); return pTarget->BodyTarget( pev->origin );
} }
void StartRotSound( void ); void StartRotSound( void );
void StopRotSound( void ); void StopRotSound( void );
// Bmodels don't go across transitions // Bmodels don't go across transitions
virtual int ObjectCaps( void ) { return CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
inline BOOL IsActive( void ) { return (pev->spawnflags & SF_TANK_ACTIVE)?TRUE:FALSE; } inline BOOL IsActive( void ) { return (pev->spawnflags & SF_TANK_ACTIVE)?TRUE:FALSE; }
inline void TankActivate( void ) { pev->spawnflags |= SF_TANK_ACTIVE; pev->nextthink = pev->ltime + 0.1; m_fireLast = 0; } inline void TankActivate( void ) { pev->spawnflags |= SF_TANK_ACTIVE; pev->nextthink = pev->ltime + 0.1; m_fireLast = 0; }
inline void TankDeactivate( void ) { pev->spawnflags &= ~SF_TANK_ACTIVE; m_fireLast = 0; StopRotSound(); } inline void TankDeactivate( void ) { pev->spawnflags &= ~SF_TANK_ACTIVE; m_fireLast = 0; StopRotSound(); }
inline BOOL CanFire( void ) { return (gpGlobals->time - m_lastSightTime) < m_persist; } inline BOOL CanFire( void ) { return (gpGlobals->time - m_lastSightTime) < m_persist; }
BOOL InRange( float range ); BOOL InRange( float range );
// Acquire a target. pPlayer is a player in the PVS // Acquire a target. pPlayer is a player in the PVS
edict_t *FindTarget( edict_t *pPlayer ); edict_t *FindTarget( edict_t *pPlayer );
@ -129,7 +129,7 @@ protected:
int m_iszMaster; // Master entity (game_team_master or multisource) int m_iszMaster; // Master entity (game_team_master or multisource)
}; };
TYPEDESCRIPTION CFuncTank::m_SaveData[] = TYPEDESCRIPTION CFuncTank::m_SaveData[] =
{ {
DEFINE_FIELD( CFuncTank, m_yawCenter, FIELD_FLOAT ), DEFINE_FIELD( CFuncTank, m_yawCenter, FIELD_FLOAT ),
DEFINE_FIELD( CFuncTank, m_yawRate, FIELD_FLOAT ), DEFINE_FIELD( CFuncTank, m_yawRate, FIELD_FLOAT ),
@ -170,148 +170,149 @@ static Vector gTankSpread[] =
Vector( 0.25, 0.25, 0.25 ), // extra-large cone Vector( 0.25, 0.25, 0.25 ), // extra-large cone
}; };
#define MAX_FIRING_SPREADS ARRAYSIZE(gTankSpread) #define MAX_FIRING_SPREADS ARRAYSIZE( gTankSpread )
void CFuncTank :: Spawn( void ) void CFuncTank::Spawn( void )
{ {
Precache(); Precache();
pev->movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything pev->movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
pev->solid = SOLID_BSP; pev->solid = SOLID_BSP;
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_yawCenter = pev->angles.y; m_yawCenter = pev->angles.y;
m_pitchCenter = pev->angles.x; m_pitchCenter = pev->angles.x;
if ( IsActive() ) if( IsActive() )
pev->nextthink = pev->ltime + 1.0; pev->nextthink = pev->ltime + 1.0;
m_sightOrigin = BarrelPosition(); // Point at the end of the barrel m_sightOrigin = BarrelPosition(); // Point at the end of the barrel
if ( m_fireRate <= 0 ) if( m_fireRate <= 0 )
m_fireRate = 1; m_fireRate = 1;
if ( m_spread > MAX_FIRING_SPREADS ) if( m_spread > MAX_FIRING_SPREADS )
m_spread = 0; m_spread = 0;
pev->oldorigin = pev->origin; pev->oldorigin = pev->origin;
} }
void CFuncTank :: Precache( void ) void CFuncTank::Precache( void )
{ {
if ( m_iszSpriteSmoke ) if( m_iszSpriteSmoke )
PRECACHE_MODEL( (char *)STRING(m_iszSpriteSmoke) ); PRECACHE_MODEL( (char *)STRING( m_iszSpriteSmoke ) );
if ( m_iszSpriteFlash )
PRECACHE_MODEL( (char *)STRING(m_iszSpriteFlash) );
if ( pev->noise ) if( m_iszSpriteFlash )
PRECACHE_SOUND( (char *)STRING(pev->noise) ); PRECACHE_MODEL( (char *)STRING( m_iszSpriteFlash ) );
if( pev->noise )
PRECACHE_SOUND( (char *)STRING( pev->noise ) );
} }
void CFuncTank :: KeyValue( KeyValueData *pkvd ) void CFuncTank::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "yawrate")) if( FStrEq( pkvd->szKeyName, "yawrate" ) )
{ {
m_yawRate = atof(pkvd->szValue); m_yawRate = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "yawrange")) else if( FStrEq( pkvd->szKeyName, "yawrange" ) )
{ {
m_yawRange = atof(pkvd->szValue); m_yawRange = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "yawtolerance")) else if( FStrEq( pkvd->szKeyName, "yawtolerance" ) )
{ {
m_yawTolerance = atof(pkvd->szValue); m_yawTolerance = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "pitchrange")) else if( FStrEq( pkvd->szKeyName, "pitchrange" ) )
{ {
m_pitchRange = atof(pkvd->szValue); m_pitchRange = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "pitchrate")) else if( FStrEq( pkvd->szKeyName, "pitchrate" ) )
{ {
m_pitchRate = atof(pkvd->szValue); m_pitchRate = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "pitchtolerance")) else if( FStrEq( pkvd->szKeyName, "pitchtolerance" ) )
{ {
m_pitchTolerance = atof(pkvd->szValue); m_pitchTolerance = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "firerate")) else if( FStrEq( pkvd->szKeyName, "firerate" ) )
{ {
m_fireRate = atof(pkvd->szValue); m_fireRate = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "barrel")) else if( FStrEq( pkvd->szKeyName, "barrel" ) )
{ {
m_barrelPos.x = atof(pkvd->szValue); m_barrelPos.x = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "barrely")) else if( FStrEq( pkvd->szKeyName, "barrely" ) )
{ {
m_barrelPos.y = atof(pkvd->szValue); m_barrelPos.y = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "barrelz")) else if( FStrEq( pkvd->szKeyName, "barrelz" ) )
{ {
m_barrelPos.z = atof(pkvd->szValue); m_barrelPos.z = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "spritescale")) else if( FStrEq( pkvd->szKeyName, "spritescale" ) )
{ {
m_spriteScale = atof(pkvd->szValue); m_spriteScale = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "spritesmoke")) else if( FStrEq( pkvd->szKeyName, "spritesmoke" ) )
{ {
m_iszSpriteSmoke = ALLOC_STRING(pkvd->szValue); m_iszSpriteSmoke = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "spriteflash")) else if( FStrEq( pkvd->szKeyName, "spriteflash" ) )
{ {
m_iszSpriteFlash = ALLOC_STRING(pkvd->szValue); m_iszSpriteFlash = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "rotatesound")) else if( FStrEq( pkvd->szKeyName, "rotatesound" ) )
{ {
pev->noise = ALLOC_STRING(pkvd->szValue); pev->noise = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "persistence")) else if( FStrEq( pkvd->szKeyName, "persistence" ) )
{ {
m_persist = atof(pkvd->szValue); m_persist = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "bullet")) else if( FStrEq( pkvd->szKeyName, "bullet" ) )
{ {
m_bulletType = (TANKBULLET)atoi(pkvd->szValue); m_bulletType = (TANKBULLET)atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if ( FStrEq(pkvd->szKeyName, "bullet_damage" )) else if( FStrEq( pkvd->szKeyName, "bullet_damage" ) )
{ {
m_iBulletDamage = atoi(pkvd->szValue); m_iBulletDamage = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "firespread")) else if( FStrEq(pkvd->szKeyName, "firespread" ) )
{ {
m_spread = atoi(pkvd->szValue); m_spread = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "minRange")) else if( FStrEq( pkvd->szKeyName, "minRange" ) )
{ {
m_minRange = atof(pkvd->szValue); m_minRange = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "maxRange")) else if( FStrEq( pkvd->szKeyName, "maxRange" ) )
{ {
m_maxRange = atof(pkvd->szValue); m_maxRange = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "master")) else if( FStrEq( pkvd->szKeyName, "master" ) )
{ {
m_iszMaster = ALLOC_STRING(pkvd->szValue); m_iszMaster = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -322,57 +323,56 @@ void CFuncTank :: KeyValue( KeyValueData *pkvd )
//================================================================================== //==================================================================================
// TANK CONTROLLING // TANK CONTROLLING
BOOL CFuncTank :: OnControls( entvars_t *pevTest ) BOOL CFuncTank::OnControls( entvars_t *pevTest )
{ {
if ( !(pev->spawnflags & SF_TANK_CANCONTROL) ) if( !( pev->spawnflags & SF_TANK_CANCONTROL ) )
return FALSE; return FALSE;
Vector offset = pevTest->origin - pev->origin; Vector offset = pevTest->origin - pev->origin;
if ( (m_vecControllerUsePos - pevTest->origin).Length() < 30 ) if( ( m_vecControllerUsePos - pevTest->origin ).Length() < 30 )
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
BOOL CFuncTank :: StartControl( CBasePlayer *pController ) BOOL CFuncTank::StartControl( CBasePlayer *pController )
{ {
if ( m_pController != NULL ) if( m_pController != NULL )
return FALSE; return FALSE;
// Team only or disabled? // Team only or disabled?
if ( m_iszMaster ) if( m_iszMaster )
{ {
if ( !UTIL_IsMasterTriggered( m_iszMaster, pController ) ) if( !UTIL_IsMasterTriggered( m_iszMaster, pController ) )
return FALSE; return FALSE;
} }
ALERT( at_console, "using TANK!\n"); ALERT( at_console, "using TANK!\n");
m_pController = pController; m_pController = pController;
if ( m_pController->m_pActiveItem ) if( m_pController->m_pActiveItem )
{ {
m_pController->m_pActiveItem->Holster(); m_pController->m_pActiveItem->Holster();
m_pController->pev->weaponmodel = 0; m_pController->pev->weaponmodel = 0;
m_pController->pev->viewmodel = 0; m_pController->pev->viewmodel = 0;
} }
m_pController->m_iHideHUD |= HIDEHUD_WEAPONS; m_pController->m_iHideHUD |= HIDEHUD_WEAPONS;
m_vecControllerUsePos = m_pController->pev->origin; m_vecControllerUsePos = m_pController->pev->origin;
pev->nextthink = pev->ltime + 0.1; pev->nextthink = pev->ltime + 0.1;
return TRUE; return TRUE;
} }
void CFuncTank :: StopControl() void CFuncTank::StopControl()
{ {
// TODO: bring back the controllers current weapon // TODO: bring back the controllers current weapon
if ( !m_pController ) if( !m_pController )
return; return;
if ( m_pController->m_pActiveItem ) if( m_pController->m_pActiveItem )
m_pController->m_pActiveItem->Deploy(); m_pController->m_pActiveItem->Deploy();
ALERT( at_console, "stopped using TANK\n"); ALERT( at_console, "stopped using TANK\n");
@ -382,51 +382,51 @@ void CFuncTank :: StopControl()
pev->nextthink = 0; pev->nextthink = 0;
m_pController = NULL; m_pController = NULL;
if ( IsActive() ) if( IsActive() )
pev->nextthink = pev->ltime + 1.0; pev->nextthink = pev->ltime + 1.0;
} }
// Called each frame by the player's ItemPostFrame // Called each frame by the player's ItemPostFrame
void CFuncTank :: ControllerPostFrame( void ) void CFuncTank::ControllerPostFrame( void )
{ {
ASSERT(m_pController != NULL); ASSERT( m_pController != NULL );
if ( gpGlobals->time < m_flNextAttack ) if( gpGlobals->time < m_flNextAttack )
return; return;
if ( m_pController->pev->button & IN_ATTACK ) if( m_pController->pev->button & IN_ATTACK )
{ {
Vector vecForward; Vector vecForward;
UTIL_MakeVectorsPrivate( pev->angles, vecForward, NULL, NULL ); UTIL_MakeVectorsPrivate( pev->angles, vecForward, NULL, NULL );
m_fireLast = gpGlobals->time - (1/m_fireRate) - 0.01; // to make sure the gun doesn't fire too many bullets m_fireLast = gpGlobals->time - ( 1 / m_fireRate ) - 0.01; // to make sure the gun doesn't fire too many bullets
Fire( BarrelPosition(), vecForward, m_pController->pev ); Fire( BarrelPosition(), vecForward, m_pController->pev );
// HACKHACK -- make some noise (that the AI can hear) // HACKHACK -- make some noise (that the AI can hear)
if ( m_pController && m_pController->IsPlayer() ) if( m_pController && m_pController->IsPlayer() )
((CBasePlayer *)m_pController)->m_iWeaponVolume = LOUD_GUN_VOLUME; ( (CBasePlayer *)m_pController )->m_iWeaponVolume = LOUD_GUN_VOLUME;
m_flNextAttack = gpGlobals->time + (1/m_fireRate); m_flNextAttack = gpGlobals->time + ( 1 / m_fireRate );
} }
} }
////////////// END NEW STUFF ////////////// ////////////// END NEW STUFF //////////////
void CFuncTank :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CFuncTank::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
if ( pev->spawnflags & SF_TANK_CANCONTROL ) if( pev->spawnflags & SF_TANK_CANCONTROL )
{ // player controlled turret {
// player controlled turret
if ( pActivator->Classify() != CLASS_PLAYER ) if( pActivator->Classify() != CLASS_PLAYER )
return; return;
if ( value == 2 && useType == USE_SET ) if( value == 2 && useType == USE_SET )
{ {
ControllerPostFrame(); ControllerPostFrame();
} }
else if ( !m_pController && useType != USE_OFF ) else if( !m_pController && useType != USE_OFF )
{ {
((CBasePlayer*)pActivator)->m_pTank = this; ( (CBasePlayer*)pActivator )->m_pTank = this;
StartControl( (CBasePlayer*)pActivator ); StartControl( (CBasePlayer*)pActivator );
} }
else else
@ -436,37 +436,37 @@ void CFuncTank :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
} }
else else
{ {
if ( !ShouldToggle( useType, IsActive() ) ) if( !ShouldToggle( useType, IsActive() ) )
return; return;
if ( IsActive() ) if( IsActive() )
TankDeactivate(); TankDeactivate();
else else
TankActivate(); TankActivate();
} }
} }
edict_t *CFuncTank :: FindTarget( edict_t *pPlayer ) edict_t *CFuncTank::FindTarget( edict_t *pPlayer )
{ {
return pPlayer; return pPlayer;
} }
BOOL CFuncTank :: InRange( float range ) BOOL CFuncTank::InRange( float range )
{ {
if ( range < m_minRange ) if( range < m_minRange )
return FALSE; return FALSE;
if ( m_maxRange > 0 && range > m_maxRange ) if( m_maxRange > 0 && range > m_maxRange )
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
void CFuncTank :: Think( void ) void CFuncTank::Think( void )
{ {
pev->avelocity = g_vecZero; pev->avelocity = g_vecZero;
TrackTarget(); TrackTarget();
if ( fabs(pev->avelocity.x) > 1 || fabs(pev->avelocity.y) > 1 ) if( fabs( pev->avelocity.x ) > 1 || fabs( pev->avelocity.y ) > 1 )
StartRotSound(); StartRotSound();
else else
StopRotSound(); StopRotSound();
@ -481,7 +481,7 @@ void CFuncTank::TrackTarget( void )
edict_t *pTarget; edict_t *pTarget;
// Get a position to aim for // Get a position to aim for
if (m_pController) if( m_pController )
{ {
// Tanks attempt to mirror the player's angles // Tanks attempt to mirror the player's angles
angles = m_pController->pev->v_angle; angles = m_pController->pev->v_angle;
@ -490,39 +490,39 @@ void CFuncTank::TrackTarget( void )
} }
else else
{ {
if ( IsActive() ) if( IsActive() )
pev->nextthink = pev->ltime + 0.1; pev->nextthink = pev->ltime + 0.1;
else else
return; return;
if ( FNullEnt( pPlayer ) ) if( FNullEnt( pPlayer ) )
{ {
if ( IsActive() ) if( IsActive() )
pev->nextthink = pev->ltime + 2; // Wait 2 secs pev->nextthink = pev->ltime + 2; // Wait 2 secs
return; return;
} }
pTarget = FindTarget( pPlayer ); pTarget = FindTarget( pPlayer );
if ( !pTarget ) if( !pTarget )
return; return;
// Calculate angle needed to aim at target // Calculate angle needed to aim at target
barrelEnd = BarrelPosition(); barrelEnd = BarrelPosition();
targetPosition = pTarget->v.origin + pTarget->v.view_ofs; targetPosition = pTarget->v.origin + pTarget->v.view_ofs;
float range = (targetPosition - barrelEnd).Length(); float range = ( targetPosition - barrelEnd ).Length();
if ( !InRange( range ) ) if( !InRange( range ) )
return; return;
UTIL_TraceLine( barrelEnd, targetPosition, dont_ignore_monsters, edict(), &tr ); UTIL_TraceLine( barrelEnd, targetPosition, dont_ignore_monsters, edict(), &tr );
lineOfSight = FALSE; lineOfSight = FALSE;
// No line of sight, don't track // No line of sight, don't track
if ( tr.flFraction == 1.0 || tr.pHit == pTarget ) if( tr.flFraction == 1.0 || tr.pHit == pTarget )
{ {
lineOfSight = TRUE; lineOfSight = TRUE;
CBaseEntity *pInstance = CBaseEntity::Instance(pTarget); CBaseEntity *pInstance = CBaseEntity::Instance(pTarget);
if ( InRange( range ) && pInstance && pInstance->IsAlive() ) if( InRange( range ) && pInstance && pInstance->IsAlive() )
{ {
updateTime = TRUE; updateTime = TRUE;
m_sightOrigin = UpdateTargetPosition( pInstance ); m_sightOrigin = UpdateTargetPosition( pInstance );
@ -546,63 +546,63 @@ void CFuncTank::TrackTarget( void )
angles.x = m_pitchCenter + UTIL_AngleDistance( angles.x, m_pitchCenter ); angles.x = m_pitchCenter + UTIL_AngleDistance( angles.x, m_pitchCenter );
// Limit against range in y // Limit against range in y
if ( angles.y > m_yawCenter + m_yawRange ) if( angles.y > m_yawCenter + m_yawRange )
{ {
angles.y = m_yawCenter + m_yawRange; angles.y = m_yawCenter + m_yawRange;
updateTime = FALSE; // Don't update if you saw the player, but out of range updateTime = FALSE; // Don't update if you saw the player, but out of range
} }
else if ( angles.y < (m_yawCenter - m_yawRange) ) else if( angles.y < ( m_yawCenter - m_yawRange ) )
{ {
angles.y = (m_yawCenter - m_yawRange); angles.y = ( m_yawCenter - m_yawRange );
updateTime = FALSE; // Don't update if you saw the player, but out of range updateTime = FALSE; // Don't update if you saw the player, but out of range
} }
if ( updateTime ) if( updateTime )
m_lastSightTime = gpGlobals->time; m_lastSightTime = gpGlobals->time;
// Move toward target at rate or less // Move toward target at rate or less
float distY = UTIL_AngleDistance( angles.y, pev->angles.y ); float distY = UTIL_AngleDistance( angles.y, pev->angles.y );
pev->avelocity.y = distY * 10; pev->avelocity.y = distY * 10;
if ( pev->avelocity.y > m_yawRate ) if( pev->avelocity.y > m_yawRate )
pev->avelocity.y = m_yawRate; pev->avelocity.y = m_yawRate;
else if ( pev->avelocity.y < -m_yawRate ) else if( pev->avelocity.y < -m_yawRate )
pev->avelocity.y = -m_yawRate; pev->avelocity.y = -m_yawRate;
// Limit against range in x // Limit against range in x
if ( angles.x > m_pitchCenter + m_pitchRange ) if( angles.x > m_pitchCenter + m_pitchRange )
angles.x = m_pitchCenter + m_pitchRange; angles.x = m_pitchCenter + m_pitchRange;
else if ( angles.x < m_pitchCenter - m_pitchRange ) else if( angles.x < m_pitchCenter - m_pitchRange )
angles.x = m_pitchCenter - m_pitchRange; angles.x = m_pitchCenter - m_pitchRange;
// Move toward target at rate or less // Move toward target at rate or less
float distX = UTIL_AngleDistance( angles.x, pev->angles.x ); float distX = UTIL_AngleDistance( angles.x, pev->angles.x );
pev->avelocity.x = distX * 10; pev->avelocity.x = distX * 10;
if ( pev->avelocity.x > m_pitchRate ) if( pev->avelocity.x > m_pitchRate )
pev->avelocity.x = m_pitchRate; pev->avelocity.x = m_pitchRate;
else if ( pev->avelocity.x < -m_pitchRate ) else if( pev->avelocity.x < -m_pitchRate )
pev->avelocity.x = -m_pitchRate; pev->avelocity.x = -m_pitchRate;
if ( m_pController ) if( m_pController )
return; return;
if ( CanFire() && ( (fabs(distX) < m_pitchTolerance && fabs(distY) < m_yawTolerance) || (pev->spawnflags & SF_TANK_LINEOFSIGHT) ) ) if( CanFire() && ( ( fabs( distX ) < m_pitchTolerance && fabs( distY ) < m_yawTolerance ) || ( pev->spawnflags & SF_TANK_LINEOFSIGHT ) ) )
{ {
BOOL fire = FALSE; BOOL fire = FALSE;
Vector forward; Vector forward;
UTIL_MakeVectorsPrivate( pev->angles, forward, NULL, NULL ); UTIL_MakeVectorsPrivate( pev->angles, forward, NULL, NULL );
if ( pev->spawnflags & SF_TANK_LINEOFSIGHT ) if( pev->spawnflags & SF_TANK_LINEOFSIGHT )
{ {
float length = direction.Length(); float length = direction.Length();
UTIL_TraceLine( barrelEnd, barrelEnd + forward * length, dont_ignore_monsters, edict(), &tr ); UTIL_TraceLine( barrelEnd, barrelEnd + forward * length, dont_ignore_monsters, edict(), &tr );
if ( tr.pHit == pTarget ) if( tr.pHit == pTarget )
fire = TRUE; fire = TRUE;
} }
else else
fire = TRUE; fire = TRUE;
if ( fire ) if( fire )
{ {
Fire( BarrelPosition(), forward, pev ); Fire( BarrelPosition(), forward, pev );
} }
@ -618,20 +618,19 @@ void CFuncTank::AdjustAnglesForBarrel( Vector &angles, float distance )
{ {
float r2, d2; float r2, d2;
if( m_barrelPos.y != 0 || m_barrelPos.z != 0 )
if ( m_barrelPos.y != 0 || m_barrelPos.z != 0 )
{ {
distance -= m_barrelPos.z; distance -= m_barrelPos.z;
d2 = distance * distance; d2 = distance * distance;
if ( m_barrelPos.y ) if( m_barrelPos.y )
{ {
r2 = m_barrelPos.y * m_barrelPos.y; r2 = m_barrelPos.y * m_barrelPos.y;
angles.y += (180.0 / M_PI) * atan2( m_barrelPos.y, sqrt( d2 - r2 ) ); angles.y += ( 180.0 / M_PI ) * atan2( m_barrelPos.y, sqrt( d2 - r2 ) );
} }
if ( m_barrelPos.z ) if( m_barrelPos.z )
{ {
r2 = m_barrelPos.z * m_barrelPos.z; r2 = m_barrelPos.z * m_barrelPos.z;
angles.x += (180.0 / M_PI) * atan2( -m_barrelPos.z, sqrt( d2 - r2 ) ); angles.x += ( 180.0 / M_PI ) * atan2( -m_barrelPos.z, sqrt( d2 - r2 ) );
} }
} }
} }
@ -639,19 +638,19 @@ void CFuncTank::AdjustAnglesForBarrel( Vector &angles, float distance )
// Fire targets and spawn sprites // Fire targets and spawn sprites
void CFuncTank::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ) void CFuncTank::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker )
{ {
if ( m_fireLast != 0 ) if( m_fireLast != 0 )
{ {
if ( m_iszSpriteSmoke ) if( m_iszSpriteSmoke )
{ {
CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteSmoke), barrelEnd, TRUE ); CSprite *pSprite = CSprite::SpriteCreate( STRING( m_iszSpriteSmoke ), barrelEnd, TRUE );
pSprite->AnimateAndDie( RANDOM_FLOAT( 15.0, 20.0 ) ); pSprite->AnimateAndDie( RANDOM_FLOAT( 15.0, 20.0 ) );
pSprite->SetTransparency( kRenderTransAlpha, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, 255, kRenderFxNone ); pSprite->SetTransparency( kRenderTransAlpha, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, 255, kRenderFxNone );
pSprite->pev->velocity.z = RANDOM_FLOAT(40, 80); pSprite->pev->velocity.z = RANDOM_FLOAT( 40, 80 );
pSprite->SetScale( m_spriteScale ); pSprite->SetScale( m_spriteScale );
} }
if ( m_iszSpriteFlash ) if( m_iszSpriteFlash )
{ {
CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteFlash), barrelEnd, TRUE ); CSprite *pSprite = CSprite::SpriteCreate( STRING( m_iszSpriteFlash ), barrelEnd, TRUE );
pSprite->AnimateAndDie( 60 ); pSprite->AnimateAndDie( 60 );
pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation );
pSprite->SetScale( m_spriteScale ); pSprite->SetScale( m_spriteScale );
@ -668,32 +667,33 @@ void CFuncTank::TankTrace( const Vector &vecStart, const Vector &vecForward, con
{ {
// get circular gaussian spread // get circular gaussian spread
float x, y, z; float x, y, z;
do { do
x = RANDOM_FLOAT(-0.5,0.5) + RANDOM_FLOAT(-0.5,0.5); {
y = RANDOM_FLOAT(-0.5,0.5) + RANDOM_FLOAT(-0.5,0.5); x = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
z = x*x+y*y; y = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
} while (z > 1); z = x * x + y * y;
} while( z > 1 );
Vector vecDir = vecForward + Vector vecDir = vecForward +
x * vecSpread.x * gpGlobals->v_right + x * vecSpread.x * gpGlobals->v_right +
y * vecSpread.y * gpGlobals->v_up; y * vecSpread.y * gpGlobals->v_up;
Vector vecEnd; Vector vecEnd;
vecEnd = vecStart + vecDir * 4096; vecEnd = vecStart + vecDir * 4096;
UTIL_TraceLine( vecStart, vecEnd, dont_ignore_monsters, edict(), &tr ); UTIL_TraceLine( vecStart, vecEnd, dont_ignore_monsters, edict(), &tr );
} }
void CFuncTank::StartRotSound( void ) void CFuncTank::StartRotSound( void )
{ {
if ( !pev->noise || (pev->spawnflags & SF_TANK_SOUNDON) ) if( !pev->noise || ( pev->spawnflags & SF_TANK_SOUNDON ) )
return; return;
pev->spawnflags |= SF_TANK_SOUNDON; pev->spawnflags |= SF_TANK_SOUNDON;
EMIT_SOUND( edict(), CHAN_STATIC, (char*)STRING(pev->noise), 0.85, ATTN_NORM); EMIT_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noise ), 0.85, ATTN_NORM );
} }
void CFuncTank::StopRotSound( void ) void CFuncTank::StopRotSound( void )
{ {
if ( pev->spawnflags & SF_TANK_SOUNDON ) if( pev->spawnflags & SF_TANK_SOUNDON )
STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING(pev->noise) ); STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noise ) );
pev->spawnflags &= ~SF_TANK_SOUNDON; pev->spawnflags &= ~SF_TANK_SOUNDON;
} }
@ -709,30 +709,27 @@ void CFuncTankGun::Fire( const Vector &barrelEnd, const Vector &forward, entvars
{ {
int i; int i;
if ( m_fireLast != 0 ) if( m_fireLast != 0 )
{ {
// FireBullets needs gpGlobals->v_up, etc. // FireBullets needs gpGlobals->v_up, etc.
UTIL_MakeAimVectors(pev->angles); UTIL_MakeAimVectors( pev->angles );
int bulletCount = (gpGlobals->time - m_fireLast) * m_fireRate; int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
if ( bulletCount > 0 ) if( bulletCount > 0 )
{ {
for ( i = 0; i < bulletCount; i++ ) for( i = 0; i < bulletCount; i++ )
{ {
switch( m_bulletType ) switch( m_bulletType )
{ {
case TANK_BULLET_9MM: case TANK_BULLET_9MM:
FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_9MM, 1, m_iBulletDamage, pevAttacker ); FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_9MM, 1, m_iBulletDamage, pevAttacker );
break; break;
case TANK_BULLET_MP5: case TANK_BULLET_MP5:
FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_MP5, 1, m_iBulletDamage, pevAttacker ); FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_MP5, 1, m_iBulletDamage, pevAttacker );
break; break;
case TANK_BULLET_12MM: case TANK_BULLET_12MM:
FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_12MM, 1, m_iBulletDamage, pevAttacker ); FireBullets( 1, barrelEnd, forward, gTankSpread[m_spread], 4096, BULLET_MONSTER_12MM, 1, m_iBulletDamage, pevAttacker );
break; break;
default: default:
case TANK_BULLET_NONE: case TANK_BULLET_NONE:
break; break;
@ -748,24 +745,24 @@ void CFuncTankGun::Fire( const Vector &barrelEnd, const Vector &forward, entvars
class CFuncTankLaser : public CFuncTank class CFuncTankLaser : public CFuncTank
{ {
public: public:
void Activate( void ); void Activate( void );
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ); void Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker );
void Think( void ); void Think( void );
CLaser *GetLaser( void ); CLaser *GetLaser( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
private: private:
CLaser *m_pLaser; CLaser *m_pLaser;
float m_laserTime; float m_laserTime;
}; };
LINK_ENTITY_TO_CLASS( func_tanklaser, CFuncTankLaser ) LINK_ENTITY_TO_CLASS( func_tanklaser, CFuncTankLaser )
TYPEDESCRIPTION CFuncTankLaser::m_SaveData[] = TYPEDESCRIPTION CFuncTankLaser::m_SaveData[] =
{ {
DEFINE_FIELD( CFuncTankLaser, m_pLaser, FIELD_CLASSPTR ), DEFINE_FIELD( CFuncTankLaser, m_pLaser, FIELD_CLASSPTR ),
DEFINE_FIELD( CFuncTankLaser, m_laserTime, FIELD_TIME ), DEFINE_FIELD( CFuncTankLaser, m_laserTime, FIELD_TIME ),
@ -775,9 +772,9 @@ IMPLEMENT_SAVERESTORE( CFuncTankLaser, CFuncTank )
void CFuncTankLaser::Activate( void ) void CFuncTankLaser::Activate( void )
{ {
if ( !GetLaser() ) if( !GetLaser() )
{ {
UTIL_Remove(this); UTIL_Remove( this );
ALERT( at_error, "Laser tank with no env_laser!\n" ); ALERT( at_error, "Laser tank with no env_laser!\n" );
} }
else else
@ -788,9 +785,9 @@ void CFuncTankLaser::Activate( void )
void CFuncTankLaser::KeyValue( KeyValueData *pkvd ) void CFuncTankLaser::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "laserentity")) if( FStrEq( pkvd->szKeyName, "laserentity" ) )
{ {
pev->message = ALLOC_STRING(pkvd->szValue); pev->message = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -799,22 +796,22 @@ void CFuncTankLaser::KeyValue( KeyValueData *pkvd )
CLaser *CFuncTankLaser::GetLaser( void ) CLaser *CFuncTankLaser::GetLaser( void )
{ {
if ( m_pLaser ) if( m_pLaser )
return m_pLaser; return m_pLaser;
edict_t *pentLaser; edict_t *pentLaser;
pentLaser = FIND_ENTITY_BY_TARGETNAME( NULL, STRING(pev->message) ); pentLaser = FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->message ) );
while ( !FNullEnt( pentLaser ) ) while( !FNullEnt( pentLaser ) )
{ {
// Found the landmark // Found the landmark
if ( FClassnameIs( pentLaser, "env_laser" ) ) if( FClassnameIs( pentLaser, "env_laser" ) )
{ {
m_pLaser = (CLaser *)CBaseEntity::Instance(pentLaser); m_pLaser = (CLaser *)CBaseEntity::Instance( pentLaser );
break; break;
} }
else else
pentLaser = FIND_ENTITY_BY_TARGETNAME( pentLaser, STRING(pev->message) ); pentLaser = FIND_ENTITY_BY_TARGETNAME( pentLaser, STRING( pev->message ) );
} }
return m_pLaser; return m_pLaser;
@ -822,7 +819,7 @@ CLaser *CFuncTankLaser::GetLaser( void )
void CFuncTankLaser::Think( void ) void CFuncTankLaser::Think( void )
{ {
if ( m_pLaser && (gpGlobals->time > m_laserTime) ) if( m_pLaser && (gpGlobals->time > m_laserTime) )
m_pLaser->TurnOff(); m_pLaser->TurnOff();
CFuncTank::Think(); CFuncTank::Think();
@ -833,19 +830,19 @@ void CFuncTankLaser::Fire( const Vector &barrelEnd, const Vector &forward, entva
int i; int i;
TraceResult tr; TraceResult tr;
if ( m_fireLast != 0 && GetLaser() ) if( m_fireLast != 0 && GetLaser() )
{ {
// TankTrace needs gpGlobals->v_up, etc. // TankTrace needs gpGlobals->v_up, etc.
UTIL_MakeAimVectors(pev->angles); UTIL_MakeAimVectors( pev->angles );
int bulletCount = (gpGlobals->time - m_fireLast) * m_fireRate; int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
if ( bulletCount ) if( bulletCount )
{ {
for ( i = 0; i < bulletCount; i++ ) for( i = 0; i < bulletCount; i++ )
{ {
m_pLaser->pev->origin = barrelEnd; m_pLaser->pev->origin = barrelEnd;
TankTrace( barrelEnd, forward, gTankSpread[m_spread], tr ); TankTrace( barrelEnd, forward, gTankSpread[m_spread], tr );
m_laserTime = gpGlobals->time; m_laserTime = gpGlobals->time;
m_pLaser->TurnOn(); m_pLaser->TurnOn();
m_pLaser->pev->dmgtime = gpGlobals->time - 1.0; m_pLaser->pev->dmgtime = gpGlobals->time - 1.0;
@ -880,12 +877,12 @@ void CFuncTankRocket::Fire( const Vector &barrelEnd, const Vector &forward, entv
{ {
int i; int i;
if ( m_fireLast != 0 ) if( m_fireLast != 0 )
{ {
int bulletCount = (gpGlobals->time - m_fireLast) * m_fireRate; int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
if ( bulletCount > 0 ) if( bulletCount > 0 )
{ {
for ( i = 0; i < bulletCount; i++ ) for( i = 0; i < bulletCount; i++ )
{ {
CBaseEntity *pRocket = CBaseEntity::Create( "rpg_rocket", barrelEnd, pev->angles, edict() ); CBaseEntity *pRocket = CBaseEntity::Create( "rpg_rocket", barrelEnd, pev->angles, edict() );
} }
@ -907,7 +904,7 @@ LINK_ENTITY_TO_CLASS( func_tankmortar, CFuncTankMortar )
void CFuncTankMortar::KeyValue( KeyValueData *pkvd ) void CFuncTankMortar::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "iMagnitude")) if( FStrEq( pkvd->szKeyName, "iMagnitude" ) )
{ {
pev->impulse = atoi( pkvd->szValue ); pev->impulse = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
@ -918,16 +915,16 @@ void CFuncTankMortar::KeyValue( KeyValueData *pkvd )
void CFuncTankMortar::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ) void CFuncTankMortar::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker )
{ {
if ( m_fireLast != 0 ) if( m_fireLast != 0 )
{ {
int bulletCount = (gpGlobals->time - m_fireLast) * m_fireRate; int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
// Only create 1 explosion // Only create 1 explosion
if ( bulletCount > 0 ) if( bulletCount > 0 )
{ {
TraceResult tr; TraceResult tr;
// TankTrace needs gpGlobals->v_up, etc. // TankTrace needs gpGlobals->v_up, etc.
UTIL_MakeAimVectors(pev->angles); UTIL_MakeAimVectors( pev->angles );
TankTrace( barrelEnd, forward, gTankSpread[m_spread], tr ); TankTrace( barrelEnd, forward, gTankSpread[m_spread], tr );
@ -946,13 +943,13 @@ void CFuncTankMortar::Fire( const Vector &barrelEnd, const Vector &forward, entv
class CFuncTankControls : public CBaseEntity class CFuncTankControls : public CBaseEntity
{ {
public: public:
virtual int ObjectCaps( void ); virtual int ObjectCaps( void );
void Spawn( void ); void Spawn( void );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void Think( void ); void Think( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
CFuncTank *m_pTank; CFuncTank *m_pTank;
@ -960,43 +957,43 @@ public:
LINK_ENTITY_TO_CLASS( func_tankcontrols, CFuncTankControls ) LINK_ENTITY_TO_CLASS( func_tankcontrols, CFuncTankControls )
TYPEDESCRIPTION CFuncTankControls::m_SaveData[] = TYPEDESCRIPTION CFuncTankControls::m_SaveData[] =
{ {
DEFINE_FIELD( CFuncTankControls, m_pTank, FIELD_CLASSPTR ), DEFINE_FIELD( CFuncTankControls, m_pTank, FIELD_CLASSPTR ),
}; };
IMPLEMENT_SAVERESTORE( CFuncTankControls, CBaseEntity ) IMPLEMENT_SAVERESTORE( CFuncTankControls, CBaseEntity )
int CFuncTankControls :: ObjectCaps( void ) int CFuncTankControls::ObjectCaps( void )
{ {
return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_IMPULSE_USE; return ( CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION ) | FCAP_IMPULSE_USE;
} }
void CFuncTankControls :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CFuncTankControls::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
// pass the Use command onto the controls // pass the Use command onto the controls
if ( m_pTank ) if( m_pTank )
m_pTank->Use( pActivator, pCaller, useType, value ); m_pTank->Use( pActivator, pCaller, useType, value );
ASSERT( m_pTank != NULL ); // if this fails, most likely means save/restore hasn't worked properly ASSERT( m_pTank != NULL ); // if this fails, most likely means save/restore hasn't worked properly
} }
void CFuncTankControls :: Think( void ) void CFuncTankControls::Think( void )
{ {
edict_t *pTarget = NULL; edict_t *pTarget = NULL;
do do
{ {
pTarget = FIND_ENTITY_BY_TARGETNAME( pTarget, STRING(pev->target) ); pTarget = FIND_ENTITY_BY_TARGETNAME( pTarget, STRING( pev->target ) );
} while ( !FNullEnt(pTarget) && strncmp( STRING(pTarget->v.classname), "func_tank", 9 ) ); } while( !FNullEnt( pTarget ) && strncmp( STRING( pTarget->v.classname ), "func_tank", 9 ) );
if ( FNullEnt( pTarget ) ) if( FNullEnt( pTarget ) )
{ {
ALERT( at_console, "No tank %s\n", STRING(pev->target) ); ALERT( at_console, "No tank %s\n", STRING( pev->target ) );
return; return;
} }
m_pTank = (CFuncTank*)Instance(pTarget); m_pTank = (CFuncTank*)Instance( pTarget );
} }
void CFuncTankControls::Spawn( void ) void CFuncTankControls::Spawn( void )
@ -1004,11 +1001,11 @@ void CFuncTankControls::Spawn( void )
pev->solid = SOLID_TRIGGER; pev->solid = SOLID_TRIGGER;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->effects |= EF_NODRAW; pev->effects |= EF_NODRAW;
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
UTIL_SetSize( pev, pev->mins, pev->maxs ); UTIL_SetSize( pev, pev->mins, pev->maxs );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
pev->nextthink = gpGlobals->time + 0.3; // After all the func_tank's have spawned pev->nextthink = gpGlobals->time + 0.3; // After all the func_tank's have spawned
CBaseEntity::Spawn(); CBaseEntity::Spawn();

View File

@ -17,34 +17,34 @@
#include "util.h" #include "util.h"
#include "game.h" #include "game.h"
cvar_t displaysoundlist = {"displaysoundlist","0"}; cvar_t displaysoundlist = {"displaysoundlist","0"};
// multiplayer server rules // multiplayer server rules
cvar_t fragsleft = {"mp_fragsleft","0", FCVAR_SERVER | FCVAR_UNLOGGED }; // Don't spam console/log files/users with this changing cvar_t fragsleft = { "mp_fragsleft","0", FCVAR_SERVER | FCVAR_UNLOGGED }; // Don't spam console/log files/users with this changing
cvar_t timeleft = {"mp_timeleft","0" , FCVAR_SERVER | FCVAR_UNLOGGED }; // " " cvar_t timeleft = { "mp_timeleft","0" , FCVAR_SERVER | FCVAR_UNLOGGED }; // " "
// multiplayer server rules // multiplayer server rules
cvar_t teamplay = {"mp_teamplay","0", FCVAR_SERVER }; cvar_t teamplay = { "mp_teamplay","0", FCVAR_SERVER };
cvar_t fraglimit = {"mp_fraglimit","0", FCVAR_SERVER }; cvar_t fraglimit = {"mp_fraglimit","0", FCVAR_SERVER };
cvar_t timelimit = {"mp_timelimit","0", FCVAR_SERVER }; cvar_t timelimit = { "mp_timelimit","0", FCVAR_SERVER };
cvar_t friendlyfire= {"mp_friendlyfire","0", FCVAR_SERVER }; cvar_t friendlyfire = { "mp_friendlyfire","0", FCVAR_SERVER };
cvar_t falldamage = {"mp_falldamage","0", FCVAR_SERVER }; cvar_t falldamage = { "mp_falldamage","0", FCVAR_SERVER };
cvar_t weaponstay = {"mp_weaponstay","0", FCVAR_SERVER }; cvar_t weaponstay = { "mp_weaponstay","0", FCVAR_SERVER };
cvar_t forcerespawn= {"mp_forcerespawn","1", FCVAR_SERVER }; cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER };
cvar_t flashlight = {"mp_flashlight","0", FCVAR_SERVER }; cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER };
cvar_t aimcrosshair= {"mp_autocrosshair","1", FCVAR_SERVER }; cvar_t aimcrosshair = { "mp_autocrosshair","1", FCVAR_SERVER };
cvar_t decalfrequency = {"decalfrequency","30", FCVAR_SERVER }; cvar_t decalfrequency = { "decalfrequency","30", FCVAR_SERVER };
cvar_t teamlist = {"mp_teamlist","hgrunt;scientist", FCVAR_SERVER }; cvar_t teamlist = { "mp_teamlist","hgrunt;scientist", FCVAR_SERVER };
cvar_t teamoverride = {"mp_teamoverride","1" }; cvar_t teamoverride = { "mp_teamoverride","1" };
cvar_t defaultteam = {"mp_defaultteam","0" }; cvar_t defaultteam = { "mp_defaultteam","0" };
cvar_t allowmonsters={"mp_allowmonsters","0", FCVAR_SERVER }; cvar_t allowmonsters = { "mp_allowmonsters","0", FCVAR_SERVER };
cvar_t mp_chattime = {"mp_chattime","10", FCVAR_SERVER }; cvar_t mp_chattime = { "mp_chattime","10", FCVAR_SERVER };
// Engine Cvars // Engine Cvars
cvar_t *g_psv_gravity = NULL; cvar_t *g_psv_gravity = NULL;
cvar_t *g_psv_aim = NULL; cvar_t *g_psv_aim = NULL;
cvar_t *g_footsteps = NULL; cvar_t *g_footsteps = NULL;
//CVARS FOR SKILL LEVEL SETTINGS //CVARS FOR SKILL LEVEL SETTINGS
// Agrunt // Agrunt
@ -57,14 +57,14 @@ cvar_t sk_agrunt_dmg_punch2 = {"sk_agrunt_dmg_punch2","0"};
cvar_t sk_agrunt_dmg_punch3 = {"sk_agrunt_dmg_punch3","0"}; cvar_t sk_agrunt_dmg_punch3 = {"sk_agrunt_dmg_punch3","0"};
// Apache // Apache
cvar_t sk_apache_health1 = {"sk_apache_health1","0"}; cvar_t sk_apache_health1 = {"sk_apache_health1","0"};
cvar_t sk_apache_health2 = {"sk_apache_health2","0"}; cvar_t sk_apache_health2 = {"sk_apache_health2","0"};
cvar_t sk_apache_health3 = {"sk_apache_health3","0"}; cvar_t sk_apache_health3 = {"sk_apache_health3","0"};
// Barney // Barney
cvar_t sk_barney_health1 = {"sk_barney_health1","0"}; cvar_t sk_barney_health1 = {"sk_barney_health1","0"};
cvar_t sk_barney_health2 = {"sk_barney_health2","0"}; cvar_t sk_barney_health2 = {"sk_barney_health2","0"};
cvar_t sk_barney_health3 = {"sk_barney_health3","0"}; cvar_t sk_barney_health3 = {"sk_barney_health3","0"};
// Bullsquid // Bullsquid
cvar_t sk_bullsquid_health1 = {"sk_bullsquid_health1","0"}; cvar_t sk_bullsquid_health1 = {"sk_bullsquid_health1","0"};
@ -230,7 +230,6 @@ cvar_t sk_scientist_health1 = {"sk_scientist_health1","0"};
cvar_t sk_scientist_health2 = {"sk_scientist_health2","0"}; cvar_t sk_scientist_health2 = {"sk_scientist_health2","0"};
cvar_t sk_scientist_health3 = {"sk_scientist_health3","0"}; cvar_t sk_scientist_health3 = {"sk_scientist_health3","0"};
// Snark // Snark
cvar_t sk_snark_health1 = {"sk_snark_health1","0"}; cvar_t sk_snark_health1 = {"sk_snark_health1","0"};
cvar_t sk_snark_health2 = {"sk_snark_health2","0"}; cvar_t sk_snark_health2 = {"sk_snark_health2","0"};
@ -244,8 +243,6 @@ cvar_t sk_snark_dmg_pop1 = {"sk_snark_dmg_pop1","0"};
cvar_t sk_snark_dmg_pop2 = {"sk_snark_dmg_pop2","0"}; cvar_t sk_snark_dmg_pop2 = {"sk_snark_dmg_pop2","0"};
cvar_t sk_snark_dmg_pop3 = {"sk_snark_dmg_pop3","0"}; cvar_t sk_snark_dmg_pop3 = {"sk_snark_dmg_pop3","0"};
// Zombie // Zombie
cvar_t sk_zombie_health1 = {"sk_zombie_health1","0"}; cvar_t sk_zombie_health1 = {"sk_zombie_health1","0"};
cvar_t sk_zombie_health2 = {"sk_zombie_health2","0"}; cvar_t sk_zombie_health2 = {"sk_zombie_health2","0"};
@ -259,25 +256,21 @@ cvar_t sk_zombie_dmg_both_slash1 = {"sk_zombie_dmg_both_slash1","0"};
cvar_t sk_zombie_dmg_both_slash2 = {"sk_zombie_dmg_both_slash2","0"}; cvar_t sk_zombie_dmg_both_slash2 = {"sk_zombie_dmg_both_slash2","0"};
cvar_t sk_zombie_dmg_both_slash3 = {"sk_zombie_dmg_both_slash3","0"}; cvar_t sk_zombie_dmg_both_slash3 = {"sk_zombie_dmg_both_slash3","0"};
//Turret //Turret
cvar_t sk_turret_health1 = {"sk_turret_health1","0"}; cvar_t sk_turret_health1 = {"sk_turret_health1","0"};
cvar_t sk_turret_health2 = {"sk_turret_health2","0"}; cvar_t sk_turret_health2 = {"sk_turret_health2","0"};
cvar_t sk_turret_health3 = {"sk_turret_health3","0"}; cvar_t sk_turret_health3 = {"sk_turret_health3","0"};
// MiniTurret // MiniTurret
cvar_t sk_miniturret_health1 = {"sk_miniturret_health1","0"}; cvar_t sk_miniturret_health1 = {"sk_miniturret_health1","0"};
cvar_t sk_miniturret_health2 = {"sk_miniturret_health2","0"}; cvar_t sk_miniturret_health2 = {"sk_miniturret_health2","0"};
cvar_t sk_miniturret_health3 = {"sk_miniturret_health3","0"}; cvar_t sk_miniturret_health3 = {"sk_miniturret_health3","0"};
// Sentry Turret // Sentry Turret
cvar_t sk_sentry_health1 = {"sk_sentry_health1","0"}; cvar_t sk_sentry_health1 = {"sk_sentry_health1","0"};
cvar_t sk_sentry_health2 = {"sk_sentry_health2","0"}; cvar_t sk_sentry_health2 = {"sk_sentry_health2","0"};
cvar_t sk_sentry_health3 = {"sk_sentry_health3","0"}; cvar_t sk_sentry_health3 = {"sk_sentry_health3","0"};
// PLAYER WEAPONS // PLAYER WEAPONS
// Crowbar whack // Crowbar whack
@ -430,13 +423,13 @@ cvar_t sk_player_head1 = { "sk_player_head1","2" };
cvar_t sk_player_head2 = { "sk_player_head2","2" }; cvar_t sk_player_head2 = { "sk_player_head2","2" };
cvar_t sk_player_head3 = { "sk_player_head3","2" }; cvar_t sk_player_head3 = { "sk_player_head3","2" };
cvar_t sk_player_chest1 = { "sk_player_chest1","1" }; cvar_t sk_player_chest1 = { "sk_player_chest1","1" };
cvar_t sk_player_chest2 = { "sk_player_chest2","1" }; cvar_t sk_player_chest2 = { "sk_player_chest2","1" };
cvar_t sk_player_chest3 = { "sk_player_chest3","1" }; cvar_t sk_player_chest3 = { "sk_player_chest3","1" };
cvar_t sk_player_stomach1 = { "sk_player_stomach1","1" }; cvar_t sk_player_stomach1 = { "sk_player_stomach1","1" };
cvar_t sk_player_stomach2 = { "sk_player_stomach2","1" }; cvar_t sk_player_stomach2 = { "sk_player_stomach2","1" };
cvar_t sk_player_stomach3 = { "sk_player_stomach3","1" }; cvar_t sk_player_stomach3 = { "sk_player_stomach3","1" };
cvar_t sk_player_arm1 = { "sk_player_arm1","1" }; cvar_t sk_player_arm1 = { "sk_player_arm1","1" };
cvar_t sk_player_arm2 = { "sk_player_arm2","1" }; cvar_t sk_player_arm2 = { "sk_player_arm2","1" };
@ -458,428 +451,402 @@ void GameDLLInit( void )
g_psv_aim = CVAR_GET_POINTER( "sv_aim" ); g_psv_aim = CVAR_GET_POINTER( "sv_aim" );
g_footsteps = CVAR_GET_POINTER( "mp_footsteps" ); g_footsteps = CVAR_GET_POINTER( "mp_footsteps" );
CVAR_REGISTER (&displaysoundlist); CVAR_REGISTER( &displaysoundlist );
CVAR_REGISTER (&teamplay); CVAR_REGISTER( &teamplay );
CVAR_REGISTER (&fraglimit); CVAR_REGISTER( &fraglimit );
CVAR_REGISTER (&timelimit); CVAR_REGISTER( &timelimit );
CVAR_REGISTER (&fragsleft); CVAR_REGISTER( &fragsleft );
CVAR_REGISTER (&timeleft); CVAR_REGISTER( &timeleft );
CVAR_REGISTER (&friendlyfire); CVAR_REGISTER( &friendlyfire );
CVAR_REGISTER (&falldamage); CVAR_REGISTER( &falldamage );
CVAR_REGISTER (&weaponstay); CVAR_REGISTER( &weaponstay );
CVAR_REGISTER (&forcerespawn); CVAR_REGISTER( &forcerespawn );
CVAR_REGISTER (&flashlight); CVAR_REGISTER( &flashlight );
CVAR_REGISTER (&aimcrosshair); CVAR_REGISTER( &aimcrosshair );
CVAR_REGISTER (&decalfrequency); CVAR_REGISTER( &decalfrequency );
CVAR_REGISTER (&teamlist); CVAR_REGISTER( &teamlist );
CVAR_REGISTER (&teamoverride); CVAR_REGISTER( &teamoverride );
CVAR_REGISTER (&defaultteam); CVAR_REGISTER( &defaultteam );
CVAR_REGISTER (&allowmonsters); CVAR_REGISTER( &allowmonsters );
CVAR_REGISTER (&mp_chattime); CVAR_REGISTER( &mp_chattime );
// REGISTER CVARS FOR SKILL LEVEL STUFF // REGISTER CVARS FOR SKILL LEVEL STUFF
// Agrunt // Agrunt
CVAR_REGISTER ( &sk_agrunt_health1 );// {"sk_agrunt_health1","0"}; CVAR_REGISTER( &sk_agrunt_health1 );// {"sk_agrunt_health1","0"};
CVAR_REGISTER ( &sk_agrunt_health2 );// {"sk_agrunt_health2","0"}; CVAR_REGISTER( &sk_agrunt_health2 );// {"sk_agrunt_health2","0"};
CVAR_REGISTER ( &sk_agrunt_health3 );// {"sk_agrunt_health3","0"}; CVAR_REGISTER( &sk_agrunt_health3 );// {"sk_agrunt_health3","0"};
CVAR_REGISTER ( &sk_agrunt_dmg_punch1 );// {"sk_agrunt_dmg_punch1","0"}; CVAR_REGISTER( &sk_agrunt_dmg_punch1 );// {"sk_agrunt_dmg_punch1","0"};
CVAR_REGISTER ( &sk_agrunt_dmg_punch2 );// {"sk_agrunt_dmg_punch2","0"}; CVAR_REGISTER( &sk_agrunt_dmg_punch2 );// {"sk_agrunt_dmg_punch2","0"};
CVAR_REGISTER ( &sk_agrunt_dmg_punch3 );// {"sk_agrunt_dmg_punch3","0"}; CVAR_REGISTER( &sk_agrunt_dmg_punch3 );// {"sk_agrunt_dmg_punch3","0"};
// Apache // Apache
CVAR_REGISTER ( &sk_apache_health1 );// {"sk_apache_health1","0"}; CVAR_REGISTER( &sk_apache_health1 );// {"sk_apache_health1","0"};
CVAR_REGISTER ( &sk_apache_health2 );// {"sk_apache_health2","0"}; CVAR_REGISTER( &sk_apache_health2 );// {"sk_apache_health2","0"};
CVAR_REGISTER ( &sk_apache_health3 );// {"sk_apache_health3","0"}; CVAR_REGISTER( &sk_apache_health3 );// {"sk_apache_health3","0"};
// Barney // Barney
CVAR_REGISTER ( &sk_barney_health1 );// {"sk_barney_health1","0"}; CVAR_REGISTER( &sk_barney_health1 );// {"sk_barney_health1","0"};
CVAR_REGISTER ( &sk_barney_health2 );// {"sk_barney_health2","0"}; CVAR_REGISTER( &sk_barney_health2 );// {"sk_barney_health2","0"};
CVAR_REGISTER ( &sk_barney_health3 );// {"sk_barney_health3","0"}; CVAR_REGISTER( &sk_barney_health3 );// {"sk_barney_health3","0"};
// Bullsquid // Bullsquid
CVAR_REGISTER ( &sk_bullsquid_health1 );// {"sk_bullsquid_health1","0"}; CVAR_REGISTER( &sk_bullsquid_health1 );// {"sk_bullsquid_health1","0"};
CVAR_REGISTER ( &sk_bullsquid_health2 );// {"sk_bullsquid_health2","0"}; CVAR_REGISTER( &sk_bullsquid_health2 );// {"sk_bullsquid_health2","0"};
CVAR_REGISTER ( &sk_bullsquid_health3 );// {"sk_bullsquid_health3","0"}; CVAR_REGISTER( &sk_bullsquid_health3 );// {"sk_bullsquid_health3","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_bite1 );// {"sk_bullsquid_dmg_bite1","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_bite1 );// {"sk_bullsquid_dmg_bite1","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_bite2 );// {"sk_bullsquid_dmg_bite2","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_bite2 );// {"sk_bullsquid_dmg_bite2","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_bite3 );// {"sk_bullsquid_dmg_bite3","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_bite3 );// {"sk_bullsquid_dmg_bite3","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_whip1 );// {"sk_bullsquid_dmg_whip1","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_whip1 );// {"sk_bullsquid_dmg_whip1","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_whip2 );// {"sk_bullsquid_dmg_whip2","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_whip2 );// {"sk_bullsquid_dmg_whip2","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_whip3 );// {"sk_bullsquid_dmg_whip3","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_whip3 );// {"sk_bullsquid_dmg_whip3","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_spit1 );// {"sk_bullsquid_dmg_spit1","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_spit1 );// {"sk_bullsquid_dmg_spit1","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_spit2 );// {"sk_bullsquid_dmg_spit2","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_spit2 );// {"sk_bullsquid_dmg_spit2","0"};
CVAR_REGISTER ( &sk_bullsquid_dmg_spit3 );// {"sk_bullsquid_dmg_spit3","0"}; CVAR_REGISTER( &sk_bullsquid_dmg_spit3 );// {"sk_bullsquid_dmg_spit3","0"};
CVAR_REGISTER( &sk_bigmomma_health_factor1 );// {"sk_bigmomma_health_factor1","1.0"};
CVAR_REGISTER( &sk_bigmomma_health_factor2 );// {"sk_bigmomma_health_factor2","1.0"};
CVAR_REGISTER( &sk_bigmomma_health_factor3 );// {"sk_bigmomma_health_factor3","1.0"};
CVAR_REGISTER ( &sk_bigmomma_health_factor1 );// {"sk_bigmomma_health_factor1","1.0"}; CVAR_REGISTER( &sk_bigmomma_dmg_slash1 );// {"sk_bigmomma_dmg_slash1","50"};
CVAR_REGISTER ( &sk_bigmomma_health_factor2 );// {"sk_bigmomma_health_factor2","1.0"}; CVAR_REGISTER( &sk_bigmomma_dmg_slash2 );// {"sk_bigmomma_dmg_slash2","50"};
CVAR_REGISTER ( &sk_bigmomma_health_factor3 );// {"sk_bigmomma_health_factor3","1.0"}; CVAR_REGISTER( &sk_bigmomma_dmg_slash3 );// {"sk_bigmomma_dmg_slash3","50"};
CVAR_REGISTER ( &sk_bigmomma_dmg_slash1 );// {"sk_bigmomma_dmg_slash1","50"}; CVAR_REGISTER( &sk_bigmomma_dmg_blast1 );// {"sk_bigmomma_dmg_blast1","100"};
CVAR_REGISTER ( &sk_bigmomma_dmg_slash2 );// {"sk_bigmomma_dmg_slash2","50"}; CVAR_REGISTER( &sk_bigmomma_dmg_blast2 );// {"sk_bigmomma_dmg_blast2","100"};
CVAR_REGISTER ( &sk_bigmomma_dmg_slash3 );// {"sk_bigmomma_dmg_slash3","50"}; CVAR_REGISTER( &sk_bigmomma_dmg_blast3 );// {"sk_bigmomma_dmg_blast3","100"};
CVAR_REGISTER ( &sk_bigmomma_dmg_blast1 );// {"sk_bigmomma_dmg_blast1","100"}; CVAR_REGISTER( &sk_bigmomma_radius_blast1 );// {"sk_bigmomma_radius_blast1","250"};
CVAR_REGISTER ( &sk_bigmomma_dmg_blast2 );// {"sk_bigmomma_dmg_blast2","100"}; CVAR_REGISTER( &sk_bigmomma_radius_blast2 );// {"sk_bigmomma_radius_blast2","250"};
CVAR_REGISTER ( &sk_bigmomma_dmg_blast3 );// {"sk_bigmomma_dmg_blast3","100"}; CVAR_REGISTER( &sk_bigmomma_radius_blast3 );// {"sk_bigmomma_radius_blast3","250"};
CVAR_REGISTER ( &sk_bigmomma_radius_blast1 );// {"sk_bigmomma_radius_blast1","250"};
CVAR_REGISTER ( &sk_bigmomma_radius_blast2 );// {"sk_bigmomma_radius_blast2","250"};
CVAR_REGISTER ( &sk_bigmomma_radius_blast3 );// {"sk_bigmomma_radius_blast3","250"};
// Gargantua // Gargantua
CVAR_REGISTER ( &sk_gargantua_health1 );// {"sk_gargantua_health1","0"}; CVAR_REGISTER( &sk_gargantua_health1 );// {"sk_gargantua_health1","0"};
CVAR_REGISTER ( &sk_gargantua_health2 );// {"sk_gargantua_health2","0"}; CVAR_REGISTER( &sk_gargantua_health2 );// {"sk_gargantua_health2","0"};
CVAR_REGISTER ( &sk_gargantua_health3 );// {"sk_gargantua_health3","0"}; CVAR_REGISTER( &sk_gargantua_health3 );// {"sk_gargantua_health3","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_slash1 );// {"sk_gargantua_dmg_slash1","0"}; CVAR_REGISTER( &sk_gargantua_dmg_slash1 );// {"sk_gargantua_dmg_slash1","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_slash2 );// {"sk_gargantua_dmg_slash2","0"}; CVAR_REGISTER( &sk_gargantua_dmg_slash2 );// {"sk_gargantua_dmg_slash2","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_slash3 );// {"sk_gargantua_dmg_slash3","0"}; CVAR_REGISTER( &sk_gargantua_dmg_slash3 );// {"sk_gargantua_dmg_slash3","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_fire1 );// {"sk_gargantua_dmg_fire1","0"}; CVAR_REGISTER( &sk_gargantua_dmg_fire1 );// {"sk_gargantua_dmg_fire1","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_fire2 );// {"sk_gargantua_dmg_fire2","0"}; CVAR_REGISTER( &sk_gargantua_dmg_fire2 );// {"sk_gargantua_dmg_fire2","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_fire3 );// {"sk_gargantua_dmg_fire3","0"}; CVAR_REGISTER( &sk_gargantua_dmg_fire3 );// {"sk_gargantua_dmg_fire3","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_stomp1 );// {"sk_gargantua_dmg_stomp1","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_stomp2 );// {"sk_gargantua_dmg_stomp2","0"};
CVAR_REGISTER ( &sk_gargantua_dmg_stomp3 );// {"sk_gargantua_dmg_stomp3","0"};
CVAR_REGISTER( &sk_gargantua_dmg_stomp1 );// {"sk_gargantua_dmg_stomp1","0"};
CVAR_REGISTER( &sk_gargantua_dmg_stomp2 );// {"sk_gargantua_dmg_stomp2","0"};
CVAR_REGISTER( &sk_gargantua_dmg_stomp3 );// {"sk_gargantua_dmg_stomp3","0"};
// Hassassin // Hassassin
CVAR_REGISTER ( &sk_hassassin_health1 );// {"sk_hassassin_health1","0"}; CVAR_REGISTER( &sk_hassassin_health1 );// {"sk_hassassin_health1","0"};
CVAR_REGISTER ( &sk_hassassin_health2 );// {"sk_hassassin_health2","0"}; CVAR_REGISTER( &sk_hassassin_health2 );// {"sk_hassassin_health2","0"};
CVAR_REGISTER ( &sk_hassassin_health3 );// {"sk_hassassin_health3","0"}; CVAR_REGISTER( &sk_hassassin_health3 );// {"sk_hassassin_health3","0"};
// Headcrab // Headcrab
CVAR_REGISTER ( &sk_headcrab_health1 );// {"sk_headcrab_health1","0"}; CVAR_REGISTER( &sk_headcrab_health1 );// {"sk_headcrab_health1","0"};
CVAR_REGISTER ( &sk_headcrab_health2 );// {"sk_headcrab_health2","0"}; CVAR_REGISTER( &sk_headcrab_health2 );// {"sk_headcrab_health2","0"};
CVAR_REGISTER ( &sk_headcrab_health3 );// {"sk_headcrab_health3","0"}; CVAR_REGISTER( &sk_headcrab_health3 );// {"sk_headcrab_health3","0"};
CVAR_REGISTER ( &sk_headcrab_dmg_bite1 );// {"sk_headcrab_dmg_bite1","0"}; CVAR_REGISTER( &sk_headcrab_dmg_bite1 );// {"sk_headcrab_dmg_bite1","0"};
CVAR_REGISTER ( &sk_headcrab_dmg_bite2 );// {"sk_headcrab_dmg_bite2","0"}; CVAR_REGISTER( &sk_headcrab_dmg_bite2 );// {"sk_headcrab_dmg_bite2","0"};
CVAR_REGISTER ( &sk_headcrab_dmg_bite3 );// {"sk_headcrab_dmg_bite3","0"}; CVAR_REGISTER( &sk_headcrab_dmg_bite3 );// {"sk_headcrab_dmg_bite3","0"};
// Hgrunt
CVAR_REGISTER( &sk_hgrunt_health1 );// {"sk_hgrunt_health1","0"};
CVAR_REGISTER( &sk_hgrunt_health2 );// {"sk_hgrunt_health2","0"};
CVAR_REGISTER( &sk_hgrunt_health3 );// {"sk_hgrunt_health3","0"};
// Hgrunt CVAR_REGISTER( &sk_hgrunt_kick1 );// {"sk_hgrunt_kick1","0"};
CVAR_REGISTER ( &sk_hgrunt_health1 );// {"sk_hgrunt_health1","0"}; CVAR_REGISTER( &sk_hgrunt_kick2 );// {"sk_hgrunt_kick2","0"};
CVAR_REGISTER ( &sk_hgrunt_health2 );// {"sk_hgrunt_health2","0"}; CVAR_REGISTER( &sk_hgrunt_kick3 );// {"sk_hgrunt_kick3","0"};
CVAR_REGISTER ( &sk_hgrunt_health3 );// {"sk_hgrunt_health3","0"};
CVAR_REGISTER ( &sk_hgrunt_kick1 );// {"sk_hgrunt_kick1","0"}; CVAR_REGISTER( &sk_hgrunt_pellets1 );
CVAR_REGISTER ( &sk_hgrunt_kick2 );// {"sk_hgrunt_kick2","0"}; CVAR_REGISTER( &sk_hgrunt_pellets2 );
CVAR_REGISTER ( &sk_hgrunt_kick3 );// {"sk_hgrunt_kick3","0"}; CVAR_REGISTER( &sk_hgrunt_pellets3 );
CVAR_REGISTER ( &sk_hgrunt_pellets1 ); CVAR_REGISTER( &sk_hgrunt_gspeed1 );
CVAR_REGISTER ( &sk_hgrunt_pellets2 ); CVAR_REGISTER( &sk_hgrunt_gspeed2 );
CVAR_REGISTER ( &sk_hgrunt_pellets3 ); CVAR_REGISTER( &sk_hgrunt_gspeed3 );
CVAR_REGISTER ( &sk_hgrunt_gspeed1 );
CVAR_REGISTER ( &sk_hgrunt_gspeed2 );
CVAR_REGISTER ( &sk_hgrunt_gspeed3 );
// Houndeye // Houndeye
CVAR_REGISTER ( &sk_houndeye_health1 );// {"sk_houndeye_health1","0"}; CVAR_REGISTER( &sk_houndeye_health1 );// {"sk_houndeye_health1","0"};
CVAR_REGISTER ( &sk_houndeye_health2 );// {"sk_houndeye_health2","0"}; CVAR_REGISTER( &sk_houndeye_health2 );// {"sk_houndeye_health2","0"};
CVAR_REGISTER ( &sk_houndeye_health3 );// {"sk_houndeye_health3","0"}; CVAR_REGISTER( &sk_houndeye_health3 );// {"sk_houndeye_health3","0"};
CVAR_REGISTER ( &sk_houndeye_dmg_blast1 );// {"sk_houndeye_dmg_blast1","0"};
CVAR_REGISTER ( &sk_houndeye_dmg_blast2 );// {"sk_houndeye_dmg_blast2","0"};
CVAR_REGISTER ( &sk_houndeye_dmg_blast3 );// {"sk_houndeye_dmg_blast3","0"};
CVAR_REGISTER( &sk_houndeye_dmg_blast1 );// {"sk_houndeye_dmg_blast1","0"};
CVAR_REGISTER( &sk_houndeye_dmg_blast2 );// {"sk_houndeye_dmg_blast2","0"};
CVAR_REGISTER( &sk_houndeye_dmg_blast3 );// {"sk_houndeye_dmg_blast3","0"};
// ISlave // ISlave
CVAR_REGISTER ( &sk_islave_health1 );// {"sk_islave_health1","0"}; CVAR_REGISTER( &sk_islave_health1 );// {"sk_islave_health1","0"};
CVAR_REGISTER ( &sk_islave_health2 );// {"sk_islave_health2","0"}; CVAR_REGISTER( &sk_islave_health2 );// {"sk_islave_health2","0"};
CVAR_REGISTER ( &sk_islave_health3 );// {"sk_islave_health3","0"}; CVAR_REGISTER( &sk_islave_health3 );// {"sk_islave_health3","0"};
CVAR_REGISTER ( &sk_islave_dmg_claw1 );// {"sk_islave_dmg_claw1","0"}; CVAR_REGISTER( &sk_islave_dmg_claw1 );// {"sk_islave_dmg_claw1","0"};
CVAR_REGISTER ( &sk_islave_dmg_claw2 );// {"sk_islave_dmg_claw2","0"}; CVAR_REGISTER( &sk_islave_dmg_claw2 );// {"sk_islave_dmg_claw2","0"};
CVAR_REGISTER ( &sk_islave_dmg_claw3 );// {"sk_islave_dmg_claw3","0"}; CVAR_REGISTER( &sk_islave_dmg_claw3 );// {"sk_islave_dmg_claw3","0"};
CVAR_REGISTER ( &sk_islave_dmg_clawrake1 );// {"sk_islave_dmg_clawrake1","0"}; CVAR_REGISTER( &sk_islave_dmg_clawrake1 );// {"sk_islave_dmg_clawrake1","0"};
CVAR_REGISTER ( &sk_islave_dmg_clawrake2 );// {"sk_islave_dmg_clawrake2","0"}; CVAR_REGISTER( &sk_islave_dmg_clawrake2 );// {"sk_islave_dmg_clawrake2","0"};
CVAR_REGISTER ( &sk_islave_dmg_clawrake3 );// {"sk_islave_dmg_clawrake3","0"}; CVAR_REGISTER( &sk_islave_dmg_clawrake3 );// {"sk_islave_dmg_clawrake3","0"};
CVAR_REGISTER ( &sk_islave_dmg_zap1 );// {"sk_islave_dmg_zap1","0"};
CVAR_REGISTER ( &sk_islave_dmg_zap2 );// {"sk_islave_dmg_zap2","0"};
CVAR_REGISTER ( &sk_islave_dmg_zap3 );// {"sk_islave_dmg_zap3","0"};
CVAR_REGISTER( &sk_islave_dmg_zap1 );// {"sk_islave_dmg_zap1","0"};
CVAR_REGISTER( &sk_islave_dmg_zap2 );// {"sk_islave_dmg_zap2","0"};
CVAR_REGISTER( &sk_islave_dmg_zap3 );// {"sk_islave_dmg_zap3","0"};
// Icthyosaur // Icthyosaur
CVAR_REGISTER ( &sk_ichthyosaur_health1 );// {"sk_ichthyosaur_health1","0"}; CVAR_REGISTER( &sk_ichthyosaur_health1 );// {"sk_ichthyosaur_health1","0"};
CVAR_REGISTER ( &sk_ichthyosaur_health2 );// {"sk_ichthyosaur_health2","0"}; CVAR_REGISTER( &sk_ichthyosaur_health2 );// {"sk_ichthyosaur_health2","0"};
CVAR_REGISTER ( &sk_ichthyosaur_health3 );// {"sk_ichthyosaur_health3","0"}; CVAR_REGISTER( &sk_ichthyosaur_health3 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER ( &sk_ichthyosaur_shake1 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER ( &sk_ichthyosaur_shake2 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER ( &sk_ichthyosaur_shake3 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER( &sk_ichthyosaur_shake1 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER( &sk_ichthyosaur_shake2 );// {"sk_ichthyosaur_health3","0"};
CVAR_REGISTER( &sk_ichthyosaur_shake3 );// {"sk_ichthyosaur_health3","0"};
// Leech // Leech
CVAR_REGISTER ( &sk_leech_health1 );// {"sk_leech_health1","0"}; CVAR_REGISTER( &sk_leech_health1 );// {"sk_leech_health1","0"};
CVAR_REGISTER ( &sk_leech_health2 );// {"sk_leech_health2","0"}; CVAR_REGISTER( &sk_leech_health2 );// {"sk_leech_health2","0"};
CVAR_REGISTER ( &sk_leech_health3 );// {"sk_leech_health3","0"}; CVAR_REGISTER( &sk_leech_health3 );// {"sk_leech_health3","0"};
CVAR_REGISTER ( &sk_leech_dmg_bite1 );// {"sk_leech_dmg_bite1","0"};
CVAR_REGISTER ( &sk_leech_dmg_bite2 );// {"sk_leech_dmg_bite2","0"};
CVAR_REGISTER ( &sk_leech_dmg_bite3 );// {"sk_leech_dmg_bite3","0"};
CVAR_REGISTER( &sk_leech_dmg_bite1 );// {"sk_leech_dmg_bite1","0"};
CVAR_REGISTER( &sk_leech_dmg_bite2 );// {"sk_leech_dmg_bite2","0"};
CVAR_REGISTER( &sk_leech_dmg_bite3 );// {"sk_leech_dmg_bite3","0"};
// Controller // Controller
CVAR_REGISTER ( &sk_controller_health1 ); CVAR_REGISTER( &sk_controller_health1 );
CVAR_REGISTER ( &sk_controller_health2 ); CVAR_REGISTER( &sk_controller_health2 );
CVAR_REGISTER ( &sk_controller_health3 ); CVAR_REGISTER( &sk_controller_health3 );
CVAR_REGISTER ( &sk_controller_dmgzap1 ); CVAR_REGISTER( &sk_controller_dmgzap1 );
CVAR_REGISTER ( &sk_controller_dmgzap2 ); CVAR_REGISTER( &sk_controller_dmgzap2 );
CVAR_REGISTER ( &sk_controller_dmgzap3 ); CVAR_REGISTER( &sk_controller_dmgzap3 );
CVAR_REGISTER ( &sk_controller_speedball1 ); CVAR_REGISTER( &sk_controller_speedball1 );
CVAR_REGISTER ( &sk_controller_speedball2 ); CVAR_REGISTER( &sk_controller_speedball2 );
CVAR_REGISTER ( &sk_controller_speedball3 ); CVAR_REGISTER( &sk_controller_speedball3 );
CVAR_REGISTER ( &sk_controller_dmgball1 ); CVAR_REGISTER( &sk_controller_dmgball1 );
CVAR_REGISTER ( &sk_controller_dmgball2 ); CVAR_REGISTER( &sk_controller_dmgball2 );
CVAR_REGISTER ( &sk_controller_dmgball3 ); CVAR_REGISTER( &sk_controller_dmgball3 );
// Nihilanth // Nihilanth
CVAR_REGISTER ( &sk_nihilanth_health1 );// {"sk_nihilanth_health1","0"}; CVAR_REGISTER( &sk_nihilanth_health1 );// {"sk_nihilanth_health1","0"};
CVAR_REGISTER ( &sk_nihilanth_health2 );// {"sk_nihilanth_health2","0"}; CVAR_REGISTER( &sk_nihilanth_health2 );// {"sk_nihilanth_health2","0"};
CVAR_REGISTER ( &sk_nihilanth_health3 );// {"sk_nihilanth_health3","0"}; CVAR_REGISTER( &sk_nihilanth_health3 );// {"sk_nihilanth_health3","0"};
CVAR_REGISTER ( &sk_nihilanth_zap1 ); CVAR_REGISTER( &sk_nihilanth_zap1 );
CVAR_REGISTER ( &sk_nihilanth_zap2 ); CVAR_REGISTER( &sk_nihilanth_zap2 );
CVAR_REGISTER ( &sk_nihilanth_zap3 ); CVAR_REGISTER( &sk_nihilanth_zap3 );
// Scientist // Scientist
CVAR_REGISTER ( &sk_scientist_health1 );// {"sk_scientist_health1","0"}; CVAR_REGISTER( &sk_scientist_health1 );// {"sk_scientist_health1","0"};
CVAR_REGISTER ( &sk_scientist_health2 );// {"sk_scientist_health2","0"}; CVAR_REGISTER( &sk_scientist_health2 );// {"sk_scientist_health2","0"};
CVAR_REGISTER ( &sk_scientist_health3 );// {"sk_scientist_health3","0"}; CVAR_REGISTER( &sk_scientist_health3 );// {"sk_scientist_health3","0"};
// Snark // Snark
CVAR_REGISTER ( &sk_snark_health1 );// {"sk_snark_health1","0"}; CVAR_REGISTER( &sk_snark_health1 );// {"sk_snark_health1","0"};
CVAR_REGISTER ( &sk_snark_health2 );// {"sk_snark_health2","0"}; CVAR_REGISTER( &sk_snark_health2 );// {"sk_snark_health2","0"};
CVAR_REGISTER ( &sk_snark_health3 );// {"sk_snark_health3","0"}; CVAR_REGISTER( &sk_snark_health3 );// {"sk_snark_health3","0"};
CVAR_REGISTER ( &sk_snark_dmg_bite1 );// {"sk_snark_dmg_bite1","0"};
CVAR_REGISTER ( &sk_snark_dmg_bite2 );// {"sk_snark_dmg_bite2","0"};
CVAR_REGISTER ( &sk_snark_dmg_bite3 );// {"sk_snark_dmg_bite3","0"};
CVAR_REGISTER ( &sk_snark_dmg_pop1 );// {"sk_snark_dmg_pop1","0"};
CVAR_REGISTER ( &sk_snark_dmg_pop2 );// {"sk_snark_dmg_pop2","0"};
CVAR_REGISTER ( &sk_snark_dmg_pop3 );// {"sk_snark_dmg_pop3","0"};
CVAR_REGISTER( &sk_snark_dmg_bite1 );// {"sk_snark_dmg_bite1","0"};
CVAR_REGISTER( &sk_snark_dmg_bite2 );// {"sk_snark_dmg_bite2","0"};
CVAR_REGISTER( &sk_snark_dmg_bite3 );// {"sk_snark_dmg_bite3","0"};
CVAR_REGISTER( &sk_snark_dmg_pop1 );// {"sk_snark_dmg_pop1","0"};
CVAR_REGISTER( &sk_snark_dmg_pop2 );// {"sk_snark_dmg_pop2","0"};
CVAR_REGISTER( &sk_snark_dmg_pop3 );// {"sk_snark_dmg_pop3","0"};
// Zombie // Zombie
CVAR_REGISTER ( &sk_zombie_health1 );// {"sk_zombie_health1","0"}; CVAR_REGISTER( &sk_zombie_health1 );// {"sk_zombie_health1","0"};
CVAR_REGISTER ( &sk_zombie_health2 );// {"sk_zombie_health3","0"}; CVAR_REGISTER( &sk_zombie_health2 );// {"sk_zombie_health3","0"};
CVAR_REGISTER ( &sk_zombie_health3 );// {"sk_zombie_health3","0"}; CVAR_REGISTER( &sk_zombie_health3 );// {"sk_zombie_health3","0"};
CVAR_REGISTER ( &sk_zombie_dmg_one_slash1 );// {"sk_zombie_dmg_one_slash1","0"}; CVAR_REGISTER( &sk_zombie_dmg_one_slash1 );// {"sk_zombie_dmg_one_slash1","0"};
CVAR_REGISTER ( &sk_zombie_dmg_one_slash2 );// {"sk_zombie_dmg_one_slash2","0"}; CVAR_REGISTER( &sk_zombie_dmg_one_slash2 );// {"sk_zombie_dmg_one_slash2","0"};
CVAR_REGISTER ( &sk_zombie_dmg_one_slash3 );// {"sk_zombie_dmg_one_slash3","0"}; CVAR_REGISTER( &sk_zombie_dmg_one_slash3 );// {"sk_zombie_dmg_one_slash3","0"};
CVAR_REGISTER ( &sk_zombie_dmg_both_slash1 );// {"sk_zombie_dmg_both_slash1","0"};
CVAR_REGISTER ( &sk_zombie_dmg_both_slash2 );// {"sk_zombie_dmg_both_slash2","0"};
CVAR_REGISTER ( &sk_zombie_dmg_both_slash3 );// {"sk_zombie_dmg_both_slash3","0"};
CVAR_REGISTER( &sk_zombie_dmg_both_slash1 );// {"sk_zombie_dmg_both_slash1","0"};
CVAR_REGISTER( &sk_zombie_dmg_both_slash2 );// {"sk_zombie_dmg_both_slash2","0"};
CVAR_REGISTER( &sk_zombie_dmg_both_slash3 );// {"sk_zombie_dmg_both_slash3","0"};
//Turret //Turret
CVAR_REGISTER ( &sk_turret_health1 );// {"sk_turret_health1","0"}; CVAR_REGISTER( &sk_turret_health1 );// {"sk_turret_health1","0"};
CVAR_REGISTER ( &sk_turret_health2 );// {"sk_turret_health2","0"}; CVAR_REGISTER( &sk_turret_health2 );// {"sk_turret_health2","0"};
CVAR_REGISTER ( &sk_turret_health3 );// {"sk_turret_health3","0"}; CVAR_REGISTER( &sk_turret_health3 );// {"sk_turret_health3","0"};
// MiniTurret // MiniTurret
CVAR_REGISTER ( &sk_miniturret_health1 );// {"sk_miniturret_health1","0"}; CVAR_REGISTER( &sk_miniturret_health1 );// {"sk_miniturret_health1","0"};
CVAR_REGISTER ( &sk_miniturret_health2 );// {"sk_miniturret_health2","0"}; CVAR_REGISTER( &sk_miniturret_health2 );// {"sk_miniturret_health2","0"};
CVAR_REGISTER ( &sk_miniturret_health3 );// {"sk_miniturret_health3","0"}; CVAR_REGISTER( &sk_miniturret_health3 );// {"sk_miniturret_health3","0"};
// Sentry Turret // Sentry Turret
CVAR_REGISTER ( &sk_sentry_health1 );// {"sk_sentry_health1","0"}; CVAR_REGISTER( &sk_sentry_health1 );// {"sk_sentry_health1","0"};
CVAR_REGISTER ( &sk_sentry_health2 );// {"sk_sentry_health2","0"}; CVAR_REGISTER( &sk_sentry_health2 );// {"sk_sentry_health2","0"};
CVAR_REGISTER ( &sk_sentry_health3 );// {"sk_sentry_health3","0"}; CVAR_REGISTER( &sk_sentry_health3 );// {"sk_sentry_health3","0"};
// PLAYER WEAPONS // PLAYER WEAPONS
// Crowbar whack // Crowbar whack
CVAR_REGISTER ( &sk_plr_crowbar1 );// {"sk_plr_crowbar1","0"}; CVAR_REGISTER( &sk_plr_crowbar1 );// {"sk_plr_crowbar1","0"};
CVAR_REGISTER ( &sk_plr_crowbar2 );// {"sk_plr_crowbar2","0"}; CVAR_REGISTER( &sk_plr_crowbar2 );// {"sk_plr_crowbar2","0"};
CVAR_REGISTER ( &sk_plr_crowbar3 );// {"sk_plr_crowbar3","0"}; CVAR_REGISTER( &sk_plr_crowbar3 );// {"sk_plr_crowbar3","0"};
// Glock Round // Glock Round
CVAR_REGISTER ( &sk_plr_9mm_bullet1 );// {"sk_plr_9mm_bullet1","0"}; CVAR_REGISTER( &sk_plr_9mm_bullet1 );// {"sk_plr_9mm_bullet1","0"};
CVAR_REGISTER ( &sk_plr_9mm_bullet2 );// {"sk_plr_9mm_bullet2","0"}; CVAR_REGISTER( &sk_plr_9mm_bullet2 );// {"sk_plr_9mm_bullet2","0"};
CVAR_REGISTER ( &sk_plr_9mm_bullet3 );// {"sk_plr_9mm_bullet3","0"}; CVAR_REGISTER( &sk_plr_9mm_bullet3 );// {"sk_plr_9mm_bullet3","0"};
// 357 Round // 357 Round
CVAR_REGISTER ( &sk_plr_357_bullet1 );// {"sk_plr_357_bullet1","0"}; CVAR_REGISTER( &sk_plr_357_bullet1 );// {"sk_plr_357_bullet1","0"};
CVAR_REGISTER ( &sk_plr_357_bullet2 );// {"sk_plr_357_bullet2","0"}; CVAR_REGISTER( &sk_plr_357_bullet2 );// {"sk_plr_357_bullet2","0"};
CVAR_REGISTER ( &sk_plr_357_bullet3 );// {"sk_plr_357_bullet3","0"}; CVAR_REGISTER( &sk_plr_357_bullet3 );// {"sk_plr_357_bullet3","0"};
// MP5 Round // MP5 Round
CVAR_REGISTER ( &sk_plr_9mmAR_bullet1 );// {"sk_plr_9mmAR_bullet1","0"}; CVAR_REGISTER( &sk_plr_9mmAR_bullet1 );// {"sk_plr_9mmAR_bullet1","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_bullet2 );// {"sk_plr_9mmAR_bullet2","0"}; CVAR_REGISTER( &sk_plr_9mmAR_bullet2 );// {"sk_plr_9mmAR_bullet2","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_bullet3 );// {"sk_plr_9mmAR_bullet3","0"}; CVAR_REGISTER( &sk_plr_9mmAR_bullet3 );// {"sk_plr_9mmAR_bullet3","0"};
// M203 grenade // M203 grenade
CVAR_REGISTER ( &sk_plr_9mmAR_grenade1 );// {"sk_plr_9mmAR_grenade1","0"}; CVAR_REGISTER( &sk_plr_9mmAR_grenade1 );// {"sk_plr_9mmAR_grenade1","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_grenade2 );// {"sk_plr_9mmAR_grenade2","0"}; CVAR_REGISTER( &sk_plr_9mmAR_grenade2 );// {"sk_plr_9mmAR_grenade2","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_grenade3 );// {"sk_plr_9mmAR_grenade3","0"}; CVAR_REGISTER( &sk_plr_9mmAR_grenade3 );// {"sk_plr_9mmAR_grenade3","0"};
// Shotgun buckshot // Shotgun buckshot
CVAR_REGISTER ( &sk_plr_buckshot1 );// {"sk_plr_buckshot1","0"}; CVAR_REGISTER( &sk_plr_buckshot1 );// {"sk_plr_buckshot1","0"};
CVAR_REGISTER ( &sk_plr_buckshot2 );// {"sk_plr_buckshot2","0"}; CVAR_REGISTER( &sk_plr_buckshot2 );// {"sk_plr_buckshot2","0"};
CVAR_REGISTER ( &sk_plr_buckshot3 );// {"sk_plr_buckshot3","0"}; CVAR_REGISTER( &sk_plr_buckshot3 );// {"sk_plr_buckshot3","0"};
// Crossbow // Crossbow
CVAR_REGISTER ( &sk_plr_xbow_bolt_monster1 );// {"sk_plr_xbow_bolt1","0"}; CVAR_REGISTER( &sk_plr_xbow_bolt_monster1 );// {"sk_plr_xbow_bolt1","0"};
CVAR_REGISTER ( &sk_plr_xbow_bolt_monster2 );// {"sk_plr_xbow_bolt2","0"}; CVAR_REGISTER( &sk_plr_xbow_bolt_monster2 );// {"sk_plr_xbow_bolt2","0"};
CVAR_REGISTER ( &sk_plr_xbow_bolt_monster3 );// {"sk_plr_xbow_bolt3","0"}; CVAR_REGISTER( &sk_plr_xbow_bolt_monster3 );// {"sk_plr_xbow_bolt3","0"};
CVAR_REGISTER ( &sk_plr_xbow_bolt_client1 );// {"sk_plr_xbow_bolt1","0"};
CVAR_REGISTER ( &sk_plr_xbow_bolt_client2 );// {"sk_plr_xbow_bolt2","0"};
CVAR_REGISTER ( &sk_plr_xbow_bolt_client3 );// {"sk_plr_xbow_bolt3","0"};
CVAR_REGISTER( &sk_plr_xbow_bolt_client1 );// {"sk_plr_xbow_bolt1","0"};
CVAR_REGISTER( &sk_plr_xbow_bolt_client2 );// {"sk_plr_xbow_bolt2","0"};
CVAR_REGISTER( &sk_plr_xbow_bolt_client3 );// {"sk_plr_xbow_bolt3","0"};
// RPG // RPG
CVAR_REGISTER ( &sk_plr_rpg1 );// {"sk_plr_rpg1","0"}; CVAR_REGISTER( &sk_plr_rpg1 );// {"sk_plr_rpg1","0"};
CVAR_REGISTER ( &sk_plr_rpg2 );// {"sk_plr_rpg2","0"}; CVAR_REGISTER( &sk_plr_rpg2 );// {"sk_plr_rpg2","0"};
CVAR_REGISTER ( &sk_plr_rpg3 );// {"sk_plr_rpg3","0"}; CVAR_REGISTER( &sk_plr_rpg3 );// {"sk_plr_rpg3","0"};
// Gauss Gun // Gauss Gun
CVAR_REGISTER ( &sk_plr_gauss1 );// {"sk_plr_gauss1","0"}; CVAR_REGISTER( &sk_plr_gauss1 );// {"sk_plr_gauss1","0"};
CVAR_REGISTER ( &sk_plr_gauss2 );// {"sk_plr_gauss2","0"}; CVAR_REGISTER( &sk_plr_gauss2 );// {"sk_plr_gauss2","0"};
CVAR_REGISTER ( &sk_plr_gauss3 );// {"sk_plr_gauss3","0"}; CVAR_REGISTER( &sk_plr_gauss3 );// {"sk_plr_gauss3","0"};
// Egon Gun // Egon Gun
CVAR_REGISTER ( &sk_plr_egon_narrow1 );// {"sk_plr_egon_narrow1","0"}; CVAR_REGISTER( &sk_plr_egon_narrow1 );// {"sk_plr_egon_narrow1","0"};
CVAR_REGISTER ( &sk_plr_egon_narrow2 );// {"sk_plr_egon_narrow2","0"}; CVAR_REGISTER( &sk_plr_egon_narrow2 );// {"sk_plr_egon_narrow2","0"};
CVAR_REGISTER ( &sk_plr_egon_narrow3 );// {"sk_plr_egon_narrow3","0"}; CVAR_REGISTER( &sk_plr_egon_narrow3 );// {"sk_plr_egon_narrow3","0"};
CVAR_REGISTER ( &sk_plr_egon_wide1 );// {"sk_plr_egon_wide1","0"};
CVAR_REGISTER ( &sk_plr_egon_wide2 );// {"sk_plr_egon_wide2","0"};
CVAR_REGISTER ( &sk_plr_egon_wide3 );// {"sk_plr_egon_wide3","0"};
CVAR_REGISTER( &sk_plr_egon_wide1 );// {"sk_plr_egon_wide1","0"};
CVAR_REGISTER( &sk_plr_egon_wide2 );// {"sk_plr_egon_wide2","0"};
CVAR_REGISTER( &sk_plr_egon_wide3 );// {"sk_plr_egon_wide3","0"};
// Hand Grendade // Hand Grendade
CVAR_REGISTER ( &sk_plr_hand_grenade1 );// {"sk_plr_hand_grenade1","0"}; CVAR_REGISTER( &sk_plr_hand_grenade1 );// {"sk_plr_hand_grenade1","0"};
CVAR_REGISTER ( &sk_plr_hand_grenade2 );// {"sk_plr_hand_grenade2","0"}; CVAR_REGISTER( &sk_plr_hand_grenade2 );// {"sk_plr_hand_grenade2","0"};
CVAR_REGISTER ( &sk_plr_hand_grenade3 );// {"sk_plr_hand_grenade3","0"}; CVAR_REGISTER( &sk_plr_hand_grenade3 );// {"sk_plr_hand_grenade3","0"};
// Satchel Charge // Satchel Charge
CVAR_REGISTER ( &sk_plr_satchel1 );// {"sk_plr_satchel1","0"}; CVAR_REGISTER( &sk_plr_satchel1 );// {"sk_plr_satchel1","0"};
CVAR_REGISTER ( &sk_plr_satchel2 );// {"sk_plr_satchel2","0"}; CVAR_REGISTER( &sk_plr_satchel2 );// {"sk_plr_satchel2","0"};
CVAR_REGISTER ( &sk_plr_satchel3 );// {"sk_plr_satchel3","0"}; CVAR_REGISTER( &sk_plr_satchel3 );// {"sk_plr_satchel3","0"};
// Tripmine // Tripmine
CVAR_REGISTER ( &sk_plr_tripmine1 );// {"sk_plr_tripmine1","0"}; CVAR_REGISTER( &sk_plr_tripmine1 );// {"sk_plr_tripmine1","0"};
CVAR_REGISTER ( &sk_plr_tripmine2 );// {"sk_plr_tripmine2","0"}; CVAR_REGISTER( &sk_plr_tripmine2 );// {"sk_plr_tripmine2","0"};
CVAR_REGISTER ( &sk_plr_tripmine3 );// {"sk_plr_tripmine3","0"}; CVAR_REGISTER( &sk_plr_tripmine3 );// {"sk_plr_tripmine3","0"};
// WORLD WEAPONS // WORLD WEAPONS
CVAR_REGISTER ( &sk_12mm_bullet1 );// {"sk_12mm_bullet1","0"}; CVAR_REGISTER( &sk_12mm_bullet1 );// {"sk_12mm_bullet1","0"};
CVAR_REGISTER ( &sk_12mm_bullet2 );// {"sk_12mm_bullet2","0"}; CVAR_REGISTER( &sk_12mm_bullet2 );// {"sk_12mm_bullet2","0"};
CVAR_REGISTER ( &sk_12mm_bullet3 );// {"sk_12mm_bullet3","0"}; CVAR_REGISTER( &sk_12mm_bullet3 );// {"sk_12mm_bullet3","0"};
CVAR_REGISTER ( &sk_9mmAR_bullet1 );// {"sk_9mm_bullet1","0"}; CVAR_REGISTER( &sk_9mmAR_bullet1 );// {"sk_9mm_bullet1","0"};
CVAR_REGISTER ( &sk_9mmAR_bullet2 );// {"sk_9mm_bullet1","0"}; CVAR_REGISTER( &sk_9mmAR_bullet2 );// {"sk_9mm_bullet1","0"};
CVAR_REGISTER ( &sk_9mmAR_bullet3 );// {"sk_9mm_bullet1","0"}; CVAR_REGISTER( &sk_9mmAR_bullet3 );// {"sk_9mm_bullet1","0"};
CVAR_REGISTER ( &sk_9mm_bullet1 );// {"sk_9mm_bullet1","0"};
CVAR_REGISTER ( &sk_9mm_bullet2 );// {"sk_9mm_bullet2","0"};
CVAR_REGISTER ( &sk_9mm_bullet3 );// {"sk_9mm_bullet3","0"};
CVAR_REGISTER( &sk_9mm_bullet1 );// {"sk_9mm_bullet1","0"};
CVAR_REGISTER( &sk_9mm_bullet2 );// {"sk_9mm_bullet2","0"};
CVAR_REGISTER( &sk_9mm_bullet3 );// {"sk_9mm_bullet3","0"};
// HORNET // HORNET
CVAR_REGISTER ( &sk_hornet_dmg1 );// {"sk_hornet_dmg1","0"}; CVAR_REGISTER( &sk_hornet_dmg1 );// {"sk_hornet_dmg1","0"};
CVAR_REGISTER ( &sk_hornet_dmg2 );// {"sk_hornet_dmg2","0"}; CVAR_REGISTER( &sk_hornet_dmg2 );// {"sk_hornet_dmg2","0"};
CVAR_REGISTER ( &sk_hornet_dmg3 );// {"sk_hornet_dmg3","0"}; CVAR_REGISTER( &sk_hornet_dmg3 );// {"sk_hornet_dmg3","0"};
// HEALTH/SUIT CHARGE DISTRIBUTION // HEALTH/SUIT CHARGE DISTRIBUTION
CVAR_REGISTER ( &sk_suitcharger1 ); CVAR_REGISTER( &sk_suitcharger1 );
CVAR_REGISTER ( &sk_suitcharger2 ); CVAR_REGISTER( &sk_suitcharger2 );
CVAR_REGISTER ( &sk_suitcharger3 ); CVAR_REGISTER( &sk_suitcharger3 );
CVAR_REGISTER ( &sk_battery1 ); CVAR_REGISTER( &sk_battery1 );
CVAR_REGISTER ( &sk_battery2 ); CVAR_REGISTER( &sk_battery2 );
CVAR_REGISTER ( &sk_battery3 ); CVAR_REGISTER( &sk_battery3 );
CVAR_REGISTER ( &sk_healthcharger1 ); CVAR_REGISTER( &sk_healthcharger1 );
CVAR_REGISTER ( &sk_healthcharger2 ); CVAR_REGISTER( &sk_healthcharger2 );
CVAR_REGISTER ( &sk_healthcharger3 ); CVAR_REGISTER( &sk_healthcharger3 );
CVAR_REGISTER ( &sk_healthkit1 ); CVAR_REGISTER( &sk_healthkit1 );
CVAR_REGISTER ( &sk_healthkit2 ); CVAR_REGISTER( &sk_healthkit2 );
CVAR_REGISTER ( &sk_healthkit3 ); CVAR_REGISTER( &sk_healthkit3 );
CVAR_REGISTER ( &sk_scientist_heal1 ); CVAR_REGISTER( &sk_scientist_heal1 );
CVAR_REGISTER ( &sk_scientist_heal2 ); CVAR_REGISTER( &sk_scientist_heal2 );
CVAR_REGISTER ( &sk_scientist_heal3 ); CVAR_REGISTER( &sk_scientist_heal3 );
// monster damage adjusters // monster damage adjusters
CVAR_REGISTER ( &sk_monster_head1 ); CVAR_REGISTER( &sk_monster_head1 );
CVAR_REGISTER ( &sk_monster_head2 ); CVAR_REGISTER( &sk_monster_head2 );
CVAR_REGISTER ( &sk_monster_head3 ); CVAR_REGISTER( &sk_monster_head3 );
CVAR_REGISTER ( &sk_monster_chest1 ); CVAR_REGISTER( &sk_monster_chest1 );
CVAR_REGISTER ( &sk_monster_chest2 ); CVAR_REGISTER( &sk_monster_chest2 );
CVAR_REGISTER ( &sk_monster_chest3 ); CVAR_REGISTER( &sk_monster_chest3 );
CVAR_REGISTER ( &sk_monster_stomach1 ); CVAR_REGISTER( &sk_monster_stomach1 );
CVAR_REGISTER ( &sk_monster_stomach2 ); CVAR_REGISTER( &sk_monster_stomach2 );
CVAR_REGISTER ( &sk_monster_stomach3 ); CVAR_REGISTER( &sk_monster_stomach3 );
CVAR_REGISTER ( &sk_monster_arm1 ); CVAR_REGISTER( &sk_monster_arm1 );
CVAR_REGISTER ( &sk_monster_arm2 ); CVAR_REGISTER( &sk_monster_arm2 );
CVAR_REGISTER ( &sk_monster_arm3 ); CVAR_REGISTER( &sk_monster_arm3 );
CVAR_REGISTER ( &sk_monster_leg1 ); CVAR_REGISTER( &sk_monster_leg1 );
CVAR_REGISTER ( &sk_monster_leg2 ); CVAR_REGISTER( &sk_monster_leg2 );
CVAR_REGISTER ( &sk_monster_leg3 ); CVAR_REGISTER( &sk_monster_leg3 );
// player damage adjusters // player damage adjusters
CVAR_REGISTER ( &sk_player_head1 ); CVAR_REGISTER( &sk_player_head1 );
CVAR_REGISTER ( &sk_player_head2 ); CVAR_REGISTER( &sk_player_head2 );
CVAR_REGISTER ( &sk_player_head3 ); CVAR_REGISTER( &sk_player_head3 );
CVAR_REGISTER ( &sk_player_chest1 ); CVAR_REGISTER( &sk_player_chest1 );
CVAR_REGISTER ( &sk_player_chest2 ); CVAR_REGISTER( &sk_player_chest2 );
CVAR_REGISTER ( &sk_player_chest3 ); CVAR_REGISTER( &sk_player_chest3 );
CVAR_REGISTER ( &sk_player_stomach1 ); CVAR_REGISTER( &sk_player_stomach1 );
CVAR_REGISTER ( &sk_player_stomach2 ); CVAR_REGISTER( &sk_player_stomach2 );
CVAR_REGISTER ( &sk_player_stomach3 ); CVAR_REGISTER( &sk_player_stomach3 );
CVAR_REGISTER ( &sk_player_arm1 ); CVAR_REGISTER( &sk_player_arm1 );
CVAR_REGISTER ( &sk_player_arm2 ); CVAR_REGISTER( &sk_player_arm2 );
CVAR_REGISTER ( &sk_player_arm3 ); CVAR_REGISTER( &sk_player_arm3 );
CVAR_REGISTER ( &sk_player_leg1 ); CVAR_REGISTER( &sk_player_leg1 );
CVAR_REGISTER ( &sk_player_leg2 ); CVAR_REGISTER( &sk_player_leg2 );
CVAR_REGISTER ( &sk_player_leg3 ); CVAR_REGISTER( &sk_player_leg3 );
// END REGISTER CVARS FOR SKILL LEVEL STUFF // END REGISTER CVARS FOR SKILL LEVEL STUFF
SERVER_COMMAND( "exec skill.cfg\n" ); SERVER_COMMAND( "exec skill.cfg\n" );

View File

@ -18,28 +18,26 @@
extern void GameDLLInit( void ); extern void GameDLLInit( void );
extern cvar_t displaysoundlist;
extern cvar_t displaysoundlist;
// multiplayer server rules // multiplayer server rules
extern cvar_t teamplay; extern cvar_t teamplay;
extern cvar_t fraglimit; extern cvar_t fraglimit;
extern cvar_t timelimit; extern cvar_t timelimit;
extern cvar_t friendlyfire; extern cvar_t friendlyfire;
extern cvar_t falldamage; extern cvar_t falldamage;
extern cvar_t weaponstay; extern cvar_t weaponstay;
extern cvar_t forcerespawn; extern cvar_t forcerespawn;
extern cvar_t flashlight; extern cvar_t flashlight;
extern cvar_t aimcrosshair; extern cvar_t aimcrosshair;
extern cvar_t decalfrequency; extern cvar_t decalfrequency;
extern cvar_t teamlist; extern cvar_t teamlist;
extern cvar_t teamoverride; extern cvar_t teamoverride;
extern cvar_t defaultteam; extern cvar_t defaultteam;
extern cvar_t allowmonsters; extern cvar_t allowmonsters;
// Engine Cvars // Engine Cvars
extern cvar_t *g_psv_gravity; extern cvar_t *g_psv_gravity;
extern cvar_t *g_psv_aim; extern cvar_t *g_psv_aim;
extern cvar_t *g_footsteps; extern cvar_t *g_footsteps;
#endif // GAME_H
#endif // GAME_H

View File

@ -28,8 +28,8 @@
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer ); extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer );
DLL_GLOBAL CGameRules* g_pGameRules = NULL; DLL_GLOBAL CGameRules *g_pGameRules = NULL;
extern DLL_GLOBAL BOOL g_fGameOver; extern DLL_GLOBAL BOOL g_fGameOver;
extern int gmsgDeathMsg; // client dll messages extern int gmsgDeathMsg; // client dll messages
extern int gmsgMOTD; extern int gmsgMOTD;
@ -41,13 +41,13 @@ BOOL CGameRules::CanHaveAmmo( CBasePlayer *pPlayer, const char *pszAmmoName, int
{ {
int iAmmoIndex; int iAmmoIndex;
if ( pszAmmoName ) if( pszAmmoName )
{ {
iAmmoIndex = pPlayer->GetAmmoIndex( pszAmmoName ); iAmmoIndex = pPlayer->GetAmmoIndex( pszAmmoName );
if ( iAmmoIndex > -1 ) if( iAmmoIndex > -1 )
{ {
if ( pPlayer->AmmoInventory( iAmmoIndex ) < iMaxCarry ) if( pPlayer->AmmoInventory( iAmmoIndex ) < iMaxCarry )
{ {
// player has room for more of this type of ammo // player has room for more of this type of ammo
return TRUE; return TRUE;
@ -60,17 +60,17 @@ BOOL CGameRules::CanHaveAmmo( CBasePlayer *pPlayer, const char *pszAmmoName, int
//========================================================= //=========================================================
//========================================================= //=========================================================
edict_t *CGameRules :: GetPlayerSpawnSpot( CBasePlayer *pPlayer ) edict_t *CGameRules::GetPlayerSpawnSpot( CBasePlayer *pPlayer )
{ {
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer ); edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );
pPlayer->pev->origin = VARS(pentSpawnSpot)->origin + Vector(0,0,1); pPlayer->pev->origin = VARS( pentSpawnSpot )->origin + Vector( 0, 0, 1 );
pPlayer->pev->v_angle = g_vecZero; pPlayer->pev->v_angle = g_vecZero;
pPlayer->pev->velocity = g_vecZero; pPlayer->pev->velocity = g_vecZero;
pPlayer->pev->angles = VARS(pentSpawnSpot)->angles; pPlayer->pev->angles = VARS( pentSpawnSpot )->angles;
pPlayer->pev->punchangle = g_vecZero; pPlayer->pev->punchangle = g_vecZero;
pPlayer->pev->fixangle = TRUE; pPlayer->pev->fixangle = TRUE;
return pentSpawnSpot; return pentSpawnSpot;
} }
@ -79,16 +79,16 @@ edict_t *CGameRules :: GetPlayerSpawnSpot( CBasePlayer *pPlayer )
BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon ) BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
{ {
// only living players can have items // only living players can have items
if ( pPlayer->pev->deadflag != DEAD_NO ) if( pPlayer->pev->deadflag != DEAD_NO )
return FALSE; return FALSE;
if ( pWeapon->pszAmmo1() ) if( pWeapon->pszAmmo1() )
{ {
if ( !CanHaveAmmo( pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1() ) ) if( !CanHaveAmmo( pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1() ) )
{ {
// we can't carry anymore ammo for this gun. We can only // we can't carry anymore ammo for this gun. We can only
// have the gun if we aren't already carrying one of this type // have the gun if we aren't already carrying one of this type
if ( pPlayer->HasPlayerItem( pWeapon ) ) if( pPlayer->HasPlayerItem( pWeapon ) )
{ {
return FALSE; return FALSE;
} }
@ -97,7 +97,7 @@ BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeap
else else
{ {
// weapon doesn't use ammo, don't take another if you already have it. // weapon doesn't use ammo, don't take another if you already have it.
if ( pPlayer->HasPlayerItem( pWeapon ) ) if( pPlayer->HasPlayerItem( pWeapon ) )
{ {
return FALSE; return FALSE;
} }
@ -112,33 +112,33 @@ BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeap
//========================================================= //=========================================================
void CGameRules::RefreshSkillData ( void ) void CGameRules::RefreshSkillData ( void )
{ {
int iSkill; int iSkill;
iSkill = (int)CVAR_GET_FLOAT("skill"); iSkill = (int)CVAR_GET_FLOAT( "skill" );
g_iSkillLevel = iSkill; g_iSkillLevel = iSkill;
if ( iSkill < 1 ) if( iSkill < 1 )
{ {
iSkill = 1; iSkill = 1;
} }
else if ( iSkill > 3 ) else if( iSkill > 3 )
{ {
iSkill = 3; iSkill = 3;
} }
gSkillData.iSkillLevel = iSkill; gSkillData.iSkillLevel = iSkill;
ALERT ( at_console, "\nGAME SKILL LEVEL:%d\n",iSkill ); ALERT( at_console, "\nGAME SKILL LEVEL:%d\n",iSkill );
//Agrunt //Agrunt
gSkillData.agruntHealth = GetSkillCvar( "sk_agrunt_health" ); gSkillData.agruntHealth = GetSkillCvar( "sk_agrunt_health" );
gSkillData.agruntDmgPunch = GetSkillCvar( "sk_agrunt_dmg_punch"); gSkillData.agruntDmgPunch = GetSkillCvar( "sk_agrunt_dmg_punch" );
// Apache // Apache
gSkillData.apacheHealth = GetSkillCvar( "sk_apache_health"); gSkillData.apacheHealth = GetSkillCvar( "sk_apache_health" );
// Barney // Barney
gSkillData.barneyHealth = GetSkillCvar( "sk_barney_health"); gSkillData.barneyHealth = GetSkillCvar( "sk_barney_health" );
// Big Momma // Big Momma
gSkillData.bigmommaHealthFactor = GetSkillCvar( "sk_bigmomma_health_factor" ); gSkillData.bigmommaHealthFactor = GetSkillCvar( "sk_bigmomma_health_factor" );
@ -147,131 +147,131 @@ void CGameRules::RefreshSkillData ( void )
gSkillData.bigmommaRadiusBlast = GetSkillCvar( "sk_bigmomma_radius_blast" ); gSkillData.bigmommaRadiusBlast = GetSkillCvar( "sk_bigmomma_radius_blast" );
// Bullsquid // Bullsquid
gSkillData.bullsquidHealth = GetSkillCvar( "sk_bullsquid_health"); gSkillData.bullsquidHealth = GetSkillCvar( "sk_bullsquid_health" );
gSkillData.bullsquidDmgBite = GetSkillCvar( "sk_bullsquid_dmg_bite"); gSkillData.bullsquidDmgBite = GetSkillCvar( "sk_bullsquid_dmg_bite" );
gSkillData.bullsquidDmgWhip = GetSkillCvar( "sk_bullsquid_dmg_whip"); gSkillData.bullsquidDmgWhip = GetSkillCvar( "sk_bullsquid_dmg_whip" );
gSkillData.bullsquidDmgSpit = GetSkillCvar( "sk_bullsquid_dmg_spit"); gSkillData.bullsquidDmgSpit = GetSkillCvar( "sk_bullsquid_dmg_spit" );
// Gargantua // Gargantua
gSkillData.gargantuaHealth = GetSkillCvar( "sk_gargantua_health"); gSkillData.gargantuaHealth = GetSkillCvar( "sk_gargantua_health" );
gSkillData.gargantuaDmgSlash = GetSkillCvar( "sk_gargantua_dmg_slash"); gSkillData.gargantuaDmgSlash = GetSkillCvar( "sk_gargantua_dmg_slash" );
gSkillData.gargantuaDmgFire = GetSkillCvar( "sk_gargantua_dmg_fire"); gSkillData.gargantuaDmgFire = GetSkillCvar( "sk_gargantua_dmg_fire" );
gSkillData.gargantuaDmgStomp = GetSkillCvar( "sk_gargantua_dmg_stomp"); gSkillData.gargantuaDmgStomp = GetSkillCvar( "sk_gargantua_dmg_stomp ");
// Hassassin // Hassassin
gSkillData.hassassinHealth = GetSkillCvar( "sk_hassassin_health"); gSkillData.hassassinHealth = GetSkillCvar( "sk_hassassin_health" );
// Headcrab // Headcrab
gSkillData.headcrabHealth = GetSkillCvar( "sk_headcrab_health"); gSkillData.headcrabHealth = GetSkillCvar( "sk_headcrab_health" );
gSkillData.headcrabDmgBite = GetSkillCvar( "sk_headcrab_dmg_bite"); gSkillData.headcrabDmgBite = GetSkillCvar( "sk_headcrab_dmg_bite" );
// Hgrunt // Hgrunt
gSkillData.hgruntHealth = GetSkillCvar( "sk_hgrunt_health"); gSkillData.hgruntHealth = GetSkillCvar( "sk_hgrunt_health" );
gSkillData.hgruntDmgKick = GetSkillCvar( "sk_hgrunt_kick"); gSkillData.hgruntDmgKick = GetSkillCvar( "sk_hgrunt_kick" );
gSkillData.hgruntShotgunPellets = GetSkillCvar( "sk_hgrunt_pellets"); gSkillData.hgruntShotgunPellets = GetSkillCvar( "sk_hgrunt_pellets" );
gSkillData.hgruntGrenadeSpeed = GetSkillCvar( "sk_hgrunt_gspeed"); gSkillData.hgruntGrenadeSpeed = GetSkillCvar( "sk_hgrunt_gspeed" );
// Houndeye // Houndeye
gSkillData.houndeyeHealth = GetSkillCvar( "sk_houndeye_health"); gSkillData.houndeyeHealth = GetSkillCvar( "sk_houndeye_health" );
gSkillData.houndeyeDmgBlast = GetSkillCvar( "sk_houndeye_dmg_blast"); gSkillData.houndeyeDmgBlast = GetSkillCvar( "sk_houndeye_dmg_blast" );
// ISlave // ISlave
gSkillData.slaveHealth = GetSkillCvar( "sk_islave_health"); gSkillData.slaveHealth = GetSkillCvar( "sk_islave_health" );
gSkillData.slaveDmgClaw = GetSkillCvar( "sk_islave_dmg_claw"); gSkillData.slaveDmgClaw = GetSkillCvar( "sk_islave_dmg_claw" );
gSkillData.slaveDmgClawrake = GetSkillCvar( "sk_islave_dmg_clawrake"); gSkillData.slaveDmgClawrake = GetSkillCvar( "sk_islave_dmg_clawrake" );
gSkillData.slaveDmgZap = GetSkillCvar( "sk_islave_dmg_zap"); gSkillData.slaveDmgZap = GetSkillCvar( "sk_islave_dmg_zap" );
// Icthyosaur // Icthyosaur
gSkillData.ichthyosaurHealth = GetSkillCvar( "sk_ichthyosaur_health"); gSkillData.ichthyosaurHealth = GetSkillCvar( "sk_ichthyosaur_health" );
gSkillData.ichthyosaurDmgShake = GetSkillCvar( "sk_ichthyosaur_shake"); gSkillData.ichthyosaurDmgShake = GetSkillCvar( "sk_ichthyosaur_shake" );
// Leech // Leech
gSkillData.leechHealth = GetSkillCvar( "sk_leech_health"); gSkillData.leechHealth = GetSkillCvar( "sk_leech_health" );
gSkillData.leechDmgBite = GetSkillCvar( "sk_leech_dmg_bite"); gSkillData.leechDmgBite = GetSkillCvar( "sk_leech_dmg_bite" );
// Controller // Controller
gSkillData.controllerHealth = GetSkillCvar( "sk_controller_health"); gSkillData.controllerHealth = GetSkillCvar( "sk_controller_health" );
gSkillData.controllerDmgZap = GetSkillCvar( "sk_controller_dmgzap"); gSkillData.controllerDmgZap = GetSkillCvar( "sk_controller_dmgzap" );
gSkillData.controllerSpeedBall = GetSkillCvar( "sk_controller_speedball"); gSkillData.controllerSpeedBall = GetSkillCvar( "sk_controller_speedball" );
gSkillData.controllerDmgBall = GetSkillCvar( "sk_controller_dmgball"); gSkillData.controllerDmgBall = GetSkillCvar( "sk_controller_dmgball" );
// Nihilanth // Nihilanth
gSkillData.nihilanthHealth = GetSkillCvar( "sk_nihilanth_health"); gSkillData.nihilanthHealth = GetSkillCvar( "sk_nihilanth_health" );
gSkillData.nihilanthZap = GetSkillCvar( "sk_nihilanth_zap"); gSkillData.nihilanthZap = GetSkillCvar( "sk_nihilanth_zap" );
// Scientist // Scientist
gSkillData.scientistHealth = GetSkillCvar( "sk_scientist_health"); gSkillData.scientistHealth = GetSkillCvar( "sk_scientist_health" );
// Snark // Snark
gSkillData.snarkHealth = GetSkillCvar( "sk_snark_health"); gSkillData.snarkHealth = GetSkillCvar( "sk_snark_health" );
gSkillData.snarkDmgBite = GetSkillCvar( "sk_snark_dmg_bite"); gSkillData.snarkDmgBite = GetSkillCvar( "sk_snark_dmg_bite" );
gSkillData.snarkDmgPop = GetSkillCvar( "sk_snark_dmg_pop"); gSkillData.snarkDmgPop = GetSkillCvar( "sk_snark_dmg_pop" );
// Zombie // Zombie
gSkillData.zombieHealth = GetSkillCvar( "sk_zombie_health"); gSkillData.zombieHealth = GetSkillCvar( "sk_zombie_health" );
gSkillData.zombieDmgOneSlash = GetSkillCvar( "sk_zombie_dmg_one_slash"); gSkillData.zombieDmgOneSlash = GetSkillCvar( "sk_zombie_dmg_one_slash" );
gSkillData.zombieDmgBothSlash = GetSkillCvar( "sk_zombie_dmg_both_slash"); gSkillData.zombieDmgBothSlash = GetSkillCvar( "sk_zombie_dmg_both_slash" );
//Turret //Turret
gSkillData.turretHealth = GetSkillCvar( "sk_turret_health"); gSkillData.turretHealth = GetSkillCvar( "sk_turret_health" );
// MiniTurret // MiniTurret
gSkillData.miniturretHealth = GetSkillCvar( "sk_miniturret_health"); gSkillData.miniturretHealth = GetSkillCvar( "sk_miniturret_health" );
// Sentry Turret
gSkillData.sentryHealth = GetSkillCvar( "sk_sentry_health");
// PLAYER WEAPONS // Sentry Turret
gSkillData.sentryHealth = GetSkillCvar( "sk_sentry_health" );
// PLAYER WEAPONS
// Crowbar whack // Crowbar whack
gSkillData.plrDmgCrowbar = GetSkillCvar( "sk_plr_crowbar"); gSkillData.plrDmgCrowbar = GetSkillCvar( "sk_plr_crowbar" );
// Glock Round // Glock Round
gSkillData.plrDmg9MM = GetSkillCvar( "sk_plr_9mm_bullet"); gSkillData.plrDmg9MM = GetSkillCvar( "sk_plr_9mm_bullet" );
// 357 Round // 357 Round
gSkillData.plrDmg357 = GetSkillCvar( "sk_plr_357_bullet"); gSkillData.plrDmg357 = GetSkillCvar( "sk_plr_357_bullet" );
// MP5 Round // MP5 Round
gSkillData.plrDmgMP5 = GetSkillCvar( "sk_plr_9mmAR_bullet"); gSkillData.plrDmgMP5 = GetSkillCvar( "sk_plr_9mmAR_bullet" );
// M203 grenade // M203 grenade
gSkillData.plrDmgM203Grenade = GetSkillCvar( "sk_plr_9mmAR_grenade"); gSkillData.plrDmgM203Grenade = GetSkillCvar( "sk_plr_9mmAR_grenade" );
// Shotgun buckshot // Shotgun buckshot
gSkillData.plrDmgBuckshot = GetSkillCvar( "sk_plr_buckshot"); gSkillData.plrDmgBuckshot = GetSkillCvar( "sk_plr_buckshot" );
// Crossbow // Crossbow
gSkillData.plrDmgCrossbowClient = GetSkillCvar( "sk_plr_xbow_bolt_client"); gSkillData.plrDmgCrossbowClient = GetSkillCvar( "sk_plr_xbow_bolt_client" );
gSkillData.plrDmgCrossbowMonster = GetSkillCvar( "sk_plr_xbow_bolt_monster"); gSkillData.plrDmgCrossbowMonster = GetSkillCvar( "sk_plr_xbow_bolt_monster" );
// RPG // RPG
gSkillData.plrDmgRPG = GetSkillCvar( "sk_plr_rpg"); gSkillData.plrDmgRPG = GetSkillCvar( "sk_plr_rpg" );
// Gauss gun // Gauss gun
gSkillData.plrDmgGauss = GetSkillCvar( "sk_plr_gauss"); gSkillData.plrDmgGauss = GetSkillCvar( "sk_plr_gauss" );
// Egon Gun // Egon Gun
gSkillData.plrDmgEgonNarrow = GetSkillCvar( "sk_plr_egon_narrow"); gSkillData.plrDmgEgonNarrow = GetSkillCvar( "sk_plr_egon_narrow" );
gSkillData.plrDmgEgonWide = GetSkillCvar( "sk_plr_egon_wide"); gSkillData.plrDmgEgonWide = GetSkillCvar( "sk_plr_egon_wide" );
// Hand Grendade // Hand Grendade
gSkillData.plrDmgHandGrenade = GetSkillCvar( "sk_plr_hand_grenade"); gSkillData.plrDmgHandGrenade = GetSkillCvar( "sk_plr_hand_grenade" );
// Satchel Charge // Satchel Charge
gSkillData.plrDmgSatchel = GetSkillCvar( "sk_plr_satchel"); gSkillData.plrDmgSatchel = GetSkillCvar( "sk_plr_satchel" );
// Tripmine // Tripmine
gSkillData.plrDmgTripmine = GetSkillCvar( "sk_plr_tripmine"); gSkillData.plrDmgTripmine = GetSkillCvar( "sk_plr_tripmine" );
// MONSTER WEAPONS // MONSTER WEAPONS
gSkillData.monDmg12MM = GetSkillCvar( "sk_12mm_bullet"); gSkillData.monDmg12MM = GetSkillCvar( "sk_12mm_bullet" );
gSkillData.monDmgMP5 = GetSkillCvar ("sk_9mmAR_bullet" ); gSkillData.monDmgMP5 = GetSkillCvar ("sk_9mmAR_bullet" );
gSkillData.monDmg9MM = GetSkillCvar( "sk_9mm_bullet"); gSkillData.monDmg9MM = GetSkillCvar( "sk_9mm_bullet" );
// MONSTER HORNET // MONSTER HORNET
gSkillData.monDmgHornet = GetSkillCvar( "sk_hornet_dmg"); gSkillData.monDmgHornet = GetSkillCvar( "sk_hornet_dmg" );
// PLAYER HORNET // PLAYER HORNET
// Up to this point, player hornet damage and monster hornet damage were both using // Up to this point, player hornet damage and monster hornet damage were both using
@ -281,7 +281,6 @@ void CGameRules::RefreshSkillData ( void )
// via SKILLS.CFG. Any player hivehand tuning must take place in the code. (sjb) // via SKILLS.CFG. Any player hivehand tuning must take place in the code. (sjb)
gSkillData.plrDmgHornet = 7; gSkillData.plrDmgHornet = 7;
// HEALTH/CHARGE // HEALTH/CHARGE
gSkillData.suitchargerCapacity = GetSkillCvar( "sk_suitcharger" ); gSkillData.suitchargerCapacity = GetSkillCvar( "sk_suitcharger" );
gSkillData.batteryCapacity = GetSkillCvar( "sk_battery" ); gSkillData.batteryCapacity = GetSkillCvar( "sk_battery" );
@ -311,9 +310,9 @@ void CGameRules::RefreshSkillData ( void )
CGameRules *InstallGameRules( void ) CGameRules *InstallGameRules( void )
{ {
SERVER_COMMAND( "exec game.cfg\n" ); SERVER_COMMAND( "exec game.cfg\n" );
SERVER_EXECUTE( ); SERVER_EXECUTE();
if ( !gpGlobals->deathmatch ) if( !gpGlobals->deathmatch )
{ {
// generic half-life // generic half-life
g_teamplay = 0; g_teamplay = 0;
@ -321,14 +320,13 @@ CGameRules *InstallGameRules( void )
} }
else else
{ {
if ( teamplay.value > 0 ) if( teamplay.value > 0 )
{ {
// teamplay // teamplay
g_teamplay = 1; g_teamplay = 1;
return new CHalfLifeTeamplay; return new CHalfLifeTeamplay;
} }
if ((int)gpGlobals->deathmatch == 1) if( (int)gpGlobals->deathmatch == 1 )
{ {
// vanilla deathmatch // vanilla deathmatch
g_teamplay = 0; g_teamplay = 0;
@ -342,6 +340,3 @@ CGameRules *InstallGameRules( void )
} }
} }
} }

View File

@ -27,13 +27,13 @@ class CBasePlayerAmmo;
enum enum
{ {
GR_NONE = 0, GR_NONE = 0,
GR_WEAPON_RESPAWN_YES, GR_WEAPON_RESPAWN_YES,
GR_WEAPON_RESPAWN_NO, GR_WEAPON_RESPAWN_NO,
GR_AMMO_RESPAWN_YES, GR_AMMO_RESPAWN_YES,
GR_AMMO_RESPAWN_NO, GR_AMMO_RESPAWN_NO,
GR_ITEM_RESPAWN_YES, GR_ITEM_RESPAWN_YES,
GR_ITEM_RESPAWN_NO, GR_ITEM_RESPAWN_NO,
@ -75,14 +75,14 @@ public:
virtual const char *GetGameDescription( void ) { return "Half-Life"; } // this is the game name that gets seen in the server browser virtual const char *GetGameDescription( void ) { return "Half-Life"; } // this is the game name that gets seen in the server browser
// Client connection/disconnection // Client connection/disconnection
virtual BOOL ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ) = 0;// a client just connected to the server (player hasn't spawned yet) virtual BOOL ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128] ) = 0;// a client just connected to the server (player hasn't spawned yet)
virtual void InitHUD( CBasePlayer *pl ) = 0; // the client dll is ready for updating virtual void InitHUD( CBasePlayer *pl ) = 0; // the client dll is ready for updating
virtual void ClientDisconnected( edict_t *pClient ) = 0;// a client just disconnected from the server virtual void ClientDisconnected( edict_t *pClient ) = 0;// a client just disconnected from the server
virtual void UpdateGameMode( CBasePlayer *pPlayer ) {} // the client needs to be informed of the current game mode virtual void UpdateGameMode( CBasePlayer *pPlayer ) {} // the client needs to be informed of the current game mode
// Client damage rules // Client damage rules
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ) = 0;// this client just hit the ground after a fall. How much damage? virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ) = 0;// this client just hit the ground after a fall. How much damage?
virtual BOOL FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker ) {return TRUE;};// can this player take damage from this attacker? virtual BOOL FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker ) {return TRUE;};// can this player take damage from this attacker?
virtual BOOL ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target ) { return TRUE; } virtual BOOL ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target ) { return TRUE; }
// Client spawn/respawn control // Client spawn/respawn control
@ -179,7 +179,7 @@ public:
virtual BOOL FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon ); virtual BOOL FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon );
virtual BOOL GetNextBestWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon ); virtual BOOL GetNextBestWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon );
// Functions to verify the single/multiplayer status of a game // Functions to verify the single/multiplayer status of a game
virtual BOOL IsMultiplayer( void ); virtual BOOL IsMultiplayer( void );
virtual BOOL IsDeathmatch( void ); virtual BOOL IsDeathmatch( void );
@ -192,7 +192,7 @@ public:
// Client damage rules // Client damage rules
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ); virtual float FlPlayerFallDamage( CBasePlayer *pPlayer );
// Client spawn/respawn control // Client spawn/respawn control
virtual void PlayerSpawn( CBasePlayer *pPlayer ); virtual void PlayerSpawn( CBasePlayer *pPlayer );
virtual void PlayerThink( CBasePlayer *pPlayer ); virtual void PlayerThink( CBasePlayer *pPlayer );
@ -276,7 +276,7 @@ public:
// If ClientConnected returns FALSE, the connection is rejected and the user is provided the reason specified in // If ClientConnected returns FALSE, the connection is rejected and the user is provided the reason specified in
// svRejectReason // svRejectReason
// Only the client's name and remote address are provided to the dll for verification. // Only the client's name and remote address are provided to the dll for verification.
virtual BOOL ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); virtual BOOL ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128] );
virtual void InitHUD( CBasePlayer *pl ); // the client dll is ready for updating virtual void InitHUD( CBasePlayer *pl ); // the client dll is ready for updating
virtual void ClientDisconnected( edict_t *pClient ); virtual void ClientDisconnected( edict_t *pClient );
virtual void UpdateGameMode( CBasePlayer *pPlayer ); // the client needs to be informed of the current game mode virtual void UpdateGameMode( CBasePlayer *pPlayer ); // the client needs to be informed of the current game mode
@ -358,4 +358,4 @@ protected:
void SendMOTDToClient( edict_t *client ); void SendMOTDToClient( edict_t *client );
}; };
extern DLL_GLOBAL CGameRules* g_pGameRules; extern DLL_GLOBAL CGameRules *g_pGameRules;

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,8 @@
#define GAUSS_PRIMARY_CHARGE_VOLUME 256// how loud gauss is while charging #define GAUSS_PRIMARY_CHARGE_VOLUME 256// how loud gauss is while charging
#define GAUSS_PRIMARY_FIRE_VOLUME 450// how loud gauss is when discharged #define GAUSS_PRIMARY_FIRE_VOLUME 450// how loud gauss is when discharged
enum gauss_e { enum gauss_e
{
GAUSS_IDLE = 0, GAUSS_IDLE = 0,
GAUSS_IDLE2, GAUSS_IDLE2,
GAUSS_FIDGET, GAUSS_FIDGET,
@ -45,9 +46,9 @@ LINK_ENTITY_TO_CLASS( weapon_gauss, CGauss )
float CGauss::GetFullChargeTime( void ) float CGauss::GetFullChargeTime( void )
{ {
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
return 1.5; return 1.5;
@ -60,11 +61,11 @@ float CGauss::GetFullChargeTime( void )
extern int g_irunninggausspred; extern int g_irunninggausspred;
#endif #endif
void CGauss::Spawn( ) void CGauss::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_GAUSS; m_iId = WEAPON_GAUSS;
SET_MODEL(ENT(pev), "models/w_gauss.mdl"); SET_MODEL( ENT( pev ), "models/w_gauss.mdl" );
m_iDefaultAmmo = GAUSS_DEFAULT_GIVE; m_iDefaultAmmo = GAUSS_DEFAULT_GIVE;
@ -73,18 +74,18 @@ void CGauss::Spawn( )
void CGauss::Precache( void ) void CGauss::Precache( void )
{ {
PRECACHE_MODEL("models/w_gauss.mdl"); PRECACHE_MODEL( "models/w_gauss.mdl" );
PRECACHE_MODEL("models/v_gauss.mdl"); PRECACHE_MODEL( "models/v_gauss.mdl" );
PRECACHE_MODEL("models/p_gauss.mdl"); PRECACHE_MODEL( "models/p_gauss.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
PRECACHE_SOUND( "weapons/gauss2.wav" );
PRECACHE_SOUND( "weapons/electro4.wav" );
PRECACHE_SOUND( "weapons/electro5.wav" );
PRECACHE_SOUND( "weapons/electro6.wav" );
PRECACHE_SOUND( "ambience/pulsemachine.wav" );
PRECACHE_SOUND("weapons/gauss2.wav");
PRECACHE_SOUND("weapons/electro4.wav");
PRECACHE_SOUND("weapons/electro5.wav");
PRECACHE_SOUND("weapons/electro6.wav");
PRECACHE_SOUND("ambience/pulsemachine.wav");
m_iGlow = PRECACHE_MODEL( "sprites/hotglow.spr" ); m_iGlow = PRECACHE_MODEL( "sprites/hotglow.spr" );
m_iBalls = PRECACHE_MODEL( "sprites/hotglow.spr" ); m_iBalls = PRECACHE_MODEL( "sprites/hotglow.spr" );
m_iBeam = PRECACHE_MODEL( "sprites/smoke.spr" ); m_iBeam = PRECACHE_MODEL( "sprites/smoke.spr" );
@ -95,7 +96,7 @@ void CGauss::Precache( void )
int CGauss::AddToPlayer( CBasePlayer *pPlayer ) int CGauss::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -105,9 +106,9 @@ int CGauss::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
int CGauss::GetItemInfo(ItemInfo *p) int CGauss::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "uranium"; p->pszAmmo1 = "uranium";
p->iMaxAmmo1 = URANIUM_MAX_CARRY; p->iMaxAmmo1 = URANIUM_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -122,7 +123,7 @@ int CGauss::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CGauss::Deploy( ) BOOL CGauss::Deploy()
{ {
m_pPlayer->m_flPlayAftershock = 0.0; m_pPlayer->m_flPlayAftershock = 0.0;
return DefaultDeploy( "models/v_gauss.mdl", "models/p_gauss.mdl", GAUSS_DRAW, "gauss" ); return DefaultDeploy( "models/v_gauss.mdl", "models/p_gauss.mdl", GAUSS_DRAW, "gauss" );
@ -131,9 +132,9 @@ BOOL CGauss::Deploy( )
void CGauss::Holster( int skiplocal /* = 0 */ ) void CGauss::Holster( int skiplocal /* = 0 */ )
{ {
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
SendWeaponAnim( GAUSS_HOLSTER ); SendWeaponAnim( GAUSS_HOLSTER );
m_fInAttack = 0; m_fInAttack = 0;
} }
@ -141,16 +142,16 @@ void CGauss::Holster( int skiplocal /* = 0 */ )
void CGauss::PrimaryAttack() void CGauss::PrimaryAttack()
{ {
// don't fire underwater // don't fire underwater
if ( m_pPlayer->pev->waterlevel == 3 ) if( m_pPlayer->pev->waterlevel == 3 )
{ {
PlayEmptySound( ); PlayEmptySound();
m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
return; return;
} }
if ( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] < 2 ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 2 )
{ {
PlayEmptySound( ); PlayEmptySound();
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
return; return;
} }
@ -169,28 +170,28 @@ void CGauss::PrimaryAttack()
void CGauss::SecondaryAttack() void CGauss::SecondaryAttack()
{ {
// don't fire underwater // don't fire underwater
if ( m_pPlayer->pev->waterlevel == 3 ) if( m_pPlayer->pev->waterlevel == 3 )
{ {
if ( m_fInAttack != 0 ) if( m_fInAttack != 0 )
{ {
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/electro4.wav", 1.0, ATTN_NORM, 0, 80 + RANDOM_LONG(0,0x3f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro4.wav", 1.0, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 0x3f ) );
SendWeaponAnim( GAUSS_IDLE ); SendWeaponAnim( GAUSS_IDLE );
m_fInAttack = 0; m_fInAttack = 0;
} }
else else
{ {
PlayEmptySound( ); PlayEmptySound();
} }
m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
return; return;
} }
if ( m_fInAttack == 0 ) if( m_fInAttack == 0 )
{ {
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
{ {
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM );
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
return; return;
} }
@ -202,7 +203,7 @@ void CGauss::SecondaryAttack()
// spin up // spin up
m_pPlayer->m_iWeaponVolume = GAUSS_PRIMARY_CHARGE_VOLUME; m_pPlayer->m_iWeaponVolume = GAUSS_PRIMARY_CHARGE_VOLUME;
SendWeaponAnim( GAUSS_SPINUP ); SendWeaponAnim( GAUSS_SPINUP );
m_fInAttack = 1; m_fInAttack = 1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
@ -213,9 +214,9 @@ void CGauss::SecondaryAttack()
m_iSoundState = SND_CHANGE_PITCH; m_iSoundState = SND_CHANGE_PITCH;
} }
else if (m_fInAttack == 1) else if( m_fInAttack == 1 )
{ {
if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase()) if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
{ {
SendWeaponAnim( GAUSS_SPIN ); SendWeaponAnim( GAUSS_SPIN );
m_fInAttack = 2; m_fInAttack = 2;
@ -224,12 +225,12 @@ void CGauss::SecondaryAttack()
else else
{ {
// during the charging process, eat one bit of ammo every once in a while // during the charging process, eat one bit of ammo every once in a while
if ( UTIL_WeaponTimeBase() >= m_pPlayer->m_flNextAmmoBurn && m_pPlayer->m_flNextAmmoBurn != 1000 ) if( UTIL_WeaponTimeBase() >= m_pPlayer->m_flNextAmmoBurn && m_pPlayer->m_flNextAmmoBurn != 1000 )
{ {
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
@ -242,7 +243,7 @@ void CGauss::SecondaryAttack()
} }
} }
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
{ {
// out of ammo! force the gun to fire // out of ammo! force the gun to fire
StartFire(); StartFire();
@ -251,20 +252,20 @@ void CGauss::SecondaryAttack()
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1;
return; return;
} }
if ( UTIL_WeaponTimeBase() >= m_pPlayer->m_flAmmoStartCharge ) if( UTIL_WeaponTimeBase() >= m_pPlayer->m_flAmmoStartCharge )
{ {
// don't eat any more ammo after gun is fully charged. // don't eat any more ammo after gun is fully charged.
m_pPlayer->m_flNextAmmoBurn = 1000; m_pPlayer->m_flNextAmmoBurn = 1000;
} }
int pitch = ( gpGlobals->time - m_pPlayer->m_flStartCharge ) * ( 150 / GetFullChargeTime() ) + 100; int pitch = ( gpGlobals->time - m_pPlayer->m_flStartCharge ) * ( 150 / GetFullChargeTime() ) + 100;
if ( pitch > 250 ) if( pitch > 250 )
pitch = 250; pitch = 250;
// ALERT( at_console, "%d %d %d\n", m_fInAttack, m_iSoundState, pitch ); // ALERT( at_console, "%d %d %d\n", m_fInAttack, m_iSoundState, pitch );
if ( m_iSoundState == 0 ) if( m_iSoundState == 0 )
ALERT( at_console, "sound state %d\n", m_iSoundState ); ALERT( at_console, "sound state %d\n", m_iSoundState );
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 ); PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 );
@ -272,24 +273,23 @@ void CGauss::SecondaryAttack()
m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions
m_pPlayer->m_iWeaponVolume = GAUSS_PRIMARY_CHARGE_VOLUME; m_pPlayer->m_iWeaponVolume = GAUSS_PRIMARY_CHARGE_VOLUME;
// m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1; // m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1;
if ( m_pPlayer->m_flStartCharge < gpGlobals->time - 10 ) if( m_pPlayer->m_flStartCharge < gpGlobals->time - 10 )
{ {
// Player charged up too long. Zap him. // Player charged up too long. Zap him.
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/electro4.wav", 1.0, ATTN_NORM, 0, 80 + RANDOM_LONG(0,0x3f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro4.wav", 1.0, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 0x3f ) );
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/electro6.wav", 1.0, ATTN_NORM, 0, 75 + RANDOM_LONG(0,0x3f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/electro6.wav", 1.0, ATTN_NORM, 0, 75 + RANDOM_LONG( 0, 0x3f ) );
m_fInAttack = 0; m_fInAttack = 0;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
m_pPlayer->TakeDamage( VARS(eoNullEntity), VARS(eoNullEntity), 50, DMG_SHOCK ); m_pPlayer->TakeDamage( VARS( eoNullEntity ), VARS( eoNullEntity ), 50, DMG_SHOCK );
UTIL_ScreenFade( m_pPlayer, Vector(255,128,0), 2, 0.5, 128, FFADE_IN ); UTIL_ScreenFade( m_pPlayer, Vector( 255, 128, 0 ), 2, 0.5, 128, FFADE_IN );
#endif #endif
SendWeaponAnim( GAUSS_IDLE ); SendWeaponAnim( GAUSS_IDLE );
// Player may have been killed and this weapon dropped, don't execute any more code after this! // Player may have been killed and this weapon dropped, don't execute any more code after this!
return; return;
} }
@ -305,21 +305,21 @@ void CGauss::SecondaryAttack()
void CGauss::StartFire( void ) void CGauss::StartFire( void )
{ {
float flDamage; float flDamage;
UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
Vector vecAiming = gpGlobals->v_forward; Vector vecAiming = gpGlobals->v_forward;
Vector vecSrc = m_pPlayer->GetGunPosition( ); // + gpGlobals->v_up * -8 + gpGlobals->v_right * 8; Vector vecSrc = m_pPlayer->GetGunPosition(); // + gpGlobals->v_up * -8 + gpGlobals->v_right * 8;
if ( gpGlobals->time - m_pPlayer->m_flStartCharge > GetFullChargeTime() ) if( gpGlobals->time - m_pPlayer->m_flStartCharge > GetFullChargeTime() )
{ {
flDamage = 200; flDamage = 200;
} }
else else
{ {
flDamage = 200 * (( gpGlobals->time - m_pPlayer->m_flStartCharge) / GetFullChargeTime() ); flDamage = 200 * ( ( gpGlobals->time - m_pPlayer->m_flStartCharge ) / GetFullChargeTime() );
} }
if ( m_fPrimaryFire ) if( m_fPrimaryFire )
{ {
// fixed damage on primary attack // fixed damage on primary attack
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
@ -329,18 +329,18 @@ void CGauss::StartFire( void )
#endif #endif
} }
if (m_fInAttack != 3) if( m_fInAttack != 3 )
{ {
//ALERT ( at_console, "Time:%f Damage:%f\n", gpGlobals->time - m_pPlayer->m_flStartCharge, flDamage ); //ALERT( at_console, "Time:%f Damage:%f\n", gpGlobals->time - m_pPlayer->m_flStartCharge, flDamage );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
float flZVel = m_pPlayer->pev->velocity.z; float flZVel = m_pPlayer->pev->velocity.z;
if ( !m_fPrimaryFire ) if( !m_fPrimaryFire )
{ {
m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward * flDamage * 5; m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward * flDamage * 5;
} }
if ( !g_pGameRules->IsMultiplayer() ) if( !g_pGameRules->IsMultiplayer() )
{ {
// in deathmatch, gauss can pop you up into the air. Not in single play. // in deathmatch, gauss can pop you up into the air. Not in single play.
m_pPlayer->pev->velocity.z = flZVel; m_pPlayer->pev->velocity.z = flZVel;
@ -362,18 +362,18 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
Vector vecSrc = vecOrigSrc; Vector vecSrc = vecOrigSrc;
Vector vecDest = vecSrc + vecDir * 8192; Vector vecDest = vecSrc + vecDir * 8192;
edict_t *pentIgnore; edict_t *pentIgnore;
TraceResult tr, beam_tr; TraceResult tr, beam_tr;
float flMaxFrac = 1.0; float flMaxFrac = 1.0;
int nTotal = 0; int nTotal = 0;
int fHasPunched = 0; int fHasPunched = 0;
int fFirstBeam = 1; int fFirstBeam = 1;
int nMaxHits = 10; int nMaxHits = 10;
pentIgnore = ENT( m_pPlayer->pev ); pentIgnore = ENT( m_pPlayer->pev );
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( m_fPrimaryFire == false ) if( m_fPrimaryFire == false )
g_irunninggausspred = true; g_irunninggausspred = true;
#endif #endif
// The main firing event is sent unreliably so it won't be delayed. // The main firing event is sent unreliably so it won't be delayed.
@ -385,7 +385,6 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
/*ALERT( at_console, "%f %f %f\n%f %f %f\n", /*ALERT( at_console, "%f %f %f\n%f %f %f\n",
vecSrc.x, vecSrc.y, vecSrc.z, vecSrc.x, vecSrc.y, vecSrc.z,
vecDest.x, vecDest.y, vecDest.z );*/ vecDest.x, vecDest.y, vecDest.z );*/
@ -393,50 +392,50 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
//ALERT( at_console, "%f %f\n", tr.flFraction, flMaxFrac ); //ALERT( at_console, "%f %f\n", tr.flFraction, flMaxFrac );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
while (flDamage > 10 && nMaxHits > 0) while( flDamage > 10 && nMaxHits > 0 )
{ {
nMaxHits--; nMaxHits--;
// ALERT( at_console, "." ); // ALERT( at_console, "." );
UTIL_TraceLine(vecSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr); UTIL_TraceLine( vecSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr );
if (tr.fAllSolid) if( tr.fAllSolid )
break; break;
CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
if (pEntity == NULL) if( pEntity == NULL )
break; break;
if ( fFirstBeam ) if( fFirstBeam )
{ {
m_pPlayer->pev->effects |= EF_MUZZLEFLASH; m_pPlayer->pev->effects |= EF_MUZZLEFLASH;
fFirstBeam = 0; fFirstBeam = 0;
nTotal += 26; nTotal += 26;
} }
if (pEntity->pev->takedamage) if( pEntity->pev->takedamage )
{ {
ClearMultiDamage(); ClearMultiDamage();
pEntity->TraceAttack( m_pPlayer->pev, flDamage, vecDir, &tr, DMG_BULLET ); pEntity->TraceAttack( m_pPlayer->pev, flDamage, vecDir, &tr, DMG_BULLET );
ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
} }
if ( pEntity->ReflectGauss() ) if( pEntity->ReflectGauss() )
{ {
float n; float n;
pentIgnore = NULL; pentIgnore = NULL;
n = -DotProduct(tr.vecPlaneNormal, vecDir); n = -DotProduct( tr.vecPlaneNormal, vecDir );
if (n < 0.5) // 60 degrees if( n < 0.5 ) // 60 degrees
{ {
// ALERT( at_console, "reflect %f\n", n ); // ALERT( at_console, "reflect %f\n", n );
// reflect // reflect
Vector r; Vector r;
r = 2.0 * tr.vecPlaneNormal * n + vecDir; r = 2.0 * tr.vecPlaneNormal * n + vecDir;
flMaxFrac = flMaxFrac - tr.flFraction; flMaxFrac = flMaxFrac - tr.flFraction;
vecDir = r; vecDir = r;
@ -447,34 +446,35 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
m_pPlayer->RadiusDamage( tr.vecEndPos, pev, m_pPlayer->pev, flDamage * n, CLASS_NONE, DMG_BLAST ); m_pPlayer->RadiusDamage( tr.vecEndPos, pev, m_pPlayer->pev, flDamage * n, CLASS_NONE, DMG_BLAST );
nTotal += 34; nTotal += 34;
// lose energy // lose energy
if (n == 0) n = 0.1; if( n == 0 ) n = 0.1;
flDamage = flDamage * (1 - n); flDamage = flDamage * ( 1 - n );
} }
else else
{ {
nTotal += 13; nTotal += 13;
// limit it to one hole punch // limit it to one hole punch
if (fHasPunched) if( fHasPunched )
break; break;
fHasPunched = 1; fHasPunched = 1;
// try punching through wall if secondary attack (primary is incapable of breaking through) // try punching through wall if secondary attack (primary is incapable of breaking through)
if ( !m_fPrimaryFire ) if( !m_fPrimaryFire )
{ {
UTIL_TraceLine( tr.vecEndPos + vecDir * 8, vecDest, dont_ignore_monsters, pentIgnore, &beam_tr); UTIL_TraceLine( tr.vecEndPos + vecDir * 8, vecDest, dont_ignore_monsters, pentIgnore, &beam_tr );
if (!beam_tr.fAllSolid) if( !beam_tr.fAllSolid )
{ {
// trace backwards to find exit point // trace backwards to find exit point
UTIL_TraceLine( beam_tr.vecEndPos, tr.vecEndPos, dont_ignore_monsters, pentIgnore, &beam_tr); UTIL_TraceLine( beam_tr.vecEndPos, tr.vecEndPos, dont_ignore_monsters, pentIgnore, &beam_tr );
float n = (beam_tr.vecEndPos - tr.vecEndPos).Length( ); float n = (beam_tr.vecEndPos - tr.vecEndPos).Length( );
if (n < flDamage) if( n < flDamage )
{ {
if (n == 0) n = 1; if( n == 0 )
n = 1;
flDamage -= n; flDamage -= n;
// ALERT( at_console, "punch %f\n", n ); // ALERT( at_console, "punch %f\n", n );
@ -483,9 +483,8 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
// exit blast damage // exit blast damage
//m_pPlayer->RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, CLASS_NONE, DMG_BLAST ); //m_pPlayer->RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, CLASS_NONE, DMG_BLAST );
float damage_radius; float damage_radius;
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
damage_radius = flDamage * 1.75; // Old code == 2.5 damage_radius = flDamage * 1.75; // Old code == 2.5
} }
@ -496,7 +495,7 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
::RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, damage_radius, CLASS_NONE, DMG_BLAST ); ::RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, damage_radius, CLASS_NONE, DMG_BLAST );
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 );
nTotal += 53; nTotal += 53;
@ -512,7 +511,7 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
else else
{ {
//ALERT( at_console, "blocked solid\n" ); //ALERT( at_console, "blocked solid\n" );
flDamage = 0; flDamage = 0;
} }
@ -530,25 +529,32 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
void CGauss::WeaponIdle( void ) void CGauss::WeaponIdle( void )
{ {
ResetEmptySound( ); ResetEmptySound();
// play aftershock static discharge // play aftershock static discharge
if ( m_pPlayer->m_flPlayAftershock && m_pPlayer->m_flPlayAftershock < gpGlobals->time ) if( m_pPlayer->m_flPlayAftershock && m_pPlayer->m_flPlayAftershock < gpGlobals->time )
{ {
switch (RANDOM_LONG(0,3)) switch( RANDOM_LONG( 0, 3 ) )
{ {
case 0: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/electro4.wav", RANDOM_FLOAT(0.7, 0.8), ATTN_NORM); break; case 0:
case 1: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/electro5.wav", RANDOM_FLOAT(0.7, 0.8), ATTN_NORM); break; EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro4.wav", RANDOM_FLOAT( 0.7, 0.8 ), ATTN_NORM );
case 2: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/electro6.wav", RANDOM_FLOAT(0.7, 0.8), ATTN_NORM); break; break;
case 3: break; // no sound case 1:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro5.wav", RANDOM_FLOAT( 0.7, 0.8 ), ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro6.wav", RANDOM_FLOAT( 0.7, 0.8 ), ATTN_NORM );
break;
case 3:
break; // no sound
} }
m_pPlayer->m_flPlayAftershock = 0.0; m_pPlayer->m_flPlayAftershock = 0.0;
} }
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
if (m_fInAttack != 0) if( m_fInAttack != 0 )
{ {
StartFire(); StartFire();
m_fInAttack = 0; m_fInAttack = 0;
@ -557,13 +563,13 @@ void CGauss::WeaponIdle( void )
else else
{ {
int iAnim; int iAnim;
float flRand = RANDOM_FLOAT(0, 1); float flRand = RANDOM_FLOAT( 0, 1 );
if (flRand <= 0.5) if( flRand <= 0.5 )
{ {
iAnim = GAUSS_IDLE; iAnim = GAUSS_IDLE;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
} }
else if (flRand <= 0.75) else if( flRand <= 0.75 )
{ {
iAnim = GAUSS_IDLE2; iAnim = GAUSS_IDLE2;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
@ -574,7 +580,6 @@ void CGauss::WeaponIdle( void )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3;
} }
SendWeaponAnim( iAnim ); SendWeaponAnim( iAnim );
} }
} }
@ -582,20 +587,20 @@ class CGaussAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_gaussammo.mdl"); SET_MODEL( ENT( pev ), "models/w_gaussammo.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_gaussammo.mdl"); PRECACHE_MODEL( "models/w_gaussammo.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther ) BOOL AddAmmo( CBaseEntity *pOther )
{ {
if (pOther->GiveAmmo( AMMO_URANIUMBOX_GIVE, "uranium", URANIUM_MAX_CARRY ) != -1) if( pOther->GiveAmmo( AMMO_URANIUMBOX_GIVE, "uranium", URANIUM_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@ -34,9 +34,9 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify ( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
int ISoundMask ( void ); int ISoundMask( void );
}; };
LINK_ENTITY_TO_CLASS( monster_generic, CGenericMonster ) LINK_ENTITY_TO_CLASS( monster_generic, CGenericMonster )
@ -45,20 +45,20 @@ LINK_ENTITY_TO_CLASS( monster_generic, CGenericMonster )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CGenericMonster :: Classify ( void ) int CGenericMonster::Classify( void )
{ {
return CLASS_PLAYER_ALLY; return CLASS_PLAYER_ALLY;
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CGenericMonster :: SetYawSpeed ( void ) void CGenericMonster::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_IDLE: case ACT_IDLE:
default: default:
@ -72,7 +72,7 @@ void CGenericMonster :: SetYawSpeed ( void )
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
//========================================================= //=========================================================
void CGenericMonster :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CGenericMonster::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -86,42 +86,40 @@ void CGenericMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// ISoundMask - generic monster can't hear. // ISoundMask - generic monster can't hear.
//========================================================= //=========================================================
int CGenericMonster :: ISoundMask ( void ) int CGenericMonster::ISoundMask( void )
{ {
return NULL; return NULL;
} }
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CGenericMonster :: Spawn() void CGenericMonster::Spawn()
{ {
Precache(); Precache();
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
/* /*
if ( FStrEq( STRING(pev->model), "models/player.mdl" ) ) if( FStrEq( STRING( pev->model ), "models/player.mdl" ) )
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
else else
UTIL_SetSize(pev, VEC_HULL_MIN, VEC_HULL_MAX); UTIL_SetSize( pev, VEC_HULL_MIN, VEC_HULL_MAX);
*/ */
if( FStrEq( STRING( pev->model ), "models/player.mdl" ) || FStrEq( STRING( pev->model ), "models/holo.mdl" ) )
if ( FStrEq( STRING(pev->model), "models/player.mdl" ) || FStrEq( STRING(pev->model), "models/holo.mdl" ) ) UTIL_SetSize( pev, VEC_HULL_MIN, VEC_HULL_MAX );
UTIL_SetSize(pev, VEC_HULL_MIN, VEC_HULL_MAX);
else else
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->health = 8; pev->health = 8;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
MonsterInit(); MonsterInit();
if ( pev->spawnflags & SF_GENERICMONSTER_NOTSOLID ) if( pev->spawnflags & SF_GENERICMONSTER_NOTSOLID )
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
@ -131,10 +129,10 @@ void CGenericMonster :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CGenericMonster :: Precache() void CGenericMonster::Precache()
{ {
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
} }
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster

View File

@ -27,7 +27,6 @@
#include "soundent.h" #include "soundent.h"
#include "decals.h" #include "decals.h"
//===================grenade //===================grenade
@ -42,7 +41,7 @@ LINK_ENTITY_TO_CLASS( grenade, CGrenade )
void CGrenade::Explode( Vector vecSrc, Vector vecAim ) void CGrenade::Explode( Vector vecSrc, Vector vecAim )
{ {
TraceResult tr; TraceResult tr;
UTIL_TraceLine ( pev->origin, pev->origin + Vector ( 0, 0, -32 ), ignore_monsters, ENT(pev), & tr); UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, -32 ), ignore_monsters, ENT( pev ), & tr );
Explode( &tr, DMG_BLAST ); Explode( &tr, DMG_BLAST );
} }
@ -50,7 +49,7 @@ void CGrenade::Explode( Vector vecSrc, Vector vecAim )
// UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution. // UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution.
void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType ) void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
{ {
float flRndSound;// sound randomizer float flRndSound;// sound randomizer
pev->model = iStringNull;//invisible pev->model = iStringNull;//invisible
pev->solid = SOLID_NOT;// intangible pev->solid = SOLID_NOT;// intangible
@ -58,19 +57,19 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
// Pull out of the wall a bit // Pull out of the wall a bit
if ( pTrace->flFraction != 1.0 ) if( pTrace->flFraction != 1.0 )
{ {
pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); pev->origin = pTrace->vecEndPos + ( pTrace->vecPlaneNormal * ( pev->dmg - 24 ) * 0.6 );
} }
int iContents = UTIL_PointContents ( pev->origin ); int iContents = UTIL_PointContents( pev->origin );
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION ); // This makes a dynamic light and the explosion sprites/sound WRITE_BYTE( TE_EXPLOSION ); // This makes a dynamic light and the explosion sprites/sound
WRITE_COORD( pev->origin.x ); // Send to PAS because of the sound WRITE_COORD( pev->origin.x ); // Send to PAS because of the sound
WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
if (iContents != CONTENTS_WATER) if( iContents != CONTENTS_WATER )
{ {
WRITE_SHORT( g_sModelIndexFireball ); WRITE_SHORT( g_sModelIndexFireball );
} }
@ -78,23 +77,23 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
{ {
WRITE_SHORT( g_sModelIndexWExplosion ); WRITE_SHORT( g_sModelIndexWExplosion );
} }
WRITE_BYTE( (pev->dmg - 50) * .60 ); // scale * 10 WRITE_BYTE( ( pev->dmg - 50 ) * .60 ); // scale * 10
WRITE_BYTE( 15 ); // framerate WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE ); WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END(); MESSAGE_END();
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 );
entvars_t *pevOwner; entvars_t *pevOwner;
if ( pev->owner ) if( pev->owner )
pevOwner = VARS( pev->owner ); pevOwner = VARS( pev->owner );
else else
pevOwner = NULL; pevOwner = NULL;
pev->owner = NULL; // can't traceline attack owner if this is set pev->owner = NULL; // can't traceline attack owner if this is set
RadiusDamage ( pev, pevOwner, pev->dmg, CLASS_NONE, bitsDamageType ); RadiusDamage( pev, pevOwner, pev->dmg, CLASS_NONE, bitsDamageType );
if ( RANDOM_FLOAT( 0 , 1 ) < 0.5 ) if( RANDOM_FLOAT( 0, 1 ) < 0.5 )
{ {
UTIL_DecalTrace( pTrace, DECAL_SCORCH1 ); UTIL_DecalTrace( pTrace, DECAL_SCORCH1 );
} }
@ -103,13 +102,19 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
UTIL_DecalTrace( pTrace, DECAL_SCORCH2 ); UTIL_DecalTrace( pTrace, DECAL_SCORCH2 );
} }
flRndSound = RANDOM_FLOAT( 0 , 1 ); flRndSound = RANDOM_FLOAT( 0, 1 );
switch ( RANDOM_LONG( 0, 2 ) ) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris1.wav", 0.55, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris2.wav", 0.55, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris1.wav", 0.55, ATTN_NORM );
case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/debris3.wav", 0.55, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris2.wav", 0.55, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris3.wav", 0.55, ATTN_NORM );
break;
} }
pev->effects |= EF_NODRAW; pev->effects |= EF_NODRAW;
@ -117,17 +122,17 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
pev->velocity = g_vecZero; pev->velocity = g_vecZero;
pev->nextthink = gpGlobals->time + 0.3; pev->nextthink = gpGlobals->time + 0.3;
if (iContents != CONTENTS_WATER) if( iContents != CONTENTS_WATER )
{ {
int sparkCount = RANDOM_LONG(0,3); int sparkCount = RANDOM_LONG( 0, 3 );
for ( int i = 0; i < sparkCount; i++ ) for( int i = 0; i < sparkCount; i++ )
Create( "spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL ); Create( "spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL );
} }
} }
void CGrenade::Smoke( void ) void CGrenade::Smoke( void )
{ {
if (UTIL_PointContents ( pev->origin ) == CONTENTS_WATER) if( UTIL_PointContents( pev->origin ) == CONTENTS_WATER )
{ {
UTIL_Bubbles( pev->origin - Vector( 64, 64, 64 ), pev->origin + Vector( 64, 64, 64 ), 100 ); UTIL_Bubbles( pev->origin - Vector( 64, 64, 64 ), pev->origin + Vector( 64, 64, 64 ), 100 );
} }
@ -139,7 +144,7 @@ void CGrenade::Smoke( void )
WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( (pev->dmg - 50) * 0.80 ); // scale * 10 WRITE_BYTE( ( pev->dmg - 50 ) * 0.80 ); // scale * 10
WRITE_BYTE( 12 ); // framerate WRITE_BYTE( 12 ); // framerate
MESSAGE_END(); MESSAGE_END();
} }
@ -148,7 +153,7 @@ void CGrenade::Smoke( void )
void CGrenade::Killed( entvars_t *pevAttacker, int iGib ) void CGrenade::Killed( entvars_t *pevAttacker, int iGib )
{ {
Detonate( ); Detonate();
} }
// Timed grenade, this think is called when time runs out. // Timed grenade, this think is called when time runs out.
@ -169,10 +174,10 @@ void CGrenade::PreDetonate( void )
void CGrenade::Detonate( void ) void CGrenade::Detonate( void )
{ {
TraceResult tr; TraceResult tr;
Vector vecSpot;// trace starts here! Vector vecSpot;// trace starts here!
vecSpot = pev->origin + Vector ( 0 , 0 , 8 ); vecSpot = pev->origin + Vector( 0, 0, 8 );
UTIL_TraceLine ( vecSpot, vecSpot + Vector ( 0, 0, -40 ), ignore_monsters, ENT(pev), & tr); UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -40 ), ignore_monsters, ENT(pev), &tr );
Explode( &tr, DMG_BLAST ); Explode( &tr, DMG_BLAST );
} }
@ -184,28 +189,28 @@ void CGrenade::Detonate( void )
void CGrenade::ExplodeTouch( CBaseEntity *pOther ) void CGrenade::ExplodeTouch( CBaseEntity *pOther )
{ {
TraceResult tr; TraceResult tr;
Vector vecSpot;// trace starts here! Vector vecSpot;// trace starts here!
pev->enemy = pOther->edict(); pev->enemy = pOther->edict();
vecSpot = pev->origin - pev->velocity.Normalize() * 32; vecSpot = pev->origin - pev->velocity.Normalize() * 32;
UTIL_TraceLine( vecSpot, vecSpot + pev->velocity.Normalize() * 64, ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( vecSpot, vecSpot + pev->velocity.Normalize() * 64, ignore_monsters, ENT( pev ), &tr );
Explode( &tr, DMG_BLAST ); Explode( &tr, DMG_BLAST );
} }
void CGrenade::DangerSoundThink( void ) void CGrenade::DangerSoundThink( void )
{ {
if (!IsInWorld()) if( !IsInWorld() )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, pev->velocity.Length( ), 0.2 ); CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, pev->velocity.Length(), 0.2 );
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
if (pev->waterlevel != 0) if( pev->waterlevel != 0 )
{ {
pev->velocity = pev->velocity * 0.5; pev->velocity = pev->velocity * 0.5;
} }
@ -214,25 +219,25 @@ void CGrenade::DangerSoundThink( void )
void CGrenade::BounceTouch( CBaseEntity *pOther ) void CGrenade::BounceTouch( CBaseEntity *pOther )
{ {
// don't hit the guy that launched this grenade // don't hit the guy that launched this grenade
if ( pOther->edict() == pev->owner ) if( pOther->edict() == pev->owner )
return; return;
// only do damage if we're moving fairly fast // only do damage if we're moving fairly fast
if (m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 100) if( m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 100 )
{ {
entvars_t *pevOwner = VARS( pev->owner ); entvars_t *pevOwner = VARS( pev->owner );
if (pevOwner) if( pevOwner )
{ {
TraceResult tr = UTIL_GetGlobalTrace( ); TraceResult tr = UTIL_GetGlobalTrace();
ClearMultiDamage( ); ClearMultiDamage();
pOther->TraceAttack(pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); pOther->TraceAttack( pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB );
ApplyMultiDamage( pev, pevOwner); ApplyMultiDamage( pev, pevOwner );
} }
m_flNextAttack = gpGlobals->time + 1.0; // debounce m_flNextAttack = gpGlobals->time + 1.0; // debounce
} }
Vector vecTestVelocity; Vector vecTestVelocity;
// pev->avelocity = Vector (300, 300, 300); // pev->avelocity = Vector( 300, 300, 300 );
// this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical // this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical
// or thrown very far tend to slow down too quickly for me to always catch just by testing velocity. // or thrown very far tend to slow down too quickly for me to always catch just by testing velocity.
@ -240,19 +245,19 @@ void CGrenade::BounceTouch( CBaseEntity *pOther )
vecTestVelocity = pev->velocity; vecTestVelocity = pev->velocity;
vecTestVelocity.z *= 0.45; vecTestVelocity.z *= 0.45;
if ( !m_fRegisteredSound && vecTestVelocity.Length() <= 60 ) if( !m_fRegisteredSound && vecTestVelocity.Length() <= 60 )
{ {
//ALERT( at_console, "Grenade Registered!: %f\n", vecTestVelocity.Length() ); //ALERT( at_console, "Grenade Registered!: %f\n", vecTestVelocity.Length() );
// grenade is moving really slow. It's probably very close to where it will ultimately stop moving. // grenade is moving really slow. It's probably very close to where it will ultimately stop moving.
// go ahead and emit the danger sound. // go ahead and emit the danger sound.
// register a radius louder than the explosion, so we make sure everyone gets out of the way // register a radius louder than the explosion, so we make sure everyone gets out of the way
CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4, 0.3 ); CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4, 0.3 );
m_fRegisteredSound = TRUE; m_fRegisteredSound = TRUE;
} }
if (pev->flags & FL_ONGROUND) if( pev->flags & FL_ONGROUND )
{ {
// add a bit of static friction // add a bit of static friction
pev->velocity = pev->velocity * 0.8; pev->velocity = pev->velocity * 0.8;
@ -265,27 +270,25 @@ void CGrenade::BounceTouch( CBaseEntity *pOther )
BounceSound(); BounceSound();
} }
pev->framerate = pev->velocity.Length() / 200.0; pev->framerate = pev->velocity.Length() / 200.0;
if (pev->framerate > 1.0) if( pev->framerate > 1.0 )
pev->framerate = 1; pev->framerate = 1;
else if (pev->framerate < 0.5) else if( pev->framerate < 0.5 )
pev->framerate = 0; pev->framerate = 0;
} }
void CGrenade::SlideTouch( CBaseEntity *pOther ) void CGrenade::SlideTouch( CBaseEntity *pOther )
{ {
// don't hit the guy that launched this grenade // don't hit the guy that launched this grenade
if ( pOther->edict() == pev->owner ) if( pOther->edict() == pev->owner )
return; return;
// pev->avelocity = Vector (300, 300, 300); // pev->avelocity = Vector( 300, 300, 300 );
if( pev->flags & FL_ONGROUND )
if (pev->flags & FL_ONGROUND)
{ {
// add a bit of static friction // add a bit of static friction
pev->velocity = pev->velocity * 0.95; pev->velocity = pev->velocity * 0.95;
if (pev->velocity.x != 0 || pev->velocity.y != 0) if( pev->velocity.x != 0 || pev->velocity.y != 0 )
{ {
// maintain sliding sound // maintain sliding sound
} }
@ -296,52 +299,58 @@ void CGrenade::SlideTouch( CBaseEntity *pOther )
} }
} }
void CGrenade :: BounceSound( void ) void CGrenade::BounceSound( void )
{ {
switch ( RANDOM_LONG( 0, 2 ) ) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit1.wav", 0.25, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit2.wav", 0.25, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit1.wav", 0.25, ATTN_NORM );
case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/grenade_hit3.wav", 0.25, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit2.wav", 0.25, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit3.wav", 0.25, ATTN_NORM );
break;
} }
} }
void CGrenade :: TumbleThink( void ) void CGrenade::TumbleThink( void )
{ {
if (!IsInWorld()) if( !IsInWorld() )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (pev->dmgtime - 1 < gpGlobals->time) if( pev->dmgtime - 1 < gpGlobals->time )
{ {
CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin + pev->velocity * (pev->dmgtime - gpGlobals->time), 400, 0.1 ); CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin + pev->velocity * ( pev->dmgtime - gpGlobals->time ), 400, 0.1 );
} }
if (pev->dmgtime <= gpGlobals->time) if( pev->dmgtime <= gpGlobals->time )
{ {
SetThink( &CGrenade::Detonate ); SetThink( &CGrenade::Detonate );
} }
if (pev->waterlevel != 0) if( pev->waterlevel != 0 )
{ {
pev->velocity = pev->velocity * 0.5; pev->velocity = pev->velocity * 0.5;
pev->framerate = 0.2; pev->framerate = 0.2;
} }
} }
void CGrenade:: Spawn( void ) void CGrenade::Spawn( void )
{ {
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
pev->classname = MAKE_STRING( "grenade" ); pev->classname = MAKE_STRING( "grenade" );
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/grenade.mdl"); SET_MODEL( ENT( pev ), "models/grenade.mdl" );
UTIL_SetSize(pev, Vector( 0, 0, 0), Vector(0, 0, 0)); UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
pev->dmg = 100; pev->dmg = 100;
m_fRegisteredSound = FALSE; m_fRegisteredSound = FALSE;
@ -355,16 +364,16 @@ CGrenade *CGrenade::ShootContact( entvars_t *pevOwner, Vector vecStart, Vector v
pGrenade->pev->gravity = 0.5;// lower gravity since grenade is aerodynamic and engine doesn't know it. pGrenade->pev->gravity = 0.5;// lower gravity since grenade is aerodynamic and engine doesn't know it.
UTIL_SetOrigin( pGrenade->pev, vecStart ); UTIL_SetOrigin( pGrenade->pev, vecStart );
pGrenade->pev->velocity = vecVelocity; pGrenade->pev->velocity = vecVelocity;
pGrenade->pev->angles = UTIL_VecToAngles (pGrenade->pev->velocity); pGrenade->pev->angles = UTIL_VecToAngles( pGrenade->pev->velocity );
pGrenade->pev->owner = ENT(pevOwner); pGrenade->pev->owner = ENT( pevOwner );
// make monsters afaid of it while in the air // make monsters afaid of it while in the air
pGrenade->SetThink( &CGrenade::DangerSoundThink ); pGrenade->SetThink( &CGrenade::DangerSoundThink );
pGrenade->pev->nextthink = gpGlobals->time; pGrenade->pev->nextthink = gpGlobals->time;
// Tumble in air // Tumble in air
pGrenade->pev->avelocity.x = RANDOM_FLOAT ( -100, -500 ); pGrenade->pev->avelocity.x = RANDOM_FLOAT( -100, -500 );
// Explode on contact // Explode on contact
pGrenade->SetTouch( &CGrenade::ExplodeTouch ); pGrenade->SetTouch( &CGrenade::ExplodeTouch );
@ -373,17 +382,17 @@ CGrenade *CGrenade::ShootContact( entvars_t *pevOwner, Vector vecStart, Vector v
return pGrenade; return pGrenade;
} }
CGrenade * CGrenade:: ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time ) CGrenade *CGrenade::ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time )
{ {
CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL ); CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL );
pGrenade->Spawn(); pGrenade->Spawn();
UTIL_SetOrigin( pGrenade->pev, vecStart ); UTIL_SetOrigin( pGrenade->pev, vecStart );
pGrenade->pev->velocity = vecVelocity; pGrenade->pev->velocity = vecVelocity;
pGrenade->pev->angles = UTIL_VecToAngles(pGrenade->pev->velocity); pGrenade->pev->angles = UTIL_VecToAngles( pGrenade->pev->velocity );
pGrenade->pev->owner = ENT(pevOwner); pGrenade->pev->owner = ENT( pevOwner );
pGrenade->SetTouch( &CGrenade::BounceTouch ); // Bounce if touched pGrenade->SetTouch( &CGrenade::BounceTouch ); // Bounce if touched
// Take one second off of the desired detonation time and set the think to PreDetonate. PreDetonate // Take one second off of the desired detonation time and set the think to PreDetonate. PreDetonate
// will insert a DANGER sound into the world sound list and delay detonation for one second so that // will insert a DANGER sound into the world sound list and delay detonation for one second so that
// the grenade explodes after the exact amount of time specified in the call to ShootTimed(). // the grenade explodes after the exact amount of time specified in the call to ShootTimed().
@ -391,12 +400,12 @@ CGrenade * CGrenade:: ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector v
pGrenade->pev->dmgtime = gpGlobals->time + time; pGrenade->pev->dmgtime = gpGlobals->time + time;
pGrenade->SetThink( &CGrenade::TumbleThink ); pGrenade->SetThink( &CGrenade::TumbleThink );
pGrenade->pev->nextthink = gpGlobals->time + 0.1; pGrenade->pev->nextthink = gpGlobals->time + 0.1;
if (time < 0.1) if( time < 0.1 )
{ {
pGrenade->pev->nextthink = gpGlobals->time; pGrenade->pev->nextthink = gpGlobals->time;
pGrenade->pev->velocity = Vector( 0, 0, 0 ); pGrenade->pev->velocity = Vector( 0, 0, 0 );
} }
pGrenade->pev->sequence = RANDOM_LONG( 3, 6 ); pGrenade->pev->sequence = RANDOM_LONG( 3, 6 );
pGrenade->pev->framerate = 1.0; pGrenade->pev->framerate = 1.0;
@ -406,30 +415,30 @@ CGrenade * CGrenade:: ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector v
pGrenade->pev->gravity = 0.5; pGrenade->pev->gravity = 0.5;
pGrenade->pev->friction = 0.8; pGrenade->pev->friction = 0.8;
SET_MODEL(ENT(pGrenade->pev), "models/w_grenade.mdl"); SET_MODEL( ENT( pGrenade->pev ), "models/w_grenade.mdl" );
pGrenade->pev->dmg = 100; pGrenade->pev->dmg = 100;
return pGrenade; return pGrenade;
} }
CGrenade * CGrenade :: ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity ) CGrenade *CGrenade::ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity )
{ {
CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL ); CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL );
pGrenade->pev->movetype = MOVETYPE_BOUNCE; pGrenade->pev->movetype = MOVETYPE_BOUNCE;
pGrenade->pev->classname = MAKE_STRING( "grenade" ); pGrenade->pev->classname = MAKE_STRING( "grenade" );
pGrenade->pev->solid = SOLID_BBOX; pGrenade->pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pGrenade->pev), "models/grenade.mdl"); // Change this to satchel charge model SET_MODEL( ENT( pGrenade->pev ), "models/grenade.mdl" ); // Change this to satchel charge model
UTIL_SetSize(pGrenade->pev, Vector( 0, 0, 0), Vector(0, 0, 0)); UTIL_SetSize( pGrenade->pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
pGrenade->pev->dmg = 200; pGrenade->pev->dmg = 200;
UTIL_SetOrigin( pGrenade->pev, vecStart ); UTIL_SetOrigin( pGrenade->pev, vecStart );
pGrenade->pev->velocity = vecVelocity; pGrenade->pev->velocity = vecVelocity;
pGrenade->pev->angles = g_vecZero; pGrenade->pev->angles = g_vecZero;
pGrenade->pev->owner = ENT(pevOwner); pGrenade->pev->owner = ENT( pevOwner );
// Detonate in "time" seconds // Detonate in "time" seconds
pGrenade->SetThink( &CBaseEntity::SUB_DoNothing ); pGrenade->SetThink( &CBaseEntity::SUB_DoNothing );
pGrenade->SetUse( &CGrenade::DetonateUse ); pGrenade->SetUse( &CGrenade::DetonateUse );
@ -441,29 +450,29 @@ CGrenade * CGrenade :: ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart,
return pGrenade; return pGrenade;
} }
void CGrenade :: UseSatchelCharges( entvars_t *pevOwner, SATCHELCODE code ) void CGrenade::UseSatchelCharges( entvars_t *pevOwner, SATCHELCODE code )
{ {
edict_t *pentFind; edict_t *pentFind;
edict_t *pentOwner; edict_t *pentOwner;
if ( !pevOwner ) if( !pevOwner )
return; return;
CBaseEntity *pOwner = CBaseEntity::Instance( pevOwner ); CBaseEntity *pOwner = CBaseEntity::Instance( pevOwner );
pentOwner = pOwner->edict(); pentOwner = pOwner->edict();
pentFind = FIND_ENTITY_BY_CLASSNAME( NULL, "grenade" ); pentFind = FIND_ENTITY_BY_CLASSNAME( NULL, "grenade" );
while ( !FNullEnt( pentFind ) ) while( !FNullEnt( pentFind ) )
{ {
CBaseEntity *pEnt = Instance( pentFind ); CBaseEntity *pEnt = Instance( pentFind );
if ( pEnt ) if( pEnt )
{ {
if ( FBitSet( pEnt->pev->spawnflags, SF_DETONATE ) && pEnt->pev->owner == pentOwner ) if( FBitSet( pEnt->pev->spawnflags, SF_DETONATE ) && pEnt->pev->owner == pentOwner )
{ {
if ( code == SATCHEL_DETONATE ) if( code == SATCHEL_DETONATE )
pEnt->Use( pOwner, pOwner, USE_ON, 0 ); pEnt->Use( pOwner, pOwner, USE_ON, 0 );
else // SATCHEL_RELEASE else // SATCHEL_RELEASE
pEnt->pev->owner = NULL; pEnt->pev->owner = NULL;
} }
} }

View File

@ -35,5 +35,5 @@ DLL_GLOBAL Vector g_vecAttackDir;
DLL_GLOBAL int g_iSkillLevel; DLL_GLOBAL int g_iSkillLevel;
DLL_GLOBAL int gDisplayTitle; DLL_GLOBAL int gDisplayTitle;
DLL_GLOBAL BOOL g_fGameOver; DLL_GLOBAL BOOL g_fGameOver;
DLL_GLOBAL const Vector g_vecZero = Vector(0,0,0); DLL_GLOBAL const Vector g_vecZero = Vector( 0, 0, 0 );
DLL_GLOBAL int g_Language; DLL_GLOBAL int g_Language;

View File

@ -21,7 +21,8 @@
#include "nodes.h" #include "nodes.h"
#include "player.h" #include "player.h"
enum glock_e { enum glock_e
{
GLOCK_IDLE1 = 0, GLOCK_IDLE1 = 0,
GLOCK_IDLE2, GLOCK_IDLE2,
GLOCK_IDLE3, GLOCK_IDLE3,
@ -37,12 +38,12 @@ enum glock_e {
LINK_ENTITY_TO_CLASS( weapon_glock, CGlock ) LINK_ENTITY_TO_CLASS( weapon_glock, CGlock )
LINK_ENTITY_TO_CLASS( weapon_9mmhandgun, CGlock ) LINK_ENTITY_TO_CLASS( weapon_9mmhandgun, CGlock )
void CGlock::Spawn( ) void CGlock::Spawn()
{ {
pev->classname = MAKE_STRING("weapon_9mmhandgun"); // hack to allow for old names pev->classname = MAKE_STRING( "weapon_9mmhandgun" ); // hack to allow for old names
Precache( ); Precache();
m_iId = WEAPON_GLOCK; m_iId = WEAPON_GLOCK;
SET_MODEL(ENT(pev), "models/w_9mmhandgun.mdl"); SET_MODEL( ENT( pev ), "models/w_9mmhandgun.mdl" );
m_iDefaultAmmo = GLOCK_DEFAULT_GIVE; m_iDefaultAmmo = GLOCK_DEFAULT_GIVE;
@ -51,26 +52,26 @@ void CGlock::Spawn( )
void CGlock::Precache( void ) void CGlock::Precache( void )
{ {
PRECACHE_MODEL("models/v_9mmhandgun.mdl"); PRECACHE_MODEL( "models/v_9mmhandgun.mdl" );
PRECACHE_MODEL("models/w_9mmhandgun.mdl"); PRECACHE_MODEL( "models/w_9mmhandgun.mdl" );
PRECACHE_MODEL("models/p_9mmhandgun.mdl"); PRECACHE_MODEL( "models/p_9mmhandgun.mdl" );
m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell m_iShell = PRECACHE_MODEL( "models/shell.mdl" );// brass shell
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
PRECACHE_SOUND("items/9mmclip2.wav"); PRECACHE_SOUND( "items/9mmclip2.wav" );
PRECACHE_SOUND ("weapons/pl_gun1.wav");//silenced handgun PRECACHE_SOUND( "weapons/pl_gun1.wav" );//silenced handgun
PRECACHE_SOUND ("weapons/pl_gun2.wav");//silenced handgun PRECACHE_SOUND( "weapons/pl_gun2.wav" );//silenced handgun
PRECACHE_SOUND ("weapons/pl_gun3.wav");//handgun PRECACHE_SOUND( "weapons/pl_gun3.wav" );//handgun
m_usFireGlock1 = PRECACHE_EVENT( 1, "events/glock1.sc" ); m_usFireGlock1 = PRECACHE_EVENT( 1, "events/glock1.sc" );
m_usFireGlock2 = PRECACHE_EVENT( 1, "events/glock2.sc" ); m_usFireGlock2 = PRECACHE_EVENT( 1, "events/glock2.sc" );
} }
int CGlock::GetItemInfo(ItemInfo *p) int CGlock::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "9mm"; p->pszAmmo1 = "9mm";
p->iMaxAmmo1 = _9MM_MAX_CARRY; p->iMaxAmmo1 = _9MM_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -85,7 +86,7 @@ int CGlock::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CGlock::Deploy( ) BOOL CGlock::Deploy()
{ {
// pev->body = 1; // pev->body = 1;
return DefaultDeploy( "models/v_9mmhandgun.mdl", "models/p_9mmhandgun.mdl", GLOCK_DRAW, "onehanded", /*UseDecrement() ? 1 : 0*/ 0 ); return DefaultDeploy( "models/v_9mmhandgun.mdl", "models/p_9mmhandgun.mdl", GLOCK_DRAW, "onehanded", /*UseDecrement() ? 1 : 0*/ 0 );
@ -101,11 +102,11 @@ void CGlock::PrimaryAttack( void )
GlockFire( 0.01, 0.3, TRUE ); GlockFire( 0.01, 0.3, TRUE );
} }
void CGlock::GlockFire( float flSpread , float flCycleTime, BOOL fUseAutoAim ) void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
{ {
if (m_iClip <= 0) if( m_iClip <= 0 )
{ {
if (m_fFireOnEmpty) if( m_fFireOnEmpty )
{ {
PlayEmptySound(); PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2;
@ -116,7 +117,7 @@ void CGlock::GlockFire( float flSpread , float flCycleTime, BOOL fUseAutoAim )
m_iClip--; m_iClip--;
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
int flags; int flags;
#if defined( CLIENT_WEAPONS ) #if defined( CLIENT_WEAPONS )
@ -128,7 +129,7 @@ void CGlock::GlockFire( float flSpread , float flCycleTime, BOOL fUseAutoAim )
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
// silenced // silenced
if (pev->body == 1) if( pev->body == 1 )
{ {
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH; m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
@ -140,10 +141,10 @@ void CGlock::GlockFire( float flSpread , float flCycleTime, BOOL fUseAutoAim )
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
} }
Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming; Vector vecAiming;
if ( fUseAutoAim ) if( fUseAutoAim )
{ {
vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
} }
@ -159,26 +160,26 @@ void CGlock::GlockFire( float flSpread , float flCycleTime, BOOL fUseAutoAim )
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime; m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime;
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition // HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
} }
void CGlock::Reload( void ) void CGlock::Reload( void )
{ {
if ( m_pPlayer->ammo_9mm <= 0 ) if( m_pPlayer->ammo_9mm <= 0 )
return; return;
int iResult; int iResult;
if (m_iClip == 0) if( m_iClip == 0 )
iResult = DefaultReload( 17, GLOCK_RELOAD, 1.5 ); iResult = DefaultReload( 17, GLOCK_RELOAD, 1.5 );
else else
iResult = DefaultReload( 17, GLOCK_RELOAD_NOT_EMPTY, 1.5 ); iResult = DefaultReload( 17, GLOCK_RELOAD_NOT_EMPTY, 1.5 );
if (iResult) if( iResult )
{ {
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
} }
@ -186,25 +187,25 @@ void CGlock::Reload( void )
void CGlock::WeaponIdle( void ) void CGlock::WeaponIdle( void )
{ {
ResetEmptySound( ); ResetEmptySound();
m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
// only idle if the slid isn't back // only idle if the slid isn't back
if (m_iClip != 0) if( m_iClip != 0 )
{ {
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0.0, 1.0 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0.0, 1.0 );
if (flRand <= 0.3 + 0 * 0.75) if( flRand <= 0.3 + 0 * 0.75 )
{ {
iAnim = GLOCK_IDLE3; iAnim = GLOCK_IDLE3;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 49.0 / 16; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 49.0 / 16;
} }
else if (flRand <= 0.6 + 0 * 0.875) else if( flRand <= 0.6 + 0 * 0.875 )
{ {
iAnim = GLOCK_IDLE1; iAnim = GLOCK_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 60.0 / 16.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 60.0 / 16.0;
@ -222,25 +223,27 @@ class CGlockAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_9mmclip.mdl"); SET_MODEL( ENT( pev ), "models/w_9mmclip.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_9mmclip.mdl"); PRECACHE_MODEL( "models/w_9mmclip.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther )
{ BOOL AddAmmo( CBaseEntity *pOther )
if (pOther->GiveAmmo( AMMO_GLOCKCLIP_GIVE, "9mm", _9MM_MAX_CARRY ) != -1) {
if( pOther->GiveAmmo( AMMO_GLOCKCLIP_GIVE, "9mm", _9MM_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
}; };
LINK_ENTITY_TO_CLASS( ammo_glockclip, CGlockAmmo ) LINK_ENTITY_TO_CLASS( ammo_glockclip, CGlockAmmo )
LINK_ENTITY_TO_CLASS( ammo_9mmclip, CGlockAmmo ) LINK_ENTITY_TO_CLASS( ammo_9mmclip, CGlockAmmo )

View File

@ -32,17 +32,17 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify ( void ); int Classify ( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
int ISoundMask ( void ); int ISoundMask ( void );
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void StartTask( Task_t *pTask ); void StartTask( Task_t *pTask );
void RunTask( Task_t *pTask ); void RunTask( Task_t *pTask );
int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
void PlayScriptedSentence( const char *pszSentence, float duration, float volume, float attenuation, BOOL bConcurrent, CBaseEntity *pListener ); void PlayScriptedSentence( const char *pszSentence, float duration, float volume, float attenuation, BOOL bConcurrent, CBaseEntity *pListener );
@ -54,7 +54,7 @@ public:
LINK_ENTITY_TO_CLASS( monster_gman, CGMan ) LINK_ENTITY_TO_CLASS( monster_gman, CGMan )
TYPEDESCRIPTION CGMan::m_SaveData[] = TYPEDESCRIPTION CGMan::m_SaveData[] =
{ {
DEFINE_FIELD( CGMan, m_hTalkTarget, FIELD_EHANDLE ), DEFINE_FIELD( CGMan, m_hTalkTarget, FIELD_EHANDLE ),
DEFINE_FIELD( CGMan, m_flTalkTime, FIELD_TIME ), DEFINE_FIELD( CGMan, m_flTalkTime, FIELD_TIME ),
@ -66,20 +66,20 @@ IMPLEMENT_SAVERESTORE( CGMan, CBaseMonster )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CGMan :: Classify ( void ) int CGMan::Classify( void )
{ {
return CLASS_NONE; return CLASS_NONE;
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CGMan :: SetYawSpeed ( void ) void CGMan::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_IDLE: case ACT_IDLE:
default: default:
@ -93,7 +93,7 @@ void CGMan :: SetYawSpeed ( void )
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
//========================================================= //=========================================================
void CGMan :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CGMan::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -107,25 +107,25 @@ void CGMan :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// ISoundMask - generic monster can't hear. // ISoundMask - generic monster can't hear.
//========================================================= //=========================================================
int CGMan :: ISoundMask ( void ) int CGMan::ISoundMask( void )
{ {
return NULL; return NULL;
} }
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CGMan :: Spawn() void CGMan::Spawn()
{ {
Precache(); Precache();
SET_MODEL( ENT(pev), "models/gman.mdl" ); SET_MODEL( ENT( pev ), "models/gman.mdl" );
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = DONT_BLEED; m_bloodColor = DONT_BLEED;
pev->health = 100; pev->health = 100;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
@ -135,21 +135,21 @@ void CGMan :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CGMan :: Precache() void CGMan::Precache()
{ {
PRECACHE_MODEL( "models/gman.mdl" ); PRECACHE_MODEL( "models/gman.mdl" );
} }
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================
void CGMan :: StartTask( Task_t *pTask ) void CGMan::StartTask( Task_t *pTask )
{ {
switch( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_WAIT: case TASK_WAIT:
if (m_hPlayer == NULL) if( m_hPlayer == NULL )
{ {
m_hPlayer = UTIL_FindEntityByClassname( NULL, "player" ); m_hPlayer = UTIL_FindEntityByClassname( NULL, "player" );
} }
@ -158,29 +158,33 @@ void CGMan :: StartTask( Task_t *pTask )
CBaseMonster::StartTask( pTask ); CBaseMonster::StartTask( pTask );
} }
void CGMan :: RunTask( Task_t *pTask ) void CGMan::RunTask( Task_t *pTask )
{ {
switch( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_WAIT: case TASK_WAIT:
// look at who I'm talking to // look at who I'm talking to
if (m_flTalkTime > gpGlobals->time && m_hTalkTarget != NULL) if( m_flTalkTime > gpGlobals->time && m_hTalkTarget != NULL )
{ {
float yaw = VecToYaw(m_hTalkTarget->pev->origin - pev->origin) - pev->angles.y; float yaw = VecToYaw( m_hTalkTarget->pev->origin - pev->origin ) - pev->angles.y;
if (yaw > 180) yaw -= 360; if( yaw > 180 )
if (yaw < -180) yaw += 360; yaw -= 360;
if( yaw < -180 )
yaw += 360;
// turn towards vector // turn towards vector
SetBoneController( 0, yaw ); SetBoneController( 0, yaw );
} }
// look at player, but only if playing a "safe" idle animation // look at player, but only if playing a "safe" idle animation
else if (m_hPlayer != NULL && pev->sequence == 0) else if( m_hPlayer != NULL && pev->sequence == 0 )
{ {
float yaw = VecToYaw(m_hPlayer->pev->origin - pev->origin) - pev->angles.y; float yaw = VecToYaw( m_hPlayer->pev->origin - pev->origin ) - pev->angles.y;
if (yaw > 180) yaw -= 360; if( yaw > 180 )
if (yaw < -180) yaw += 360; yaw -= 360;
if( yaw < -180 )
yaw += 360;
// turn towards vector // turn towards vector
SetBoneController( 0, yaw ); SetBoneController( 0, yaw );
@ -201,18 +205,18 @@ void CGMan :: RunTask( Task_t *pTask )
//========================================================= //=========================================================
// Override all damage // Override all damage
//========================================================= //=========================================================
int CGMan :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ) int CGMan::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
pev->health = pev->max_health / 2; // always trigger the 50% damage aitrigger pev->health = pev->max_health / 2; // always trigger the 50% damage aitrigger
if ( flDamage > 0 ) if( flDamage > 0 )
{ {
SetConditions(bits_COND_LIGHT_DAMAGE); SetConditions( bits_COND_LIGHT_DAMAGE );
} }
if ( flDamage >= 20 ) if( flDamage >= 20 )
{ {
SetConditions(bits_COND_HEAVY_DAMAGE); SetConditions( bits_COND_HEAVY_DAMAGE );
} }
return TRUE; return TRUE;
} }

View File

@ -18,7 +18,6 @@
*/ */
#include "extdll.h" #include "extdll.h"
#include "util.h" #include "util.h"
#include "cbase.h" #include "cbase.h"
@ -28,7 +27,7 @@
#define NUM_LATERAL_CHECKS 13 // how many checks are made on each side of a monster looking for lateral cover #define NUM_LATERAL_CHECKS 13 // how many checks are made on each side of a monster looking for lateral cover
#define NUM_LATERAL_LOS_CHECKS 6 // how many checks are made on each side of a monster looking for lateral cover #define NUM_LATERAL_LOS_CHECKS 6 // how many checks are made on each side of a monster looking for lateral cover
//float flRandom = RANDOM_FLOAT(0,1); //float flRandom = RANDOM_FLOAT( 0, 1 );
DLL_GLOBAL BOOL g_fDrawLines = FALSE; DLL_GLOBAL BOOL g_fDrawLines = FALSE;
@ -45,25 +44,25 @@ DLL_GLOBAL BOOL g_fDrawLines = FALSE;
// //
// !!!UNDONE - make this CBaseMonster? // !!!UNDONE - make this CBaseMonster?
//========================================================= //=========================================================
BOOL FBoxVisible ( entvars_t *pevLooker, entvars_t *pevTarget, Vector &vecTargetOrigin, float flSize ) BOOL FBoxVisible( entvars_t *pevLooker, entvars_t *pevTarget, Vector &vecTargetOrigin, float flSize )
{ {
// don't look through water // don't look through water
if ((pevLooker->waterlevel != 3 && pevTarget->waterlevel == 3) if( ( pevLooker->waterlevel != 3 && pevTarget->waterlevel == 3 )
|| (pevLooker->waterlevel == 3 && pevTarget->waterlevel == 0)) || ( pevLooker->waterlevel == 3 && pevTarget->waterlevel == 0 ) )
return FALSE; return FALSE;
TraceResult tr; TraceResult tr;
Vector vecLookerOrigin = pevLooker->origin + pevLooker->view_ofs;//look through the monster's 'eyes' Vector vecLookerOrigin = pevLooker->origin + pevLooker->view_ofs;//look through the monster's 'eyes'
for (int i = 0; i < 5; i++) for( int i = 0; i < 5; i++ )
{ {
Vector vecTarget = pevTarget->origin; Vector vecTarget = pevTarget->origin;
vecTarget.x += RANDOM_FLOAT( pevTarget->mins.x + flSize, pevTarget->maxs.x - flSize); vecTarget.x += RANDOM_FLOAT( pevTarget->mins.x + flSize, pevTarget->maxs.x - flSize );
vecTarget.y += RANDOM_FLOAT( pevTarget->mins.y + flSize, pevTarget->maxs.y - flSize); vecTarget.y += RANDOM_FLOAT( pevTarget->mins.y + flSize, pevTarget->maxs.y - flSize );
vecTarget.z += RANDOM_FLOAT( pevTarget->mins.z + flSize, pevTarget->maxs.z - flSize); vecTarget.z += RANDOM_FLOAT( pevTarget->mins.z + flSize, pevTarget->maxs.z - flSize );
UTIL_TraceLine(vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, ENT(pevLooker)/*pentIgnore*/, &tr); UTIL_TraceLine( vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, ENT( pevLooker )/*pentIgnore*/, &tr );
if (tr.flFraction == 1.0) if( tr.flFraction == 1.0 )
{ {
vecTargetOrigin = vecTarget; vecTargetOrigin = vecTarget;
return TRUE;// line of sight is valid. return TRUE;// line of sight is valid.
@ -76,7 +75,7 @@ BOOL FBoxVisible ( entvars_t *pevLooker, entvars_t *pevTarget, Vector &vecTarget
// VecCheckToss - returns the velocity at which an object should be lobbed from vecspot1 to land near vecspot2. // VecCheckToss - returns the velocity at which an object should be lobbed from vecspot1 to land near vecspot2.
// returns g_vecZero if toss is not feasible. // returns g_vecZero if toss is not feasible.
// //
Vector VecCheckToss ( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, float flGravityAdj ) Vector VecCheckToss( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, float flGravityAdj )
{ {
TraceResult tr; TraceResult tr;
Vector vecMidPoint;// halfway point between Spot1 and Spot2 Vector vecMidPoint;// halfway point between Spot1 and Spot2
@ -86,52 +85,52 @@ Vector VecCheckToss ( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, f
Vector vecTemp; Vector vecTemp;
float flGravity = g_psv_gravity->value * flGravityAdj; float flGravity = g_psv_gravity->value * flGravityAdj;
if (vecSpot2.z - vecSpot1.z > 500) if( vecSpot2.z - vecSpot1.z > 500 )
{ {
// to high, fail // to high, fail
return g_vecZero; return g_vecZero;
} }
UTIL_MakeVectors (pev->angles); UTIL_MakeVectors( pev->angles );
// toss a little bit to the left or right, not right down on the enemy's bean (head). // toss a little bit to the left or right, not right down on the enemy's bean (head).
vecSpot2 = vecSpot2 + gpGlobals->v_right * ( RANDOM_FLOAT(-8,8) + RANDOM_FLOAT(-16,16) ); vecSpot2 = vecSpot2 + gpGlobals->v_right * ( RANDOM_FLOAT( -8, 8 ) + RANDOM_FLOAT( -16, 16 ) );
vecSpot2 = vecSpot2 + gpGlobals->v_forward * ( RANDOM_FLOAT(-8,8) + RANDOM_FLOAT(-16,16) ); vecSpot2 = vecSpot2 + gpGlobals->v_forward * ( RANDOM_FLOAT( -8, 8 ) + RANDOM_FLOAT( -16, 16 ) );
// calculate the midpoint and apex of the 'triangle' // calculate the midpoint and apex of the 'triangle'
// UNDONE: normalize any Z position differences between spot1 and spot2 so that triangle is always RIGHT // UNDONE: normalize any Z position differences between spot1 and spot2 so that triangle is always RIGHT
// How much time does it take to get there? // How much time does it take to get there?
// get a rough idea of how high it can be thrown // get a rough idea of how high it can be thrown
vecMidPoint = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5; vecMidPoint = vecSpot1 + ( vecSpot2 - vecSpot1 ) * 0.5;
UTIL_TraceLine(vecMidPoint, vecMidPoint + Vector(0,0,500), ignore_monsters, ENT(pev), &tr); UTIL_TraceLine(vecMidPoint, vecMidPoint + Vector( 0, 0, 500 ), ignore_monsters, ENT( pev ), &tr );
vecMidPoint = tr.vecEndPos; vecMidPoint = tr.vecEndPos;
// (subtract 15 so the grenade doesn't hit the ceiling) // (subtract 15 so the grenade doesn't hit the ceiling)
vecMidPoint.z -= 15; vecMidPoint.z -= 15;
if (vecMidPoint.z < vecSpot1.z || vecMidPoint.z < vecSpot2.z) if( vecMidPoint.z < vecSpot1.z || vecMidPoint.z < vecSpot2.z )
{ {
// to not enough space, fail // to not enough space, fail
return g_vecZero; return g_vecZero;
} }
// How high should the grenade travel to reach the apex // How high should the grenade travel to reach the apex
float distance1 = (vecMidPoint.z - vecSpot1.z); float distance1 = vecMidPoint.z - vecSpot1.z;
float distance2 = (vecMidPoint.z - vecSpot2.z); float distance2 = vecMidPoint.z - vecSpot2.z;
// How long will it take for the grenade to travel this distance // How long will it take for the grenade to travel this distance
float time1 = sqrt( distance1 / (0.5 * flGravity) ); float time1 = sqrt( distance1 / ( 0.5 * flGravity ) );
float time2 = sqrt( distance2 / (0.5 * flGravity) ); float time2 = sqrt( distance2 / ( 0.5 * flGravity ) );
if (time1 < 0.1) if( time1 < 0.1 )
{ {
// too close // too close
return g_vecZero; return g_vecZero;
} }
// how hard to throw sideways to get there in time. // how hard to throw sideways to get there in time.
vecGrenadeVel = (vecSpot2 - vecSpot1) / (time1 + time2); vecGrenadeVel = ( vecSpot2 - vecSpot1 ) / ( time1 + time2 );
// how hard upwards to reach the apex at the right time. // how hard upwards to reach the apex at the right time.
vecGrenadeVel.z = flGravity * time1; vecGrenadeVel.z = flGravity * time1;
@ -139,55 +138,54 @@ Vector VecCheckToss ( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, f
vecApex = vecSpot1 + vecGrenadeVel * time1; vecApex = vecSpot1 + vecGrenadeVel * time1;
vecApex.z = vecMidPoint.z; vecApex.z = vecMidPoint.z;
UTIL_TraceLine(vecSpot1, vecApex, dont_ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( vecSpot1, vecApex, dont_ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
// fail! // fail!
return g_vecZero; return g_vecZero;
} }
// UNDONE: either ignore monsters or change it to not care if we hit our enemy // UNDONE: either ignore monsters or change it to not care if we hit our enemy
UTIL_TraceLine(vecSpot2, vecApex, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( vecSpot2, vecApex, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
// fail! // fail!
return g_vecZero; return g_vecZero;
} }
return vecGrenadeVel; return vecGrenadeVel;
} }
// //
// VecCheckThrow - returns the velocity vector at which an object should be thrown from vecspot1 to hit vecspot2. // VecCheckThrow - returns the velocity vector at which an object should be thrown from vecspot1 to hit vecspot2.
// returns g_vecZero if throw is not feasible. // returns g_vecZero if throw is not feasible.
// //
Vector VecCheckThrow ( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flGravityAdj ) Vector VecCheckThrow( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flGravityAdj )
{ {
float flGravity = g_psv_gravity->value * flGravityAdj; float flGravity = g_psv_gravity->value * flGravityAdj;
Vector vecGrenadeVel = (vecSpot2 - vecSpot1); Vector vecGrenadeVel = vecSpot2 - vecSpot1;
// throw at a constant time // throw at a constant time
float time = vecGrenadeVel.Length( ) / flSpeed; float time = vecGrenadeVel.Length() / flSpeed;
vecGrenadeVel = vecGrenadeVel * (1.0 / time); vecGrenadeVel = vecGrenadeVel * ( 1.0 / time );
// adjust upward toss to compensate for gravity loss // adjust upward toss to compensate for gravity loss
vecGrenadeVel.z += flGravity * time * 0.5; vecGrenadeVel.z += flGravity * time * 0.5;
Vector vecApex = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5; Vector vecApex = vecSpot1 + ( vecSpot2 - vecSpot1 ) * 0.5;
vecApex.z += 0.5 * flGravity * (time * 0.5) * (time * 0.5); vecApex.z += 0.5 * flGravity * ( time * 0.5 ) * ( time * 0.5 );
TraceResult tr; TraceResult tr;
UTIL_TraceLine(vecSpot1, vecApex, dont_ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( vecSpot1, vecApex, dont_ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
// fail! // fail!
return g_vecZero; return g_vecZero;
} }
UTIL_TraceLine(vecSpot2, vecApex, ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( vecSpot2, vecApex, ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction != 1.0) if( tr.flFraction != 1.0 )
{ {
// fail! // fail!
return g_vecZero; return g_vecZero;
@ -195,5 +193,3 @@ Vector VecCheckThrow ( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot2,
return vecGrenadeVel; return vecGrenadeVel;
} }

View File

@ -30,31 +30,31 @@
class CRecharge : public CBaseToggle class CRecharge : public CBaseToggle
{ {
public: public:
void Spawn( ); void Spawn();
void Precache( void ); void Precache( void );
void EXPORT Off(void); void EXPORT Off(void);
void EXPORT Recharge(void); void EXPORT Recharge(void);
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int ObjectCaps( void ) { return (CBaseToggle :: ObjectCaps() | FCAP_CONTINUOUS_USE) & ~FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return ( CBaseToggle::ObjectCaps() | FCAP_CONTINUOUS_USE ) & ~FCAP_ACROSS_TRANSITION; }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
float m_flNextCharge; float m_flNextCharge;
int m_iReactivate ; // DeathMatch Delay until reactvated int m_iReactivate; // DeathMatch Delay until reactvated
int m_iJuice; int m_iJuice;
int m_iOn; // 0 = off, 1 = startup, 2 = going int m_iOn; // 0 = off, 1 = startup, 2 = going
float m_flSoundTime; float m_flSoundTime;
}; };
TYPEDESCRIPTION CRecharge::m_SaveData[] = TYPEDESCRIPTION CRecharge::m_SaveData[] =
{ {
DEFINE_FIELD( CRecharge, m_flNextCharge, FIELD_TIME ), DEFINE_FIELD( CRecharge, m_flNextCharge, FIELD_TIME ),
DEFINE_FIELD( CRecharge, m_iReactivate, FIELD_INTEGER), DEFINE_FIELD( CRecharge, m_iReactivate, FIELD_INTEGER ),
DEFINE_FIELD( CRecharge, m_iJuice, FIELD_INTEGER), DEFINE_FIELD( CRecharge, m_iJuice, FIELD_INTEGER ),
DEFINE_FIELD( CRecharge, m_iOn, FIELD_INTEGER), DEFINE_FIELD( CRecharge, m_iOn, FIELD_INTEGER ),
DEFINE_FIELD( CRecharge, m_flSoundTime, FIELD_TIME ), DEFINE_FIELD( CRecharge, m_flSoundTime, FIELD_TIME ),
}; };
@ -64,17 +64,17 @@ LINK_ENTITY_TO_CLASS( func_recharge, CRecharge )
void CRecharge::KeyValue( KeyValueData *pkvd ) void CRecharge::KeyValue( KeyValueData *pkvd )
{ {
if ( FStrEq(pkvd->szKeyName, "style") || if( FStrEq( pkvd->szKeyName, "style" ) ||
FStrEq(pkvd->szKeyName, "height") || FStrEq( pkvd->szKeyName, "height" ) ||
FStrEq(pkvd->szKeyName, "value1") || FStrEq( pkvd->szKeyName, "value1" ) ||
FStrEq(pkvd->szKeyName, "value2") || FStrEq( pkvd->szKeyName, "value2" ) ||
FStrEq(pkvd->szKeyName, "value3")) FStrEq( pkvd->szKeyName, "value3" ) )
{ {
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "dmdelay")) else if( FStrEq( pkvd->szKeyName, "dmdelay" ) )
{ {
m_iReactivate = atoi(pkvd->szValue); m_iReactivate = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -83,88 +83,86 @@ void CRecharge::KeyValue( KeyValueData *pkvd )
void CRecharge::Spawn() void CRecharge::Spawn()
{ {
Precache( ); Precache();
pev->solid = SOLID_BSP; pev->solid = SOLID_BSP;
pev->movetype = MOVETYPE_PUSH; pev->movetype = MOVETYPE_PUSH;
UTIL_SetOrigin(pev, pev->origin); // set size and link into world UTIL_SetOrigin( pev, pev->origin ); // set size and link into world
UTIL_SetSize(pev, pev->mins, pev->maxs); UTIL_SetSize( pev, pev->mins, pev->maxs );
SET_MODEL(ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_iJuice = gSkillData.suitchargerCapacity; m_iJuice = gSkillData.suitchargerCapacity;
pev->frame = 0; pev->frame = 0;
} }
void CRecharge::Precache() void CRecharge::Precache()
{ {
PRECACHE_SOUND("items/suitcharge1.wav"); PRECACHE_SOUND( "items/suitcharge1.wav" );
PRECACHE_SOUND("items/suitchargeno1.wav"); PRECACHE_SOUND( "items/suitchargeno1.wav" );
PRECACHE_SOUND("items/suitchargeok1.wav"); PRECACHE_SOUND( "items/suitchargeok1.wav" );
} }
void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
// if it's not a player, ignore // if it's not a player, ignore
if (!FClassnameIs(pActivator->pev, "player")) if( !FClassnameIs( pActivator->pev, "player" ) )
return; return;
// if there is no juice left, turn it off // if there is no juice left, turn it off
if (m_iJuice <= 0) if( m_iJuice <= 0 )
{ {
pev->frame = 1; pev->frame = 1;
Off(); Off();
} }
// if the player doesn't have the suit, or there is no juice left, make the deny noise // if the player doesn't have the suit, or there is no juice left, make the deny noise
if ((m_iJuice <= 0) || (!(pActivator->pev->weapons & (1<<WEAPON_SUIT)))) if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) )
{ {
if (m_flSoundTime <= gpGlobals->time) if( m_flSoundTime <= gpGlobals->time )
{ {
m_flSoundTime = gpGlobals->time + 0.62; m_flSoundTime = gpGlobals->time + 0.62;
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/suitchargeno1.wav", 0.85, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/suitchargeno1.wav", 0.85, ATTN_NORM );
} }
return; return;
} }
pev->nextthink = pev->ltime + 0.25; pev->nextthink = pev->ltime + 0.25;
SetThink( &CRecharge::Off); SetThink( &CRecharge::Off );
// Time to recharge yet? // Time to recharge yet?
if( m_flNextCharge >= gpGlobals->time )
if (m_flNextCharge >= gpGlobals->time)
return; return;
// Make sure that we have a caller // Make sure that we have a caller
if (!pActivator) if( !pActivator )
return; return;
m_hActivator = pActivator; m_hActivator = pActivator;
//only recharge the player //only recharge the player
if( !m_hActivator->IsPlayer() )
if (!m_hActivator->IsPlayer() )
return; return;
// Play the on sound or the looping charging sound // Play the on sound or the looping charging sound
if (!m_iOn) if( !m_iOn )
{ {
m_iOn++; m_iOn++;
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM );
m_flSoundTime = 0.56 + gpGlobals->time; m_flSoundTime = 0.56 + gpGlobals->time;
} }
if ((m_iOn == 1) && (m_flSoundTime <= gpGlobals->time)) if( ( m_iOn == 1 ) && ( m_flSoundTime <= gpGlobals->time ) )
{ {
m_iOn++; m_iOn++;
EMIT_SOUND(ENT(pev), CHAN_STATIC, "items/suitcharge1.wav", 0.85, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_STATIC, "items/suitcharge1.wav", 0.85, ATTN_NORM );
} }
// charge the player // charge the player
if (m_hActivator->pev->armorvalue < 100) if( m_hActivator->pev->armorvalue < 100 )
{ {
m_iJuice--; m_iJuice--;
m_hActivator->pev->armorvalue += 1; m_hActivator->pev->armorvalue += 1;
if (m_hActivator->pev->armorvalue > 100) if( m_hActivator->pev->armorvalue > 100 )
m_hActivator->pev->armorvalue = 100; m_hActivator->pev->armorvalue = 100;
} }
@ -172,25 +170,25 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
m_flNextCharge = gpGlobals->time + 0.1; m_flNextCharge = gpGlobals->time + 0.1;
} }
void CRecharge::Recharge(void) void CRecharge::Recharge( void )
{ {
m_iJuice = gSkillData.suitchargerCapacity; m_iJuice = gSkillData.suitchargerCapacity;
pev->frame = 0; pev->frame = 0;
SetThink( &CBaseEntity::SUB_DoNothing ); SetThink( &CBaseEntity::SUB_DoNothing );
} }
void CRecharge::Off(void) void CRecharge::Off( void )
{ {
// Stop looping sound. // Stop looping sound.
if (m_iOn > 1) if( m_iOn > 1 )
STOP_SOUND( ENT(pev), CHAN_STATIC, "items/suitcharge1.wav" ); STOP_SOUND( ENT( pev ), CHAN_STATIC, "items/suitcharge1.wav" );
m_iOn = 0; m_iOn = 0;
if ((!m_iJuice) && ( ( m_iReactivate = g_pGameRules->FlHEVChargerRechargeTime() ) > 0) ) if( ( !m_iJuice ) && ( ( m_iReactivate = g_pGameRules->FlHEVChargerRechargeTime() ) > 0 ) )
{ {
pev->nextthink = pev->ltime + m_iReactivate; pev->nextthink = pev->ltime + m_iReactivate;
SetThink( &CRecharge::Recharge); SetThink( &CRecharge::Recharge );
} }
else else
SetThink( &CBaseEntity::SUB_DoNothing ); SetThink( &CBaseEntity::SUB_DoNothing );

View File

@ -35,7 +35,7 @@ class CCycler : public CBaseMonster
{ {
public: public:
void GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax); void GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax);
virtual int ObjectCaps( void ) { return (CBaseEntity :: ObjectCaps() | FCAP_IMPULSE_USE); } virtual int ObjectCaps( void ) { return ( CBaseEntity::ObjectCaps() | FCAP_IMPULSE_USE ); }
int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType );
void Spawn( void ); void Spawn( void );
void Think( void ); void Think( void );
@ -45,14 +45,14 @@ public:
// Don't treat as a live target // Don't treat as a live target
virtual BOOL IsAlive( void ) { return FALSE; } virtual BOOL IsAlive( void ) { return FALSE; }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int m_animate; int m_animate;
}; };
TYPEDESCRIPTION CCycler::m_SaveData[] = TYPEDESCRIPTION CCycler::m_SaveData[] =
{ {
DEFINE_FIELD( CCycler, m_animate, FIELD_INTEGER ), DEFINE_FIELD( CCycler, m_animate, FIELD_INTEGER ),
}; };
@ -65,7 +65,10 @@ IMPLEMENT_SAVERESTORE( CCycler, CBaseMonster )
class CGenericCycler : public CCycler class CGenericCycler : public CCycler
{ {
public: public:
void Spawn( void ) { GenericCyclerSpawn( (char *)STRING(pev->model), Vector(-16, -16, 0), Vector(16, 16, 72) ); } void Spawn( void )
{
GenericCyclerSpawn( (char *)STRING( pev->model ), Vector( -16, -16, 0 ), Vector( 16, 16, 72 ) );
}
}; };
LINK_ENTITY_TO_CLASS( cycler, CGenericCycler ) LINK_ENTITY_TO_CLASS( cycler, CGenericCycler )
@ -82,52 +85,51 @@ public:
LINK_ENTITY_TO_CLASS( cycler_prdroid, CCyclerProbe ) LINK_ENTITY_TO_CLASS( cycler_prdroid, CCyclerProbe )
void CCyclerProbe :: Spawn( void ) void CCyclerProbe::Spawn( void )
{ {
pev->origin = pev->origin + Vector ( 0, 0, 16 ); pev->origin = pev->origin + Vector( 0, 0, 16 );
GenericCyclerSpawn( "models/prdroid.mdl", Vector(-16,-16,-16), Vector(16,16,16)); GenericCyclerSpawn( "models/prdroid.mdl", Vector( -16, -16, -16 ), Vector( 16, 16, 16 ) );
} }
// Cycler member functions // Cycler member functions
void CCycler::GenericCyclerSpawn( char *szModel, Vector vecMin, Vector vecMax )
void CCycler :: GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax)
{ {
if (!szModel || !*szModel) if( !szModel || !*szModel )
{ {
ALERT(at_error, "cycler at %.0f %.0f %0.f missing modelname", pev->origin.x, pev->origin.y, pev->origin.z ); ALERT( at_error, "cycler at %.0f %.0f %0.f missing modelname", pev->origin.x, pev->origin.y, pev->origin.z );
REMOVE_ENTITY(ENT(pev)); REMOVE_ENTITY( ENT( pev ) );
return; return;
} }
pev->classname = MAKE_STRING("cycler"); pev->classname = MAKE_STRING( "cycler" );
PRECACHE_MODEL( szModel ); PRECACHE_MODEL( szModel );
SET_MODEL(ENT(pev), szModel); SET_MODEL( ENT( pev ), szModel );
CCycler::Spawn( ); CCycler::Spawn();
UTIL_SetSize(pev, vecMin, vecMax); UTIL_SetSize( pev, vecMin, vecMax );
} }
void CCycler :: Spawn( ) void CCycler::Spawn()
{ {
InitBoneControllers(); InitBoneControllers();
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
pev->effects = 0; pev->effects = 0;
pev->health = 80000;// no cycler should die pev->health = 80000;// no cycler should die
pev->yaw_speed = 5; pev->yaw_speed = 5;
pev->ideal_yaw = pev->angles.y; pev->ideal_yaw = pev->angles.y;
ChangeYaw( 360 ); ChangeYaw( 360 );
m_flFrameRate = 75; m_flFrameRate = 75;
m_flGroundSpeed = 0; m_flGroundSpeed = 0;
pev->nextthink += 1.0; pev->nextthink += 1.0;
ResetSequenceInfo( ); ResetSequenceInfo();
if (pev->sequence != 0 || pev->frame != 0) if( pev->sequence != 0 || pev->frame != 0 )
{ {
m_animate = 0; m_animate = 0;
pev->framerate = 0; pev->framerate = 0;
@ -141,15 +143,15 @@ void CCycler :: Spawn( )
// //
// cycler think // cycler think
// //
void CCycler :: Think( void ) void CCycler::Think( void )
{ {
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (m_animate) if( m_animate )
{ {
StudioFrameAdvance ( ); StudioFrameAdvance();
} }
if (m_fSequenceFinished && !m_fSequenceLoops) if( m_fSequenceFinished && !m_fSequenceLoops )
{ {
// ResetSequenceInfo(); // ResetSequenceInfo();
// hack to avoid reloading model every frame // hack to avoid reloading model every frame
@ -158,7 +160,7 @@ void CCycler :: Think( void )
m_fSequenceFinished = FALSE; m_fSequenceFinished = FALSE;
m_flLastEventCheck = gpGlobals->time; m_flLastEventCheck = gpGlobals->time;
pev->frame = 0; pev->frame = 0;
if (!m_animate) if( !m_animate )
pev->framerate = 0.0; // FIX: don't reset framerate pev->framerate = 0.0; // FIX: don't reset framerate
} }
} }
@ -166,10 +168,10 @@ void CCycler :: Think( void )
// //
// CyclerUse - starts a rotation trend // CyclerUse - starts a rotation trend
// //
void CCycler :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CCycler::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
m_animate = !m_animate; m_animate = !m_animate;
if (m_animate) if( m_animate )
pev->framerate = 1.0; pev->framerate = 1.0;
else else
pev->framerate = 0.0; pev->framerate = 0.0;
@ -178,26 +180,26 @@ void CCycler :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us
// //
// CyclerPain , changes sequences when shot // CyclerPain , changes sequences when shot
// //
//void CCycler :: Pain( float flDamage ) //void CCycler::Pain( float flDamage )
int CCycler :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ) int CCycler::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
if (m_animate) if( m_animate )
{ {
pev->sequence++; pev->sequence++;
ResetSequenceInfo( ); ResetSequenceInfo();
if (m_flFrameRate == 0.0) if( m_flFrameRate == 0.0 )
{ {
pev->sequence = 0; pev->sequence = 0;
ResetSequenceInfo( ); ResetSequenceInfo();
} }
pev->frame = 0; pev->frame = 0;
} }
else else
{ {
pev->framerate = 1.0; pev->framerate = 1.0;
StudioFrameAdvance ( 0.1 ); StudioFrameAdvance( 0.1 );
pev->framerate = 0; pev->framerate = 0;
ALERT( at_console, "sequence: %d, frame %.0f\n", pev->sequence, pev->frame ); ALERT( at_console, "sequence: %d, frame %.0f\n", pev->sequence, pev->frame );
} }
@ -212,23 +214,27 @@ public:
void Spawn( void ); void Spawn( void );
void Think( void ); void Think( void );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int ObjectCaps( void ) { return (CBaseEntity :: ObjectCaps() | FCAP_DONT_SAVE | FCAP_IMPULSE_USE); } virtual int ObjectCaps( void ) { return ( CBaseEntity :: ObjectCaps() | FCAP_DONT_SAVE | FCAP_IMPULSE_USE ); }
virtual int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); virtual int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
void Animate( float frames ); void Animate( float frames );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
inline int ShouldAnimate( void ) { return m_animate && m_maxFrame > 1.0; } inline int ShouldAnimate( void )
int m_animate; {
float m_lastTime; return m_animate && m_maxFrame > 1.0;
float m_maxFrame; }
int m_animate;
float m_lastTime;
float m_maxFrame;
}; };
LINK_ENTITY_TO_CLASS( cycler_sprite, CCyclerSprite ) LINK_ENTITY_TO_CLASS( cycler_sprite, CCyclerSprite )
TYPEDESCRIPTION CCyclerSprite::m_SaveData[] = TYPEDESCRIPTION CCyclerSprite::m_SaveData[] =
{ {
DEFINE_FIELD( CCyclerSprite, m_animate, FIELD_INTEGER ), DEFINE_FIELD( CCyclerSprite, m_animate, FIELD_INTEGER ),
DEFINE_FIELD( CCyclerSprite, m_lastTime, FIELD_TIME ), DEFINE_FIELD( CCyclerSprite, m_lastTime, FIELD_TIME ),
@ -239,40 +245,40 @@ IMPLEMENT_SAVERESTORE( CCyclerSprite, CBaseEntity )
void CCyclerSprite::Spawn( void ) void CCyclerSprite::Spawn( void )
{ {
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
pev->effects = 0; pev->effects = 0;
pev->frame = 0; pev->frame = 0;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
m_animate = 1; m_animate = 1;
m_lastTime = gpGlobals->time; m_lastTime = gpGlobals->time;
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_maxFrame = (float) MODEL_FRAMES( pev->modelindex ) - 1; m_maxFrame = (float)MODEL_FRAMES( pev->modelindex ) - 1;
} }
void CCyclerSprite::Think( void ) void CCyclerSprite::Think( void )
{ {
if ( ShouldAnimate() ) if( ShouldAnimate() )
Animate( pev->framerate * (gpGlobals->time - m_lastTime) ); Animate( pev->framerate * ( gpGlobals->time - m_lastTime ) );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
m_lastTime = gpGlobals->time; m_lastTime = gpGlobals->time;
} }
void CCyclerSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CCyclerSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
m_animate = !m_animate; m_animate = !m_animate;
ALERT( at_console, "Sprite: %s\n", STRING(pev->model) ); ALERT( at_console, "Sprite: %s\n", STRING( pev->model ) );
} }
int CCyclerSprite::TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ) int CCyclerSprite::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
if ( m_maxFrame > 1.0 ) if( m_maxFrame > 1.0 )
{ {
Animate( 1.0 ); Animate( 1.0 );
} }
@ -282,7 +288,7 @@ int CCyclerSprite::TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker,
void CCyclerSprite::Animate( float frames ) void CCyclerSprite::Animate( float frames )
{ {
pev->frame += frames; pev->frame += frames;
if ( m_maxFrame > 0 ) if( m_maxFrame > 0 )
pev->frame = fmod( pev->frame, m_maxFrame ); pev->frame = fmod( pev->frame, m_maxFrame );
} }
@ -303,22 +309,22 @@ public:
LINK_ENTITY_TO_CLASS( cycler_weapon, CWeaponCycler ) LINK_ENTITY_TO_CLASS( cycler_weapon, CWeaponCycler )
void CWeaponCycler::Spawn( ) void CWeaponCycler::Spawn()
{ {
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_iszModel = pev->model; m_iszModel = pev->model;
m_iModel = pev->modelindex; m_iModel = pev->modelindex;
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); UTIL_SetSize( pev, Vector( -16, -16, 0 ), Vector( 16, 16, 16 ) );
SetTouch( &CBasePlayerItem::DefaultTouch ); SetTouch( &CBasePlayerItem::DefaultTouch );
} }
BOOL CWeaponCycler::Deploy( ) BOOL CWeaponCycler::Deploy()
{ {
m_pPlayer->pev->viewmodel = m_iszModel; m_pPlayer->pev->viewmodel = m_iszModel;
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
@ -334,7 +340,6 @@ void CWeaponCycler::Holster( int skiplocal /* = 0 */ )
void CWeaponCycler::PrimaryAttack() void CWeaponCycler::PrimaryAttack()
{ {
SendWeaponAnim( pev->sequence ); SendWeaponAnim( pev->sequence );
m_flNextPrimaryAttack = gpGlobals->time + 0.3; m_flNextPrimaryAttack = gpGlobals->time + 0.3;
@ -344,14 +349,14 @@ void CWeaponCycler::SecondaryAttack( void )
{ {
float flFrameRate, flGroundSpeed; float flFrameRate, flGroundSpeed;
pev->sequence = (pev->sequence + 1) % 8; pev->sequence = ( pev->sequence + 1 ) % 8;
pev->modelindex = m_iModel; pev->modelindex = m_iModel;
void *pmodel = GET_MODEL_PTR( ENT(pev) ); void *pmodel = GET_MODEL_PTR( ENT( pev ) );
GetSequenceInfo( pmodel, pev, &flFrameRate, &flGroundSpeed ); GetSequenceInfo( pmodel, pev, &flFrameRate, &flGroundSpeed );
pev->modelindex = 0; pev->modelindex = 0;
if (flFrameRate == 0.0) if( flFrameRate == 0.0 )
{ {
pev->sequence = 0; pev->sequence = 0;
} }
@ -364,9 +369,9 @@ void CWeaponCycler::SecondaryAttack( void )
// Flaming Wreakage // Flaming Wreakage
class CWreckage : public CBaseMonster class CWreckage : public CBaseMonster
{ {
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
@ -375,7 +380,7 @@ class CWreckage : public CBaseMonster
int m_flStartTime; int m_flStartTime;
}; };
TYPEDESCRIPTION CWreckage::m_SaveData[] = TYPEDESCRIPTION CWreckage::m_SaveData[] =
{ {
DEFINE_FIELD( CWreckage, m_flStartTime, FIELD_TIME ), DEFINE_FIELD( CWreckage, m_flStartTime, FIELD_TIME ),
}; };
@ -386,50 +391,50 @@ LINK_ENTITY_TO_CLASS( cycler_wreckage, CWreckage )
void CWreckage::Spawn( void ) void CWreckage::Spawn( void )
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->takedamage = 0; pev->takedamage = 0;
pev->effects = 0; pev->effects = 0;
pev->frame = 0; pev->frame = 0;
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (pev->model) if( pev->model )
{ {
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
SET_MODEL( ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
} }
// pev->scale = 5.0; // pev->scale = 5.0;
m_flStartTime = gpGlobals->time; m_flStartTime = gpGlobals->time;
} }
void CWreckage::Precache( ) void CWreckage::Precache()
{ {
if ( pev->model ) if( pev->model )
PRECACHE_MODEL( (char *)STRING(pev->model) ); PRECACHE_MODEL( (char *)STRING( pev->model ) );
} }
void CWreckage::Think( void ) void CWreckage::Think( void )
{ {
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
if (pev->dmgtime) if( pev->dmgtime )
{ {
if (pev->dmgtime < gpGlobals->time) if( pev->dmgtime < gpGlobals->time )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
else if (RANDOM_FLOAT( 0, pev->dmgtime - m_flStartTime ) > pev->dmgtime - gpGlobals->time) else if( RANDOM_FLOAT( 0, pev->dmgtime - m_flStartTime ) > pev->dmgtime - gpGlobals->time )
{ {
return; return;
} }
} }
Vector VecSrc; Vector VecSrc;
VecSrc.x = RANDOM_FLOAT( pev->absmin.x, pev->absmax.x ); VecSrc.x = RANDOM_FLOAT( pev->absmin.x, pev->absmax.x );
VecSrc.y = RANDOM_FLOAT( pev->absmin.y, pev->absmax.y ); VecSrc.y = RANDOM_FLOAT( pev->absmin.y, pev->absmax.y );
VecSrc.z = RANDOM_FLOAT( pev->absmin.z, pev->absmax.z ); VecSrc.z = RANDOM_FLOAT( pev->absmin.z, pev->absmax.z );
@ -440,7 +445,7 @@ void CWreckage::Think( void )
WRITE_COORD( VecSrc.y ); WRITE_COORD( VecSrc.y );
WRITE_COORD( VecSrc.z ); WRITE_COORD( VecSrc.z );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( RANDOM_LONG(0,49) + 50 ); // scale * 10 WRITE_BYTE( RANDOM_LONG( 0,49 ) + 50 ); // scale * 10
WRITE_BYTE( RANDOM_LONG(0, 3) + 8 ); // framerate WRITE_BYTE( RANDOM_LONG( 0, 3 ) + 8 ); // framerate
MESSAGE_END(); MESSAGE_END();
} }

View File

@ -27,23 +27,20 @@
// Holds engine functionality callbacks // Holds engine functionality callbacks
enginefuncs_t g_engfuncs; enginefuncs_t g_engfuncs;
globalvars_t *gpGlobals; globalvars_t *gpGlobals;
server_physics_api_t g_physfuncs; server_physics_api_t g_physfuncs;
#ifdef _WIN32 #ifdef _WIN32
// Required DLL entry point // Required DLL entry point
BOOL WINAPI DllMain( BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved)
{ {
if (fdwReason == DLL_PROCESS_ATTACH) if( fdwReason == DLL_PROCESS_ATTACH )
{ {
} }
else if (fdwReason == DLL_PROCESS_DETACH) else if( fdwReason == DLL_PROCESS_DETACH )
{ {
} }
return TRUE; return TRUE;
} }
@ -53,8 +50,8 @@ BOOL WINAPI DllMain(
#define EXPORT2 #define EXPORT2
#endif #endif
extern "C" void DLLEXPORT EXPORT2 GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) extern "C" void DLLEXPORT EXPORT2 GiveFnptrsToDll( enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals )
{ {
memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t)); memcpy( &g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t) );
gpGlobals = pGlobals; gpGlobals = pGlobals;
} }

View File

@ -23,7 +23,8 @@
#define HANDGRENADE_PRIMARY_VOLUME 450 #define HANDGRENADE_PRIMARY_VOLUME 450
enum handgrenade_e { enum handgrenade_e
{
HANDGRENADE_IDLE = 0, HANDGRENADE_IDLE = 0,
HANDGRENADE_FIDGET, HANDGRENADE_FIDGET,
HANDGRENADE_PINPULL, HANDGRENADE_PINPULL,
@ -36,11 +37,11 @@ enum handgrenade_e {
LINK_ENTITY_TO_CLASS( weapon_handgrenade, CHandGrenade ) LINK_ENTITY_TO_CLASS( weapon_handgrenade, CHandGrenade )
void CHandGrenade::Spawn( ) void CHandGrenade::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_HANDGRENADE; m_iId = WEAPON_HANDGRENADE;
SET_MODEL(ENT(pev), "models/w_grenade.mdl"); SET_MODEL( ENT( pev ), "models/w_grenade.mdl" );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
pev->dmg = gSkillData.plrDmgHandGrenade; pev->dmg = gSkillData.plrDmgHandGrenade;
@ -52,14 +53,14 @@ void CHandGrenade::Spawn( )
void CHandGrenade::Precache( void ) void CHandGrenade::Precache( void )
{ {
PRECACHE_MODEL("models/w_grenade.mdl"); PRECACHE_MODEL( "models/w_grenade.mdl" );
PRECACHE_MODEL("models/v_grenade.mdl"); PRECACHE_MODEL( "models/v_grenade.mdl" );
PRECACHE_MODEL("models/p_grenade.mdl"); PRECACHE_MODEL( "models/p_grenade.mdl" );
} }
int CHandGrenade::GetItemInfo(ItemInfo *p) int CHandGrenade::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Hand Grenade"; p->pszAmmo1 = "Hand Grenade";
p->iMaxAmmo1 = HANDGRENADE_MAX_CARRY; p->iMaxAmmo1 = HANDGRENADE_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -74,7 +75,7 @@ int CHandGrenade::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CHandGrenade::Deploy( ) BOOL CHandGrenade::Deploy()
{ {
m_flReleaseThrow = -1; m_flReleaseThrow = -1;
return DefaultDeploy( "models/v_grenade.mdl", "models/p_grenade.mdl", HANDGRENADE_DRAW, "crowbar" ); return DefaultDeploy( "models/v_grenade.mdl", "models/p_grenade.mdl", HANDGRENADE_DRAW, "crowbar" );
@ -90,24 +91,24 @@ void CHandGrenade::Holster( int skiplocal /* = 0 */ )
{ {
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
if ( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
SendWeaponAnim( HANDGRENADE_HOLSTER ); SendWeaponAnim( HANDGRENADE_HOLSTER );
} }
else else
{ {
// no more grenades! // no more grenades!
m_pPlayer->pev->weapons &= ~(1<<WEAPON_HANDGRENADE); m_pPlayer->pev->weapons &= ~( 1 << WEAPON_HANDGRENADE );
SetThink( &CBasePlayerItem::DestroyItem ); SetThink( &CBasePlayerItem::DestroyItem );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
} }
void CHandGrenade::PrimaryAttack() void CHandGrenade::PrimaryAttack()
{ {
if ( !m_flStartThrow && m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] > 0 ) if( !m_flStartThrow && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0 )
{ {
m_flStartThrow = gpGlobals->time; m_flStartThrow = gpGlobals->time;
m_flReleaseThrow = 0; m_flReleaseThrow = 0;
@ -119,23 +120,23 @@ void CHandGrenade::PrimaryAttack()
void CHandGrenade::WeaponIdle( void ) void CHandGrenade::WeaponIdle( void )
{ {
if ( m_flReleaseThrow == 0 && m_flStartThrow ) if( m_flReleaseThrow == 0 && m_flStartThrow )
m_flReleaseThrow = gpGlobals->time; m_flReleaseThrow = gpGlobals->time;
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
if ( m_flStartThrow ) if( m_flStartThrow )
{ {
Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
if ( angThrow.x < 0 ) if( angThrow.x < 0 )
angThrow.x = -10 + angThrow.x * ( ( 90 - 10 ) / 90.0 ); angThrow.x = -10 + angThrow.x * ( ( 90 - 10 ) / 90.0 );
else else
angThrow.x = -10 + angThrow.x * ( ( 90 + 10 ) / 90.0 ); angThrow.x = -10 + angThrow.x * ( ( 90 + 10 ) / 90.0 );
float flVel = ( 90 - angThrow.x ) * 4; float flVel = ( 90 - angThrow.x ) * 4;
if ( flVel > 500 ) if( flVel > 500 )
flVel = 500; flVel = 500;
UTIL_MakeVectors( angThrow ); UTIL_MakeVectors( angThrow );
@ -146,16 +147,16 @@ void CHandGrenade::WeaponIdle( void )
// alway explode 3 seconds after the pin was pulled // alway explode 3 seconds after the pin was pulled
float time = m_flStartThrow - gpGlobals->time + 3.0; float time = m_flStartThrow - gpGlobals->time + 3.0;
if (time < 0) if( time < 0 )
time = 0; time = 0;
CGrenade::ShootTimed( m_pPlayer->pev, vecSrc, vecThrow, time ); CGrenade::ShootTimed( m_pPlayer->pev, vecSrc, vecThrow, time );
if ( flVel < 500 ) if( flVel < 500 )
{ {
SendWeaponAnim( HANDGRENADE_THROW1 ); SendWeaponAnim( HANDGRENADE_THROW1 );
} }
else if ( flVel < 1000 ) else if( flVel < 1000 )
{ {
SendWeaponAnim( HANDGRENADE_THROW2 ); SendWeaponAnim( HANDGRENADE_THROW2 );
} }
@ -172,9 +173,9 @@ void CHandGrenade::WeaponIdle( void )
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ]--; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
if ( !m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
// just threw last grenade // just threw last grenade
// set attack times in the future, and weapon idle in the future so we can see the whole throw // set attack times in the future, and weapon idle in the future so we can see the whole throw
@ -183,12 +184,12 @@ void CHandGrenade::WeaponIdle( void )
} }
return; return;
} }
else if ( m_flReleaseThrow > 0 ) else if( m_flReleaseThrow > 0 )
{ {
// we've finished the throw, restart. // we've finished the throw, restart.
m_flStartThrow = 0; m_flStartThrow = 0;
if ( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
SendWeaponAnim( HANDGRENADE_DRAW ); SendWeaponAnim( HANDGRENADE_DRAW );
} }
@ -203,16 +204,16 @@ void CHandGrenade::WeaponIdle( void )
return; return;
} }
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.75) if( flRand <= 0.75 )
{ {
iAnim = HANDGRENADE_IDLE; iAnim = HANDGRENADE_IDLE;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );// how long till we do this again. m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );// how long till we do this again.
} }
else else
{ {
iAnim = HANDGRENADE_FIDGET; iAnim = HANDGRENADE_FIDGET;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 75.0 / 30.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 75.0 / 30.0;

File diff suppressed because it is too large Load Diff

View File

@ -28,42 +28,42 @@
//========================================================= //=========================================================
#define HC_AE_JUMPATTACK ( 2 ) #define HC_AE_JUMPATTACK ( 2 )
Task_t tlHCRangeAttack1[] = Task_t tlHCRangeAttack1[] =
{ {
{ TASK_STOP_MOVING, (float)0 }, { TASK_STOP_MOVING, (float)0 },
{ TASK_FACE_IDEAL, (float)0 }, { TASK_FACE_IDEAL, (float)0 },
{ TASK_RANGE_ATTACK1, (float)0 }, { TASK_RANGE_ATTACK1, (float)0 },
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, { TASK_SET_ACTIVITY, (float)ACT_IDLE },
{ TASK_FACE_IDEAL, (float)0 }, { TASK_FACE_IDEAL, (float)0 },
{ TASK_WAIT_RANDOM, (float)0.5 }, { TASK_WAIT_RANDOM, (float)0.5 },
}; };
Schedule_t slHCRangeAttack1[] = Schedule_t slHCRangeAttack1[] =
{ {
{ {
tlHCRangeAttack1, tlHCRangeAttack1,
ARRAYSIZE ( tlHCRangeAttack1 ), ARRAYSIZE( tlHCRangeAttack1 ),
bits_COND_ENEMY_OCCLUDED | bits_COND_ENEMY_OCCLUDED |
bits_COND_NO_AMMO_LOADED, bits_COND_NO_AMMO_LOADED,
0, 0,
"HCRangeAttack1" "HCRangeAttack1"
}, },
}; };
Task_t tlHCRangeAttack1Fast[] = Task_t tlHCRangeAttack1Fast[] =
{ {
{ TASK_STOP_MOVING, (float)0 }, { TASK_STOP_MOVING, (float)0 },
{ TASK_FACE_IDEAL, (float)0 }, { TASK_FACE_IDEAL, (float)0 },
{ TASK_RANGE_ATTACK1, (float)0 }, { TASK_RANGE_ATTACK1, (float)0 },
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, { TASK_SET_ACTIVITY, (float)ACT_IDLE },
}; };
Schedule_t slHCRangeAttack1Fast[] = Schedule_t slHCRangeAttack1Fast[] =
{ {
{ {
tlHCRangeAttack1Fast, tlHCRangeAttack1Fast,
ARRAYSIZE ( tlHCRangeAttack1Fast ), ARRAYSIZE( tlHCRangeAttack1Fast ),
bits_COND_ENEMY_OCCLUDED | bits_COND_ENEMY_OCCLUDED |
bits_COND_NO_AMMO_LOADED, bits_COND_NO_AMMO_LOADED,
0, 0,
"HCRAFast" "HCRAFast"
@ -136,20 +136,20 @@ const char *CHeadCrab::pPainSounds[] =
"headcrab/hc_pain3.wav", "headcrab/hc_pain3.wav",
}; };
const char *CHeadCrab::pAttackSounds[] = const char *CHeadCrab::pAttackSounds[] =
{ {
"headcrab/hc_attack1.wav", "headcrab/hc_attack1.wav",
"headcrab/hc_attack2.wav", "headcrab/hc_attack2.wav",
"headcrab/hc_attack3.wav", "headcrab/hc_attack3.wav",
}; };
const char *CHeadCrab::pDeathSounds[] = const char *CHeadCrab::pDeathSounds[] =
{ {
"headcrab/hc_die1.wav", "headcrab/hc_die1.wav",
"headcrab/hc_die2.wav", "headcrab/hc_die2.wav",
}; };
const char *CHeadCrab::pBiteSounds[] = const char *CHeadCrab::pBiteSounds[] =
{ {
"headcrab/hc_headbite.wav", "headcrab/hc_headbite.wav",
}; };
@ -158,9 +158,9 @@ const char *CHeadCrab::pBiteSounds[] =
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CHeadCrab :: Classify ( void ) int CHeadCrab::Classify( void )
{ {
return CLASS_ALIEN_PREY; return CLASS_ALIEN_PREY;
} }
//========================================================= //=========================================================
@ -168,38 +168,38 @@ int CHeadCrab :: Classify ( void )
// bounding box is much larger than the actual creature so // bounding box is much larger than the actual creature so
// this is needed for targeting // this is needed for targeting
//========================================================= //=========================================================
Vector CHeadCrab :: Center ( void ) Vector CHeadCrab::Center( void )
{ {
return Vector( pev->origin.x, pev->origin.y, pev->origin.z + 6 ); return Vector( pev->origin.x, pev->origin.y, pev->origin.z + 6 );
} }
Vector CHeadCrab :: BodyTarget( const Vector &posSrc ) Vector CHeadCrab::BodyTarget( const Vector &posSrc )
{ {
return Center( ); return Center();
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CHeadCrab :: SetYawSpeed ( void ) void CHeadCrab::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_IDLE: case ACT_IDLE:
ys = 30; ys = 30;
break; break;
case ACT_RUN: case ACT_RUN:
case ACT_WALK: case ACT_WALK:
ys = 20; ys = 20;
break; break;
case ACT_TURN_LEFT: case ACT_TURN_LEFT:
case ACT_TURN_RIGHT: case ACT_TURN_RIGHT:
ys = 60; ys = 60;
break; break;
case ACT_RANGE_ATTACK1: case ACT_RANGE_ATTACK1:
ys = 30; ys = 30;
break; break;
default: default:
@ -214,7 +214,7 @@ void CHeadCrab :: SetYawSpeed ( void )
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
//========================================================= //=========================================================
void CHeadCrab :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CHeadCrab::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
switch( pEvent->event ) switch( pEvent->event )
{ {
@ -222,25 +222,25 @@ void CHeadCrab :: HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
ClearBits( pev->flags, FL_ONGROUND ); ClearBits( pev->flags, FL_ONGROUND );
UTIL_SetOrigin (pev, pev->origin + Vector ( 0 , 0 , 1) );// take him off ground so engine doesn't instantly reset onground UTIL_SetOrigin( pev, pev->origin + Vector( 0, 0, 1 ) );// take him off ground so engine doesn't instantly reset onground
UTIL_MakeVectors ( pev->angles ); UTIL_MakeVectors( pev->angles );
Vector vecJumpDir; Vector vecJumpDir;
if (m_hEnemy != NULL) if( m_hEnemy != NULL )
{ {
float gravity = g_psv_gravity->value; float gravity = g_psv_gravity->value;
if (gravity <= 1) if( gravity <= 1 )
gravity = 1; gravity = 1;
// How fast does the headcrab need to travel to reach that height given gravity? // How fast does the headcrab need to travel to reach that height given gravity?
float height = (m_hEnemy->pev->origin.z + m_hEnemy->pev->view_ofs.z - pev->origin.z); float height = m_hEnemy->pev->origin.z + m_hEnemy->pev->view_ofs.z - pev->origin.z;
if (height < 16) if( height < 16 )
height = 16; height = 16;
float speed = sqrt( 2 * gravity * height ); float speed = sqrt( 2 * gravity * height );
float time = speed / gravity; float time = speed / gravity;
// Scale the sideways velocity to get there at the right time // Scale the sideways velocity to get there at the right time
vecJumpDir = (m_hEnemy->pev->origin + m_hEnemy->pev->view_ofs - pev->origin); vecJumpDir = m_hEnemy->pev->origin + m_hEnemy->pev->view_ofs - pev->origin;
vecJumpDir = vecJumpDir * ( 1.0 / time ); vecJumpDir = vecJumpDir * ( 1.0 / time );
// Speed to offset gravity at the desired height // Speed to offset gravity at the desired height
@ -248,8 +248,8 @@ void CHeadCrab :: HandleAnimEvent( MonsterEvent_t *pEvent )
// Don't jump too far/fast // Don't jump too far/fast
float distance = vecJumpDir.Length(); float distance = vecJumpDir.Length();
if (distance > 650) if( distance > 650 )
{ {
vecJumpDir = vecJumpDir * ( 650.0 / distance ); vecJumpDir = vecJumpDir * ( 650.0 / distance );
} }
@ -261,14 +261,13 @@ void CHeadCrab :: HandleAnimEvent( MonsterEvent_t *pEvent )
} }
int iSound = RANDOM_LONG(0,2); int iSound = RANDOM_LONG(0,2);
if ( iSound != 0 ) if( iSound != 0 )
EMIT_SOUND_DYN( edict(), CHAN_VOICE, pAttackSounds[iSound], GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_VOICE, pAttackSounds[iSound], GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
pev->velocity = vecJumpDir; pev->velocity = vecJumpDir;
m_flNextAttack = gpGlobals->time + 2; m_flNextAttack = gpGlobals->time + 2;
} }
break; break;
default: default:
CBaseMonster::HandleAnimEvent( pEvent ); CBaseMonster::HandleAnimEvent( pEvent );
break; break;
@ -278,19 +277,19 @@ void CHeadCrab :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CHeadCrab :: Spawn() void CHeadCrab::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/headcrab.mdl"); SET_MODEL( ENT( pev ), "models/headcrab.mdl" );
UTIL_SetSize(pev, Vector(-12, -12, 0), Vector(12, 12, 24)); UTIL_SetSize( pev, Vector( -12, -12, 0 ), Vector( 12, 12, 24 ) );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_GREEN; m_bloodColor = BLOOD_COLOR_GREEN;
pev->effects = 0; pev->effects = 0;
pev->health = gSkillData.headcrabHealth; pev->health = gSkillData.headcrabHealth;
pev->view_ofs = Vector ( 0, 0, 20 );// position of the eyes relative to monster's origin. pev->view_ofs = Vector( 0, 0, 20 );// position of the eyes relative to monster's origin.
pev->yaw_speed = 5;//!!! should we put this in the monster's changeanim function since turn rates may vary with state/anim? pev->yaw_speed = 5;//!!! should we put this in the monster's changeanim function since turn rates may vary with state/anim?
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
@ -301,29 +300,29 @@ void CHeadCrab :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CHeadCrab :: Precache() void CHeadCrab::Precache()
{ {
PRECACHE_SOUND_ARRAY(pIdleSounds); PRECACHE_SOUND_ARRAY( pIdleSounds );
PRECACHE_SOUND_ARRAY(pAlertSounds); PRECACHE_SOUND_ARRAY( pAlertSounds );
PRECACHE_SOUND_ARRAY(pPainSounds); PRECACHE_SOUND_ARRAY( pPainSounds );
PRECACHE_SOUND_ARRAY(pAttackSounds); PRECACHE_SOUND_ARRAY( pAttackSounds );
PRECACHE_SOUND_ARRAY(pDeathSounds); PRECACHE_SOUND_ARRAY( pDeathSounds );
PRECACHE_SOUND_ARRAY(pBiteSounds); PRECACHE_SOUND_ARRAY( pBiteSounds );
PRECACHE_MODEL("models/headcrab.mdl"); PRECACHE_MODEL( "models/headcrab.mdl" );
} }
//========================================================= //=========================================================
// RunTask // RunTask
//========================================================= //=========================================================
void CHeadCrab :: RunTask ( Task_t *pTask ) void CHeadCrab::RunTask( Task_t *pTask )
{ {
switch ( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_RANGE_ATTACK1: case TASK_RANGE_ATTACK1:
case TASK_RANGE_ATTACK2: case TASK_RANGE_ATTACK2:
{ {
if ( m_fSequenceFinished ) if( m_fSequenceFinished )
{ {
TaskComplete(); TaskComplete();
SetTouch( NULL ); SetTouch( NULL );
@ -333,7 +332,7 @@ void CHeadCrab :: RunTask ( Task_t *pTask )
} }
default: default:
{ {
CBaseMonster :: RunTask(pTask); CBaseMonster::RunTask( pTask );
} }
} }
} }
@ -342,23 +341,23 @@ void CHeadCrab :: RunTask ( Task_t *pTask )
// LeapTouch - this is the headcrab's touch function when it // LeapTouch - this is the headcrab's touch function when it
// is in the air // is in the air
//========================================================= //=========================================================
void CHeadCrab :: LeapTouch ( CBaseEntity *pOther ) void CHeadCrab::LeapTouch( CBaseEntity *pOther )
{ {
if ( !pOther->pev->takedamage ) if( !pOther->pev->takedamage )
{ {
return; return;
} }
if ( pOther->Classify() == Classify() ) if( pOther->Classify() == Classify() )
{ {
return; return;
} }
// Don't hit if back on ground // Don't hit if back on ground
if ( !FBitSet( pev->flags, FL_ONGROUND ) ) if( !FBitSet( pev->flags, FL_ONGROUND ) )
{ {
EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pBiteSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY( pBiteSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
pOther->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH ); pOther->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH );
} }
@ -368,20 +367,20 @@ void CHeadCrab :: LeapTouch ( CBaseEntity *pOther )
//========================================================= //=========================================================
// PrescheduleThink // PrescheduleThink
//========================================================= //=========================================================
void CHeadCrab :: PrescheduleThink ( void ) void CHeadCrab::PrescheduleThink( void )
{ {
// make the crab coo a little bit in combat state // make the crab coo a little bit in combat state
if ( m_MonsterState == MONSTERSTATE_COMBAT && RANDOM_FLOAT( 0, 5 ) < 0.1 ) if( m_MonsterState == MONSTERSTATE_COMBAT && RANDOM_FLOAT( 0, 5 ) < 0.1 )
{ {
IdleSound(); IdleSound();
} }
} }
void CHeadCrab :: StartTask ( Task_t *pTask ) void CHeadCrab::StartTask( Task_t *pTask )
{ {
m_iTaskStatus = TASKSTATUS_RUNNING; m_iTaskStatus = TASKSTATUS_RUNNING;
switch ( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_RANGE_ATTACK1: case TASK_RANGE_ATTACK1:
{ {
@ -392,7 +391,7 @@ void CHeadCrab :: StartTask ( Task_t *pTask )
} }
default: default:
{ {
CBaseMonster :: StartTask( pTask ); CBaseMonster::StartTask( pTask );
} }
} }
} }
@ -400,9 +399,9 @@ void CHeadCrab :: StartTask ( Task_t *pTask )
//========================================================= //=========================================================
// CheckRangeAttack1 // CheckRangeAttack1
//========================================================= //=========================================================
BOOL CHeadCrab :: CheckRangeAttack1 ( float flDot, float flDist ) BOOL CHeadCrab::CheckRangeAttack1( float flDot, float flDist )
{ {
if ( FBitSet( pev->flags, FL_ONGROUND ) && flDist <= 256 && flDot >= 0.65 ) if( FBitSet( pev->flags, FL_ONGROUND ) && flDist <= 256 && flDot >= 0.65 )
{ {
return TRUE; return TRUE;
} }
@ -412,12 +411,12 @@ BOOL CHeadCrab :: CheckRangeAttack1 ( float flDot, float flDist )
//========================================================= //=========================================================
// CheckRangeAttack2 // CheckRangeAttack2
//========================================================= //=========================================================
BOOL CHeadCrab :: CheckRangeAttack2 ( float flDot, float flDist ) BOOL CHeadCrab::CheckRangeAttack2( float flDot, float flDist )
{ {
return FALSE; return FALSE;
// BUGBUG: Why is this code here? There is no ACT_RANGE_ATTACK2 animation. I've disabled it for now. // BUGBUG: Why is this code here? There is no ACT_RANGE_ATTACK2 animation. I've disabled it for now.
#if 0 #if 0
if ( FBitSet( pev->flags, FL_ONGROUND ) && flDist > 64 && flDist <= 256 && flDot >= 0.5 ) if( FBitSet( pev->flags, FL_ONGROUND ) && flDist > 64 && flDist <= 256 && flDot >= 0.5 )
{ {
return TRUE; return TRUE;
} }
@ -425,55 +424,56 @@ BOOL CHeadCrab :: CheckRangeAttack2 ( float flDot, float flDist )
#endif #endif
} }
int CHeadCrab :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) int CHeadCrab::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
// Don't take any acid damage -- BigMomma's mortar is acid // Don't take any acid damage -- BigMomma's mortar is acid
if ( bitsDamageType & DMG_ACID ) if( bitsDamageType & DMG_ACID )
flDamage = 0; flDamage = 0;
return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType ); return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
} }
#define CRAB_ATTN_IDLE (float)1.5
//========================================================= //=========================================================
// IdleSound // IdleSound
//========================================================= //=========================================================
#define CRAB_ATTN_IDLE (float)1.5 void CHeadCrab::IdleSound( void )
void CHeadCrab :: IdleSound ( void )
{ {
EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pIdleSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pIdleSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
} }
//========================================================= //=========================================================
// AlertSound // AlertSound
//========================================================= //=========================================================
void CHeadCrab :: AlertSound ( void ) void CHeadCrab::AlertSound( void )
{ {
EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pAlertSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pAlertSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
} }
//========================================================= //=========================================================
// AlertSound // AlertSound
//========================================================= //=========================================================
void CHeadCrab :: PainSound ( void ) void CHeadCrab::PainSound( void )
{ {
EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pPainSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pPainSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
} }
//========================================================= //=========================================================
// DeathSound // DeathSound
//========================================================= //=========================================================
void CHeadCrab :: DeathSound ( void ) void CHeadCrab::DeathSound( void )
{ {
EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pDeathSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pDeathSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() );
} }
Schedule_t* CHeadCrab :: GetScheduleOfType ( int Type ) Schedule_t *CHeadCrab::GetScheduleOfType( int Type )
{ {
switch ( Type ) switch( Type )
{ {
case SCHED_RANGE_ATTACK1: case SCHED_RANGE_ATTACK1:
{ {
return &slHCRangeAttack1[ 0 ]; return &slHCRangeAttack1[0];
} }
break; break;
} }
@ -486,62 +486,61 @@ class CBabyCrab : public CHeadCrab
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed ( void ); void SetYawSpeed( void );
float GetDamageAmount( void ) { return gSkillData.headcrabDmgBite * 0.3; } float GetDamageAmount( void ) { return gSkillData.headcrabDmgBite * 0.3; }
BOOL CheckRangeAttack1 ( float flDot, float flDist ); BOOL CheckRangeAttack1( float flDot, float flDist );
Schedule_t* GetScheduleOfType ( int Type ); Schedule_t *GetScheduleOfType ( int Type );
virtual int GetVoicePitch( void ) { return PITCH_NORM + RANDOM_LONG(40,50); } virtual int GetVoicePitch( void ) { return PITCH_NORM + RANDOM_LONG( 40, 50 ); }
virtual float GetSoundVolue( void ) { return 0.8; } virtual float GetSoundVolue( void ) { return 0.8; }
}; };
LINK_ENTITY_TO_CLASS( monster_babycrab, CBabyCrab ) LINK_ENTITY_TO_CLASS( monster_babycrab, CBabyCrab )
void CBabyCrab :: Spawn( void ) void CBabyCrab::Spawn( void )
{ {
CHeadCrab::Spawn(); CHeadCrab::Spawn();
SET_MODEL(ENT(pev), "models/baby_headcrab.mdl"); SET_MODEL( ENT( pev ), "models/baby_headcrab.mdl" );
pev->rendermode = kRenderTransTexture; pev->rendermode = kRenderTransTexture;
pev->renderamt = 192; pev->renderamt = 192;
UTIL_SetSize(pev, Vector(-12, -12, 0), Vector(12, 12, 24)); UTIL_SetSize( pev, Vector( -12, -12, 0 ), Vector( 12, 12, 24 ) );
pev->health = gSkillData.headcrabHealth * 0.25; // less health than full grown pev->health = gSkillData.headcrabHealth * 0.25; // less health than full grown
} }
void CBabyCrab :: Precache( void ) void CBabyCrab::Precache( void )
{ {
PRECACHE_MODEL( "models/baby_headcrab.mdl" ); PRECACHE_MODEL( "models/baby_headcrab.mdl" );
CHeadCrab::Precache(); CHeadCrab::Precache();
} }
void CBabyCrab :: SetYawSpeed ( void ) void CBabyCrab::SetYawSpeed( void )
{ {
pev->yaw_speed = 120; pev->yaw_speed = 120;
} }
BOOL CBabyCrab :: CheckRangeAttack1( float flDot, float flDist ) BOOL CBabyCrab::CheckRangeAttack1( float flDot, float flDist )
{ {
if ( pev->flags & FL_ONGROUND ) if( pev->flags & FL_ONGROUND )
{ {
if ( pev->groundentity && (pev->groundentity->v.flags & (FL_CLIENT|FL_MONSTER)) ) if( pev->groundentity && ( pev->groundentity->v.flags & ( FL_CLIENT | FL_MONSTER ) ) )
return TRUE; return TRUE;
// A little less accurate, but jump from closer // A little less accurate, but jump from closer
if ( flDist <= 180 && flDot >= 0.55 ) if( flDist <= 180 && flDot >= 0.55 )
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
Schedule_t* CBabyCrab :: GetScheduleOfType ( int Type ) Schedule_t *CBabyCrab::GetScheduleOfType( int Type )
{ {
switch( Type ) switch( Type )
{ {
case SCHED_FAIL: // If you fail, try to jump! case SCHED_FAIL: // If you fail, try to jump!
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
return slHCRangeAttack1Fast; return slHCRangeAttack1Fast;
break; break;
case SCHED_RANGE_ATTACK1: case SCHED_RANGE_ATTACK1:
{ {
return slHCRangeAttack1Fast; return slHCRangeAttack1Fast;

View File

@ -31,10 +31,9 @@ class CHealthKit : public CItem
void Precache( void ); void Precache( void );
BOOL MyTouch( CBasePlayer *pPlayer ); BOOL MyTouch( CBasePlayer *pPlayer );
/* /*
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static TYPEDESCRIPTION m_SaveData[];
*/ */
}; };
@ -46,46 +45,45 @@ TYPEDESCRIPTION CHealthKit::m_SaveData[] =
}; };
IMPLEMENT_SAVERESTORE( CHealthKit, CItem )
IMPLEMENT_SAVERESTORE( CHealthKit, CItem)
*/ */
void CHealthKit :: Spawn( void ) void CHealthKit::Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_medkit.mdl"); SET_MODEL( ENT( pev ), "models/w_medkit.mdl" );
CItem::Spawn(); CItem::Spawn();
} }
void CHealthKit::Precache( void ) void CHealthKit::Precache( void )
{ {
PRECACHE_MODEL("models/w_medkit.mdl"); PRECACHE_MODEL( "models/w_medkit.mdl" );
PRECACHE_SOUND("items/smallmedkit1.wav"); PRECACHE_SOUND( "items/smallmedkit1.wav" );
} }
BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer ) BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer )
{ {
if ( pPlayer->pev->deadflag != DEAD_NO ) if( pPlayer->pev->deadflag != DEAD_NO )
{ {
return FALSE; return FALSE;
} }
if ( pPlayer->TakeHealth( gSkillData.healthkitCapacity, DMG_GENERIC ) ) if( pPlayer->TakeHealth( gSkillData.healthkitCapacity, DMG_GENERIC ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev );
WRITE_STRING( STRING(pev->classname) ); WRITE_STRING( STRING( pev->classname ) );
MESSAGE_END(); MESSAGE_END();
EMIT_SOUND(ENT(pPlayer->pev), CHAN_ITEM, "items/smallmedkit1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pPlayer->pev ), CHAN_ITEM, "items/smallmedkit1.wav", 1, ATTN_NORM );
if ( g_pGameRules->ItemShouldRespawn( this ) ) if( g_pGameRules->ItemShouldRespawn( this ) )
{ {
Respawn(); Respawn();
} }
else else
{ {
UTIL_Remove(this); UTIL_Remove( this );
} }
return TRUE; return TRUE;
@ -100,51 +98,51 @@ BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer )
class CWallHealth : public CBaseToggle class CWallHealth : public CBaseToggle
{ {
public: public:
void Spawn( ); void Spawn();
void Precache( void ); void Precache( void );
void EXPORT Off(void); void EXPORT Off( void );
void EXPORT Recharge(void); void EXPORT Recharge( void );
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int ObjectCaps( void ) { return (CBaseToggle :: ObjectCaps() | FCAP_CONTINUOUS_USE) & ~FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return ( CBaseToggle::ObjectCaps() | FCAP_CONTINUOUS_USE ) & ~FCAP_ACROSS_TRANSITION; }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
float m_flNextCharge; float m_flNextCharge;
int m_iReactivate ; // DeathMatch Delay until reactvated int m_iReactivate ; // DeathMatch Delay until reactvated
int m_iJuice; int m_iJuice;
int m_iOn; // 0 = off, 1 = startup, 2 = going int m_iOn; // 0 = off, 1 = startup, 2 = going
float m_flSoundTime; float m_flSoundTime;
}; };
TYPEDESCRIPTION CWallHealth::m_SaveData[] = TYPEDESCRIPTION CWallHealth::m_SaveData[] =
{ {
DEFINE_FIELD( CWallHealth, m_flNextCharge, FIELD_TIME), DEFINE_FIELD( CWallHealth, m_flNextCharge, FIELD_TIME ),
DEFINE_FIELD( CWallHealth, m_iReactivate, FIELD_INTEGER), DEFINE_FIELD( CWallHealth, m_iReactivate, FIELD_INTEGER ),
DEFINE_FIELD( CWallHealth, m_iJuice, FIELD_INTEGER), DEFINE_FIELD( CWallHealth, m_iJuice, FIELD_INTEGER ),
DEFINE_FIELD( CWallHealth, m_iOn, FIELD_INTEGER), DEFINE_FIELD( CWallHealth, m_iOn, FIELD_INTEGER ),
DEFINE_FIELD( CWallHealth, m_flSoundTime, FIELD_TIME), DEFINE_FIELD( CWallHealth, m_flSoundTime, FIELD_TIME ),
}; };
IMPLEMENT_SAVERESTORE( CWallHealth, CBaseEntity ) IMPLEMENT_SAVERESTORE( CWallHealth, CBaseEntity )
LINK_ENTITY_TO_CLASS(func_healthcharger, CWallHealth) LINK_ENTITY_TO_CLASS( func_healthcharger, CWallHealth )
void CWallHealth::KeyValue( KeyValueData *pkvd ) void CWallHealth::KeyValue( KeyValueData *pkvd )
{ {
if ( FStrEq(pkvd->szKeyName, "style") || if( FStrEq(pkvd->szKeyName, "style" ) ||
FStrEq(pkvd->szKeyName, "height") || FStrEq( pkvd->szKeyName, "height" ) ||
FStrEq(pkvd->szKeyName, "value1") || FStrEq( pkvd->szKeyName, "value1" ) ||
FStrEq(pkvd->szKeyName, "value2") || FStrEq( pkvd->szKeyName, "value2" ) ||
FStrEq(pkvd->szKeyName, "value3")) FStrEq( pkvd->szKeyName, "value3" ) )
{ {
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "dmdelay")) else if( FStrEq( pkvd->szKeyName, "dmdelay" ) )
{ {
m_iReactivate = atoi(pkvd->szValue); m_iReactivate = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -153,48 +151,48 @@ void CWallHealth::KeyValue( KeyValueData *pkvd )
void CWallHealth::Spawn() void CWallHealth::Spawn()
{ {
Precache( ); Precache();
pev->solid = SOLID_BSP; pev->solid = SOLID_BSP;
pev->movetype = MOVETYPE_PUSH; pev->movetype = MOVETYPE_PUSH;
UTIL_SetOrigin(pev, pev->origin); // set size and link into world UTIL_SetOrigin( pev, pev->origin ); // set size and link into world
UTIL_SetSize(pev, pev->mins, pev->maxs); UTIL_SetSize( pev, pev->mins, pev->maxs );
SET_MODEL(ENT(pev), STRING(pev->model) ); SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_iJuice = gSkillData.healthchargerCapacity; m_iJuice = gSkillData.healthchargerCapacity;
pev->frame = 0; pev->frame = 0;
} }
void CWallHealth::Precache() void CWallHealth::Precache()
{ {
PRECACHE_SOUND("items/medshot4.wav"); PRECACHE_SOUND( "items/medshot4.wav" );
PRECACHE_SOUND("items/medshotno1.wav"); PRECACHE_SOUND( "items/medshotno1.wav" );
PRECACHE_SOUND("items/medcharge4.wav"); PRECACHE_SOUND( "items/medcharge4.wav" );
} }
void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
// Make sure that we have a caller // Make sure that we have a caller
if (!pActivator) if( !pActivator )
return; return;
// if it's not a player, ignore // if it's not a player, ignore
if ( !pActivator->IsPlayer() ) if( !pActivator->IsPlayer() )
return; return;
// if there is no juice left, turn it off // if there is no juice left, turn it off
if (m_iJuice <= 0) if( m_iJuice <= 0 )
{ {
pev->frame = 1; pev->frame = 1;
Off(); Off();
} }
// if the player doesn't have the suit, or there is no juice left, make the deny noise // if the player doesn't have the suit, or there is no juice left, make the deny noise
if ((m_iJuice <= 0) || (!(pActivator->pev->weapons & (1<<WEAPON_SUIT)))) if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) )
{ {
if (m_flSoundTime <= gpGlobals->time) if( m_flSoundTime <= gpGlobals->time )
{ {
m_flSoundTime = gpGlobals->time + 0.62; m_flSoundTime = gpGlobals->time + 0.62;
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshotno1.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/medshotno1.wav", 1.0, ATTN_NORM );
} }
return; return;
} }
@ -203,24 +201,24 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
SetThink( &CWallHealth::Off ); SetThink( &CWallHealth::Off );
// Time to recharge yet? // Time to recharge yet?
if (m_flNextCharge >= gpGlobals->time) if( m_flNextCharge >= gpGlobals->time )
return; return;
// Play the on sound or the looping charging sound // Play the on sound or the looping charging sound
if (!m_iOn) if( !m_iOn )
{ {
m_iOn++; m_iOn++;
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM );
m_flSoundTime = 0.56 + gpGlobals->time; m_flSoundTime = 0.56 + gpGlobals->time;
} }
if ((m_iOn == 1) && (m_flSoundTime <= gpGlobals->time)) if( ( m_iOn == 1 ) && ( m_flSoundTime <= gpGlobals->time ) )
{ {
m_iOn++; m_iOn++;
EMIT_SOUND(ENT(pev), CHAN_STATIC, "items/medcharge4.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_STATIC, "items/medcharge4.wav", 1.0, ATTN_NORM );
} }
// charge the player // charge the player
if ( pActivator->TakeHealth( 1, DMG_GENERIC ) ) if( pActivator->TakeHealth( 1, DMG_GENERIC ) )
{ {
m_iJuice--; m_iJuice--;
} }
@ -229,23 +227,23 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
m_flNextCharge = gpGlobals->time + 0.1; m_flNextCharge = gpGlobals->time + 0.1;
} }
void CWallHealth::Recharge(void) void CWallHealth::Recharge( void )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM ); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM );
m_iJuice = gSkillData.healthchargerCapacity; m_iJuice = gSkillData.healthchargerCapacity;
pev->frame = 0; pev->frame = 0;
SetThink( &CBaseEntity::SUB_DoNothing ); SetThink( &CBaseEntity::SUB_DoNothing );
} }
void CWallHealth::Off(void) void CWallHealth::Off( void )
{ {
// Stop looping sound. // Stop looping sound.
if (m_iOn > 1) if( m_iOn > 1 )
STOP_SOUND( ENT(pev), CHAN_STATIC, "items/medcharge4.wav" ); STOP_SOUND( ENT( pev ), CHAN_STATIC, "items/medcharge4.wav" );
m_iOn = 0; m_iOn = 0;
if ((!m_iJuice) && ( ( m_iReactivate = g_pGameRules->FlHealthChargerRechargeTime() ) > 0) ) if( ( !m_iJuice ) && ( ( m_iReactivate = g_pGameRules->FlHealthChargerRechargeTime() ) > 0 ) )
{ {
pev->nextthink = pev->ltime + m_iReactivate; pev->nextthink = pev->ltime + m_iReactivate;
SetThink( &CWallHealth::Recharge ); SetThink( &CWallHealth::Recharge );

File diff suppressed because it is too large Load Diff

View File

@ -45,28 +45,28 @@ IMPLEMENT_SAVERESTORE( CHornet, CBaseMonster )
//========================================================= //=========================================================
// don't let hornets gib, ever. // don't let hornets gib, ever.
//========================================================= //=========================================================
int CHornet :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) int CHornet::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
// filter these bits a little. // filter these bits a little.
bitsDamageType &= ~ ( DMG_ALWAYSGIB ); bitsDamageType &= ~( DMG_ALWAYSGIB );
bitsDamageType |= DMG_NEVERGIB; bitsDamageType |= DMG_NEVERGIB;
return CBaseMonster :: TakeDamage ( pevInflictor, pevAttacker, flDamage, bitsDamageType ); return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CHornet :: Spawn( void ) void CHornet::Spawn( void )
{ {
Precache(); Precache();
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
pev->flags |= FL_MONSTER; pev->flags |= FL_MONSTER;
pev->health = 1;// weak! pev->health = 1;// weak!
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// hornets don't live as long in multiplayer // hornets don't live as long in multiplayer
m_flStopAttack = gpGlobals->time + 3.5; m_flStopAttack = gpGlobals->time + 3.5;
@ -78,7 +78,7 @@ void CHornet :: Spawn( void )
m_flFieldOfView = 0.9; // +- 25 degrees m_flFieldOfView = 0.9; // +- 25 degrees
if ( RANDOM_LONG ( 1, 5 ) <= 2 ) if( RANDOM_LONG( 1, 5 ) <= 2 )
{ {
m_iHornetType = HORNET_TYPE_RED; m_iHornetType = HORNET_TYPE_RED;
m_flFlySpeed = HORNET_RED_SPEED; m_flFlySpeed = HORNET_RED_SPEED;
@ -89,17 +89,17 @@ void CHornet :: Spawn( void )
m_flFlySpeed = HORNET_ORANGE_SPEED; m_flFlySpeed = HORNET_ORANGE_SPEED;
} }
SET_MODEL(ENT( pev ), "models/hornet.mdl"); SET_MODEL( ENT( pev ), "models/hornet.mdl" );
UTIL_SetSize( pev, Vector( -4, -4, -4 ), Vector( 4, 4, 4 ) ); UTIL_SetSize( pev, Vector( -4, -4, -4 ), Vector( 4, 4, 4 ) );
SetTouch( &CHornet::DieTouch ); SetTouch( &CHornet::DieTouch );
SetThink( &CHornet::StartTrack ); SetThink( &CHornet::StartTrack );
edict_t *pSoundEnt = pev->owner; edict_t *pSoundEnt = pev->owner;
if ( !pSoundEnt ) if( !pSoundEnt )
pSoundEnt = edict(); pSoundEnt = edict();
if ( !FNullEnt(pev->owner) && (pev->owner->v.flags & FL_CLIENT) ) if( !FNullEnt( pev->owner ) && ( pev->owner->v.flags & FL_CLIENT ) )
{ {
pev->dmg = gSkillData.plrDmgHornet; pev->dmg = gSkillData.plrDmgHornet;
} }
@ -108,14 +108,14 @@ void CHornet :: Spawn( void )
// no real owner, or owner isn't a client. // no real owner, or owner isn't a client.
pev->dmg = gSkillData.monDmgHornet; pev->dmg = gSkillData.monDmgHornet;
} }
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
ResetSequenceInfo( ); ResetSequenceInfo();
} }
void CHornet :: Precache() void CHornet::Precache()
{ {
PRECACHE_MODEL("models/hornet.mdl"); PRECACHE_MODEL( "models/hornet.mdl" );
PRECACHE_SOUND( "agrunt/ag_fire1.wav" ); PRECACHE_SOUND( "agrunt/ag_fire1.wav" );
PRECACHE_SOUND( "agrunt/ag_fire2.wav" ); PRECACHE_SOUND( "agrunt/ag_fire2.wav" );
@ -130,29 +130,28 @@ void CHornet :: Precache()
PRECACHE_SOUND( "hornet/ag_hornethit3.wav" ); PRECACHE_SOUND( "hornet/ag_hornethit3.wav" );
iHornetPuff = PRECACHE_MODEL( "sprites/muz1.spr" ); iHornetPuff = PRECACHE_MODEL( "sprites/muz1.spr" );
iHornetTrail = PRECACHE_MODEL("sprites/laserbeam.spr"); iHornetTrail = PRECACHE_MODEL( "sprites/laserbeam.spr" );
} }
//========================================================= //=========================================================
// hornets will never get mad at each other, no matter who the owner is. // hornets will never get mad at each other, no matter who the owner is.
//========================================================= //=========================================================
int CHornet::IRelationship ( CBaseEntity *pTarget ) int CHornet::IRelationship( CBaseEntity *pTarget )
{ {
if ( pTarget->pev->modelindex == pev->modelindex ) if( pTarget->pev->modelindex == pev->modelindex )
{ {
return R_NO; return R_NO;
} }
return CBaseMonster :: IRelationship( pTarget ); return CBaseMonster::IRelationship( pTarget );
} }
//========================================================= //=========================================================
// ID's Hornet as their owner // ID's Hornet as their owner
//========================================================= //=========================================================
int CHornet::Classify ( void ) int CHornet::Classify( void )
{ {
if( pev->owner && pev->owner->v.flags & FL_CLIENT )
if ( pev->owner && pev->owner->v.flags & FL_CLIENT)
{ {
return CLASS_PLAYER_BIOWEAPON; return CLASS_PLAYER_BIOWEAPON;
} }
@ -163,7 +162,7 @@ int CHornet::Classify ( void )
//========================================================= //=========================================================
// StartTrack - starts a hornet out tracking its target // StartTrack - starts a hornet out tracking its target
//========================================================= //=========================================================
void CHornet :: StartTrack ( void ) void CHornet::StartTrack( void )
{ {
IgniteTrail(); IgniteTrail();
@ -176,7 +175,7 @@ void CHornet :: StartTrack ( void )
//========================================================= //=========================================================
// StartDart - starts a hornet out just flying straight. // StartDart - starts a hornet out just flying straight.
//========================================================= //=========================================================
void CHornet :: StartDart ( void ) void CHornet::StartDart( void )
{ {
IgniteTrail(); IgniteTrail();
@ -207,21 +206,21 @@ old colors
WRITE_BYTE( 0 ); // r, g, b WRITE_BYTE( 0 ); // r, g, b
break; break;
case HORNET_TYPE_ORANGE: case HORNET_TYPE_ORANGE:
WRITE_BYTE( 0 ); // r, g, b WRITE_BYTE( 0 ); // r, g, b
WRITE_BYTE( 100 ); // r, g, b WRITE_BYTE( 100 ); // r, g, b
WRITE_BYTE( 255 ); // r, g, b WRITE_BYTE( 255 ); // r, g, b
break; break;
*/ */
// trail // trail
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMFOLLOW ); WRITE_BYTE( TE_BEAMFOLLOW );
WRITE_SHORT( entindex() ); // entity WRITE_SHORT( entindex() ); // entity
WRITE_SHORT( iHornetTrail ); // model WRITE_SHORT( iHornetTrail ); // model
WRITE_BYTE( 10 ); // life WRITE_BYTE( 10 ); // life
WRITE_BYTE( 2 ); // width WRITE_BYTE( 2 ); // width
switch ( m_iHornetType ) switch( m_iHornetType )
{ {
case HORNET_TYPE_RED: case HORNET_TYPE_RED:
WRITE_BYTE( 179 ); // r, g, b WRITE_BYTE( 179 ); // r, g, b
@ -236,22 +235,21 @@ old colors
} }
WRITE_BYTE( 128 ); // brightness WRITE_BYTE( 128 ); // brightness
MESSAGE_END(); MESSAGE_END();
} }
//========================================================= //=========================================================
// Hornet is flying, gently tracking target // Hornet is flying, gently tracking target
//========================================================= //=========================================================
void CHornet :: TrackTarget ( void ) void CHornet::TrackTarget( void )
{ {
Vector vecFlightDir; Vector vecFlightDir;
Vector vecDirToEnemy; Vector vecDirToEnemy;
float flDelta; float flDelta;
StudioFrameAdvance( ); StudioFrameAdvance();
if (gpGlobals->time > m_flStopAttack) if( gpGlobals->time > m_flStopAttack )
{ {
SetTouch( NULL ); SetTouch( NULL );
SetThink( &CBaseEntity::SUB_Remove ); SetThink( &CBaseEntity::SUB_Remove );
@ -260,14 +258,14 @@ void CHornet :: TrackTarget ( void )
} }
// UNDONE: The player pointer should come back after returning from another level // UNDONE: The player pointer should come back after returning from another level
if ( m_hEnemy == NULL ) if( m_hEnemy == NULL )
{ {
// enemy is dead. // enemy is dead.
Look( 512 ); Look( 512 );
m_hEnemy = BestVisibleEnemy( ); m_hEnemy = BestVisibleEnemy();
} }
if ( m_hEnemy != NULL && FVisible( m_hEnemy )) if( m_hEnemy != NULL && FVisible( m_hEnemy ) )
{ {
m_vecEnemyLKP = m_hEnemy->BodyTarget( pev->origin ); m_vecEnemyLKP = m_hEnemy->BodyTarget( pev->origin );
} }
@ -278,42 +276,48 @@ void CHornet :: TrackTarget ( void )
vecDirToEnemy = ( m_vecEnemyLKP - pev->origin ).Normalize(); vecDirToEnemy = ( m_vecEnemyLKP - pev->origin ).Normalize();
if (pev->velocity.Length() < 0.1) if( pev->velocity.Length() < 0.1 )
vecFlightDir = vecDirToEnemy; vecFlightDir = vecDirToEnemy;
else else
vecFlightDir = pev->velocity.Normalize(); vecFlightDir = pev->velocity.Normalize();
// measure how far the turn is, the wider the turn, the slow we'll go this time. // measure how far the turn is, the wider the turn, the slow we'll go this time.
flDelta = DotProduct ( vecFlightDir, vecDirToEnemy ); flDelta = DotProduct( vecFlightDir, vecDirToEnemy );
if ( flDelta < 0.5 ) if( flDelta < 0.5 )
{ {
// hafta turn wide again. play sound // hafta turn wide again. play sound
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz1.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz2.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz1.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
case 2: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz3.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz2.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz3.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
break;
} }
} }
if ( flDelta <= 0 && m_iHornetType == HORNET_TYPE_RED ) if( flDelta <= 0 && m_iHornetType == HORNET_TYPE_RED )
{ {
// no flying backwards, but we don't want to invert this, cause we'd go fast when we have to turn REAL far. // no flying backwards, but we don't want to invert this, cause we'd go fast when we have to turn REAL far.
flDelta = 0.25; flDelta = 0.25;
} }
pev->velocity = ( vecFlightDir + vecDirToEnemy).Normalize(); pev->velocity = ( vecFlightDir + vecDirToEnemy ).Normalize();
if ( pev->owner && (pev->owner->v.flags & FL_MONSTER) ) if( pev->owner && ( pev->owner->v.flags & FL_MONSTER ) )
{ {
// random pattern only applies to hornets fired by monsters, not players. // random pattern only applies to hornets fired by monsters, not players.
pev->velocity.x += RANDOM_FLOAT ( -0.10, 0.10 );// scramble the flight dir a bit. pev->velocity.x += RANDOM_FLOAT( -0.10, 0.10 );// scramble the flight dir a bit.
pev->velocity.y += RANDOM_FLOAT ( -0.10, 0.10 ); pev->velocity.y += RANDOM_FLOAT( -0.10, 0.10 );
pev->velocity.z += RANDOM_FLOAT ( -0.10, 0.10 ); pev->velocity.z += RANDOM_FLOAT( -0.10, 0.10 );
} }
switch ( m_iHornetType ) switch( m_iHornetType )
{ {
case HORNET_TYPE_RED: case HORNET_TYPE_RED:
pev->velocity = pev->velocity * ( m_flFlySpeed * flDelta );// scale the dir by the ( speed * width of turn ) pev->velocity = pev->velocity * ( m_flFlySpeed * flDelta );// scale the dir by the ( speed * width of turn )
@ -325,32 +329,38 @@ void CHornet :: TrackTarget ( void )
break; break;
} }
pev->angles = UTIL_VecToAngles (pev->velocity); pev->angles = UTIL_VecToAngles( pev->velocity );
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
// if hornet is close to the enemy, jet in a straight line for a half second. // if hornet is close to the enemy, jet in a straight line for a half second.
// (only in the single player game) // (only in the single player game)
if ( m_hEnemy != NULL && !g_pGameRules->IsMultiplayer() ) if( m_hEnemy != NULL && !g_pGameRules->IsMultiplayer() )
{ {
if ( flDelta >= 0.4 && ( pev->origin - m_vecEnemyLKP ).Length() <= 300 ) if( flDelta >= 0.4 && ( pev->origin - m_vecEnemyLKP ).Length() <= 300 )
{ {
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_SPRITE ); WRITE_BYTE( TE_SPRITE );
WRITE_COORD( pev->origin.x); // pos WRITE_COORD( pev->origin.x ); // pos
WRITE_COORD( pev->origin.y); WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z); WRITE_COORD( pev->origin.z );
WRITE_SHORT( iHornetPuff ); // model WRITE_SHORT( iHornetPuff ); // model
// WRITE_BYTE( 0 ); // life * 10 // WRITE_BYTE( 0 ); // life * 10
WRITE_BYTE( 2 ); // size * 10 WRITE_BYTE( 2 ); // size * 10
WRITE_BYTE( 128 ); // brightness WRITE_BYTE( 128 ); // brightness
MESSAGE_END(); MESSAGE_END();
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz1.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz2.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz1.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
case 2: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_buzz3.wav", HORNET_BUZZ_VOLUME, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz2.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_buzz3.wav", HORNET_BUZZ_VOLUME, ATTN_NORM );
break;
} }
pev->velocity = pev->velocity * 2; pev->velocity = pev->velocity * 2;
pev->nextthink = gpGlobals->time + 1.0; pev->nextthink = gpGlobals->time + 1.0;
@ -363,16 +373,16 @@ void CHornet :: TrackTarget ( void )
//========================================================= //=========================================================
// Tracking Hornet hit something // Tracking Hornet hit something
//========================================================= //=========================================================
void CHornet :: TrackTouch ( CBaseEntity *pOther ) void CHornet::TrackTouch( CBaseEntity *pOther )
{ {
if ( pOther->edict() == pev->owner || pOther->pev->modelindex == pev->modelindex ) if( pOther->edict() == pev->owner || pOther->pev->modelindex == pev->modelindex )
{ {
// bumped into the guy that shot it. // bumped into the guy that shot it.
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
return; return;
} }
if ( IRelationship( pOther ) <= R_NO ) if( IRelationship( pOther ) <= R_NO )
{ {
// hit something we don't want to hurt, so turn around. // hit something we don't want to hurt, so turn around.
@ -395,19 +405,25 @@ void CHornet::DartTouch( CBaseEntity *pOther )
DieTouch( pOther ); DieTouch( pOther );
} }
void CHornet::DieTouch ( CBaseEntity *pOther ) void CHornet::DieTouch( CBaseEntity *pOther )
{ {
if ( pOther && pOther->pev->takedamage ) if( pOther && pOther->pev->takedamage )
{ {
// do the damage // do the damage
switch (RANDOM_LONG(0,2)) switch( RANDOM_LONG( 0, 2 ) )
{ {
// buzz when you plug someone // buzz when you plug someone
case 0: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_hornethit1.wav", 1, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_hornethit2.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_hornethit1.wav", 1, ATTN_NORM );
case 2: EMIT_SOUND( ENT(pev), CHAN_VOICE, "hornet/ag_hornethit3.wav", 1, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_hornethit2.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hornet/ag_hornethit3.wav", 1, ATTN_NORM );
break;
} }
pOther->TakeDamage( pev, VARS( pev->owner ), pev->dmg, DMG_BULLET ); pOther->TakeDamage( pev, VARS( pev->owner ), pev->dmg, DMG_BULLET );
} }

View File

@ -35,24 +35,23 @@ class CHornet : public CBaseMonster
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int Classify ( void ); int Classify( void );
int IRelationship ( CBaseEntity *pTarget ); int IRelationship( CBaseEntity *pTarget );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void IgniteTrail( void ); void IgniteTrail( void );
void EXPORT StartTrack ( void ); void EXPORT StartTrack( void );
void EXPORT StartDart ( void ); void EXPORT StartDart( void );
void EXPORT TrackTarget ( void ); void EXPORT TrackTarget( void );
void EXPORT TrackTouch ( CBaseEntity *pOther ); void EXPORT TrackTouch( CBaseEntity *pOther );
void EXPORT DartTouch( CBaseEntity *pOther ); void EXPORT DartTouch( CBaseEntity *pOther );
void EXPORT DieTouch ( CBaseEntity *pOther ); void EXPORT DieTouch( CBaseEntity *pOther );
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
float m_flStopAttack; float m_flStopAttack;
int m_iHornetType; int m_iHornetType;
float m_flFlySpeed; float m_flFlySpeed;
}; };

View File

@ -24,7 +24,8 @@
#include "hornet.h" #include "hornet.h"
#include "gamerules.h" #include "gamerules.h"
enum hgun_e { enum hgun_e
{
HGUN_IDLE1 = 0, HGUN_IDLE1 = 0,
HGUN_FIDGETSWAY, HGUN_FIDGETSWAY,
HGUN_FIDGETSHAKE, HGUN_FIDGETSHAKE,
@ -46,11 +47,11 @@ BOOL CHgun::IsUseable( void )
return TRUE; return TRUE;
} }
void CHgun::Spawn( ) void CHgun::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_HORNETGUN; m_iId = WEAPON_HORNETGUN;
SET_MODEL(ENT(pev), "models/w_hgun.mdl"); SET_MODEL( ENT( pev ), "models/w_hgun.mdl" );
m_iDefaultAmmo = HIVEHAND_DEFAULT_GIVE; m_iDefaultAmmo = HIVEHAND_DEFAULT_GIVE;
m_iFirePhase = 0; m_iFirePhase = 0;
@ -60,24 +61,24 @@ void CHgun::Spawn( )
void CHgun::Precache( void ) void CHgun::Precache( void )
{ {
PRECACHE_MODEL("models/v_hgun.mdl"); PRECACHE_MODEL( "models/v_hgun.mdl" );
PRECACHE_MODEL("models/w_hgun.mdl"); PRECACHE_MODEL( "models/w_hgun.mdl" );
PRECACHE_MODEL("models/p_hgun.mdl"); PRECACHE_MODEL( "models/p_hgun.mdl" );
m_usHornetFire = PRECACHE_EVENT ( 1, "events/firehornet.sc" ); m_usHornetFire = PRECACHE_EVENT( 1, "events/firehornet.sc" );
UTIL_PrecacheOther("hornet"); UTIL_PrecacheOther( "hornet" );
} }
int CHgun::AddToPlayer( CBasePlayer *pPlayer ) int CHgun::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// in multiplayer, all hivehands come full. // in multiplayer, all hivehands come full.
pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] = HORNET_MAX_CARRY; pPlayer->m_rgAmmo[PrimaryAmmoIndex()] = HORNET_MAX_CARRY;
} }
#endif #endif
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
@ -88,9 +89,9 @@ int CHgun::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
int CHgun::GetItemInfo(ItemInfo *p) int CHgun::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Hornets"; p->pszAmmo1 = "Hornets";
p->iMaxAmmo1 = HORNET_MAX_CARRY; p->iMaxAmmo1 = HORNET_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -105,7 +106,7 @@ int CHgun::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CHgun::Deploy( ) BOOL CHgun::Deploy()
{ {
return DefaultDeploy( "models/v_hgun.mdl", "models/p_hgun.mdl", HGUN_UP, "hive" ); return DefaultDeploy( "models/v_hgun.mdl", "models/p_hgun.mdl", HGUN_UP, "hive" );
} }
@ -116,17 +117,17 @@ void CHgun::Holster( int skiplocal /* = 0 */ )
SendWeaponAnim( HGUN_DOWN ); SendWeaponAnim( HGUN_DOWN );
//!!!HACKHACK - can't select hornetgun if it's empty! no way to get ammo for it, either. //!!!HACKHACK - can't select hornetgun if it's empty! no way to get ammo for it, either.
if ( !m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] ) if( !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] )
{ {
m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] = 1; m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] = 1;
} }
} }
void CHgun::PrimaryAttack() void CHgun::PrimaryAttack()
{ {
Reload( ); Reload();
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if(m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
{ {
return; return;
} }
@ -149,7 +150,6 @@ void CHgun::PrimaryAttack()
#else #else
flags = 0; flags = 0;
#endif #endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 );
// player "shoot" animation // player "shoot" animation
@ -157,7 +157,7 @@ void CHgun::PrimaryAttack()
m_flNextPrimaryAttack = m_flNextPrimaryAttack + 0.25; m_flNextPrimaryAttack = m_flNextPrimaryAttack + 0.25;
if (m_flNextPrimaryAttack < UTIL_WeaponTimeBase() ) if( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() )
{ {
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25;
} }
@ -169,7 +169,7 @@ void CHgun::SecondaryAttack( void )
{ {
Reload(); Reload();
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
{ {
return; return;
} }
@ -181,10 +181,10 @@ void CHgun::SecondaryAttack( void )
UTIL_MakeVectors( m_pPlayer->pev->v_angle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle );
vecSrc = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12; vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
m_iFirePhase++; m_iFirePhase++;
switch ( m_iFirePhase ) switch( m_iFirePhase )
{ {
case 1: case 1:
vecSrc = vecSrc + gpGlobals->v_up * 8; vecSrc = vecSrc + gpGlobals->v_up * 8;
@ -237,7 +237,7 @@ void CHgun::SecondaryAttack( void )
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH; m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.1; m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.1;
@ -246,10 +246,10 @@ void CHgun::SecondaryAttack( void )
void CHgun::Reload( void ) void CHgun::Reload( void )
{ {
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= HORNET_MAX_CARRY) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= HORNET_MAX_CARRY )
return; return;
while (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < HORNET_MAX_CARRY && m_flRechargeTime < gpGlobals->time) while( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < HORNET_MAX_CARRY && m_flRechargeTime < gpGlobals->time )
{ {
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]++; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]++;
m_flRechargeTime += 0.5; m_flRechargeTime += 0.5;
@ -258,19 +258,19 @@ void CHgun::Reload( void )
void CHgun::WeaponIdle( void ) void CHgun::WeaponIdle( void )
{ {
Reload( ); Reload();
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.75) if( flRand <= 0.75 )
{ {
iAnim = HGUN_IDLE1; iAnim = HGUN_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 30.0 / 16 * (2); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 30.0 / 16 * ( 2 );
} }
else if (flRand <= 0.875) else if( flRand <= 0.875 )
{ {
iAnim = HGUN_FIDGETSWAY; iAnim = HGUN_FIDGETSWAY;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 40.0 / 16.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 40.0 / 16.0;

File diff suppressed because it is too large Load Diff

View File

@ -50,14 +50,14 @@ extern CGraph WorldGraph;
class CIchthyosaur : public CFlyingMonster class CIchthyosaur : public CFlyingMonster
{ {
public: public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
CUSTOM_SCHEDULES CUSTOM_SCHEDULES
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
@ -70,23 +70,23 @@ public:
void EXPORT CombatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT CombatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void EXPORT BiteTouch( CBaseEntity *pOther ); void EXPORT BiteTouch( CBaseEntity *pOther );
void StartTask( Task_t *pTask ); void StartTask( Task_t *pTask );
void RunTask( Task_t *pTask ); void RunTask( Task_t *pTask );
BOOL CheckMeleeAttack1 ( float flDot, float flDist ); BOOL CheckMeleeAttack1( float flDot, float flDist );
BOOL CheckRangeAttack1 ( float flDot, float flDist ); BOOL CheckRangeAttack1( float flDot, float flDist );
float ChangeYaw( int speed ); float ChangeYaw( int speed );
Activity GetStoppedActivity( void ); Activity GetStoppedActivity( void );
void Move( float flInterval ); void Move( float flInterval );
void MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval ); void MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval );
void MonsterThink( void ); void MonsterThink( void );
void Stop( void ); void Stop( void );
void Swim( void ); void Swim( void );
Vector DoProbe(const Vector &Probe); Vector DoProbe(const Vector &Probe );
float VectorToPitch( const Vector &vec); float VectorToPitch( const Vector &vec );
float FlPitchDiff( void ); float FlPitchDiff( void );
float ChangePitch( int speed ); float ChangePitch( int speed );
@ -178,34 +178,34 @@ const char *CIchthyosaur::pDieSounds[] =
}; };
#define EMIT_ICKY_SOUND( chan, array ) \ #define EMIT_ICKY_SOUND( chan, array ) \
EMIT_SOUND_DYN ( ENT(pev), chan , array [ RANDOM_LONG(0,ARRAYSIZE( array )-1) ], 1.0, 0.6, 0, RANDOM_LONG(95,105) ); EMIT_SOUND_DYN( ENT( pev ), chan , array[RANDOM_LONG( 0, ARRAYSIZE( array ) - 1 )], 1.0, 0.6, 0, RANDOM_LONG( 95, 105 ) );
void CIchthyosaur :: IdleSound( void ) void CIchthyosaur::IdleSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_VOICE, pIdleSounds ); EMIT_ICKY_SOUND( CHAN_VOICE, pIdleSounds );
} }
void CIchthyosaur :: AlertSound( void ) void CIchthyosaur::AlertSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_VOICE, pAlertSounds ); EMIT_ICKY_SOUND( CHAN_VOICE, pAlertSounds );
} }
void CIchthyosaur :: AttackSound( void ) void CIchthyosaur::AttackSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_VOICE, pAttackSounds ); EMIT_ICKY_SOUND( CHAN_VOICE, pAttackSounds );
} }
void CIchthyosaur :: BiteSound( void ) void CIchthyosaur::BiteSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_WEAPON, pBiteSounds ); EMIT_ICKY_SOUND( CHAN_WEAPON, pBiteSounds );
} }
void CIchthyosaur :: DeathSound( void ) void CIchthyosaur::DeathSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_VOICE, pDieSounds ); EMIT_ICKY_SOUND( CHAN_VOICE, pDieSounds );
} }
void CIchthyosaur :: PainSound( void ) void CIchthyosaur::PainSound( void )
{ {
EMIT_ICKY_SOUND( CHAN_VOICE, pPainSounds ); EMIT_ICKY_SOUND( CHAN_VOICE, pPainSounds );
} }
@ -213,7 +213,7 @@ void CIchthyosaur :: PainSound( void )
//========================================================= //=========================================================
// monster-specific tasks and states // monster-specific tasks and states
//========================================================= //=========================================================
enum enum
{ {
TASK_ICHTHYOSAUR_CIRCLE_ENEMY = LAST_COMMON_TASK + 1, TASK_ICHTHYOSAUR_CIRCLE_ENEMY = LAST_COMMON_TASK + 1,
TASK_ICHTHYOSAUR_SWIM, TASK_ICHTHYOSAUR_SWIM,
@ -306,7 +306,7 @@ Schedule_t slTwitchDie[] =
DEFINE_CUSTOM_SCHEDULES( CIchthyosaur ) DEFINE_CUSTOM_SCHEDULES( CIchthyosaur )
{ {
slSwimAround, slSwimAround,
slSwimAgitated, slSwimAgitated,
slCircleEnemy, slCircleEnemy,
slTwitchDie, slTwitchDie,
@ -318,17 +318,17 @@ IMPLEMENT_CUSTOM_SCHEDULES( CIchthyosaur, CFlyingMonster )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CIchthyosaur :: Classify ( void ) int CIchthyosaur::Classify( void )
{ {
return CLASS_ALIEN_MONSTER; return CLASS_ALIEN_MONSTER;
} }
//========================================================= //=========================================================
// CheckMeleeAttack1 // CheckMeleeAttack1
//========================================================= //=========================================================
BOOL CIchthyosaur :: CheckMeleeAttack1 ( float flDot, float flDist ) BOOL CIchthyosaur::CheckMeleeAttack1( float flDot, float flDist )
{ {
if ( flDot >= 0.7 && m_flEnemyTouched > gpGlobals->time - 0.2 ) if( flDot >= 0.7 && m_flEnemyTouched > gpGlobals->time - 0.2 )
{ {
return TRUE; return TRUE;
} }
@ -338,7 +338,7 @@ BOOL CIchthyosaur :: CheckMeleeAttack1 ( float flDot, float flDist )
void CIchthyosaur::BiteTouch( CBaseEntity *pOther ) void CIchthyosaur::BiteTouch( CBaseEntity *pOther )
{ {
// bite if we hit who we want to eat // bite if we hit who we want to eat
if ( pOther == m_hEnemy ) if( pOther == m_hEnemy )
{ {
m_flEnemyTouched = gpGlobals->time; m_flEnemyTouched = gpGlobals->time;
m_bOnAttack = TRUE; m_bOnAttack = TRUE;
@ -347,10 +347,10 @@ void CIchthyosaur::BiteTouch( CBaseEntity *pOther )
void CIchthyosaur::CombatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CIchthyosaur::CombatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
if ( !ShouldToggle( useType, m_bOnAttack ) ) if( !ShouldToggle( useType, m_bOnAttack ) )
return; return;
if (m_bOnAttack) if( m_bOnAttack )
{ {
m_bOnAttack = 0; m_bOnAttack = 0;
} }
@ -364,9 +364,9 @@ void CIchthyosaur::CombatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE
// CheckRangeAttack1 - swim in for a chomp // CheckRangeAttack1 - swim in for a chomp
// //
//========================================================= //=========================================================
BOOL CIchthyosaur :: CheckRangeAttack1 ( float flDot, float flDist ) BOOL CIchthyosaur::CheckRangeAttack1( float flDot, float flDist )
{ {
if ( flDot > -0.7 && (m_bOnAttack || ( flDist <= 192 && m_idealDist <= 192))) if( flDot > -0.7 && (m_bOnAttack || ( flDist <= 192 && m_idealDist <= 192 ) ) )
{ {
return TRUE; return TRUE;
} }
@ -378,7 +378,7 @@ BOOL CIchthyosaur :: CheckRangeAttack1 ( float flDot, float flDist )
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CIchthyosaur :: SetYawSpeed ( void ) void CIchthyosaur::SetYawSpeed( void )
{ {
pev->yaw_speed = 100; pev->yaw_speed = 100;
} }
@ -386,7 +386,7 @@ void CIchthyosaur :: SetYawSpeed ( void )
//========================================================= //=========================================================
// Killed - overrides CFlyingMonster. // Killed - overrides CFlyingMonster.
// //
void CIchthyosaur :: Killed( entvars_t *pevAttacker, int iGib ) void CIchthyosaur::Killed( entvars_t *pevAttacker, int iGib )
{ {
CBaseMonster::Killed( pevAttacker, iGib ); CBaseMonster::Killed( pevAttacker, iGib );
pev->velocity = Vector( 0, 0, 0 ); pev->velocity = Vector( 0, 0, 0 );
@ -408,7 +408,7 @@ void CIchthyosaur::BecomeDead( void )
// HandleAnimEvent - catches the monster-specific messages // HandleAnimEvent - catches the monster-specific messages
// that occur when tagged animation frames are played. // that occur when tagged animation frames are played.
//========================================================= //=========================================================
void CIchthyosaur :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CIchthyosaur::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
int bDidAttack = FALSE; int bDidAttack = FALSE;
switch( pEvent->event ) switch( pEvent->event )
@ -416,23 +416,23 @@ void CIchthyosaur :: HandleAnimEvent( MonsterEvent_t *pEvent )
case ICHTHYOSAUR_AE_SHAKE_RIGHT: case ICHTHYOSAUR_AE_SHAKE_RIGHT:
case ICHTHYOSAUR_AE_SHAKE_LEFT: case ICHTHYOSAUR_AE_SHAKE_LEFT:
{ {
if (m_hEnemy != NULL && FVisible( m_hEnemy )) if( m_hEnemy != NULL && FVisible( m_hEnemy ) )
{ {
CBaseEntity *pHurt = m_hEnemy; CBaseEntity *pHurt = m_hEnemy;
if (m_flEnemyTouched < gpGlobals->time - 0.2 && (m_hEnemy->BodyTarget( pev->origin ) - pev->origin).Length() > (32+16+32)) if( m_flEnemyTouched < gpGlobals->time - 0.2 && ( m_hEnemy->BodyTarget( pev->origin ) - pev->origin).Length() > ( 32 + 16 + 32 ) )
break; break;
Vector vecShootDir = ShootAtEnemy( pev->origin ); Vector vecShootDir = ShootAtEnemy( pev->origin );
UTIL_MakeAimVectors ( pev->angles ); UTIL_MakeAimVectors( pev->angles );
if (DotProduct( vecShootDir, gpGlobals->v_forward ) > 0.707) if( DotProduct( vecShootDir, gpGlobals->v_forward ) > 0.707 )
{ {
m_bOnAttack = TRUE; m_bOnAttack = TRUE;
pHurt->pev->punchangle.z = -18; pHurt->pev->punchangle.z = -18;
pHurt->pev->punchangle.x = 5; pHurt->pev->punchangle.x = 5;
pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 300; pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 300;
if (pHurt->IsPlayer()) if( pHurt->IsPlayer() )
{ {
pHurt->pev->angles.x += RANDOM_FLOAT( -35, 35 ); pHurt->pev->angles.x += RANDOM_FLOAT( -35, 35 );
pHurt->pev->angles.y += RANDOM_FLOAT( -90, 90 ); pHurt->pev->angles.y += RANDOM_FLOAT( -90, 90 );
@ -452,7 +452,7 @@ void CIchthyosaur :: HandleAnimEvent( MonsterEvent_t *pEvent )
break; break;
} }
if (bDidAttack) if( bDidAttack )
{ {
Vector vecSrc = pev->origin + gpGlobals->v_forward * 32; Vector vecSrc = pev->origin + gpGlobals->v_forward * 32;
UTIL_Bubbles( vecSrc - Vector( 8, 8, 8 ), vecSrc + Vector( 8, 8, 8 ), 16 ); UTIL_Bubbles( vecSrc - Vector( 8, 8, 8 ), vecSrc + Vector( 8, 8, 8 ), 16 );
@ -462,18 +462,18 @@ void CIchthyosaur :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CIchthyosaur :: Spawn() void CIchthyosaur::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/icky.mdl"); SET_MODEL( ENT( pev ), "models/icky.mdl" );
UTIL_SetSize( pev, Vector( -32, -32, -32 ), Vector( 32, 32, 32 ) ); UTIL_SetSize( pev, Vector( -32, -32, -32 ), Vector( 32, 32, 32 ) );
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
m_bloodColor = BLOOD_COLOR_GREEN; m_bloodColor = BLOOD_COLOR_GREEN;
pev->health = gSkillData.ichthyosaurHealth; pev->health = gSkillData.ichthyosaurHealth;
pev->view_ofs = Vector ( 0, 0, 16 ); pev->view_ofs = Vector( 0, 0, 16 );
m_flFieldOfView = VIEW_FIELD_WIDE; m_flFieldOfView = VIEW_FIELD_WIDE;
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
SetBits(pev->flags, FL_SWIM); SetBits(pev->flags, FL_SWIM);
@ -493,7 +493,7 @@ void CIchthyosaur :: Spawn()
m_flMaxDist = 384; m_flMaxDist = 384;
Vector Forward; Vector Forward;
UTIL_MakeVectorsPrivate(pev->angles, Forward, 0, 0); UTIL_MakeVectorsPrivate( pev->angles, Forward, 0, 0 );
pev->velocity = m_flightSpeed * Forward.Normalize(); pev->velocity = m_flightSpeed * Forward.Normalize();
m_SaveVelocity = pev->velocity; m_SaveVelocity = pev->velocity;
} }
@ -501,9 +501,9 @@ void CIchthyosaur :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CIchthyosaur :: Precache() void CIchthyosaur::Precache()
{ {
PRECACHE_MODEL("models/icky.mdl"); PRECACHE_MODEL( "models/icky.mdl" );
PRECACHE_SOUND_ARRAY( pIdleSounds ); PRECACHE_SOUND_ARRAY( pIdleSounds );
PRECACHE_SOUND_ARRAY( pAlertSounds ); PRECACHE_SOUND_ARRAY( pAlertSounds );
@ -519,7 +519,7 @@ void CIchthyosaur :: Precache()
Schedule_t* CIchthyosaur::GetSchedule() Schedule_t* CIchthyosaur::GetSchedule()
{ {
// ALERT( at_console, "GetSchedule( )\n" ); // ALERT( at_console, "GetSchedule( )\n" );
switch(m_MonsterState) switch( m_MonsterState )
{ {
case MONSTERSTATE_IDLE: case MONSTERSTATE_IDLE:
m_flightSpeed = 80; m_flightSpeed = 80;
@ -532,20 +532,21 @@ Schedule_t* CIchthyosaur::GetSchedule()
case MONSTERSTATE_COMBAT: case MONSTERSTATE_COMBAT:
m_flMaxSpeed = 400; m_flMaxSpeed = 400;
// eat them // eat them
if ( HasConditions( bits_COND_CAN_MELEE_ATTACK1 ) ) if( HasConditions( bits_COND_CAN_MELEE_ATTACK1 ) )
{ {
return GetScheduleOfType( SCHED_MELEE_ATTACK1 ); return GetScheduleOfType( SCHED_MELEE_ATTACK1 );
} }
// chase them down and eat them // chase them down and eat them
if ( HasConditions( bits_COND_CAN_RANGE_ATTACK1 ) ) if( HasConditions( bits_COND_CAN_RANGE_ATTACK1 ) )
{ {
return GetScheduleOfType( SCHED_CHASE_ENEMY ); return GetScheduleOfType( SCHED_CHASE_ENEMY );
} }
if ( HasConditions( bits_COND_HEAVY_DAMAGE ) ) if( HasConditions( bits_COND_HEAVY_DAMAGE ) )
{ {
m_bOnAttack = TRUE; m_bOnAttack = TRUE;
} }
if ( pev->health < pev->max_health - 20 ) if( pev->health < pev->max_health - 20 )
{ {
m_bOnAttack = TRUE; m_bOnAttack = TRUE;
} }
@ -556,15 +557,15 @@ Schedule_t* CIchthyosaur::GetSchedule()
break; break;
} }
return CFlyingMonster :: GetSchedule(); return CFlyingMonster::GetSchedule();
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
Schedule_t* CIchthyosaur :: GetScheduleOfType ( int Type ) Schedule_t *CIchthyosaur::GetScheduleOfType( int Type )
{ {
// ALERT( at_console, "GetScheduleOfType( %d ) %d\n", Type, m_bOnAttack ); // ALERT( at_console, "GetScheduleOfType( %d ) %d\n", Type, m_bOnAttack );
switch ( Type ) switch( Type )
{ {
case SCHED_IDLE_WALK: case SCHED_IDLE_WALK:
return slSwimAround; return slSwimAround;
@ -575,10 +576,10 @@ Schedule_t* CIchthyosaur :: GetScheduleOfType ( int Type )
case SCHED_DIE: case SCHED_DIE:
return slTwitchDie; return slTwitchDie;
case SCHED_CHASE_ENEMY: case SCHED_CHASE_ENEMY:
AttackSound( ); AttackSound();
} }
return CBaseMonster :: GetScheduleOfType( Type ); return CBaseMonster::GetScheduleOfType( Type );
} }
//========================================================= //=========================================================
@ -586,16 +587,16 @@ Schedule_t* CIchthyosaur :: GetScheduleOfType ( int Type )
// any necessary calculations to start the next task on the // any necessary calculations to start the next task on the
// schedule. // schedule.
//========================================================= //=========================================================
void CIchthyosaur::StartTask(Task_t *pTask) void CIchthyosaur::StartTask( Task_t *pTask )
{ {
switch (pTask->iTask) switch( pTask->iTask )
{ {
case TASK_ICHTHYOSAUR_CIRCLE_ENEMY: case TASK_ICHTHYOSAUR_CIRCLE_ENEMY:
break; break;
case TASK_ICHTHYOSAUR_SWIM: case TASK_ICHTHYOSAUR_SWIM:
break; break;
case TASK_SMALL_FLINCH: case TASK_SMALL_FLINCH:
if (m_idealDist > 128) if( m_idealDist > 128 )
{ {
m_flMaxDist = 512; m_flMaxDist = 512;
m_idealDist = 512; m_idealDist = 512;
@ -604,35 +605,35 @@ void CIchthyosaur::StartTask(Task_t *pTask)
{ {
m_bOnAttack = TRUE; m_bOnAttack = TRUE;
} }
CFlyingMonster::StartTask(pTask); CFlyingMonster::StartTask( pTask );
break; break;
case TASK_ICHTHYOSAUR_FLOAT: case TASK_ICHTHYOSAUR_FLOAT:
pev->skin = EYE_BASE; pev->skin = EYE_BASE;
SetSequenceByName( "bellyup" ); SetSequenceByName( "bellyup" );
break; break;
default: default:
CFlyingMonster::StartTask(pTask); CFlyingMonster::StartTask( pTask );
break; break;
} }
} }
void CIchthyosaur :: RunTask ( Task_t *pTask ) void CIchthyosaur::RunTask( Task_t *pTask )
{ {
switch ( pTask->iTask ) switch( pTask->iTask )
{ {
case TASK_ICHTHYOSAUR_CIRCLE_ENEMY: case TASK_ICHTHYOSAUR_CIRCLE_ENEMY:
if (m_hEnemy == NULL) if( m_hEnemy == NULL )
{ {
TaskComplete( ); TaskComplete();
} }
else if (FVisible( m_hEnemy )) else if( FVisible( m_hEnemy ) )
{ {
Vector vecFrom = m_hEnemy->EyePosition( ); Vector vecFrom = m_hEnemy->EyePosition();
Vector vecDelta = (pev->origin - vecFrom).Normalize( ); Vector vecDelta = ( pev->origin - vecFrom ).Normalize();
Vector vecSwim = CrossProduct( vecDelta, Vector( 0, 0, 1 ) ).Normalize( ); Vector vecSwim = CrossProduct( vecDelta, Vector( 0, 0, 1 ) ).Normalize();
if (DotProduct( vecSwim, m_SaveVelocity ) < 0) if( DotProduct( vecSwim, m_SaveVelocity ) < 0 )
vecSwim = vecSwim * -1.0; vecSwim = vecSwim * -1.0;
Vector vecPos = vecFrom + vecDelta * m_idealDist + vecSwim * 32; Vector vecPos = vecFrom + vecDelta * m_idealDist + vecSwim * 32;
@ -643,30 +644,31 @@ void CIchthyosaur :: RunTask ( Task_t *pTask )
UTIL_TraceHull( vecFrom, vecPos, ignore_monsters, large_hull, m_hEnemy->edict(), &tr ); UTIL_TraceHull( vecFrom, vecPos, ignore_monsters, large_hull, m_hEnemy->edict(), &tr );
if (tr.flFraction > 0.5) if( tr.flFraction > 0.5 )
vecPos = tr.vecEndPos; vecPos = tr.vecEndPos;
m_SaveVelocity = m_SaveVelocity * 0.8 + 0.2 * (vecPos - pev->origin).Normalize() * m_flightSpeed; m_SaveVelocity = m_SaveVelocity * 0.8 + 0.2 * ( vecPos - pev->origin ).Normalize() * m_flightSpeed;
// ALERT( at_console, "m_SaveVelocity %.2f %.2f %.2f\n", m_SaveVelocity.x, m_SaveVelocity.y, m_SaveVelocity.z ); // ALERT( at_console, "m_SaveVelocity %.2f %.2f %.2f\n", m_SaveVelocity.x, m_SaveVelocity.y, m_SaveVelocity.z );
if (HasConditions( bits_COND_ENEMY_FACING_ME ) && m_hEnemy->FVisible( this )) if( HasConditions( bits_COND_ENEMY_FACING_ME ) && m_hEnemy->FVisible( this ) )
{ {
m_flNextAlert -= 0.1; m_flNextAlert -= 0.1;
if (m_idealDist < m_flMaxDist) if( m_idealDist < m_flMaxDist )
{ {
m_idealDist += 4; m_idealDist += 4;
} }
if (m_flightSpeed > m_flMinSpeed)
if( m_flightSpeed > m_flMinSpeed )
{ {
m_flightSpeed -= 2; m_flightSpeed -= 2;
} }
else if (m_flightSpeed < m_flMinSpeed) else if( m_flightSpeed < m_flMinSpeed )
{ {
m_flightSpeed += 2; m_flightSpeed += 2;
} }
if (m_flMinSpeed < m_flMaxSpeed) if( m_flMinSpeed < m_flMaxSpeed )
{ {
m_flMinSpeed += 0.5; m_flMinSpeed += 0.5;
} }
@ -675,11 +677,11 @@ void CIchthyosaur :: RunTask ( Task_t *pTask )
{ {
m_flNextAlert += 0.1; m_flNextAlert += 0.1;
if (m_idealDist > 128) if( m_idealDist > 128 )
{ {
m_idealDist -= 4; m_idealDist -= 4;
} }
if (m_flightSpeed < m_flMaxSpeed) if( m_flightSpeed < m_flMaxSpeed )
{ {
m_flightSpeed += 4; m_flightSpeed += 4;
} }
@ -691,32 +693,31 @@ void CIchthyosaur :: RunTask ( Task_t *pTask )
m_flNextAlert = gpGlobals->time + 0.2; m_flNextAlert = gpGlobals->time + 0.2;
} }
if (m_flNextAlert < gpGlobals->time) if( m_flNextAlert < gpGlobals->time )
{ {
// ALERT( at_console, "AlertSound()\n"); // ALERT( at_console, "AlertSound()\n" );
AlertSound( ); AlertSound();
m_flNextAlert = gpGlobals->time + RANDOM_FLOAT( 3, 5 ); m_flNextAlert = gpGlobals->time + RANDOM_FLOAT( 3, 5 );
} }
break; break;
case TASK_ICHTHYOSAUR_SWIM: case TASK_ICHTHYOSAUR_SWIM:
if (m_fSequenceFinished) if( m_fSequenceFinished )
{ {
TaskComplete( ); TaskComplete();
} }
break; break;
case TASK_DIE: case TASK_DIE:
if ( m_fSequenceFinished ) if( m_fSequenceFinished )
{ {
pev->deadflag = DEAD_DEAD; pev->deadflag = DEAD_DEAD;
TaskComplete( ); TaskComplete();
} }
break; break;
case TASK_ICHTHYOSAUR_FLOAT: case TASK_ICHTHYOSAUR_FLOAT:
pev->angles.x = UTIL_ApproachAngle( 0, pev->angles.x, 20 ); pev->angles.x = UTIL_ApproachAngle( 0, pev->angles.x, 20 );
pev->velocity = pev->velocity * 0.8; pev->velocity = pev->velocity * 0.8;
if (pev->waterlevel > 1 && pev->velocity.z < 64) if( pev->waterlevel > 1 && pev->velocity.z < 64 )
{ {
pev->velocity.z += 8; pev->velocity.z += 8;
} }
@ -727,7 +728,7 @@ void CIchthyosaur :: RunTask ( Task_t *pTask )
// ALERT( at_console, "%f\n", pev->velocity.z ); // ALERT( at_console, "%f\n", pev->velocity.z );
break; break;
default: default:
CFlyingMonster :: RunTask ( pTask ); CFlyingMonster::RunTask( pTask );
break; break;
} }
} }
@ -735,61 +736,61 @@ void CIchthyosaur :: RunTask ( Task_t *pTask )
float CIchthyosaur::VectorToPitch( const Vector &vec ) float CIchthyosaur::VectorToPitch( const Vector &vec )
{ {
float pitch; float pitch;
if (vec.z == 0 && vec.x == 0) if( vec.z == 0 && vec.x == 0 )
pitch = 0; pitch = 0;
else else
{ {
pitch = (int) (atan2(vec.z, sqrt(vec.x*vec.x+vec.y*vec.y)) * 180 / M_PI); pitch = (int) ( atan2( vec.z, sqrt( vec.x * vec.x + vec.y * vec.y ) ) * 180 / M_PI );
if (pitch < 0) if( pitch < 0 )
pitch += 360; pitch += 360;
} }
return pitch; return pitch;
} }
//========================================================= //=========================================================
void CIchthyosaur::Move(float flInterval) void CIchthyosaur::Move( float flInterval )
{ {
CFlyingMonster::Move( flInterval ); CFlyingMonster::Move( flInterval );
} }
float CIchthyosaur::FlPitchDiff( void ) float CIchthyosaur::FlPitchDiff( void )
{ {
float flPitchDiff; float flPitchDiff;
float flCurrentPitch; float flCurrentPitch;
flCurrentPitch = UTIL_AngleMod( pev->angles.z ); flCurrentPitch = UTIL_AngleMod( pev->angles.z );
if ( flCurrentPitch == pev->idealpitch ) if( flCurrentPitch == pev->idealpitch )
{ {
return 0; return 0;
} }
flPitchDiff = pev->idealpitch - flCurrentPitch; flPitchDiff = pev->idealpitch - flCurrentPitch;
if ( pev->idealpitch > flCurrentPitch ) if( pev->idealpitch > flCurrentPitch )
{ {
if (flPitchDiff >= 180) if( flPitchDiff >= 180 )
flPitchDiff = flPitchDiff - 360; flPitchDiff = flPitchDiff - 360;
} }
else else
{ {
if (flPitchDiff <= -180) if( flPitchDiff <= -180 )
flPitchDiff = flPitchDiff + 360; flPitchDiff = flPitchDiff + 360;
} }
return flPitchDiff; return flPitchDiff;
} }
float CIchthyosaur :: ChangePitch( int speed ) float CIchthyosaur::ChangePitch( int speed )
{ {
if ( pev->movetype == MOVETYPE_FLY ) if( pev->movetype == MOVETYPE_FLY )
{ {
float diff = FlPitchDiff(); float diff = FlPitchDiff();
float target = 0; float target = 0;
if ( m_IdealActivity != GetStoppedActivity() ) if( m_IdealActivity != GetStoppedActivity() )
{ {
if (diff < -20) if( diff < -20 )
target = 45; target = 45;
else if (diff > 20) else if( diff > 20 )
target = -45; target = -45;
} }
pev->angles.x = UTIL_Approach(target, pev->angles.x, 220.0 * 0.1 ); pev->angles.x = UTIL_Approach(target, pev->angles.x, 220.0 * 0.1 );
@ -799,16 +800,16 @@ float CIchthyosaur :: ChangePitch( int speed )
float CIchthyosaur::ChangeYaw( int speed ) float CIchthyosaur::ChangeYaw( int speed )
{ {
if ( pev->movetype == MOVETYPE_FLY ) if( pev->movetype == MOVETYPE_FLY )
{ {
float diff = FlYawDiff(); float diff = FlYawDiff();
float target = 0; float target = 0;
if ( m_IdealActivity != GetStoppedActivity() ) if( m_IdealActivity != GetStoppedActivity() )
{ {
if ( diff < -20 ) if( diff < -20 )
target = 20; target = 20;
else if ( diff > 20 ) else if( diff > 20 )
target = -20; target = -20;
} }
pev->angles.z = UTIL_Approach( target, pev->angles.z, 220.0 * 0.1 ); pev->angles.z = UTIL_Approach( target, pev->angles.z, 220.0 * 0.1 );
@ -816,9 +817,9 @@ float CIchthyosaur::ChangeYaw( int speed )
return CFlyingMonster::ChangeYaw( speed ); return CFlyingMonster::ChangeYaw( speed );
} }
Activity CIchthyosaur:: GetStoppedActivity( void ) Activity CIchthyosaur::GetStoppedActivity( void )
{ {
if ( pev->movetype != MOVETYPE_FLY ) // UNDONE: Ground idle here, IDLE may be something else if( pev->movetype != MOVETYPE_FLY ) // UNDONE: Ground idle here, IDLE may be something else
return ACT_IDLE; return ACT_IDLE;
return ACT_WALK; return ACT_WALK;
} }
@ -828,24 +829,24 @@ void CIchthyosaur::MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, f
m_SaveVelocity = vecDir * m_flightSpeed; m_SaveVelocity = vecDir * m_flightSpeed;
} }
void CIchthyosaur::MonsterThink ( void ) void CIchthyosaur::MonsterThink( void )
{ {
CFlyingMonster::MonsterThink( ); CFlyingMonster::MonsterThink();
if (pev->deadflag == DEAD_NO) if( pev->deadflag == DEAD_NO )
{ {
if (m_MonsterState != MONSTERSTATE_SCRIPT) if( m_MonsterState != MONSTERSTATE_SCRIPT )
{ {
Swim( ); Swim();
// blink the eye // blink the eye
if (m_flBlink < gpGlobals->time) if( m_flBlink < gpGlobals->time )
{ {
pev->skin = EYE_CLOSED; pev->skin = EYE_CLOSED;
if (m_flBlink + 0.2 < gpGlobals->time) if( m_flBlink + 0.2 < gpGlobals->time )
{ {
m_flBlink = gpGlobals->time + RANDOM_FLOAT( 3, 4 ); m_flBlink = gpGlobals->time + RANDOM_FLOAT( 3, 4 );
if (m_bOnAttack) if( m_bOnAttack )
pev->skin = EYE_MAD; pev->skin = EYE_MAD;
else else
pev->skin = EYE_BASE; pev->skin = EYE_BASE;
@ -855,13 +856,13 @@ void CIchthyosaur::MonsterThink ( void )
} }
} }
void CIchthyosaur :: Stop( void ) void CIchthyosaur::Stop( void )
{ {
if (!m_bOnAttack) if( !m_bOnAttack )
m_flightSpeed = 80.0; m_flightSpeed = 80.0;
} }
void CIchthyosaur::Swim( ) void CIchthyosaur::Swim()
{ {
int retValue = 0; int retValue = 0;
@ -870,45 +871,45 @@ void CIchthyosaur::Swim( )
Vector Angles; Vector Angles;
Vector Forward, Right, Up; Vector Forward, Right, Up;
if (FBitSet( pev->flags, FL_ONGROUND)) if( FBitSet( pev->flags, FL_ONGROUND ) )
{ {
pev->angles.x = 0; pev->angles.x = 0;
pev->angles.y += RANDOM_FLOAT( -45, 45 ); pev->angles.y += RANDOM_FLOAT( -45, 45 );
ClearBits( pev->flags, FL_ONGROUND ); ClearBits( pev->flags, FL_ONGROUND );
Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z );
UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); UTIL_MakeVectorsPrivate( Angles, Forward, Right, Up );
pev->velocity = Forward * 200 + Up * 200; pev->velocity = Forward * 200 + Up * 200;
return; return;
} }
if (m_bOnAttack && m_flightSpeed < m_flMaxSpeed) if( m_bOnAttack && m_flightSpeed < m_flMaxSpeed )
{ {
m_flightSpeed += 40; m_flightSpeed += 40;
} }
if (m_flightSpeed < 180) if( m_flightSpeed < 180 )
{ {
if (m_IdealActivity == ACT_RUN) if( m_IdealActivity == ACT_RUN )
SetActivity( ACT_WALK ); SetActivity( ACT_WALK );
if (m_IdealActivity == ACT_WALK) if( m_IdealActivity == ACT_WALK )
pev->framerate = m_flightSpeed / 150.0; pev->framerate = m_flightSpeed / 150.0;
// ALERT( at_console, "walk %.2f\n", pev->framerate ); // ALERT( at_console, "walk %.2f\n", pev->framerate );
} }
else else
{ {
if (m_IdealActivity == ACT_WALK) if( m_IdealActivity == ACT_WALK )
SetActivity( ACT_RUN ); SetActivity( ACT_RUN );
if (m_IdealActivity == ACT_RUN) if( m_IdealActivity == ACT_RUN)
pev->framerate = m_flightSpeed / 150.0; pev->framerate = m_flightSpeed / 150.0;
// ALERT( at_console, "run %.2f\n", pev->framerate ); // ALERT( at_console, "run %.2f\n", pev->framerate );
} }
/* /*
if (!m_pBeam) if( !m_pBeam )
{ {
m_pBeam = CBeam::BeamCreate( "sprites/laserbeam.spr", 80 ); m_pBeam = CBeam::BeamCreate( "sprites/laserbeam.spr", 80 );
m_pBeam->PointEntInit( pev->origin + m_SaveVelocity, entindex( ) ); m_pBeam->PointEntInit( pev->origin + m_SaveVelocity, entindex() );
m_pBeam->SetEndAttachment( 1 ); m_pBeam->SetEndAttachment( 1 );
m_pBeam->SetColor( 255, 180, 96 ); m_pBeam->SetColor( 255, 180, 96 );
m_pBeam->SetBrightness( 192 ); m_pBeam->SetBrightness( 192 );
@ -917,27 +918,27 @@ void CIchthyosaur::Swim( )
#define PROBE_LENGTH 150 #define PROBE_LENGTH 150
Angles = UTIL_VecToAngles( m_SaveVelocity ); Angles = UTIL_VecToAngles( m_SaveVelocity );
Angles.x = -Angles.x; Angles.x = -Angles.x;
UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); UTIL_MakeVectorsPrivate( Angles, Forward, Right, Up );
Vector f, u, l, r, d; Vector f, u, l, r, d;
f = DoProbe(start + PROBE_LENGTH * Forward); f = DoProbe( start + PROBE_LENGTH * Forward );
r = DoProbe(start + PROBE_LENGTH/3 * Forward+Right); r = DoProbe( start + PROBE_LENGTH / 3 * Forward + Right );
l = DoProbe(start + PROBE_LENGTH/3 * Forward-Right); l = DoProbe( start + PROBE_LENGTH / 3 * Forward - Right );
u = DoProbe(start + PROBE_LENGTH/3 * Forward+Up); u = DoProbe( start + PROBE_LENGTH / 3 * Forward + Up );
d = DoProbe(start + PROBE_LENGTH/3 * Forward-Up); d = DoProbe( start + PROBE_LENGTH / 3 * Forward - Up );
Vector SteeringVector = f+r+l+u+d; Vector SteeringVector = f + r + l + u + d;
m_SaveVelocity = (m_SaveVelocity + SteeringVector/2).Normalize(); m_SaveVelocity = ( m_SaveVelocity + SteeringVector / 2 ).Normalize();
Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z );
UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); UTIL_MakeVectorsPrivate( Angles, Forward, Right, Up );
// ALERT( at_console, "%f : %f\n", Angles.x, Forward.z ); // ALERT( at_console, "%f : %f\n", Angles.x, Forward.z );
float flDot = DotProduct( Forward, m_SaveVelocity ); float flDot = DotProduct( Forward, m_SaveVelocity );
if (flDot > 0.5) if( flDot > 0.5 )
pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed; pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed;
else if (flDot > 0) else if( flDot > 0 )
pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed * (flDot + 0.5); pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed * ( flDot + 0.5 );
else else
pev->velocity = m_SaveVelocity = m_SaveVelocity * 80; pev->velocity = m_SaveVelocity = m_SaveVelocity * 80;
@ -946,7 +947,7 @@ void CIchthyosaur::Swim( )
// ALERT( at_console, "Steer %f %f %f\n", SteeringVector.x, SteeringVector.y, SteeringVector.z ); // ALERT( at_console, "Steer %f %f %f\n", SteeringVector.x, SteeringVector.y, SteeringVector.z );
/* /*
m_pBeam->SetStartPos( pev->origin + pev->velocity ); m_pBeam->SetStartPos( pev->origin + pev->velocity );
m_pBeam->RelinkBeam( ); m_pBeam->RelinkBeam();
*/ */
// ALERT( at_console, "speed %f\n", m_flightSpeed ); // ALERT( at_console, "speed %f\n", m_flightSpeed );
@ -954,26 +955,28 @@ void CIchthyosaur::Swim( )
// Smooth Pitch // Smooth Pitch
// //
if (Angles.x > 180) if( Angles.x > 180 )
Angles.x = Angles.x - 360; Angles.x = Angles.x - 360;
pev->angles.x = UTIL_Approach(Angles.x, pev->angles.x, 50 * 0.1 ); pev->angles.x = UTIL_Approach( Angles.x, pev->angles.x, 50 * 0.1 );
if (pev->angles.x < -80) pev->angles.x = -80; if( pev->angles.x < -80 )
if (pev->angles.x > 80) pev->angles.x = 80; pev->angles.x = -80;
if( pev->angles.x > 80 )
pev->angles.x = 80;
// Smooth Yaw and generate Roll // Smooth Yaw and generate Roll
// //
float turn = 360; float turn = 360;
// ALERT( at_console, "Y %.0f %.0f\n", Angles.y, pev->angles.y ); // ALERT( at_console, "Y %.0f %.0f\n", Angles.y, pev->angles.y );
if (fabs(Angles.y - pev->angles.y) < fabs(turn)) if( fabs( Angles.y - pev->angles.y ) < fabs( turn ) )
{ {
turn = Angles.y - pev->angles.y; turn = Angles.y - pev->angles.y;
} }
if (fabs(Angles.y - pev->angles.y + 360) < fabs(turn)) if( fabs( Angles.y - pev->angles.y + 360 ) < fabs( turn ) )
{ {
turn = Angles.y - pev->angles.y + 360; turn = Angles.y - pev->angles.y + 360;
} }
if (fabs(Angles.y - pev->angles.y - 360) < fabs(turn)) if( fabs( Angles.y - pev->angles.y - 360 ) < fabs( turn ) )
{ {
turn = Angles.y - pev->angles.y - 360; turn = Angles.y - pev->angles.y - 360;
} }
@ -981,9 +984,9 @@ void CIchthyosaur::Swim( )
float speed = m_flightSpeed * 0.1; float speed = m_flightSpeed * 0.1;
// ALERT( at_console, "speed %.0f %f\n", turn, speed ); // ALERT( at_console, "speed %.0f %f\n", turn, speed );
if (fabs(turn) > speed) if( fabs( turn ) > speed )
{ {
if (turn < 0.0) if( turn < 0.0 )
{ {
turn = -speed; turn = -speed;
} }
@ -994,7 +997,7 @@ void CIchthyosaur::Swim( )
} }
pev->angles.y += turn; pev->angles.y += turn;
pev->angles.z -= turn; pev->angles.z -= turn;
pev->angles.y = fmod((pev->angles.y + 360.0), 360.0); pev->angles.y = fmod( ( pev->angles.y + 360.0 ), 360.0 );
static float yaw_adj; static float yaw_adj;
@ -1007,26 +1010,27 @@ void CIchthyosaur::Swim( )
// Roll Smoothing // Roll Smoothing
// //
turn = 360; turn = 360;
if (fabs(Angles.z - pev->angles.z) < fabs(turn)) if( fabs( Angles.z - pev->angles.z ) < fabs( turn ) )
{ {
turn = Angles.z - pev->angles.z; turn = Angles.z - pev->angles.z;
} }
if (fabs(Angles.z - pev->angles.z + 360) < fabs(turn)) if( fabs( Angles.z - pev->angles.z + 360 ) < fabs( turn ) )
{ {
turn = Angles.z - pev->angles.z + 360; turn = Angles.z - pev->angles.z + 360;
} }
if (fabs(Angles.z - pev->angles.z - 360) < fabs(turn)) if( fabs( Angles.z - pev->angles.z - 360 ) < fabs( turn ) )
{ {
turn = Angles.z - pev->angles.z - 360; turn = Angles.z - pev->angles.z - 360;
} }
speed = m_flightSpeed/2 * 0.1; speed = m_flightSpeed / 2 * 0.1;
if (fabs(turn) < speed)
if( fabs( turn ) < speed )
{ {
pev->angles.z += turn; pev->angles.z += turn;
} }
else else
{ {
if (turn < 0.0) if( turn < 0.0 )
{ {
pev->angles.z -= speed; pev->angles.z -= speed;
} }
@ -1035,27 +1039,32 @@ void CIchthyosaur::Swim( )
pev->angles.z += speed; pev->angles.z += speed;
} }
} }
if (pev->angles.z < -20) pev->angles.z = -20;
if (pev->angles.z > 20) pev->angles.z = 20;
UTIL_MakeVectorsPrivate( Vector( -Angles.x, Angles.y, Angles.z ), Forward, Right, Up); if( pev->angles.z < -20 )
pev->angles.z = -20;
if( pev->angles.z > 20 )
pev->angles.z = 20;
// UTIL_MoveToOrigin ( ENT(pev), pev->origin + Forward * speed, speed, MOVE_STRAFE ); UTIL_MakeVectorsPrivate( Vector( -Angles.x, Angles.y, Angles.z ), Forward, Right, Up );
// UTIL_MoveToOrigin ( ENT( pev ), pev->origin + Forward * speed, speed, MOVE_STRAFE );
} }
Vector CIchthyosaur::DoProbe(const Vector &Probe) Vector CIchthyosaur::DoProbe( const Vector &Probe )
{ {
Vector WallNormal = Vector(0,0,-1); // WATER normal is Straight Down for fish. Vector WallNormal = Vector( 0, 0, -1 ); // WATER normal is Straight Down for fish.
float frac; float frac;
BOOL bBumpedSomething = ProbeZ(pev->origin, Probe, &frac); BOOL bBumpedSomething = ProbeZ( pev->origin, Probe, &frac );
TraceResult tr; TraceResult tr;
TRACE_MONSTER_HULL(edict(), pev->origin, Probe, dont_ignore_monsters, edict(), &tr); TRACE_MONSTER_HULL( edict(), pev->origin, Probe, dont_ignore_monsters, edict(), &tr );
if ( tr.fAllSolid || tr.flFraction < 0.99 ) if( tr.fAllSolid || tr.flFraction < 0.99 )
{ {
if (tr.flFraction < 0.0) tr.flFraction = 0.0; if( tr.flFraction < 0.0 )
if (tr.flFraction > 1.0) tr.flFraction = 1.0; tr.flFraction = 0.0;
if (tr.flFraction < frac) if( tr.flFraction > 1.0 )
tr.flFraction = 1.0;
if( tr.flFraction < frac )
{ {
frac = tr.flFraction; frac = tr.flFraction;
bBumpedSomething = TRUE; bBumpedSomething = TRUE;
@ -1063,15 +1072,15 @@ Vector CIchthyosaur::DoProbe(const Vector &Probe)
} }
} }
if (bBumpedSomething && (m_hEnemy == NULL || tr.pHit != m_hEnemy->edict())) if( bBumpedSomething && ( m_hEnemy == NULL || tr.pHit != m_hEnemy->edict() ) )
{ {
Vector ProbeDir = Probe - pev->origin; Vector ProbeDir = Probe - pev->origin;
Vector NormalToProbeAndWallNormal = CrossProduct(ProbeDir, WallNormal); Vector NormalToProbeAndWallNormal = CrossProduct( ProbeDir, WallNormal );
Vector SteeringVector = CrossProduct( NormalToProbeAndWallNormal, ProbeDir); Vector SteeringVector = CrossProduct( NormalToProbeAndWallNormal, ProbeDir );
float SteeringForce = m_flightSpeed * (1-frac) * (DotProduct(WallNormal.Normalize(), m_SaveVelocity.Normalize())); float SteeringForce = m_flightSpeed * ( 1 -frac ) * ( DotProduct( WallNormal.Normalize(), m_SaveVelocity.Normalize() ) );
if (SteeringForce < 0.0) if( SteeringForce < 0.0 )
{ {
SteeringForce = -SteeringForce; SteeringForce = -SteeringForce;
} }
@ -1079,6 +1088,6 @@ Vector CIchthyosaur::DoProbe(const Vector &Probe)
return SteeringVector; return SteeringVector;
} }
return Vector(0, 0, 0); return Vector( 0, 0, 0 );
} }
#endif #endif

View File

@ -31,13 +31,13 @@ extern DLL_GLOBAL int g_iSkillLevel;
//========================================================= //=========================================================
// Monster's Anim Events Go Here // Monster's Anim Events Go Here
//========================================================= //=========================================================
#define ISLAVE_AE_CLAW ( 1 ) #define ISLAVE_AE_CLAW ( 1 )
#define ISLAVE_AE_CLAWRAKE ( 2 ) #define ISLAVE_AE_CLAWRAKE ( 2 )
#define ISLAVE_AE_ZAP_POWERUP ( 3 ) #define ISLAVE_AE_ZAP_POWERUP ( 3 )
#define ISLAVE_AE_ZAP_SHOOT ( 4 ) #define ISLAVE_AE_ZAP_SHOOT ( 4 )
#define ISLAVE_AE_ZAP_DONE ( 5 ) #define ISLAVE_AE_ZAP_DONE ( 5 )
#define ISLAVE_MAX_BEAMS 8 #define ISLAVE_MAX_BEAMS 8
class CISlave : public CSquadMonster class CISlave : public CSquadMonster
{ {
@ -45,15 +45,15 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int ISoundMask( void ); int ISoundMask( void );
int Classify ( void ); int Classify( void );
int IRelationship( CBaseEntity *pTarget ); int IRelationship( CBaseEntity *pTarget );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
BOOL CheckRangeAttack1 ( float flDot, float flDist ); BOOL CheckRangeAttack1( float flDot, float flDist );
BOOL CheckRangeAttack2 ( float flDot, float flDist ); BOOL CheckRangeAttack2( float flDot, float flDist );
void CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation ); void CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType );
int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType); int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType );
void DeathSound( void ); void DeathSound( void );
void PainSound( void ); void PainSound( void );
@ -62,16 +62,16 @@ public:
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
void StartTask ( Task_t *pTask ); void StartTask( Task_t *pTask );
Schedule_t *GetSchedule( void ); Schedule_t *GetSchedule( void );
Schedule_t *GetScheduleOfType ( int Type ); Schedule_t *GetScheduleOfType( int Type );
CUSTOM_SCHEDULES CUSTOM_SCHEDULES
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void ClearBeams( ); void ClearBeams();
void ArmBeam( int side ); void ArmBeam( int side );
void WackBeam( int side, CBaseEntity *pEntity ); void WackBeam( int side, CBaseEntity *pEntity );
void ZapBeam( int side ); void ZapBeam( int side );
@ -84,7 +84,7 @@ public:
int m_iBeams; int m_iBeams;
float m_flNextAttack; float m_flNextAttack;
int m_voicePitch; int m_voicePitch;
EHANDLE m_hDead; EHANDLE m_hDead;
@ -97,7 +97,7 @@ public:
LINK_ENTITY_TO_CLASS( monster_alien_slave, CISlave ) LINK_ENTITY_TO_CLASS( monster_alien_slave, CISlave )
LINK_ENTITY_TO_CLASS( monster_vortigaunt, CISlave ) LINK_ENTITY_TO_CLASS( monster_vortigaunt, CISlave )
TYPEDESCRIPTION CISlave::m_SaveData[] = TYPEDESCRIPTION CISlave::m_SaveData[] =
{ {
DEFINE_FIELD( CISlave, m_iBravery, FIELD_INTEGER ), DEFINE_FIELD( CISlave, m_iBravery, FIELD_INTEGER ),
@ -142,36 +142,36 @@ const char *CISlave::pDeathSounds[] =
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CISlave :: Classify ( void ) int CISlave::Classify( void )
{ {
return CLASS_ALIEN_MILITARY; return CLASS_ALIEN_MILITARY;
} }
int CISlave::IRelationship( CBaseEntity *pTarget ) int CISlave::IRelationship( CBaseEntity *pTarget )
{ {
if ( (pTarget->IsPlayer()) ) if( ( pTarget->IsPlayer() ) )
if ( (pev->spawnflags & SF_MONSTER_WAIT_UNTIL_PROVOKED ) && ! (m_afMemory & bits_MEMORY_PROVOKED )) if( ( pev->spawnflags & SF_MONSTER_WAIT_UNTIL_PROVOKED ) && ! ( m_afMemory & bits_MEMORY_PROVOKED ) )
return R_NO; return R_NO;
return CBaseMonster::IRelationship( pTarget ); return CBaseMonster::IRelationship( pTarget );
} }
void CISlave :: CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation ) void CISlave::CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation )
{ {
// ALERT( at_aiconsole, "help " ); // ALERT( at_aiconsole, "help " );
// skip ones not on my netname // skip ones not on my netname
if ( FStringNull( pev->netname )) if( FStringNull( pev->netname ) )
return; return;
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
while ((pEntity = UTIL_FindEntityByString( pEntity, "netname", STRING( pev->netname ))) != NULL) while( ( pEntity = UTIL_FindEntityByString( pEntity, "netname", STRING( pev->netname ) ) ) != NULL)
{ {
float d = (pev->origin - pEntity->pev->origin).Length(); float d = ( pev->origin - pEntity->pev->origin ).Length();
if (d < flDist) if( d < flDist )
{ {
CBaseMonster *pMonster = pEntity->MyMonsterPointer( ); CBaseMonster *pMonster = pEntity->MyMonsterPointer();
if (pMonster) if( pMonster )
{ {
pMonster->m_afMemory |= bits_MEMORY_PROVOKED; pMonster->m_afMemory |= bits_MEMORY_PROVOKED;
pMonster->PushEnemy( hEnemy, vecLocation ); pMonster->PushEnemy( hEnemy, vecLocation );
@ -183,11 +183,11 @@ void CISlave :: CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Ve
//========================================================= //=========================================================
// ALertSound - scream // ALertSound - scream
//========================================================= //=========================================================
void CISlave :: AlertSound( void ) void CISlave::AlertSound( void )
{ {
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
SENTENCEG_PlayRndSz(ENT(pev), "SLV_ALERT", 0.85, ATTN_NORM, 0, m_voicePitch); SENTENCEG_PlayRndSz( ENT( pev ), "SLV_ALERT", 0.85, ATTN_NORM, 0, m_voicePitch );
CallForHelp( "monster_alien_slave", 512, m_hEnemy, m_vecEnemyLKP ); CallForHelp( "monster_alien_slave", 512, m_hEnemy, m_vecEnemyLKP );
} }
@ -196,72 +196,71 @@ void CISlave :: AlertSound( void )
//========================================================= //=========================================================
// IdleSound // IdleSound
//========================================================= //=========================================================
void CISlave :: IdleSound( void ) void CISlave::IdleSound( void )
{ {
if (RANDOM_LONG( 0, 2 ) == 0) if( RANDOM_LONG( 0, 2 ) == 0 )
{ {
SENTENCEG_PlayRndSz(ENT(pev), "SLV_IDLE", 0.85, ATTN_NORM, 0, m_voicePitch); SENTENCEG_PlayRndSz( ENT( pev ), "SLV_IDLE", 0.85, ATTN_NORM, 0, m_voicePitch );
} }
#if 0 #if 0
int side = RANDOM_LONG( 0, 1 ) * 2 - 1; int side = RANDOM_LONG( 0, 1 ) * 2 - 1;
ClearBeams( ); ClearBeams();
ArmBeam( side ); ArmBeam( side );
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
Vector vecSrc = pev->origin + gpGlobals->v_right * 2 * side; Vector vecSrc = pev->origin + gpGlobals->v_right * 2 * side;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
WRITE_BYTE(TE_DLIGHT); WRITE_BYTE( TE_DLIGHT );
WRITE_COORD(vecSrc.x); // X WRITE_COORD( vecSrc.x ); // X
WRITE_COORD(vecSrc.y); // Y WRITE_COORD( vecSrc.y ); // Y
WRITE_COORD(vecSrc.z); // Z WRITE_COORD( vecSrc.z ); // Z
WRITE_BYTE( 8 ); // radius * 0.1 WRITE_BYTE( 8 ); // radius * 0.1
WRITE_BYTE( 255 ); // r WRITE_BYTE( 255 ); // r
WRITE_BYTE( 180 ); // g WRITE_BYTE( 180 ); // g
WRITE_BYTE( 96 ); // b WRITE_BYTE( 96 ); // b
WRITE_BYTE( 10 ); // time * 10 WRITE_BYTE( 10 ); // time * 10
WRITE_BYTE( 0 ); // decay * 0.1 WRITE_BYTE( 0 ); // decay * 0.1
MESSAGE_END( ); MESSAGE_END();
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "debris/zap1.wav", 1, ATTN_NORM, 0, 100 ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "debris/zap1.wav", 1, ATTN_NORM, 0, 100 );
#endif #endif
} }
//========================================================= //=========================================================
// PainSound // PainSound
//========================================================= //=========================================================
void CISlave :: PainSound( void ) void CISlave::PainSound( void )
{ {
if (RANDOM_LONG( 0, 2 ) == 0) if( RANDOM_LONG( 0, 2 ) == 0 )
{ {
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pPainSounds[ RANDOM_LONG(0,ARRAYSIZE(pPainSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, pPainSounds[RANDOM_LONG( 0, ARRAYSIZE( pPainSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
} }
//========================================================= //=========================================================
// DieSound // DieSound
//========================================================= //=========================================================
void CISlave::DeathSound( void )
void CISlave :: DeathSound( void )
{ {
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pDeathSounds[ RANDOM_LONG(0,ARRAYSIZE(pDeathSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, pDeathSounds[RANDOM_LONG( 0, ARRAYSIZE( pDeathSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
//========================================================= //=========================================================
// ISoundMask - returns a bit mask indicating which types // ISoundMask - returns a bit mask indicating which types
// of sounds this monster regards. // of sounds this monster regards.
//========================================================= //=========================================================
int CISlave :: ISoundMask ( void) int CISlave::ISoundMask( void )
{ {
return bits_SOUND_WORLD | return bits_SOUND_WORLD |
bits_SOUND_COMBAT | bits_SOUND_COMBAT |
bits_SOUND_DANGER | bits_SOUND_DANGER |
bits_SOUND_PLAYER; bits_SOUND_PLAYER;
} }
void CISlave::Killed( entvars_t *pevAttacker, int iGib ) void CISlave::Killed( entvars_t *pevAttacker, int iGib )
{ {
ClearBeams( ); ClearBeams();
CSquadMonster::Killed( pevAttacker, iGib ); CSquadMonster::Killed( pevAttacker, iGib );
} }
@ -269,11 +268,11 @@ void CISlave::Killed( entvars_t *pevAttacker, int iGib )
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CISlave :: SetYawSpeed ( void ) void CISlave::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_WALK: case ACT_WALK:
ys = 50; ys = 50;
@ -298,7 +297,7 @@ void CISlave :: SetYawSpeed ( void )
// //
// Returns number of events handled, 0 if none. // Returns number of events handled, 0 if none.
//========================================================= //=========================================================
void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent ) void CISlave::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
// ALERT( at_console, "event %d : %f\n", pEvent->event, pev->frame ); // ALERT( at_console, "event %d : %f\n", pEvent->event, pev->frame );
switch( pEvent->event ) switch( pEvent->event )
@ -307,67 +306,66 @@ void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
// SOUND HERE! // SOUND HERE!
CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.slaveDmgClaw, DMG_SLASH ); CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.slaveDmgClaw, DMG_SLASH );
if ( pHurt ) if( pHurt )
{ {
if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) if( pHurt->pev->flags & ( FL_MONSTER | FL_CLIENT ) )
{ {
pHurt->pev->punchangle.z = -18; pHurt->pev->punchangle.z = -18;
pHurt->pev->punchangle.x = 5; pHurt->pev->punchangle.x = 5;
} }
// Play a random attack hit sound // Play a random attack hit sound
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, pAttackHitSounds[RANDOM_LONG( 0, ARRAYSIZE( pAttackHitSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
else else
{ {
// Play a random attack miss sound // Play a random attack miss sound
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, pAttackMissSounds[RANDOM_LONG( 0, ARRAYSIZE( pAttackMissSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
} }
break; break;
case ISLAVE_AE_CLAWRAKE: case ISLAVE_AE_CLAWRAKE:
{ {
CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.slaveDmgClawrake, DMG_SLASH ); CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.slaveDmgClawrake, DMG_SLASH );
if ( pHurt ) if( pHurt )
{ {
if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) if( pHurt->pev->flags & ( FL_MONSTER | FL_CLIENT ) )
{ {
pHurt->pev->punchangle.z = -18; pHurt->pev->punchangle.z = -18;
pHurt->pev->punchangle.x = 5; pHurt->pev->punchangle.x = 5;
} }
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, pAttackHitSounds[RANDOM_LONG( 0, ARRAYSIZE( pAttackHitSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
else else
{ {
EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, m_voicePitch ); EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, pAttackMissSounds[RANDOM_LONG( 0, ARRAYSIZE( pAttackMissSounds ) - 1 )], 1.0, ATTN_NORM, 0, m_voicePitch );
} }
} }
break; break;
case ISLAVE_AE_ZAP_POWERUP: case ISLAVE_AE_ZAP_POWERUP:
{ {
// speed up attack when on hard // speed up attack when on hard
if (g_iSkillLevel == SKILL_HARD) if( g_iSkillLevel == SKILL_HARD )
pev->framerate = 1.5; pev->framerate = 1.5;
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
if (m_iBeams == 0) if( m_iBeams == 0 )
{ {
Vector vecSrc = pev->origin + gpGlobals->v_forward * 2; Vector vecSrc = pev->origin + gpGlobals->v_forward * 2;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
WRITE_BYTE(TE_DLIGHT); WRITE_BYTE( TE_DLIGHT );
WRITE_COORD(vecSrc.x); // X WRITE_COORD( vecSrc.x ); // X
WRITE_COORD(vecSrc.y); // Y WRITE_COORD( vecSrc.y ); // Y
WRITE_COORD(vecSrc.z); // Z WRITE_COORD( vecSrc.z ); // Z
WRITE_BYTE( 12 ); // radius * 0.1 WRITE_BYTE( 12 ); // radius * 0.1
WRITE_BYTE( 255 ); // r WRITE_BYTE( 255 ); // r
WRITE_BYTE( 180 ); // g WRITE_BYTE( 180 ); // g
WRITE_BYTE( 96 ); // b WRITE_BYTE( 96 ); // b
WRITE_BYTE( 20 / pev->framerate ); // time * 10 WRITE_BYTE( 20 / pev->framerate ); // time * 10
WRITE_BYTE( 0 ); // decay * 0.1 WRITE_BYTE( 0 ); // decay * 0.1
MESSAGE_END( ); MESSAGE_END();
} }
if (m_hDead != NULL) if( m_hDead != NULL )
{ {
WackBeam( -1, m_hDead ); WackBeam( -1, m_hDead );
WackBeam( 1, m_hDead ); WackBeam( 1, m_hDead );
@ -376,24 +374,24 @@ void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
ArmBeam( -1 ); ArmBeam( -1 );
ArmBeam( 1 ); ArmBeam( 1 );
BeamGlow( ); BeamGlow();
} }
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10 ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10 );
pev->skin = m_iBeams / 2; pev->skin = m_iBeams / 2;
} }
break; break;
case ISLAVE_AE_ZAP_SHOOT: case ISLAVE_AE_ZAP_SHOOT:
{ {
ClearBeams( ); ClearBeams();
if (m_hDead != NULL) if( m_hDead != NULL )
{ {
Vector vecDest = m_hDead->pev->origin + Vector( 0, 0, 38 ); Vector vecDest = m_hDead->pev->origin + Vector( 0, 0, 38 );
TraceResult trace; TraceResult trace;
UTIL_TraceHull( vecDest, vecDest, dont_ignore_monsters, human_hull, m_hDead->edict(), &trace ); UTIL_TraceHull( vecDest, vecDest, dont_ignore_monsters, human_hull, m_hDead->edict(), &trace );
if ( !trace.fStartSolid ) if( !trace.fStartSolid )
{ {
CBaseEntity *pNew = Create( "monster_alien_slave", m_hDead->pev->origin, m_hDead->pev->angles ); CBaseEntity *pNew = Create( "monster_alien_slave", m_hDead->pev->origin, m_hDead->pev->angles );
CBaseMonster *pNewMonster = pNew->MyMonsterPointer( ); CBaseMonster *pNewMonster = pNew->MyMonsterPointer( );
@ -401,7 +399,7 @@ void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent )
WackBeam( -1, pNew ); WackBeam( -1, pNew );
WackBeam( 1, pNew ); WackBeam( 1, pNew );
UTIL_Remove( m_hDead ); UTIL_Remove( m_hDead );
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) );
/* /*
CBaseEntity *pEffect = Create( "test_effect", pNew->Center(), pev->angles ); CBaseEntity *pEffect = Create( "test_effect", pNew->Center(), pev->angles );
pEffect->Use( this, this, USE_ON, 1 ); pEffect->Use( this, this, USE_ON, 1 );
@ -416,16 +414,16 @@ void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent )
ZapBeam( -1 ); ZapBeam( -1 );
ZapBeam( 1 ); ZapBeam( 1 );
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) );
// STOP_SOUND( ENT(pev), CHAN_WEAPON, "debris/zap4.wav" ); // STOP_SOUND( ENT( pev ), CHAN_WEAPON, "debris/zap4.wav" );
ApplyMultiDamage(pev, pev); ApplyMultiDamage( pev, pev );
m_flNextAttack = gpGlobals->time + RANDOM_FLOAT( 0.5, 4.0 ); m_flNextAttack = gpGlobals->time + RANDOM_FLOAT( 0.5, 4.0 );
} }
break; break;
case ISLAVE_AE_ZAP_DONE: case ISLAVE_AE_ZAP_DONE:
{ {
ClearBeams( ); ClearBeams();
} }
break; break;
default: default:
@ -437,9 +435,9 @@ void CISlave :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// CheckRangeAttack1 - normal beam attack // CheckRangeAttack1 - normal beam attack
//========================================================= //=========================================================
BOOL CISlave :: CheckRangeAttack1 ( float flDot, float flDist ) BOOL CISlave::CheckRangeAttack1( float flDot, float flDist )
{ {
if (m_flNextAttack > gpGlobals->time) if( m_flNextAttack > gpGlobals->time )
{ {
return FALSE; return FALSE;
} }
@ -450,11 +448,11 @@ BOOL CISlave :: CheckRangeAttack1 ( float flDot, float flDist )
//========================================================= //=========================================================
// CheckRangeAttack2 - check bravery and try to resurect dead comrades // CheckRangeAttack2 - check bravery and try to resurect dead comrades
//========================================================= //=========================================================
BOOL CISlave :: CheckRangeAttack2 ( float flDot, float flDist ) BOOL CISlave::CheckRangeAttack2( float flDot, float flDist )
{ {
return FALSE; return FALSE;
if (m_flNextAttack > gpGlobals->time) if( m_flNextAttack > gpGlobals->time )
{ {
return FALSE; return FALSE;
} }
@ -463,17 +461,17 @@ BOOL CISlave :: CheckRangeAttack2 ( float flDot, float flDist )
m_iBravery = 0; m_iBravery = 0;
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "monster_alien_slave" )) != NULL) while( ( pEntity = UTIL_FindEntityByClassname( pEntity, "monster_alien_slave" ) ) != NULL )
{ {
TraceResult tr; TraceResult tr;
UTIL_TraceLine( EyePosition( ), pEntity->EyePosition( ), ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( EyePosition(), pEntity->EyePosition(), ignore_monsters, ENT( pev ), &tr );
if (tr.flFraction == 1.0 || tr.pHit == pEntity->edict()) if( tr.flFraction == 1.0 || tr.pHit == pEntity->edict() )
{ {
if (pEntity->pev->deadflag == DEAD_DEAD) if( pEntity->pev->deadflag == DEAD_DEAD )
{ {
float d = (pev->origin - pEntity->pev->origin).Length(); float d = ( pev->origin - pEntity->pev->origin ).Length();
if (d < flDist) if( d < flDist )
{ {
m_hDead = pEntity; m_hDead = pEntity;
flDist = d; flDist = d;
@ -486,7 +484,7 @@ BOOL CISlave :: CheckRangeAttack2 ( float flDot, float flDist )
} }
} }
} }
if (m_hDead != NULL) if( m_hDead != NULL )
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@ -495,29 +493,29 @@ BOOL CISlave :: CheckRangeAttack2 ( float flDot, float flDist )
//========================================================= //=========================================================
// StartTask // StartTask
//========================================================= //=========================================================
void CISlave :: StartTask ( Task_t *pTask ) void CISlave::StartTask( Task_t *pTask )
{ {
ClearBeams( ); ClearBeams();
CSquadMonster :: StartTask ( pTask ); CSquadMonster::StartTask( pTask );
} }
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CISlave :: Spawn() void CISlave::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/islave.mdl"); SET_MODEL( ENT( pev ), "models/islave.mdl" );
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_GREEN; m_bloodColor = BLOOD_COLOR_GREEN;
pev->effects = 0; pev->effects = 0;
pev->health = gSkillData.slaveHealth; pev->health = gSkillData.slaveHealth;
pev->view_ofs = Vector ( 0, 0, 64 );// position of the eyes relative to monster's origin. pev->view_ofs = Vector( 0, 0, 64 );// position of the eyes relative to monster's origin.
m_flFieldOfView = VIEW_FIELD_WIDE; // NOTE: we need a wide field of view so npc will notice player and say hello m_flFieldOfView = VIEW_FIELD_WIDE; // NOTE: we need a wide field of view so npc will notice player and say hello
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_RANGE_ATTACK2 | bits_CAP_DOORS_GROUP; m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_RANGE_ATTACK2 | bits_CAP_DOORS_GROUP;
@ -530,52 +528,52 @@ void CISlave :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CISlave :: Precache() void CISlave::Precache()
{ {
int i; int i;
PRECACHE_MODEL("models/islave.mdl"); PRECACHE_MODEL( "models/islave.mdl" );
PRECACHE_MODEL("sprites/lgtning.spr"); PRECACHE_MODEL( "sprites/lgtning.spr" );
PRECACHE_SOUND("debris/zap1.wav"); PRECACHE_SOUND( "debris/zap1.wav" );
PRECACHE_SOUND("debris/zap4.wav"); PRECACHE_SOUND( "debris/zap4.wav" );
PRECACHE_SOUND("weapons/electro4.wav"); PRECACHE_SOUND( "weapons/electro4.wav" );
PRECACHE_SOUND("hassault/hw_shoot1.wav"); PRECACHE_SOUND( "hassault/hw_shoot1.wav" );
PRECACHE_SOUND("zombie/zo_pain2.wav"); PRECACHE_SOUND( "zombie/zo_pain2.wav" );
PRECACHE_SOUND("headcrab/hc_headbite.wav"); PRECACHE_SOUND( "headcrab/hc_headbite.wav" );
PRECACHE_SOUND("weapons/cbar_miss1.wav"); PRECACHE_SOUND( "weapons/cbar_miss1.wav" );
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ ) for( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
PRECACHE_SOUND((char *)pAttackHitSounds[i]); PRECACHE_SOUND( (char *)pAttackHitSounds[i] );
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ ) for( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
PRECACHE_SOUND((char *)pAttackMissSounds[i]); PRECACHE_SOUND( (char *)pAttackMissSounds[i] );
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
PRECACHE_SOUND((char *)pPainSounds[i]); PRECACHE_SOUND((char *)pPainSounds[i] );
for ( i = 0; i < ARRAYSIZE( pDeathSounds ); i++ ) for( i = 0; i < ARRAYSIZE( pDeathSounds ); i++ )
PRECACHE_SOUND((char *)pDeathSounds[i]); PRECACHE_SOUND( (char *)pDeathSounds[i] );
UTIL_PrecacheOther( "test_effect" ); UTIL_PrecacheOther( "test_effect" );
} }
//========================================================= //=========================================================
// TakeDamage - get provoked when injured // TakeDamage - get provoked when injured
//========================================================= //=========================================================
int CISlave :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType) int CISlave::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
// don't slash one of your own // don't slash one of your own
if ((bitsDamageType & DMG_SLASH) && pevAttacker && IRelationship( Instance(pevAttacker) ) < R_DL) if( ( bitsDamageType & DMG_SLASH ) && pevAttacker && IRelationship( Instance( pevAttacker ) ) < R_DL )
return 0; return 0;
m_afMemory |= bits_MEMORY_PROVOKED; m_afMemory |= bits_MEMORY_PROVOKED;
return CSquadMonster::TakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType); return CSquadMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
} }
void CISlave::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) void CISlave::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
{ {
if (bitsDamageType & DMG_SHOCK) if( bitsDamageType & DMG_SHOCK )
return; return;
CSquadMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType ); CSquadMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType );
@ -616,49 +614,49 @@ IMPLEMENT_CUSTOM_SCHEDULES( CISlave, CSquadMonster )
//========================================================= //=========================================================
//========================================================= //=========================================================
Schedule_t *CISlave :: GetSchedule( void ) Schedule_t *CISlave::GetSchedule( void )
{ {
ClearBeams( ); ClearBeams();
/* /*
if (pev->spawnflags) if( pev->spawnflags )
{ {
pev->spawnflags = 0; pev->spawnflags = 0;
return GetScheduleOfType( SCHED_RELOAD ); return GetScheduleOfType( SCHED_RELOAD );
} }
*/ */
if ( HasConditions( bits_COND_HEAR_SOUND ) ) if( HasConditions( bits_COND_HEAR_SOUND ) )
{ {
CSound *pSound; CSound *pSound;
pSound = PBestSound(); pSound = PBestSound();
ASSERT( pSound != NULL ); ASSERT( pSound != NULL );
if ( pSound && (pSound->m_iType & bits_SOUND_DANGER) ) if( pSound && ( pSound->m_iType & bits_SOUND_DANGER ) )
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_BEST_SOUND ); return GetScheduleOfType( SCHED_TAKE_COVER_FROM_BEST_SOUND );
if ( pSound->m_iType & bits_SOUND_COMBAT ) if( pSound->m_iType & bits_SOUND_COMBAT )
m_afMemory |= bits_MEMORY_PROVOKED; m_afMemory |= bits_MEMORY_PROVOKED;
} }
switch (m_MonsterState) switch( m_MonsterState )
{ {
case MONSTERSTATE_COMBAT: case MONSTERSTATE_COMBAT:
// dead enemy // dead enemy
if ( HasConditions( bits_COND_ENEMY_DEAD ) ) if( HasConditions( bits_COND_ENEMY_DEAD ) )
{ {
// call base class, all code to handle dead enemies is centralized there. // call base class, all code to handle dead enemies is centralized there.
return CBaseMonster :: GetSchedule(); return CBaseMonster::GetSchedule();
} }
if (pev->health < 20 || m_iBravery < 0) if( pev->health < 20 || m_iBravery < 0 )
{ {
if (!HasConditions( bits_COND_CAN_MELEE_ATTACK1 )) if( !HasConditions( bits_COND_CAN_MELEE_ATTACK1 ) )
{ {
m_failSchedule = SCHED_CHASE_ENEMY; m_failSchedule = SCHED_CHASE_ENEMY;
if (HasConditions( bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE)) if( HasConditions( bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE ) )
{ {
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY ); return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
} }
if ( HasConditions ( bits_COND_SEE_ENEMY ) && HasConditions ( bits_COND_ENEMY_FACING_ME ) ) if( HasConditions( bits_COND_SEE_ENEMY ) && HasConditions( bits_COND_ENEMY_FACING_ME ) )
{ {
// ALERT( at_console, "exposed\n"); // ALERT( at_console, "exposed\n");
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY ); return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
@ -669,17 +667,17 @@ Schedule_t *CISlave :: GetSchedule( void )
default: default:
break; break;
} }
return CSquadMonster::GetSchedule( ); return CSquadMonster::GetSchedule();
} }
Schedule_t *CISlave :: GetScheduleOfType ( int Type ) Schedule_t *CISlave::GetScheduleOfType( int Type )
{ {
switch( Type ) switch( Type )
{ {
case SCHED_FAIL: case SCHED_FAIL:
if (HasConditions( bits_COND_CAN_MELEE_ATTACK1 )) if( HasConditions( bits_COND_CAN_MELEE_ATTACK1 ) )
{ {
return CSquadMonster :: GetScheduleOfType( SCHED_MELEE_ATTACK1 ); ; return CSquadMonster::GetScheduleOfType( SCHED_MELEE_ATTACK1 );
} }
break; break;
case SCHED_RANGE_ATTACK1: case SCHED_RANGE_ATTACK1:
@ -687,30 +685,29 @@ Schedule_t *CISlave :: GetScheduleOfType ( int Type )
case SCHED_RANGE_ATTACK2: case SCHED_RANGE_ATTACK2:
return slSlaveAttack1; return slSlaveAttack1;
} }
return CSquadMonster :: GetScheduleOfType( Type ); return CSquadMonster::GetScheduleOfType( Type );
} }
//========================================================= //=========================================================
// ArmBeam - small beam from arm to nearby geometry // ArmBeam - small beam from arm to nearby geometry
//========================================================= //=========================================================
void CISlave::ArmBeam( int side )
void CISlave :: ArmBeam( int side )
{ {
TraceResult tr; TraceResult tr;
float flDist = 1.0; float flDist = 1.0;
if (m_iBeams >= ISLAVE_MAX_BEAMS) if( m_iBeams >= ISLAVE_MAX_BEAMS )
return; return;
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
Vector vecSrc = pev->origin + gpGlobals->v_up * 36 + gpGlobals->v_right * side * 16 + gpGlobals->v_forward * 32; Vector vecSrc = pev->origin + gpGlobals->v_up * 36 + gpGlobals->v_right * side * 16 + gpGlobals->v_forward * 32;
for (int i = 0; i < 3; i++) for( int i = 0; i < 3; i++ )
{ {
Vector vecAim = gpGlobals->v_right * side * RANDOM_FLOAT( 0, 1 ) + gpGlobals->v_up * RANDOM_FLOAT( -1, 1 ); Vector vecAim = gpGlobals->v_right * side * RANDOM_FLOAT( 0, 1 ) + gpGlobals->v_up * RANDOM_FLOAT( -1, 1 );
TraceResult tr1; TraceResult tr1;
UTIL_TraceLine ( vecSrc, vecSrc + vecAim * 512, dont_ignore_monsters, ENT( pev ), &tr1); UTIL_TraceLine( vecSrc, vecSrc + vecAim * 512, dont_ignore_monsters, ENT( pev ), &tr1 );
if (flDist > tr1.flFraction) if( flDist > tr1.flFraction )
{ {
tr = tr1; tr = tr1;
flDist = tr.flFraction; flDist = tr.flFraction;
@ -718,16 +715,16 @@ void CISlave :: ArmBeam( int side )
} }
// Couldn't find anything close enough // Couldn't find anything close enough
if ( flDist == 1.0 ) if( flDist == 1.0 )
return; return;
DecalGunshot( &tr, BULLET_PLAYER_CROWBAR ); DecalGunshot( &tr, BULLET_PLAYER_CROWBAR );
m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 30 ); m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
if (!m_pBeam[m_iBeams]) if( !m_pBeam[m_iBeams] )
return; return;
m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, entindex( ) ); m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, entindex() );
m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 ); m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 );
// m_pBeam[m_iBeams]->SetColor( 180, 255, 96 ); // m_pBeam[m_iBeams]->SetColor( 180, 255, 96 );
m_pBeam[m_iBeams]->SetColor( 96, 128, 16 ); m_pBeam[m_iBeams]->SetColor( 96, 128, 16 );
@ -739,15 +736,15 @@ void CISlave :: ArmBeam( int side )
//========================================================= //=========================================================
// BeamGlow - brighten all beams // BeamGlow - brighten all beams
//========================================================= //=========================================================
void CISlave :: BeamGlow( ) void CISlave::BeamGlow()
{ {
int b = m_iBeams * 32; int b = m_iBeams * 32;
if (b > 255) if( b > 255 )
b = 255; b = 255;
for (int i = 0; i < m_iBeams; i++) for( int i = 0; i < m_iBeams; i++ )
{ {
if (m_pBeam[i]->GetBrightness() != 255) if( m_pBeam[i]->GetBrightness() != 255 )
{ {
m_pBeam[i]->SetBrightness( b ); m_pBeam[i]->SetBrightness( b );
} }
@ -757,22 +754,22 @@ void CISlave :: BeamGlow( )
//========================================================= //=========================================================
// WackBeam - regenerate dead colleagues // WackBeam - regenerate dead colleagues
//========================================================= //=========================================================
void CISlave :: WackBeam( int side, CBaseEntity *pEntity ) void CISlave::WackBeam( int side, CBaseEntity *pEntity )
{ {
Vector vecDest; Vector vecDest;
float flDist = 1.0; float flDist = 1.0;
if (m_iBeams >= ISLAVE_MAX_BEAMS) if( m_iBeams >= ISLAVE_MAX_BEAMS )
return; return;
if (pEntity == NULL) if( pEntity == NULL )
return; return;
m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 30 ); m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
if (!m_pBeam[m_iBeams]) if( !m_pBeam[m_iBeams] )
return; return;
m_pBeam[m_iBeams]->PointEntInit( pEntity->Center(), entindex( ) ); m_pBeam[m_iBeams]->PointEntInit( pEntity->Center(), entindex() );
m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 ); m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 );
m_pBeam[m_iBeams]->SetColor( 180, 255, 96 ); m_pBeam[m_iBeams]->SetColor( 180, 255, 96 );
m_pBeam[m_iBeams]->SetBrightness( 255 ); m_pBeam[m_iBeams]->SetBrightness( 255 );
@ -783,48 +780,48 @@ void CISlave :: WackBeam( int side, CBaseEntity *pEntity )
//========================================================= //=========================================================
// ZapBeam - heavy damage directly forward // ZapBeam - heavy damage directly forward
//========================================================= //=========================================================
void CISlave :: ZapBeam( int side ) void CISlave::ZapBeam( int side )
{ {
Vector vecSrc, vecAim; Vector vecSrc, vecAim;
TraceResult tr; TraceResult tr;
CBaseEntity *pEntity; CBaseEntity *pEntity;
if (m_iBeams >= ISLAVE_MAX_BEAMS) if( m_iBeams >= ISLAVE_MAX_BEAMS )
return; return;
vecSrc = pev->origin + gpGlobals->v_up * 36; vecSrc = pev->origin + gpGlobals->v_up * 36;
vecAim = ShootAtEnemy( vecSrc ); vecAim = ShootAtEnemy( vecSrc );
float deflection = 0.01; float deflection = 0.01;
vecAim = vecAim + side * gpGlobals->v_right * RANDOM_FLOAT( 0, deflection ) + gpGlobals->v_up * RANDOM_FLOAT( -deflection, deflection ); vecAim = vecAim + side * gpGlobals->v_right * RANDOM_FLOAT( 0, deflection ) + gpGlobals->v_up * RANDOM_FLOAT( -deflection, deflection );
UTIL_TraceLine ( vecSrc, vecSrc + vecAim * 1024, dont_ignore_monsters, ENT( pev ), &tr); UTIL_TraceLine( vecSrc, vecSrc + vecAim * 1024, dont_ignore_monsters, ENT( pev ), &tr );
m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 50 ); m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 50 );
if (!m_pBeam[m_iBeams]) if( !m_pBeam[m_iBeams] )
return; return;
m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, entindex( ) ); m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, entindex() );
m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 ); m_pBeam[m_iBeams]->SetEndAttachment( side < 0 ? 2 : 1 );
m_pBeam[m_iBeams]->SetColor( 180, 255, 96 ); m_pBeam[m_iBeams]->SetColor( 180, 255, 96 );
m_pBeam[m_iBeams]->SetBrightness( 255 ); m_pBeam[m_iBeams]->SetBrightness( 255 );
m_pBeam[m_iBeams]->SetNoise( 20 ); m_pBeam[m_iBeams]->SetNoise( 20 );
m_iBeams++; m_iBeams++;
pEntity = CBaseEntity::Instance(tr.pHit); pEntity = CBaseEntity::Instance( tr.pHit );
if (pEntity != NULL && pEntity->pev->takedamage) if( pEntity != NULL && pEntity->pev->takedamage )
{ {
pEntity->TraceAttack( pev, gSkillData.slaveDmgZap, vecAim, &tr, DMG_SHOCK ); pEntity->TraceAttack( pev, gSkillData.slaveDmgZap, vecAim, &tr, DMG_SHOCK );
} }
UTIL_EmitAmbientSound( ENT(pev), tr.vecEndPos, "weapons/electro4.wav", 0.5, ATTN_NORM, 0, RANDOM_LONG( 140, 160 ) ); UTIL_EmitAmbientSound( ENT( pev ), tr.vecEndPos, "weapons/electro4.wav", 0.5, ATTN_NORM, 0, RANDOM_LONG( 140, 160 ) );
} }
//========================================================= //=========================================================
// ClearBeams - remove all beams // ClearBeams - remove all beams
//========================================================= //=========================================================
void CISlave :: ClearBeams( ) void CISlave::ClearBeams()
{ {
for (int i = 0; i < ISLAVE_MAX_BEAMS; i++) for( int i = 0; i < ISLAVE_MAX_BEAMS; i++ )
{ {
if (m_pBeam[i]) if( m_pBeam[i] )
{ {
UTIL_Remove( m_pBeam[i] ); UTIL_Remove( m_pBeam[i] );
m_pBeam[i] = NULL; m_pBeam[i] = NULL;
@ -833,5 +830,5 @@ void CISlave :: ClearBeams( )
m_iBeams = 0; m_iBeams = 0;
pev->skin = 0; pev->skin = 0;
STOP_SOUND( ENT(pev), CHAN_WEAPON, "debris/zap4.wav" ); STOP_SOUND( ENT( pev ), CHAN_WEAPON, "debris/zap4.wav" );
} }

View File

@ -34,18 +34,18 @@ extern int gmsgItemPickup;
class CWorldItem : public CBaseEntity class CWorldItem : public CBaseEntity
{ {
public: public:
void KeyValue(KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
void Spawn( void ); void Spawn( void );
int m_iType; int m_iType;
}; };
LINK_ENTITY_TO_CLASS(world_items, CWorldItem) LINK_ENTITY_TO_CLASS( world_items, CWorldItem )
void CWorldItem::KeyValue(KeyValueData *pkvd) void CWorldItem::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "type")) if( FStrEq( pkvd->szKeyName, "type" ) )
{ {
m_iType = atoi(pkvd->szValue); m_iType = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
@ -56,7 +56,7 @@ void CWorldItem::Spawn( void )
{ {
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
switch (m_iType) switch( m_iType )
{ {
case 44: // ITEM_BATTERY: case 44: // ITEM_BATTERY:
pEntity = CBaseEntity::Create( "item_battery", pev->origin, pev->angles ); pEntity = CBaseEntity::Create( "item_battery", pev->origin, pev->angles );
@ -72,7 +72,7 @@ void CWorldItem::Spawn( void )
break; break;
} }
if (!pEntity) if( !pEntity )
{ {
ALERT( at_console, "unable to create world_item %d\n", m_iType ); ALERT( at_console, "unable to create world_item %d\n", m_iType );
} }
@ -83,7 +83,7 @@ void CWorldItem::Spawn( void )
pEntity->pev->spawnflags = pev->spawnflags; pEntity->pev->spawnflags = pev->spawnflags;
} }
REMOVE_ENTITY(edict()); REMOVE_ENTITY( edict() );
} }
void CItem::Spawn( void ) void CItem::Spawn( void )
@ -91,10 +91,10 @@ void CItem::Spawn( void )
pev->movetype = MOVETYPE_TOSS; pev->movetype = MOVETYPE_TOSS;
pev->solid = SOLID_TRIGGER; pev->solid = SOLID_TRIGGER;
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); UTIL_SetSize( pev, Vector( -16, -16, 0 ), Vector( 16, 16, 16 ) );
SetTouch( &CItem::ItemTouch ); SetTouch( &CItem::ItemTouch );
if (DROP_TO_FLOOR(ENT(pev)) == 0) if( DROP_TO_FLOOR(ENT( pev ) ) == 0 )
{ {
ALERT(at_error, "Item %s fell out of level at %f,%f,%f\n", STRING( pev->classname ), pev->origin.x, pev->origin.y, pev->origin.z); ALERT(at_error, "Item %s fell out of level at %f,%f,%f\n", STRING( pev->classname ), pev->origin.x, pev->origin.y, pev->origin.z);
UTIL_Remove( this ); UTIL_Remove( this );
@ -107,7 +107,7 @@ extern int gEvilImpulse101;
void CItem::ItemTouch( CBaseEntity *pOther ) void CItem::ItemTouch( CBaseEntity *pOther )
{ {
// if it's not a player, ignore // if it's not a player, ignore
if ( !pOther->IsPlayer() ) if( !pOther->IsPlayer() )
{ {
return; return;
} }
@ -115,20 +115,20 @@ void CItem::ItemTouch( CBaseEntity *pOther )
CBasePlayer *pPlayer = (CBasePlayer *)pOther; CBasePlayer *pPlayer = (CBasePlayer *)pOther;
// ok, a player is touching this item, but can he have it? // ok, a player is touching this item, but can he have it?
if ( !g_pGameRules->CanHaveItem( pPlayer, this ) ) if( !g_pGameRules->CanHaveItem( pPlayer, this ) )
{ {
// no? Ignore the touch. // no? Ignore the touch.
return; return;
} }
if (MyTouch( pPlayer )) if( MyTouch( pPlayer ) )
{ {
SUB_UseTargets( pOther, USE_TOGGLE, 0 ); SUB_UseTargets( pOther, USE_TOGGLE, 0 );
SetTouch( NULL ); SetTouch( NULL );
// player grabbed the item. // player grabbed the item.
g_pGameRules->PlayerGotItem( pPlayer, this ); g_pGameRules->PlayerGotItem( pPlayer, this );
if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_YES ) if( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_YES )
{ {
Respawn(); Respawn();
} }
@ -137,7 +137,7 @@ void CItem::ItemTouch( CBaseEntity *pOther )
UTIL_Remove( this ); UTIL_Remove( this );
} }
} }
else if (gEvilImpulse101) else if( gEvilImpulse101 )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
} }
@ -157,10 +157,10 @@ CBaseEntity* CItem::Respawn( void )
void CItem::Materialize( void ) void CItem::Materialize( void )
{ {
if ( pev->effects & EF_NODRAW ) if( pev->effects & EF_NODRAW )
{ {
// changing from invisible state to visible. // changing from invisible state to visible.
EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", 1, ATTN_NORM, 0, 150 ); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "items/suitchargeok1.wav", 1, ATTN_NORM, 0, 150 );
pev->effects &= ~EF_NODRAW; pev->effects &= ~EF_NODRAW;
pev->effects |= EF_MUZZLEFLASH; pev->effects |= EF_MUZZLEFLASH;
} }
@ -174,78 +174,78 @@ class CItemSuit : public CItem
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_suit.mdl"); SET_MODEL( ENT( pev ), "models/w_suit.mdl" );
CItem::Spawn( ); CItem::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_suit.mdl"); PRECACHE_MODEL( "models/w_suit.mdl" );
} }
BOOL MyTouch( CBasePlayer *pPlayer ) BOOL MyTouch( CBasePlayer *pPlayer )
{ {
if ( pPlayer->pev->weapons & (1<<WEAPON_SUIT) ) if( pPlayer->pev->weapons & ( 1<<WEAPON_SUIT ) )
return FALSE; return FALSE;
if ( pev->spawnflags & SF_SUIT_SHORTLOGON ) if( pev->spawnflags & SF_SUIT_SHORTLOGON )
EMIT_SOUND_SUIT(pPlayer->edict(), "!HEV_A0"); // short version of suit logon, EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_A0" ); // short version of suit logon,
else else
EMIT_SOUND_SUIT(pPlayer->edict(), "!HEV_AAx"); // long version of suit logon EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_AAx" ); // long version of suit logon
pPlayer->pev->weapons |= (1<<WEAPON_SUIT); pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT );
return TRUE; return TRUE;
} }
}; };
LINK_ENTITY_TO_CLASS(item_suit, CItemSuit) LINK_ENTITY_TO_CLASS( item_suit, CItemSuit )
class CItemBattery : public CItem class CItemBattery : public CItem
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_battery.mdl"); SET_MODEL( ENT( pev ), "models/w_battery.mdl" );
CItem::Spawn( ); CItem::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_battery.mdl"); PRECACHE_MODEL( "models/w_battery.mdl" );
PRECACHE_SOUND( "items/gunpickup2.wav" ); PRECACHE_SOUND( "items/gunpickup2.wav" );
} }
BOOL MyTouch( CBasePlayer *pPlayer ) BOOL MyTouch( CBasePlayer *pPlayer )
{ {
if ( pPlayer->pev->deadflag != DEAD_NO ) if( pPlayer->pev->deadflag != DEAD_NO )
{ {
return FALSE; return FALSE;
} }
if ((pPlayer->pev->armorvalue < MAX_NORMAL_BATTERY) && if( ( pPlayer->pev->armorvalue < MAX_NORMAL_BATTERY ) &&
(pPlayer->pev->weapons & (1<<WEAPON_SUIT))) ( pPlayer->pev->weapons & ( 1 << WEAPON_SUIT ) ) )
{ {
int pct; int pct;
char szcharge[64]; char szcharge[64];
pPlayer->pev->armorvalue += gSkillData.batteryCapacity; pPlayer->pev->armorvalue += gSkillData.batteryCapacity;
pPlayer->pev->armorvalue = min(pPlayer->pev->armorvalue, MAX_NORMAL_BATTERY); pPlayer->pev->armorvalue = min( pPlayer->pev->armorvalue, MAX_NORMAL_BATTERY );
EMIT_SOUND( pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM ); EMIT_SOUND( pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM );
MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev );
WRITE_STRING( STRING(pev->classname) ); WRITE_STRING( STRING( pev->classname ) );
MESSAGE_END(); MESSAGE_END();
// Suit reports new power level // Suit reports new power level
// For some reason this wasn't working in release build -- round it. // For some reason this wasn't working in release build -- round it.
pct = (int)( (float)(pPlayer->pev->armorvalue * 100.0) * (1.0/MAX_NORMAL_BATTERY) + 0.5); pct = (int)( (float)( pPlayer->pev->armorvalue * 100.0 ) * ( 1.0 / MAX_NORMAL_BATTERY ) + 0.5 );
pct = (pct / 5); pct = ( pct / 5 );
if (pct > 0) if( pct > 0 )
pct--; pct--;
sprintf( szcharge,"!HEV_%1dP", pct ); sprintf( szcharge,"!HEV_%1dP", pct );
//EMIT_SOUND_SUIT(ENT(pev), szcharge); //EMIT_SOUND_SUIT( ENT( pev ), szcharge );
pPlayer->SetSuitUpdate(szcharge, FALSE, SUIT_NEXT_IN_30SEC); pPlayer->SetSuitUpdate( szcharge, FALSE, SUIT_NEXT_IN_30SEC);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
@ -257,18 +257,18 @@ class CItemAntidote : public CItem
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_antidote.mdl"); SET_MODEL( ENT( pev ), "models/w_antidote.mdl" );
CItem::Spawn( ); CItem::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_antidote.mdl"); PRECACHE_MODEL( "models/w_antidote.mdl" );
} }
BOOL MyTouch( CBasePlayer *pPlayer ) BOOL MyTouch( CBasePlayer *pPlayer )
{ {
pPlayer->SetSuitUpdate("!HEV_DET4", FALSE, SUIT_NEXT_IN_1MIN); pPlayer->SetSuitUpdate( "!HEV_DET4", FALSE, SUIT_NEXT_IN_1MIN );
pPlayer->m_rgItems[ITEM_ANTIDOTE] += 1; pPlayer->m_rgItems[ITEM_ANTIDOTE] += 1;
return TRUE; return TRUE;
} }
@ -280,13 +280,13 @@ class CItemSecurity : public CItem
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_security.mdl"); SET_MODEL( ENT( pev ), "models/w_security.mdl" );
CItem::Spawn( ); CItem::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_security.mdl"); PRECACHE_MODEL( "models/w_security.mdl" );
} }
BOOL MyTouch( CBasePlayer *pPlayer ) BOOL MyTouch( CBasePlayer *pPlayer )
{ {
@ -301,29 +301,29 @@ class CItemLongJump : public CItem
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_longjump.mdl"); SET_MODEL( ENT( pev ), "models/w_longjump.mdl" );
CItem::Spawn( ); CItem::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_longjump.mdl"); PRECACHE_MODEL( "models/w_longjump.mdl" );
} }
BOOL MyTouch( CBasePlayer *pPlayer ) BOOL MyTouch( CBasePlayer *pPlayer )
{ {
if ( pPlayer->m_fLongJump ) if( pPlayer->m_fLongJump )
{ {
return FALSE; return FALSE;
} }
if ( ( pPlayer->pev->weapons & (1<<WEAPON_SUIT) ) ) if( ( pPlayer->pev->weapons & ( 1 << WEAPON_SUIT ) ) )
{ {
pPlayer->m_fLongJump = TRUE;// player now has longjump module pPlayer->m_fLongJump = TRUE;// player now has longjump module
g_engfuncs.pfnSetPhysicsKeyValue( pPlayer->edict(), "slj", "1" ); g_engfuncs.pfnSetPhysicsKeyValue( pPlayer->edict(), "slj", "1" );
MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev );
WRITE_STRING( STRING(pev->classname) ); WRITE_STRING( STRING( pev->classname ) );
MESSAGE_END(); MESSAGE_END();
EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_A1" ); // Play the longjump sound UNDONE: Kelly? correct sound? EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_A1" ); // Play the longjump sound UNDONE: Kelly? correct sound?

View File

@ -18,11 +18,13 @@
class CItem : public CBaseEntity class CItem : public CBaseEntity
{ {
public: public:
void Spawn( void ); void Spawn( void );
CBaseEntity* Respawn( void ); CBaseEntity *Respawn( void );
void EXPORT ItemTouch( CBaseEntity *pOther ); void EXPORT ItemTouch( CBaseEntity *pOther );
void EXPORT Materialize( void ); void EXPORT Materialize( void );
virtual BOOL MyTouch( CBasePlayer *pPlayer ) { return FALSE; }; virtual BOOL MyTouch( CBasePlayer *pPlayer )
{
return FALSE;
};
}; };
#endif // ITEMS_H #endif // ITEMS_H

View File

@ -27,23 +27,23 @@
class CLight : public CPointEntity class CLight : public CPointEntity
{ {
public: public:
virtual void KeyValue( KeyValueData* pkvd ); virtual void KeyValue( KeyValueData* pkvd );
virtual void Spawn( void ); virtual void Spawn( void );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
private: private:
int m_iStyle; int m_iStyle;
int m_iszPattern; int m_iszPattern;
}; };
LINK_ENTITY_TO_CLASS( light, CLight ) LINK_ENTITY_TO_CLASS( light, CLight )
TYPEDESCRIPTION CLight::m_SaveData[] = TYPEDESCRIPTION CLight::m_SaveData[] =
{ {
DEFINE_FIELD( CLight, m_iStyle, FIELD_INTEGER ), DEFINE_FIELD( CLight, m_iStyle, FIELD_INTEGER ),
DEFINE_FIELD( CLight, m_iszPattern, FIELD_STRING ), DEFINE_FIELD( CLight, m_iszPattern, FIELD_STRING ),
@ -54,19 +54,19 @@ IMPLEMENT_SAVERESTORE( CLight, CPointEntity )
// //
// Cache user-entity-field values until spawn is called. // Cache user-entity-field values until spawn is called.
// //
void CLight :: KeyValue( KeyValueData* pkvd) void CLight::KeyValue( KeyValueData* pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "style")) if( FStrEq(pkvd->szKeyName, "style" ) )
{ {
m_iStyle = atoi(pkvd->szValue); m_iStyle = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "pitch")) else if( FStrEq(pkvd->szKeyName, "pitch" ) )
{ {
pev->angles.x = atof(pkvd->szValue); pev->angles.x = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "pattern")) else if( FStrEq(pkvd->szKeyName, "pattern" ) )
{ {
m_iszPattern = ALLOC_STRING( pkvd->szValue ); m_iszPattern = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
@ -84,45 +84,46 @@ Default style is 0
If targeted, it will toggle between on or off. If targeted, it will toggle between on or off.
*/ */
void CLight :: Spawn( void ) void CLight::Spawn( void )
{ {
if (FStringNull(pev->targetname)) if( FStringNull( pev->targetname ) )
{ // inert light {
REMOVE_ENTITY(ENT(pev)); // inert light
REMOVE_ENTITY(ENT( pev ) );
return; return;
} }
if (m_iStyle >= 32) if( m_iStyle >= 32 )
{ {
//CHANGE_METHOD(ENT(pev), em_use, light_use); //CHANGE_METHOD(ENT(pev), em_use, light_use);
if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)) if( FBitSet( pev->spawnflags, SF_LIGHT_START_OFF ) )
LIGHT_STYLE(m_iStyle, "a"); LIGHT_STYLE( m_iStyle, "a" );
else if (m_iszPattern) else if( m_iszPattern )
LIGHT_STYLE(m_iStyle, (char *)STRING( m_iszPattern )); LIGHT_STYLE( m_iStyle, (char *)STRING( m_iszPattern ) );
else else
LIGHT_STYLE(m_iStyle, "m"); LIGHT_STYLE( m_iStyle, "m" );
} }
} }
void CLight :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CLight::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
if (m_iStyle >= 32) if( m_iStyle >= 32 )
{ {
if ( !ShouldToggle( useType, !FBitSet(pev->spawnflags, SF_LIGHT_START_OFF) ) ) if( !ShouldToggle( useType, !FBitSet( pev->spawnflags, SF_LIGHT_START_OFF ) ) )
return; return;
if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)) if( FBitSet( pev->spawnflags, SF_LIGHT_START_OFF ) )
{ {
if (m_iszPattern) if( m_iszPattern )
LIGHT_STYLE(m_iStyle, (char *)STRING( m_iszPattern )); LIGHT_STYLE( m_iStyle, (char *)STRING( m_iszPattern ) );
else else
LIGHT_STYLE(m_iStyle, "m"); LIGHT_STYLE( m_iStyle, "m" );
ClearBits(pev->spawnflags, SF_LIGHT_START_OFF); ClearBits( pev->spawnflags, SF_LIGHT_START_OFF );
} }
else else
{ {
LIGHT_STYLE(m_iStyle, "a"); LIGHT_STYLE( m_iStyle, "a" );
SetBits(pev->spawnflags, SF_LIGHT_START_OFF); SetBits( pev->spawnflags, SF_LIGHT_START_OFF );
} }
} }
} }
@ -135,28 +136,28 @@ LINK_ENTITY_TO_CLASS( light_spot, CLight )
class CEnvLight : public CLight class CEnvLight : public CLight
{ {
public: public:
void KeyValue( KeyValueData* pkvd ); void KeyValue( KeyValueData* pkvd );
void Spawn( void ); void Spawn( void );
}; };
LINK_ENTITY_TO_CLASS( light_environment, CEnvLight ) LINK_ENTITY_TO_CLASS( light_environment, CEnvLight )
void CEnvLight::KeyValue( KeyValueData* pkvd ) void CEnvLight::KeyValue( KeyValueData* pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "_light")) if( FStrEq(pkvd->szKeyName, "_light" ) )
{ {
int r, g, b, v, j; int r, g, b, v, j;
char szColor[64]; char szColor[64];
j = sscanf( pkvd->szValue, "%d %d %d %d\n", &r, &g, &b, &v ); j = sscanf( pkvd->szValue, "%d %d %d %d\n", &r, &g, &b, &v );
if (j == 1) if( j == 1 )
{ {
g = b = r; g = b = r;
} }
else if (j == 4) else if( j == 4 )
{ {
r = r * (v / 255.0); r = r * ( v / 255.0 );
g = g * (v / 255.0); g = g * ( v / 255.0 );
b = b * (v / 255.0); b = b * ( v / 255.0 );
} }
// simulate qrad direct, ambient,and gamma adjustments, as well as engine scaling // simulate qrad direct, ambient,and gamma adjustments, as well as engine scaling
@ -178,7 +179,7 @@ void CEnvLight::KeyValue( KeyValueData* pkvd )
} }
} }
void CEnvLight :: Spawn( void ) void CEnvLight::Spawn( void )
{ {
char szVector[64]; char szVector[64];
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
@ -190,5 +191,5 @@ void CEnvLight :: Spawn( void )
sprintf( szVector, "%f", gpGlobals->v_forward.z ); sprintf( szVector, "%f", gpGlobals->v_forward.z );
CVAR_SET_STRING( "sv_skyvec_z", szVector ); CVAR_SET_STRING( "sv_skyvec_z", szVector );
CLight::Spawn( ); CLight::Spawn();
} }

View File

@ -37,23 +37,23 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void KeyValue( KeyValueData* pkvd); void KeyValue( KeyValueData* pkvd);
void EXPORT ToggleUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT ToggleUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void EXPORT CyclicUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT CyclicUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
void EXPORT MakerThink ( void ); void EXPORT MakerThink( void );
void DeathNotice ( entvars_t *pevChild );// monster maker children use this to tell the monster maker that they have died. void DeathNotice( entvars_t *pevChild );// monster maker children use this to tell the monster maker that they have died.
void MakeMonster( void ); void MakeMonster( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
string_t m_iszMonsterClassname;// classname of the monster(s) that will be created. string_t m_iszMonsterClassname;// classname of the monster(s) that will be created.
int m_cNumMonsters;// max number of monsters this ent can create int m_cNumMonsters;// max number of monsters this ent can create
int m_cLiveChildren;// how many monsters made by this monster maker that are currently alive int m_cLiveChildren;// how many monsters made by this monster maker that are currently alive
int m_iMaxLiveChildren;// max number of monsters that this maker may have out at one time. int m_iMaxLiveChildren;// max number of monsters that this maker may have out at one time.
float m_flGround; // z coord of the ground under me, used to make sure no monsters are under the maker when it drops a new child float m_flGround; // z coord of the ground under me, used to make sure no monsters are under the maker when it drops a new child
@ -76,19 +76,19 @@ TYPEDESCRIPTION CMonsterMaker::m_SaveData[] =
IMPLEMENT_SAVERESTORE( CMonsterMaker, CBaseMonster ) IMPLEMENT_SAVERESTORE( CMonsterMaker, CBaseMonster )
void CMonsterMaker :: KeyValue( KeyValueData *pkvd ) void CMonsterMaker::KeyValue( KeyValueData *pkvd )
{ {
if ( FStrEq(pkvd->szKeyName, "monstercount") ) if( FStrEq( pkvd->szKeyName, "monstercount" ) )
{ {
m_cNumMonsters = atoi(pkvd->szValue); m_cNumMonsters = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if ( FStrEq(pkvd->szKeyName, "m_imaxlivechildren") ) else if( FStrEq( pkvd->szKeyName, "m_imaxlivechildren" ) )
{ {
m_iMaxLiveChildren = atoi(pkvd->szValue); m_iMaxLiveChildren = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if ( FStrEq(pkvd->szKeyName, "monstertype") ) else if( FStrEq( pkvd->szKeyName, "monstertype" ) )
{ {
m_iszMonsterClassname = ALLOC_STRING( pkvd->szValue ); m_iszMonsterClassname = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
@ -97,15 +97,15 @@ void CMonsterMaker :: KeyValue( KeyValueData *pkvd )
CBaseMonster::KeyValue( pkvd ); CBaseMonster::KeyValue( pkvd );
} }
void CMonsterMaker :: Spawn( ) void CMonsterMaker::Spawn()
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
m_cLiveChildren = 0; m_cLiveChildren = 0;
Precache(); Precache();
if ( !FStringNull ( pev->targetname ) ) if( !FStringNull( pev->targetname ) )
{ {
if ( pev->spawnflags & SF_MONSTERMAKER_CYCLIC ) if( pev->spawnflags & SF_MONSTERMAKER_CYCLIC )
{ {
SetUse( &CMonsterMaker::CyclicUse );// drop one monster each time we fire SetUse( &CMonsterMaker::CyclicUse );// drop one monster each time we fire
} }
@ -114,7 +114,7 @@ void CMonsterMaker :: Spawn( )
SetUse( &CMonsterMaker::ToggleUse );// so can be turned on/off SetUse( &CMonsterMaker::ToggleUse );// so can be turned on/off
} }
if ( FBitSet ( pev->spawnflags, SF_MONSTERMAKER_START_ON ) ) if( FBitSet( pev->spawnflags, SF_MONSTERMAKER_START_ON ) )
{ {
// start making monsters as soon as monstermaker spawns // start making monsters as soon as monstermaker spawns
m_fActive = TRUE; m_fActive = TRUE;
@ -135,7 +135,7 @@ void CMonsterMaker :: Spawn( )
SetThink( &CMonsterMaker::MakerThink ); SetThink( &CMonsterMaker::MakerThink );
} }
if ( m_cNumMonsters == 1 ) if( m_cNumMonsters == 1 )
{ {
m_fFadeChildren = FALSE; m_fFadeChildren = FALSE;
} }
@ -147,7 +147,7 @@ void CMonsterMaker :: Spawn( )
m_flGround = 0; m_flGround = 0;
} }
void CMonsterMaker :: Precache( void ) void CMonsterMaker::Precache( void )
{ {
CBaseMonster::Precache(); CBaseMonster::Precache();
@ -160,20 +160,20 @@ void CMonsterMaker :: Precache( void )
void CMonsterMaker::MakeMonster( void ) void CMonsterMaker::MakeMonster( void )
{ {
edict_t *pent; edict_t *pent;
entvars_t *pevCreate; entvars_t *pevCreate;
if ( m_iMaxLiveChildren > 0 && m_cLiveChildren >= m_iMaxLiveChildren ) if( m_iMaxLiveChildren > 0 && m_cLiveChildren >= m_iMaxLiveChildren )
{ {
// not allowed to make a new one yet. Too many live ones out right now. // not allowed to make a new one yet. Too many live ones out right now.
return; return;
} }
if ( !m_flGround ) if( !m_flGround )
{ {
// set altitude. Now that I'm activated, any breakables, etc should be out from under me. // set altitude. Now that I'm activated, any breakables, etc should be out from under me.
TraceResult tr; TraceResult tr;
UTIL_TraceLine ( pev->origin, pev->origin - Vector ( 0, 0, 2048 ), ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( pev->origin, pev->origin - Vector( 0, 0, 2048 ), ignore_monsters, ENT( pev ), &tr );
m_flGround = tr.vecEndPos.z; m_flGround = tr.vecEndPos.z;
} }
@ -183,8 +183,8 @@ void CMonsterMaker::MakeMonster( void )
mins.z = m_flGround; mins.z = m_flGround;
CBaseEntity *pList[2]; CBaseEntity *pList[2];
int count = UTIL_EntitiesInBox( pList, 2, mins, maxs, FL_CLIENT|FL_MONSTER ); int count = UTIL_EntitiesInBox( pList, 2, mins, maxs, FL_CLIENT | FL_MONSTER );
if ( count ) if( count )
{ {
// don't build a stack of monsters! // don't build a stack of monsters!
return; return;
@ -192,17 +192,17 @@ void CMonsterMaker::MakeMonster( void )
pent = CREATE_NAMED_ENTITY( m_iszMonsterClassname ); pent = CREATE_NAMED_ENTITY( m_iszMonsterClassname );
if ( FNullEnt( pent ) ) if( FNullEnt( pent ) )
{ {
ALERT ( at_console, "NULL Ent in MonsterMaker!\n" ); ALERT ( at_console, "NULL Ent in MonsterMaker!\n" );
return; return;
} }
// If I have a target, fire! // If I have a target, fire!
if ( !FStringNull ( pev->target ) ) if( !FStringNull( pev->target ) )
{ {
// delay already overloaded for this entity, so can't call SUB_UseTargets() // delay already overloaded for this entity, so can't call SUB_UseTargets()
FireTargets( STRING(pev->target), this, this, USE_TOGGLE, 0 ); FireTargets( STRING( pev->target ), this, this, USE_TOGGLE, 0 );
} }
pevCreate = VARS( pent ); pevCreate = VARS( pent );
@ -211,13 +211,13 @@ void CMonsterMaker::MakeMonster( void )
SetBits( pevCreate->spawnflags, SF_MONSTER_FALL_TO_GROUND ); SetBits( pevCreate->spawnflags, SF_MONSTER_FALL_TO_GROUND );
// Children hit monsterclip brushes // Children hit monsterclip brushes
if ( pev->spawnflags & SF_MONSTERMAKER_MONSTERCLIP ) if( pev->spawnflags & SF_MONSTERMAKER_MONSTERCLIP )
SetBits( pevCreate->spawnflags, SF_MONSTER_HITMONSTERCLIP ); SetBits( pevCreate->spawnflags, SF_MONSTER_HITMONSTERCLIP );
DispatchSpawn( ENT( pevCreate ) ); DispatchSpawn( ENT( pevCreate ) );
pevCreate->owner = edict(); pevCreate->owner = edict();
if ( !FStringNull( pev->netname ) ) if( !FStringNull( pev->netname ) )
{ {
// if I have a netname (overloaded), give the child monster that name as a targetname // if I have a netname (overloaded), give the child monster that name as a targetname
pevCreate->targetname = pev->netname; pevCreate->targetname = pev->netname;
@ -226,7 +226,7 @@ void CMonsterMaker::MakeMonster( void )
m_cLiveChildren++;// count this monster m_cLiveChildren++;// count this monster
m_cNumMonsters--; m_cNumMonsters--;
if ( m_cNumMonsters == 0 ) if( m_cNumMonsters == 0 )
{ {
// Disable this forever. Don't kill it because it still gets death notices // Disable this forever. Don't kill it because it still gets death notices
SetThink( NULL ); SetThink( NULL );
@ -238,7 +238,7 @@ void CMonsterMaker::MakeMonster( void )
// CyclicUse - drops one monster from the monstermaker // CyclicUse - drops one monster from the monstermaker
// each time we call this. // each time we call this.
//========================================================= //=========================================================
void CMonsterMaker::CyclicUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CMonsterMaker::CyclicUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
MakeMonster(); MakeMonster();
} }
@ -246,12 +246,12 @@ void CMonsterMaker::CyclicUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, U
//========================================================= //=========================================================
// ToggleUse - activates/deactivates the monster maker // ToggleUse - activates/deactivates the monster maker
//========================================================= //=========================================================
void CMonsterMaker :: ToggleUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CMonsterMaker::ToggleUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
if ( !ShouldToggle( useType, m_fActive ) ) if( !ShouldToggle( useType, m_fActive ) )
return; return;
if ( m_fActive ) if( m_fActive )
{ {
m_fActive = FALSE; m_fActive = FALSE;
SetThink( NULL ); SetThink( NULL );
@ -268,7 +268,7 @@ void CMonsterMaker :: ToggleUse ( CBaseEntity *pActivator, CBaseEntity *pCaller,
//========================================================= //=========================================================
// MakerThink - creates a new monster every so often // MakerThink - creates a new monster every so often
//========================================================= //=========================================================
void CMonsterMaker :: MakerThink ( void ) void CMonsterMaker::MakerThink( void )
{ {
pev->nextthink = gpGlobals->time + m_flDelay; pev->nextthink = gpGlobals->time + m_flDelay;
@ -277,12 +277,12 @@ void CMonsterMaker :: MakerThink ( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CMonsterMaker :: DeathNotice ( entvars_t *pevChild ) void CMonsterMaker::DeathNotice( entvars_t *pevChild )
{ {
// ok, we've gotten the deathnotice from our child, now clear out its owner if we don't want it to fade. // ok, we've gotten the deathnotice from our child, now clear out its owner if we don't want it to fade.
m_cLiveChildren--; m_cLiveChildren--;
if ( !m_fFadeChildren ) if( !m_fFadeChildren )
{ {
pevChild->owner = NULL; pevChild->owner = NULL;
} }

File diff suppressed because it is too large Load Diff

View File

@ -29,12 +29,12 @@
//========================================================= //=========================================================
// SetState // SetState
//========================================================= //=========================================================
void CBaseMonster :: SetState ( MONSTERSTATE State ) void CBaseMonster::SetState( MONSTERSTATE State )
{ {
/* /*
if ( State != m_MonsterState ) if( State != m_MonsterState )
{ {
ALERT ( at_aiconsole, "State Changed to %d\n", State ); ALERT( at_aiconsole, "State Changed to %d\n", State );
} }
*/ */
switch( State ) switch( State )
@ -42,10 +42,10 @@ void CBaseMonster :: SetState ( MONSTERSTATE State )
// Drop enemy pointers when going to idle // Drop enemy pointers when going to idle
case MONSTERSTATE_IDLE: case MONSTERSTATE_IDLE:
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
m_hEnemy = NULL;// not allowed to have an enemy anymore. m_hEnemy = NULL;// not allowed to have an enemy anymore.
ALERT ( at_aiconsole, "Stripped\n" ); ALERT( at_aiconsole, "Stripped\n" );
} }
break; break;
default: default:
@ -59,20 +59,20 @@ void CBaseMonster :: SetState ( MONSTERSTATE State )
//========================================================= //=========================================================
// RunAI // RunAI
//========================================================= //=========================================================
void CBaseMonster :: RunAI ( void ) void CBaseMonster::RunAI( void )
{ {
// to test model's eye height // to test model's eye height
//UTIL_ParticleEffect ( pev->origin + pev->view_ofs, g_vecZero, 255, 10 ); //UTIL_ParticleEffect ( pev->origin + pev->view_ofs, g_vecZero, 255, 10 );
// IDLE sound permitted in ALERT state is because monsters were silent in ALERT state. Only play IDLE sound in IDLE state // IDLE sound permitted in ALERT state is because monsters were silent in ALERT state. Only play IDLE sound in IDLE state
// once we have sounds for that state. // once we have sounds for that state.
if ( ( m_MonsterState == MONSTERSTATE_IDLE || m_MonsterState == MONSTERSTATE_ALERT ) && RANDOM_LONG(0,99) == 0 && !(pev->flags & SF_MONSTER_GAG) ) if( ( m_MonsterState == MONSTERSTATE_IDLE || m_MonsterState == MONSTERSTATE_ALERT ) && RANDOM_LONG( 0, 99 ) == 0 && !( pev->flags & SF_MONSTER_GAG ) )
{ {
IdleSound(); IdleSound();
} }
if ( m_MonsterState != MONSTERSTATE_NONE && if( m_MonsterState != MONSTERSTATE_NONE &&
m_MonsterState != MONSTERSTATE_PRONE && m_MonsterState != MONSTERSTATE_PRONE &&
m_MonsterState != MONSTERSTATE_DEAD )// don't bother with this crap if monster is prone. m_MonsterState != MONSTERSTATE_DEAD )// don't bother with this crap if monster is prone.
{ {
// collect some sensory Condition information. // collect some sensory Condition information.
@ -80,7 +80,7 @@ void CBaseMonster :: RunAI ( void )
// things will happen before the player gets there! // things will happen before the player gets there!
// UPDATE: We now let COMBAT state monsters think and act fully outside of player PVS. This allows the player to leave // UPDATE: We now let COMBAT state monsters think and act fully outside of player PVS. This allows the player to leave
// an area where monsters are fighting, and the fight will continue. // an area where monsters are fighting, and the fight will continue.
if ( !FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) || ( m_MonsterState == MONSTERSTATE_COMBAT ) ) if( !FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) || ( m_MonsterState == MONSTERSTATE_COMBAT ) )
{ {
Look( m_flDistLook ); Look( m_flDistLook );
Listen();// check for audible sounds. Listen();// check for audible sounds.
@ -92,7 +92,7 @@ void CBaseMonster :: RunAI ( void )
} }
// do these calculations if monster has an enemy. // do these calculations if monster has an enemy.
if ( m_hEnemy != NULL ) if( m_hEnemy != NULL )
{ {
CheckEnemy( m_hEnemy ); CheckEnemy( m_hEnemy );
} }
@ -116,14 +116,14 @@ void CBaseMonster :: RunAI ( void )
// GetIdealState - surveys the Conditions information available // GetIdealState - surveys the Conditions information available
// and finds the best new state for a monster. // and finds the best new state for a monster.
//========================================================= //=========================================================
MONSTERSTATE CBaseMonster :: GetIdealState ( void ) MONSTERSTATE CBaseMonster::GetIdealState( void )
{ {
int iConditions; int iConditions;
iConditions = IScheduleFlags(); iConditions = IScheduleFlags();
// If no schedule conditions, the new ideal state is probably the reason we're in here. // If no schedule conditions, the new ideal state is probably the reason we're in here.
switch ( m_MonsterState ) switch( m_MonsterState )
{ {
case MONSTERSTATE_IDLE: case MONSTERSTATE_IDLE:
/* /*
@ -134,36 +134,36 @@ MONSTERSTATE CBaseMonster :: GetIdealState ( void )
IDLE goes to HUNT upon smelling food IDLE goes to HUNT upon smelling food
*/ */
{ {
if ( iConditions & bits_COND_NEW_ENEMY ) if( iConditions & bits_COND_NEW_ENEMY )
{ {
// new enemy! This means an idle monster has seen someone it dislikes, or // new enemy! This means an idle monster has seen someone it dislikes, or
// that a monster in combat has found a more suitable target to attack // that a monster in combat has found a more suitable target to attack
m_IdealMonsterState = MONSTERSTATE_COMBAT; m_IdealMonsterState = MONSTERSTATE_COMBAT;
} }
else if ( iConditions & bits_COND_LIGHT_DAMAGE ) else if( iConditions & bits_COND_LIGHT_DAMAGE )
{ {
MakeIdealYaw ( m_vecEnemyLKP ); MakeIdealYaw( m_vecEnemyLKP );
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
} }
else if ( iConditions & bits_COND_HEAVY_DAMAGE ) else if( iConditions & bits_COND_HEAVY_DAMAGE )
{ {
MakeIdealYaw ( m_vecEnemyLKP ); MakeIdealYaw( m_vecEnemyLKP );
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
} }
else if ( iConditions & bits_COND_HEAR_SOUND ) else if( iConditions & bits_COND_HEAR_SOUND )
{ {
CSound *pSound; CSound *pSound;
pSound = PBestSound(); pSound = PBestSound();
ASSERT( pSound != NULL ); ASSERT( pSound != NULL );
if ( pSound ) if( pSound )
{ {
MakeIdealYaw ( pSound->m_vecOrigin ); MakeIdealYaw( pSound->m_vecOrigin );
if ( pSound->m_iType & (bits_SOUND_COMBAT|bits_SOUND_DANGER) ) if( pSound->m_iType & ( bits_SOUND_COMBAT|bits_SOUND_DANGER ) )
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
} }
} }
else if ( iConditions & (bits_COND_SMELL | bits_COND_SMELL_FOOD) ) else if( iConditions & ( bits_COND_SMELL | bits_COND_SMELL_FOOD ) )
{ {
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
} }
@ -177,18 +177,18 @@ MONSTERSTATE CBaseMonster :: GetIdealState ( void )
ALERT goes to HUNT upon hearing a noise ALERT goes to HUNT upon hearing a noise
*/ */
{ {
if ( iConditions & (bits_COND_NEW_ENEMY|bits_COND_SEE_ENEMY) ) if( iConditions & ( bits_COND_NEW_ENEMY | bits_COND_SEE_ENEMY ) )
{ {
// see an enemy we MUST attack // see an enemy we MUST attack
m_IdealMonsterState = MONSTERSTATE_COMBAT; m_IdealMonsterState = MONSTERSTATE_COMBAT;
} }
else if ( iConditions & bits_COND_HEAR_SOUND ) else if( iConditions & bits_COND_HEAR_SOUND )
{ {
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
CSound *pSound = PBestSound(); CSound *pSound = PBestSound();
ASSERT( pSound != NULL ); ASSERT( pSound != NULL );
if ( pSound ) if( pSound )
MakeIdealYaw ( pSound->m_vecOrigin ); MakeIdealYaw( pSound->m_vecOrigin );
} }
break; break;
} }
@ -198,11 +198,11 @@ MONSTERSTATE CBaseMonster :: GetIdealState ( void )
COMBAT goes to ALERT upon death of enemy COMBAT goes to ALERT upon death of enemy
*/ */
{ {
if ( m_hEnemy == NULL ) if( m_hEnemy == NULL )
{ {
m_IdealMonsterState = MONSTERSTATE_ALERT; m_IdealMonsterState = MONSTERSTATE_ALERT;
// pev->effects = EF_BRIGHTFIELD; // pev->effects = EF_BRIGHTFIELD;
ALERT ( at_aiconsole, "***Combat state with no enemy!\n" ); ALERT( at_aiconsole, "***Combat state with no enemy!\n" );
} }
break; break;
} }
@ -217,7 +217,7 @@ MONSTERSTATE CBaseMonster :: GetIdealState ( void )
break; break;
} }
case MONSTERSTATE_SCRIPT: case MONSTERSTATE_SCRIPT:
if ( iConditions & (bits_COND_TASK_FAILED|bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE) ) if( iConditions & ( bits_COND_TASK_FAILED | bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE ) )
{ {
ExitScriptedSequence(); // This will set the ideal state ExitScriptedSequence(); // This will set the ideal state
} }

View File

@ -16,7 +16,7 @@
===== mortar.cpp ======================================================== ===== mortar.cpp ========================================================
the "LaBuznik" mortar device the "LaBuznik" mortar device
*/ */
@ -36,12 +36,12 @@ public:
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
// Bmodels don't go across transitions // Bmodels don't go across transitions
virtual int ObjectCaps( void ) { return CBaseToggle :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } virtual int ObjectCaps( void ) { return CBaseToggle::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void EXPORT FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
@ -67,55 +67,55 @@ TYPEDESCRIPTION CFuncMortarField::m_SaveData[] =
IMPLEMENT_SAVERESTORE( CFuncMortarField, CBaseToggle ) IMPLEMENT_SAVERESTORE( CFuncMortarField, CBaseToggle )
void CFuncMortarField :: KeyValue( KeyValueData *pkvd ) void CFuncMortarField::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "m_iszXController")) if( FStrEq( pkvd->szKeyName, "m_iszXController" ) )
{ {
m_iszXController = ALLOC_STRING(pkvd->szValue); m_iszXController = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "m_iszYController")) else if( FStrEq( pkvd->szKeyName, "m_iszYController" ) )
{ {
m_iszYController = ALLOC_STRING(pkvd->szValue); m_iszYController = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "m_flSpread")) else if( FStrEq( pkvd->szKeyName, "m_flSpread" ) )
{ {
m_flSpread = atof(pkvd->szValue); m_flSpread = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "m_fControl")) else if( FStrEq( pkvd->szKeyName, "m_fControl" ) )
{ {
m_fControl = atoi(pkvd->szValue); m_fControl = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if (FStrEq(pkvd->szKeyName, "m_iCount")) else if( FStrEq( pkvd->szKeyName, "m_iCount" ) )
{ {
m_iCount = atoi(pkvd->szValue); m_iCount = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
} }
// Drop bombs from above // Drop bombs from above
void CFuncMortarField :: Spawn( void ) void CFuncMortarField::Spawn( void )
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
SET_MODEL(ENT(pev), STRING(pev->model)); // set size and link into world SET_MODEL( ENT( pev ), STRING( pev->model ) ); // set size and link into world
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
SetBits( pev->effects, EF_NODRAW ); SetBits( pev->effects, EF_NODRAW );
SetUse( &CFuncMortarField::FieldUse ); SetUse( &CFuncMortarField::FieldUse );
Precache(); Precache();
} }
void CFuncMortarField :: Precache( void ) void CFuncMortarField::Precache( void )
{ {
PRECACHE_SOUND ("weapons/mortar.wav"); PRECACHE_SOUND( "weapons/mortar.wav" );
PRECACHE_SOUND ("weapons/mortarhit.wav"); PRECACHE_SOUND( "weapons/mortarhit.wav" );
PRECACHE_MODEL( "sprites/lgtning.spr" ); PRECACHE_MODEL( "sprites/lgtning.spr" );
} }
// If connected to a table, then use the table controllers, else hit where the trigger is. // If connected to a table, then use the table controllers, else hit where the trigger is.
void CFuncMortarField :: FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CFuncMortarField::FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
Vector vecStart; Vector vecStart;
@ -125,62 +125,66 @@ void CFuncMortarField :: FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller
switch( m_fControl ) switch( m_fControl )
{ {
case 0: // random case 0:
// random
break; break;
case 1: // Trigger Activator case 1:
if (pActivator != NULL) // Trigger Activator
if( pActivator != NULL )
{ {
vecStart.x = pActivator->pev->origin.x; vecStart.x = pActivator->pev->origin.x;
vecStart.y = pActivator->pev->origin.y; vecStart.y = pActivator->pev->origin.y;
} }
break; break;
case 2: // table case 2:
// table
{ {
CBaseEntity *pController; CBaseEntity *pController;
if (!FStringNull(m_iszXController)) if( !FStringNull( m_iszXController ) )
{ {
pController = UTIL_FindEntityByTargetname( NULL, STRING(m_iszXController)); pController = UTIL_FindEntityByTargetname( NULL, STRING( m_iszXController ) );
if (pController != NULL) if( pController != NULL )
{ {
vecStart.x = pev->mins.x + pController->pev->ideal_yaw * (pev->size.x); vecStart.x = pev->mins.x + pController->pev->ideal_yaw * ( pev->size.x );
} }
} }
if (!FStringNull(m_iszYController)) if( !FStringNull( m_iszYController ) )
{ {
pController = UTIL_FindEntityByTargetname( NULL, STRING(m_iszYController)); pController = UTIL_FindEntityByTargetname( NULL, STRING( m_iszYController ) );
if (pController != NULL) if( pController != NULL )
{ {
vecStart.y = pev->mins.y + pController->pev->ideal_yaw * (pev->size.y); vecStart.y = pev->mins.y + pController->pev->ideal_yaw * ( pev->size.y );
} }
} }
} }
break; break;
} }
int pitch = RANDOM_LONG(95,124); int pitch = RANDOM_LONG( 95,124 );
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/mortar.wav", 1.0, ATTN_NONE, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "weapons/mortar.wav", 1.0, ATTN_NONE, 0, pitch );
float t = 2.5; float t = 2.5;
for (int i = 0; i < m_iCount; i++) for( int i = 0; i < m_iCount; i++ )
{ {
Vector vecSpot = vecStart; Vector vecSpot = vecStart;
vecSpot.x += RANDOM_FLOAT( -m_flSpread, m_flSpread ); vecSpot.x += RANDOM_FLOAT( -m_flSpread, m_flSpread );
vecSpot.y += RANDOM_FLOAT( -m_flSpread, m_flSpread ); vecSpot.y += RANDOM_FLOAT( -m_flSpread, m_flSpread );
TraceResult tr; TraceResult tr;
UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -1 ) * 4096, ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -1 ) * 4096, ignore_monsters, ENT( pev ), &tr );
edict_t *pentOwner = NULL; edict_t *pentOwner = NULL;
if (pActivator) pentOwner = pActivator->edict(); if( pActivator )
pentOwner = pActivator->edict();
CBaseEntity *pMortar = Create("monster_mortar", tr.vecEndPos, Vector( 0, 0, 0 ), pentOwner ); CBaseEntity *pMortar = Create( "monster_mortar", tr.vecEndPos, Vector( 0, 0, 0 ), pentOwner );
pMortar->pev->nextthink = gpGlobals->time + t; pMortar->pev->nextthink = gpGlobals->time + t;
t += RANDOM_FLOAT( 0.2, 0.5 ); t += RANDOM_FLOAT( 0.2, 0.5 );
if (i == 0) if( i == 0 )
CSoundEnt::InsertSound ( bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3 ); CSoundEnt::InsertSound( bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3 );
} }
} }
@ -197,20 +201,20 @@ public:
LINK_ENTITY_TO_CLASS( monster_mortar, CMortar ) LINK_ENTITY_TO_CLASS( monster_mortar, CMortar )
void CMortar::Spawn( ) void CMortar::Spawn()
{ {
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->dmg = 200; pev->dmg = 200;
SetThink( &CMortar::MortarExplode ); SetThink( &CMortar::MortarExplode );
pev->nextthink = 0; pev->nextthink = 0;
Precache( ); Precache();
} }
void CMortar::Precache( ) void CMortar::Precache()
{ {
m_spriteTexture = PRECACHE_MODEL( "sprites/lgtning.spr" ); m_spriteTexture = PRECACHE_MODEL( "sprites/lgtning.spr" );
} }
@ -221,13 +225,13 @@ void CMortar::MortarExplode( void )
// mortar beam // mortar beam
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMPOINTS ); WRITE_BYTE( TE_BEAMPOINTS );
WRITE_COORD(pev->origin.x); WRITE_COORD( pev->origin.x );
WRITE_COORD(pev->origin.y); WRITE_COORD( pev->origin.y );
WRITE_COORD(pev->origin.z); WRITE_COORD( pev->origin.z );
WRITE_COORD(pev->origin.x); WRITE_COORD( pev->origin.x );
WRITE_COORD(pev->origin.y); WRITE_COORD( pev->origin.y );
WRITE_COORD(pev->origin.z + 1024); WRITE_COORD( pev->origin.z + 1024 );
WRITE_SHORT(m_spriteTexture ); WRITE_SHORT( m_spriteTexture );
WRITE_BYTE( 0 ); // framerate WRITE_BYTE( 0 ); // framerate
WRITE_BYTE( 0 ); // framerate WRITE_BYTE( 0 ); // framerate
WRITE_BYTE( 1 ); // life WRITE_BYTE( 1 ); // life
@ -244,14 +248,14 @@ void CMortar::MortarExplode( void )
#if 0 #if 0
// blast circle // blast circle
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMTORUS); WRITE_BYTE( TE_BEAMTORUS );
WRITE_COORD(pev->origin.x); WRITE_COORD( pev->origin.x );
WRITE_COORD(pev->origin.y); WRITE_COORD( pev->origin.y );
WRITE_COORD(pev->origin.z + 32); WRITE_COORD( pev->origin.z + 32 );
WRITE_COORD(pev->origin.x); WRITE_COORD( pev->origin.x );
WRITE_COORD(pev->origin.y); WRITE_COORD( pev->origin.y );
WRITE_COORD(pev->origin.z + 32 + pev->dmg * 2 / .2); // reach damage radius over .3 seconds WRITE_COORD( pev->origin.z + 32 + pev->dmg * 2 / .2 ); // reach damage radius over .3 seconds
WRITE_SHORT(m_spriteTexture ); WRITE_SHORT( m_spriteTexture );
WRITE_BYTE( 0 ); // startframe WRITE_BYTE( 0 ); // startframe
WRITE_BYTE( 0 ); // framerate WRITE_BYTE( 0 ); // framerate
WRITE_BYTE( 2 ); // life WRITE_BYTE( 2 ); // life
@ -266,22 +270,22 @@ void CMortar::MortarExplode( void )
#endif #endif
TraceResult tr; TraceResult tr;
UTIL_TraceLine( pev->origin + Vector( 0, 0, 1024 ), pev->origin - Vector( 0, 0, 1024 ), dont_ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( pev->origin + Vector( 0, 0, 1024 ), pev->origin - Vector( 0, 0, 1024 ), dont_ignore_monsters, ENT( pev ), &tr );
Explode( &tr, DMG_BLAST | DMG_MORTAR ); Explode( &tr, DMG_BLAST | DMG_MORTAR );
UTIL_ScreenShake( tr.vecEndPos, 25.0, 150.0, 1.0, 750 ); UTIL_ScreenShake( tr.vecEndPos, 25.0, 150.0, 1.0, 750 );
#if 0 #if 0
int pitch = RANDOM_LONG(95,124); int pitch = RANDOM_LONG( 95, 124 );
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/mortarhit.wav", 1.0, 0.55, 0, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "weapons/mortarhit.wav", 1.0, 0.55, 0, pitch );
// ForceSound( SNDRADIUS_MP5, bits_SOUND_COMBAT ); // ForceSound( SNDRADIUS_MP5, bits_SOUND_COMBAT );
// ExplodeModel( pev->origin, 400, g_sModelIndexShrapnel, 30 ); // ExplodeModel( pev->origin, 400, g_sModelIndexShrapnel, 30 );
RadiusDamage ( pev, VARS(pev->owner), pev->dmg, CLASS_NONE, DMG_BLAST ); RadiusDamage( pev, VARS( pev->owner ), pev->dmg, CLASS_NONE, DMG_BLAST );
/* /*
if ( RANDOM_FLOAT ( 0 , 1 ) < 0.5 ) if( RANDOM_FLOAT( 0, 1 ) < 0.5 )
{ {
UTIL_DecalTrace( pTrace, DECAL_SCORCH1 ); UTIL_DecalTrace( pTrace, DECAL_SCORCH1 );
} }
@ -303,7 +307,7 @@ void CMortar::ShootTimed( EVARS *pevOwner, Vector vecStart, float time )
pMortar->Spawn(); pMortar->Spawn();
TraceResult tr; TraceResult tr;
UTIL_TraceLine( vecStart, vecStart + Vector( 0, 0, -1 ) * 4096, ignore_monsters, ENT(pMortar->pev), &tr ); UTIL_TraceLine( vecStart, vecStart + Vector( 0, 0, -1 ) * 4096, ignore_monsters, ENT( pMortar->pev ), &tr );
pMortar->pev->nextthink = gpGlobals->time + time; pMortar->pev->nextthink = gpGlobals->time + time;

View File

@ -25,28 +25,28 @@ float CTalkMonster::g_talkWaitTime = 0; // time delay until it's ok to speak: u
/*********************************************************/ /*********************************************************/
CGraph WorldGraph; CGraph WorldGraph;
void CGraph :: InitGraph( void ) { } void CGraph::InitGraph( void ) { }
int CGraph :: FLoadGraph ( char *szMapName ) { return FALSE; } int CGraph::FLoadGraph( char *szMapName ) { return FALSE; }
int CGraph :: AllocNodes ( void ) { return FALSE; } int CGraph::AllocNodes( void ) { return FALSE; }
int CGraph :: CheckNODFile ( char *szMapName ) { return FALSE; } int CGraph::CheckNODFile( char *szMapName ) { return FALSE; }
int CGraph :: FSetGraphPointers ( void ) { return 0; } int CGraph::FSetGraphPointers( void ) { return 0; }
void CGraph :: ShowNodeConnections ( int iNode ) { } void CGraph::ShowNodeConnections( int iNode ) { }
int CGraph :: FindNearestNode ( const Vector &vecOrigin, int afNodeTypes ) { return 0; } int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes ) { return 0; }
/*********************************************************/ /*********************************************************/
void CBaseMonster :: ReportAIState( void ) { } void CBaseMonster::ReportAIState( void ) { }
float CBaseMonster :: ChangeYaw ( int speed ) { return 0; } float CBaseMonster::ChangeYaw( int speed ) { return 0; }
void CBaseMonster :: MakeIdealYaw( Vector vecTarget ) { } void CBaseMonster::MakeIdealYaw( Vector vecTarget ) { }
void CBaseMonster::CorpseFallThink( void ) void CBaseMonster::CorpseFallThink( void )
{ {
if ( pev->flags & FL_ONGROUND ) if( pev->flags & FL_ONGROUND )
{ {
SetThink( NULL ); SetThink( NULL );
SetSequenceBox( ); SetSequenceBox();
UTIL_SetOrigin( pev, pev->origin );// link into world. UTIL_SetOrigin( pev, pev->origin );// link into world.
} }
else else
@ -54,22 +54,22 @@ void CBaseMonster::CorpseFallThink( void )
} }
// Call after animation/pose is set up // Call after animation/pose is set up
void CBaseMonster :: MonsterInitDead( void ) void CBaseMonster::MonsterInitDead( void )
{ {
InitBoneControllers(); InitBoneControllers();
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->movetype = MOVETYPE_TOSS;// so he'll fall to ground pev->movetype = MOVETYPE_TOSS;// so he'll fall to ground
pev->frame = 0; pev->frame = 0;
ResetSequenceInfo( ); ResetSequenceInfo();
pev->framerate = 0; pev->framerate = 0;
// Copy health // Copy health
pev->max_health = pev->health; pev->max_health = pev->health;
pev->deadflag = DEAD_DEAD; pev->deadflag = DEAD_DEAD;
UTIL_SetSize(pev, g_vecZero, g_vecZero ); UTIL_SetSize( pev, g_vecZero, g_vecZero );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
// Setup health counters, etc. // Setup health counters, etc.
@ -78,22 +78,22 @@ void CBaseMonster :: MonsterInitDead( void )
pev->nextthink = gpGlobals->time + 0.5; pev->nextthink = gpGlobals->time + 0.5;
} }
BOOL CBaseMonster :: ShouldFadeOnDeath( void ) BOOL CBaseMonster::ShouldFadeOnDeath( void )
{ {
return FALSE; return FALSE;
} }
BOOL CBaseMonster :: FCheckAITrigger ( void ) BOOL CBaseMonster::FCheckAITrigger( void )
{ {
return FALSE; return FALSE;
} }
void CBaseMonster :: KeyValue( KeyValueData *pkvd ) void CBaseMonster::KeyValue( KeyValueData *pkvd )
{ {
CBaseToggle::KeyValue( pkvd ); CBaseToggle::KeyValue( pkvd );
} }
int CBaseMonster::IRelationship ( CBaseEntity *pTarget ) int CBaseMonster::IRelationship( CBaseEntity *pTarget )
{ {
static int iEnemy[14][14] = static int iEnemy[14][14] =
{ // NONE MACH PLYR HPASS HMIL AMIL APASS AMONST APREY APRED INSECT PLRALY PBWPN ABWPN { // NONE MACH PLYR HPASS HMIL AMIL APASS AMONST APREY APRED INSECT PLRALY PBWPN ABWPN
@ -113,7 +113,7 @@ int CBaseMonster::IRelationship ( CBaseEntity *pTarget )
/*ABIOWEAPON*/ { R_NO ,R_NO ,R_DL ,R_DL ,R_DL ,R_AL ,R_NO ,R_DL ,R_DL ,R_NO ,R_NO ,R_DL, R_DL, R_NO } /*ABIOWEAPON*/ { R_NO ,R_NO ,R_DL ,R_DL ,R_DL ,R_AL ,R_NO ,R_DL ,R_DL ,R_NO ,R_NO ,R_DL, R_DL, R_NO }
}; };
return iEnemy[ Classify() ][ pTarget->Classify() ]; return iEnemy[Classify()][pTarget->Classify()];
} }
//========================================================= //=========================================================
@ -128,33 +128,33 @@ int CBaseMonster::IRelationship ( CBaseEntity *pTarget )
// (linked via each ent's m_pLink field) // (linked via each ent's m_pLink field)
// //
//========================================================= //=========================================================
void CBaseMonster :: Look ( int iDistance ) void CBaseMonster::Look( int iDistance )
{ {
int iSighted = 0; int iSighted = 0;
// DON'T let visibility information from last frame sit around! // DON'T let visibility information from last frame sit around!
ClearConditions(bits_COND_SEE_HATE | bits_COND_SEE_DISLIKE | bits_COND_SEE_ENEMY | bits_COND_SEE_FEAR | bits_COND_SEE_NEMESIS | bits_COND_SEE_CLIENT); ClearConditions( bits_COND_SEE_HATE | bits_COND_SEE_DISLIKE | bits_COND_SEE_ENEMY | bits_COND_SEE_FEAR | bits_COND_SEE_NEMESIS | bits_COND_SEE_CLIENT );
m_pLink = NULL; m_pLink = NULL;
CBaseEntity *pSightEnt = NULL;// the current visible entity that we're dealing with CBaseEntity *pSightEnt = NULL;// the current visible entity that we're dealing with
CBaseEntity *pList[100]; CBaseEntity *pList[100];
Vector delta = Vector( iDistance, iDistance, iDistance ); Vector delta = Vector( iDistance, iDistance, iDistance );
// Find only monsters/clients in box, NOT limited to PVS // Find only monsters/clients in box, NOT limited to PVS
int count = UTIL_EntitiesInBox( pList, 100, pev->origin - delta, pev->origin + delta, FL_CLIENT|FL_MONSTER ); int count = UTIL_EntitiesInBox( pList, 100, pev->origin - delta, pev->origin + delta, FL_CLIENT | FL_MONSTER );
for ( int i = 0; i < count; i++ ) for( int i = 0; i < count; i++ )
{ {
pSightEnt = pList[i]; pSightEnt = pList[i];
if ( pSightEnt != this && pSightEnt->pev->health > 0 ) if( pSightEnt != this && pSightEnt->pev->health > 0 )
{ {
// the looker will want to consider this entity // the looker will want to consider this entity
// don't check anything else about an entity that can't be seen, or an entity that you don't care about. // don't check anything else about an entity that can't be seen, or an entity that you don't care about.
if ( IRelationship( pSightEnt ) != R_NO && FInViewCone( pSightEnt ) && !FBitSet( pSightEnt->pev->flags, FL_NOTARGET ) && FVisible( pSightEnt ) ) if( IRelationship( pSightEnt ) != R_NO && FInViewCone( pSightEnt ) && !FBitSet( pSightEnt->pev->flags, FL_NOTARGET ) && FVisible( pSightEnt ) )
{ {
if ( pSightEnt->IsPlayer() ) if( pSightEnt->IsPlayer() )
{ {
// if we see a client, remember that (mostly for scripted AI) // if we see a client, remember that (mostly for scripted AI)
iSighted |= bits_COND_SEE_CLIENT; iSighted |= bits_COND_SEE_CLIENT;
@ -163,7 +163,7 @@ void CBaseMonster :: Look ( int iDistance )
pSightEnt->m_pLink = m_pLink; pSightEnt->m_pLink = m_pLink;
m_pLink = pSightEnt; m_pLink = pSightEnt;
if ( pSightEnt == m_hEnemy ) if( pSightEnt == m_hEnemy )
{ {
// we know this ent is visible, so if it also happens to be our enemy, store that now. // we know this ent is visible, so if it also happens to be our enemy, store that now.
iSighted |= bits_COND_SEE_ENEMY; iSighted |= bits_COND_SEE_ENEMY;
@ -171,30 +171,30 @@ void CBaseMonster :: Look ( int iDistance )
// don't add the Enemy's relationship to the conditions. We only want to worry about conditions when // don't add the Enemy's relationship to the conditions. We only want to worry about conditions when
// we see monsters other than the Enemy. // we see monsters other than the Enemy.
switch ( IRelationship ( pSightEnt ) ) switch( IRelationship( pSightEnt ) )
{ {
case R_NM: case R_NM:
iSighted |= bits_COND_SEE_NEMESIS; iSighted |= bits_COND_SEE_NEMESIS;
break; break;
case R_HT: case R_HT:
iSighted |= bits_COND_SEE_HATE; iSighted |= bits_COND_SEE_HATE;
break; break;
case R_DL: case R_DL:
iSighted |= bits_COND_SEE_DISLIKE; iSighted |= bits_COND_SEE_DISLIKE;
break; break;
case R_FR: case R_FR:
iSighted |= bits_COND_SEE_FEAR; iSighted |= bits_COND_SEE_FEAR;
break; break;
case R_AL: case R_AL:
break; break;
default: default:
ALERT ( at_aiconsole, "%s can't assess %s\n", STRING(pev->classname), STRING(pSightEnt->pev->classname ) ); ALERT( at_aiconsole, "%s can't assess %s\n", STRING( pev->classname ), STRING(pSightEnt->pev->classname ) );
break; break;
} }
} }
} }
} }
SetConditions( iSighted ); SetConditions( iSighted );
} }
@ -207,43 +207,43 @@ void CBaseMonster :: Look ( int iDistance )
// !!!UNDONE - currently, this only returns the closest enemy. // !!!UNDONE - currently, this only returns the closest enemy.
// we'll want to consider distance, relationship, attack types, back turned, etc. // we'll want to consider distance, relationship, attack types, back turned, etc.
//========================================================= //=========================================================
CBaseEntity *CBaseMonster :: BestVisibleEnemy ( void ) CBaseEntity *CBaseMonster::BestVisibleEnemy( void )
{ {
CBaseEntity *pReturn; CBaseEntity *pReturn;
CBaseEntity *pNextEnt; CBaseEntity *pNextEnt;
int iNearest; int iNearest;
int iDist; int iDist;
int iBestRelationship; int iBestRelationship;
iNearest = 8192;// so first visible entity will become the closest. iNearest = 8192;// so first visible entity will become the closest.
pNextEnt = m_pLink; pNextEnt = m_pLink;
pReturn = NULL; pReturn = NULL;
iBestRelationship = R_NO; iBestRelationship = R_NO;
while ( pNextEnt != NULL ) while( pNextEnt != NULL )
{ {
if ( pNextEnt->IsAlive() ) if( pNextEnt->IsAlive() )
{ {
if ( IRelationship( pNextEnt) > iBestRelationship ) if( IRelationship( pNextEnt ) > iBestRelationship )
{ {
// this entity is disliked MORE than the entity that we // this entity is disliked MORE than the entity that we
// currently think is the best visible enemy. No need to do // currently think is the best visible enemy. No need to do
// a distance check, just get mad at this one for now. // a distance check, just get mad at this one for now.
iBestRelationship = IRelationship ( pNextEnt ); iBestRelationship = IRelationship( pNextEnt );
iNearest = ( pNextEnt->pev->origin - pev->origin ).Length(); iNearest = ( pNextEnt->pev->origin - pev->origin ).Length();
pReturn = pNextEnt; pReturn = pNextEnt;
} }
else if ( IRelationship( pNextEnt) == iBestRelationship ) else if( IRelationship( pNextEnt ) == iBestRelationship )
{ {
// this entity is disliked just as much as the entity that // this entity is disliked just as much as the entity that
// we currently think is the best visible enemy, so we only // we currently think is the best visible enemy, so we only
// get mad at it if it is closer. // get mad at it if it is closer.
iDist = ( pNextEnt->pev->origin - pev->origin ).Length(); iDist = ( pNextEnt->pev->origin - pev->origin ).Length();
if ( iDist <= iNearest ) if( iDist <= iNearest )
{ {
iNearest = iDist; iNearest = iDist;
iBestRelationship = IRelationship ( pNextEnt ); iBestRelationship = IRelationship( pNextEnt );
pReturn = pNextEnt; pReturn = pNextEnt;
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -38,15 +38,15 @@ typedef struct
class COsprey : public CBaseMonster class COsprey : public CBaseMonster
{ {
public: public:
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int ObjectCaps( void ) { return CBaseMonster :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } int ObjectCaps( void ) { return CBaseMonster::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int Classify( void ) { return CLASS_MACHINE; }; int Classify( void ) { return CLASS_MACHINE; };
int BloodColor( void ) { return DONT_BLEED; } int BloodColor( void ) { return DONT_BLEED; }
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
void UpdateGoal( void ); void UpdateGoal( void );
@ -62,8 +62,8 @@ public:
void EXPORT DyingThink( void ); void EXPORT DyingThink( void );
void EXPORT CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
// int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); // int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType );
void ShowDamage( void ); void ShowDamage( void );
CBaseEntity *m_pGoalEnt; CBaseEntity *m_pGoalEnt;
@ -84,7 +84,7 @@ public:
float m_flRightHealth; float m_flRightHealth;
float m_flLeftHealth; float m_flLeftHealth;
int m_iUnits; int m_iUnits;
EHANDLE m_hGrunt[MAX_CARRY]; EHANDLE m_hGrunt[MAX_CARRY];
Vector m_vecOrigin[MAX_CARRY]; Vector m_vecOrigin[MAX_CARRY];
EHANDLE m_hRepel[4]; EHANDLE m_hRepel[4];
@ -95,9 +95,9 @@ public:
int m_iPitch; int m_iPitch;
int m_iExplode; int m_iExplode;
int m_iTailGibs; int m_iTailGibs;
int m_iBodyGibs; int m_iBodyGibs;
int m_iEngineGibs; int m_iEngineGibs;
int m_iDoLeftSmokePuff; int m_iDoLeftSmokePuff;
int m_iDoRightSmokePuff; int m_iDoRightSmokePuff;
@ -140,35 +140,35 @@ TYPEDESCRIPTION COsprey::m_SaveData[] =
IMPLEMENT_SAVERESTORE( COsprey, CBaseMonster ) IMPLEMENT_SAVERESTORE( COsprey, CBaseMonster )
void COsprey :: Spawn( void ) void COsprey::Spawn( void )
{ {
Precache( ); Precache();
// motor // motor
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/osprey.mdl"); SET_MODEL( ENT( pev ), "models/osprey.mdl" );
UTIL_SetSize(pev, Vector( -400, -400, -100), Vector(400, 400, 32)); UTIL_SetSize( pev, Vector( -400, -400, -100 ), Vector( 400, 400, 32 ) );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
pev->flags |= FL_MONSTER; pev->flags |= FL_MONSTER;
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
m_flRightHealth = 200; m_flRightHealth = 200;
m_flLeftHealth = 200; m_flLeftHealth = 200;
pev->health = 400; pev->health = 400;
m_flFieldOfView = 0; // 180 degrees m_flFieldOfView = 0; // 180 degrees
pev->sequence = 0; pev->sequence = 0;
ResetSequenceInfo( ); ResetSequenceInfo();
pev->frame = RANDOM_LONG(0,0xFF); pev->frame = RANDOM_LONG( 0, 0xFF );
InitBoneControllers(); InitBoneControllers();
SetThink( &COsprey::FindAllThink ); SetThink( &COsprey::FindAllThink );
SetUse( &COsprey::CommandUse ); SetUse( &COsprey::CommandUse );
if (!(pev->spawnflags & SF_WAITFORTRIGGER)) if( !( pev->spawnflags & SF_WAITFORTRIGGER ) )
{ {
pev->nextthink = gpGlobals->time + 1.0; pev->nextthink = gpGlobals->time + 1.0;
} }
@ -182,15 +182,15 @@ void COsprey::Precache( void )
{ {
UTIL_PrecacheOther( "monster_human_grunt" ); UTIL_PrecacheOther( "monster_human_grunt" );
PRECACHE_MODEL("models/osprey.mdl"); PRECACHE_MODEL( "models/osprey.mdl" );
PRECACHE_MODEL("models/HVR.mdl"); PRECACHE_MODEL( "models/HVR.mdl" );
PRECACHE_SOUND("apache/ap_rotor4.wav"); PRECACHE_SOUND( "apache/ap_rotor4.wav" );
PRECACHE_SOUND("weapons/mortarhit.wav"); PRECACHE_SOUND( "weapons/mortarhit.wav" );
m_iSpriteTexture = PRECACHE_MODEL( "sprites/rope.spr" ); m_iSpriteTexture = PRECACHE_MODEL( "sprites/rope.spr" );
m_iExplode = PRECACHE_MODEL( "sprites/fexplo.spr" ); m_iExplode = PRECACHE_MODEL( "sprites/fexplo.spr" );
m_iTailGibs = PRECACHE_MODEL( "models/osprey_tailgibs.mdl" ); m_iTailGibs = PRECACHE_MODEL( "models/osprey_tailgibs.mdl" );
m_iBodyGibs = PRECACHE_MODEL( "models/osprey_bodygibs.mdl" ); m_iBodyGibs = PRECACHE_MODEL( "models/osprey_bodygibs.mdl" );
m_iEngineGibs = PRECACHE_MODEL( "models/osprey_enginegibs.mdl" ); m_iEngineGibs = PRECACHE_MODEL( "models/osprey_enginegibs.mdl" );
@ -201,24 +201,24 @@ void COsprey::CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
void COsprey :: FindAllThink( void ) void COsprey::FindAllThink( void )
{ {
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
m_iUnits = 0; m_iUnits = 0;
while (m_iUnits < MAX_CARRY && (pEntity = UTIL_FindEntityByClassname( pEntity, "monster_human_grunt" )) != NULL) while( m_iUnits < MAX_CARRY && ( pEntity = UTIL_FindEntityByClassname( pEntity, "monster_human_grunt" ) ) != NULL )
{ {
if (pEntity->IsAlive()) if( pEntity->IsAlive() )
{ {
m_hGrunt[m_iUnits] = pEntity; m_hGrunt[m_iUnits] = pEntity;
m_vecOrigin[m_iUnits] = pEntity->pev->origin; m_vecOrigin[m_iUnits] = pEntity->pev->origin;
m_iUnits++; m_iUnits++;
} }
} }
if (m_iUnits == 0) if( m_iUnits == 0 )
{ {
ALERT( at_console, "osprey error: no grunts to resupply\n"); ALERT( at_console, "osprey error: no grunts to resupply\n" );
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
@ -227,7 +227,7 @@ void COsprey :: FindAllThink( void )
m_startTime = gpGlobals->time; m_startTime = gpGlobals->time;
} }
void COsprey :: DeployThink( void ) void COsprey::DeployThink( void )
{ {
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
@ -238,8 +238,8 @@ void COsprey :: DeployThink( void )
Vector vecSrc; Vector vecSrc;
TraceResult tr; TraceResult tr;
UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, -4096.0), ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, -4096.0 ), ignore_monsters, ENT( pev ), &tr );
CSoundEnt::InsertSound ( bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3 ); CSoundEnt::InsertSound( bits_SOUND_DANGER, tr.vecEndPos, 400, 0.3 );
vecSrc = pev->origin + vecForward * 32 + vecRight * 100 + vecUp * -96; vecSrc = pev->origin + vecForward * 32 + vecRight * 100 + vecUp * -96;
m_hRepel[0] = MakeGrunt( vecSrc ); m_hRepel[0] = MakeGrunt( vecSrc );
@ -257,11 +257,11 @@ void COsprey :: DeployThink( void )
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
BOOL COsprey :: HasDead( ) BOOL COsprey::HasDead()
{ {
for (int i = 0; i < m_iUnits; i++) for( int i = 0; i < m_iUnits; i++ )
{ {
if (m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive()) if( m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive() )
{ {
return TRUE; return TRUE;
} }
@ -273,26 +273,26 @@ BOOL COsprey :: HasDead( )
return FALSE; return FALSE;
} }
CBaseMonster *COsprey :: MakeGrunt( Vector vecSrc ) CBaseMonster *COsprey::MakeGrunt( Vector vecSrc )
{ {
CBaseEntity *pEntity; CBaseEntity *pEntity;
CBaseMonster *pGrunt; CBaseMonster *pGrunt;
TraceResult tr; TraceResult tr;
UTIL_TraceLine( vecSrc, vecSrc + Vector( 0, 0, -4096.0), dont_ignore_monsters, ENT(pev), &tr); UTIL_TraceLine( vecSrc, vecSrc + Vector( 0, 0, -4096.0 ), dont_ignore_monsters, ENT( pev ), &tr );
if ( tr.pHit && Instance( tr.pHit )->pev->solid != SOLID_BSP) if( tr.pHit && Instance( tr.pHit )->pev->solid != SOLID_BSP )
return NULL; return NULL;
for (int i = 0; i < m_iUnits; i++) for( int i = 0; i < m_iUnits; i++ )
{ {
if (m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive()) if( m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive() )
{ {
if (m_hGrunt[i] != NULL && m_hGrunt[i]->pev->rendermode == kRenderNormal) if( m_hGrunt[i] != NULL && m_hGrunt[i]->pev->rendermode == kRenderNormal )
{ {
m_hGrunt[i]->SUB_StartFadeOut( ); m_hGrunt[i]->SUB_StartFadeOut();
} }
pEntity = Create( "monster_human_grunt", vecSrc, pev->angles ); pEntity = Create( "monster_human_grunt", vecSrc, pev->angles );
pGrunt = pEntity->MyMonsterPointer( ); pGrunt = pEntity->MyMonsterPointer();
pGrunt->pev->movetype = MOVETYPE_FLY; pGrunt->pev->movetype = MOVETYPE_FLY;
pGrunt->pev->velocity = Vector( 0, 0, RANDOM_FLOAT( -196, -128 ) ); pGrunt->pev->velocity = Vector( 0, 0, RANDOM_FLOAT( -196, -128 ) );
pGrunt->SetActivity( ACT_GLIDE ); pGrunt->SetActivity( ACT_GLIDE );
@ -314,18 +314,18 @@ CBaseMonster *COsprey :: MakeGrunt( Vector vecSrc )
return NULL; return NULL;
} }
void COsprey :: HoverThink( void ) void COsprey::HoverThink( void )
{ {
int i; int i;
for (i = 0; i < 4; i++) for( i = 0; i < 4; i++ )
{ {
if (m_hRepel[i] != NULL && m_hRepel[i]->pev->health > 0 && !(m_hRepel[i]->pev->flags & FL_ONGROUND)) if( m_hRepel[i] != NULL && m_hRepel[i]->pev->health > 0 && !( m_hRepel[i]->pev->flags & FL_ONGROUND ) )
{ {
break; break;
} }
} }
if (i == 4) if( i == 4 )
{ {
m_startTime = gpGlobals->time; m_startTime = gpGlobals->time;
SetThink( &COsprey::FlyThink ); SetThink( &COsprey::FlyThink );
@ -333,12 +333,12 @@ void COsprey :: HoverThink( void )
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
ShowDamage( ); ShowDamage();
} }
void COsprey::UpdateGoal( ) void COsprey::UpdateGoal()
{ {
if (m_pGoalEnt) if( m_pGoalEnt )
{ {
m_pos1 = m_pos2; m_pos1 = m_pos2;
m_ang1 = m_ang2; m_ang1 = m_ang2;
@ -349,65 +349,65 @@ void COsprey::UpdateGoal( )
m_vel2 = gpGlobals->v_forward * m_pGoalEnt->pev->speed; m_vel2 = gpGlobals->v_forward * m_pGoalEnt->pev->speed;
m_startTime = m_startTime + m_dTime; m_startTime = m_startTime + m_dTime;
m_dTime = 2.0 * (m_pos1 - m_pos2).Length() / (m_vel1.Length() + m_pGoalEnt->pev->speed); m_dTime = 2.0 * ( m_pos1 - m_pos2 ).Length() / ( m_vel1.Length() + m_pGoalEnt->pev->speed );
if (m_ang1.y - m_ang2.y < -180) if( m_ang1.y - m_ang2.y < -180 )
{ {
m_ang1.y += 360; m_ang1.y += 360;
} }
else if (m_ang1.y - m_ang2.y > 180) else if( m_ang1.y - m_ang2.y > 180 )
{ {
m_ang1.y -= 360; m_ang1.y -= 360;
} }
if (m_pGoalEnt->pev->speed < 400) if( m_pGoalEnt->pev->speed < 400 )
m_flIdealtilt = 0; m_flIdealtilt = 0;
else else
m_flIdealtilt = -90; m_flIdealtilt = -90;
} }
else else
{ {
ALERT( at_console, "osprey missing target"); ALERT( at_console, "osprey missing target" );
} }
} }
void COsprey::FlyThink( void ) void COsprey::FlyThink( void )
{ {
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if ( m_pGoalEnt == NULL && !FStringNull(pev->target) )// this monster has a target if( m_pGoalEnt == NULL && !FStringNull( pev->target) )// this monster has a target
{ {
m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME ( NULL, STRING( pev->target ) ) ); m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) ) );
UpdateGoal( ); UpdateGoal();
} }
if (gpGlobals->time > m_startTime + m_dTime) if( gpGlobals->time > m_startTime + m_dTime )
{ {
if (m_pGoalEnt->pev->speed == 0) if( m_pGoalEnt->pev->speed == 0 )
{ {
SetThink( &COsprey::DeployThink ); SetThink( &COsprey::DeployThink );
} }
do { do{
m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME ( NULL, STRING( m_pGoalEnt->pev->target ) ) ); m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME( NULL, STRING( m_pGoalEnt->pev->target ) ) );
} while (m_pGoalEnt->pev->speed < 400 && !HasDead()); } while( m_pGoalEnt->pev->speed < 400 && !HasDead() );
UpdateGoal( ); UpdateGoal();
} }
Flight( ); Flight();
ShowDamage( ); ShowDamage();
} }
void COsprey::Flight( ) void COsprey::Flight()
{ {
float t = (gpGlobals->time - m_startTime); float t = ( gpGlobals->time - m_startTime );
float scale = 1.0 / m_dTime; float scale = 1.0 / m_dTime;
float f = UTIL_SplineFraction( t * scale, 1.0 ); float f = UTIL_SplineFraction( t * scale, 1.0 );
Vector pos = (m_pos1 + m_vel1 * t) * (1.0 - f) + (m_pos2 - m_vel2 * (m_dTime - t)) * f; Vector pos = ( m_pos1 + m_vel1 * t ) * ( 1.0 - f ) + ( m_pos2 - m_vel2 * ( m_dTime - t ) ) * f;
Vector ang = (m_ang1) * (1.0 - f) + (m_ang2) * f; Vector ang = ( m_ang1 ) * ( 1.0 - f ) + ( m_ang2 ) * f;
m_velocity = m_vel1 * (1.0 - f) + m_vel2 * f; m_velocity = m_vel1 * ( 1.0 - f ) + m_vel2 * f;
UTIL_SetOrigin( pev, pos ); UTIL_SetOrigin( pev, pos );
pev->angles = ang; pev->angles = ang;
@ -416,28 +416,27 @@ void COsprey::Flight( )
// float flSpeed = DotProduct( gpGlobals->v_forward, pev->velocity ); // float flSpeed = DotProduct( gpGlobals->v_forward, pev->velocity );
float m_flIdealtilt = (160 - flSpeed) / 10.0; float m_flIdealtilt = ( 160 - flSpeed ) / 10.0;
// ALERT( at_console, "%f %f\n", flSpeed, flIdealtilt ); // ALERT( at_console, "%f %f\n", flSpeed, flIdealtilt );
if (m_flRotortilt < m_flIdealtilt) if( m_flRotortilt < m_flIdealtilt )
{ {
m_flRotortilt += 0.5; m_flRotortilt += 0.5;
if (m_flRotortilt > 0) if ( m_flRotortilt > 0 )
m_flRotortilt = 0; m_flRotortilt = 0;
} }
if (m_flRotortilt > m_flIdealtilt) if( m_flRotortilt > m_flIdealtilt )
{ {
m_flRotortilt -= 0.5; m_flRotortilt -= 0.5;
if (m_flRotortilt < -90) if( m_flRotortilt < -90 )
m_flRotortilt = -90; m_flRotortilt = -90;
} }
SetBoneController( 0, m_flRotortilt ); SetBoneController( 0, m_flRotortilt );
if( m_iSoundState == 0 )
if (m_iSoundState == 0)
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, 0, 110 ); EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, 0, 110 );
// EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_whine1.wav", 0.5, 0.2, 0, 110 ); // EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, "apache/ap_whine1.wav", 0.5, 0.2, 0, 110 );
m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions
} }
@ -447,28 +446,28 @@ void COsprey::Flight( )
pPlayer = UTIL_FindEntityByClassname( NULL, "player" ); pPlayer = UTIL_FindEntityByClassname( NULL, "player" );
// UNDONE: this needs to send different sounds to every player for multiplayer. // UNDONE: this needs to send different sounds to every player for multiplayer.
if (pPlayer) if( pPlayer )
{ {
float pitch = DotProduct( m_velocity - pPlayer->pev->velocity, (pPlayer->pev->origin - pev->origin).Normalize() ); float pitch = DotProduct( m_velocity - pPlayer->pev->velocity, ( pPlayer->pev->origin - pev->origin ).Normalize() );
pitch = (int)(100 + pitch / 75.0); pitch = (int)( 100 + pitch / 75.0 );
if (pitch > 250) if( pitch > 250 )
pitch = 250; pitch = 250;
if (pitch < 50) if( pitch < 50 )
pitch = 50; pitch = 50;
if (pitch == 100) if( pitch == 100 )
pitch = 101; pitch = 101;
if (pitch != m_iPitch) if( pitch != m_iPitch )
{ {
m_iPitch = pitch; m_iPitch = pitch;
EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch );
// ALERT( at_console, "%.0f\n", pitch ); // ALERT( at_console, "%.0f\n", pitch );
} }
} }
// EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_whine1.wav", flVol, 0.2, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch); // EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, "apache/ap_whine1.wav", flVol, 0.2, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch );
} }
} }
@ -481,7 +480,7 @@ void COsprey::HitTouch( CBaseEntity *pOther )
/* /*
int COsprey::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) int COsprey::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{ {
if (m_flRotortilt <= -90) if( m_flRotortilt <= -90 )
{ {
m_flRotortilt = 0; m_flRotortilt = 0;
} }
@ -494,15 +493,15 @@ int COsprey::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float
} }
*/ */
void COsprey :: Killed( entvars_t *pevAttacker, int iGib ) void COsprey::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->movetype = MOVETYPE_TOSS; pev->movetype = MOVETYPE_TOSS;
pev->gravity = 0.3; pev->gravity = 0.3;
pev->velocity = m_velocity; pev->velocity = m_velocity;
pev->avelocity = Vector( RANDOM_FLOAT( -20, 20 ), 0, RANDOM_FLOAT( -50, 50 ) ); pev->avelocity = Vector( RANDOM_FLOAT( -20, 20 ), 0, RANDOM_FLOAT( -50, 50 ) );
STOP_SOUND( ENT(pev), CHAN_STATIC, "apache/ap_rotor4.wav" ); STOP_SOUND( ENT( pev ), CHAN_STATIC, "apache/ap_rotor4.wav" );
UTIL_SetSize( pev, Vector( -32, -32, -64), Vector( 32, 32, 0) ); UTIL_SetSize( pev, Vector( -32, -32, -64 ), Vector( 32, 32, 0 ) );
SetThink( &COsprey::DyingThink ); SetThink( &COsprey::DyingThink );
SetTouch( &COsprey::CrashTouch ); SetTouch( &COsprey::CrashTouch );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
@ -515,7 +514,7 @@ void COsprey :: Killed( entvars_t *pevAttacker, int iGib )
void COsprey::CrashTouch( CBaseEntity *pOther ) void COsprey::CrashTouch( CBaseEntity *pOther )
{ {
// only crash if we hit something solid // only crash if we hit something solid
if ( pOther->pev->solid == SOLID_BSP) if( pOther->pev->solid == SOLID_BSP )
{ {
SetTouch( NULL ); SetTouch( NULL );
m_startTime = gpGlobals->time; m_startTime = gpGlobals->time;
@ -524,46 +523,45 @@ void COsprey::CrashTouch( CBaseEntity *pOther )
} }
} }
void COsprey :: DyingThink( void ) void COsprey::DyingThink( void )
{ {
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
pev->avelocity = pev->avelocity * 1.02; pev->avelocity = pev->avelocity * 1.02;
// still falling? // still falling?
if (m_startTime > gpGlobals->time ) if( m_startTime > gpGlobals->time )
{ {
UTIL_MakeAimVectors( pev->angles ); UTIL_MakeAimVectors( pev->angles );
ShowDamage( ); ShowDamage();
Vector vecSpot = pev->origin + pev->velocity * 0.2; Vector vecSpot = pev->origin + pev->velocity * 0.2;
// random explosions // random explosions
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot );
WRITE_BYTE( TE_EXPLOSION); // This just makes a dynamic light now WRITE_BYTE( TE_EXPLOSION ); // This just makes a dynamic light now
WRITE_COORD( vecSpot.x + RANDOM_FLOAT( -150, 150 )); WRITE_COORD( vecSpot.x + RANDOM_FLOAT( -150, 150 ) );
WRITE_COORD( vecSpot.y + RANDOM_FLOAT( -150, 150 )); WRITE_COORD( vecSpot.y + RANDOM_FLOAT( -150, 150 ) );
WRITE_COORD( vecSpot.z + RANDOM_FLOAT( -150, -50 )); WRITE_COORD( vecSpot.z + RANDOM_FLOAT( -150, -50 ) );
WRITE_SHORT( g_sModelIndexFireball ); WRITE_SHORT( g_sModelIndexFireball );
WRITE_BYTE( RANDOM_LONG(0,29) + 30 ); // scale * 10 WRITE_BYTE( RANDOM_LONG( 0, 29 ) + 30 ); // scale * 10
WRITE_BYTE( 12 ); // framerate WRITE_BYTE( 12 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE ); WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END(); MESSAGE_END();
// lots of smoke // lots of smoke
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot );
WRITE_BYTE( TE_SMOKE ); WRITE_BYTE( TE_SMOKE );
WRITE_COORD( vecSpot.x + RANDOM_FLOAT( -150, 150 )); WRITE_COORD( vecSpot.x + RANDOM_FLOAT( -150, 150 ) );
WRITE_COORD( vecSpot.y + RANDOM_FLOAT( -150, 150 )); WRITE_COORD( vecSpot.y + RANDOM_FLOAT( -150, 150 ) );
WRITE_COORD( vecSpot.z + RANDOM_FLOAT( -150, -50 )); WRITE_COORD( vecSpot.z + RANDOM_FLOAT( -150, -50 ) );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( 100 ); // scale * 10 WRITE_BYTE( 100 ); // scale * 10
WRITE_BYTE( 10 ); // framerate WRITE_BYTE( 10 ); // framerate
MESSAGE_END(); MESSAGE_END();
vecSpot = pev->origin + ( pev->mins + pev->maxs ) * 0.5;
vecSpot = pev->origin + (pev->mins + pev->maxs) * 0.5;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot );
WRITE_BYTE( TE_BREAKMODEL); WRITE_BYTE( TE_BREAKMODEL);
@ -595,12 +593,9 @@ void COsprey :: DyingThink( void )
WRITE_BYTE( 200 );// 10.0 seconds WRITE_BYTE( 200 );// 10.0 seconds
// flags // flags
WRITE_BYTE( BREAK_METAL ); WRITE_BYTE( BREAK_METAL );
MESSAGE_END(); MESSAGE_END();
// don't stop it we touch a entity // don't stop it we touch a entity
pev->flags &= ~FL_ONGROUND; pev->flags &= ~FL_ONGROUND;
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
@ -608,7 +603,7 @@ void COsprey :: DyingThink( void )
} }
else else
{ {
Vector vecSpot = pev->origin + (pev->mins + pev->maxs) * 0.5; Vector vecSpot = pev->origin + ( pev->mins + pev->maxs ) * 0.5;
/* /*
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
@ -618,7 +613,7 @@ void COsprey :: DyingThink( void )
WRITE_COORD( vecSpot.z + 512 ); WRITE_COORD( vecSpot.z + 512 );
WRITE_SHORT( m_iExplode ); WRITE_SHORT( m_iExplode );
WRITE_BYTE( 250 ); // scale * 10 WRITE_BYTE( 250 ); // scale * 10
WRITE_BYTE( 10 ); // framerate WRITE_BYTE( 10 ); // framerate
MESSAGE_END(); MESSAGE_END();
*/ */
@ -641,7 +636,7 @@ void COsprey :: DyingThink( void )
WRITE_COORD( vecSpot.z + 300 ); WRITE_COORD( vecSpot.z + 300 );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( 250 ); // scale * 10 WRITE_BYTE( 250 ); // scale * 10
WRITE_BYTE( 6 ); // framerate WRITE_BYTE( 6 ); // framerate
MESSAGE_END(); MESSAGE_END();
*/ */
@ -667,19 +662,19 @@ void COsprey :: DyingThink( void )
WRITE_BYTE( 0 ); // speed WRITE_BYTE( 0 ); // speed
MESSAGE_END(); MESSAGE_END();
EMIT_SOUND(ENT(pev), CHAN_STATIC, "weapons/mortarhit.wav", 1.0, 0.3); EMIT_SOUND( ENT( pev ), CHAN_STATIC, "weapons/mortarhit.wav", 1.0, 0.3 );
RadiusDamage( pev->origin, pev, pev, 300, CLASS_NONE, DMG_BLAST ); RadiusDamage( pev->origin, pev, pev, 300, CLASS_NONE, DMG_BLAST );
// gibs // gibs
vecSpot = pev->origin + (pev->mins + pev->maxs) * 0.5; vecSpot = pev->origin + ( pev->mins + pev->maxs ) * 0.5;
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, vecSpot ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, vecSpot );
WRITE_BYTE( TE_BREAKMODEL); WRITE_BYTE( TE_BREAKMODEL);
// position // position
WRITE_COORD( vecSpot.x ); WRITE_COORD( vecSpot.x );
WRITE_COORD( vecSpot.y ); WRITE_COORD( vecSpot.y );
WRITE_COORD( vecSpot.z + 64); WRITE_COORD( vecSpot.z + 64 );
// size // size
WRITE_COORD( 800 ); WRITE_COORD( 800 );
@ -704,7 +699,6 @@ void COsprey :: DyingThink( void )
WRITE_BYTE( 200 );// 10.0 seconds WRITE_BYTE( 200 );// 10.0 seconds
// flags // flags
WRITE_BYTE( BREAK_METAL ); WRITE_BYTE( BREAK_METAL );
MESSAGE_END(); MESSAGE_END();
@ -712,9 +706,9 @@ void COsprey :: DyingThink( void )
} }
} }
void COsprey :: ShowDamage( void ) void COsprey::ShowDamage( void )
{ {
if (m_iDoLeftSmokePuff > 0 || RANDOM_LONG(0,99) > m_flLeftHealth) if( m_iDoLeftSmokePuff > 0 || RANDOM_LONG( 0, 99 ) > m_flLeftHealth )
{ {
Vector vecSrc = pev->origin + gpGlobals->v_right * -340; Vector vecSrc = pev->origin + gpGlobals->v_right * -340;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
@ -723,13 +717,13 @@ void COsprey :: ShowDamage( void )
WRITE_COORD( vecSrc.y ); WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z ); WRITE_COORD( vecSrc.z );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( RANDOM_LONG(0,9) + 20 ); // scale * 10 WRITE_BYTE( RANDOM_LONG( 0, 9 ) + 20 ); // scale * 10
WRITE_BYTE( 12 ); // framerate WRITE_BYTE( 12 ); // framerate
MESSAGE_END(); MESSAGE_END();
if (m_iDoLeftSmokePuff > 0) if( m_iDoLeftSmokePuff > 0 )
m_iDoLeftSmokePuff--; m_iDoLeftSmokePuff--;
} }
if (m_iDoRightSmokePuff > 0 || RANDOM_LONG(0,99) > m_flRightHealth) if( m_iDoRightSmokePuff > 0 || RANDOM_LONG( 0, 99 ) > m_flRightHealth )
{ {
Vector vecSrc = pev->origin + gpGlobals->v_right * 340; Vector vecSrc = pev->origin + gpGlobals->v_right * 340;
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
@ -738,39 +732,39 @@ void COsprey :: ShowDamage( void )
WRITE_COORD( vecSrc.y ); WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z ); WRITE_COORD( vecSrc.z );
WRITE_SHORT( g_sModelIndexSmoke ); WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( RANDOM_LONG(0,9) + 20 ); // scale * 10 WRITE_BYTE( RANDOM_LONG( 0, 9 ) + 20 ); // scale * 10
WRITE_BYTE( 12 ); // framerate WRITE_BYTE( 12 ); // framerate
MESSAGE_END(); MESSAGE_END();
if (m_iDoRightSmokePuff > 0) if( m_iDoRightSmokePuff > 0 )
m_iDoRightSmokePuff--; m_iDoRightSmokePuff--;
} }
} }
void COsprey::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) void COsprey::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
{ {
// ALERT( at_console, "%d %.0f\n", ptr->iHitgroup, flDamage ); // ALERT( at_console, "%d %.0f\n", ptr->iHitgroup, flDamage );
// only so much per engine // only so much per engine
if (ptr->iHitgroup == 3) if( ptr->iHitgroup == 3 )
{ {
if (m_flRightHealth < 0) if( m_flRightHealth < 0 )
return; return;
else else
m_flRightHealth -= flDamage; m_flRightHealth -= flDamage;
m_iDoLeftSmokePuff = 3 + (flDamage / 5.0); m_iDoLeftSmokePuff = 3 + ( flDamage / 5.0 );
} }
if (ptr->iHitgroup == 2) if( ptr->iHitgroup == 2 )
{ {
if (m_flLeftHealth < 0) if( m_flLeftHealth < 0 )
return; return;
else else
m_flLeftHealth -= flDamage; m_flLeftHealth -= flDamage;
m_iDoRightSmokePuff = 3 + (flDamage / 5.0); m_iDoRightSmokePuff = 3 + ( flDamage / 5.0 );
} }
// hit hard, hits cockpit, hits engines // hit hard, hits cockpit, hits engines
if (flDamage > 50 || ptr->iHitgroup == 1 || ptr->iHitgroup == 2 || ptr->iHitgroup == 3) if( flDamage > 50 || ptr->iHitgroup == 1 || ptr->iHitgroup == 2 || ptr->iHitgroup == 3 )
{ {
// ALERT( at_console, "%.0f\n", flDamage ); // ALERT( at_console, "%.0f\n", flDamage );
AddMultiDamage( pevAttacker, this, flDamage, bitsDamageType ); AddMultiDamage( pevAttacker, this, flDamage, bitsDamageType );

View File

@ -25,17 +25,17 @@
class CPathCorner : public CPointEntity class CPathCorner : public CPointEntity
{ {
public: public:
void Spawn( ); void Spawn();
void KeyValue( KeyValueData* pkvd ); void KeyValue( KeyValueData* pkvd );
float GetDelay( void ) { return m_flWait; } float GetDelay( void ) { return m_flWait; }
// void Touch( CBaseEntity *pOther ); //void Touch( CBaseEntity *pOther );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
private: private:
float m_flWait; float m_flWait;
}; };
LINK_ENTITY_TO_CLASS( path_corner, CPathCorner ) LINK_ENTITY_TO_CLASS( path_corner, CPathCorner )
@ -51,67 +51,68 @@ IMPLEMENT_SAVERESTORE( CPathCorner, CPointEntity )
// //
// Cache user-entity-field values until spawn is called. // Cache user-entity-field values until spawn is called.
// //
void CPathCorner :: KeyValue( KeyValueData *pkvd ) void CPathCorner::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "wait")) if( FStrEq( pkvd->szKeyName, "wait" ) )
{ {
m_flWait = atof(pkvd->szValue); m_flWait = atof( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
CPointEntity::KeyValue( pkvd ); CPointEntity::KeyValue( pkvd );
} }
void CPathCorner :: Spawn( ) void CPathCorner::Spawn()
{ {
ASSERTSZ(!FStringNull(pev->targetname), "path_corner without a targetname"); ASSERTSZ( !FStringNull( pev->targetname ), "path_corner without a targetname" );
} }
#if 0 #if 0
void CPathCorner :: Touch( CBaseEntity *pOther ) void CPathCorner::Touch( CBaseEntity *pOther )
{ {
entvars_t* pevToucher = pOther->pev; entvars_t *pevToucher = pOther->pev;
if ( FBitSet ( pevToucher->flags, FL_MONSTER ) ) if( FBitSet( pevToucher->flags, FL_MONSTER ) )
{// monsters don't navigate path corners based on touch anymore {
// monsters don't navigate path corners based on touch anymore
return; return;
} }
// If OTHER isn't explicitly looking for this path_corner, bail out // If OTHER isn't explicitly looking for this path_corner, bail out
if ( pOther->m_pGoalEnt != this ) if( pOther->m_pGoalEnt != this )
{ {
return; return;
} }
// If OTHER has an enemy, this touch is incidental, ignore // If OTHER has an enemy, this touch is incidental, ignore
if ( !FNullEnt(pevToucher->enemy) ) if( !FNullEnt( pevToucher->enemy ) )
{ {
return; // fighting, not following a path return; // fighting, not following a path
} }
// UNDONE: support non-zero flWait // UNDONE: support non-zero flWait
/* /*
if (m_flWait != 0) if( m_flWait != 0 )
ALERT(at_warning, "Non-zero path-cornder waits NYI"); ALERT( at_warning, "Non-zero path-cornder waits NYI" );
*/ */
// Find the next "stop" on the path, make it the goal of the "toucher". // Find the next "stop" on the path, make it the goal of the "toucher".
if (FStringNull(pev->target)) if( FStringNull( pev->target ) )
{ {
ALERT(at_warning, "PathCornerTouch: no next stop specified"); ALERT( at_warning, "PathCornerTouch: no next stop specified" );
} }
pOther->m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME ( NULL, STRING(pev->target) ) ); pOther->m_pGoalEnt = CBaseEntity::Instance( FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) ) );
// If "next spot" was not found (does not exist - level design error) // If "next spot" was not found (does not exist - level design error)
if ( !pOther->m_pGoalEnt ) if( !pOther->m_pGoalEnt )
{ {
ALERT(at_console, "PathCornerTouch--%s couldn't find next stop in path: %s", STRING(pev->classname), STRING(pev->target)); ALERT( at_console, "PathCornerTouch--%s couldn't find next stop in path: %s", STRING( pev->classname ), STRING( pev->target ) );
return; return;
} }
// Turn towards the next stop in the path. // Turn towards the next stop in the path.
pevToucher->ideal_yaw = UTIL_VecToYaw ( pOther->m_pGoalEnt->pev->origin - pevToucher->origin ); pevToucher->ideal_yaw = UTIL_VecToYaw( pOther->m_pGoalEnt->pev->origin - pevToucher->origin );
} }
#endif #endif
@ -130,28 +131,28 @@ LINK_ENTITY_TO_CLASS( path_track, CPathTrack )
// //
// Cache user-entity-field values until spawn is called. // Cache user-entity-field values until spawn is called.
// //
void CPathTrack :: KeyValue( KeyValueData *pkvd ) void CPathTrack::KeyValue( KeyValueData *pkvd )
{ {
if (FStrEq(pkvd->szKeyName, "altpath")) if( FStrEq( pkvd->szKeyName, "altpath" ) )
{ {
m_altName = ALLOC_STRING(pkvd->szValue); m_altName = ALLOC_STRING( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else else
CPointEntity::KeyValue( pkvd ); CPointEntity::KeyValue( pkvd );
} }
void CPathTrack :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) void CPathTrack::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{ {
int on; int on;
// Use toggles between two paths // Use toggles between two paths
if ( m_paltpath ) if( m_paltpath )
{ {
on = !FBitSet( pev->spawnflags, SF_PATH_ALTERNATE ); on = !FBitSet( pev->spawnflags, SF_PATH_ALTERNATE );
if ( ShouldToggle( useType, on ) ) if( ShouldToggle( useType, on ) )
{ {
if ( on ) if( on )
SetBits( pev->spawnflags, SF_PATH_ALTERNATE ); SetBits( pev->spawnflags, SF_PATH_ALTERNATE );
else else
ClearBits( pev->spawnflags, SF_PATH_ALTERNATE ); ClearBits( pev->spawnflags, SF_PATH_ALTERNATE );
@ -161,9 +162,9 @@ void CPathTrack :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
{ {
on = !FBitSet( pev->spawnflags, SF_PATH_DISABLED ); on = !FBitSet( pev->spawnflags, SF_PATH_DISABLED );
if ( ShouldToggle( useType, on ) ) if( ShouldToggle( useType, on ) )
{ {
if ( on ) if( on )
SetBits( pev->spawnflags, SF_PATH_DISABLED ); SetBits( pev->spawnflags, SF_PATH_DISABLED );
else else
ClearBits( pev->spawnflags, SF_PATH_DISABLED ); ClearBits( pev->spawnflags, SF_PATH_DISABLED );
@ -171,35 +172,35 @@ void CPathTrack :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
} }
} }
void CPathTrack :: Link( void ) void CPathTrack::Link( void )
{ {
edict_t *pentTarget; edict_t *pentTarget;
if ( !FStringNull(pev->target) ) if( !FStringNull( pev->target ) )
{ {
pentTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING(pev->target) ); pentTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) );
if ( !FNullEnt(pentTarget) ) if( !FNullEnt(pentTarget) )
{ {
m_pnext = CPathTrack::Instance( pentTarget ); m_pnext = CPathTrack::Instance( pentTarget );
if ( m_pnext ) // If no next pointer, this is the end of a path if( m_pnext ) // If no next pointer, this is the end of a path
{ {
m_pnext->SetPrevious( this ); m_pnext->SetPrevious( this );
} }
} }
else else
ALERT( at_console, "Dead end link %s\n", STRING(pev->target) ); ALERT( at_console, "Dead end link %s\n", STRING( pev->target ) );
} }
// Find "alternate" path // Find "alternate" path
if ( m_altName ) if( m_altName )
{ {
pentTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING(m_altName) ); pentTarget = FIND_ENTITY_BY_TARGETNAME( NULL, STRING( m_altName ) );
if ( !FNullEnt(pentTarget) ) if( !FNullEnt( pentTarget ) )
{ {
m_paltpath = CPathTrack::Instance( pentTarget ); m_paltpath = CPathTrack::Instance( pentTarget );
if ( m_paltpath ) // If no next pointer, this is the end of a path if( m_paltpath ) // If no next pointer, this is the end of a path
{ {
m_paltpath->SetPrevious( this ); m_paltpath->SetPrevious( this );
} }
@ -207,10 +208,10 @@ void CPathTrack :: Link( void )
} }
} }
void CPathTrack :: Spawn( void ) void CPathTrack::Spawn( void )
{ {
pev->solid = SOLID_TRIGGER; pev->solid = SOLID_TRIGGER;
UTIL_SetSize(pev, Vector(-8, -8, -8), Vector(8, 8, 8)); UTIL_SetSize( pev, Vector( -8, -8, -8 ), Vector( 8, 8, 8 ) );
m_pnext = NULL; m_pnext = NULL;
m_pprevious = NULL; m_pprevious = NULL;
@ -223,26 +224,26 @@ void CPathTrack :: Spawn( void )
void CPathTrack::Activate( void ) void CPathTrack::Activate( void )
{ {
if ( !FStringNull( pev->targetname ) ) // Link to next, and back-link if( !FStringNull( pev->targetname ) ) // Link to next, and back-link
Link(); Link();
} }
CPathTrack *CPathTrack :: ValidPath( CPathTrack *ppath, int testFlag ) CPathTrack *CPathTrack::ValidPath( CPathTrack *ppath, int testFlag )
{ {
if ( !ppath ) if( !ppath )
return NULL; return NULL;
if ( testFlag && FBitSet( ppath->pev->spawnflags, SF_PATH_DISABLED ) ) if( testFlag && FBitSet( ppath->pev->spawnflags, SF_PATH_DISABLED ) )
return NULL; return NULL;
return ppath; return ppath;
} }
void CPathTrack :: Project( CPathTrack *pstart, CPathTrack *pend, Vector *origin, float dist ) void CPathTrack::Project( CPathTrack *pstart, CPathTrack *pend, Vector *origin, float dist )
{ {
if ( pstart && pend ) if( pstart && pend )
{ {
Vector dir = (pend->pev->origin - pstart->pev->origin); Vector dir = pend->pev->origin - pstart->pev->origin;
dir = dir.Normalize(); dir = dir.Normalize();
*origin = pend->pev->origin + dir * dist; *origin = pend->pev->origin + dir * dist;
} }
@ -250,58 +251,56 @@ void CPathTrack :: Project( CPathTrack *pstart, CPathTrack *pend, Vector *origin
CPathTrack *CPathTrack::GetNext( void ) CPathTrack *CPathTrack::GetNext( void )
{ {
if ( m_paltpath && FBitSet( pev->spawnflags, SF_PATH_ALTERNATE ) && !FBitSet( pev->spawnflags, SF_PATH_ALTREVERSE ) ) if( m_paltpath && FBitSet( pev->spawnflags, SF_PATH_ALTERNATE ) && !FBitSet( pev->spawnflags, SF_PATH_ALTREVERSE ) )
return m_paltpath; return m_paltpath;
return m_pnext; return m_pnext;
} }
CPathTrack *CPathTrack::GetPrevious( void ) CPathTrack *CPathTrack::GetPrevious( void )
{ {
if ( m_paltpath && FBitSet( pev->spawnflags, SF_PATH_ALTERNATE ) && FBitSet( pev->spawnflags, SF_PATH_ALTREVERSE ) ) if( m_paltpath && FBitSet( pev->spawnflags, SF_PATH_ALTERNATE ) && FBitSet( pev->spawnflags, SF_PATH_ALTREVERSE ) )
return m_paltpath; return m_paltpath;
return m_pprevious; return m_pprevious;
} }
void CPathTrack::SetPrevious( CPathTrack *pprev ) void CPathTrack::SetPrevious( CPathTrack *pprev )
{ {
// Only set previous if this isn't my alternate path // Only set previous if this isn't my alternate path
if ( pprev && !FStrEq( STRING(pprev->pev->targetname), STRING(m_altName) ) ) if( pprev && !FStrEq( STRING( pprev->pev->targetname ), STRING( m_altName ) ) )
m_pprevious = pprev; m_pprevious = pprev;
} }
// Assumes this is ALWAYS enabled // Assumes this is ALWAYS enabled
CPathTrack *CPathTrack :: LookAhead( Vector *origin, float dist, int move ) CPathTrack *CPathTrack::LookAhead( Vector *origin, float dist, int move )
{ {
CPathTrack *pcurrent; CPathTrack *pcurrent;
float originalDist = dist; float originalDist = dist;
pcurrent = this; pcurrent = this;
Vector currentPos = *origin; Vector currentPos = *origin;
if ( dist < 0 ) // Travelling backwards through path if( dist < 0 ) // Travelling backwards through path
{ {
dist = -dist; dist = -dist;
while ( dist > 0 ) while( dist > 0 )
{ {
Vector dir = pcurrent->pev->origin - currentPos; Vector dir = pcurrent->pev->origin - currentPos;
float length = dir.Length(); float length = dir.Length();
if ( !length ) if( !length )
{ {
if ( !ValidPath(pcurrent->GetPrevious(), move) ) // If there is no previous node, or it's disabled, return now. if( !ValidPath( pcurrent->GetPrevious(), move ) ) // If there is no previous node, or it's disabled, return now.
{ {
if ( !move ) if( !move )
Project( pcurrent->GetNext(), pcurrent, origin, dist ); Project( pcurrent->GetNext(), pcurrent, origin, dist );
return NULL; return NULL;
} }
pcurrent = pcurrent->GetPrevious(); pcurrent = pcurrent->GetPrevious();
} }
else if ( length > dist ) // enough left in this path to move else if( length > dist ) // enough left in this path to move
{ {
*origin = currentPos + (dir * (dist / length)); *origin = currentPos + ( dir * ( dist / length ) );
return pcurrent; return pcurrent;
} }
else else
@ -309,7 +308,7 @@ CPathTrack *CPathTrack :: LookAhead( Vector *origin, float dist, int move )
dist -= length; dist -= length;
currentPos = pcurrent->pev->origin; currentPos = pcurrent->pev->origin;
*origin = currentPos; *origin = currentPos;
if ( !ValidPath(pcurrent->GetPrevious(), move) ) // If there is no previous node, or it's disabled, return now. if( !ValidPath( pcurrent->GetPrevious(), move ) ) // If there is no previous node, or it's disabled, return now.
return NULL; return NULL;
pcurrent = pcurrent->GetPrevious(); pcurrent = pcurrent->GetPrevious();
@ -320,23 +319,23 @@ CPathTrack *CPathTrack :: LookAhead( Vector *origin, float dist, int move )
} }
else else
{ {
while ( dist > 0 ) while( dist > 0 )
{ {
if ( !ValidPath(pcurrent->GetNext(), move) ) // If there is no next node, or it's disabled, return now. if( !ValidPath( pcurrent->GetNext(), move ) ) // If there is no next node, or it's disabled, return now.
{ {
if ( !move ) if( !move )
Project( pcurrent->GetPrevious(), pcurrent, origin, dist ); Project( pcurrent->GetPrevious(), pcurrent, origin, dist );
return NULL; return NULL;
} }
Vector dir = pcurrent->GetNext()->pev->origin - currentPos; Vector dir = pcurrent->GetNext()->pev->origin - currentPos;
float length = dir.Length(); float length = dir.Length();
if ( !length && !ValidPath( pcurrent->GetNext()->GetNext(), move ) ) if( !length && !ValidPath( pcurrent->GetNext()->GetNext(), move ) )
{ {
if ( dist == originalDist ) // HACK -- up against a dead end if ( dist == originalDist ) // HACK -- up against a dead end
return NULL; return NULL;
return pcurrent; return pcurrent;
} }
if ( length > dist ) // enough left in this path to move if( length > dist ) // enough left in this path to move
{ {
*origin = currentPos + (dir * (dist / length)); *origin = currentPos + (dir * (dist / length));
return pcurrent; return pcurrent;
@ -354,15 +353,14 @@ CPathTrack *CPathTrack :: LookAhead( Vector *origin, float dist, int move )
return pcurrent; return pcurrent;
} }
// Assumes this is ALWAYS enabled
CPathTrack *CPathTrack :: Nearest( Vector origin )
{
int deadCount;
float minDist, dist;
Vector delta;
CPathTrack *ppath, *pnearest;
// Assumes this is ALWAYS enabled
CPathTrack *CPathTrack::Nearest( Vector origin )
{
int deadCount;
float minDist, dist;
Vector delta;
CPathTrack *ppath, *pnearest;
delta = origin - pev->origin; delta = origin - pev->origin;
delta.z = 0; delta.z = 0;
@ -372,18 +370,18 @@ CPathTrack *CPathTrack :: Nearest( Vector origin )
// Hey, I could use the old 2 racing pointers solution to this, but I'm lazy :) // Hey, I could use the old 2 racing pointers solution to this, but I'm lazy :)
deadCount = 0; deadCount = 0;
while ( ppath && ppath != this ) while( ppath && ppath != this )
{ {
deadCount++; deadCount++;
if ( deadCount > 9999 ) if( deadCount > 9999 )
{ {
ALERT( at_error, "Bad sequence of path_tracks from %s", STRING(pev->targetname) ); ALERT( at_error, "Bad sequence of path_tracks from %s", STRING( pev->targetname ) );
return NULL; return NULL;
} }
delta = origin - ppath->pev->origin; delta = origin - ppath->pev->origin;
delta.z = 0; delta.z = 0;
dist = delta.Length(); dist = delta.Length();
if ( dist < minDist ) if( dist < minDist )
{ {
minDist = dist; minDist = dist;
pnearest = ppath; pnearest = ppath;
@ -394,21 +392,20 @@ CPathTrack *CPathTrack :: Nearest( Vector origin )
} }
CPathTrack *CPathTrack::Instance( edict_t *pent ) CPathTrack *CPathTrack::Instance( edict_t *pent )
{ {
if ( FClassnameIs( pent, "path_track" ) ) if( FClassnameIs( pent, "path_track" ) )
return (CPathTrack *)GET_PRIVATE(pent); return (CPathTrack *)GET_PRIVATE( pent );
return NULL; return NULL;
} }
// DEBUGGING CODE // DEBUGGING CODE
#if PATH_SPARKLE_DEBUG #if PATH_SPARKLE_DEBUG
void CPathTrack :: Sparkle( void ) void CPathTrack::Sparkle( void )
{ {
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
if ( FBitSet( pev->spawnflags, SF_PATH_DISABLED ) ) if( FBitSet( pev->spawnflags, SF_PATH_DISABLED ) )
UTIL_ParticleEffect(pev->origin, Vector(0,0,100), 210, 10); UTIL_ParticleEffect( pev->origin, Vector( 0, 0,100 ), 210, 10 );
else else
UTIL_ParticleEffect(pev->origin, Vector(0,0,100), 84, 10); UTIL_ParticleEffect( pev->origin, Vector( 0, 0, 100 ), 84, 10 );
} }
#endif #endif

View File

@ -19,7 +19,7 @@
//========================================================= //=========================================================
// Plane // Plane
//========================================================= //=========================================================
CPlane :: CPlane ( void ) CPlane::CPlane( void )
{ {
m_fInitialized = FALSE; m_fInitialized = FALSE;
} }
@ -28,10 +28,10 @@ CPlane :: CPlane ( void )
// InitializePlane - Takes a normal for the plane and a // InitializePlane - Takes a normal for the plane and a
// point on the plane and // point on the plane and
//========================================================= //=========================================================
void CPlane :: InitializePlane ( const Vector &vecNormal, const Vector &vecPoint ) void CPlane::InitializePlane( const Vector &vecNormal, const Vector &vecPoint )
{ {
m_vecNormal = vecNormal; m_vecNormal = vecNormal;
m_flDist = DotProduct ( m_vecNormal, vecPoint ); m_flDist = DotProduct( m_vecNormal, vecPoint );
m_fInitialized = TRUE; m_fInitialized = TRUE;
} }
@ -39,18 +39,18 @@ void CPlane :: InitializePlane ( const Vector &vecNormal, const Vector &vecPoint
// PointInFront - determines whether the given vector is // PointInFront - determines whether the given vector is
// in front of the plane. // in front of the plane.
//========================================================= //=========================================================
BOOL CPlane :: PointInFront ( const Vector &vecPoint ) BOOL CPlane::PointInFront( const Vector &vecPoint )
{ {
float flFace; float flFace;
if ( !m_fInitialized ) if( !m_fInitialized )
{ {
return FALSE; return FALSE;
} }
flFace = DotProduct ( m_vecNormal, vecPoint ) - m_flDist; flFace = DotProduct( m_vecNormal, vecPoint ) - m_flDist;
if ( flFace >= 0 ) if( flFace >= 0 )
{ {
return TRUE; return TRUE;
} }

View File

@ -1,7 +1,7 @@
/*** /***
* *
* Copyright (c) 1996-2002, Valve LLC. All rights reserved. * Copyright (c) 1996-2002, Valve LLC. All rights reserved.
* *
* This product contains software technology licensed from Id * This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved. * All Rights Reserved.
@ -18,10 +18,10 @@
//========================================================= //=========================================================
// Plane // Plane
//========================================================= //=========================================================
class CPlane class CPlane
{ {
public: public:
CPlane ( void ); CPlane( void );
//========================================================= //=========================================================
// InitializePlane - Takes a normal for the plane and a // InitializePlane - Takes a normal for the plane and a
@ -33,11 +33,10 @@ public:
// PointInFront - determines whether the given vector is // PointInFront - determines whether the given vector is
// in front of the plane. // in front of the plane.
//========================================================= //=========================================================
BOOL PointInFront ( const Vector &vecPoint ); BOOL PointInFront( const Vector &vecPoint );
Vector m_vecNormal; Vector m_vecNormal;
float m_flDist; float m_flDist;
BOOL m_fInitialized; BOOL m_fInitialized;
}; };
#endif // PLANE_H #endif // PLANE_H

File diff suppressed because it is too large Load Diff

View File

@ -28,9 +28,9 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify ( void ); int Classify( void );
void HandleAnimEvent( MonsterEvent_t *pEvent ); void HandleAnimEvent( MonsterEvent_t *pEvent );
int ISoundMask ( void ); int ISoundMask( void );
}; };
LINK_ENTITY_TO_CLASS( monster_player, CPlayerMonster ) LINK_ENTITY_TO_CLASS( monster_player, CPlayerMonster )
@ -39,20 +39,20 @@ LINK_ENTITY_TO_CLASS( monster_player, CPlayerMonster )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CPlayerMonster :: Classify ( void ) int CPlayerMonster::Classify( void )
{ {
return CLASS_PLAYER_ALLY; return CLASS_PLAYER_ALLY;
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CPlayerMonster :: SetYawSpeed ( void ) void CPlayerMonster::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_IDLE: case ACT_IDLE:
default: default:
@ -80,30 +80,30 @@ void CPlayerMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
//========================================================= //=========================================================
// ISoundMask - player monster can't hear. // ISoundMask - player monster can't hear.
//========================================================= //=========================================================
int CPlayerMonster :: ISoundMask ( void ) int CPlayerMonster::ISoundMask( void )
{ {
return NULL; return NULL;
} }
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CPlayerMonster :: Spawn() void CPlayerMonster::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/player.mdl"); SET_MODEL( ENT( pev ), "models/player.mdl" );
UTIL_SetSize(pev, VEC_HULL_MIN, VEC_HULL_MAX); UTIL_SetSize( pev, VEC_HULL_MIN, VEC_HULL_MAX );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->health = 8; pev->health = 8;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
MonsterInit(); MonsterInit();
if ( pev->spawnflags & SF_MONSTERPLAYER_NOTSOLID ) if( pev->spawnflags & SF_MONSTERPLAYER_NOTSOLID )
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
@ -113,10 +113,10 @@ void CPlayerMonster :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CPlayerMonster :: Precache() void CPlayerMonster::Precache()
{ {
PRECACHE_MODEL("models/player.mdl"); PRECACHE_MODEL( "models/player.mdl" );
} }
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster

View File

@ -22,8 +22,8 @@
#include "player.h" #include "player.h"
#include "gamerules.h" #include "gamerules.h"
enum python_e
enum python_e { {
PYTHON_IDLE1 = 0, PYTHON_IDLE1 = 0,
PYTHON_FIDGET, PYTHON_FIDGET,
PYTHON_FIRE1, PYTHON_FIRE1,
@ -37,9 +37,9 @@ enum python_e {
LINK_ENTITY_TO_CLASS( weapon_python, CPython ) LINK_ENTITY_TO_CLASS( weapon_python, CPython )
LINK_ENTITY_TO_CLASS( weapon_357, CPython ) LINK_ENTITY_TO_CLASS( weapon_357, CPython )
int CPython::GetItemInfo(ItemInfo *p) int CPython::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "357"; p->pszAmmo1 = "357";
p->iMaxAmmo1 = _357_MAX_CARRY; p->iMaxAmmo1 = _357_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -56,7 +56,7 @@ int CPython::GetItemInfo(ItemInfo *p)
int CPython::AddToPlayer( CBasePlayer *pPlayer ) int CPython::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -66,12 +66,12 @@ int CPython::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
void CPython::Spawn( ) void CPython::Spawn()
{ {
pev->classname = MAKE_STRING("weapon_357"); // hack to allow for old names pev->classname = MAKE_STRING( "weapon_357" ); // hack to allow for old names
Precache( ); Precache();
m_iId = WEAPON_PYTHON; m_iId = WEAPON_PYTHON;
SET_MODEL(ENT(pev), "models/w_357.mdl"); SET_MODEL( ENT( pev ), "models/w_357.mdl" );
m_iDefaultAmmo = PYTHON_DEFAULT_GIVE; m_iDefaultAmmo = PYTHON_DEFAULT_GIVE;
@ -80,27 +80,27 @@ void CPython::Spawn( )
void CPython::Precache( void ) void CPython::Precache( void )
{ {
PRECACHE_MODEL("models/v_357.mdl"); PRECACHE_MODEL( "models/v_357.mdl" );
PRECACHE_MODEL("models/w_357.mdl"); PRECACHE_MODEL( "models/w_357.mdl" );
PRECACHE_MODEL("models/p_357.mdl"); PRECACHE_MODEL( "models/p_357.mdl" );
PRECACHE_MODEL("models/w_357ammobox.mdl"); PRECACHE_MODEL( "models/w_357ammobox.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
PRECACHE_SOUND ("weapons/357_reload1.wav"); PRECACHE_SOUND( "weapons/357_reload1.wav" );
PRECACHE_SOUND ("weapons/357_cock1.wav"); PRECACHE_SOUND( "weapons/357_cock1.wav" );
PRECACHE_SOUND ("weapons/357_shot1.wav"); PRECACHE_SOUND( "weapons/357_shot1.wav" );
PRECACHE_SOUND ("weapons/357_shot2.wav"); PRECACHE_SOUND( "weapons/357_shot2.wav" );
m_usFirePython = PRECACHE_EVENT( 1, "events/python.sc" ); m_usFirePython = PRECACHE_EVENT( 1, "events/python.sc" );
} }
BOOL CPython::Deploy( ) BOOL CPython::Deploy()
{ {
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
// enable laser sight geometry. // enable laser sight geometry.
@ -118,7 +118,7 @@ void CPython::Holster( int skiplocal /* = 0 */ )
{ {
m_fInReload = FALSE;// cancel any reload in progress. m_fInReload = FALSE;// cancel any reload in progress.
if ( m_fInZoom ) if( m_fInZoom )
{ {
SecondaryAttack(); SecondaryAttack();
} }
@ -131,20 +131,20 @@ void CPython::Holster( int skiplocal /* = 0 */ )
void CPython::SecondaryAttack( void ) void CPython::SecondaryAttack( void )
{ {
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( !bIsMultiplayer() ) if( !bIsMultiplayer() )
#else #else
if ( !g_pGameRules->IsMultiplayer() ) if( !g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
return; return;
} }
if ( m_pPlayer->pev->fov != 0 ) if( m_pPlayer->pev->fov != 0 )
{ {
m_fInZoom = FALSE; m_fInZoom = FALSE;
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov
} }
else if ( m_pPlayer->pev->fov != 40 ) else if( m_pPlayer->pev->fov != 40 )
{ {
m_fInZoom = TRUE; m_fInZoom = TRUE;
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 40; m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 40;
@ -156,20 +156,20 @@ void CPython::SecondaryAttack( void )
void CPython::PrimaryAttack() void CPython::PrimaryAttack()
{ {
// don't fire underwater // don't fire underwater
if (m_pPlayer->pev->waterlevel == 3) if( m_pPlayer->pev->waterlevel == 3 )
{ {
PlayEmptySound( ); PlayEmptySound();
m_flNextPrimaryAttack = 0.15; m_flNextPrimaryAttack = 0.15;
return; return;
} }
if (m_iClip <= 0) if( m_iClip <= 0 )
{ {
if (!m_fFireOnEmpty) if( !m_fFireOnEmpty )
Reload( ); Reload();
else else
{ {
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM );
m_flNextPrimaryAttack = 0.15; m_flNextPrimaryAttack = 0.15;
} }
@ -181,14 +181,14 @@ void CPython::PrimaryAttack()
m_iClip--; m_iClip--;
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
Vector vecDir; Vector vecDir;
@ -202,9 +202,9 @@ void CPython::PrimaryAttack()
#endif #endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition // HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
m_flNextPrimaryAttack = 0.75; m_flNextPrimaryAttack = 0.75;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
@ -212,10 +212,10 @@ void CPython::PrimaryAttack()
void CPython::Reload( void ) void CPython::Reload( void )
{ {
if ( m_pPlayer->ammo_357 <= 0 ) if( m_pPlayer->ammo_357 <= 0 )
return; return;
if ( m_pPlayer->pev->fov != 0 ) if( m_pPlayer->pev->fov != 0 )
{ {
m_fInZoom = FALSE; m_fInZoom = FALSE;
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov
@ -227,8 +227,7 @@ void CPython::Reload( void )
#else #else
bUseScope = g_pGameRules->IsMultiplayer(); bUseScope = g_pGameRules->IsMultiplayer();
#endif #endif
if( DefaultReload( 6, PYTHON_RELOAD, 2.0, bUseScope ) )
if (DefaultReload( 6, PYTHON_RELOAD, 2.0, bUseScope ))
{ {
m_flSoundDelay = 1.5; m_flSoundDelay = 1.5;
} }
@ -236,41 +235,41 @@ void CPython::Reload( void )
void CPython::WeaponIdle( void ) void CPython::WeaponIdle( void )
{ {
ResetEmptySound( ); ResetEmptySound();
m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
// ALERT( at_console, "%.2f\n", gpGlobals->time - m_flSoundDelay ); // ALERT( at_console, "%.2f\n", gpGlobals->time - m_flSoundDelay );
if (m_flSoundDelay != 0 && m_flSoundDelay <= UTIL_WeaponTimeBase() ) if( m_flSoundDelay != 0 && m_flSoundDelay <= UTIL_WeaponTimeBase() )
{ {
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/357_reload1.wav", RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_reload1.wav", RANDOM_FLOAT( 0.8, 0.9 ), ATTN_NORM );
m_flSoundDelay = 0; m_flSoundDelay = 0;
} }
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0.0f, 1.0f ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0.0f, 1.0f );
if (flRand <= 0.5) if( flRand <= 0.5 )
{ {
iAnim = PYTHON_IDLE1; iAnim = PYTHON_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (70.0/30.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 70.0 / 30.0 );
} }
else if (flRand <= 0.7) else if( flRand <= 0.7 )
{ {
iAnim = PYTHON_IDLE2; iAnim = PYTHON_IDLE2;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (60.0/30.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 60.0 / 30.0 );
} }
else if (flRand <= 0.9) else if( flRand <= 0.9 )
{ {
iAnim = PYTHON_IDLE3; iAnim = PYTHON_IDLE3;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (88.0/30.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 88.0 / 30.0 );
} }
else else
{ {
iAnim = PYTHON_FIDGET; iAnim = PYTHON_FIDGET;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (170.0/30.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 170.0 / 30.0 );
} }
int bUseScope = FALSE; int bUseScope = FALSE;
@ -279,7 +278,6 @@ void CPython::WeaponIdle( void )
#else #else
bUseScope = g_pGameRules->IsMultiplayer(); bUseScope = g_pGameRules->IsMultiplayer();
#endif #endif
SendWeaponAnim( iAnim, UseDecrement() ? 1 : 0, bUseScope ); SendWeaponAnim( iAnim, UseDecrement() ? 1 : 0, bUseScope );
} }
@ -287,20 +285,20 @@ class CPythonAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_357ammobox.mdl"); SET_MODEL( ENT(pev), "models/w_357ammobox.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_357ammobox.mdl"); PRECACHE_MODEL( "models/w_357ammobox.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther ) BOOL AddAmmo( CBaseEntity *pOther )
{ {
if (pOther->GiveAmmo( AMMO_357BOX_GIVE, "357", _357_MAX_CARRY ) != -1) if( pOther->GiveAmmo( AMMO_357BOX_GIVE, "357", _357_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@ -32,7 +32,7 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
int Classify ( void ); int Classify( void );
}; };
LINK_ENTITY_TO_CLASS( monster_rat, CRat ) LINK_ENTITY_TO_CLASS( monster_rat, CRat )
@ -41,20 +41,20 @@ LINK_ENTITY_TO_CLASS( monster_rat, CRat )
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CRat :: Classify ( void ) int CRat::Classify( void )
{ {
return CLASS_INSECT; return CLASS_INSECT;
} }
//========================================================= //=========================================================
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CRat :: SetYawSpeed ( void ) void CRat::SetYawSpeed( void )
{ {
int ys; int ys;
switch ( m_Activity ) switch( m_Activity )
{ {
case ACT_IDLE: case ACT_IDLE:
default: default:
@ -68,20 +68,20 @@ void CRat :: SetYawSpeed ( void )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CRat :: Spawn() void CRat::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/bigrat.mdl"); SET_MODEL( ENT( pev ), "models/bigrat.mdl" );
UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->health = 8; pev->health = 8;
pev->view_ofs = Vector ( 0, 0, 6 );// position of the eyes relative to monster's origin. pev->view_ofs = Vector( 0, 0, 6 );// position of the eyes relative to monster's origin.
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
MonsterInit(); MonsterInit();
} }
@ -89,10 +89,10 @@ void CRat :: Spawn()
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CRat :: Precache() void CRat::Precache()
{ {
PRECACHE_MODEL("models/bigrat.mdl"); PRECACHE_MODEL( "models/bigrat.mdl" );
} }
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster

View File

@ -16,20 +16,20 @@
// cockroach // cockroach
//========================================================= //=========================================================
#include "extdll.h" #include "extdll.h"
#include "util.h" #include "util.h"
#include "cbase.h" #include "cbase.h"
#include "monsters.h" #include "monsters.h"
#include "schedule.h" #include "schedule.h"
#include "soundent.h" #include "soundent.h"
#include "decals.h" #include "decals.h"
#define ROACH_IDLE 0 #define ROACH_IDLE 0
#define ROACH_BORED 1 #define ROACH_BORED 1
#define ROACH_SCARED_BY_ENT 2 #define ROACH_SCARED_BY_ENT 2
#define ROACH_SCARED_BY_LIGHT 3 #define ROACH_SCARED_BY_LIGHT 3
#define ROACH_SMELL_FOOD 4 #define ROACH_SMELL_FOOD 4
#define ROACH_EAT 5 #define ROACH_EAT 5
//========================================================= //=========================================================
// Monster's Anim Events Go Here // Monster's Anim Events Go Here
@ -41,22 +41,23 @@ public:
void Precache( void ); void Precache( void );
void SetYawSpeed( void ); void SetYawSpeed( void );
void EXPORT MonsterThink ( void ); void EXPORT MonsterThink ( void );
void Move ( float flInterval ); void Move( float flInterval );
void PickNewDest ( int iCondition ); void PickNewDest( int iCondition );
void EXPORT Touch ( CBaseEntity *pOther ); void EXPORT Touch( CBaseEntity *pOther );
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
float m_flLastLightLevel; float m_flLastLightLevel;
float m_flNextSmellTime; float m_flNextSmellTime;
int Classify ( void ); int Classify( void );
void Look ( int iDistance ); void Look( int iDistance );
int ISoundMask ( void ); int ISoundMask( void );
// UNDONE: These don't necessarily need to be save/restored, but if we add more data, it may // UNDONE: These don't necessarily need to be save/restored, but if we add more data, it may
BOOL m_fLightHacked; BOOL m_fLightHacked;
int m_iMode; int m_iMode;
// ----------------------------- // -----------------------------
}; };
LINK_ENTITY_TO_CLASS( monster_cockroach, CRoach ) LINK_ENTITY_TO_CLASS( monster_cockroach, CRoach )
//========================================================= //=========================================================
@ -64,16 +65,16 @@ LINK_ENTITY_TO_CLASS( monster_cockroach, CRoach )
// of sounds this monster regards. In the base class implementation, // of sounds this monster regards. In the base class implementation,
// monsters care about all sounds, but no scents. // monsters care about all sounds, but no scents.
//========================================================= //=========================================================
int CRoach :: ISoundMask ( void ) int CRoach::ISoundMask( void )
{ {
return bits_SOUND_CARCASS | bits_SOUND_MEAT; return bits_SOUND_CARCASS | bits_SOUND_MEAT;
} }
//========================================================= //=========================================================
// Classify - indicates this monster's place in the // Classify - indicates this monster's place in the
// relationship table. // relationship table.
//========================================================= //=========================================================
int CRoach :: Classify ( void ) int CRoach::Classify( void )
{ {
return CLASS_INSECT; return CLASS_INSECT;
} }
@ -81,21 +82,21 @@ int CRoach :: Classify ( void )
//========================================================= //=========================================================
// Touch // Touch
//========================================================= //=========================================================
void CRoach :: Touch ( CBaseEntity *pOther ) void CRoach::Touch( CBaseEntity *pOther )
{ {
Vector vecSpot; Vector vecSpot;
TraceResult tr; TraceResult tr;
if ( pOther->pev->velocity == g_vecZero || !pOther->IsPlayer() ) if( pOther->pev->velocity == g_vecZero || !pOther->IsPlayer() )
{ {
return; return;
} }
vecSpot = pev->origin + Vector ( 0 , 0 , 8 );//move up a bit, and trace down. vecSpot = pev->origin + Vector( 0, 0, 8 );//move up a bit, and trace down.
UTIL_TraceLine ( vecSpot, vecSpot + Vector ( 0, 0, -24 ), ignore_monsters, ENT(pev), & tr); UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -24 ), ignore_monsters, ENT( pev ), &tr );
// This isn't really blood. So you don't have to screen it out based on violence levels (UTIL_ShouldShowBlood()) // This isn't really blood. So you don't have to screen it out based on violence levels (UTIL_ShouldShowBlood())
UTIL_DecalTrace( &tr, DECAL_YBLOOD1 +RANDOM_LONG(0,5) ); UTIL_DecalTrace( &tr, DECAL_YBLOOD1 + RANDOM_LONG( 0, 5 ) );
TakeDamage( pOther->pev, pOther->pev, pev->health, DMG_CRUSH ); TakeDamage( pOther->pev, pOther->pev, pev->health, DMG_CRUSH );
} }
@ -104,7 +105,7 @@ void CRoach :: Touch ( CBaseEntity *pOther )
// SetYawSpeed - allows each sequence to have a different // SetYawSpeed - allows each sequence to have a different
// turn rate associated with it. // turn rate associated with it.
//========================================================= //=========================================================
void CRoach :: SetYawSpeed ( void ) void CRoach::SetYawSpeed( void )
{ {
int ys; int ys;
@ -116,66 +117,65 @@ void CRoach :: SetYawSpeed ( void )
//========================================================= //=========================================================
// Spawn // Spawn
//========================================================= //=========================================================
void CRoach :: Spawn() void CRoach::Spawn()
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/roach.mdl"); SET_MODEL( ENT( pev ), "models/roach.mdl" );
UTIL_SetSize( pev, Vector( -1, -1, 0 ), Vector( 1, 1, 2 ) ); UTIL_SetSize( pev, Vector( -1, -1, 0 ), Vector( 1, 1, 2 ) );
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP; pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_YELLOW; m_bloodColor = BLOOD_COLOR_YELLOW;
pev->effects = 0; pev->effects = 0;
pev->health = 1; pev->health = 1;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE; m_MonsterState = MONSTERSTATE_NONE;
MonsterInit(); MonsterInit();
SetActivity ( ACT_IDLE ); SetActivity( ACT_IDLE );
pev->view_ofs = Vector ( 0, 0, 1 );// position of the eyes relative to monster's origin. pev->view_ofs = Vector( 0, 0, 1 );// position of the eyes relative to monster's origin.
pev->takedamage = DAMAGE_YES; pev->takedamage = DAMAGE_YES;
m_fLightHacked = FALSE; m_fLightHacked = FALSE;
m_flLastLightLevel = -1; m_flLastLightLevel = -1;
m_iMode = ROACH_IDLE; m_iMode = ROACH_IDLE;
m_flNextSmellTime = gpGlobals->time; m_flNextSmellTime = gpGlobals->time;
} }
//========================================================= //=========================================================
// Precache - precaches all resources this monster needs // Precache - precaches all resources this monster needs
//========================================================= //=========================================================
void CRoach :: Precache() void CRoach::Precache()
{ {
PRECACHE_MODEL("models/roach.mdl"); PRECACHE_MODEL( "models/roach.mdl" );
PRECACHE_SOUND("roach/rch_die.wav");
PRECACHE_SOUND("roach/rch_walk.wav");
PRECACHE_SOUND("roach/rch_smash.wav");
}
PRECACHE_SOUND( "roach/rch_die.wav" );
PRECACHE_SOUND( "roach/rch_walk.wav" );
PRECACHE_SOUND( "roach/rch_smash.wav" );
}
//========================================================= //=========================================================
// Killed. // Killed.
//========================================================= //=========================================================
void CRoach :: Killed( entvars_t *pevAttacker, int iGib ) void CRoach::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
//random sound //random sound
if ( RANDOM_LONG(0,4) == 1 ) if( RANDOM_LONG( 0, 4 ) == 1 )
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "roach/rch_die.wav", 0.8, ATTN_NORM, 0, 80 + RANDOM_LONG(0,39) ); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "roach/rch_die.wav", 0.8, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 39 ) );
} }
else else
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_BODY, "roach/rch_smash.wav", 0.7, ATTN_NORM, 0, 80 + RANDOM_LONG(0,39) ); EMIT_SOUND_DYN( ENT( pev ), CHAN_BODY, "roach/rch_smash.wav", 0.7, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 39 ) );
} }
CSoundEnt::InsertSound ( bits_SOUND_WORLD, pev->origin, 128, 1 ); CSoundEnt::InsertSound( bits_SOUND_WORLD, pev->origin, 128, 1 );
CBaseEntity *pOwner = CBaseEntity::Instance(pev->owner); CBaseEntity *pOwner = CBaseEntity::Instance( pev->owner );
if ( pOwner ) if( pOwner )
{ {
pOwner->DeathNotice( pev ); pOwner->DeathNotice( pev );
} }
@ -185,16 +185,16 @@ void CRoach :: Killed( entvars_t *pevAttacker, int iGib )
//========================================================= //=========================================================
// MonsterThink, overridden for roaches. // MonsterThink, overridden for roaches.
//========================================================= //=========================================================
void CRoach :: MonsterThink( void ) void CRoach::MonsterThink( void )
{ {
if ( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) ) if( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) )
pev->nextthink = gpGlobals->time + RANDOM_FLOAT(1,1.5); pev->nextthink = gpGlobals->time + RANDOM_FLOAT( 1, 1.5 );
else else
pev->nextthink = gpGlobals->time + 0.1;// keep monster thinking pev->nextthink = gpGlobals->time + 0.1;// keep monster thinking
float flInterval = StudioFrameAdvance( ); // animate float flInterval = StudioFrameAdvance(); // animate
if ( !m_fLightHacked ) if( !m_fLightHacked )
{ {
// if light value hasn't been collection for the first time yet, // if light value hasn't been collection for the first time yet,
// suspend the creature for a second so the world finishes spawning, then we'll collect the light level. // suspend the creature for a second so the world finishes spawning, then we'll collect the light level.
@ -202,89 +202,89 @@ void CRoach :: MonsterThink( void )
m_fLightHacked = TRUE; m_fLightHacked = TRUE;
return; return;
} }
else if ( m_flLastLightLevel < 0 ) else if( m_flLastLightLevel < 0 )
{ {
// collect light level for the first time, now that all of the lightmaps in the roach's area have been calculated. // collect light level for the first time, now that all of the lightmaps in the roach's area have been calculated.
m_flLastLightLevel = GETENTITYILLUM( ENT( pev ) ); m_flLastLightLevel = GETENTITYILLUM( ENT( pev ) );
} }
switch ( m_iMode ) switch( m_iMode )
{ {
case ROACH_IDLE: case ROACH_IDLE:
case ROACH_EAT: case ROACH_EAT:
{ {
// if not moving, sample environment to see if anything scary is around. Do a radius search 'look' at random. // if not moving, sample environment to see if anything scary is around. Do a radius search 'look' at random.
if ( RANDOM_LONG(0,3) == 1 ) if( RANDOM_LONG( 0, 3 ) == 1 )
{ {
Look( 150 ); Look( 150 );
if (HasConditions(bits_COND_SEE_FEAR)) if( HasConditions( bits_COND_SEE_FEAR ) )
{ {
// if see something scary // if see something scary
//ALERT ( at_aiconsole, "Scared\n" ); //ALERT( at_aiconsole, "Scared\n" );
Eat( 30 + ( RANDOM_LONG(0,14) ) );// roach will ignore food for 30 to 45 seconds Eat( 30 + ( RANDOM_LONG( 0, 14 ) ) );// roach will ignore food for 30 to 45 seconds
PickNewDest( ROACH_SCARED_BY_ENT ); PickNewDest( ROACH_SCARED_BY_ENT );
SetActivity ( ACT_WALK ); SetActivity( ACT_WALK );
} }
else if ( RANDOM_LONG(0,149) == 1 ) else if( RANDOM_LONG( 0, 149 ) == 1 )
{ {
// if roach doesn't see anything, there's still a chance that it will move. (boredom) // if roach doesn't see anything, there's still a chance that it will move. (boredom)
//ALERT ( at_aiconsole, "Bored\n" ); //ALERT( at_aiconsole, "Bored\n" );
PickNewDest( ROACH_BORED ); PickNewDest( ROACH_BORED );
SetActivity ( ACT_WALK ); SetActivity( ACT_WALK );
if ( m_iMode == ROACH_EAT ) if( m_iMode == ROACH_EAT )
{ {
// roach will ignore food for 30 to 45 seconds if it got bored while eating. // roach will ignore food for 30 to 45 seconds if it got bored while eating.
Eat( 30 + ( RANDOM_LONG(0,14) ) ); Eat( 30 + ( RANDOM_LONG( 0, 14 ) ) );
} }
} }
} }
// don't do this stuff if eating! // don't do this stuff if eating!
if ( m_iMode == ROACH_IDLE ) if( m_iMode == ROACH_IDLE )
{ {
if ( FShouldEat() ) if( FShouldEat() )
{ {
Listen(); Listen();
} }
if ( GETENTITYILLUM( ENT(pev) ) > m_flLastLightLevel ) if( GETENTITYILLUM( ENT( pev ) ) > m_flLastLightLevel )
{ {
// someone turned on lights! // someone turned on lights!
//ALERT ( at_console, "Lights!\n" ); //ALERT( at_console, "Lights!\n" );
PickNewDest( ROACH_SCARED_BY_LIGHT ); PickNewDest( ROACH_SCARED_BY_LIGHT );
SetActivity ( ACT_WALK ); SetActivity( ACT_WALK );
} }
else if ( HasConditions(bits_COND_SMELL_FOOD) ) else if( HasConditions( bits_COND_SMELL_FOOD ) )
{ {
CSound *pSound; CSound *pSound;
pSound = CSoundEnt::SoundPointerForIndex( m_iAudibleList ); pSound = CSoundEnt::SoundPointerForIndex( m_iAudibleList );
// roach smells food and is just standing around. Go to food unless food isn't on same z-plane. // roach smells food and is just standing around. Go to food unless food isn't on same z-plane.
if ( pSound && fabs( pSound->m_vecOrigin.z - pev->origin.z ) <= 3.0 ) if( pSound && fabs( pSound->m_vecOrigin.z - pev->origin.z ) <= 3.0 )
{ {
PickNewDest( ROACH_SMELL_FOOD ); PickNewDest( ROACH_SMELL_FOOD );
SetActivity ( ACT_WALK ); SetActivity( ACT_WALK );
} }
} }
} }
break; break;
} }
case ROACH_SCARED_BY_LIGHT: case ROACH_SCARED_BY_LIGHT:
{ {
// if roach was scared by light, then stop if we're over a spot at least as dark as where we started! // if roach was scared by light, then stop if we're over a spot at least as dark as where we started!
if ( GETENTITYILLUM( ENT( pev ) ) <= m_flLastLightLevel ) if( GETENTITYILLUM( ENT( pev ) ) <= m_flLastLightLevel )
{ {
SetActivity ( ACT_IDLE ); SetActivity( ACT_IDLE );
m_flLastLightLevel = GETENTITYILLUM( ENT ( pev ) );// make this our new light level. m_flLastLightLevel = GETENTITYILLUM( ENT( pev ) );// make this our new light level.
} }
break; break;
} }
} }
if ( m_flGroundSpeed != 0 ) if( m_flGroundSpeed != 0 )
{ {
Move( flInterval ); Move( flInterval );
} }
@ -293,93 +293,93 @@ void CRoach :: MonsterThink( void )
//========================================================= //=========================================================
// Picks a new spot for roach to run to.( // Picks a new spot for roach to run to.(
//========================================================= //=========================================================
void CRoach :: PickNewDest ( int iCondition ) void CRoach::PickNewDest( int iCondition )
{ {
Vector vecNewDir; Vector vecNewDir;
Vector vecDest; Vector vecDest;
float flDist; float flDist;
m_iMode = iCondition; m_iMode = iCondition;
if ( m_iMode == ROACH_SMELL_FOOD ) if( m_iMode == ROACH_SMELL_FOOD )
{ {
// find the food and go there. // find the food and go there.
CSound *pSound; CSound *pSound;
pSound = CSoundEnt::SoundPointerForIndex( m_iAudibleList ); pSound = CSoundEnt::SoundPointerForIndex( m_iAudibleList );
if ( pSound ) if( pSound )
{ {
m_Route[ 0 ].vecLocation.x = pSound->m_vecOrigin.x + ( 3 - RANDOM_LONG(0,5) ); m_Route[0].vecLocation.x = pSound->m_vecOrigin.x + ( 3 - RANDOM_LONG( 0, 5 ) );
m_Route[ 0 ].vecLocation.y = pSound->m_vecOrigin.y + ( 3 - RANDOM_LONG(0,5) ); m_Route[0].vecLocation.y = pSound->m_vecOrigin.y + ( 3 - RANDOM_LONG( 0, 5 ) );
m_Route[ 0 ].vecLocation.z = pSound->m_vecOrigin.z; m_Route[0].vecLocation.z = pSound->m_vecOrigin.z;
m_Route[ 0 ].iType = bits_MF_TO_LOCATION; m_Route[0].iType = bits_MF_TO_LOCATION;
m_movementGoal = RouteClassify( m_Route[ 0 ].iType ); m_movementGoal = RouteClassify( m_Route[0].iType );
return; return;
} }
} }
do do
{ {
// picks a random spot, requiring that it be at least 128 units away // picks a random spot, requiring that it be at least 128 units away
// else, the roach will pick a spot too close to itself and run in // else, the roach will pick a spot too close to itself and run in
// circles. this is a hack but buys me time to work on the real monsters. // circles. this is a hack but buys me time to work on the real monsters.
vecNewDir.x = RANDOM_FLOAT( -1, 1 ); vecNewDir.x = RANDOM_FLOAT( -1, 1 );
vecNewDir.y = RANDOM_FLOAT( -1, 1 ); vecNewDir.y = RANDOM_FLOAT( -1, 1 );
flDist = 256 + ( RANDOM_LONG(0,255) ); flDist = 256 + ( RANDOM_LONG( 0, 255 ) );
vecDest = pev->origin + vecNewDir * flDist; vecDest = pev->origin + vecNewDir * flDist;
} while ( ( vecDest - pev->origin ).Length2D() < 128 ); } while( ( vecDest - pev->origin ).Length2D() < 128 );
m_Route[ 0 ].vecLocation.x = vecDest.x; m_Route[0].vecLocation.x = vecDest.x;
m_Route[ 0 ].vecLocation.y = vecDest.y; m_Route[0].vecLocation.y = vecDest.y;
m_Route[ 0 ].vecLocation.z = pev->origin.z; m_Route[0].vecLocation.z = pev->origin.z;
m_Route[ 0 ].iType = bits_MF_TO_LOCATION; m_Route[0].iType = bits_MF_TO_LOCATION;
m_movementGoal = RouteClassify( m_Route[ 0 ].iType ); m_movementGoal = RouteClassify( m_Route[0].iType );
if ( RANDOM_LONG(0,9) == 1 ) if( RANDOM_LONG( 0, 9 ) == 1 )
{ {
// every once in a while, a roach will play a skitter sound when they decide to run // every once in a while, a roach will play a skitter sound when they decide to run
EMIT_SOUND_DYN(ENT(pev), CHAN_BODY, "roach/rch_walk.wav", 1, ATTN_NORM, 0, 80 + RANDOM_LONG(0,39) ); EMIT_SOUND_DYN( ENT( pev ), CHAN_BODY, "roach/rch_walk.wav", 1, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 39 ) );
} }
} }
//========================================================= //=========================================================
// roach's move function // roach's move function
//========================================================= //=========================================================
void CRoach :: Move ( float flInterval ) void CRoach::Move( float flInterval )
{ {
float flWaypointDist; float flWaypointDist;
Vector vecApex; Vector vecApex;
// local move to waypoint. // local move to waypoint.
flWaypointDist = ( m_Route[ m_iRouteIndex ].vecLocation - pev->origin ).Length2D(); flWaypointDist = ( m_Route[m_iRouteIndex].vecLocation - pev->origin ).Length2D();
MakeIdealYaw ( m_Route[ m_iRouteIndex ].vecLocation ); MakeIdealYaw( m_Route[m_iRouteIndex].vecLocation );
ChangeYaw ( pev->yaw_speed ); ChangeYaw( pev->yaw_speed );
UTIL_MakeVectors( pev->angles ); UTIL_MakeVectors( pev->angles );
if ( RANDOM_LONG(0,7) == 1 ) if( RANDOM_LONG( 0, 7 ) == 1 )
{ {
// randomly check for blocked path.(more random load balancing) // randomly check for blocked path.(more random load balancing)
if ( !WALK_MOVE( ENT(pev), pev->ideal_yaw, 4, WALKMOVE_NORMAL ) ) if( !WALK_MOVE( ENT( pev ), pev->ideal_yaw, 4, WALKMOVE_NORMAL ) )
{ {
// stuck, so just pick a new spot to run off to // stuck, so just pick a new spot to run off to
PickNewDest( m_iMode ); PickNewDest( m_iMode );
} }
} }
WALK_MOVE( ENT(pev), pev->ideal_yaw, m_flGroundSpeed * flInterval, WALKMOVE_NORMAL ); WALK_MOVE( ENT( pev ), pev->ideal_yaw, m_flGroundSpeed * flInterval, WALKMOVE_NORMAL );
// if the waypoint is closer than step size, then stop after next step (ok for roach to overshoot) // if the waypoint is closer than step size, then stop after next step (ok for roach to overshoot)
if ( flWaypointDist <= m_flGroundSpeed * flInterval ) if( flWaypointDist <= m_flGroundSpeed * flInterval )
{ {
// take truncated step and stop // take truncated step and stop
SetActivity ( ACT_IDLE ); SetActivity( ACT_IDLE );
m_flLastLightLevel = GETENTITYILLUM( ENT ( pev ) );// this is roach's new comfortable light level m_flLastLightLevel = GETENTITYILLUM( ENT( pev ) );// this is roach's new comfortable light level
if ( m_iMode == ROACH_SMELL_FOOD ) if( m_iMode == ROACH_SMELL_FOOD )
{ {
m_iMode = ROACH_EAT; m_iMode = ROACH_EAT;
} }
@ -389,7 +389,7 @@ void CRoach :: Move ( float flInterval )
} }
} }
if ( RANDOM_LONG(0,149) == 1 && m_iMode != ROACH_SCARED_BY_LIGHT && m_iMode != ROACH_SMELL_FOOD ) if( RANDOM_LONG( 0, 149 ) == 1 && m_iMode != ROACH_SCARED_BY_LIGHT && m_iMode != ROACH_SMELL_FOOD )
{ {
// random skitter while moving as long as not on a b-line to get out of light or going to food // random skitter while moving as long as not on a b-line to get out of light or going to food
PickNewDest( FALSE ); PickNewDest( FALSE );
@ -400,18 +400,18 @@ void CRoach :: Move ( float flInterval )
// Look - overriden for the roach, which can virtually see // Look - overriden for the roach, which can virtually see
// 360 degrees. // 360 degrees.
//========================================================= //=========================================================
void CRoach :: Look ( int iDistance ) void CRoach::Look( int iDistance )
{ {
CBaseEntity *pSightEnt = NULL;// the current visible entity that we're dealing with CBaseEntity *pSightEnt = NULL;// the current visible entity that we're dealing with
CBaseEntity *pPreviousEnt;// the last entity added to the link list CBaseEntity *pPreviousEnt;// the last entity added to the link list
int iSighted = 0; int iSighted = 0;
// DON'T let visibility information from last frame sit around! // DON'T let visibility information from last frame sit around!
ClearConditions( bits_COND_SEE_HATE |bits_COND_SEE_DISLIKE | bits_COND_SEE_ENEMY | bits_COND_SEE_FEAR ); ClearConditions( bits_COND_SEE_HATE | bits_COND_SEE_DISLIKE | bits_COND_SEE_ENEMY | bits_COND_SEE_FEAR );
// don't let monsters outside of the player's PVS act up, or most of the interesting // don't let monsters outside of the player's PVS act up, or most of the interesting
// things will happen before the player gets there! // things will happen before the player gets there!
if ( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) ) if( FNullEnt( FIND_CLIENT_IN_PVS( edict() ) ) )
{ {
return; return;
} }
@ -422,12 +422,12 @@ void CRoach :: Look ( int iDistance )
// Does sphere also limit itself to PVS? // Does sphere also limit itself to PVS?
// Examine all entities within a reasonable radius // Examine all entities within a reasonable radius
// !!!PERFORMANCE - let's trivially reject the ent list before radius searching! // !!!PERFORMANCE - let's trivially reject the ent list before radius searching!
while ((pSightEnt = UTIL_FindEntityInSphere( pSightEnt, pev->origin, iDistance )) != NULL) while( ( pSightEnt = UTIL_FindEntityInSphere( pSightEnt, pev->origin, iDistance ) ) != NULL )
{ {
// only consider ents that can be damaged. !!!temporarily only considering other monsters and clients // only consider ents that can be damaged. !!!temporarily only considering other monsters and clients
if ( pSightEnt->IsPlayer() || FBitSet ( pSightEnt->pev->flags, FL_MONSTER ) ) if( pSightEnt->IsPlayer() || FBitSet( pSightEnt->pev->flags, FL_MONSTER ) )
{ {
if ( /*FVisible( pSightEnt ) &&*/ !FBitSet( pSightEnt->pev->flags, FL_NOTARGET ) && pSightEnt->pev->health > 0 ) if( /*FVisible( pSightEnt ) &&*/ !FBitSet( pSightEnt->pev->flags, FL_NOTARGET ) && pSightEnt->pev->health > 0 )
{ {
// NULL the Link pointer for each ent added to the link list. If other ents follow, the will overwrite // NULL the Link pointer for each ent added to the link list. If other ents follow, the will overwrite
// this value. If this ent happens to be the last, the list will be properly terminated. // this value. If this ent happens to be the last, the list will be properly terminated.
@ -437,15 +437,15 @@ void CRoach :: Look ( int iDistance )
// don't add the Enemy's relationship to the conditions. We only want to worry about conditions when // don't add the Enemy's relationship to the conditions. We only want to worry about conditions when
// we see monsters other than the Enemy. // we see monsters other than the Enemy.
switch ( IRelationship ( pSightEnt ) ) switch( IRelationship( pSightEnt ) )
{ {
case R_FR: case R_FR:
iSighted |= bits_COND_SEE_FEAR; iSighted |= bits_COND_SEE_FEAR;
break; break;
case R_NO: case R_NO:
break; break;
default: default:
ALERT ( at_console, "%s can't asses %s\n", STRING(pev->classname), STRING(pSightEnt->pev->classname ) ); ALERT( at_console, "%s can't asses %s\n", STRING( pev->classname ), STRING( pSightEnt->pev->classname ) );
break; break;
} }
} }
@ -457,4 +457,3 @@ void CRoach :: Look ( int iDistance )
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================

View File

@ -23,10 +23,8 @@
#include "player.h" #include "player.h"
#include "gamerules.h" #include "gamerules.h"
enum rpg_e
{
enum rpg_e {
RPG_IDLE = 0, RPG_IDLE = 0,
RPG_FIDGET, RPG_FIDGET,
RPG_RELOAD, // to reload RPG_RELOAD, // to reload
@ -52,7 +50,7 @@ CLaserSpot *CLaserSpot::CreateSpot( void )
CLaserSpot *pSpot = GetClassPtr( (CLaserSpot *)NULL ); CLaserSpot *pSpot = GetClassPtr( (CLaserSpot *)NULL );
pSpot->Spawn(); pSpot->Spawn();
pSpot->pev->classname = MAKE_STRING("laser_spot"); pSpot->pev->classname = MAKE_STRING( "laser_spot" );
return pSpot; return pSpot;
} }
@ -61,7 +59,7 @@ CLaserSpot *CLaserSpot::CreateSpot( void )
//========================================================= //=========================================================
void CLaserSpot::Spawn( void ) void CLaserSpot::Spawn( void )
{ {
Precache( ); Precache();
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
@ -69,7 +67,7 @@ void CLaserSpot::Spawn( void )
pev->renderfx = kRenderFxNoDissipation; pev->renderfx = kRenderFxNoDissipation;
pev->renderamt = 255; pev->renderamt = 255;
SET_MODEL(ENT(pev), "sprites/laserdot.spr"); SET_MODEL( ENT( pev ), "sprites/laserdot.spr" );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
} }
@ -79,7 +77,7 @@ void CLaserSpot::Spawn( void )
void CLaserSpot::Suspend( float flSuspendTime ) void CLaserSpot::Suspend( float flSuspendTime )
{ {
pev->effects |= EF_NODRAW; pev->effects |= EF_NODRAW;
SetThink( &CLaserSpot::Revive ); SetThink( &CLaserSpot::Revive );
pev->nextthink = gpGlobals->time + flSuspendTime; pev->nextthink = gpGlobals->time + flSuspendTime;
} }
@ -96,7 +94,7 @@ void CLaserSpot::Revive( void )
void CLaserSpot::Precache( void ) void CLaserSpot::Precache( void )
{ {
PRECACHE_MODEL("sprites/laserdot.spr"); PRECACHE_MODEL( "sprites/laserdot.spr" );
} }
LINK_ENTITY_TO_CLASS( rpg_rocket, CRpgRocket ) LINK_ENTITY_TO_CLASS( rpg_rocket, CRpgRocket )
@ -120,25 +118,25 @@ CRpgRocket *CRpgRocket::CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBa
//========================================================= //=========================================================
//========================================================= //=========================================================
void CRpgRocket :: Spawn( void ) void CRpgRocket::Spawn( void )
{ {
Precache( ); Precache();
// motor // motor
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/rpgrocket.mdl"); SET_MODEL( ENT( pev ), "models/rpgrocket.mdl" );
UTIL_SetSize(pev, Vector( 0, 0, 0), Vector(0, 0, 0)); UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
pev->classname = MAKE_STRING("rpg_rocket"); pev->classname = MAKE_STRING( "rpg_rocket" );
SetThink( &CRpgRocket::IgniteThink ); SetThink( &CRpgRocket::IgniteThink );
SetTouch( &CGrenade::ExplodeTouch ); SetTouch( &CGrenade::ExplodeTouch );
pev->angles.x -= 30; pev->angles.x -= 30;
UTIL_MakeVectors( pev->angles ); UTIL_MakeVectors( pev->angles );
pev->angles.x = -(pev->angles.x + 30); pev->angles.x = -( pev->angles.x + 30 );
pev->velocity = gpGlobals->v_forward * 250; pev->velocity = gpGlobals->v_forward * 250;
pev->gravity = 0.5; pev->gravity = 0.5;
@ -150,9 +148,9 @@ void CRpgRocket :: Spawn( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CRpgRocket :: RocketTouch ( CBaseEntity *pOther ) void CRpgRocket::RocketTouch( CBaseEntity *pOther )
{ {
if ( m_pLauncher ) if( m_pLauncher )
{ {
// my launcher is still around, tell it I'm dead. // my launcher is still around, tell it I'm dead.
m_pLauncher->m_cActiveRockets--; m_pLauncher->m_cActiveRockets--;
@ -164,15 +162,14 @@ void CRpgRocket :: RocketTouch ( CBaseEntity *pOther )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CRpgRocket :: Precache( void ) void CRpgRocket::Precache( void )
{ {
PRECACHE_MODEL("models/rpgrocket.mdl"); PRECACHE_MODEL( "models/rpgrocket.mdl" );
m_iTrail = PRECACHE_MODEL("sprites/smoke.spr"); m_iTrail = PRECACHE_MODEL( "sprites/smoke.spr" );
PRECACHE_SOUND ("weapons/rocket1.wav"); PRECACHE_SOUND( "weapons/rocket1.wav" );
} }
void CRpgRocket::IgniteThink( void )
void CRpgRocket :: IgniteThink( void )
{ {
// pev->movetype = MOVETYPE_TOSS; // pev->movetype = MOVETYPE_TOSS;
@ -180,21 +177,19 @@ void CRpgRocket :: IgniteThink( void )
pev->effects |= EF_LIGHT; pev->effects |= EF_LIGHT;
// make rocket sound // make rocket sound
EMIT_SOUND( ENT(pev), CHAN_VOICE, "weapons/rocket1.wav", 1, 0.5 ); EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav", 1, 0.5 );
// rocket trail // rocket trail
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMFOLLOW ); WRITE_BYTE( TE_BEAMFOLLOW );
WRITE_SHORT(entindex()); // entity WRITE_SHORT( entindex() ); // entity
WRITE_SHORT(m_iTrail ); // model WRITE_SHORT( m_iTrail ); // model
WRITE_BYTE( 40 ); // life WRITE_BYTE( 40 ); // life
WRITE_BYTE( 5 ); // width WRITE_BYTE( 5 ); // width
WRITE_BYTE( 224 ); // r, g, b WRITE_BYTE( 224 ); // r, g, b
WRITE_BYTE( 224 ); // r, g, b WRITE_BYTE( 224 ); // r, g, b
WRITE_BYTE( 255 ); // r, g, b WRITE_BYTE( 255 ); // r, g, b
WRITE_BYTE( 255 ); // brightness WRITE_BYTE( 255 ); // brightness
MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS) MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
m_flIgniteTime = gpGlobals->time; m_flIgniteTime = gpGlobals->time;
@ -204,7 +199,7 @@ void CRpgRocket :: IgniteThink( void )
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
void CRpgRocket :: FollowThink( void ) void CRpgRocket::FollowThink( void )
{ {
CBaseEntity *pOther = NULL; CBaseEntity *pOther = NULL;
Vector vecTarget; Vector vecTarget;
@ -218,19 +213,19 @@ void CRpgRocket :: FollowThink( void )
flMax = 4096; flMax = 4096;
// Examine all entities within a reasonable radius // Examine all entities within a reasonable radius
while ((pOther = UTIL_FindEntityByClassname( pOther, "laser_spot" )) != NULL) while( ( pOther = UTIL_FindEntityByClassname( pOther, "laser_spot" ) ) != NULL )
{ {
UTIL_TraceLine ( pev->origin, pOther->pev->origin, dont_ignore_monsters, ENT(pev), &tr ); UTIL_TraceLine( pev->origin, pOther->pev->origin, dont_ignore_monsters, ENT( pev ), &tr );
// ALERT( at_console, "%f\n", tr.flFraction ); // ALERT( at_console, "%f\n", tr.flFraction );
if (tr.flFraction >= 0.90) if( tr.flFraction >= 0.90 )
{ {
vecDir = pOther->pev->origin - pev->origin; vecDir = pOther->pev->origin - pev->origin;
flDist = vecDir.Length( ); flDist = vecDir.Length();
vecDir = vecDir.Normalize( ); vecDir = vecDir.Normalize();
flDot = DotProduct( gpGlobals->v_forward, vecDir ); flDot = DotProduct( gpGlobals->v_forward, vecDir );
if ((flDot > 0) && (flDist * (1 - flDot) < flMax)) if( ( flDot > 0 ) && ( flDist * ( 1 - flDot ) < flMax ) )
{ {
flMax = flDist * (1 - flDot); flMax = flDist * ( 1 - flDot );
vecTarget = vecDir; vecTarget = vecDir;
} }
} }
@ -240,13 +235,13 @@ void CRpgRocket :: FollowThink( void )
// this acceleration and turning math is totally wrong, but it seems to respond well so don't change it. // this acceleration and turning math is totally wrong, but it seems to respond well so don't change it.
float flSpeed = pev->velocity.Length(); float flSpeed = pev->velocity.Length();
if (gpGlobals->time - m_flIgniteTime < 1.0) if( gpGlobals->time - m_flIgniteTime < 1.0 )
{ {
pev->velocity = pev->velocity * 0.2 + vecTarget * (flSpeed * 0.8 + 400); pev->velocity = pev->velocity * 0.2 + vecTarget * ( flSpeed * 0.8 + 400 );
if (pev->waterlevel == 3) if( pev->waterlevel == 3 )
{ {
// go slow underwater // go slow underwater
if (pev->velocity.Length() > 300) if( pev->velocity.Length() > 300 )
{ {
pev->velocity = pev->velocity.Normalize() * 300; pev->velocity = pev->velocity.Normalize() * 300;
} }
@ -254,7 +249,7 @@ void CRpgRocket :: FollowThink( void )
} }
else else
{ {
if (pev->velocity.Length() > 2000) if( pev->velocity.Length() > 2000 )
{ {
pev->velocity = pev->velocity.Normalize() * 2000; pev->velocity = pev->velocity.Normalize() * 2000;
} }
@ -262,15 +257,15 @@ void CRpgRocket :: FollowThink( void )
} }
else else
{ {
if (pev->effects & EF_LIGHT) if( pev->effects & EF_LIGHT )
{ {
pev->effects = 0; pev->effects = 0;
STOP_SOUND( ENT(pev), CHAN_VOICE, "weapons/rocket1.wav" ); STOP_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav" );
} }
pev->velocity = pev->velocity * 0.2 + vecTarget * flSpeed * 0.798; pev->velocity = pev->velocity * 0.2 + vecTarget * flSpeed * 0.798;
if (pev->waterlevel == 0 && pev->velocity.Length() < 1500) if( pev->waterlevel == 0 && pev->velocity.Length() < 1500 )
{ {
Detonate( ); Detonate();
} }
} }
// ALERT( at_console, "%.0f\n", flSpeed ); // ALERT( at_console, "%.0f\n", flSpeed );
@ -283,13 +278,13 @@ void CRpg::Reload( void )
{ {
int iResult = 0; int iResult = 0;
if ( m_iClip == 1 ) if( m_iClip == 1 )
{ {
// don't bother with any of this if don't need to reload. // don't bother with any of this if don't need to reload.
return; return;
} }
if ( m_pPlayer->ammo_rockets <= 0 ) if( m_pPlayer->ammo_rockets <= 0 )
return; return;
// because the RPG waits to autoreload when no missiles are active while the LTD is on, the // because the RPG waits to autoreload when no missiles are active while the LTD is on, the
@ -304,7 +299,7 @@ void CRpg::Reload( void )
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
if ( m_cActiveRockets && m_fSpotActive ) if( m_cActiveRockets && m_fSpotActive )
{ {
// no reloading when there are active missiles tracking the designator. // no reloading when there are active missiles tracking the designator.
// ward off future autoreload attempts by setting next attack time into the future for a bit. // ward off future autoreload attempts by setting next attack time into the future for a bit.
@ -312,33 +307,32 @@ void CRpg::Reload( void )
} }
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if ( m_pSpot && m_fSpotActive ) if( m_pSpot && m_fSpotActive )
{ {
m_pSpot->Suspend( 2.1 ); m_pSpot->Suspend( 2.1 );
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 2.1; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 2.1;
} }
#endif #endif
if ( m_iClip == 0 ) if( m_iClip == 0 )
iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 ); iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 );
if ( iResult ) if( iResult )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
} }
void CRpg::Spawn( ) void CRpg::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_RPG; m_iId = WEAPON_RPG;
SET_MODEL(ENT(pev), "models/w_rpg.mdl"); SET_MODEL( ENT( pev ), "models/w_rpg.mdl" );
m_fSpotActive = 1; m_fSpotActive = 1;
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
// more default ammo in multiplay. // more default ammo in multiplay.
@ -354,25 +348,24 @@ void CRpg::Spawn( )
void CRpg::Precache( void ) void CRpg::Precache( void )
{ {
PRECACHE_MODEL("models/w_rpg.mdl"); PRECACHE_MODEL( "models/w_rpg.mdl" );
PRECACHE_MODEL("models/v_rpg.mdl"); PRECACHE_MODEL( "models/v_rpg.mdl" );
PRECACHE_MODEL("models/p_rpg.mdl"); PRECACHE_MODEL( "models/p_rpg.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
UTIL_PrecacheOther( "laser_spot" ); UTIL_PrecacheOther( "laser_spot" );
UTIL_PrecacheOther( "rpg_rocket" ); UTIL_PrecacheOther( "rpg_rocket" );
PRECACHE_SOUND("weapons/rocketfire1.wav"); PRECACHE_SOUND( "weapons/rocketfire1.wav" );
PRECACHE_SOUND("weapons/glauncher.wav"); // alternative fire sound PRECACHE_SOUND( "weapons/glauncher.wav" ); // alternative fire sound
m_usRpg = PRECACHE_EVENT ( 1, "events/rpg.sc" ); m_usRpg = PRECACHE_EVENT( 1, "events/rpg.sc" );
} }
int CRpg::GetItemInfo( ItemInfo *p )
int CRpg::GetItemInfo(ItemInfo *p)
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "rockets"; p->pszAmmo1 = "rockets";
p->iMaxAmmo1 = ROCKET_MAX_CARRY; p->iMaxAmmo1 = ROCKET_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -389,7 +382,7 @@ int CRpg::GetItemInfo(ItemInfo *p)
int CRpg::AddToPlayer( CBasePlayer *pPlayer ) int CRpg::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -399,9 +392,9 @@ int CRpg::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
BOOL CRpg::Deploy( ) BOOL CRpg::Deploy()
{ {
if ( m_iClip == 0 ) if( m_iClip == 0 )
{ {
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" ); return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" );
} }
@ -411,7 +404,7 @@ BOOL CRpg::Deploy( )
BOOL CRpg::CanHolster( void ) BOOL CRpg::CanHolster( void )
{ {
if ( m_fSpotActive && m_cActiveRockets ) if( m_fSpotActive && m_cActiveRockets )
{ {
// can't put away while guiding a missile. // can't put away while guiding a missile.
return FALSE; return FALSE;
@ -425,11 +418,11 @@ void CRpg::Holster( int skiplocal /* = 0 */ )
m_fInReload = FALSE;// cancel any reload in progress. m_fInReload = FALSE;// cancel any reload in progress.
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
SendWeaponAnim( RPG_HOLSTER1 ); SendWeaponAnim( RPG_HOLSTER1 );
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if (m_pSpot) if( m_pSpot )
{ {
m_pSpot->Killed( NULL, GIB_NEVER ); m_pSpot->Killed( NULL, GIB_NEVER );
m_pSpot = NULL; m_pSpot = NULL;
@ -439,7 +432,7 @@ void CRpg::Holster( int skiplocal /* = 0 */ )
void CRpg::PrimaryAttack() void CRpg::PrimaryAttack()
{ {
if ( m_iClip ) if( m_iClip )
{ {
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;
@ -449,8 +442,8 @@ void CRpg::PrimaryAttack()
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
UTIL_MakeVectors( m_pPlayer->pev->v_angle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle );
Vector vecSrc = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -8; Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -8;
CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this ); CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this );
UTIL_MakeVectors( m_pPlayer->pev->v_angle );// RpgRocket::Create stomps on globals, so remake. UTIL_MakeVectors( m_pPlayer->pev->v_angle );// RpgRocket::Create stomps on globals, so remake.
@ -466,28 +459,27 @@ void CRpg::PrimaryAttack()
#else #else
flags = 0; flags = 0;
#endif #endif
PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usRpg ); PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usRpg );
m_iClip--; m_iClip--;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
} }
else else
{ {
PlayEmptySound( ); PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2;
} }
UpdateSpot( ); UpdateSpot();
} }
void CRpg::SecondaryAttack() void CRpg::SecondaryAttack()
{ {
m_fSpotActive = ! m_fSpotActive; m_fSpotActive = !m_fSpotActive;
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if (!m_fSpotActive && m_pSpot) if( !m_fSpotActive && m_pSpot )
{ {
m_pSpot->Killed( NULL, GIB_NORMAL ); m_pSpot->Killed( NULL, GIB_NORMAL );
m_pSpot = NULL; m_pSpot = NULL;
@ -498,20 +490,20 @@ void CRpg::SecondaryAttack()
void CRpg::WeaponIdle( void ) void CRpg::WeaponIdle( void )
{ {
UpdateSpot( ); UpdateSpot();
ResetEmptySound( ); ResetEmptySound();
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.75 || m_fSpotActive) if( flRand <= 0.75 || m_fSpotActive )
{ {
if ( m_iClip == 0 ) if( m_iClip == 0 )
iAnim = RPG_IDLE_UL; iAnim = RPG_IDLE_UL;
else else
iAnim = RPG_IDLE; iAnim = RPG_IDLE;
@ -520,7 +512,7 @@ void CRpg::WeaponIdle( void )
} }
else else
{ {
if ( m_iClip == 0 ) if( m_iClip == 0 )
iAnim = RPG_FIDGET_UL; iAnim = RPG_FIDGET_UL;
else else
iAnim = RPG_FIDGET; iAnim = RPG_FIDGET;
@ -539,20 +531,20 @@ void CRpg::WeaponIdle( void )
void CRpg::UpdateSpot( void ) void CRpg::UpdateSpot( void )
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if (m_fSpotActive) if( m_fSpotActive )
{ {
if (!m_pSpot) if( !m_pSpot )
{ {
m_pSpot = CLaserSpot::CreateSpot(); m_pSpot = CLaserSpot::CreateSpot();
} }
UTIL_MakeVectors( m_pPlayer->pev->v_angle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle );
Vector vecSrc = m_pPlayer->GetGunPosition( );; Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming = gpGlobals->v_forward; Vector vecAiming = gpGlobals->v_forward;
TraceResult tr; TraceResult tr;
UTIL_TraceLine ( vecSrc, vecSrc + vecAiming * 8192, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr ); UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 8192, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
UTIL_SetOrigin( m_pSpot->pev, tr.vecEndPos ); UTIL_SetOrigin( m_pSpot->pev, tr.vecEndPos );
} }
#endif #endif
@ -561,24 +553,23 @@ void CRpg::UpdateSpot( void )
class CRpgAmmo : public CBasePlayerAmmo class CRpgAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_rpgammo.mdl"); SET_MODEL( ENT( pev ), "models/w_rpgammo.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_rpgammo.mdl"); PRECACHE_MODEL( "models/w_rpgammo.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther ) BOOL AddAmmo( CBaseEntity *pOther )
{ {
int iGive; int iGive;
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
// hand out more ammo per rocket in multiplayer. // hand out more ammo per rocket in multiplayer.
@ -589,9 +580,9 @@ class CRpgAmmo : public CBasePlayerAmmo
iGive = AMMO_RPGCLIP_GIVE; iGive = AMMO_RPGCLIP_GIVE;
} }
if (pOther->GiveAmmo( iGive, "rockets", ROCKET_MAX_CARRY ) != -1) if( pOther->GiveAmmo( iGive, "rockets", ROCKET_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@ -23,14 +23,16 @@
#include "player.h" #include "player.h"
#include "gamerules.h" #include "gamerules.h"
enum satchel_e { enum satchel_e
{
SATCHEL_IDLE1 = 0, SATCHEL_IDLE1 = 0,
SATCHEL_FIDGET1, SATCHEL_FIDGET1,
SATCHEL_DRAW, SATCHEL_DRAW,
SATCHEL_DROP SATCHEL_DROP
}; };
enum satchel_radio_e { enum satchel_radio_e
{
SATCHEL_RADIO_IDLE1 = 0, SATCHEL_RADIO_IDLE1 = 0,
SATCHEL_RADIO_FIDGET1, SATCHEL_RADIO_FIDGET1,
SATCHEL_RADIO_DRAW, SATCHEL_RADIO_DRAW,
@ -63,16 +65,16 @@ void CSatchelCharge::Deactivate( void )
UTIL_Remove( this ); UTIL_Remove( this );
} }
void CSatchelCharge :: Spawn( void ) void CSatchelCharge::Spawn( void )
{ {
Precache( ); Precache();
// motor // motor
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/w_satchel.mdl"); SET_MODEL( ENT( pev ), "models/w_satchel.mdl" );
//UTIL_SetSize(pev, Vector( -16, -16, -4), Vector(16, 16, 32)); // Old box -- size of headcrab monsters/players get blocked by this //UTIL_SetSize( pev, Vector( -16, -16, -4 ), Vector( 16, 16, 32 ) ); // Old box -- size of headcrab monsters/players get blocked by this
UTIL_SetSize(pev, Vector( -4, -4, -4), Vector(4, 4, 4)); // Uses point-sized, and can be stepped over UTIL_SetSize( pev, Vector( -4, -4, -4 ), Vector( 4, 4, 4 ) ); // Uses point-sized, and can be stepped over
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
SetTouch( &CSatchelCharge::SatchelSlide ); SetTouch( &CSatchelCharge::SatchelSlide );
@ -84,58 +86,58 @@ void CSatchelCharge :: Spawn( void )
pev->friction = 0.8; pev->friction = 0.8;
pev->dmg = gSkillData.plrDmgSatchel; pev->dmg = gSkillData.plrDmgSatchel;
// ResetSequenceInfo( ); // ResetSequenceInfo();
pev->sequence = 1; pev->sequence = 1;
} }
void CSatchelCharge::SatchelSlide( CBaseEntity *pOther ) void CSatchelCharge::SatchelSlide( CBaseEntity *pOther )
{ {
entvars_t *pevOther = pOther->pev; entvars_t *pevOther = pOther->pev;
// don't hit the guy that launched this grenade // don't hit the guy that launched this grenade
if ( pOther->edict() == pev->owner ) if( pOther->edict() == pev->owner )
return; return;
// pev->avelocity = Vector (300, 300, 300); // pev->avelocity = Vector( 300, 300, 300 );
pev->gravity = 1;// normal gravity now pev->gravity = 1;// normal gravity now
// HACKHACK - On ground isn't always set, so look for ground underneath // HACKHACK - On ground isn't always set, so look for ground underneath
TraceResult tr; TraceResult tr;
UTIL_TraceLine( pev->origin, pev->origin - Vector(0,0,10), ignore_monsters, edict(), &tr ); UTIL_TraceLine( pev->origin, pev->origin - Vector( 0, 0, 10 ), ignore_monsters, edict(), &tr );
if ( tr.flFraction < 1.0 ) if( tr.flFraction < 1.0 )
{ {
// add a bit of static friction // add a bit of static friction
pev->velocity = pev->velocity * 0.95; pev->velocity = pev->velocity * 0.95;
pev->avelocity = pev->avelocity * 0.9; pev->avelocity = pev->avelocity * 0.9;
// play sliding sound, volume based on velocity // play sliding sound, volume based on velocity
} }
if ( !(pev->flags & FL_ONGROUND) && pev->velocity.Length2D() > 10 ) if( !( pev->flags & FL_ONGROUND ) && pev->velocity.Length2D() > 10 )
{ {
BounceSound(); BounceSound();
} }
StudioFrameAdvance( ); StudioFrameAdvance();
} }
void CSatchelCharge :: SatchelThink( void ) void CSatchelCharge::SatchelThink( void )
{ {
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (!IsInWorld()) if( !IsInWorld() )
{ {
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
if (pev->waterlevel == 3) if( pev->waterlevel == 3 )
{ {
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
pev->velocity = pev->velocity * 0.8; pev->velocity = pev->velocity * 0.8;
pev->avelocity = pev->avelocity * 0.9; pev->avelocity = pev->avelocity * 0.9;
pev->velocity.z += 8; pev->velocity.z += 8;
} }
else if (pev->waterlevel == 0) else if( pev->waterlevel == 0 )
{ {
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
} }
@ -145,21 +147,27 @@ void CSatchelCharge :: SatchelThink( void )
} }
} }
void CSatchelCharge :: Precache( void ) void CSatchelCharge::Precache( void )
{ {
PRECACHE_MODEL("models/grenade.mdl"); PRECACHE_MODEL( "models/grenade.mdl" );
PRECACHE_SOUND("weapons/g_bounce1.wav"); PRECACHE_SOUND( "weapons/g_bounce1.wav" );
PRECACHE_SOUND("weapons/g_bounce2.wav"); PRECACHE_SOUND( "weapons/g_bounce2.wav" );
PRECACHE_SOUND("weapons/g_bounce3.wav"); PRECACHE_SOUND( "weapons/g_bounce3.wav" );
} }
void CSatchelCharge :: BounceSound( void ) void CSatchelCharge::BounceSound( void )
{ {
switch ( RANDOM_LONG( 0, 2 ) ) switch( RANDOM_LONG( 0, 2 ) )
{ {
case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/g_bounce1.wav", 1, ATTN_NORM); break; case 0:
case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/g_bounce2.wav", 1, ATTN_NORM); break; EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/g_bounce1.wav", 1, ATTN_NORM );
case 2: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/g_bounce3.wav", 1, ATTN_NORM); break; break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/g_bounce2.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/g_bounce3.wav", 1, ATTN_NORM );
break;
} }
} }
@ -173,21 +181,21 @@ int CSatchel::AddDuplicate( CBasePlayerItem *pOriginal )
CSatchel *pSatchel; CSatchel *pSatchel;
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
pSatchel = (CSatchel *)pOriginal; pSatchel = (CSatchel *)pOriginal;
if ( pSatchel->m_chargeReady != 0 ) if( pSatchel->m_chargeReady != 0 )
{ {
// player has some satchels deployed. Refuse to add more. // player has some satchels deployed. Refuse to add more.
return FALSE; return FALSE;
} }
} }
return CBasePlayerWeapon::AddDuplicate ( pOriginal ); return CBasePlayerWeapon::AddDuplicate( pOriginal );
} }
//========================================================= //=========================================================
@ -196,21 +204,21 @@ int CSatchel::AddToPlayer( CBasePlayer *pPlayer )
{ {
int bResult = CBasePlayerItem::AddToPlayer( pPlayer ); int bResult = CBasePlayerItem::AddToPlayer( pPlayer );
pPlayer->pev->weapons |= (1<<m_iId); pPlayer->pev->weapons |= ( 1 << m_iId );
m_chargeReady = 0;// this satchel charge weapon now forgets that any satchels are deployed by it. m_chargeReady = 0;// this satchel charge weapon now forgets that any satchels are deployed by it.
if ( bResult ) if( bResult )
{ {
return AddWeapon( ); return AddWeapon();
} }
return FALSE; return FALSE;
} }
void CSatchel::Spawn( ) void CSatchel::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_SATCHEL; m_iId = WEAPON_SATCHEL;
SET_MODEL(ENT(pev), "models/w_satchel.mdl"); SET_MODEL( ENT( pev ), "models/w_satchel.mdl" );
m_iDefaultAmmo = SATCHEL_DEFAULT_GIVE; m_iDefaultAmmo = SATCHEL_DEFAULT_GIVE;
@ -219,18 +227,18 @@ void CSatchel::Spawn( )
void CSatchel::Precache( void ) void CSatchel::Precache( void )
{ {
PRECACHE_MODEL("models/v_satchel.mdl"); PRECACHE_MODEL( "models/v_satchel.mdl" );
PRECACHE_MODEL("models/v_satchel_radio.mdl"); PRECACHE_MODEL( "models/v_satchel_radio.mdl" );
PRECACHE_MODEL("models/w_satchel.mdl"); PRECACHE_MODEL( "models/w_satchel.mdl" );
PRECACHE_MODEL("models/p_satchel.mdl"); PRECACHE_MODEL( "models/p_satchel.mdl" );
PRECACHE_MODEL("models/p_satchel_radio.mdl"); PRECACHE_MODEL( "models/p_satchel_radio.mdl" );
UTIL_PrecacheOther( "monster_satchel" ); UTIL_PrecacheOther( "monster_satchel" );
} }
int CSatchel::GetItemInfo(ItemInfo *p) int CSatchel::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Satchel Charge"; p->pszAmmo1 = "Satchel Charge";
p->iMaxAmmo1 = SATCHEL_MAX_CARRY; p->iMaxAmmo1 = SATCHEL_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -249,13 +257,13 @@ int CSatchel::GetItemInfo(ItemInfo *p)
//========================================================= //=========================================================
BOOL CSatchel::IsUseable( void ) BOOL CSatchel::IsUseable( void )
{ {
if ( m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] > 0 ) if( m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] > 0 )
{ {
// player is carrying some satchels // player is carrying some satchels
return TRUE; return TRUE;
} }
if ( m_chargeReady != 0 ) if( m_chargeReady != 0 )
{ {
// player isn't carrying any satchels, but has some out // player isn't carrying any satchels, but has some out
return TRUE; return TRUE;
@ -266,13 +274,13 @@ BOOL CSatchel::IsUseable( void )
BOOL CSatchel::CanDeploy( void ) BOOL CSatchel::CanDeploy( void )
{ {
if ( m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] > 0 ) if( m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] > 0 )
{ {
// player is carrying some satchels // player is carrying some satchels
return TRUE; return TRUE;
} }
if ( m_chargeReady != 0 ) if( m_chargeReady != 0 )
{ {
// player isn't carrying any satchels, but has some out // player isn't carrying any satchels, but has some out
return TRUE; return TRUE;
@ -281,17 +289,15 @@ BOOL CSatchel::CanDeploy( void )
return FALSE; return FALSE;
} }
BOOL CSatchel::Deploy( ) BOOL CSatchel::Deploy()
{ {
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
if ( m_chargeReady ) if( m_chargeReady )
return DefaultDeploy( "models/v_satchel_radio.mdl", "models/p_satchel_radio.mdl", SATCHEL_RADIO_DRAW, "hive" ); return DefaultDeploy( "models/v_satchel_radio.mdl", "models/p_satchel_radio.mdl", SATCHEL_RADIO_DRAW, "hive" );
else else
return DefaultDeploy( "models/v_satchel.mdl", "models/p_satchel.mdl", SATCHEL_DRAW, "trip" ); return DefaultDeploy( "models/v_satchel.mdl", "models/p_satchel.mdl", SATCHEL_DRAW, "trip" );
return TRUE; return TRUE;
} }
@ -299,8 +305,8 @@ BOOL CSatchel::Deploy( )
void CSatchel::Holster( int skiplocal /* = 0 */ ) void CSatchel::Holster( int skiplocal /* = 0 */ )
{ {
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
if ( m_chargeReady ) if( m_chargeReady )
{ {
SendWeaponAnim( SATCHEL_RADIO_HOLSTER ); SendWeaponAnim( SATCHEL_RADIO_HOLSTER );
} }
@ -308,11 +314,11 @@ void CSatchel::Holster( int skiplocal /* = 0 */ )
{ {
SendWeaponAnim( SATCHEL_DROP ); SendWeaponAnim( SATCHEL_DROP );
} }
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
if ( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] && !m_chargeReady ) if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] && !m_chargeReady )
{ {
m_pPlayer->pev->weapons &= ~(1<<WEAPON_SATCHEL); m_pPlayer->pev->weapons &= ~( 1 << WEAPON_SATCHEL );
SetThink( &CBasePlayerItem::DestroyItem ); SetThink( &CBasePlayerItem::DestroyItem );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
} }
@ -320,26 +326,26 @@ void CSatchel::Holster( int skiplocal /* = 0 */ )
void CSatchel::PrimaryAttack() void CSatchel::PrimaryAttack()
{ {
switch (m_chargeReady) switch( m_chargeReady )
{ {
case 0: case 0:
{ {
Throw( ); Throw();
} }
break; break;
case 1: case 1:
{ {
SendWeaponAnim( SATCHEL_RADIO_FIRE ); SendWeaponAnim( SATCHEL_RADIO_FIRE );
edict_t *pPlayer = m_pPlayer->edict( ); edict_t *pPlayer = m_pPlayer->edict();
CBaseEntity *pSatchel = NULL; CBaseEntity *pSatchel = NULL;
while ((pSatchel = UTIL_FindEntityInSphere( pSatchel, m_pPlayer->pev->origin, 4096 )) != NULL) while( ( pSatchel = UTIL_FindEntityInSphere( pSatchel, m_pPlayer->pev->origin, 4096 ) ) != NULL )
{ {
if (FClassnameIs( pSatchel->pev, "monster_satchel")) if( FClassnameIs( pSatchel->pev, "monster_satchel" ) )
{ {
if (pSatchel->pev->owner == pPlayer) if( pSatchel->pev->owner == pPlayer )
{ {
pSatchel->Use( m_pPlayer, m_pPlayer, USE_ON, 0 ); pSatchel->Use( m_pPlayer, m_pPlayer, USE_ON, 0 );
m_chargeReady = 2; m_chargeReady = 2;
@ -355,37 +361,35 @@ void CSatchel::PrimaryAttack()
} }
case 2: case 2:
// we're reloading, don't allow fire // we're reloading, don't allow fire
{
}
break; break;
} }
} }
void CSatchel::SecondaryAttack( void ) void CSatchel::SecondaryAttack( void )
{ {
if ( m_chargeReady != 2 ) if( m_chargeReady != 2 )
{ {
Throw( ); Throw();
} }
} }
void CSatchel::Throw( void ) void CSatchel::Throw( void )
{ {
if ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
Vector vecSrc = m_pPlayer->pev->origin; Vector vecSrc = m_pPlayer->pev->origin;
Vector vecThrow = gpGlobals->v_forward * 274 + m_pPlayer->pev->velocity; Vector vecThrow = gpGlobals->v_forward * 274 + m_pPlayer->pev->velocity;
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
CBaseEntity *pSatchel = Create( "monster_satchel", vecSrc, Vector( 0, 0, 0), m_pPlayer->edict() ); CBaseEntity *pSatchel = Create( "monster_satchel", vecSrc, Vector( 0, 0, 0 ), m_pPlayer->edict() );
pSatchel->pev->velocity = vecThrow; pSatchel->pev->velocity = vecThrow;
pSatchel->pev->avelocity.y = 400; pSatchel->pev->avelocity.y = 400;
m_pPlayer->pev->viewmodel = MAKE_STRING("models/v_satchel_radio.mdl"); m_pPlayer->pev->viewmodel = MAKE_STRING( "models/v_satchel_radio.mdl" );
m_pPlayer->pev->weaponmodel = MAKE_STRING("models/p_satchel_radio.mdl"); m_pPlayer->pev->weaponmodel = MAKE_STRING( "models/p_satchel_radio.mdl" );
#else #else
LoadVModel ( "models/v_satchel_radio.mdl", m_pPlayer ); LoadVModel( "models/v_satchel_radio.mdl", m_pPlayer );
#endif #endif
SendWeaponAnim( SATCHEL_RADIO_DRAW ); SendWeaponAnim( SATCHEL_RADIO_DRAW );
@ -404,7 +408,7 @@ void CSatchel::Throw( void )
void CSatchel::WeaponIdle( void ) void CSatchel::WeaponIdle( void )
{ {
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
switch( m_chargeReady ) switch( m_chargeReady )
@ -420,7 +424,7 @@ void CSatchel::WeaponIdle( void )
strcpy( m_pPlayer->m_szAnimExtention, "hive" ); strcpy( m_pPlayer->m_szAnimExtention, "hive" );
break; break;
case 2: case 2:
if ( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
m_chargeReady = 0; m_chargeReady = 0;
RetireWeapon(); RetireWeapon();
@ -428,10 +432,10 @@ void CSatchel::WeaponIdle( void )
} }
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
m_pPlayer->pev->viewmodel = MAKE_STRING("models/v_satchel.mdl"); m_pPlayer->pev->viewmodel = MAKE_STRING( "models/v_satchel.mdl" );
m_pPlayer->pev->weaponmodel = MAKE_STRING("models/p_satchel.mdl"); m_pPlayer->pev->weaponmodel = MAKE_STRING( "models/p_satchel.mdl" );
#else #else
LoadVModel ( "models/v_satchel.mdl", m_pPlayer ); LoadVModel( "models/v_satchel.mdl", m_pPlayer );
#endif #endif
SendWeaponAnim( SATCHEL_DRAW ); SendWeaponAnim( SATCHEL_DRAW );
@ -458,14 +462,14 @@ void DeactivateSatchels( CBasePlayer *pOwner )
pFind = FIND_ENTITY_BY_CLASSNAME( NULL, "monster_satchel" ); pFind = FIND_ENTITY_BY_CLASSNAME( NULL, "monster_satchel" );
while ( !FNullEnt( pFind ) ) while( !FNullEnt( pFind ) )
{ {
CBaseEntity *pEnt = CBaseEntity::Instance( pFind ); CBaseEntity *pEnt = CBaseEntity::Instance( pFind );
CSatchelCharge *pSatchel = (CSatchelCharge *)pEnt; CSatchelCharge *pSatchel = (CSatchelCharge *)pEnt;
if ( pSatchel ) if( pSatchel )
{ {
if ( pSatchel->pev->owner == pOwner->edict() ) if( pSatchel->pev->owner == pOwner->edict() )
{ {
pSatchel->Deactivate(); pSatchel->Deactivate();
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,10 +23,11 @@
#include "gamerules.h" #include "gamerules.h"
// special deathmatch shotgun spreads // special deathmatch shotgun spreads
#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees #define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees
#define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degrees #define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degrees
enum shotgun_e { enum shotgun_e
{
SHOTGUN_IDLE = 0, SHOTGUN_IDLE = 0,
SHOTGUN_FIRE, SHOTGUN_FIRE,
SHOTGUN_FIRE2, SHOTGUN_FIRE2,
@ -41,11 +42,11 @@ enum shotgun_e {
LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun ) LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun )
void CShotgun::Spawn( ) void CShotgun::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_SHOTGUN; m_iId = WEAPON_SHOTGUN;
SET_MODEL(ENT(pev), "models/w_shotgun.mdl"); SET_MODEL( ENT( pev ), "models/w_shotgun.mdl" );
m_iDefaultAmmo = SHOTGUN_DEFAULT_GIVE; m_iDefaultAmmo = SHOTGUN_DEFAULT_GIVE;
@ -54,25 +55,25 @@ void CShotgun::Spawn( )
void CShotgun::Precache( void ) void CShotgun::Precache( void )
{ {
PRECACHE_MODEL("models/v_shotgun.mdl"); PRECACHE_MODEL( "models/v_shotgun.mdl" );
PRECACHE_MODEL("models/w_shotgun.mdl"); PRECACHE_MODEL( "models/w_shotgun.mdl" );
PRECACHE_MODEL("models/p_shotgun.mdl"); PRECACHE_MODEL( "models/p_shotgun.mdl" );
m_iShell = PRECACHE_MODEL ("models/shotgunshell.mdl");// shotgun shell m_iShell = PRECACHE_MODEL( "models/shotgunshell.mdl" );// shotgun shell
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
PRECACHE_SOUND ("weapons/dbarrel1.wav");//shotgun PRECACHE_SOUND( "weapons/dbarrel1.wav" );//shotgun
PRECACHE_SOUND ("weapons/sbarrel1.wav");//shotgun PRECACHE_SOUND( "weapons/sbarrel1.wav" );//shotgun
PRECACHE_SOUND ("weapons/reload1.wav"); // shotgun reload PRECACHE_SOUND( "weapons/reload1.wav" ); // shotgun reload
PRECACHE_SOUND ("weapons/reload3.wav"); // shotgun reload PRECACHE_SOUND( "weapons/reload3.wav" ); // shotgun reload
// PRECACHE_SOUND ("weapons/sshell1.wav"); // shotgun reload - played on client //PRECACHE_SOUND( "weapons/sshell1.wav" ); // shotgun reload - played on client
// PRECACHE_SOUND ("weapons/sshell3.wav"); // shotgun reload - played on client //PRECACHE_SOUND( "weapons/sshell3.wav" ); // shotgun reload - played on client
PRECACHE_SOUND ("weapons/357_cock1.wav"); // gun empty sound PRECACHE_SOUND( "weapons/357_cock1.wav" ); // gun empty sound
PRECACHE_SOUND ("weapons/scock1.wav"); // cock gun PRECACHE_SOUND( "weapons/scock1.wav" ); // cock gun
m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun1.sc" ); m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun1.sc" );
m_usDoubleFire = PRECACHE_EVENT( 1, "events/shotgun2.sc" ); m_usDoubleFire = PRECACHE_EVENT( 1, "events/shotgun2.sc" );
@ -80,7 +81,7 @@ void CShotgun::Precache( void )
int CShotgun::AddToPlayer( CBasePlayer *pPlayer ) int CShotgun::AddToPlayer( CBasePlayer *pPlayer )
{ {
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{ {
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId ); WRITE_BYTE( m_iId );
@ -90,9 +91,9 @@ int CShotgun::AddToPlayer( CBasePlayer *pPlayer )
return FALSE; return FALSE;
} }
int CShotgun::GetItemInfo(ItemInfo *p) int CShotgun::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "buckshot"; p->pszAmmo1 = "buckshot";
p->iMaxAmmo1 = BUCKSHOT_MAX_CARRY; p->iMaxAmmo1 = BUCKSHOT_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -107,7 +108,7 @@ int CShotgun::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CShotgun::Deploy( ) BOOL CShotgun::Deploy()
{ {
return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" ); return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" );
} }
@ -115,18 +116,18 @@ BOOL CShotgun::Deploy( )
void CShotgun::PrimaryAttack() void CShotgun::PrimaryAttack()
{ {
// don't fire underwater // don't fire underwater
if (m_pPlayer->pev->waterlevel == 3) if( m_pPlayer->pev->waterlevel == 3 )
{ {
PlayEmptySound( ); PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
return; return;
} }
if (m_iClip <= 0) if( m_iClip <= 0 )
{ {
Reload( ); Reload();
if (m_iClip == 0) if( m_iClip == 0 )
PlayEmptySound( ); PlayEmptySound();
return; return;
} }
@ -141,18 +142,17 @@ void CShotgun::PrimaryAttack()
#else #else
flags = 0; flags = 0;
#endif #endif
m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecSrc = m_pPlayer->GetGunPosition( );
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
Vector vecDir; Vector vecDir;
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
@ -165,16 +165,16 @@ void CShotgun::PrimaryAttack()
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition // HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
if (m_iClip != 0) if( m_iClip != 0 )
m_flPumpTime = gpGlobals->time + 0.5; m_flPumpTime = gpGlobals->time + 0.5;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
if (m_iClip != 0) if( m_iClip != 0 )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
else else
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75;
@ -184,17 +184,17 @@ void CShotgun::PrimaryAttack()
void CShotgun::SecondaryAttack( void ) void CShotgun::SecondaryAttack( void )
{ {
// don't fire underwater // don't fire underwater
if (m_pPlayer->pev->waterlevel == 3) if( m_pPlayer->pev->waterlevel == 3 )
{ {
PlayEmptySound( ); PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
return; return;
} }
if (m_iClip <= 1) if( m_iClip <= 1 )
{ {
Reload( ); Reload();
PlayEmptySound( ); PlayEmptySound();
return; return;
} }
@ -209,20 +209,20 @@ void CShotgun::SecondaryAttack( void )
#else #else
flags = 0; flags = 0;
#endif #endif
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
Vector vecDir; Vector vecDir;
#ifdef CLIENT_DLL #ifdef CLIENT_DLL
if ( bIsMultiplayer() ) if( bIsMultiplayer() )
#else #else
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
#endif #endif
{ {
// tuned for deathmatch // tuned for deathmatch
@ -233,19 +233,19 @@ void CShotgun::SecondaryAttack( void )
// untouched default single player // untouched default single player
vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
} }
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition // HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
if (m_iClip != 0) if( m_iClip != 0 )
m_flPumpTime = gpGlobals->time + 0.95; m_flPumpTime = gpGlobals->time + 0.95;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5;
if (m_iClip != 0) if( m_iClip != 0 )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0;
else else
m_flTimeWeaponIdle = 1.5; m_flTimeWeaponIdle = 1.5;
@ -255,15 +255,15 @@ void CShotgun::SecondaryAttack( void )
void CShotgun::Reload( void ) void CShotgun::Reload( void )
{ {
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP )
return; return;
// don't reload until recoil is done // don't reload until recoil is done
if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase()) if( m_flNextPrimaryAttack > UTIL_WeaponTimeBase() )
return; return;
// check to see if we're ready to reload // check to see if we're ready to reload
if (m_fInSpecialReload == 0) if( m_fInSpecialReload == 0 )
{ {
SendWeaponAnim( SHOTGUN_START_RELOAD ); SendWeaponAnim( SHOTGUN_START_RELOAD );
m_fInSpecialReload = 1; m_fInSpecialReload = 1;
@ -273,17 +273,17 @@ void CShotgun::Reload( void )
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
return; return;
} }
else if (m_fInSpecialReload == 1) else if( m_fInSpecialReload == 1 )
{ {
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
// was waiting for gun to move to side // was waiting for gun to move to side
m_fInSpecialReload = 2; m_fInSpecialReload = 2;
if (RANDOM_LONG(0,1)) if( RANDOM_LONG( 0, 1 ) )
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) );
else else
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) );
SendWeaponAnim( SHOTGUN_RELOAD ); SendWeaponAnim( SHOTGUN_RELOAD );
@ -301,28 +301,28 @@ void CShotgun::Reload( void )
void CShotgun::WeaponIdle( void ) void CShotgun::WeaponIdle( void )
{ {
ResetEmptySound( ); ResetEmptySound();
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
if ( m_flPumpTime && m_flPumpTime < gpGlobals->time ) if( m_flPumpTime && m_flPumpTime < gpGlobals->time )
{ {
// play pumping sound // play pumping sound
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) );
m_flPumpTime = 0; m_flPumpTime = 0;
} }
if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
{ {
if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) if( m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
Reload( ); Reload();
} }
else if (m_fInSpecialReload != 0) else if( m_fInSpecialReload != 0 )
{ {
if (m_iClip != 8 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) if( m_iClip != 8 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
Reload( ); Reload();
} }
else else
{ {
@ -330,7 +330,7 @@ void CShotgun::WeaponIdle( void )
SendWeaponAnim( SHOTGUN_PUMP ); SendWeaponAnim( SHOTGUN_PUMP );
// play cocking sound // play cocking sound
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f)); EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) );
m_fInSpecialReload = 0; m_fInSpecialReload = 0;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
} }
@ -339,20 +339,20 @@ void CShotgun::WeaponIdle( void )
{ {
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.8) if( flRand <= 0.8 )
{ {
iAnim = SHOTGUN_IDLE_DEEP; iAnim = SHOTGUN_IDLE_DEEP;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (60.0/12.0);// * RANDOM_LONG(2, 5); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 60.0 / 12.0 );// * RANDOM_LONG( 2, 5 );
} }
else if (flRand <= 0.95) else if( flRand <= 0.95 )
{ {
iAnim = SHOTGUN_IDLE; iAnim = SHOTGUN_IDLE;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 );
} }
else else
{ {
iAnim = SHOTGUN_IDLE4; iAnim = SHOTGUN_IDLE4;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 );
} }
SendWeaponAnim( iAnim ); SendWeaponAnim( iAnim );
} }
@ -363,20 +363,20 @@ class CShotgunAmmo : public CBasePlayerAmmo
{ {
void Spawn( void ) void Spawn( void )
{ {
Precache( ); Precache();
SET_MODEL(ENT(pev), "models/w_shotbox.mdl"); SET_MODEL( ENT( pev ), "models/w_shotbox.mdl" );
CBasePlayerAmmo::Spawn( ); CBasePlayerAmmo::Spawn();
} }
void Precache( void ) void Precache( void )
{ {
PRECACHE_MODEL ("models/w_shotbox.mdl"); PRECACHE_MODEL( "models/w_shotbox.mdl" );
PRECACHE_SOUND("items/9mmclip1.wav"); PRECACHE_SOUND( "items/9mmclip1.wav" );
} }
BOOL AddAmmo( CBaseEntity *pOther ) BOOL AddAmmo( CBaseEntity *pOther )
{ {
if (pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1) if( pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1 )
{ {
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@ -40,7 +40,7 @@ CHalfLifeRules::CHalfLifeRules( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CHalfLifeRules::Think ( void ) void CHalfLifeRules::Think( void )
{ {
} }
@ -53,7 +53,7 @@ BOOL CHalfLifeRules::IsMultiplayer( void )
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules::IsDeathmatch ( void ) BOOL CHalfLifeRules::IsDeathmatch( void )
{ {
return FALSE; return FALSE;
} }
@ -65,18 +65,17 @@ BOOL CHalfLifeRules::IsCoOp( void )
return FALSE; return FALSE;
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon ) BOOL CHalfLifeRules::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
{ {
if ( !pPlayer->m_pActiveItem ) if( !pPlayer->m_pActiveItem )
{ {
// player doesn't have an active item! // player doesn't have an active item!
return TRUE; return TRUE;
} }
if ( !pPlayer->m_pActiveItem->CanHolster() ) if( !pPlayer->m_pActiveItem->CanHolster() )
{ {
return FALSE; return FALSE;
} }
@ -86,25 +85,25 @@ BOOL CHalfLifeRules::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerItem
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules :: GetNextBestWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon ) BOOL CHalfLifeRules::GetNextBestWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon )
{ {
return FALSE; return FALSE;
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules :: ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ) BOOL CHalfLifeRules::ClientConnected( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128] )
{ {
return TRUE; return TRUE;
} }
void CHalfLifeRules :: InitHUD( CBasePlayer *pl ) void CHalfLifeRules::InitHUD( CBasePlayer *pl )
{ {
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CHalfLifeRules :: ClientDisconnected( edict_t *pClient ) void CHalfLifeRules::ClientDisconnected( edict_t *pClient )
{ {
} }
@ -120,33 +119,33 @@ float CHalfLifeRules::FlPlayerFallDamage( CBasePlayer *pPlayer )
//========================================================= //=========================================================
//========================================================= //=========================================================
void CHalfLifeRules :: PlayerSpawn( CBasePlayer *pPlayer ) void CHalfLifeRules::PlayerSpawn( CBasePlayer *pPlayer )
{ {
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules :: AllowAutoTargetCrosshair( void ) BOOL CHalfLifeRules::AllowAutoTargetCrosshair( void )
{ {
return ( g_iSkillLevel == SKILL_EASY ); return ( g_iSkillLevel == SKILL_EASY );
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
void CHalfLifeRules :: PlayerThink( CBasePlayer *pPlayer ) void CHalfLifeRules::PlayerThink( CBasePlayer *pPlayer )
{ {
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules :: FPlayerCanRespawn( CBasePlayer *pPlayer ) BOOL CHalfLifeRules::FPlayerCanRespawn( CBasePlayer *pPlayer )
{ {
return TRUE; return TRUE;
} }
//========================================================= //=========================================================
//========================================================= //=========================================================
float CHalfLifeRules :: FlPlayerSpawnTime( CBasePlayer *pPlayer ) float CHalfLifeRules::FlPlayerSpawnTime( CBasePlayer *pPlayer )
{ {
return gpGlobals->time;//now! return gpGlobals->time;//now!
} }
@ -155,7 +154,7 @@ float CHalfLifeRules :: FlPlayerSpawnTime( CBasePlayer *pPlayer )
// IPointsForKill - how many points awarded to anyone // IPointsForKill - how many points awarded to anyone
// that kills this player? // that kills this player?
//========================================================= //=========================================================
int CHalfLifeRules :: IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled ) int CHalfLifeRules::IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled )
{ {
return 1; return 1;
} }
@ -163,7 +162,7 @@ int CHalfLifeRules :: IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKill
//========================================================= //=========================================================
// PlayerKilled - someone/something killed this player // PlayerKilled - someone/something killed this player
//========================================================= //=========================================================
void CHalfLifeRules :: PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor ) void CHalfLifeRules::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor )
{ {
} }
@ -178,7 +177,7 @@ void CHalfLifeRules::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, entv
// PlayerGotWeapon - player has grabbed a weapon that was // PlayerGotWeapon - player has grabbed a weapon that was
// sitting in the world // sitting in the world
//========================================================= //=========================================================
void CHalfLifeRules :: PlayerGotWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon ) void CHalfLifeRules::PlayerGotWeapon( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
{ {
} }
@ -186,7 +185,7 @@ void CHalfLifeRules :: PlayerGotWeapon( CBasePlayer *pPlayer, CBasePlayerItem *p
// FlWeaponRespawnTime - what is the time in the future // FlWeaponRespawnTime - what is the time in the future
// at which this weapon may spawn? // at which this weapon may spawn?
//========================================================= //=========================================================
float CHalfLifeRules :: FlWeaponRespawnTime( CBasePlayerItem *pWeapon ) float CHalfLifeRules::FlWeaponRespawnTime( CBasePlayerItem *pWeapon )
{ {
return -1; return -1;
} }
@ -196,7 +195,7 @@ float CHalfLifeRules :: FlWeaponRespawnTime( CBasePlayerItem *pWeapon )
// now, otherwise it returns the time at which it can try // now, otherwise it returns the time at which it can try
// to spawn again. // to spawn again.
//========================================================= //=========================================================
float CHalfLifeRules :: FlWeaponTryRespawn( CBasePlayerItem *pWeapon ) float CHalfLifeRules::FlWeaponTryRespawn( CBasePlayerItem *pWeapon )
{ {
return 0; return 0;
} }
@ -205,7 +204,7 @@ float CHalfLifeRules :: FlWeaponTryRespawn( CBasePlayerItem *pWeapon )
// VecWeaponRespawnSpot - where should this weapon spawn? // VecWeaponRespawnSpot - where should this weapon spawn?
// Some game variations may choose to randomize spawn locations // Some game variations may choose to randomize spawn locations
//========================================================= //=========================================================
Vector CHalfLifeRules :: VecWeaponRespawnSpot( CBasePlayerItem *pWeapon ) Vector CHalfLifeRules::VecWeaponRespawnSpot( CBasePlayerItem *pWeapon )
{ {
return pWeapon->pev->origin; return pWeapon->pev->origin;
} }
@ -214,7 +213,7 @@ Vector CHalfLifeRules :: VecWeaponRespawnSpot( CBasePlayerItem *pWeapon )
// WeaponShouldRespawn - any conditions inhibiting the // WeaponShouldRespawn - any conditions inhibiting the
// respawning of this weapon? // respawning of this weapon?
//========================================================= //=========================================================
int CHalfLifeRules :: WeaponShouldRespawn( CBasePlayerItem *pWeapon ) int CHalfLifeRules::WeaponShouldRespawn( CBasePlayerItem *pWeapon )
{ {
return GR_WEAPON_RESPAWN_NO; return GR_WEAPON_RESPAWN_NO;
} }
@ -321,7 +320,7 @@ int CHalfLifeRules::PlayerRelationship( CBaseEntity *pPlayer, CBaseEntity *pTarg
//========================================================= //=========================================================
//========================================================= //=========================================================
BOOL CHalfLifeRules :: FAllowMonsters( void ) BOOL CHalfLifeRules::FAllowMonsters( void )
{ {
return TRUE; return TRUE;
} }

View File

@ -19,7 +19,7 @@
#include "util.h" #include "util.h"
#include "skill.h" #include "skill.h"
skilldata_t gSkillData; skilldata_t gSkillData;
//========================================================= //=========================================================
// take the name of a cvar, tack a digit for the skill level // take the name of a cvar, tack a digit for the skill level
@ -27,17 +27,17 @@ skilldata_t gSkillData;
//========================================================= //=========================================================
float GetSkillCvar( char *pName ) float GetSkillCvar( char *pName )
{ {
int iCount; int iCount;
float flValue; float flValue;
char szBuffer[ 64 ]; char szBuffer[64];
iCount = sprintf( szBuffer, "%s%d",pName, gSkillData.iSkillLevel ); iCount = sprintf( szBuffer, "%s%d",pName, gSkillData.iSkillLevel );
flValue = CVAR_GET_FLOAT ( szBuffer ); flValue = CVAR_GET_FLOAT( szBuffer );
if ( flValue <= 0 ) if( flValue <= 0 )
{ {
ALERT ( at_console, "\n\n** GetSkillCVar Got a zero for %s **\n\n", szBuffer ); ALERT( at_console, "\n\n** GetSkillCVar Got a zero for %s **\n\n", szBuffer );
} }
return flValue; return flValue;

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,7 @@ SpectatorConnect
called when a spectator connects to a server called when a spectator connects to a server
============ ============
*/ */
void CBaseSpectator::SpectatorConnect(void) void CBaseSpectator::SpectatorConnect( void )
{ {
pev->flags = FL_SPECTATOR; pev->flags = FL_SPECTATOR;
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
@ -48,7 +48,7 @@ SpectatorDisconnect
called when a spectator disconnects from a server called when a spectator disconnects from a server
============ ============
*/ */
void CBaseSpectator::SpectatorDisconnect(void) void CBaseSpectator::SpectatorDisconnect( void )
{ {
} }
@ -59,14 +59,14 @@ SpectatorImpulseCommand
Called by SpectatorThink if the spectator entered an impulse Called by SpectatorThink if the spectator entered an impulse
================ ================
*/ */
void CBaseSpectator::SpectatorImpulseCommand(void) void CBaseSpectator::SpectatorImpulseCommand( void )
{ {
static edict_t *pGoal = NULL; static edict_t *pGoal = NULL;
edict_t *pPreviousGoal; edict_t *pPreviousGoal;
edict_t *pCurrentGoal; edict_t *pCurrentGoal;
BOOL bFound; BOOL bFound;
switch (pev->impulse) switch( pev->impulse )
{ {
case 1: case 1:
// teleport the spectator to the next spawn point // teleport the spectator to the next spawn point
@ -78,24 +78,24 @@ void CBaseSpectator::SpectatorImpulseCommand(void)
// back around // back around
bFound = FALSE; bFound = FALSE;
while (1) while( 1 )
{ {
pCurrentGoal = FIND_ENTITY_BY_CLASSNAME(pCurrentGoal, "info_player_deathmatch"); pCurrentGoal = FIND_ENTITY_BY_CLASSNAME( pCurrentGoal, "info_player_deathmatch" );
// Looped around, failure // Looped around, failure
if (pCurrentGoal == pPreviousGoal) if( pCurrentGoal == pPreviousGoal )
{ {
ALERT(at_console, "Could not find a spawn spot.\n"); ALERT( at_console, "Could not find a spawn spot.\n" );
break; break;
} }
// Found a non-world entity, set success, otherwise, look for the next one. // Found a non-world entity, set success, otherwise, look for the next one.
if (!FNullEnt(pCurrentGoal)) if( !FNullEnt( pCurrentGoal ) )
{ {
bFound = TRUE; bFound = TRUE;
break; break;
} }
} }
if (!bFound) // Didn't find a good spot. if( !bFound ) // Didn't find a good spot.
break; break;
pGoal = pCurrentGoal; pGoal = pCurrentGoal;
@ -104,7 +104,7 @@ void CBaseSpectator::SpectatorImpulseCommand(void)
pev->fixangle = FALSE; pev->fixangle = FALSE;
break; break;
default: default:
ALERT(at_console, "Unknown spectator impulse\n"); ALERT( at_console, "Unknown spectator impulse\n" );
break; break;
} }
@ -118,17 +118,17 @@ SpectatorThink
Called every frame after physics are run Called every frame after physics are run
================ ================
*/ */
void CBaseSpectator::SpectatorThink(void) void CBaseSpectator::SpectatorThink( void )
{ {
if (!(pev->flags & FL_SPECTATOR)) if( !( pev->flags & FL_SPECTATOR ) )
{ {
pev->flags = FL_SPECTATOR; pev->flags = FL_SPECTATOR;
} }
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
pev->movetype = MOVETYPE_NOCLIP; pev->movetype = MOVETYPE_NOCLIP;
if (pev->impulse) if( pev->impulse )
SpectatorImpulseCommand(); SpectatorImpulseCommand();
} }

View File

@ -18,10 +18,10 @@ class CBaseSpectator : public CBaseEntity
{ {
public: public:
void Spawn(); void Spawn();
void SpectatorConnect(void); void SpectatorConnect( void );
void SpectatorDisconnect(void); void SpectatorDisconnect( void );
void SpectatorThink(void); void SpectatorThink( void );
private: private:
void SpectatorImpulseCommand(void); void SpectatorImpulseCommand( void );
}; };

View File

@ -47,18 +47,18 @@ IMPLEMENT_SAVERESTORE( CSquadMonster, CBaseMonster )
// OccupySlot - if any slots of the passed slots are // OccupySlot - if any slots of the passed slots are
// available, the monster will be assigned to one. // available, the monster will be assigned to one.
//========================================================= //=========================================================
BOOL CSquadMonster :: OccupySlot( int iDesiredSlots ) BOOL CSquadMonster::OccupySlot( int iDesiredSlots )
{ {
int i; int i;
int iMask; int iMask;
int iSquadSlots; int iSquadSlots;
if ( !InSquad() ) if( !InSquad() )
{ {
return TRUE; return TRUE;
} }
if ( SquadEnemySplit() ) if( SquadEnemySplit() )
{ {
// if the squad members aren't all fighting the same enemy, slots are disabled // if the squad members aren't all fighting the same enemy, slots are disabled
// so that a squad member doesn't get stranded unable to engage his enemy because // so that a squad member doesn't get stranded unable to engage his enemy because
@ -69,7 +69,7 @@ BOOL CSquadMonster :: OccupySlot( int iDesiredSlots )
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
if ( !( iDesiredSlots ^ pSquadLeader->m_afSquadSlots ) ) if( !( iDesiredSlots ^ pSquadLeader->m_afSquadSlots ) )
{ {
// none of the desired slots are available. // none of the desired slots are available.
return FALSE; return FALSE;
@ -77,17 +77,17 @@ BOOL CSquadMonster :: OccupySlot( int iDesiredSlots )
iSquadSlots = pSquadLeader->m_afSquadSlots; iSquadSlots = pSquadLeader->m_afSquadSlots;
for ( i = 0; i < NUM_SLOTS; i++ ) for( i = 0; i < NUM_SLOTS; i++ )
{ {
iMask = 1<<i; iMask = 1 << i;
if ( iDesiredSlots & iMask ) // am I looking for this bit? if( iDesiredSlots & iMask ) // am I looking for this bit?
{ {
if ( !(iSquadSlots & iMask) ) // Is it already taken? if( !( iSquadSlots & iMask ) ) // Is it already taken?
{ {
// No, use this bit // No, use this bit
pSquadLeader->m_afSquadSlots |= iMask; pSquadLeader->m_afSquadSlots |= iMask;
m_iMySlot = iMask; m_iMySlot = iMask;
//ALERT ( at_aiconsole, "Took slot %d - %d\n", i, m_hSquadLeader->m_afSquadSlots ); //ALERT( at_aiconsole, "Took slot %d - %d\n", i, m_hSquadLeader->m_afSquadSlots );
return TRUE; return TRUE;
} }
} }
@ -97,13 +97,13 @@ BOOL CSquadMonster :: OccupySlot( int iDesiredSlots )
} }
//========================================================= //=========================================================
// VacateSlot // VacateSlot
//========================================================= //=========================================================
void CSquadMonster :: VacateSlot() void CSquadMonster::VacateSlot()
{ {
if ( m_iMySlot != bits_NO_SLOT && InSquad() ) if( m_iMySlot != bits_NO_SLOT && InSquad() )
{ {
//ALERT ( at_aiconsole, "Vacated Slot %d - %d\n", m_iMySlot, m_hSquadLeader->m_afSquadSlots ); //ALERT( at_aiconsole, "Vacated Slot %d - %d\n", m_iMySlot, m_hSquadLeader->m_afSquadSlots );
MySquadLeader()->m_afSquadSlots &= ~m_iMySlot; MySquadLeader()->m_afSquadSlots &= ~m_iMySlot;
m_iMySlot = bits_NO_SLOT; m_iMySlot = bits_NO_SLOT;
} }
@ -112,7 +112,7 @@ void CSquadMonster :: VacateSlot()
//========================================================= //=========================================================
// ScheduleChange // ScheduleChange
//========================================================= //=========================================================
void CSquadMonster :: ScheduleChange ( void ) void CSquadMonster::ScheduleChange ( void )
{ {
VacateSlot(); VacateSlot();
} }
@ -120,16 +120,16 @@ void CSquadMonster :: ScheduleChange ( void )
//========================================================= //=========================================================
// Killed // Killed
//========================================================= //=========================================================
void CSquadMonster :: Killed( entvars_t *pevAttacker, int iGib ) void CSquadMonster::Killed( entvars_t *pevAttacker, int iGib )
{ {
VacateSlot(); VacateSlot();
if ( InSquad() ) if( InSquad() )
{ {
MySquadLeader()->SquadRemove( this ); MySquadLeader()->SquadRemove( this );
} }
CBaseMonster :: Killed ( pevAttacker, iGib ); CBaseMonster::Killed( pevAttacker, iGib );
} }
// These functions are still awaiting conversion to CSquadMonster // These functions are still awaiting conversion to CSquadMonster
@ -141,19 +141,19 @@ void CSquadMonster :: Killed( entvars_t *pevAttacker, int iGib )
// If I am pRemove, promote m_pSquadNext to leader // If I am pRemove, promote m_pSquadNext to leader
// //
//========================================================= //=========================================================
void CSquadMonster :: SquadRemove( CSquadMonster *pRemove ) void CSquadMonster::SquadRemove( CSquadMonster *pRemove )
{ {
ASSERT( pRemove!=NULL ); ASSERT( pRemove!=NULL );
ASSERT( this->IsLeader() ); ASSERT( this->IsLeader() );
ASSERT( pRemove->m_hSquadLeader == this ); ASSERT( pRemove->m_hSquadLeader == this );
// If I'm the leader, get rid of my squad // If I'm the leader, get rid of my squad
if (pRemove == MySquadLeader()) if( pRemove == MySquadLeader() )
{ {
for (int i = 0; i < MAX_SQUAD_MEMBERS-1;i++) for( int i = 0; i < MAX_SQUAD_MEMBERS - 1; i++ )
{ {
CSquadMonster *pMember = MySquadMember(i); CSquadMonster *pMember = MySquadMember( i );
if (pMember) if( pMember )
{ {
pMember->m_hSquadLeader = NULL; pMember->m_hSquadLeader = NULL;
m_hSquadMember[i] = NULL; m_hSquadMember[i] = NULL;
@ -163,11 +163,11 @@ void CSquadMonster :: SquadRemove( CSquadMonster *pRemove )
else else
{ {
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
if (pSquadLeader) if( pSquadLeader )
{ {
for (int i = 0; i < MAX_SQUAD_MEMBERS-1;i++) for( int i = 0; i < MAX_SQUAD_MEMBERS - 1; i++ )
{ {
if (pSquadLeader->m_hSquadMember[i] == this) if( pSquadLeader->m_hSquadMember[i] == this )
{ {
pSquadLeader->m_hSquadMember[i] = NULL; pSquadLeader->m_hSquadMember[i] = NULL;
break; break;
@ -184,15 +184,15 @@ void CSquadMonster :: SquadRemove( CSquadMonster *pRemove )
// SquadAdd(), add pAdd to my squad // SquadAdd(), add pAdd to my squad
// //
//========================================================= //=========================================================
BOOL CSquadMonster :: SquadAdd( CSquadMonster *pAdd ) BOOL CSquadMonster::SquadAdd( CSquadMonster *pAdd )
{ {
ASSERT( pAdd!=NULL ); ASSERT( pAdd != NULL );
ASSERT( !pAdd->InSquad() ); ASSERT( !pAdd->InSquad() );
ASSERT( this->IsLeader() ); ASSERT( this->IsLeader() );
for (int i = 0; i < MAX_SQUAD_MEMBERS-1; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS - 1; i++ )
{ {
if (m_hSquadMember[i] == NULL) if( m_hSquadMember[i] == NULL )
{ {
m_hSquadMember[i] = pAdd; m_hSquadMember[i] = pAdd;
pAdd->m_hSquadLeader = this; pAdd->m_hSquadLeader = this;
@ -210,10 +210,10 @@ BOOL CSquadMonster :: SquadAdd( CSquadMonster *pAdd )
// members who don't have current info. // members who don't have current info.
// //
//========================================================= //=========================================================
void CSquadMonster :: SquadPasteEnemyInfo ( void ) void CSquadMonster::SquadPasteEnemyInfo( void )
{ {
CSquadMonster *pSquadLeader = MySquadLeader( ); CSquadMonster *pSquadLeader = MySquadLeader();
if (pSquadLeader) if( pSquadLeader )
pSquadLeader->m_vecEnemyLKP = m_vecEnemyLKP; pSquadLeader->m_vecEnemyLKP = m_vecEnemyLKP;
} }
@ -225,10 +225,10 @@ void CSquadMonster :: SquadPasteEnemyInfo ( void )
// so the most recent data is always available here. // so the most recent data is always available here.
// //
//========================================================= //=========================================================
void CSquadMonster :: SquadCopyEnemyInfo ( void ) void CSquadMonster::SquadCopyEnemyInfo( void )
{ {
CSquadMonster *pSquadLeader = MySquadLeader( ); CSquadMonster *pSquadLeader = MySquadLeader();
if (pSquadLeader) if( pSquadLeader )
m_vecEnemyLKP = pSquadLeader->m_vecEnemyLKP; m_vecEnemyLKP = pSquadLeader->m_vecEnemyLKP;
} }
@ -238,27 +238,27 @@ void CSquadMonster :: SquadCopyEnemyInfo ( void )
// the same entity. // the same entity.
// //
//========================================================= //=========================================================
void CSquadMonster :: SquadMakeEnemy ( CBaseEntity *pEnemy ) void CSquadMonster::SquadMakeEnemy( CBaseEntity *pEnemy )
{ {
if (!InSquad()) if( !InSquad() )
return; return;
if ( !pEnemy ) if( !pEnemy )
{ {
ALERT ( at_console, "ERROR: SquadMakeEnemy() - pEnemy is NULL!\n" ); ALERT( at_console, "ERROR: SquadMakeEnemy() - pEnemy is NULL!\n" );
return; return;
} }
CSquadMonster *pSquadLeader = MySquadLeader( ); CSquadMonster *pSquadLeader = MySquadLeader();
for (int i = 0; i < MAX_SQUAD_MEMBERS; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
{ {
CSquadMonster *pMember = pSquadLeader->MySquadMember(i); CSquadMonster *pMember = pSquadLeader->MySquadMember( i );
if (pMember) if( pMember )
{ {
// reset members who aren't activly engaged in fighting // reset members who aren't activly engaged in fighting
if (pMember->m_hEnemy != pEnemy && !pMember->HasConditions( bits_COND_SEE_ENEMY)) if( pMember->m_hEnemy != pEnemy && !pMember->HasConditions( bits_COND_SEE_ENEMY ) )
{ {
if ( pMember->m_hEnemy != NULL) if( pMember->m_hEnemy != NULL )
{ {
// remember their current enemy // remember their current enemy
pMember->PushEnemy( pMember->m_hEnemy, pMember->m_vecEnemyLKP ); pMember->PushEnemy( pMember->m_hEnemy, pMember->m_vecEnemyLKP );
@ -266,7 +266,7 @@ void CSquadMonster :: SquadMakeEnemy ( CBaseEntity *pEnemy )
// give them a new enemy // give them a new enemy
pMember->m_hEnemy = pEnemy; pMember->m_hEnemy = pEnemy;
pMember->m_vecEnemyLKP = pEnemy->pev->origin; pMember->m_vecEnemyLKP = pEnemy->pev->origin;
pMember->SetConditions ( bits_COND_NEW_ENEMY ); pMember->SetConditions( bits_COND_NEW_ENEMY );
} }
} }
} }
@ -278,16 +278,16 @@ void CSquadMonster :: SquadMakeEnemy ( CBaseEntity *pEnemy )
// callable from leaders & followers // callable from leaders & followers
// //
//========================================================= //=========================================================
int CSquadMonster :: SquadCount( void ) int CSquadMonster::SquadCount( void )
{ {
if (!InSquad()) if( !InSquad() )
return 0; return 0;
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
int squadCount = 0; int squadCount = 0;
for (int i = 0; i < MAX_SQUAD_MEMBERS; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
{ {
if (pSquadLeader->MySquadMember(i) != NULL) if( pSquadLeader->MySquadMember( i ) != NULL )
squadCount++; squadCount++;
} }
@ -300,16 +300,16 @@ int CSquadMonster :: SquadCount( void )
// link them as a group. returns the group size // link them as a group. returns the group size
// //
//========================================================= //=========================================================
int CSquadMonster :: SquadRecruit( int searchRadius, int maxMembers ) int CSquadMonster::SquadRecruit( int searchRadius, int maxMembers )
{ {
int squadCount; int squadCount;
int iMyClass = Classify();// cache this monster's class int iMyClass = Classify();// cache this monster's class
// Don't recruit if I'm already in a group // Don't recruit if I'm already in a group
if ( InSquad() ) if( InSquad() )
return 0; return 0;
if ( maxMembers < 2 ) if( maxMembers < 2 )
return 0; return 0;
// I am my own leader // I am my own leader
@ -318,20 +318,20 @@ int CSquadMonster :: SquadRecruit( int searchRadius, int maxMembers )
CBaseEntity *pEntity = NULL; CBaseEntity *pEntity = NULL;
if ( !FStringNull( pev->netname ) ) if( !FStringNull( pev->netname ) )
{ {
// I have a netname, so unconditionally recruit everyone else with that name. // I have a netname, so unconditionally recruit everyone else with that name.
pEntity = UTIL_FindEntityByString( pEntity, "netname", STRING( pev->netname ) ); pEntity = UTIL_FindEntityByString( pEntity, "netname", STRING( pev->netname ) );
while ( pEntity ) while( pEntity )
{ {
CSquadMonster *pRecruit = pEntity->MySquadMonsterPointer(); CSquadMonster *pRecruit = pEntity->MySquadMonsterPointer();
if ( pRecruit ) if( pRecruit )
{ {
if ( !pRecruit->InSquad() && pRecruit->Classify() == iMyClass && pRecruit != this ) if( !pRecruit->InSquad() && pRecruit->Classify() == iMyClass && pRecruit != this )
{ {
// minimum protection here against user error.in worldcraft. // minimum protection here against user error.in worldcraft.
if (!SquadAdd( pRecruit )) if( !SquadAdd( pRecruit ) )
break; break;
squadCount++; squadCount++;
} }
@ -342,22 +342,22 @@ int CSquadMonster :: SquadRecruit( int searchRadius, int maxMembers )
} }
else else
{ {
while ((pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, searchRadius )) != NULL) while( ( pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, searchRadius ) ) != NULL )
{ {
CSquadMonster *pRecruit = pEntity->MySquadMonsterPointer( ); CSquadMonster *pRecruit = pEntity->MySquadMonsterPointer();
if ( pRecruit && pRecruit != this && pRecruit->IsAlive() && !pRecruit->m_pCine ) if( pRecruit && pRecruit != this && pRecruit->IsAlive() && !pRecruit->m_pCine )
{ {
// Can we recruit this guy? // Can we recruit this guy?
if ( !pRecruit->InSquad() && pRecruit->Classify() == iMyClass && if( !pRecruit->InSquad() && pRecruit->Classify() == iMyClass &&
( (iMyClass != CLASS_ALIEN_MONSTER) || FStrEq(STRING(pev->classname), STRING(pRecruit->pev->classname))) && ( ( iMyClass != CLASS_ALIEN_MONSTER ) || FStrEq( STRING( pev->classname ), STRING( pRecruit->pev->classname ) ) ) &&
FStringNull( pRecruit->pev->netname ) ) FStringNull( pRecruit->pev->netname ) )
{ {
TraceResult tr; TraceResult tr;
UTIL_TraceLine( pev->origin + pev->view_ofs, pRecruit->pev->origin + pev->view_ofs, ignore_monsters, pRecruit->edict(), &tr );// try to hit recruit with a traceline. UTIL_TraceLine( pev->origin + pev->view_ofs, pRecruit->pev->origin + pev->view_ofs, ignore_monsters, pRecruit->edict(), &tr );// try to hit recruit with a traceline.
if ( tr.flFraction == 1.0 ) if( tr.flFraction == 1.0 )
{ {
if (!SquadAdd( pRecruit )) if( !SquadAdd( pRecruit ) )
break; break;
squadCount++; squadCount++;
@ -368,7 +368,7 @@ int CSquadMonster :: SquadRecruit( int searchRadius, int maxMembers )
} }
// no single member squads // no single member squads
if (squadCount == 1) if( squadCount == 1 )
{ {
m_hSquadLeader = NULL; m_hSquadLeader = NULL;
} }
@ -379,16 +379,16 @@ int CSquadMonster :: SquadRecruit( int searchRadius, int maxMembers )
//========================================================= //=========================================================
// CheckEnemy // CheckEnemy
//========================================================= //=========================================================
int CSquadMonster :: CheckEnemy ( CBaseEntity *pEnemy ) int CSquadMonster::CheckEnemy( CBaseEntity *pEnemy )
{ {
int iUpdatedLKP; int iUpdatedLKP;
iUpdatedLKP = CBaseMonster :: CheckEnemy ( m_hEnemy ); iUpdatedLKP = CBaseMonster::CheckEnemy( m_hEnemy );
// communicate with squad members about the enemy IF this individual has the same enemy as the squad leader. // communicate with squad members about the enemy IF this individual has the same enemy as the squad leader.
if ( InSquad() && (CBaseEntity *)m_hEnemy == MySquadLeader()->m_hEnemy ) if( InSquad() && (CBaseEntity *)m_hEnemy == MySquadLeader()->m_hEnemy )
{ {
if ( iUpdatedLKP ) if( iUpdatedLKP )
{ {
// have new enemy information, so paste to the squad. // have new enemy information, so paste to the squad.
SquadPasteEnemyInfo(); SquadPasteEnemyInfo();
@ -406,16 +406,16 @@ int CSquadMonster :: CheckEnemy ( CBaseEntity *pEnemy )
//========================================================= //=========================================================
// StartMonster // StartMonster
//========================================================= //=========================================================
void CSquadMonster :: StartMonster( void ) void CSquadMonster::StartMonster( void )
{ {
CBaseMonster :: StartMonster(); CBaseMonster::StartMonster();
if ( ( m_afCapability & bits_CAP_SQUAD ) && !InSquad() ) if( ( m_afCapability & bits_CAP_SQUAD ) && !InSquad() )
{ {
if ( !FStringNull( pev->netname ) ) if( !FStringNull( pev->netname ) )
{ {
// if I have a groupname, I can only recruit if I'm flagged as leader // if I have a groupname, I can only recruit if I'm flagged as leader
if ( !( pev->spawnflags & SF_SQUADMONSTER_LEADER ) ) if( !( pev->spawnflags & SF_SQUADMONSTER_LEADER ) )
{ {
return; return;
} }
@ -424,12 +424,12 @@ void CSquadMonster :: StartMonster( void )
// try to form squads now. // try to form squads now.
int iSquadSize = SquadRecruit( 1024, 4 ); int iSquadSize = SquadRecruit( 1024, 4 );
if ( iSquadSize ) if( iSquadSize )
{ {
ALERT ( at_aiconsole, "Squad of %d %s formed\n", iSquadSize, STRING( pev->classname ) ); ALERT( at_aiconsole, "Squad of %d %s formed\n", iSquadSize, STRING( pev->classname ) );
} }
if ( IsLeader() && FClassnameIs ( pev, "monster_human_grunt" ) ) if( IsLeader() && FClassnameIs( pev, "monster_human_grunt" ) )
{ {
SetBodygroup( 1, 1 ); // UNDONE: truly ugly hack SetBodygroup( 1, 1 ); // UNDONE: truly ugly hack
pev->skin = 0; pev->skin = 0;
@ -443,26 +443,25 @@ void CSquadMonster :: StartMonster( void )
// Builds a large box in front of the grunt and checks to see // Builds a large box in front of the grunt and checks to see
// if any squad members are in that box. // if any squad members are in that box.
//========================================================= //=========================================================
BOOL CSquadMonster :: NoFriendlyFire( void ) BOOL CSquadMonster::NoFriendlyFire( void )
{ {
if ( !InSquad() ) if( !InSquad() )
{ {
return TRUE; return TRUE;
} }
CPlane backPlane; CPlane backPlane;
CPlane leftPlane; CPlane leftPlane;
CPlane rightPlane; CPlane rightPlane;
Vector vecLeftSide; Vector vecLeftSide;
Vector vecRightSide; Vector vecRightSide;
Vector v_left; Vector v_left;
//!!!BUGBUG - to fix this, the planes must be aligned to where the monster will be firing its gun, not the direction it is facing!!! //!!!BUGBUG - to fix this, the planes must be aligned to where the monster will be firing its gun, not the direction it is facing!!!
if( m_hEnemy != NULL )
if ( m_hEnemy != NULL )
{ {
UTIL_MakeVectors ( UTIL_VecToAngles( m_hEnemy->Center() - pev->origin ) ); UTIL_MakeVectors( UTIL_VecToAngles( m_hEnemy->Center() - pev->origin ) );
} }
else else
{ {
@ -470,30 +469,29 @@ BOOL CSquadMonster :: NoFriendlyFire( void )
return FALSE; return FALSE;
} }
//UTIL_MakeVectors ( pev->angles ); //UTIL_MakeVectors( pev->angles );
vecLeftSide = pev->origin - ( gpGlobals->v_right * ( pev->size.x * 1.5 ) ); vecLeftSide = pev->origin - ( gpGlobals->v_right * ( pev->size.x * 1.5 ) );
vecRightSide = pev->origin + ( gpGlobals->v_right * ( pev->size.x * 1.5 ) ); vecRightSide = pev->origin + ( gpGlobals->v_right * ( pev->size.x * 1.5 ) );
v_left = gpGlobals->v_right * -1; v_left = gpGlobals->v_right * -1;
leftPlane.InitializePlane ( gpGlobals->v_right, vecLeftSide ); leftPlane.InitializePlane( gpGlobals->v_right, vecLeftSide );
rightPlane.InitializePlane ( v_left, vecRightSide ); rightPlane.InitializePlane( v_left, vecRightSide );
backPlane.InitializePlane ( gpGlobals->v_forward, pev->origin ); backPlane.InitializePlane( gpGlobals->v_forward, pev->origin );
/* /*
ALERT ( at_console, "LeftPlane: %f %f %f : %f\n", leftPlane.m_vecNormal.x, leftPlane.m_vecNormal.y, leftPlane.m_vecNormal.z, leftPlane.m_flDist ); ALERT( at_console, "LeftPlane: %f %f %f : %f\n", leftPlane.m_vecNormal.x, leftPlane.m_vecNormal.y, leftPlane.m_vecNormal.z, leftPlane.m_flDist );
ALERT ( at_console, "RightPlane: %f %f %f : %f\n", rightPlane.m_vecNormal.x, rightPlane.m_vecNormal.y, rightPlane.m_vecNormal.z, rightPlane.m_flDist ); ALERT( at_console, "RightPlane: %f %f %f : %f\n", rightPlane.m_vecNormal.x, rightPlane.m_vecNormal.y, rightPlane.m_vecNormal.z, rightPlane.m_flDist );
ALERT ( at_console, "BackPlane: %f %f %f : %f\n", backPlane.m_vecNormal.x, backPlane.m_vecNormal.y, backPlane.m_vecNormal.z, backPlane.m_flDist ); ALERT( at_console, "BackPlane: %f %f %f : %f\n", backPlane.m_vecNormal.x, backPlane.m_vecNormal.y, backPlane.m_vecNormal.z, backPlane.m_flDist );
*/ */
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
for (int i = 0; i < MAX_SQUAD_MEMBERS; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
{ {
CSquadMonster *pMember = pSquadLeader->MySquadMember(i); CSquadMonster *pMember = pSquadLeader->MySquadMember( i );
if (pMember && pMember != this) if( pMember && pMember != this )
{ {
if( backPlane.PointInFront( pMember->pev->origin ) &&
if ( backPlane.PointInFront ( pMember->pev->origin ) && leftPlane.PointInFront( pMember->pev->origin ) &&
leftPlane.PointInFront ( pMember->pev->origin ) && rightPlane.PointInFront( pMember->pev->origin ) )
rightPlane.PointInFront ( pMember->pev->origin) )
{ {
// this guy is in the check volume! Don't shoot! // this guy is in the check volume! Don't shoot!
return FALSE; return FALSE;
@ -508,27 +506,27 @@ BOOL CSquadMonster :: NoFriendlyFire( void )
// GetIdealState - surveys the Conditions information available // GetIdealState - surveys the Conditions information available
// and finds the best new state for a monster. // and finds the best new state for a monster.
//========================================================= //=========================================================
MONSTERSTATE CSquadMonster :: GetIdealState ( void ) MONSTERSTATE CSquadMonster::GetIdealState ( void )
{ {
int iConditions; int iConditions;
iConditions = IScheduleFlags(); iConditions = IScheduleFlags();
// If no schedule conditions, the new ideal state is probably the reason we're in here. // If no schedule conditions, the new ideal state is probably the reason we're in here.
switch ( m_MonsterState ) switch( m_MonsterState )
{ {
case MONSTERSTATE_IDLE: case MONSTERSTATE_IDLE:
case MONSTERSTATE_ALERT: case MONSTERSTATE_ALERT:
if ( HasConditions ( bits_COND_NEW_ENEMY ) && InSquad() ) if( HasConditions( bits_COND_NEW_ENEMY ) && InSquad() )
{ {
SquadMakeEnemy ( m_hEnemy ); SquadMakeEnemy( m_hEnemy );
} }
break; break;
default: default:
break; break;
} }
return CBaseMonster :: GetIdealState(); return CBaseMonster::GetIdealState();
} }
//========================================================= //=========================================================
@ -536,14 +534,14 @@ MONSTERSTATE CSquadMonster :: GetIdealState ( void )
// cover location is a good one to move to. (currently based // cover location is a good one to move to. (currently based
// on proximity to others in the squad) // on proximity to others in the squad)
//========================================================= //=========================================================
BOOL CSquadMonster :: FValidateCover ( const Vector &vecCoverLocation ) BOOL CSquadMonster::FValidateCover( const Vector &vecCoverLocation )
{ {
if ( !InSquad() ) if( !InSquad() )
{ {
return TRUE; return TRUE;
} }
if (SquadMemberInRange( vecCoverLocation, 128 )) if( SquadMemberInRange( vecCoverLocation, 128 ) )
{ {
// another squad member is too close to this piece of cover. // another squad member is too close to this piece of cover.
return FALSE; return FALSE;
@ -556,18 +554,18 @@ BOOL CSquadMonster :: FValidateCover ( const Vector &vecCoverLocation )
// SquadEnemySplit- returns TRUE if not all squad members // SquadEnemySplit- returns TRUE if not all squad members
// are fighting the same enemy. // are fighting the same enemy.
//========================================================= //=========================================================
BOOL CSquadMonster :: SquadEnemySplit ( void ) BOOL CSquadMonster::SquadEnemySplit( void )
{ {
if (!InSquad()) if( !InSquad() )
return FALSE; return FALSE;
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
CBaseEntity *pEnemy = pSquadLeader->m_hEnemy; CBaseEntity *pEnemy = pSquadLeader->m_hEnemy;
for (int i = 0; i < MAX_SQUAD_MEMBERS; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
{ {
CSquadMonster *pMember = pSquadLeader->MySquadMember(i); CSquadMonster *pMember = pSquadLeader->MySquadMember( i );
if (pMember != NULL && pMember->m_hEnemy != NULL && pMember->m_hEnemy != pEnemy) if( pMember != NULL && pMember->m_hEnemy != NULL && pMember->m_hEnemy != pEnemy )
{ {
return TRUE; return TRUE;
} }
@ -580,31 +578,31 @@ BOOL CSquadMonster :: SquadEnemySplit ( void )
// cover location is a good one to move to. (currently based // cover location is a good one to move to. (currently based
// on proximity to others in the squad) // on proximity to others in the squad)
//========================================================= //=========================================================
BOOL CSquadMonster :: SquadMemberInRange ( const Vector &vecLocation, float flDist ) BOOL CSquadMonster::SquadMemberInRange( const Vector &vecLocation, float flDist )
{ {
if (!InSquad()) if( !InSquad() )
return FALSE; return FALSE;
CSquadMonster *pSquadLeader = MySquadLeader(); CSquadMonster *pSquadLeader = MySquadLeader();
for (int i = 0; i < MAX_SQUAD_MEMBERS; i++) for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
{ {
CSquadMonster *pSquadMember = pSquadLeader->MySquadMember(i); CSquadMonster *pSquadMember = pSquadLeader->MySquadMember( i );
if (pSquadMember && (vecLocation - pSquadMember->pev->origin ).Length2D() <= flDist) if( pSquadMember && ( vecLocation - pSquadMember->pev->origin ).Length2D() <= flDist )
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
extern Schedule_t slChaseEnemyFailed[]; extern Schedule_t slChaseEnemyFailed[];
Schedule_t *CSquadMonster::GetScheduleOfType( int iType ) Schedule_t *CSquadMonster::GetScheduleOfType( int iType )
{ {
switch ( iType ) switch( iType )
{ {
case SCHED_CHASE_ENEMY_FAILED: case SCHED_CHASE_ENEMY_FAILED:
{ {
return &slChaseEnemyFailed[ 0 ]; return &slChaseEnemyFailed[0];
} }
default: default:
return CBaseMonster::GetScheduleOfType( iType ); return CBaseMonster::GetScheduleOfType( iType );

View File

@ -57,16 +57,16 @@ class CSquadMonster : public CBaseMonster
public: public:
// squad leader info // squad leader info
EHANDLE m_hSquadLeader; // who is my leader EHANDLE m_hSquadLeader; // who is my leader
EHANDLE m_hSquadMember[MAX_SQUAD_MEMBERS-1]; // valid only for leader EHANDLE m_hSquadMember[MAX_SQUAD_MEMBERS - 1]; // valid only for leader
int m_afSquadSlots; int m_afSquadSlots;
float m_flLastEnemySightTime; // last time anyone in the squad saw the enemy float m_flLastEnemySightTime; // last time anyone in the squad saw the enemy
BOOL m_fEnemyEluded; BOOL m_fEnemyEluded;
// squad member info // squad member info
int m_iMySlot;// this is the behaviour slot that the monster currently holds in the squad. int m_iMySlot;// this is the behaviour slot that the monster currently holds in the squad.
int CheckEnemy ( CBaseEntity *pEnemy ); int CheckEnemy( CBaseEntity *pEnemy );
void StartMonster ( void ); void StartMonster( void );
void VacateSlot( void ); void VacateSlot( void );
void ScheduleChange( void ); void ScheduleChange( void );
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
@ -74,45 +74,45 @@ public:
BOOL NoFriendlyFire( void ); BOOL NoFriendlyFire( void );
// squad functions still left in base class // squad functions still left in base class
CSquadMonster *MySquadLeader( ) CSquadMonster *MySquadLeader()
{ {
CSquadMonster *pSquadLeader = (CSquadMonster *)((CBaseEntity *)m_hSquadLeader); CSquadMonster *pSquadLeader = (CSquadMonster *)( (CBaseEntity *)m_hSquadLeader );
if (pSquadLeader != NULL) if( pSquadLeader != NULL )
return pSquadLeader; return pSquadLeader;
return this; return this;
} }
CSquadMonster *MySquadMember( int i ) CSquadMonster *MySquadMember( int i )
{ {
if (i >= MAX_SQUAD_MEMBERS-1) if( i >= MAX_SQUAD_MEMBERS - 1 )
return this; return this;
else else
return (CSquadMonster *)((CBaseEntity *)m_hSquadMember[i]); return (CSquadMonster *)( (CBaseEntity *)m_hSquadMember[i] );
} }
int InSquad ( void ) { return m_hSquadLeader != NULL; } int InSquad( void ) { return m_hSquadLeader != NULL; }
int IsLeader ( void ) { return m_hSquadLeader == this; } int IsLeader( void ) { return m_hSquadLeader == this; }
int SquadJoin ( int searchRadius ); int SquadJoin( int searchRadius );
int SquadRecruit ( int searchRadius, int maxMembers ); int SquadRecruit( int searchRadius, int maxMembers );
int SquadCount( void ); int SquadCount( void );
void SquadRemove( CSquadMonster *pRemove ); void SquadRemove( CSquadMonster *pRemove );
void SquadUnlink( void ); void SquadUnlink( void );
BOOL SquadAdd( CSquadMonster *pAdd ); BOOL SquadAdd( CSquadMonster *pAdd );
void SquadDisband( void ); void SquadDisband( void );
void SquadAddConditions ( int iConditions ); void SquadAddConditions( int iConditions );
void SquadMakeEnemy ( CBaseEntity *pEnemy ); void SquadMakeEnemy( CBaseEntity *pEnemy );
void SquadPasteEnemyInfo ( void ); void SquadPasteEnemyInfo( void );
void SquadCopyEnemyInfo ( void ); void SquadCopyEnemyInfo( void );
BOOL SquadEnemySplit ( void ); BOOL SquadEnemySplit( void );
BOOL SquadMemberInRange( const Vector &vecLocation, float flDist ); BOOL SquadMemberInRange( const Vector &vecLocation, float flDist );
virtual CSquadMonster *MySquadMonsterPointer( void ) { return this; } virtual CSquadMonster *MySquadMonsterPointer( void ) { return this; }
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
int Save( CSave &save ); int Save( CSave &save );
int Restore( CRestore &restore ); int Restore( CRestore &restore );
BOOL FValidateCover ( const Vector &vecCoverLocation ); BOOL FValidateCover( const Vector &vecCoverLocation );
MONSTERSTATE GetIdealState ( void ); MONSTERSTATE GetIdealState( void );
Schedule_t *GetScheduleOfType ( int iType ); Schedule_t *GetScheduleOfType( int iType );
}; };

View File

@ -24,14 +24,16 @@
#include "soundent.h" #include "soundent.h"
#include "gamerules.h" #include "gamerules.h"
enum w_squeak_e { enum w_squeak_e
{
WSQUEAK_IDLE1 = 0, WSQUEAK_IDLE1 = 0,
WSQUEAK_FIDGET, WSQUEAK_FIDGET,
WSQUEAK_JUMP, WSQUEAK_JUMP,
WSQUEAK_RUN WSQUEAK_RUN
}; };
enum squeak_e { enum squeak_e
{
SQUEAK_IDLE1 = 0, SQUEAK_IDLE1 = 0,
SQUEAK_FIDGETFIT, SQUEAK_FIDGETFIT,
SQUEAK_FIDGETNIP, SQUEAK_FIDGETNIP,
@ -41,22 +43,21 @@ enum squeak_e {
}; };
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
class CSqueakGrenade : public CGrenade class CSqueakGrenade : public CGrenade
{ {
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
int Classify( void ); int Classify( void );
void EXPORT SuperBounceTouch( CBaseEntity *pOther ); void EXPORT SuperBounceTouch( CBaseEntity *pOther );
void EXPORT HuntThink( void ); void EXPORT HuntThink( void );
int BloodColor( void ) { return BLOOD_COLOR_YELLOW; } int BloodColor( void ) { return BLOOD_COLOR_YELLOW; }
void Killed( entvars_t *pevAttacker, int iGib ); void Killed( entvars_t *pevAttacker, int iGib );
void GibMonster( void ); void GibMonster( void );
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
static float m_flNextBounceSoundTime; static float m_flNextBounceSoundTime;
@ -67,7 +68,7 @@ class CSqueakGrenade : public CGrenade
float m_flNextHit; float m_flNextHit;
Vector m_posPrev; Vector m_posPrev;
EHANDLE m_hOwner; EHANDLE m_hOwner;
int m_iMyClass; int m_iMyClass;
}; };
float CSqueakGrenade::m_flNextBounceSoundTime = 0; float CSqueakGrenade::m_flNextBounceSoundTime = 0;
@ -88,15 +89,15 @@ IMPLEMENT_SAVERESTORE( CSqueakGrenade, CGrenade )
#define SQUEEK_DETONATE_DELAY 15.0 #define SQUEEK_DETONATE_DELAY 15.0
int CSqueakGrenade :: Classify ( void ) int CSqueakGrenade::Classify( void )
{ {
if (m_iMyClass != 0) if( m_iMyClass != 0 )
return m_iMyClass; // protect against recursion return m_iMyClass; // protect against recursion
if (m_hEnemy != NULL) if( m_hEnemy != NULL )
{ {
m_iMyClass = CLASS_INSECT; // no one cares about it m_iMyClass = CLASS_INSECT; // no one cares about it
switch( m_hEnemy->Classify( ) ) switch( m_hEnemy->Classify() )
{ {
case CLASS_PLAYER: case CLASS_PLAYER:
case CLASS_HUMAN_PASSIVE: case CLASS_HUMAN_PASSIVE:
@ -110,16 +111,16 @@ int CSqueakGrenade :: Classify ( void )
return CLASS_ALIEN_BIOWEAPON; return CLASS_ALIEN_BIOWEAPON;
} }
void CSqueakGrenade :: Spawn( void ) void CSqueakGrenade::Spawn( void )
{ {
Precache( ); Precache();
// motor // motor
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
SET_MODEL(ENT(pev), "models/w_squeak.mdl"); SET_MODEL( ENT( pev ), "models/w_squeak.mdl" );
UTIL_SetSize(pev, Vector( -4, -4, 0), Vector(4, 4, 8)); UTIL_SetSize( pev, Vector( -4, -4, 0 ), Vector( 4, 4, 8 ) );
UTIL_SetOrigin( pev, pev->origin ); UTIL_SetOrigin( pev, pev->origin );
SetTouch( &CSqueakGrenade::SuperBounceTouch ); SetTouch( &CSqueakGrenade::SuperBounceTouch );
@ -128,10 +129,10 @@ void CSqueakGrenade :: Spawn( void )
m_flNextHunt = gpGlobals->time + 1E6; m_flNextHunt = gpGlobals->time + 1E6;
pev->flags |= FL_MONSTER; pev->flags |= FL_MONSTER;
pev->takedamage = DAMAGE_AIM; pev->takedamage = DAMAGE_AIM;
pev->health = gSkillData.snarkHealth; pev->health = gSkillData.snarkHealth;
pev->gravity = 0.5; pev->gravity = 0.5;
pev->friction = 0.5; pev->friction = 0.5;
pev->dmg = gSkillData.snarkDmgPop; pev->dmg = gSkillData.snarkDmgPop;
@ -139,28 +140,28 @@ void CSqueakGrenade :: Spawn( void )
m_flFieldOfView = 0; // 180 degrees m_flFieldOfView = 0; // 180 degrees
if ( pev->owner ) if( pev->owner )
m_hOwner = Instance( pev->owner ); m_hOwner = Instance( pev->owner );
m_flNextBounceSoundTime = gpGlobals->time;// reset each time a snark is spawned. m_flNextBounceSoundTime = gpGlobals->time;// reset each time a snark is spawned.
pev->sequence = WSQUEAK_RUN; pev->sequence = WSQUEAK_RUN;
ResetSequenceInfo( ); ResetSequenceInfo();
} }
void CSqueakGrenade::Precache( void ) void CSqueakGrenade::Precache( void )
{ {
PRECACHE_MODEL("models/w_squeak.mdl"); PRECACHE_MODEL( "models/w_squeak.mdl" );
PRECACHE_SOUND("squeek/sqk_blast1.wav"); PRECACHE_SOUND( "squeek/sqk_blast1.wav" );
PRECACHE_SOUND("common/bodysplat.wav"); PRECACHE_SOUND( "common/bodysplat.wav" );
PRECACHE_SOUND("squeek/sqk_die1.wav"); PRECACHE_SOUND( "squeek/sqk_die1.wav" );
PRECACHE_SOUND("squeek/sqk_hunt1.wav"); PRECACHE_SOUND( "squeek/sqk_hunt1.wav" );
PRECACHE_SOUND("squeek/sqk_hunt2.wav"); PRECACHE_SOUND( "squeek/sqk_hunt2.wav" );
PRECACHE_SOUND("squeek/sqk_hunt3.wav"); PRECACHE_SOUND( "squeek/sqk_hunt3.wav" );
PRECACHE_SOUND("squeek/sqk_deploy1.wav"); PRECACHE_SOUND( "squeek/sqk_deploy1.wav" );
} }
void CSqueakGrenade :: Killed( entvars_t *pevAttacker, int iGib ) void CSqueakGrenade::Killed( entvars_t *pevAttacker, int iGib )
{ {
pev->model = iStringNull;// make invisible pev->model = iStringNull;// make invisible
SetThink( &CBaseEntity::SUB_Remove ); SetThink( &CBaseEntity::SUB_Remove );
@ -173,69 +174,69 @@ void CSqueakGrenade :: Killed( entvars_t *pevAttacker, int iGib )
pev->takedamage = DAMAGE_NO; pev->takedamage = DAMAGE_NO;
// play squeek blast // play squeek blast
EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, "squeek/sqk_blast1.wav", 1, 0.5, 0, PITCH_NORM); EMIT_SOUND_DYN( ENT( pev ), CHAN_ITEM, "squeek/sqk_blast1.wav", 1, 0.5, 0, PITCH_NORM );
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, SMALL_EXPLOSION_VOLUME, 3.0 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, SMALL_EXPLOSION_VOLUME, 3.0 );
UTIL_BloodDrips( pev->origin, g_vecZero, BloodColor(), 80 ); UTIL_BloodDrips( pev->origin, g_vecZero, BloodColor(), 80 );
if (m_hOwner != NULL) if( m_hOwner != NULL )
RadiusDamage ( pev, m_hOwner->pev, pev->dmg, CLASS_NONE, DMG_BLAST ); RadiusDamage( pev, m_hOwner->pev, pev->dmg, CLASS_NONE, DMG_BLAST );
else else
RadiusDamage ( pev, pev, pev->dmg, CLASS_NONE, DMG_BLAST ); RadiusDamage( pev, pev, pev->dmg, CLASS_NONE, DMG_BLAST );
// reset owner so death message happens // reset owner so death message happens
if (m_hOwner != NULL) if( m_hOwner != NULL )
pev->owner = m_hOwner->edict(); pev->owner = m_hOwner->edict();
CBaseMonster :: Killed( pevAttacker, GIB_ALWAYS ); CBaseMonster::Killed( pevAttacker, GIB_ALWAYS );
} }
void CSqueakGrenade :: GibMonster( void ) void CSqueakGrenade::GibMonster( void )
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "common/bodysplat.wav", 0.75, ATTN_NORM, 0, 200); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "common/bodysplat.wav", 0.75, ATTN_NORM, 0, 200 );
} }
void CSqueakGrenade::HuntThink( void ) void CSqueakGrenade::HuntThink( void )
{ {
// ALERT( at_console, "think\n" ); // ALERT( at_console, "think\n" );
if (!IsInWorld()) if( !IsInWorld() )
{ {
SetTouch( NULL ); SetTouch( NULL );
UTIL_Remove( this ); UTIL_Remove( this );
return; return;
} }
StudioFrameAdvance( ); StudioFrameAdvance();
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
// explode when ready // explode when ready
if (gpGlobals->time >= m_flDie) if( gpGlobals->time >= m_flDie )
{ {
g_vecAttackDir = pev->velocity.Normalize( ); g_vecAttackDir = pev->velocity.Normalize();
pev->health = -1; pev->health = -1;
Killed( pev, 0 ); Killed( pev, 0 );
return; return;
} }
// float // float
if (pev->waterlevel != 0) if( pev->waterlevel != 0 )
{ {
if (pev->movetype == MOVETYPE_BOUNCE) if( pev->movetype == MOVETYPE_BOUNCE )
{ {
pev->movetype = MOVETYPE_FLY; pev->movetype = MOVETYPE_FLY;
} }
pev->velocity = pev->velocity * 0.9; pev->velocity = pev->velocity * 0.9;
pev->velocity.z += 8.0; pev->velocity.z += 8.0;
} }
else if ( ( pev->movetype = MOVETYPE_FLY ) ) else if( ( pev->movetype = MOVETYPE_FLY ) )
{ {
pev->movetype = MOVETYPE_BOUNCE; pev->movetype = MOVETYPE_BOUNCE;
} }
// return if not time to hunt // return if not time to hunt
if (m_flNextHunt > gpGlobals->time) if( m_flNextHunt > gpGlobals->time )
return; return;
m_flNextHunt = gpGlobals->time + 2.0; m_flNextHunt = gpGlobals->time + 2.0;
@ -246,41 +247,41 @@ void CSqueakGrenade::HuntThink( void )
Vector vecFlat = pev->velocity; Vector vecFlat = pev->velocity;
vecFlat.z = 0; vecFlat.z = 0;
vecFlat = vecFlat.Normalize( ); vecFlat = vecFlat.Normalize();
UTIL_MakeVectors( pev->angles ); UTIL_MakeVectors( pev->angles );
if (m_hEnemy == NULL || !m_hEnemy->IsAlive()) if( m_hEnemy == NULL || !m_hEnemy->IsAlive() )
{ {
// find target, bounce a bit towards it. // find target, bounce a bit towards it.
Look( 512 ); Look( 512 );
m_hEnemy = BestVisibleEnemy( ); m_hEnemy = BestVisibleEnemy();
} }
// squeek if it's about time blow up // squeek if it's about time blow up
if ((m_flDie - gpGlobals->time <= 0.5) && (m_flDie - gpGlobals->time >= 0.3)) if( ( m_flDie - gpGlobals->time <= 0.5 ) && ( m_flDie - gpGlobals->time >= 0.3 ) )
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_die1.wav", 1, ATTN_NORM, 0, 100 + RANDOM_LONG(0,0x3F)); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_die1.wav", 1, ATTN_NORM, 0, 100 + RANDOM_LONG( 0, 0x3F ) );
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, 256, 0.25 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, 256, 0.25 );
} }
// higher pitch as squeeker gets closer to detonation time // higher pitch as squeeker gets closer to detonation time
float flpitch = 155.0 - 60.0 * ((m_flDie - gpGlobals->time) / SQUEEK_DETONATE_DELAY); float flpitch = 155.0 - 60.0 * ( ( m_flDie - gpGlobals->time ) / SQUEEK_DETONATE_DELAY );
if (flpitch < 80) if( flpitch < 80 )
flpitch = 80; flpitch = 80;
if (m_hEnemy != NULL) if( m_hEnemy != NULL )
{ {
if (FVisible( m_hEnemy )) if( FVisible( m_hEnemy ) )
{ {
vecDir = m_hEnemy->EyePosition() - pev->origin; vecDir = m_hEnemy->EyePosition() - pev->origin;
m_vecTarget = vecDir.Normalize( ); m_vecTarget = vecDir.Normalize();
} }
float flVel = pev->velocity.Length(); float flVel = pev->velocity.Length();
float flAdj = 50.0 / (flVel + 10.0); float flAdj = 50.0 / ( flVel + 10.0 );
if (flAdj > 1.2) if( flAdj > 1.2 )
flAdj = 1.2; flAdj = 1.2;
// ALERT( at_console, "think : enemy\n"); // ALERT( at_console, "think : enemy\n");
@ -290,20 +291,20 @@ void CSqueakGrenade::HuntThink( void )
pev->velocity = pev->velocity * flAdj + m_vecTarget * 300; pev->velocity = pev->velocity * flAdj + m_vecTarget * 300;
} }
if (pev->flags & FL_ONGROUND) if( pev->flags & FL_ONGROUND )
{ {
pev->avelocity = Vector( 0, 0, 0 ); pev->avelocity = Vector( 0, 0, 0 );
} }
else else
{ {
if (pev->avelocity == Vector( 0, 0, 0)) if( pev->avelocity == Vector( 0, 0, 0 ) )
{ {
pev->avelocity.x = RANDOM_FLOAT( -100, 100 ); pev->avelocity.x = RANDOM_FLOAT( -100, 100 );
pev->avelocity.z = RANDOM_FLOAT( -100, 100 ); pev->avelocity.z = RANDOM_FLOAT( -100, 100 );
} }
} }
if ((pev->origin - m_posPrev).Length() < 1.0) if( ( pev->origin - m_posPrev ).Length() < 1.0 )
{ {
pev->velocity.x = RANDOM_FLOAT( -100, 100 ); pev->velocity.x = RANDOM_FLOAT( -100, 100 );
pev->velocity.y = RANDOM_FLOAT( -100, 100 ); pev->velocity.y = RANDOM_FLOAT( -100, 100 );
@ -317,12 +318,12 @@ void CSqueakGrenade::HuntThink( void )
void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther ) void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
{ {
float flpitch; float flpitch;
TraceResult tr = UTIL_GetGlobalTrace( ); TraceResult tr = UTIL_GetGlobalTrace();
// don't hit the guy that launched this grenade // don't hit the guy that launched this grenade
if ( pev->owner && pOther->edict() == pev->owner ) if( pev->owner && pOther->edict() == pev->owner )
return; return;
// at least until we've bounced once // at least until we've bounced once
@ -332,26 +333,26 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
pev->angles.z = 0; pev->angles.z = 0;
// avoid bouncing too much // avoid bouncing too much
if (m_flNextHit > gpGlobals->time) if( m_flNextHit > gpGlobals->time )
return; return;
// higher pitch as squeeker gets closer to detonation time // higher pitch as squeeker gets closer to detonation time
flpitch = 155.0 - 60.0 * ((m_flDie - gpGlobals->time) / SQUEEK_DETONATE_DELAY); flpitch = 155.0 - 60.0 * ( ( m_flDie - gpGlobals->time ) / SQUEEK_DETONATE_DELAY );
if ( pOther->pev->takedamage && m_flNextAttack < gpGlobals->time ) if( pOther->pev->takedamage && m_flNextAttack < gpGlobals->time )
{ {
// attack! // attack!
// make sure it's me who has touched them // make sure it's me who has touched them
if (tr.pHit == pOther->edict()) if( tr.pHit == pOther->edict() )
{ {
// and it's not another squeakgrenade // and it's not another squeakgrenade
if (tr.pHit->v.modelindex != pev->modelindex) if( tr.pHit->v.modelindex != pev->modelindex )
{ {
// ALERT( at_console, "hit enemy\n"); // ALERT( at_console, "hit enemy\n" );
ClearMultiDamage( ); ClearMultiDamage( );
pOther->TraceAttack(pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH ); pOther->TraceAttack( pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH );
if (m_hOwner != NULL) if( m_hOwner != NULL )
ApplyMultiDamage( pev, m_hOwner->pev ); ApplyMultiDamage( pev, m_hOwner->pev );
else else
ApplyMultiDamage( pev, pev ); ApplyMultiDamage( pev, pev );
@ -360,46 +361,46 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
// m_flDie += 2.0; // add more life // m_flDie += 2.0; // add more life
// make bite sound // make bite sound
EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "squeek/sqk_deploy1.wav", 1.0, ATTN_NORM, 0, (int)flpitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "squeek/sqk_deploy1.wav", 1.0, ATTN_NORM, 0, (int)flpitch );
m_flNextAttack = gpGlobals->time + 0.5; m_flNextAttack = gpGlobals->time + 0.5;
} }
} }
else else
{ {
// ALERT( at_console, "been hit\n"); // ALERT( at_console, "been hit\n" );
} }
} }
m_flNextHit = gpGlobals->time + 0.1; m_flNextHit = gpGlobals->time + 0.1;
m_flNextHunt = gpGlobals->time; m_flNextHunt = gpGlobals->time;
if ( g_pGameRules->IsMultiplayer() ) if( g_pGameRules->IsMultiplayer() )
{ {
// in multiplayer, we limit how often snarks can make their bounce sounds to prevent overflows. // in multiplayer, we limit how often snarks can make their bounce sounds to prevent overflows.
if ( gpGlobals->time < m_flNextBounceSoundTime ) if( gpGlobals->time < m_flNextBounceSoundTime )
{ {
// too soon! // too soon!
return; return;
} }
} }
if (!(pev->flags & FL_ONGROUND)) if( !( pev->flags & FL_ONGROUND ) )
{ {
// play bounce sound // play bounce sound
float flRndSound = RANDOM_FLOAT ( 0 , 1 ); float flRndSound = RANDOM_FLOAT( 0, 1 );
if ( flRndSound <= 0.33 ) if( flRndSound <= 0.33 )
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt1.wav", 1, ATTN_NORM, 0, (int)flpitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt1.wav", 1, ATTN_NORM, 0, (int)flpitch );
else if (flRndSound <= 0.66) else if( flRndSound <= 0.66 )
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, (int)flpitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, (int)flpitch );
else else
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, (int)flpitch); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, (int)flpitch );
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, 256, 0.25 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, 256, 0.25 );
} }
else else
{ {
// skittering sound // skittering sound
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, 100, 0.1 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, 100, 0.1 );
} }
m_flNextBounceSoundTime = gpGlobals->time + 0.5;// half second. m_flNextBounceSoundTime = gpGlobals->time + 0.5;// half second.
@ -408,16 +409,16 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
LINK_ENTITY_TO_CLASS( weapon_snark, CSqueak ) LINK_ENTITY_TO_CLASS( weapon_snark, CSqueak )
void CSqueak::Spawn( ) void CSqueak::Spawn()
{ {
Precache( ); Precache();
m_iId = WEAPON_SNARK; m_iId = WEAPON_SNARK;
SET_MODEL(ENT(pev), "models/w_sqknest.mdl"); SET_MODEL( ENT( pev ), "models/w_sqknest.mdl" );
FallInit();//get ready to fall down. FallInit();//get ready to fall down.
m_iDefaultAmmo = SNARK_DEFAULT_GIVE; m_iDefaultAmmo = SNARK_DEFAULT_GIVE;
pev->sequence = 1; pev->sequence = 1;
pev->animtime = gpGlobals->time; pev->animtime = gpGlobals->time;
pev->framerate = 1.0; pev->framerate = 1.0;
@ -425,19 +426,19 @@ void CSqueak::Spawn( )
void CSqueak::Precache( void ) void CSqueak::Precache( void )
{ {
PRECACHE_MODEL("models/w_sqknest.mdl"); PRECACHE_MODEL( "models/w_sqknest.mdl" );
PRECACHE_MODEL("models/v_squeak.mdl"); PRECACHE_MODEL( "models/v_squeak.mdl" );
PRECACHE_MODEL("models/p_squeak.mdl"); PRECACHE_MODEL( "models/p_squeak.mdl" );
PRECACHE_SOUND("squeek/sqk_hunt2.wav"); PRECACHE_SOUND( "squeek/sqk_hunt2.wav" );
PRECACHE_SOUND("squeek/sqk_hunt3.wav"); PRECACHE_SOUND( "squeek/sqk_hunt3.wav" );
UTIL_PrecacheOther("monster_snark"); UTIL_PrecacheOther( "monster_snark" );
m_usSnarkFire = PRECACHE_EVENT ( 1, "events/snarkfire.sc" ); m_usSnarkFire = PRECACHE_EVENT( 1, "events/snarkfire.sc" );
} }
int CSqueak::GetItemInfo(ItemInfo *p) int CSqueak::GetItemInfo( ItemInfo *p )
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Snarks"; p->pszAmmo1 = "Snarks";
p->iMaxAmmo1 = SNARK_MAX_CARRY; p->iMaxAmmo1 = SNARK_MAX_CARRY;
p->pszAmmo2 = NULL; p->pszAmmo2 = NULL;
@ -452,15 +453,15 @@ int CSqueak::GetItemInfo(ItemInfo *p)
return 1; return 1;
} }
BOOL CSqueak::Deploy( ) BOOL CSqueak::Deploy()
{ {
// play hunt sound // play hunt sound
float flRndSound = RANDOM_FLOAT ( 0 , 1 ); float flRndSound = RANDOM_FLOAT( 0, 1 );
if ( flRndSound <= 0.5 ) if( flRndSound <= 0.5 )
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 100); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 100 );
else else
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 100); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 100 );
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
@ -470,22 +471,22 @@ BOOL CSqueak::Deploy( )
void CSqueak::Holster( int skiplocal /* = 0 */ ) void CSqueak::Holster( int skiplocal /* = 0 */ )
{ {
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
if ( !m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
m_pPlayer->pev->weapons &= ~(1<<WEAPON_SNARK); m_pPlayer->pev->weapons &= ~( 1 << WEAPON_SNARK );
SetThink( &CBasePlayerItem::DestroyItem ); SetThink( &CBasePlayerItem::DestroyItem );
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
return; return;
} }
SendWeaponAnim( SQUEAK_DOWN ); SendWeaponAnim( SQUEAK_DOWN );
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM); EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
} }
void CSqueak::PrimaryAttack() void CSqueak::PrimaryAttack()
{ {
if ( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{ {
UTIL_MakeVectors( m_pPlayer->pev->v_angle ); UTIL_MakeVectors( m_pPlayer->pev->v_angle );
TraceResult tr; TraceResult tr;
@ -494,7 +495,7 @@ void CSqueak::PrimaryAttack()
// HACK HACK: Ugly hacks to handle change in origin based on new physics code for players // HACK HACK: Ugly hacks to handle change in origin based on new physics code for players
// Move origin up if crouched and start trace a bit outside of body ( 20 units instead of 16 ) // Move origin up if crouched and start trace a bit outside of body ( 20 units instead of 16 )
trace_origin = m_pPlayer->pev->origin; trace_origin = m_pPlayer->pev->origin;
if ( m_pPlayer->pev->flags & FL_DUCKING ) if( m_pPlayer->pev->flags & FL_DUCKING )
{ {
trace_origin = trace_origin - ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN ); trace_origin = trace_origin - ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN );
} }
@ -502,15 +503,15 @@ void CSqueak::PrimaryAttack()
// find place to toss monster // find place to toss monster
UTIL_TraceLine( trace_origin + gpGlobals->v_forward * 20, trace_origin + gpGlobals->v_forward * 64, dont_ignore_monsters, NULL, &tr ); UTIL_TraceLine( trace_origin + gpGlobals->v_forward * 20, trace_origin + gpGlobals->v_forward * 64, dont_ignore_monsters, NULL, &tr );
int flags; int flags;
#ifdef CLIENT_WEAPONS #ifdef CLIENT_WEAPONS
flags = FEV_NOTHOST; flags = FEV_NOTHOST;
#else #else
flags = 0; flags = 0;
#endif #endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 );
if ( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0.25 ) if( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0.25 )
{ {
// player "shoot" animation // player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
@ -519,12 +520,12 @@ void CSqueak::PrimaryAttack()
pSqueak->pev->velocity = gpGlobals->v_forward * 200 + m_pPlayer->pev->velocity; pSqueak->pev->velocity = gpGlobals->v_forward * 200 + m_pPlayer->pev->velocity;
#endif #endif
// play hunt sound // play hunt sound
float flRndSound = RANDOM_FLOAT ( 0 , 1 ); float flRndSound = RANDOM_FLOAT( 0, 1 );
if ( flRndSound <= 0.5 ) if( flRndSound <= 0.5 )
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 105); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 105 );
else else
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 105); EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 105 );
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
@ -545,14 +546,14 @@ void CSqueak::SecondaryAttack( void )
void CSqueak::WeaponIdle( void ) void CSqueak::WeaponIdle( void )
{ {
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return; return;
if (m_fJustThrown) if( m_fJustThrown )
{ {
m_fJustThrown = 0; m_fJustThrown = 0;
if ( !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) if( !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] )
{ {
RetireWeapon(); RetireWeapon();
return; return;
@ -565,12 +566,12 @@ void CSqueak::WeaponIdle( void )
int iAnim; int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.75) if( flRand <= 0.75 )
{ {
iAnim = SQUEAK_IDLE1; iAnim = SQUEAK_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 30.0 / 16 * (2); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 30.0 / 16 * (2);
} }
else if (flRand <= 0.875) else if( flRand <= 0.875 )
{ {
iAnim = SQUEAK_FIDGETFIT; iAnim = SQUEAK_FIDGETFIT;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 70.0 / 16.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 70.0 / 16.0;

Some files were not shown because too many files have changed in this diff Show More