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>
113 lines
3.7 KiB
C++
113 lines
3.7 KiB
C++
// Copyright ExByte Studios. Item Interaction Ecosystem.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Engine/DataTable.h"
|
|
#include "GameplayTagContainer.h"
|
|
#include "ItemPlacementRules.h"
|
|
#include "ItemDefinitionRow.generated.h"
|
|
|
|
class UTexture2D;
|
|
class UStaticMesh;
|
|
|
|
/**
|
|
* Static, design-time data for an item type (section 4.2 / 6.1 DT_Items).
|
|
*
|
|
* One row per ItemId. Assets are soft references so the database never force-loads
|
|
* meshes/icons just to answer a flag query (section 33). Never replicated; never
|
|
* saved - only the ItemId travels in FItemInstanceData.
|
|
*/
|
|
USTRUCT(BlueprintType)
|
|
struct ITEMDATABASE_API FItemDefinitionRow : public FTableRowBase
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity")
|
|
FName ItemId;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity")
|
|
FText DisplayName;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity", meta = (MultiLine = true))
|
|
FText Description;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity")
|
|
FGameplayTag ItemType;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Identity")
|
|
FGameplayTagContainer ItemTags;
|
|
|
|
// --- Visuals (soft refs, section 33) ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual")
|
|
TSoftObjectPtr<UTexture2D> Icon;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual")
|
|
TSoftObjectPtr<UStaticMesh> WorldMesh;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual")
|
|
TSoftClassPtr<AActor> PickupActorClass;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual")
|
|
TSoftClassPtr<AActor> EquippedActorClass;
|
|
|
|
// --- Stacking / weight / grid ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stack", meta = (ClampMin = "1"))
|
|
int32 MaxStack = 1;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stack", meta = (ClampMin = "0"))
|
|
float Weight = 0.f;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stack")
|
|
FIntPoint GridSize = FIntPoint(1, 1);
|
|
|
|
// --- Capability flags (section 4.2) ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanStoreInInventory = true;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanInstantPickup = true;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanWorldCarry = false;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanEquip = false;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanPlace = false;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanInstallIntoWorldSlot = false;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bCanDrop = true;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Capabilities")
|
|
bool bIsQuestCritical = false;
|
|
|
|
// --- Interaction defaults ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction")
|
|
FGameplayTag DefaultInteraction;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Interaction")
|
|
FGameplayTag AlternativeInteraction;
|
|
|
|
// --- Slot compatibility ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Slots")
|
|
FGameplayTagContainer AllowedEquipmentSlots;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Slots")
|
|
FGameplayTagContainer CompatibleWorldSlots;
|
|
|
|
// --- Features ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Features")
|
|
FGameplayTagContainer ItemFeatures;
|
|
|
|
// --- Placement (section 13.3); only meaningful when bCanPlace ---
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Placement", meta = (EditCondition = "bCanPlace"))
|
|
FItemPlacementRules PlacementRules;
|
|
|
|
bool HasFeature(const FGameplayTag& Feature) const { return ItemFeatures.HasTag(Feature); }
|
|
};
|