Most inventory cap types implemented

This commit is contained in:
2024-10-23 00:33:20 -05:00
parent cd51f057b7
commit 8fac56eae4
101 changed files with 27214 additions and 17490 deletions

View File

@@ -41,6 +41,7 @@ void UAC_PlayerInventory::InitializePlayerInventory()
for (const FStartingItems& Item : StartingItems)
{
FString ContextString = TEXT("Initialize Player Inventory");
InventoryCurrentCapacity = PlayerInventory.Num();
// For each of the quantities defined
for (int32 i = 0; i < Item.QuantityOfItem; i++)
@@ -55,12 +56,14 @@ void UAC_PlayerInventory::InitializePlayerInventory()
{
// Add item to player inventory array
PlayerInventory.Add(*LocItemInfo);
//Update Carry Capacity
}
}
}
}
InventoryCurrentCapacity = PlayerInventory.Num();
}
TArray<FBaseItemInfo> UAC_PlayerInventory::GetPlayerInventory()
@@ -80,7 +83,29 @@ void UAC_PlayerInventory::RequestAddItem(FBaseItemInfo InItemInfo, int32 InItemQ
for (int32 i = 0; i < InItemQuantity; i++)
{
PlayerInventory.Add(InItemInfo);
InventoryCurrentCapacity++;
}
}
TArray<FBaseItemInfo> UAC_PlayerInventory::GetAllInventoryItemsInCategory(EItemType InItemType)
{
TArray<FBaseItemInfo> LocItemsInCategory;
for (const FBaseItemInfo& Item : PlayerInventory)
{
if (Item.ItemType == InItemType)
{
LocItemsInCategory.Add(Item);
}
}
return LocItemsInCategory;
}
EInventoryCapType UAC_PlayerInventory::GetInventoryCapType()
{
return this->InventoryCapType;
}

View File

@@ -21,11 +21,11 @@ void UAC_PlayerStats::InitializePlayerStats()
CurrentHealth = MaxHealth;
CurrentStamina = MaxStamina;
CurrentMana = MaxMana;
UpdateCurrentCarryWeight(CurrentCarryWeight);
UpdateCurrentCarryWeight();
}
float UAC_PlayerStats::UpdateCurrentCarryWeight(float& InCurrentCarryWeight)
void UAC_PlayerStats::UpdateCurrentCarryWeight()
{
APawn* PlayerPawn = GetWorld()->GetFirstPlayerController()->GetPawn();
float LocCarryWeight = 0.f;
@@ -38,10 +38,9 @@ float UAC_PlayerStats::UpdateCurrentCarryWeight(float& InCurrentCarryWeight)
{
LocCarryWeight += InventoryItem.ItemWeight;
}
InCurrentCarryWeight = LocCarryWeight;
CurrentCarryWeight = LocCarryWeight;
}
return InCurrentCarryWeight;
}
// Called when the game starts

View File

