Files
UnrealEngine/Engine/Plugins/Runtime/MassGameplay/Source/MassSmartObjects/Public/MassSmartObjectHandler.h
2025-05-18 13:04:45 +08:00

135 lines
6.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "MassSmartObjectRequest.h"
#include "MassSmartObjectTypes.h"
#define UE_API MASSSMARTOBJECTS_API
struct FMassEntityManager;
class UMassSignalSubsystem;
class USmartObjectSubsystem;
struct FMassExecutionContext;
struct FMassEntityHandle;
struct FMassSmartObjectUserFragment;
struct FTransformFragment;
struct FSmartObjectClaimHandle;
struct FSmartObjectHandle;
struct FZoneGraphCompactLaneLocation;
enum class ESmartObjectSlotState : uint8;
/**
* Mediator struct that encapsulates communication between SmartObjectSubsystem and Mass.
* This object is meant to be created and used in method scope to guarantee subsystems validity.
*/
struct FMassSmartObjectHandler
{
/**
* FMassSmartObjectHandler constructor
* @param InExecutionContext is the current execution context of the entity subsystem
* @param InSmartObjectSubsystem is the smart object subsystem
* @param InSignalSubsystem is the mass signal subsystem to use to send signal to affected entities
*/
FMassSmartObjectHandler(FMassExecutionContext& InExecutionContext, USmartObjectSubsystem& InSmartObjectSubsystem, UMassSignalSubsystem& InSignalSubsystem)
: ExecutionContext(InExecutionContext)
, SmartObjectSubsystem(InSmartObjectSubsystem)
, SignalSubsystem(InSignalSubsystem)
{
}
UE_DEPRECATED(5.6, "Use the other constructor that doesn't require MassEntityManager")
FMassSmartObjectHandler(FMassEntityManager& InEntityManager, FMassExecutionContext& InExecutionContext, USmartObjectSubsystem& InSmartObjectSubsystem, UMassSignalSubsystem& InSignalSubsystem)
: FMassSmartObjectHandler(InExecutionContext, InSmartObjectSubsystem, InSignalSubsystem)
{
}
/**
* Creates an async request to build a list of compatible smart objects
* around the provided location. The caller must poll using the request id
* to know when the reservation can be done.
* @param RequestingEntity Entity requesting the candidates list
* @param Location The center of the query
* @return Request identifier that can be used to try claiming a result once available
*/
[[nodiscard]] UE_API FMassSmartObjectRequestID FindCandidatesAsync(const FMassEntityHandle RequestingEntity, const FGameplayTagContainer& UserTags, const FGameplayTagQuery& ActivityRequirements, const FVector& Location) const;
/**
* Creates an async request to build a list of compatible smart objects
* around the provided lane location. The caller must poll using the request id
* to know when the reservation can be done.
* @param RequestingEntity Entity requesting the candidates list
* @param LaneLocation The lane location as reference for the query
* @return Request identifier that can be used to try claiming a result once available
*/
[[nodiscard]] UE_API FMassSmartObjectRequestID FindCandidatesAsync(const FMassEntityHandle RequestingEntity, const FGameplayTagContainer& UserTags, const FGameplayTagQuery& ActivityRequirements, const FZoneGraphCompactLaneLocation& LaneLocation) const;
/**
* Provides the result of a previously created request from FindCandidatesAsync to indicate if it has been processed
* and the results can be used by ClaimCandidate.
* @param RequestID A valid request identifier (method will ensure otherwise)
* @return The current request's result, nullptr if request not ready yet.
*/
[[nodiscard]] UE_API const FMassSmartObjectCandidateSlots* GetRequestCandidates(const FMassSmartObjectRequestID& RequestID) const;
/**
* Deletes the request associated to the specified identifier
* @param RequestID A valid request identifier (method will ensure otherwise)
*/
UE_API void RemoveRequest(const FMassSmartObjectRequestID& RequestID) const;
/**
* Claims the first available smart object from the provided candidates.
* @param Entity MassEntity associated to the user fragment
* @param User Fragment of the user claiming
* @param Candidates Candidate slots to choose from.
* @param ClaimPriority Claim priority, a slot claimed at lower priority can be claimed by higher priority (unless already in use).
* @return Whether the slot has been successfully claimed or not
*/
[[nodiscard]] UE_API FSmartObjectClaimHandle ClaimCandidate(const FMassEntityHandle Entity, FMassSmartObjectUserFragment& User, const FMassSmartObjectCandidateSlots& Candidates, ESmartObjectClaimPriority ClaimPriority = ESmartObjectClaimPriority::Normal) const;
/**
* Claims the first available slot holding any type of USmartObjectMassBehaviorDefinition in the smart object
* associated to the provided identifier.
* @param Entity MassEntity associated to the user fragment
* @param User Fragment of the user claiming
* @param RequestResult A valid smart object request result (method will ensure otherwise)
* @param ClaimPriority Claim priority, a slot claimed at lower priority can be claimed by higher priority (unless already in use).
* @return Whether the slot has been successfully claimed or not
*/
[[nodiscard]] UE_API FSmartObjectClaimHandle ClaimSmartObject(const FMassEntityHandle Entity, FMassSmartObjectUserFragment& User, const FSmartObjectRequestResult& RequestResult, ESmartObjectClaimPriority ClaimPriority = ESmartObjectClaimPriority::Normal) const;
/**
* Activates the mass gameplay behavior associated to the previously claimed smart object.
* @param Entity MassEntity associated to the user fragment
* @param User Fragment of the user claiming
* @param ClaimHandle claimed smart object slot to use.
* @param Transform Fragment holding the transform of the user claiming
* @return Whether the slot has been successfully claimed or not
*/
UE_API bool StartUsingSmartObject(const FMassEntityHandle Entity, FMassSmartObjectUserFragment& User, const FSmartObjectClaimHandle ClaimHandle) const;
/**
* Deactivates the mass gameplay behavior started using StartUsingSmartObject.
* @param Entity MassEntity associated to the user fragment
* @param User Fragment of the user claiming
* @param NewStatus Reason of the deactivation.
*/
UE_API void StopUsingSmartObject(const FMassEntityHandle Entity, FMassSmartObjectUserFragment& User, const EMassSmartObjectInteractionStatus NewStatus) const;
/**
* Releases a claimed/in-use smart object and update user fragment.
* @param Entity MassEntity associated to the user fragment
* @param User Fragment of the user claiming
* @param ClaimHandle claimed smart object slot to release.
*/
UE_API void ReleaseSmartObject(const FMassEntityHandle Entity, FMassSmartObjectUserFragment& User, const FSmartObjectClaimHandle ClaimHandle) const;
private:
FMassExecutionContext& ExecutionContext;
USmartObjectSubsystem& SmartObjectSubsystem;
UMassSignalSubsystem& SignalSubsystem;
};
#undef UE_API