添加库存系统组件

This commit is contained in:
不明不惑
2026-03-05 14:44:34 +08:00
parent 70e3731c09
commit be0098782a
17 changed files with 909 additions and 12 deletions

View File

@@ -0,0 +1,62 @@
// Copyright 2026 PHY. All Rights Reserved.
#include "Items/PHYItemBlueprintLibrary.h"
#include "GIS_ItemInstance.h"
const UPHYItemFragment_PropertySet* UPHYItemBlueprintLibrary::FindPropertyFragment(const UGIS_ItemInstance* ItemInstance)
{
if (!IsValid(ItemInstance))
{
return nullptr;
}
return ItemInstance->FindFragmentByClass<UPHYItemFragment_PropertySet>();
}
EPHYItemArchetype UPHYItemBlueprintLibrary::GetItemArchetype(const UGIS_ItemInstance* ItemInstance)
{
if (const UPHYItemFragment_PropertySet* Fragment = FindPropertyFragment(ItemInstance))
{
return Fragment->ItemArchetype;
}
return EPHYItemArchetype::Material;
}
EPHYEquipSlotType UPHYItemBlueprintLibrary::GetEquipSlotType(const UGIS_ItemInstance* ItemInstance)
{
if (const UPHYItemFragment_PropertySet* Fragment = FindPropertyFragment(ItemInstance))
{
return Fragment->EquipSlot;
}
return EPHYEquipSlotType::None;
}
bool UPHYItemBlueprintLibrary::IsWeaponItem(const UGIS_ItemInstance* ItemInstance)
{
return GetItemArchetype(ItemInstance) == EPHYItemArchetype::Weapon;
}
bool UPHYItemBlueprintLibrary::IsEquipmentItem(const UGIS_ItemInstance* ItemInstance)
{
const EPHYItemArchetype Archetype = GetItemArchetype(ItemInstance);
return Archetype == EPHYItemArchetype::Weapon || Archetype == EPHYItemArchetype::Equipment;
}
bool UPHYItemBlueprintLibrary::IsConsumableItem(const UGIS_ItemInstance* ItemInstance)
{
return GetItemArchetype(ItemInstance) == EPHYItemArchetype::Consumable;
}
FPHYConsumablePayload UPHYItemBlueprintLibrary::GetConsumablePayload(const UGIS_ItemInstance* ItemInstance)
{
if (const UPHYItemFragment_PropertySet* Fragment = FindPropertyFragment(ItemInstance))
{
return Fragment->ConsumablePayload;
}
return FPHYConsumablePayload();
}

View File

@@ -0,0 +1,39 @@
// Copyright 2026 PHY. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Items/PHYItemFragment_PropertySet.h"
#include "PHYItemBlueprintLibrary.generated.h"
class UGIS_ItemInstance;
UCLASS()
class UPHYItemBlueprintLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static EPHYItemArchetype GetItemArchetype(const UGIS_ItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static EPHYEquipSlotType GetEquipSlotType(const UGIS_ItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static bool IsWeaponItem(const UGIS_ItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static bool IsEquipmentItem(const UGIS_ItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static bool IsConsumableItem(const UGIS_ItemInstance* ItemInstance);
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
static FPHYConsumablePayload GetConsumablePayload(const UGIS_ItemInstance* ItemInstance);
private:
static const UPHYItemFragment_PropertySet* FindPropertyFragment(const UGIS_ItemInstance* ItemInstance);
};

View File

@@ -0,0 +1,42 @@
// Copyright 2026 PHY. All Rights Reserved.
#include "Items/PHYItemFragment_PropertySet.h"
#include "GIS_ItemInstance.h"
void UPHYItemFragment_PropertySet::OnInstanceCreated(UGIS_ItemInstance* ItemInstance) const
{
if (!IsValid(ItemInstance))
{
return;
}
for (const FGIS_GameplayTagFloat& Modifier : BaseFloatModifiers)
{
if (Modifier.Tag.IsValid())
{
ItemInstance->SetFloatAttribute(Modifier.Tag, Modifier.Value);
}
}
for (const FGIS_GameplayTagInteger& Modifier : BaseIntegerModifiers)
{
if (Modifier.Tag.IsValid())
{
ItemInstance->SetIntegerAttribute(Modifier.Tag, Modifier.Value);
}
}
Super::OnInstanceCreated(ItemInstance);
}
bool UPHYItemFragment_PropertySet::IsEquippable() const
{
return ItemArchetype == EPHYItemArchetype::Weapon || ItemArchetype == EPHYItemArchetype::Equipment;
}
bool UPHYItemFragment_PropertySet::IsConsumable() const
{
return ItemArchetype == EPHYItemArchetype::Consumable;
}

View File

@@ -0,0 +1,88 @@
// Copyright 2026 PHY. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GIS_GameplayTagFloat.h"
#include "GIS_GameplayTagInteger.h"
#include "GIS_ItemFragment.h"
#include "PHYItemFragment_PropertySet.generated.h"
UENUM(BlueprintType)
enum class EPHYItemArchetype : uint8
{
Weapon,
Equipment,
Consumable,
Material,
Quest
};
UENUM(BlueprintType)
enum class EPHYEquipSlotType : uint8
{
None,
MainHand,
OffHand,
Head,
Chest,
Legs,
Feet,
Accessory
};
USTRUCT(BlueprintType)
struct FPHYConsumablePayload
{
GENERATED_BODY()
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Consumable")
float RestoreHealth = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Consumable")
float RestoreInnerPower = 0.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Consumable")
float DurationSeconds = 0.0f;
};
/**
* 统一道具属性片段:
* - 定义道具大类(武器/装备/药品...
* - 定义装备槽位
* - 定义创建实例时写入的动态属性(可用于随机词条前的基础值)
* - 定义药品基础效果载荷
*/
UCLASS(DisplayName="PHY Item Property Settings", Category="PHY")
class UPHYItemFragment_PropertySet : public UGIS_ItemFragment
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item")
EPHYItemArchetype ItemArchetype = EPHYItemArchetype::Material;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item")
EPHYEquipSlotType EquipSlot = EPHYEquipSlotType::None;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item", meta=(Categories="GIS.Item"))
FGameplayTagContainer ExtraItemTags;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Attributes", meta=(TitleProperty="{Tag} -> {Value}", Categories="GIS.Attribute"))
TArray<FGIS_GameplayTagFloat> BaseFloatModifiers;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Attributes", meta=(TitleProperty="{Tag} -> {Value}", Categories="GIS.Attribute"))
TArray<FGIS_GameplayTagInteger> BaseIntegerModifiers;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Consumable")
FPHYConsumablePayload ConsumablePayload;
virtual void OnInstanceCreated(UGIS_ItemInstance* ItemInstance) const override;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
bool IsEquippable() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Item")
bool IsConsumable() const;
};