import enum gameMountingSlotRole
{
	Invalid,
	Driver,
	Passenger,
}

import enum gameMountingObjectType
{
	Invalid,
	Object,
	Vehicle,
	Puppet,
	Platform,
}

import enum gameMountingObjectSubType
{
	Invalid,
	Car,
	Bike,
}

import enum gameMountingRelationshipType
{
	Invalid,
	Parent,
	Child,
}

importonly struct MountingRelationship
{
	import var otherMountableType : gameMountingObjectType;
	import var otherMountableSubType : gameMountingObjectSubType;
	import var relationshipType : gameMountingRelationshipType;
	import var slotId : MountingSlotId;
}

importonly struct MountingSlotId
{
	import var id : CName;
}

importonly struct MountingInfo
{
	import var childId : EntityID;
	import var parentId : EntityID;
	import var slotId : MountingSlotId;
}

importonly final abstract class IMountingFacility extends IGameSystem
{
	public import final function GetMountingInfoSingleWithObjects( optional child : GameObject, optional parent : GameObject, optional slotId : MountingSlotId ) : MountingInfo;
	public import final function GetMountingInfoSingleWithIds( optional child : EntityID, optional parent : EntityID, optional slotId : MountingSlotId ) : MountingInfo;
	public import final function GetMountingInfoMultipleWithObjects( optional child : GameObject, optional parent : GameObject, optional slotId : MountingSlotId ) : array< MountingInfo >;
	public import final function GetMountingInfoMultipleWithIds( optional child : EntityID, optional parent : EntityID, optional slotId : MountingSlotId ) : array< MountingInfo >;
	public import final function IsMountedToAnything( child : EntityID ) : Bool;
	public import function Mount( mountEvent : MountingRequest );
	public import function Unmount( unmountEvent : UnmountingRequest );
	public import static function InfoHasParent( info : MountingInfo ) : Bool;
	public import static function InfoHasChild( info : MountingInfo ) : Bool;
	public import static function InfoIsComplete( info : MountingInfo ) : Bool;
	public import static function SlotIsValid( slotId : MountingSlotId ) : Bool;
	public import static function RelationshipGetOtherObject( relationship : MountingRelationship ) : weak< GameObject >;
}

import class MountingRequest extends IScriptable
{
	import var lowLevelMountingInfo : MountingInfo;
	import var preservePositionAfterMounting : Bool;
	import var mountData : MountEventData;
}

import class UnmountingRequest extends IScriptable
{
	import var lowLevelMountingInfo : MountingInfo;
	import var mountData : MountEventData;
	import var delay : Float;
}

import class MountingEvent extends Event
{
	import var request : MountingRequest;
	import var relationship : MountingRelationship;
}

import class UnmountingEvent extends Event
{
	import var request : UnmountingRequest;
	import var relationship : MountingRelationship;
}

