第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

@@ -0,0 +1,270 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Net/Serialization/FastArraySerializer.h"
#include "UObject/Object.h"
#include "GIS_EquipmentStructLibrary.generated.h"
USTRUCT(BlueprintType)
struct GENERICINVENTORYSYSTEM_API FGIS_EquipmentActorToSpawn
{
GENERATED_BODY()
FGIS_EquipmentActorToSpawn()
{
}
/**
* Actor class must implements GIS_EquipmentActorInterface!
*/
UPROPERTY(EditAnywhere, BlueprintReadonly, Category = Equipment, meta=(MustImplement="/Script/GenericInventorySystem.GIS_EquipmentActorInterface"))
TSoftClassPtr<AActor> ActorToSpawn;
/**
* If the spawned actor will attach to equipment owner?
*/
UPROPERTY(EditAnywhere, Category = Equipment)
bool bShouldAttach{true};
/**
* The socket to attach to.
*/
UPROPERTY(EditAnywhere, Category = Equipment, meta = (EditCondition = "bShouldAttach", EditConditionHides))
FName AttachSocket;
/**
* The relative transform to attach to.
*/
UPROPERTY(EditAnywhere, Category = Equipment, meta = (EditCondition = "bShouldAttach", EditConditionHides))
FTransform AttachTransform;
};
class UGIS_ItemInstance;
class UGIS_EquipmentInstance;
class UGIS_EquipItemInstance;
class UGIS_ItemDefinition;
class UGIS_EquipmentSystemComponent;
struct FGIS_EquipmentContainer;
/**
* Structure representing an equipment entry in the container.
* 表示容器中装备条目的结构体。
*/
USTRUCT()
struct GENERICINVENTORYSYSTEM_API FGIS_EquipmentEntry : public FFastArraySerializerItem
{
GENERATED_BODY()
/**
* Default constructor for equipment entry.
* 装备条目的默认构造函数。
*/
FGIS_EquipmentEntry()
{
}
/**
* Gets a debug string representation of the equipment entry.
* 获取装备条目的调试字符串表示。
* @return The debug string. 调试字符串。
*/
FString GetDebugString() const;
private:
friend FGIS_EquipmentContainer;
friend UGIS_EquipmentSystemComponent;
/**
* The equipment instance.
* 装备实例。
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment", meta = (ShowInnerProperties))
TObjectPtr<UObject> Instance = nullptr;
/**
* The item instance associated with this equipment.
* 与此装备关联的道具实例。
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment")
TObjectPtr<UGIS_ItemInstance> ItemInstance{nullptr};
/**
* The slot where the equipment is equipped.
* 装备所在的装备槽。
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment")
FGameplayTag EquippedSlot;
/**
* Which group the equipment belongs to.
* 此装备属于哪个组?
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment")
FGameplayTag EquippedGroup;
/**
* Indicates whether the equipment is active.
* 指示装备是否处于激活状态。
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment")
bool bActive{false};
/**
* Previous active state (not replicated).
* 上一个激活状态(不复制)。
*/
UPROPERTY(VisibleAnywhere, Category = "Equipment", NotReplicated)
bool bPrevActive = false;
UPROPERTY(VisibleAnywhere, Category = "Equipment", NotReplicated)
FGameplayTag PrevEquippedGroup;
bool CheckClientDataReady() const;
/**
* Checks if the equipment entry is valid.
* 检查装备条目是否有效。
* @return True if the entry is valid, false otherwise. 如果条目有效则返回true否则返回false。
*/
bool IsValidEntry() const;
};
/**
* Container for a list of applied equipment.
* 存储已应用装备列表的容器。
*/
USTRUCT()
struct GENERICINVENTORYSYSTEM_API FGIS_EquipmentContainer : public FFastArraySerializer
{
GENERATED_BODY()
/**
* Default constructor for equipment container.
* 装备容器的默认构造函数。
*/
FGIS_EquipmentContainer()
: OwningComponent(nullptr)
{
}
/**
* Constructor for equipment container with an owning component.
* 使用所属组件构造装备容器。
* @param InComponent The owning equipment system component. 所属的装备系统组件。
*/
FGIS_EquipmentContainer(UGIS_EquipmentSystemComponent* InComponent)
: OwningComponent(InComponent)
{
}
//~FFastArraySerializer contract
/**
* Called before equipment entries are removed during replication.
* 复制期间在移除装备条目前调用。
* @param RemovedIndices The indices of removed entries. 移除条目的索引。
* @param FinalSize The final size of the array after removal. 移除后数组的最终大小。
*/
void PreReplicatedRemove(const TArrayView<int32> RemovedIndices, int32 FinalSize);
/**
* Called after equipment entries are added during replication.
* 复制期间在添加装备条目后调用。
* @param AddedIndices The indices of added entries. 添加条目的索引。
* @param FinalSize The final size of the array after addition. 添加后数组的最终大小。
*/
void PostReplicatedAdd(const TArrayView<int32> AddedIndices, int32 FinalSize);
/**
* Called after equipment entries are changed during replication.
* 复制期间在装备条目更改后调用。
* @param ChangedIndices The indices of changed entries. 更改条目的索引。
* @param FinalSize The final size of the array after changes. 更改后数组的最终大小。
*/
void PostReplicatedChange(const TArrayView<int32> ChangedIndices, int32 FinalSize);
//~End of FFastArraySerializer contract
/**
* Handles delta serialization for the equipment container.
* 处理装备容器的增量序列化。
* @param DeltaParms The serialization parameters. 序列化参数。
* @return True if serialization was successful, false otherwise. 如果序列化成功则返回true否则返回false。
*/
bool NetDeltaSerialize(FNetDeltaSerializeInfo& DeltaParms)
{
return FastArrayDeltaSerialize<FGIS_EquipmentEntry, FGIS_EquipmentContainer>(Entries, DeltaParms, *this);
}
int32 IndexOfBySlot(const FGameplayTag& Slot) const;
//check if any equipment's group matches this group.
int32 IndexOfByGroup(const FGameplayTag& Group) const;
int32 IndexOfByInstance(const UObject* Instance) const;
int32 IndexOfByItem(const UGIS_ItemInstance* Item) const;
int32 IndexOfByItemId(const FGuid& ItemId) const;
/**
* Replicated list of equipment entries.
* 复制的装备条目列表。
*/
UPROPERTY(VisibleAnywhere, Category = "EquipmentSystem", meta = (ShowOnlyInnerProperties, DisplayName = "Equipments"))
TArray<FGIS_EquipmentEntry> Entries;
/**
* The equipment system component that owns this container.
* 拥有此容器的装备系统组件。
*/
UPROPERTY()
TObjectPtr<UGIS_EquipmentSystemComponent> OwningComponent;
};
/**
* Template specialization to enable network delta serialization for the equipment container.
* 为装备容器启用网络增量序列化的模板特化。
*/
template <>
struct TStructOpsTypeTraits<FGIS_EquipmentContainer> : TStructOpsTypeTraitsBase2<FGIS_EquipmentContainer>
{
enum
{
WithNetDeltaSerializer = true
};
};
/**
* Structure representing a group active index entry.
* 表示组激活索引条目的结构体。
*/
USTRUCT()
struct GENERICINVENTORYSYSTEM_API FGIS_EquipmentGroupEntry : public FFastArraySerializerItem
{
GENERATED_BODY()
/**
* The group tag.
* 组标签。
*/
UPROPERTY(VisibleAnywhere, Category = "EquipmentGroup")
FGameplayTag GroupTag;
/**
* The active slot within the group.
* 组内的激活槽位。
*/
UPROPERTY(VisibleAnywhere, Category = "EquipmentGroup")
FGameplayTag ActiveSlot;
UPROPERTY(NotReplicated)
FGameplayTag LastSlot;
/**
* Checks if the entry is valid.
* 检查条目是否有效。
*/
bool IsValid() const { return GroupTag.IsValid(); }
};