Add item pickup actor

This commit is contained in:
2026-05-17 00:55:16 -07:00
parent c511ae904a
commit 03d856efbf
5 changed files with 197 additions and 1 deletions
@@ -0,0 +1,76 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianItemPickup.h"
#include "AgrarianGameCharacter.h"
#include "AgrarianInventoryComponent.h"
#include "AgrarianItemDefinitionAsset.h"
#include "Components/StaticMeshComponent.h"
AAgrarianItemPickup::AAgrarianItemPickup()
{
bReplicates = true;
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
RootComponent = Mesh;
Mesh->SetCollisionProfileName(TEXT("BlockAll"));
PickupStack.ItemId = TEXT("wood");
PickupStack.DisplayName = FText::FromString(TEXT("Wood"));
PickupStack.Quantity = 1;
PickupStack.UnitWeight = 1.0f;
InteractionVerb = FText::FromString(TEXT("Pick up"));
}
FText AAgrarianItemPickup::GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const
{
const FAgrarianItemStack Stack = MakePickupStack();
const FText DisplayName = Stack.DisplayName.IsEmpty() ? FText::FromName(Stack.ItemId) : Stack.DisplayName;
const FString Verb = InteractionVerb.IsEmpty() ? FString(TEXT("Pick up")) : InteractionVerb.ToString();
if (Stack.Quantity > 1)
{
return FText::FromString(FString::Printf(TEXT("%s %s x%d"), *Verb, *DisplayName.ToString(), Stack.Quantity));
}
return FText::FromString(FString::Printf(TEXT("%s %s"), *Verb, *DisplayName.ToString()));
}
bool AAgrarianItemPickup::CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const
{
return Interactor != nullptr && MakePickupStack().IsValidStack();
}
void AAgrarianItemPickup::Interact_Implementation(AAgrarianGameCharacter* Interactor)
{
if (!HasAuthority() || !Interactor)
{
return;
}
UAgrarianInventoryComponent* Inventory = Interactor->GetInventoryComponent();
if (!Inventory)
{
return;
}
const FAgrarianItemStack Stack = MakePickupStack();
if (Inventory->AddItem(Stack))
{
Destroy();
}
}
FAgrarianItemStack AAgrarianItemPickup::MakePickupStack() const
{
if (ItemDefinition)
{
return ItemDefinition->MakeStack(Quantity);
}
FAgrarianItemStack Stack = PickupStack;
if (Quantity > 0)
{
Stack.Quantity = Quantity;
}
return Stack;
}
+44
View File
@@ -0,0 +1,44 @@
// Copyright Pacificao. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AgrarianInteractable.h"
#include "AgrarianTypes.h"
#include "AgrarianItemPickup.generated.h"
class AAgrarianGameCharacter;
class UAgrarianItemDefinitionAsset;
class UStaticMeshComponent;
UCLASS(Blueprintable)
class AGRARIANGAME_API AAgrarianItemPickup : public AActor, public IAgrarianInteractable
{
GENERATED_BODY()
public:
AAgrarianItemPickup();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Pickup")
TObjectPtr<UStaticMeshComponent> Mesh;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Pickup")
FAgrarianItemStack PickupStack;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Pickup")
TObjectPtr<UAgrarianItemDefinitionAsset> ItemDefinition;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Pickup", meta = (ClampMin = "1"))
int32 Quantity = 1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Pickup")
FText InteractionVerb;
virtual FText GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const override;
virtual bool CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const override;
virtual void Interact_Implementation(AAgrarianGameCharacter* Interactor) override;
UFUNCTION(BlueprintCallable, Category = "Agrarian|Pickup")
FAgrarianItemStack MakePickupStack() const;
};