/**
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 * DO NOT USE, try the NxForceField classes instead!
 */
class RB_RadialForceActor extends RigidBodyBase
	native(ForceField)
	placeable;

enum ERadialForceType
{
	RFT_Force,		// Use as a force
	RFT_Impulse,	// Use as an impulse, gets deactivated when applied once
};

/** Used to preview the radius of the force. */
var	DrawSphereComponent			RenderComponent;

/** Strength of the force applied by this actor. Positive forces are applied outwards. */
var()	interp float	ForceStrength;

/** Radius of influence of the force. */
var()	interp float	ForceRadius;

/** How strongly objects orbit around Z axis of actor. */
var()	interp float	SwirlStrength;

/** How strongly to spin objects around their local Z. */
var()	interp float	SpinTorque;

/** Way in which the force falls off as objects are further away from the location. */
var()	PrimitiveComponent.ERadialImpulseFalloff	ForceFalloff;

/** Indicates whether the force is active at the moment. */
var()	bool	bForceActive;

/** Indicates which type of force mode is used. */
var()	ERadialForceType	RadialForceMode;

/** Apply force field to cloth */
var()	bool	bForceApplyToCloth;

/** Apply force field to fluid */
var()	bool	bForceApplyToFluid;

/** Apply force field to rigid bodies */
var()	bool	bForceApplyToRigidBodies;

/** Apply force field to projectiles like rockets */
var()	bool	bForceApplyToProjectiles;

//TODO: Remove the above booleans and just use the channels
/** Which types of object to apply this force field to */
var()	const RBCollisionChannelContainer CollideWithChannels;


cpptext
{	
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
	virtual void TickSpecial(FLOAT DeltaSeconds);
#if WITH_EDITOR
	virtual void EditorApplyScale(const FVector& DeltaScale, const FMatrix& ScaleMatrix, const FVector* PivotLocation, UBOOL bAltDown, UBOOL bShiftDown, UBOOL bCtrlDown);
#endif
}

replication
{
	if (bNetDirty)
		bForceActive;
}

/** Handling Toggle event from Kismet. */
simulated function OnToggle(SeqAct_Toggle inAction)
{
	if(inAction.InputLinks[0].bHasImpulse)
	{
		bForceActive = true;
	}
	else if(inAction.InputLinks[1].bHasImpulse)
	{
		bForceActive = false;
	}
	else if(inAction.InputLinks[2].bHasImpulse)
	{
		bForceActive = !bForceActive;
	}

	SetForcedInitialReplicatedProperty(Property'Engine.RB_RadialForceActor.bForceActive', (bForceActive == default.bForceActive));

`if(`__TW_PERFORMANCE_)
	// Once Kismet is used this actor needs to be replicated
	ForceNetRelevant();
`endif
}

defaultproperties
{
	Begin Object Class=DrawSphereComponent Name=DrawSphere0
		SphereColor=(R=64,G=70,B=255,A=255)
		SphereRadius=200.0
		bDrawOnlyIfSelected=True
	End Object
	RenderComponent=DrawSphere0
	Components.Add(DrawSphere0)

	Begin Object Class=SpriteComponent Name=Sprite
		Sprite=Texture2D'EditorResources.S_RadForce'
		HiddenGame=True
		AlwaysLoadOnClient=False
		AlwaysLoadOnServer=False
		SpriteCategoryName="Physics"
	End Object
	Components.Add(Sprite)

	TickGroup=TG_PreAsyncWork

	ForceStrength=10.0
	ForceRadius=200.0
	ForceFalloff=RIF_Constant
	RadialForceMode=RFT_Force

`if(`__TW_PERFORMANCE_)
	// SimProxy is wasteful unless SeqAct_Toggle is used!
	RemoteRole=ROLE_None
`else
	RemoteRole=ROLE_SimulatedProxy
`endif
	bNoDelete=true
	bAlwaysRelevant=true
	NetUpdateFrequency=0.1
	bOnlyDirtyReplication=true
	
	bForceApplyToCloth=True
	bForceApplyToFluid=True
	bForceApplyToRigidBodies=True
	bForceApplyToProjectiles=False
	
	CollideWithChannels={( 
                Default=True,
                Pawn=True,
                Vehicle=True,
                Water=True,
                GameplayPhysics=True,
                EffectPhysics=True,
                Untitled1=True,
                Untitled2=True,
                Untitled3=True,
                Untitled4=True,
                Cloth=True,
                FluidDrain=True,
                )}
}