@@ -4,6 +4,9 @@
#include "BPFL_EpicInventory.h"
#include "AC_PlayerInventory.h"
#include "AC_InventoryItem.h"
#include "AC_PlayerStats.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Character.h"
//Returns the player's Inventory Component
@@ -32,30 +35,163 @@ void UBPFL_EpicInventory::RequestInteraction(AActor* InteractingActor)
UAC_PlayerInventory* PlayerInventoryComponent = GetPlayerInventoryComponent(InteractingActor);
UAC_InventoryItem* ObjectInventoryItem = InteractingActor->FindComponentByClass<UAC_InventoryItem>();
TArray<FStartingItems> ObjectItemInfoArray = ObjectInventoryItem->ItemInformation;
UAC_PlayerStats* PlayerStatsComponent = GetPlayerStatsComponent(InteractingActor);
APawn* PlayerPawn = InteractingActor->GetWorld()->GetFirstPlayerController()->GetPawn();
ACharacter* PlayerCharacter = Cast<ACharacter>(PlayerPawn);
EInventoryCapType PlayerCapType = PlayerInventoryComponent->GetInventoryCapType();
if (PlayerInventoryComponent)
{
if (PlayerInventoryComponent->bUseInventoryCap)
{
//Check type of cap and if there is room then add item
UE_LOG(LogTemp, Warning, TEXT("Implement cap check"))
UE_LOG(LogTemp, Warning, TEXT("Implement cap check"));
switch (PlayerCapType)
{
case EInventoryCapType::None:
for (const FStartingItems& DTRow : ObjectItemInfoArray)
{
FBaseItemInfo* LocItemInfo = DTRow.ItemDataTableAndRow.DataTable->FindRow<FBaseItemInfo>(DTRow.ItemDataTableAndRow.RowName, FString("Interaction Request"));
int32 LocItemQuantity = DTRow.QuantityOfItem;
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
UE_LOG(LogTemp, Warning, TEXT("Attempted Add"));
InteractingActor->Destroy();
}
break;
case EInventoryCapType::Weight:
for (int32 i = 0; i < ObjectItemInfoArray.Num(); i++)
{
FBaseItemInfo* LocItemInfo = ObjectItemInfoArray[i].ItemDataTableAndRow.DataTable->FindRow<FBaseItemInfo>(ObjectItemInfoArray[i].ItemDataTableAndRow.RowName, FString("Interaction Request"));
int32 LocItemQuantity = ObjectItemInfoArray[i].QuantityOfItem;
float LocItemWeight = LocItemInfo->ItemWeight;
float LocMaxCarryWeight = PlayerStatsComponent->MaxCarryWeight;
float LocCurrentCarryWeight = PlayerStatsComponent->CurrentCarryWeight;
if ((LocItemWeight + LocCurrentCarryWeight) >= LocMaxCarryWeight)
{
//Item will encumber player so trigger encumberance as well
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
PlayerStatsComponent->UpdateCurrentCarryWeight();
UCharacterMovementComponent* MovementComponent = PlayerCharacter->GetCharacterMovement();
MovementComponent->MaxWalkSpeed = 75.0f;
InteractingActor->Destroy();
UE_LOG(LogTemp, Warning, TEXT("Weight method used"));
}
else if ((LocItemWeight + LocCurrentCarryWeight) < LocMaxCarryWeight)
{
//Item will not encumber player so only add item and update weight
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
PlayerStatsComponent->UpdateCurrentCarryWeight();
InteractingActor->Destroy();
UE_LOG(LogTemp, Warning, TEXT("Weight method used"));
}
else {
//Item will neither encumber or not encumber player somehow so add item and update weight
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
PlayerStatsComponent->UpdateCurrentCarryWeight();
InteractingActor->Destroy();
UE_LOG(LogTemp, Warning, TEXT("Weight method used"));
}
}
break;
case EInventoryCapType::TotalItems:
for (int32 i = 0; i < ObjectItemInfoArray.Num(); i++)
{
FBaseItemInfo* LocItemInfo = ObjectItemInfoArray[i].ItemDataTableAndRow.DataTable->FindRow<FBaseItemInfo>(ObjectItemInfoArray[i].ItemDataTableAndRow.RowName, FString("Interaction Request"));
int32 LocItemQuantity = ObjectItemInfoArray[i].QuantityOfItem;
int32 LocMaxItemCapacity = PlayerInventoryComponent->InventoryMaxCapacity;
int32 LocCurrentItemCapacity = PlayerInventoryComponent->InventoryCurrentCapacity;
if ((LocItemQuantity + LocCurrentItemCapacity) > LocMaxItemCapacity)
{
//Would make capacity over max so do not add
UE_LOG(LogTemp, Warning, TEXT("Thought it was too much"));
}
else if ((LocItemQuantity + LocCurrentItemCapacity) <= LocMaxItemCapacity)
{
//Would not go over max capacity so add item
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
UE_LOG(LogTemp, Warning, TEXT("Attempted Add"));
InteractingActor->Destroy();
}
else {
//Some weird edgcase where it would not exeed or be less than
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
UE_LOG(LogTemp, Warning, TEXT("Attempted Add"));
InteractingActor->Destroy();
}
}
break;
case EInventoryCapType::TotalItemsPerCategory:
for (int32 i = 0; i < ObjectItemInfoArray.Num(); i++)
{
FBaseItemInfo* LocItemInfo = ObjectItemInfoArray[i].ItemDataTableAndRow.DataTable->FindRow<FBaseItemInfo>(ObjectItemInfoArray[i].ItemDataTableAndRow.RowName, FString("Interaction Request"));
int32 LocItemQuantity = ObjectItemInfoArray[i].QuantityOfItem;
TMap<EItemType, int32> LocInventoryCapacityMap = PlayerInventoryComponent->InventoryCapacityPerCategory;
EItemType LocItemType = LocItemInfo->ItemType;
int32* LocCategoryMaxCapacity = LocInventoryCapacityMap.Find(LocItemType);
int32 LocCategoryCurrentCapacity = PlayerInventoryComponent->GetAllInventoryItemsInCategory(LocItemType).Num();
if ((LocItemQuantity + LocCategoryCurrentCapacity) > *LocCategoryMaxCapacity)
{
//Item would exceed category max so do not add
}
else if ((LocItemQuantity + LocCategoryCurrentCapacity) <= *LocCategoryMaxCapacity)
{
//Item would not exceed category max so add and update capacity
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
InteractingActor->Destroy();
}
}
break;
default:
UE_LOG(LogTemp, Warning, TEXT("Default Case Entered"));
break;
}
}
else {
UE_LOG(LogTemp, Warning, TEXT("Implement AddItem"));
// Add item for each item defined in the item array on the component
for (const FStartingItems& DTRow : ObjectItemInfoArray)
{
FBaseItemInfo* LocItemInfo = DTRow.ItemDataTableAndRow.DataTable->FindRow<FBaseItemInfo>(DTRow.ItemDataTableAndRow.RowName, FString("Interaction Request"));
int32 LocItemQuantity = DTRow.QuantityOfItem;
PlayerInventoryComponent->RequestAddItem(*LocItemInfo, LocItemQuantity);
UE_LOG(LogTemp, Warning, TEXT("Attempted Add"));
InteractingActor->Destroy();
}
}
InteractingActor->Destroy();
}
}
UAC_PlayerStats* UBPFL_EpicInventory::GetPlayerStatsComponent(UObject* WorldContextObject)
{
UAC_PlayerStats* PlayerStatsComponent(nullptr);
APawn* PlayerPawn = WorldContextObject->GetWorld()->GetFirstPlayerController()->GetPawn();
if (PlayerPawn)
{
PlayerStatsComponent = PlayerPawn->FindComponentByClass<UAC_PlayerStats>();
if (PlayerStatsComponent)
{
return PlayerStatsComponent;
}
else {
return PlayerStatsComponent;
}
}
else {
return PlayerStatsComponent;
}
}

