Skip to main content

C++ reference

From 1.0.0 onwards, everything on this page changes only in a MAJOR release, with a migration note in the changelog.

Headers

#include "Components/EDRiderComponent.h"
#include "Components/EDMountableComponent.h"
#include "Components/EDMountPointComponent.h"
#include "Data/EDMountAnimationSet.h"
#include "Interfaces/EDMountableInterface.h"
#include "Interfaces/EDRiderInterface.h"
#include "Query/EDMountingSubsystem.h"
#include "System/EDMountingLibrary.h"
#include "System/EDMountingSettings.h"
#include "System/EDMountingTags.h"
#include "System/EDMountingTypes.h"
#include "Animation/EDMountAnimNotify.h"

UEDRiderComponent

static UEDRiderComponent* FindRiderComponent(AActor* Actor);

FEDMountResult RequestMount(AActor* MountActor);
FEDMountResult RequestMountWithOptions(const FEDMountRequest& Request);
FEDMountResult RequestMountNearest();
FEDMountResult RequestDismount();
FEDMountResult RequestChangeSeat(FEDSeatHandle TargetSeat);
FEDMountResult RequestShuffleSeat(bool bForward = true);
void ForceDismount(); // authority only

EEDMountPhase GetMountPhase() const;
bool IsMounted() const;
bool IsSeated() const;
bool IsTransitioning() const;
bool IsDriver() const;
AActor* GetMountActor() const;
FEDSeatHandle GetSeatHandle() const;
FGameplayTag GetEntryTag() const;
UEDMountableComponent* GetMountable() const;
UEDMountPointComponent* GetSeatComponent() const;
USceneComponent* GetSeatCameraComponent() const;

void ApplyDriveInput(const FVector2D& MoveInput, float Throttle, float Brake, bool bHandbrake);
void HandleMountEvent(FGameplayTag EventTag);

TSoftObjectPtr<UEDMountAnimationSet> AnimationSet;
EEDTransitionMode TransitionMode;
FEDMountQuery DefaultQuery;

FEDMountPhaseChangedSignature OnMountPhaseChanged;
FEDMountFailedSignature OnMountFailed;
FEDMountEventSignature OnMountEvent;

UEDMountableComponent

bool  IsMountable() const;
void SetMountable(bool bNewMountable); // authority only
float GetMountDistance() const;

void GetSeatHandles(TArray<FEDSeatHandle>& OutHandles) const;
int32 GetNumSeats() const;
int32 GetNumOccupiedSeats() const;
UEDMountPointComponent* GetSeatComponent(FEDSeatHandle Handle) const;
FEDSeatHandle FindSeatByName(FName SeatName) const;
FEDSeatHandle GetDriverSeat() const;
FEDSeatHandle FindSeatOf(const APawn* Rider) const;
APawn* GetOccupant(FEDSeatHandle Handle) const;
APawn* GetDriver() const;
void GetRiders(TArray<APawn*>& OutRiders) const;
bool IsSeatFree(FEDSeatHandle Handle) const;
bool HasFreeSeat() const;
FTransform GetSeatWorldTransform(FEDSeatHandle Handle) const;

bool CanRiderUseSeat(const APawn* Rider, FEDSeatHandle Handle,
const FGameplayTagContainer& ContextTags, EEDMountFailure& OutFailure) const;
FEDSeatHandle FindBestSeatFor(const APawn* Rider, const FEDMountRequest& Request,
EEDMountFailure& OutFailure) const;
void EjectAllRiders(); // authority only

FGameplayTagContainer MountTags;
float MountDistanceOverride;
TSoftObjectPtr<UEDMountAnimationSet> MountAnimationSet;
bool bEjectRidersOnDestroy;

FEDSeatOccupancyChangedSignature OnSeatOccupancyChanged;
FEDMountEventSignature OnMountEvent;
FEDMountableChangedSignature OnMountableChanged;
Not for gameplay

