Files
inventory-system-plugin/Source/ItemWorld/Public/PickupItemActor.h
Bonchellon 7f7e043a88 Initial commit: Item Interaction Ecosystem plugin (UE5.7)
Server-authoritative, data-driven item/inventory/interaction/carry/equipment/
world-slot/placement/crafting framework. 8 modules, compiles against UE 5.7.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:49:56 +03:00

83 lines
3.0 KiB
C++

// Copyright ExByte Studios. Item Interaction Ecosystem.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ItemInstanceData.h"
#include "ItemInteractionInterfaces.h"
#include "PickupItemActor.generated.h"
class UStaticMeshComponent;
class UInteractableComponent;
/**
* The world representation of an item lying on the ground / a surface (section 12).
*
* One actor per world item only (never one per inventory item - section 32/34).
* Implements IWorldItemProvider so the interaction layer can pick it up, carry it
* or take part of its stack without ItemWorld <-> ItemInteraction coupling.
*/
UCLASS()
class ITEMWORLD_API APickupItemActor : public AActor, public IWorldItemProvider
{
GENERATED_BODY()
public:
APickupItemActor();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
virtual void BeginPlay() override;
/** Server: stamp this pickup with an item and refresh its visuals. */
UFUNCTION(BlueprintCallable, Category = "Item|World")
void InitializeFromItem(const FItemInstanceData& InItem);
/** Server convenience: spawn a fresh pickup for ItemId at a transform. */
UFUNCTION(BlueprintCallable, Category = "Item|World", meta = (WorldContext = "WorldContext"))
static APickupItemActor* SpawnPickup(UObject* WorldContext, FName ItemId, int32 Quantity, const FTransform& Transform);
/** Server convenience: spawn a pickup carrying an existing instance (e.g. on drop). */
static APickupItemActor* SpawnPickupFromInstance(UObject* WorldContext, const FItemInstanceData& Item, const FTransform& Transform);
//~ IWorldItemProvider
virtual bool GetProvidedItem(FItemInstanceData& OutItem) const override;
virtual bool IsItemAvailable() const override;
virtual void NotifyItemTaken(AActor* Taker) override;
virtual void UpdateProvidedItem(const FItemInstanceData& RemainingItem) override;
virtual void SetCarried(AActor* Holder, bool bCarried) override;
/** Server: drop this carried actor back into the world at a transform. */
void ReleaseToWorld(const FTransform& WorldTransform);
UStaticMeshComponent* GetMeshComponent() const { return Mesh; }
UFUNCTION(BlueprintPure, Category = "Item|World")
const FItemInstanceData& GetItemData() const { return ItemData; }
protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item|World")
TObjectPtr<USceneComponent> Root;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item|World")
TObjectPtr<UStaticMeshComponent> Mesh;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item|World")
TObjectPtr<UInteractableComponent> Interactable;
UPROPERTY(ReplicatedUsing = OnRep_ItemData, BlueprintReadOnly, Category = "Item|World")
FItemInstanceData ItemData;
UPROPERTY(Replicated, BlueprintReadOnly, Category = "Item|World")
bool bIsLocked = false;
UPROPERTY(Replicated, BlueprintReadOnly, Category = "Item|World")
TObjectPtr<AActor> CurrentHolder = nullptr;
UFUNCTION()
void OnRep_ItemData();
/** Resolves the definition and applies WorldMesh + interactable display name. */
void RefreshVisuals();
};