// 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 Icon; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual") TSoftObjectPtr WorldMesh; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual") TSoftClassPtr PickupActorClass; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual") TSoftClassPtr 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); } };