199 lines
5.6 KiB
Ucode
199 lines
5.6 KiB
Ucode
|
//=============================================================================
|
||
|
// WorldAttractor.
|
||
|
//
|
||
|
// WorldAttractor is a placeable generic attractor.
|
||
|
//
|
||
|
// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
||
|
//=============================================================================
|
||
|
class WorldAttractor extends Actor
|
||
|
native(Physics)
|
||
|
hidecategories(Lighting,LightColor,Force)
|
||
|
placeable;
|
||
|
|
||
|
/**
|
||
|
* TRUE if this attractor has any effect.
|
||
|
*/
|
||
|
var() bool bEnabled;
|
||
|
|
||
|
/**
|
||
|
* The duration in seconds to loop over the values in the distributions below.
|
||
|
*/
|
||
|
var() float LoopDuration;
|
||
|
|
||
|
/**
|
||
|
* The current time through the loop.
|
||
|
*/
|
||
|
var float CurrentTime;
|
||
|
|
||
|
/**
|
||
|
* Falloff type enumeration.
|
||
|
*/
|
||
|
enum EWorldAttractorFalloffType
|
||
|
{
|
||
|
FOFF_Constant,
|
||
|
FOFF_Linear,
|
||
|
FOFF_Exponent
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Type of falloff.
|
||
|
*
|
||
|
* FOFF_Constant - Falloff is constant so just use the strength for the whole range.
|
||
|
* FOFF_Linear - Linear falloff over the range.
|
||
|
* FOFF_ExponentExponential falloff over the range.
|
||
|
*/
|
||
|
var() EWorldAttractorFalloffType FalloffType;
|
||
|
|
||
|
/**
|
||
|
* Optional falloff exponent for FOFF_Exponent type.
|
||
|
*/
|
||
|
var() interp matineerawdistributionfloat FalloffExponent;
|
||
|
|
||
|
/**
|
||
|
* Range of the attractor.
|
||
|
*/
|
||
|
var() interp matineerawdistributionfloat Range;
|
||
|
|
||
|
/**
|
||
|
* Strength of the attraction over time.
|
||
|
*/
|
||
|
var() interp matineerawdistributionfloat Strength;
|
||
|
|
||
|
/**
|
||
|
* Radius bounding the attraction point for use with collisions.
|
||
|
*/
|
||
|
var() interp float CollisionRadius;
|
||
|
|
||
|
/**
|
||
|
* Drag coefficient, a value of 1.0f means no drag, a value > 1.0f means accelerate.
|
||
|
* This value is multiplied with the DragCoefficient value in the attractor to get the
|
||
|
* resultant drag coefficient and generate the drag force.
|
||
|
*/
|
||
|
var() interp matineerawdistributionfloat DragCoefficient;
|
||
|
|
||
|
/**
|
||
|
* Apply the drag when the particle is within this radius.
|
||
|
*/
|
||
|
var() interp matineerawdistributionfloat DragRadius;
|
||
|
|
||
|
struct native WorldAttractorData
|
||
|
{
|
||
|
var bool bEnabled;
|
||
|
var vector Location;
|
||
|
var EWorldAttractorFalloffType FalloffType;
|
||
|
var float FalloffExponent;
|
||
|
var float Range;
|
||
|
var float Strength;
|
||
|
};
|
||
|
|
||
|
cpptext
|
||
|
{
|
||
|
/**
|
||
|
* Override these to manage the list of AWorldAttractor instances. These will call either RegisterAttractor or
|
||
|
* UnregisterAttractor as necessary and then call the base class implementation.
|
||
|
*/
|
||
|
virtual void Spawned();
|
||
|
virtual void PostLoad();
|
||
|
/** ticks the actor
|
||
|
* @return TRUE if the actor was ticked, FALSE if it was aborted (e.g. because it's in stasis)
|
||
|
*/
|
||
|
virtual UBOOL Tick( FLOAT DeltaTime, enum ELevelTick TickType );
|
||
|
virtual void BeginDestroy();
|
||
|
virtual void Serialize(FArchive& Ar);
|
||
|
void SetZone( UBOOL bTest, UBOOL bForceRefresh );
|
||
|
|
||
|
/**
|
||
|
* Get the attraction data at the provided time.
|
||
|
* @param Time This is time relative to whatever the calling function desires (particle life, emitter life, matinee start, etc.)
|
||
|
* @param Data Returned data for the given time.
|
||
|
*/
|
||
|
void GetAttractorDataAtTime(const FLOAT Time, FWorldAttractorData& Data);
|
||
|
|
||
|
/**
|
||
|
* Generate the attraction velocity to add to an actor's current velocity.
|
||
|
* @param CurrentLocation The location of the actor at the start of this tick.
|
||
|
* @param CurrentTime This is time relative to whatever the calling function desires (particle life, emitter life, matinee start, etc.)
|
||
|
* @param DeltaTime This is the time since the last update call.
|
||
|
* @param ParticleBoundingRadius Used to calculate drag.
|
||
|
* @returns The velocity to add to the actor's current velocity.
|
||
|
*/
|
||
|
FVector GetVelocityForAttraction(const FVector CurrentLocation, const FLOAT CurrentTime, const FLOAT DeltaTime, const FLOAT ParticleBoundingRadius = 0.0f);
|
||
|
|
||
|
/**
|
||
|
* Tests for a collision and if there is a collision the actions in the array are executed on the particle.
|
||
|
* @param ParticleEmitter The particle emitter that owns the particle to test.
|
||
|
* @param ParticleIndex Used to look up the particle in the emitter instance.
|
||
|
* @returns TRUE if the particle was affected by one of the actions.
|
||
|
*/
|
||
|
UBOOL HandleParticleCollision(FParticleEmitterInstance* ParticleEmitter, INT ParticleIndex);
|
||
|
}
|
||
|
|
||
|
function OnSetWorldAttractorParam(SeqAct_SetWorldAttractorParam Action)
|
||
|
{
|
||
|
if(Action.bEnabledField)
|
||
|
{
|
||
|
bEnabled = Action.bEnabled;
|
||
|
}
|
||
|
if(Action.bFalloffTypeField)
|
||
|
{
|
||
|
FalloffType = Action.FalloffType;
|
||
|
}
|
||
|
if(Action.bRangeField)
|
||
|
{
|
||
|
Range = Action.Range;
|
||
|
}
|
||
|
if(Action.bStrengthField)
|
||
|
{
|
||
|
Strength = Action.Strength;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
Begin Object Class=SpriteComponent Name=Sprite
|
||
|
Sprite=Texture2D'EditorResources.S_Pickup'
|
||
|
HiddenGame=true
|
||
|
HiddenEditor=false
|
||
|
AlwaysLoadOnClient=False
|
||
|
AlwaysLoadOnServer=False
|
||
|
End Object
|
||
|
Components.Add(Sprite)
|
||
|
|
||
|
Begin Object Class=DistributionFloatConstant Name=DistributionFalloffExponent
|
||
|
End Object
|
||
|
FalloffExponent=(Distribution=DistributionFalloffExponent)
|
||
|
|
||
|
Begin Object Class=DistributionFloatConstant Name=DistributionStrength
|
||
|
End Object
|
||
|
Strength=(Distribution=DistributionStrength)
|
||
|
|
||
|
Begin Object Class=DistributionFloatConstant Name=DistributionRange
|
||
|
Constant=1.0f
|
||
|
End Object
|
||
|
Range=(Distribution=DistributionRange)
|
||
|
|
||
|
Begin Object Class=DistributionFloatConstant Name=DistributionDragCoefficient
|
||
|
Constant=1.0f
|
||
|
End Object
|
||
|
DragCoefficient=(Distribution=DistributionDragCoefficient)
|
||
|
|
||
|
Begin Object Class=DistributionFloatConstant Name=DistributionDragRadius
|
||
|
Constant=0.0f
|
||
|
End Object
|
||
|
DragRadius=(Distribution=DistributionDragRadius)
|
||
|
|
||
|
bHidden=FALSE
|
||
|
|
||
|
bCollideActors=false
|
||
|
|
||
|
FalloffType=FOFF_Constant;
|
||
|
|
||
|
bEnabled=true;
|
||
|
|
||
|
TickGroup=TG_PreAsyncWork;
|
||
|
|
||
|
CurrentTime=0.0f;
|
||
|
|
||
|
LoopDuration=0.0f;
|
||
|
}
|