Files
PHY/Plugins/GIS/Source/GenericInventorySystem/Private/Drops/GIS_ItemDropperComponent.cpp
2026-03-03 01:23:02 +08:00

109 lines
3.1 KiB
C++

// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#include "Drops/GIS_ItemDropperComponent.h"
#include "GIS_InventoryTags.h"
#include "GameFramework/Actor.h"
#include "GIS_InventorySystemComponent.h"
#include "GIS_ItemCollection.h"
#include "GIS_LogChannels.h"
#include "Pickups/GIS_InventoryPickupComponent.h"
#include "Pickups/GIS_ItemPickupComponent.h"
#include "Pickups/GIS_WorldItemComponent.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(GIS_ItemDropperComponent)
void UGIS_ItemDropperComponent::Drop()
{
TArray<FGIS_ItemInfo> ItemsToDrop = GetItemsToDrop();
DropItemsInternal(ItemsToDrop);
}
void UGIS_ItemDropperComponent::BeginPlay()
{
if (!CollectionTag.IsValid())
{
CollectionTag = GIS_CollectionTags::Main;
}
Super::BeginPlay();
}
TArray<FGIS_ItemInfo> UGIS_ItemDropperComponent::GetItemsToDrop() const
{
return GetItemsToDropInternal();
}
TArray<FGIS_ItemInfo> UGIS_ItemDropperComponent::GetItemsToDropInternal() const
{
TArray<FGIS_ItemInfo> Items;
UGIS_InventorySystemComponent* Inventory = UGIS_InventorySystemComponent::FindInventorySystemComponent(GetOwner());
if (Inventory == nullptr)
{
GIS_CLOG(Error, "requires inventory system component to drop items.")
return Items;
}
UGIS_ItemCollection* Collection = Inventory->GetCollectionByTag(CollectionTag);
if (Collection == nullptr)
{
GIS_CLOG(Error, " inventory missing collection with tag:%s'", *CollectionTag.ToString())
return Items;
}
Items = Collection->GetAllItemInfos();
return Items;
}
void UGIS_ItemDropperComponent::DropItemsInternal(const TArray<FGIS_ItemInfo>& ItemInfos)
{
if (bDropAsInventory)
{
DropInventoryPickup(ItemInfos);
}
else
{
for (int32 i = 0; i < ItemInfos.Num(); i++)
{
DropItemPickup(ItemInfos[i]);
}
}
}
void UGIS_ItemDropperComponent::DropInventoryPickup(const TArray<FGIS_ItemInfo>& ItemInfos)
{
if (AActor* PickupActor = CreatePickupActorInstance())
{
UGIS_InventorySystemComponent* Inventory = PickupActor->FindComponentByClass<UGIS_InventorySystemComponent>();
UGIS_InventoryPickupComponent* Pickup = PickupActor->FindComponentByClass<UGIS_InventoryPickupComponent>();
if (Inventory == nullptr || Pickup == nullptr)
{
GIS_CLOG(Error, "Spawned pickup(%s) missing either inventory component or inventory pickup component.", *PickupActor->GetName());
return;
}
UGIS_ItemCollection* Collection = Inventory->GetDefaultCollection();
if (Collection == nullptr)
{
GIS_CLOG(Error, "Spawned pickup(%s)'s inventory doesn't have default collection.", *PickupActor->GetName());
return;
}
Collection->RemoveAll();
Collection->AddItems(ItemInfos);
}
}
void UGIS_ItemDropperComponent::DropItemPickup(const FGIS_ItemInfo& ItemInfo)
{
if (AActor* Pickup = CreatePickupActorInstance())
{
UGIS_ItemPickupComponent* ItemPickup = Pickup->FindComponentByClass<UGIS_ItemPickupComponent>();
UGIS_WorldItemComponent* WorldItem = Pickup->FindComponentByClass<UGIS_WorldItemComponent>();
if (ItemPickup == nullptr || WorldItem == nullptr)
{
GIS_CLOG(Error, "Spawned pickup(%s) missing either ItemPickup component or WorldItem component.", *Pickup->GetName());
}
WorldItem->SetItemInfo(ItemInfo.Item, ItemInfo.Amount);
}
}