Browse Source

Add env_warpball implementation.

decay-pc
Night Owl 7 years ago
parent
commit
ac1f6d0f6e
  1. 48
      dlls/monstermaker.cpp

48
dlls/monstermaker.cpp

@ -27,6 +27,7 @@
#define SF_MONSTERMAKER_START_ON 1 // start active ( if has targetname ) #define SF_MONSTERMAKER_START_ON 1 // start active ( if has targetname )
#define SF_MONSTERMAKER_CYCLIC 4 // drop one monster every time fired. #define SF_MONSTERMAKER_CYCLIC 4 // drop one monster every time fired.
#define SF_MONSTERMAKER_MONSTERCLIP 8 // Children are blocked by monsterclip #define SF_MONSTERMAKER_MONSTERCLIP 8 // Children are blocked by monsterclip
#define SF_MONSTERMAKER_WARPBALL 16
//========================================================= //=========================================================
// MonsterMaker - this ent creates monsters during the game. // MonsterMaker - this ent creates monsters during the game.
@ -49,29 +50,36 @@ public:
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.
string_t m_iszWarpTarget;
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.
int m_iMonsterSpawnFlags;
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
BOOL m_fActive; BOOL m_fActive;
BOOL m_fFadeChildren;// should we make the children fadeout? BOOL m_fFadeChildren;// should we make the children fadeout?
BOOL m_fWarpball;
}; };
LINK_ENTITY_TO_CLASS( monstermaker, CMonsterMaker ) LINK_ENTITY_TO_CLASS( monstermaker, CMonsterMaker )
LINK_ENTITY_TO_CLASS( env_warpball, CMonsterMaker )
TYPEDESCRIPTION CMonsterMaker::m_SaveData[] = TYPEDESCRIPTION CMonsterMaker::m_SaveData[] =
{ {
DEFINE_FIELD( CMonsterMaker, m_iszMonsterClassname, FIELD_STRING ), DEFINE_FIELD( CMonsterMaker, m_iszMonsterClassname, FIELD_STRING ),
DEFINE_FIELD( CMonsterMaker, m_iszWarpTarget, FIELD_STRING ),
DEFINE_FIELD( CMonsterMaker, m_cNumMonsters, FIELD_INTEGER ), DEFINE_FIELD( CMonsterMaker, m_cNumMonsters, FIELD_INTEGER ),
DEFINE_FIELD( CMonsterMaker, m_cLiveChildren, FIELD_INTEGER ), DEFINE_FIELD( CMonsterMaker, m_cLiveChildren, FIELD_INTEGER ),
DEFINE_FIELD( CMonsterMaker, m_flGround, FIELD_FLOAT ), DEFINE_FIELD( CMonsterMaker, m_flGround, FIELD_FLOAT ),
DEFINE_FIELD( CMonsterMaker, m_iMaxLiveChildren, FIELD_INTEGER ), DEFINE_FIELD( CMonsterMaker, m_iMaxLiveChildren, FIELD_INTEGER ),
DEFINE_FIELD( CMonsterMaker, m_iMonsterSpawnFlags, FIELD_INTEGER ),
DEFINE_FIELD( CMonsterMaker, m_fActive, FIELD_BOOLEAN ), DEFINE_FIELD( CMonsterMaker, m_fActive, FIELD_BOOLEAN ),
DEFINE_FIELD( CMonsterMaker, m_fFadeChildren, FIELD_BOOLEAN ), DEFINE_FIELD( CMonsterMaker, m_fFadeChildren, FIELD_BOOLEAN ),
DEFINE_FIELD( CMonsterMaker, m_fWarpball, FIELD_BOOLEAN ),
}; };
IMPLEMENT_SAVERESTORE( CMonsterMaker, CBaseMonster ) IMPLEMENT_SAVERESTORE( CMonsterMaker, CBaseMonster )
@ -83,16 +91,29 @@ void CMonsterMaker::KeyValue( KeyValueData *pkvd )
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" )
|| FStrEq( pkvd->szKeyName, "maxlivechildren" ) )
{ {
m_iMaxLiveChildren = atoi( pkvd->szValue ); m_iMaxLiveChildren = atoi( pkvd->szValue );
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if( FStrEq( pkvd->szKeyName, "warptarget" )
|| FStrEq( pkvd->szKeyName, "makertarget" )
|| FStrEq( pkvd->szKeyName, "warp_target" ) )
{
m_iszWarpTarget = ALLOC_STRING( pkvd->szValue );
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;
} }
else if( FStrEq( pkvd->szKeyName, "monsterspawnflags" ) )
{
m_iMonsterSpawnFlags = atoi( pkvd->szValue );
pkvd->fHandled = TRUE;
}
else else
CBaseMonster::KeyValue( pkvd ); CBaseMonster::KeyValue( pkvd );
} }
@ -101,8 +122,14 @@ void CMonsterMaker::Spawn()
{ {
pev->solid = SOLID_NOT; pev->solid = SOLID_NOT;
m_fWarpball = FClassnameIs( pev, "env_warpball" );
m_cLiveChildren = 0; m_cLiveChildren = 0;
Precache(); Precache();
if( m_fWarpball && FBitSet( pev->spawnflags, SF_MONSTERMAKER_START_ON ) )
pev->spawnflags |= SF_MONSTERMAKER_WARPBALL;
if( !FStringNull( pev->targetname ) ) if( !FStringNull( pev->targetname ) )
{ {
if( pev->spawnflags & SF_MONSTERMAKER_CYCLIC ) if( pev->spawnflags & SF_MONSTERMAKER_CYCLIC )
@ -114,7 +141,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( !m_fWarpball && 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;
@ -151,7 +178,15 @@ void CMonsterMaker::Precache( void )
{ {
CBaseMonster::Precache(); CBaseMonster::Precache();
UTIL_PrecacheOther( STRING( m_iszMonsterClassname ) ); if( m_fWarpball )
{
m_flDelay = 5.0f;
UTIL_PrecacheOther( "effect_warpball" );
}
if( FStringNull( m_iszMonsterClassname ) )
ALERT( at_console, "CMonsterMaker without a children name!\n" );
else
UTIL_PrecacheOther( STRING( m_iszMonsterClassname ) );
} }
//========================================================= //=========================================================
@ -194,7 +229,7 @@ void CMonsterMaker::MakeMonster( void )
if( FNullEnt( pent ) ) if( FNullEnt( pent ) )
{ {
ALERT ( at_console, "NULL Ent in MonsterMaker!\n" ); ALERT( at_console, "NULL Ent in MonsterMaker!\n" );
return; return;
} }
@ -232,6 +267,11 @@ void CMonsterMaker::MakeMonster( void )
SetThink( NULL ); SetThink( NULL );
SetUse( NULL ); SetUse( NULL );
} }
if( !FBitSet( pev->spawnflags, SF_MONSTERMAKER_CYCLIC ) && FBitSet( pev->spawnflags, SF_MONSTERMAKER_WARPBALL ) )
{
UTIL_Remove( this );
}
} }
//========================================================= //=========================================================

Loading…
Cancel
Save