import enum PuppetVehicleState
{
	IdleMounted,
	IdleStand,
	CombatWindowed,
	CombatSeated,
	Turret,
	GunnerSlot,
}

import abstract class gamePuppetBase extends TimeDilatable
{
	public import const final function GetRecordID() : TweakDBID;
	public import const final function GetTweakDBDisplayName( useDisplayNameAsFallback : Bool ) : String;
	public import const final function GetTweakDBFullDisplayName( useDisplayNameAsFallback : Bool ) : String;

	public const function GetIntFromCharacterTweak( const varName : ref< String >, optional defaultValue : Int32 ) : Int32
	{
		var tweakID : TweakDBID;
		tweakID = GetRecordID();
		TDBID.Append( tweakID, TDBID.Create( "." + varName ) );
		return TDB.GetInt( tweakID, defaultValue );
	}

	public const function GetFloatFromCharacterTweak( const varName : ref< String >, optional defaultValue : Float ) : Float
	{
		var tweakID : TweakDBID;
		tweakID = GetRecordID();
		TDBID.Append( tweakID, TDBID.Create( "." + varName ) );
		return TDB.GetFloat( tweakID, defaultValue );
	}

	public const function GetStringFromCharacterTweak( const varName : ref< String >, optional defaultValue : String ) : String
	{
		var tweakID : TweakDBID;
		tweakID = GetRecordID();
		TDBID.Append( tweakID, TDBID.Create( "." + varName ) );
		return TDB.GetString( tweakID, defaultValue );
	}

	public const function GetBoolFromCharacterTweak( const varName : ref< String >, optional defaultValue : Bool ) : Bool
	{
		var tweakID : TweakDBID;
		tweakID = GetRecordID();
		TDBID.Append( tweakID, TDBID.Create( "." + varName ) );
		return TDB.GetBool( tweakID, defaultValue );
	}

	public const function GetCNameFromCharacterTweak( const varName : ref< String >, optional defaultValue : CName ) : CName
	{
		var tweakID : TweakDBID;
		tweakID = GetRecordID();
		TDBID.Append( tweakID, TDBID.Create( "." + varName ) );
		return TDB.GetCName( tweakID, defaultValue );
	}

	public const virtual function IsIncapacitated() : Bool
	{
		return false;
	}

}

import enum navNaviPositionType
{
	None,
	Normal,
	Projected,
}

importonly class gamePuppet extends gamePuppetBase
{
	public import const final function GetVelocity() : Vector4;
	public import const final function GetSenses() : SenseComponent;
	public import const final function GetAttitude() : AttitudeAgent;
	public import const final function GetVisibleObject() : VisibleObjectComponent;
	public import const final function GetBlackboard() : IBlackboard;
	public import const final function GetTargetTracker() : TargetTrackerComponent;
	public import const final function HideIrreversibly();
	public import const final function SetCPOMissionData( hasCPOMissionData : Bool );
	public import const final function HasCPOMissionData() : Bool;
	public import const final function SetCPOMissionVoted( deviceGroup : CName, hasVoted : Bool );
	public import const final function GetCPOMissionVoted( deviceGroup : CName ) : Bool;
	public import const final function GetResolvedGenderName() : CName;
	public import const final function GetBodyType() : CName;
	public import const final function GenerateLoot();
	public import const final function GenerateLootWithStats( lootModifiers : array< gameStatModifierData > );
	public import const final function DropWeapons();
	public import const final function DropAmmo();
	public import const final function HasRuntimeAnimsetTags( tagList : array< CName > ) : Bool;
	public import const final function HasCrowdStaticLOD() : Bool;
	public import const final function IsLooted() : Bool;
	public import const final function CheckIsStandingOnVehicle( vehicleID : EntityID ) : Bool;
	public import const final function TryGetVehicleBelow() : EntityID;
	public import const final function GetNPCRarity() : gamedataNPCRarity;
	public import const final function GetNPCRarityRecord() : NPCRarity_Record;
	public import const final function HasMechanicalImpactComponent() : Bool;
	public import final function CacheLootForDropping();
	public import final function DropLootBag();
	public import final function InitializeBaseInventory();
	public import final function WasLootGenerated() : Bool;
	public import final function GetCurrentNavmeshPosition( position : ref< Vector4 > ) : navNaviPositionType;
	public import final function CanRagdoll() : Bool;
	public import final function GetLastValidNavmeshPoint() : Vector4;
	public import final function ProcessLoot();
	protected import static function HasLootableItems( self : weak< ScriptedPuppet > ) : Bool;
}

