166 lines
4.7 KiB
C++
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;
|
|
};
|