ReserveSeat, OccupySeat and ReleaseSeat are public C++ because the rider component needs them. Calling them yourself desynchronises the rider's state from the seat's.

UEDMountPointComponent

Every UPROPERTY on it is public API — see Seats. Plus:

FEDSeatHandle GetSeatHandle() const;
UEDMountableComponent* GetMountable() const;
FTransform GetSeatTransform() const;
FName GetEffectiveSeatName() const;
bool IsDriverSeat() const;
void GetEffectiveEntryPoints(TArray<FEDEntryPoint>& OutEntryPoints) const;
FTransform GetEntryPointTransform(const FEDEntryPoint& EntryPoint) const;
bool FindBestEntryPoint(const FVector& RiderLocation, bool bForExit, const APawn* IgnoredPawn,
FGameplayTag PreferredSide,
FEDEntryPoint& OutEntryPoint, FTransform& OutWorldTransform) const;
bool IsEntryPointClear(const FEDEntryPoint& EntryPoint, bool bForExit, const APawn* IgnoredPawn) const;
UEDMountAnimationSet* ResolveAnimationSet(const UEDMountAnimationSet* RiderSet) const;
FEDRiderPolicy ResolveRiderPolicy() const;
EEDPossessionPolicy ResolvePossessionPolicy() const;
USceneComponent* GetSeatCameraComponent() const;
FGameplayTag DeriveSideTag(const FVector& WorldLocation) const;

UEDMountingSubsystem

static UEDMountingSubsystem* Get(const UObject* WorldContextObject);

bool FindBestMount(const APawn* Rider, const FEDMountQuery& Query, FEDMountCandidate& OutCandidate) const;
void FindMountCandidates(const APawn* Rider, const FEDMountQuery& Query, TArray<FEDMountCandidate>& Out) const;
void GetRegisteredMountables(TArray<UEDMountableComponent*>& OutMountables) const;
int32 GetNumRegisteredMountables() const;

UEDMountAnimationSet

TArray<FEDMountAnimEntry> Entries;
FName MontageSlot; // "DefaultSlot"

UAnimMontage* ResolveMontage(const FEDMountAnimContext& Context, FEDMountAnimEntry& OutEntry) const;
bool ResolveEntry(const FEDMountAnimContext& Context, FEDMountAnimEntry& OutEntry) const; // no load
bool HasMontageFor(const FEDMountAnimContext& Context) const;
void PreloadAsync();
void ReleasePreload();

Interfaces

// IEDMountableInterface
bool CanAcceptRider(APawn* Rider, FEDSeatHandle Seat, const FGameplayTagContainer& ContextTags) const;
void OnRiderSeated(APawn* Rider, FEDSeatHandle Seat);
void OnRiderLeft(APawn* Rider, FEDSeatHandle Seat);
void SetSeatDoorOpen(FEDSeatHandle Seat, bool bOpen);
void ApplyDriverInput(APawn* Driver, const FVector2D& MoveInput, float Throttle, float Brake, bool bHandbrake);

// IEDRiderInterface
void GetRiderTags(FGameplayTagContainer& OutTags) const;
USkeletalMeshComponent* GetRiderMesh() const;
void OnMountPhaseChanged(EEDMountPhase NewPhase, EEDMountPhase OldPhase, AActor* MountActor, FEDSeatHandle Seat);

All BlueprintNativeEvent, all with working defaults.

Versioning

Adding an enumerator is MINOR; renaming or removing one is MAJOR. Adding a struct field is MINOR; reordering, renaming or moving a struct between modules is MAJOR — and a struct move also needs a CoreRedirects note, because otherwise assets lose that data silently.

Explicitly not public

  • Anything under Private/.
  • EDMountingTests in its entirety.
  • The editor module's visualizer and details customization. They are tooling; their shape can change.
  • Console variables. They are debugging aids and may come and go.
  • Log formatting. Do not parse it.