rott/kf_sources/Engine/Classes/xEmitter.uc
2026-07-14 20:27:09 +07:00

295 lines
7.6 KiB
Ucode

//=============================================================================
// xEmitter - particle emission! renamed to avoid conflict with Emitter
// Copyright 2001 Digital Extremes - All Rights Reserved.
// Confidential.
//=============================================================================
class xEmitter extends Actor native placeable;
#exec Texture Import File=Textures\S_Emitter.tga Name=S_Emitter Mips=Off
replication
{
unreliable if (Role == ROLE_Authority)
mSpawnVecA, blockOnNet;
}
// particle system config...
var(PclEmitter) enum ExParticleTypes
{
PT_Sprite,
PT_Stream,
PT_Line,
PT_Disc,
PT_Mesh,
PT_Branch,
PT_Beam,
} mParticleType;
// particle system config...
var(PclEmitter) enum ExSpawningTypes
{
ST_Sphere,
ST_Line,
ST_Disc,
ST_Cylinder,
ST_AimedSphere,
ST_StaticMesh,
ST_Explode,
ST_ExplodeRing,
ST_OwnerSkeleton,
ST_Test,
} mSpawningType;
var(PclEmitter) bool mRegen;
var(PclEmitter) bool mRegenPause;
var(PclEmitter) float mRegenOnTime[2];
var(PclEmitter) float mRegenOffTime[2];
var(PclEmitter) int mStartParticles; // at runtime also, you can set this > 0 to spawn this many next tick
var(PclEmitter) private int mMaxParticles;
var(PclEmitter) float mDelayRange[2];
var(PclEmitter) float mLifeRange[2];
var(PclEmitter) float mRegenRange[2];
var(PclEmitter) float mRegenDist;
var(PclEmitter) Name mSourceActor;
var(PclEmitter) Name mChildName;
var xEmitter mChildEmitter;
var(PclEmitter) StaticMeshActor SourceStaticMesh;
var(PclEmitter) bool bSuspendWhenNotVisible;
var(PclVisuals) bool mDistanceAtten;
var(PclMovement) vector mDirDev;
var(PclMovement) vector mPosDev;
var(PclMovement) vector mSpawnVecA;
var(PclMovement) vector mSpawnVecB;
var(PclMovement) float mSpeedRange[2];
var(PclMovement) bool mPosRelative;
var(PclMovement) float mMassRange[2];
var(PclMovement) float mAirResistance;
var(PclMovement) bool mCollision;
var(PclMovement) float mOwnerVelocityFactor;
var(PclVisuals) bool mRandOrient;
var(PclMovement) float mSpinRange[2];
var(PclVisuals) float mSizeRange[2];
var(PclVisuals) float mGrowthRate;
var(PclVisuals) color mColorRange[2];
// attenuation
var(PclVisuals) bool mAttenuate;
var(PclVisuals) float mAttenKa;
var(PclVisuals) float mAttenKb;
var(PclVisuals) enum EAttenFunc
{
ATF_LerpInOut,
ATF_ExpInOut,
ATF_SmoothStep,
ATF_Pulse,
ATF_Random,
ATF_None,
} mAttenFunc;
var int mpAttenFunc;
var(PclVisuals) bool mRandTextures; // choose a random texture for each instance of this emitter
var(PclVisuals) bool mTileAnimation; // animate the particle from the set of tiles throughout life
var(PclVisuals) int mNumTileColumns;
var(PclVisuals) int mNumTileRows;
var(PclVisuals) bool mUseMeshNodes;
var(PclVisuals) bool mRandMeshes;
var(PclVisuals) StaticMesh mMeshNodes[8]; // if using meshes as particle nodes
var(PclVisuals) Texture mPosColorMapXY;
var(PclVisuals) Texture mPosColorMapXZ;
var(PclVisuals) Texture mLifeColorMap;
var(PclSoftBody) float springK;
var(PclSoftBody) float springD;
var(PclSoftBody) float springMaxStretch;
var(PclSoftBody) float springMaxCompress;
// ver 1.1
var(PclMovement) float mColElasticity; // bounciness of particle collision 0-1
var(PclMovement) float mAttraction; // attractive force between particles
var(PclMovement) bool mColMakeSound;
var(pclBeam) float mWaveFrequency;
var(pclBeam) float mWaveAmplitude;
var(pclBeam) float mWaveShift;
var(pclBeam) float mBendStrength;
var(pclBeam) bool mWaveLockEnd;
var(Force) bool bForceAffected;
// native stuff.
var transient int SystemHandle;
var transient int Expire;
var transient pointer mpParticles; // ptr to tarray
var transient int mNumActivePcl;
var transient pointer mpIterator;
var transient int mbSpinningNodes;
var transient vector mLastPos;
var transient vector mLastVector;
var transient float mTime;
var transient float mT; // delta
var transient float mRegenBias;
var transient float mRegenTimer;
var transient float mPauseTimer;
var transient Box mBounds;
var transient plane mSphere;
var transient vector mDir;
var transient int mNumUpdates;
var transient int mAtLeastOneFrame;
var transient int mRenderableVerts;
var transient float mTexU;
var transient float mTexV;
var transient float mTotalTiles;
var transient float mInvTileCols;
var transient pointer mpSprings; // ptr to Spring class
var transient int mNumSprings;
var transient float mWavePhaseA;
var transient float mWavePhaseB;
var bool blockOnNet;
var bool bCallPreSpawn;
// v 1.4
var transient int mHeadIndex;
event CollisionSound(); //amb
event PreSpawned()
{
if ( !Level.bStartup )
{
bSuspendWhenNotVisible = false;
if ( Level.bDropDetail && (mMaxParticles > 5)
&& ((mParticleType == PT_Sprite) || (mParticleType == PT_Mesh) || (mParticleType == PT_Line)) )
{
mMaxParticles = mMaxParticles * 0.65;
mRegenRange[0] *= 0.8;
mRegenRange[1] *= 0.8;
mStartParticles = 0.65 * mStartParticles;
}
}
}
simulated final function float ClampToMaxParticles(float InPart)
{
return FMin(InPart, mStartParticles);
}
event Trigger( Actor Other, Pawn EventInstigator )
{
mRegenPause = !mRegenPause;
}
simulated function UpdatePrecacheMaterials()
{
if ( mPosColorMapXY != None )
Level.AddPrecacheMaterial(mPosColorMapXY);
if ( mPosColorMapXZ != None )
Level.AddPrecacheMaterial(mPosColorMapXZ);
if ( mLifeColorMap != None )
Level.AddPrecacheMaterial(mLifeColorMap);
super.UpdatePrecacheMaterials();
}
static function PrecacheContent(LevelInfo Level)
{
if ( Default.mPosColorMapXY != None )
Level.AddPrecacheMaterial(Default.mPosColorMapXY);
if ( Default.mPosColorMapXZ != None )
Level.AddPrecacheMaterial(Default.mPosColorMapXZ);
if ( Default.mLifeColorMap != None )
Level.AddPrecacheMaterial(Default.mLifeColorMap);
if ( Default.Skins.Length > 0 )
Level.AddPrecacheMaterial(Default.Skins[0]);
}
defaultproperties
{
mParticleType=PT_Sprite
mSpawningType=ST_Sphere
mRegen=true
mRegenPause=false
mStartParticles=1
mMaxParticles=50
mDelayRange(0)=0.0
mDelayRange(1)=0.0
mLifeRange(0)=4.000000
mLifeRange(1)=4.000000
mRegenRange(0)=1.00000
mRegenRange(1)=1.00000
mRegenDist=0.0
mDirDev=(X=0.0,Y=0.0,Z=0.0)
mPosDev=(X=0.0,Y=0.0,Z=0.0)
mMassRange(0)=0.0
mMassRange(1)=0.0
mCollision=false
mRandOrient=false
mSpinRange(0)=0.0
mSpinRange(1)=0.0
mSizeRange(0)=10.00000
mSizeRange(1)=10.00000
mSpeedRange(0)=40.00000
mSpeedRange(1)=40.00000
mOwnerVelocityFactor=0.0
mGrowthRate=0.0
mColorRange(0)=(R=255,G=255,B=255,A=255)
mColorRange(1)=(R=255,G=255,B=255,A=255)
mAttenuate=true
mRandTextures=false
mTileAnimation=false
mNumTileColumns=1
mNumTileRows=1
mUseMeshNodes=false
mPosRelative=false
//mRandMeshes=
Texture=S_Emitter
Skins(0)=S_Emitter
bHiddenEd=false
bDirectional=true
SystemHandle=-1
// inherited vars
DrawType=DT_Particle
Style=STY_Normal
Physics=PHYS_None
bUnlit=true
bNetTemporary=true
bGameRelevant=true
RemoteRole=ROLE_None
CollisionRadius=+0.00000
CollisionHeight=+0.00000
ScaleGlow=1.0
// ver 1.1
mColElasticity=0.5
// ver 1.2
mAttenKa=0.2
mAttenKb=1.0
mAttenFunc=ATF_LerpInOut
mAirResistance=0.4
bCollideActors=false
bCallPreSpawn=true
bAcceptsProjectors=false
mSpawnVecB=(X=0.0,Y=0.0,Z=0.05)
bActorShadows=false
bForceAffected=false
LightEffect=LE_QuadraticNonIncidence
bNetInitialRotation=false
bSuspendWhenNotVisible=true
bNotOnDedServer=true
}