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>
This commit is contained in:
82
Source/ItemWorld/Public/PickupItemActor.h
Normal file
82
Source/ItemWorld/Public/PickupItemActor.h
Normal file
@ -0,0 +1,82 @@
|
||||
// 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();
|
||||
};
|
||||
Reference in New Issue
Block a user