1
0
KF2-Dev-Scripts/KFGame/Classes/KFGameplayPoolManager.uc
2020-12-13 18:01:13 +03:00

103 lines
2.9 KiB
Ucode

//=============================================================================
// KFGameplayPoolManager
//=============================================================================
// Manages pools for puke mines, c4, etc... Unlike most pools this
// is managed server-side, typically for replicated actors.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2016 Tripwire Interactive LLC
// - Matt 'Squirrlz' Farber
//=============================================================================
class KFGameplayPoolManager extends Actor;
enum eProjectilePoolType
{
PPT_C4,
PPT_PukeMine
};
/** The maximum global number of C4 that can be active in play */
var protected const byte MAX_ACTIVE_C4;
/** The maximum global number of puke mines that can be active in play */
var protected const byte MAX_ACTIVE_PUKE_MINES;
/** C4 spawned by players */
var transient protected array<KFProjectile> ActiveC4;
/** Puke mines spawned by players */
var transient protected array<KFProjectile> ActivePukeMines;
/** Returns instance to the pool manager */
static function KFGameplayPoolManager GetPoolManager()
{
return KFGameplayPoolManager( class'WorldInfo'.static.GetWorldInfo().MyGameplayPoolManager );
}
/** Determines the pool type and adds a new projectile to that pool */
function AddProjectileToPool( KFProjectile Proj, eProjectilePoolType PoolType )
{
switch( PoolType )
{
case PPT_C4:
AddProjectileToPool_Internal( ActiveC4, Proj, MAX_ACTIVE_C4 );
break;
case PPT_PukeMine:
AddProjectileToPool_Internal( ActivePukeMines, Proj, MAX_ACTIVE_PUKE_MINES );
break;
}
}
/** Determines the pool type and removes a projectile from the pool */
function RemoveProjectileFromPool( KFProjectile Proj, eProjectilePoolType PoolType )
{
switch( PoolType )
{
case PPT_C4:
RemoveProjectileFromPool_Internal( ActiveC4, Proj );
break;
case PPT_PukeMine:
RemoveProjectileFromPool_Internal( ActivePukeMines, Proj );
break;
}
}
/** Add a projectile to its respective pool, removing the oldest if we are at the pool limit */
private function AddProjectileToPool_Internal( out array<KFProjectile> PoolProjectiles, KFProjectile Proj, byte MaxActiveProjectiles )
{
if( PoolProjectiles.Length == MaxActiveProjectiles )
{
if( PoolProjectiles[0] != none )
{
PoolProjectiles[0].Detonate();
}
PoolProjectiles.Remove( 0, 1 );
}
PoolProjectiles.AddItem( Proj );
}
/** Remove a projectile from the pool (it's been destroyed) */
private function RemoveProjectileFromPool_Internal( out array<KFProjectile> PoolProjectiles, KFProjectile Proj )
{
PoolProjectiles.RemoveItem( Proj );
}
/** Clears the pool arrays */
event Reset()
{
ActivePukeMines.Length = 0;
ActiveC4.Length = 0;
}
defaultproperties
{
bTickIsDisabled=true
Physics=PHYS_None
RemoteRole=ROLE_None
MAX_ACTIVE_C4=24
MAX_ACTIVE_PUKE_MINES=24
}