// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Subsystems/GameInstanceSubsystem.h" #include "../../Quest/QuestTypes.h" #include "QuestManager.generated.h" class UQuestAsset; /** * 任务运行时数据 */ USTRUCT(BlueprintType) struct FQuestRuntimeData { GENERATED_BODY() /** 任务资产引用 */ UPROPERTY(BlueprintReadOnly) TObjectPtr QuestAsset; /** 任务状态 */ UPROPERTY(BlueprintReadWrite) EQuestState State = EQuestState::NotStarted; /** 目标进度 */ UPROPERTY(BlueprintReadWrite) TArray ObjectiveProgress; }; // 任务事件委托 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnQuestStateChanged, int32, QuestID); DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnQuestObjectiveUpdated, int32, QuestID, int32, ObjectiveIndex); /** * 任务管理器子系统 * 负责管理所有任务的状态、进度和存档 */ UCLASS() class PROJECTFISH_API UQuestManager : public UGameInstanceSubsystem { GENERATED_BODY() public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; // ========== 任务操作 ========== /** 加载本地所有任务 */ void LoadAllQuests(); /** 检测所有可接收的任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") void CheckAcceptableQuests(); /** 接受任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") bool AcceptQuest(UQuestAsset* QuestAsset); /** 接受任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") bool FollowQuest(int32 QuestID, bool Follow); /** 完成任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") bool CompleteQuest(int32 QuestID); /** 放弃任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") bool AbandonQuest(int32 QuestID); // ========== 任务进度 ========== /** 更新任务目标进度(收集物品、击败敌人、到达地点) */ UFUNCTION(BlueprintCallable, Category = "Quest") void UpdateObjectiveProgress(int32 QuestID, int32 ObjectiveIndex, int32 Progress); /** 通过目标ID更新进度(自动查找对应目标) */ UFUNCTION(BlueprintCallable, Category = "Quest") void UpdateObjectiveByTargetID(FName TargetID, int32 ProgressDelta = 1); // ========== 任务查询 ========== /** 获取任务状态 */ UFUNCTION(BlueprintPure, Category = "Quest") EQuestState GetQuestState(int32 QuestID) const; /** 任务是否正在被追踪 */ UFUNCTION(BlueprintPure, Category = "Quest") bool IsQuestFollowing(int32 QuestID) const; /** 获取所有进行中的任务 */ UFUNCTION(BlueprintPure, Category = "Quest") TArray GetActiveQuests() const; /** 获取所有已完成的任务 */ UFUNCTION(BlueprintPure, Category = "Quest") TArray GetCompletedQuests() const; /** 获取任务进度 */ UFUNCTION(BlueprintPure, Category = "Quest") bool GetQuestProgress(int32 QuestID, TArray& OutProgress) const; /** 检查是否可以接受任务(前置任务检查) */ UFUNCTION(BlueprintPure, Category = "Quest") bool CanAcceptQuest(UQuestAsset* QuestAsset) const; // ========== 存档相关 ========== /** 获取所有任务的存档数据 */ UFUNCTION(BlueprintCallable, Category = "Quest") TArray GetQuestSaveData() const; /** 从存档数据加载任务 */ UFUNCTION(BlueprintCallable, Category = "Quest") void LoadFromSaveData(const TArray& SaveData); // ========== 事件 ========== /** 任务状态改变事件 */ UPROPERTY(BlueprintAssignable, Category = "Quest|Events") FOnQuestStateChanged OnQuestStateChanged; /** 任务目标更新事件 */ UPROPERTY(BlueprintAssignable, Category = "Quest|Events") FOnQuestObjectiveUpdated OnQuestObjectiveUpdated; protected: /** 检查任务是否完成 */ void CheckQuestCompletion(int32 QuestID); /** 初始化任务运行时数据 */ FQuestRuntimeData CreateRuntimeData(UQuestAsset* QuestAsset); private: /** 运行时任务数据映射 (QuestID -> RuntimeData) */ UPROPERTY() TMap ActiveQuestsMap; /** 正在追踪的任务列表 */ UPROPERTY() TSet FollowingQuestIDs; /** 已完成的任务ID列表 */ UPROPERTY() TSet CompletedQuestIDs; UPROPERTY() TArray QuestAssets; };