RealtimeStyleTransferRuntime/Source/LyraGame/Inventory/LyraInventoryManagerCompone...

166 lines
4.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Net/Serialization/FastArraySerializer.h"
#include "Components/PawnComponent.h"
#include "LyraInventoryManagerComponent.generated.h"
class ULyraInventoryItemDefinition;
class ULyraInventoryItemInstance;
class ULyraInventoryManagerComponent;
struct FLyraInventoryList;
/** A message when an item is added to the inventory */
USTRUCT(BlueprintType)
struct FLyraInventoryChangeMessage
{
GENERATED_BODY()
//@TODO: Tag based names+owning actors for inventories instead of directly exposing the component?
UPROPERTY(BlueprintReadOnly, Category=Inventory)
UActorComponent* InventoryOwner = nullptr;
UPROPERTY(BlueprintReadOnly, Category = Inventory)
ULyraInventoryItemInstance* Instance = nullptr;
UPROPERTY(BlueprintReadOnly, Category=Inventory)
int32 NewCount = 0;
UPROPERTY(BlueprintReadOnly, Category=Inventory)
int32 Delta = 0;
};
/** A single entry in an inventory */
USTRUCT(BlueprintType)
struct FLyraInventoryEntry : public FFastArraySerializerItem
{
GENERATED_BODY()
FLyraInventoryEntry()
{}
FString GetDebugString() const;
private:
friend FLyraInventoryList;
friend ULyraInventoryManagerComponent;
UPROPERTY()
ULyraInventoryItemInstance* Instance = nullptr;
UPROPERTY()
int32 StackCount = 0;
UPROPERTY(NotReplicated)
int32 LastObservedCount = INDEX_NONE;
};
/** List of inventory items */
USTRUCT(BlueprintType)
struct FLyraInventoryList : public FFastArraySerializer
{
GENERATED_BODY()
FLyraInventoryList()
: OwnerComponent(nullptr)
{
}
FLyraInventoryList(UActorComponent* InOwnerComponent)
: OwnerComponent(InOwnerComponent)
{
}
TArray<ULyraInventoryItemInstance*> GetAllItems() const;
public:
//~FFastArraySerializer contract
void PreReplicatedRemove(const TArrayView<int32> RemovedIndices, int32 FinalSize);
void PostReplicatedAdd(const TArrayView<int32> AddedIndices, int32 FinalSize);
void PostReplicatedChange(const TArrayView<int32> ChangedIndices, int32 FinalSize);
//~End of FFastArraySerializer contract
bool NetDeltaSerialize(FNetDeltaSerializeInfo& DeltaParms)
{
return FFastArraySerializer::FastArrayDeltaSerialize<FLyraInventoryEntry, FLyraInventoryList>(Entries, DeltaParms, *this);
}
ULyraInventoryItemInstance* AddEntry(TSubclassOf<ULyraInventoryItemDefinition> ItemClass, int32 StackCount);
void AddEntry(ULyraInventoryItemInstance* Instance);
void RemoveEntry(ULyraInventoryItemInstance* Instance);
private:
void BroadcastChangeMessage(FLyraInventoryEntry& Entry, int32 OldCount, int32 NewCount);
private:
friend ULyraInventoryManagerComponent;
private:
// Replicated list of items
UPROPERTY()
TArray<FLyraInventoryEntry> Entries;
UPROPERTY()
UActorComponent* OwnerComponent;
};
template<>
struct TStructOpsTypeTraits<FLyraInventoryList> : public TStructOpsTypeTraitsBase2<FLyraInventoryList>
{
enum { WithNetDeltaSerializer = true };
};
/**
* Manages an inventory
*/
UCLASS(BlueprintType)
class ULyraInventoryManagerComponent : public UActorComponent
{
GENERATED_BODY()
public:
ULyraInventoryManagerComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Inventory)
bool CanAddItemDefinition(TSubclassOf<ULyraInventoryItemDefinition> ItemDef, int32 StackCount = 1);
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Inventory)
ULyraInventoryItemInstance* AddItemDefinition(TSubclassOf<ULyraInventoryItemDefinition> ItemDef, int32 StackCount = 1);
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Inventory)
void AddItemInstance(ULyraInventoryItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Inventory)
void RemoveItemInstance(ULyraInventoryItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, Category=Inventory, BlueprintPure=false)
TArray<ULyraInventoryItemInstance*> GetAllItems() const;
UFUNCTION(BlueprintCallable, Category=Inventory, BlueprintPure)
ULyraInventoryItemInstance* FindFirstItemStackByDefinition(TSubclassOf<ULyraInventoryItemDefinition> ItemDef) const;
int32 GetTotalItemCountByDefinition(TSubclassOf<ULyraInventoryItemDefinition> ItemDef) const;
bool ConsumeItemsByDefinition(TSubclassOf<ULyraInventoryItemDefinition> ItemDef, int32 NumToConsume);
//~UObject interface
virtual bool ReplicateSubobjects(class UActorChannel* Channel, class FOutBunch* Bunch, FReplicationFlags* RepFlags) override;
//~End of UObject interface
private:
UPROPERTY(Replicated)
FLyraInventoryList InventoryList;
};