2021-09-28 13:33:17 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "SmartObjectRuntime.h"
2022-01-19 14:16:16 -05:00
# include "SmartObjectSubsystem.h"
# include "MassEntitySubsystem.h"
2021-09-28 13:33:17 -04:00
const FSmartObjectClaimHandle FSmartObjectClaimHandle : : InvalidHandle = { } ;
//----------------------------------------------------------------------//
// FSmartObjectRuntime
//----------------------------------------------------------------------//
2021-11-26 09:52:13 -05:00
FSmartObjectRuntime : : FSmartObjectRuntime ( const USmartObjectDefinition & InDefinition )
: Definition ( & InDefinition )
2021-09-28 13:33:17 -04:00
{
2022-01-19 14:16:16 -05:00
const int32 NumSlotDefinitions = InDefinition . GetSlots ( ) . Num ( ) ;
SlotHandles . SetNum ( NumSlotDefinitions ) ;
2021-09-28 13:33:17 -04:00
}
//----------------------------------------------------------------------//
2022-01-19 14:16:16 -05:00
// FSmartObjectSlotClaimState
2021-09-28 13:33:17 -04:00
//----------------------------------------------------------------------//
2022-01-19 14:16:16 -05:00
bool FSmartObjectSlotClaimState : : Claim ( const FSmartObjectUserHandle & InUser )
2021-09-28 13:33:17 -04:00
{
if ( State = = ESmartObjectSlotState : : Free )
{
State = ESmartObjectSlotState : : Claimed ;
User = InUser ;
return true ;
}
return false ;
}
2022-01-19 14:16:16 -05:00
2022-03-16 03:47:02 -04:00
bool FSmartObjectSlotClaimState : : Release ( const FSmartObjectClaimHandle & ClaimHandle , const ESmartObjectSlotState NewState , const bool bAborted )
2022-01-19 14:16:16 -05:00
{
if ( ! ensureMsgf ( ClaimHandle . IsValid ( ) , TEXT ( " Attempting to release a slot using an invalid handle: %s " ) , * LexToString ( ClaimHandle ) ) )
{
return false ;
}
bool bReleased = false ;
if ( State ! = ESmartObjectSlotState : : Claimed & & State ! = ESmartObjectSlotState : : Occupied )
{
UE_LOG ( LogSmartObject , Error , TEXT ( " Expected slot state is 'Claimed' or 'Occupied' but current state is '%s'. Slot will not be released " ) ,
* UEnum : : GetValueAsString ( State ) ) ;
}
else if ( ClaimHandle . UserHandle ! = User )
{
UE_LOG ( LogSmartObject , Error , TEXT ( " User '%s' is trying to release slot claimed or used by other user '%s'. Slot will not be released " ) ,
* LexToString ( ClaimHandle . UserHandle ) , * LexToString ( User ) ) ;
}
else
{
if ( bAborted )
{
const bool bFunctionWasExecuted = OnSlotInvalidatedDelegate . ExecuteIfBound ( ClaimHandle , State ) ;
UE_LOG ( LogSmartObject , Verbose , TEXT ( " Slot invalidated callback was%scalled for %s " ) , bFunctionWasExecuted ? TEXT ( " " ) : TEXT ( " not " ) , * LexToString ( ClaimHandle ) ) ;
}
2022-03-16 03:47:02 -04:00
State = NewState ;
2022-03-18 12:31:49 -04:00
User . Invalidate ( ) ;
2022-01-19 14:16:16 -05:00
bReleased = true ;
}
return bReleased ;
}