import enum gamePlayerCoverDirection
{
	None,
	Up,
	Left,
	Right,
}

import enum gamePlayerCoverMode
{
	None,
	Auto,
	Manual,
}

importonly class PlayerCoverStatusChangedEvent extends Event
{
	import var direction : gamePlayerCoverDirection;
	import var fullyBehindCover : Bool;
}

import class PlayerClimbInfo extends IScriptable
{
	import var descResult : GeometryDescriptionResult;
	import var obstacleEnd : Vector4;
	import var inputDirection : Vector4;
	import var climbValid : Bool;
	import var vaultValid : Bool;
}

import enum worldgeometryaverageNormalDetectionHelperQueryStatus
{
	Finished,
	NoGeometry,
}

import class AverageNormalResult extends IScriptable
{
	public import function GetAverageNormal() : Vector4;
	public import function GetAverageSlope() : Vector4;
	public import function GetCentreNormal() : Vector4;
	public import function GetCentreSlope() : Vector4;
	public import function GetAveragePredictedNormal() : Vector4;
	public import function GetAveragePredictedSlope() : Vector4;
	public import function GetCentreMaterialName() : CName;
}

import class AverageNormalQuery extends IScriptable
{
	public import function SetOwnerPosition( ownerPosition : Vector4 );
	public import function SetOwnerDirection( ownerDirection : Vector4 );
	public import function SetQueryDirection( queryDirection : Vector4 );
	public import function SetQueryDistanceOffset( distanceOffset : Float );
	public import function SetRadius( radius : Float );
	public import function SetFilter( filter : QueryFilter );
	public import function SetQueryLength( queryLength : Float );
}

import enum gamePlayerObstacleSystemQueryType
{
	Climb_Vault,
	Covers,
	AverageNormal,
}

import class PlayerObstacleSystem extends IScriptable
{
	public import function GetCurrentClimbInfo( instigator : GameObject ) : PlayerClimbInfo;
	public import function GetSlopeInfo( instigator : GameObject ) : AverageNormalResult;
	public import function OnEnterCrouch( instigator : GameObject );
	public import function SetIsSwimming( isSwimming : Bool, instigator : GameObject );
	public import function OnCoverDeactivation( instigator : GameObject );
	public import function OnAutoCoverActivation( instigator : GameObject );
	public import function ManualLeanLeft( instigator : GameObject );
	public import function ManualLeanRight( instigator : GameObject );
	public import function GetCoverDirection( instigator : GameObject ) : gamePlayerCoverDirection;
	public import function EnableQueriesForOwner( instigator : GameObject, queryToEnable_1 : gamePlayerObstacleSystemQueryType, optional queryToEnable_2 : gamePlayerObstacleSystemQueryType, optional queryToEnable_3 : gamePlayerObstacleSystemQueryType );
	public import function DisableQueriesForOwner( instigator : GameObject, queryToDisable_1 : gamePlayerObstacleSystemQueryType, optional queryToDisable_2 : gamePlayerObstacleSystemQueryType, optional queryToDisable_3 : gamePlayerObstacleSystemQueryType );
}

class PlayerCoverHelper
{

	public constexpr static function GetBlockCoverStatusEffectID() : TweakDBID
	{
		return T"BaseStatusEffect.BlockCoverVisibilityReduction";
	}

	public static function BlockCoverVisibilityReduction( owner : weak< GameObject > )
	{
		GameInstance.GetStatusEffectSystem( owner.GetGame() ).ApplyStatusEffect( owner.GetEntityID(), PlayerCoverHelper.GetBlockCoverStatusEffectID() );
	}

}

