57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "IPickupable.h"
|
|
#include "DrawDebugHelpers.h"
|
|
#include "Abilities/GameplayAbilityTypes.h"
|
|
#include "GameFramework/Actor.h"
|
|
#include "Components/ActorComponent.h"
|
|
#include "UObject/ScriptInterface.h"
|
|
#include "Abilities/GameplayAbility.h"
|
|
#include "LyraInventoryManagerComponent.h"
|
|
|
|
UPickupableStatics::UPickupableStatics()
|
|
: Super(FObjectInitializer::Get())
|
|
{
|
|
}
|
|
|
|
TScriptInterface<IPickupable> UPickupableStatics::GetIPickupableFromActorInfo(UGameplayAbility* Ability)
|
|
{
|
|
const FGameplayAbilityActorInfo* ActorInfo = Ability->GetCurrentActorInfo();
|
|
AActor* Avatar = ActorInfo->AvatarActor.Get();
|
|
|
|
// If the actor is directly pickupable, return that.
|
|
TScriptInterface<IPickupable> PickupableActor(Avatar);
|
|
if (PickupableActor)
|
|
{
|
|
return PickupableActor;
|
|
}
|
|
|
|
// If the actor isn't pickupable, it might have a component that has a pickupable interface.
|
|
TArray<UActorComponent*> PickupableComponents = Avatar ? Avatar->GetComponentsByInterface(UPickupable::StaticClass()) : TArray<UActorComponent*>();
|
|
if (PickupableComponents.Num() > 0)
|
|
{
|
|
ensureMsgf(PickupableComponents.Num() == 1, TEXT("We don't support multiple pickupable components yet."));
|
|
|
|
return TScriptInterface<IPickupable>(PickupableComponents[0]);
|
|
}
|
|
|
|
return TScriptInterface<IPickupable>();
|
|
}
|
|
|
|
void UPickupableStatics::AddPickupInventory(ULyraInventoryManagerComponent* InventoryComponent, TScriptInterface<IPickupable> Pickupable)
|
|
{
|
|
if (InventoryComponent && Pickupable)
|
|
{
|
|
const FInventoryPickup& PickupInventory = Pickupable->GetPickupInventory();
|
|
|
|
for (const FPickupTemplate& Template : PickupInventory.Templates)
|
|
{
|
|
InventoryComponent->AddItemDefinition(Template.ItemDef, Template.StackCount);
|
|
}
|
|
|
|
for (const FPickupInstance& Instance : PickupInventory.Instances)
|
|
{
|
|
InventoryComponent->AddItemInstance(Instance.Item);
|
|
}
|
|
}
|
|
} |