// Copyright Epic Games, Inc. All Rights Reserved. #include "IPickupable.h" #include "GameFramework/Actor.h" #include "LyraInventoryManagerComponent.h" #include "UObject/ScriptInterface.h" class UActorComponent; UPickupableStatics::UPickupableStatics() : Super(FObjectInitializer::Get()) { } TScriptInterface UPickupableStatics::GetFirstPickupableFromActor(AActor* Actor) { // If the actor is directly pickupable, return that. TScriptInterface PickupableActor(Actor); if (PickupableActor) { return PickupableActor; } // If the actor isn't pickupable, it might have a component that has a pickupable interface. TArray PickupableComponents = Actor ? Actor->GetComponentsByInterface(UPickupable::StaticClass()) : TArray(); if (PickupableComponents.Num() > 0) { // Get first pickupable, if the user needs more sophisticated pickup distinction, will need to be solved elsewhere. return TScriptInterface(PickupableComponents[0]); } return TScriptInterface(); } void UPickupableStatics::AddPickupToInventory(ULyraInventoryManagerComponent* InventoryComponent, TScriptInterface Pickup) { if (InventoryComponent && Pickup) { const FInventoryPickup& PickupInventory = Pickup->GetPickupInventory(); for (const FPickupTemplate& Template : PickupInventory.Templates) { InventoryComponent->AddItemDefinition(Template.ItemDef, Template.StackCount); } for (const FPickupInstance& Instance : PickupInventory.Instances) { InventoryComponent->AddItemInstance(Instance.Item); } } }