View File

@@ -33,6 +33,9 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory Configuration", meta = (EditCondition = "InventoryCapType == EInventoryCapType::TotalItems", EditConditionHides))
int32 InventoryMaxCapacity = 100;
UPROPERTY(BlueprintReadWrite)
int32 InventoryCurrentCapacity = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory Configuration", meta = (EditCondition = "InventoryCapType == EInventoryCapType::PerCat", EditConditionHides))
TMap<EItemType, int32> InventoryCapacityPerCategory;
@@ -49,6 +52,12 @@ public:
UFUNCTION(BlueprintCallable)
void RequestAddItem(FBaseItemInfo InItemInfo, int32 InItemQuantity);
UFUNCTION(BlueprintCallable)
TArray<FBaseItemInfo> GetAllInventoryItemsInCategory(EItemType InItemType);
UFUNCTION(BlueprintCallable)
EInventoryCapType GetInventoryCapType();
protected:

View File

@@ -44,7 +44,7 @@ public:
void InitializePlayerStats();
UFUNCTION(BlueprintCallable)
float UpdateCurrentCarryWeight(float& InCurrentCarryWeight);
void UpdateCurrentCarryWeight();
protected:
// Called when the game starts

View File

@@ -9,7 +9,7 @@
//Forward Declarations
class UAC_PlayerInventory;
class UAC_InventoryItem;
class UAC_PlayerStats;
/**
*
*/
@@ -27,5 +27,9 @@ public:
//Request interaction with the player quest component
UFUNCTION(BlueprintCallable, Category = "Inventory Interaction")
static void RequestInteraction(AActor* InteractingActor);
UFUNCTION(BlueprintCallable, Category = "Player Stat Getters")
static UAC_PlayerStats* GetPlayerStatsComponent(UObject* WorldContextObject);
};

View File

@@ -90,8 +90,8 @@ enum class EInventoryCapType : uint8
{
None UMETA(DisplayName = "None"),
Weight UMETA(DisplayName = "Weight"),
TotalItems UMETA(DisplayName = "Total Items"),
PerCat UMETA(DisplayName = "Total Items per Category")
TotalItems UMETA(DisplayName = "TotalItems"),
TotalItemsPerCategory UMETA(DisplayName = "TotalItemsPerCategory")
};