Files
ProjectEleri/Source/ProjectEleri/Private/InventoryComponent.cpp

179 lines
3.7 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "InventoryComponent.h"
#include "MyCharacter.h"
#include "Kismet/GameplayStatics.h"
#include "../Items/ItemDatabase.h"
#include "ProjectEleri/Settings/EleriGameSettings.h"
// Sets default values for this component's properties
UInventoryComponent::UInventoryComponent()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = false;
// ...
}
// Called when the game starts
void UInventoryComponent::BeginPlay()
{
Super::BeginPlay();
if (!GetOwner()->ActorHasTag(INVENTORY_TAG))
{
GetOwner()->Tags.Add(INVENTORY_TAG);
}
if (GetWorld())
ItemDatabase = GetWorld()->GetGameInstance()->GetSubsystem<UItemDatabase>();
AssignToCharacter(GetOwner());
InitializeInventory();
}
int32 UInventoryComponent::HasItem(FPrimaryAssetId ItemId, bool HQ) const
{
for (int32 i = 0; i < ItemList.Num(); i++)
{
if (ItemId == ItemList[i].ItemId &&
HQ == ItemList[i].HQ)
{
return i;
}
}
return -1;
}
int32 UInventoryComponent::ItemExists(FPrimaryAssetId ItemToCheck, bool IsHq)
{
for (int32 i = 0; i < ItemList.Num(); i++)
{
if (ItemList[i].ItemId == ItemToCheck && ItemList[i].HQ == IsHq)
{
return i;
}
}
return -1;
}
bool UInventoryComponent::AddItemToInventory(FPrimaryAssetId ItemToAdd, int32 StackSize, bool HighQuality)
{
if (!ItemToAdd.IsValid()) return false;
int32 itemIndex = ItemExists(ItemToAdd, HighQuality);
if (itemIndex == -1)
{
FItemStack ItemStack;
ItemStack.ItemId = ItemToAdd;
ItemStack.Stack = StackSize;
ItemStack.HQ = HighQuality;
ItemList.Add(ItemStack);
}
else
{
ItemList[itemIndex].Stack += StackSize;
}
OnInventoryUpdated.Broadcast();
return true;
}
bool UInventoryComponent::RemoveItemFromInventory(FPrimaryAssetId ItemId, int32 Amount, bool HighQuality)
{
if (ItemId.IsValid())
{
int32 ItemIndex = ItemExists(ItemId, HighQuality);
if (ItemIndex == -1)
{
return false;
}
else
{
if (Amount == ItemList[ItemIndex].Stack)
{
ItemList.RemoveAt(ItemIndex);
}
else
{
ItemList[ItemIndex].Stack -= Amount;
}
OnInventoryUpdated.Broadcast();
return true;
}
}
return false;
}
void UInventoryComponent::InitializeInventory()
{
if (ItemDatabase)
{
for (FDefaultItemStack ItemData : DefaultItems)
{
if (IsValid(ItemData.Item))
{
AddItemToInventory(ItemData.Item->GetPrimaryAssetId(), ItemData.StackSize, ItemData.HQ);
}
}
}
}
void UInventoryComponent::EmptyInventory()
{
ItemStacks.Empty();
ItemList.Empty();
OnInventoryUpdated.Broadcast();
}
int32 UInventoryComponent::GetStackForItem(FPrimaryAssetId ItemId, bool HQ) const
{
for (int32 i = 0; i < ItemList.Num(); i++)
{
if (ItemList[i].ItemId == ItemId && ItemList[i].HQ == HQ)
return ItemList[i].Stack;
}
return 0;
}
TArray<FPrimaryAssetId> UInventoryComponent::GetItemAssetIds()
{
TArray<FPrimaryAssetId> AllIds;
for (int32 i = 0; i < ItemList.Num(); i++)
{
AllIds.Add(ItemList[i].ItemId);
}
return AllIds;
}
void UInventoryComponent::ChangeCapacity(int32 NewCapacity) {
Capacity = NewCapacity;
}
FInventorySaveData UInventoryComponent::PrepareSaveData()
{
FInventorySaveData StackData;
StackData.ItemStacks = ItemList;
return StackData;
}
void UInventoryComponent::LoadFromSave(const FInventorySaveData& LoadData)
{
EmptyInventory();
for (const FItemStack& SaveDataEntry : LoadData.ItemStacks)
{
AddItemToInventory(SaveDataEntry.ItemId, SaveDataEntry.Stack, SaveDataEntry.HQ);
}
}
void UInventoryComponent::AssignToCharacter(AActor* Character)
{
ActorAttachedTo = Character;
}