Update Inventory Component for Helper Functions

This commit is contained in:
Philip W 2023-10-20 22:59:54 +01:00
parent 5d009904f8
commit 6609476eec
3 changed files with 98 additions and 17 deletions

View File

@ -3,6 +3,8 @@
#include "InventoryComponent.h"
#include "BaseItem.h"
// Sets default values for this component's properties
UInventoryComponent::UInventoryComponent()
@ -21,7 +23,6 @@ void UInventoryComponent::BeginPlay()
Super::BeginPlay();
// ...
}
@ -41,39 +42,100 @@ void UInventoryComponent::LineTraceForItemCheck()
{
}
void UInventoryComponent::Pickup(UBaseItem* Item)
void UInventoryComponent::Pickup()
{
//TODO: Add pickup logic and create pickup Actor
if (!IsValid(ItemToPickup)) return;
}
bool UInventoryComponent::IsRoomAvailable(UBaseItem* Item, int TopLeftIndex)
bool UInventoryComponent::IsRoomAvailable(UBaseItem* Item, const int TopLeftIndex)
{
for (int i = 0; i < IndexToTile(TopLeftIndex).X + (Item->ItemSize.X - 1); i++)
{
for (int j = 0; j < IndexToTile(TopLeftIndex).Y + (Item->ItemSize.Y - 1); j++)
{
FInventoryTile TileToCheck;
TileToCheck.X = i;
TileToCheck.Y = j;
if (!IsTileValid(TileToCheck)) return false;
const TTuple<UBaseItem*, bool> ItemAtIndex = GetItemAtIndex(TileToIndex(TileToCheck));
if (ItemAtIndex.Get<1>()) return false;
if (IsValid(ItemAtIndex.Get<0>())) return false;
}
}
return true;
}
FVector UInventoryComponent::IndexToTile(int Index)
FInventoryTile UInventoryComponent::IndexToTile(const int Index) const
{
FInventoryTile Tile;
Tile.X = Index % Columns;
Tile.Y = Index / Columns;
return Tile;
}
UBaseItem* UInventoryComponent::GetItemAtIndex(int Index)
TTuple<UBaseItem*, bool> UInventoryComponent::GetItemAtIndex(const int Index)
{
if (!InventoryItems.IsValidIndex(Index)) return std::make_tuple(nullptr, false);
return std::make_tuple(InventoryItems[Index], true);
}
FInventoryTiles UInventoryComponent::TileToIndex(int Index)
int UInventoryComponent::TileToIndex(const FInventoryTile InventoryTile) const
{
return InventoryTile.X + InventoryTile.Y * Columns;
}
void UInventoryComponent::AddItemAt(UBaseItem* Item, int TopLeftIndex)
void UInventoryComponent::AddItemAt(UBaseItem* Item, const int TopLeftIndex)
{
for (int i = 0; i < IndexToTile(TopLeftIndex).X + (Item->ItemSize.X - 1); i++)
{
for (int j = 0; j < IndexToTile(TopLeftIndex).Y + (Item->ItemSize.Y - 1); j++)
{
FInventoryTile TileToCheck;
TileToCheck.X = i;
TileToCheck.Y = j;
if (!IsTileValid(TileToCheck)) return;
InventoryItems.Insert(Item, TileToIndex(TileToCheck));
}
}
IsDirty = true;
}
void UInventoryComponent::GetAllItems()
TMap<UBaseItem*, FInventoryTile> UInventoryComponent::GetAllItems()
{
TMap<UBaseItem*, FInventoryTile> Items;
for (int i = 0; i < InventoryItems.Num(); i++)
{
UBaseItem* Item = InventoryItems[i];
if (!IsValid(Item)) continue;
if (!Items.Contains(Item)) continue;
Items.Add(Item, IndexToTile(i));
}
return Items;
}
void UInventoryComponent::RemoveItem(UBaseItem* Item)
{
if (!IsValid(Item)) return;
for (int i = 0; i < InventoryItems.Num(); i++)
{
if (InventoryItems[i] == Item)
{
InventoryItems.RemoveAt(i);
IsDirty = true;
}
}
}
void UInventoryComponent::SpawnItem(UBaseItem* Item, FVector Location, FRotator Rotation)
{
}
bool UInventoryComponent::IsTileValid(const FInventoryTile InventoryTile) const
{
if (InventoryTile.X >= 0 && InventoryTile.Y >= 0 && InventoryTile.Y < Columns && InventoryTile.Y < Rows)
{
return true;
}
return false;
}

View File

@ -5,6 +5,7 @@
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "InventoryStructs.h"
#include "EndlessVendetta/EndlessVendettaCharacter.h"
#include "InventoryComponent.generated.h"
@ -17,6 +18,13 @@ public:
// Sets default values for this component's properties
UInventoryComponent();
UPROPERTY(EditDefaultsOnly, BlueprintRead, Category="Inventory")
int Columns = 10;
UPROPERTY(EditDefaultsOnly, BlueprintRead, Category="Inventory")
int Rows = 10;
UPROPERTY(EditDefaultsOnly, BlueprintRead, Category="Inventory")
float MaxPickupDistance = 200.0f;
protected:
// Called when the game starts
virtual void BeginPlay() override;
@ -30,21 +38,32 @@ public:
UFUNCTION(BlueprintCallable, Category="Inventory")
void LineTraceForItemCheck();
UFUNCTION(BlueprintCallable, Category="Inventory")
void Pickup(class UBaseItem* Item);
void Pickup();
UFUNCTION(BlueprintCallable, Category="Inventory")
bool IsRoomAvailable(class UBaseItem* Item, int TopLeftIndex);
bool IsRoomAvailable(class UBaseItem* Item, const int TopLeftIndex);
UFUNCTION(BlueprintCallable, Category="Inventory")
FVector IndexToTile(int Index);
FInventoryTile IndexToTile(const int Index) const;
UFUNCTION(BlueprintCallable, Category="Inventory")
UBaseItem* GetItemAtIndex(int Index);
TTuple<UBaseItem*, bool> GetItemAtIndex(const int Index);
UFUNCTION(BlueprintCallable, Category="Inventory")
FInventoryTiles TileToIndex(int Index);
int TileToIndex(const FInventoryTile InventoryTile) const;
UFUNCTION(BlueprintCallable, Category="Inventory")
void AddItemAt(class UBaseItem* Item, int TopLeftIndex);
void AddItemAt(class UBaseItem* Item, const int TopLeftIndex);
UFUNCTION(BlueprintCallable, Category="Inventory")
void GetAllItems();
TMap<UBaseItem*, FInventoryTile> GetAllItems();
UFUNCTION(BlueprintCallable, Category="Inventory")
void RemoveItem(class UBaseItem* Item);
UFUNCTION(BlueprintCallable, Category="Inventory")
void SpawnItem(class UBaseItem* Item, FVector Location, FRotator Rotation);
private:
bool IsTileValid(const FInventoryTile InventoryTile) const;
UPROPERTY()
AEndlessVendettaCharacter* PlayerCharacter;
UPROPERTY()
AActor* ItemToPickup;
bool IsDirty = false;
UPROPERTY()
TArray<UBaseItem*> InventoryItems;
};

View File

@ -10,7 +10,7 @@
*/
USTRUCT(BlueprintType)
struct FInventoryLines
struct FInventoryLine
{
GENERATED_BODY()
@ -19,7 +19,7 @@ struct FInventoryLines
};
USTRUCT(BlueprintType)
struct FInventoryTiles
struct FInventoryTile
{
GENERATED_BODY()