Add item pickup actor
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user