Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
StageManagementSubsystem.h
이 파일의 문서화 페이지로 가기
1#pragma once
2#include "CK_UE.h"
7#include "Subsystems/WorldSubsystem.h"
8#include "StageManagementSubsystem.generated.h"
9
10
11struct TargetableQuery;
13struct FStoryboardEntry;
16class UStageEventListenerComponent;
20
21
23
24DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnNextWaveCountdownStopped);
25
26DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemyRemainingCountChanged, int32, RemainingCount);
27
28DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnNextWaveCountdownStarted, float, SecondsRemaining);
29
30DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnWaveManagerReadyToSpawning, const FWaveDataCollection&, WaveDataCollection);
31
32DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnWaveStarted, const FWaveDataCollection&, WaveDataCollection, const int32, CurrentWaveIndex);
33
34DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnWaveCleared, const FWaveDataCollection&, WaveDataCollection, const int32, ClearedWaveIndex, const int32, NextWaveIndex);
35
36
37USTRUCT(BlueprintType)
39{
40 GENERATED_BODY()
41
42public:
44 {
45 CurrentWaveRemainingEnemyCount += FMath::Max(Count, 0);
46 }
47
49 {
50 CurrentWaveRemainingEnemyCount = FMath::Max(CurrentWaveRemainingEnemyCount - FMath::Max(Count, 0), 0);
51 }
52
53 void SetCurrentStageID(const FName InStageID)
54 {
55 CurrentStageID = InStageID;
56 }
57
58 void SetNextWaveCountdownEndTime(const float InEndTime)
59 {
60 NextWaveCountdownEndTime = InEndTime;
61 }
62
63 void SetCurrentWaveRemainingEnemyCount(const int32 Count)
64 {
65 CurrentWaveRemainingEnemyCount = FMath::Max(Count, 0);
66 }
67
68 void Reset()
69 {
70 CurrentStageID = NAME_None;
71 NextWaveCountdownEndTime = 0.0f;
72 CurrentWaveRemainingEnemyCount = 0;
73 }
74
75public:
76 FORCEINLINE FName GetCurrentStageID() const
77 {
78 return CurrentStageID;
79 }
80
81 FORCEINLINE float GetNextWaveCountdownEndTime() const
82 {
83 return NextWaveCountdownEndTime;
84 }
85
86 FORCEINLINE int32 GetCurrentWaveRemainingEnemyCount() const
87 {
88 return CurrentWaveRemainingEnemyCount;
89 }
90
91private:
92 UPROPERTY(Transient)
93 FName CurrentStageID = NAME_None;
94
95 UPROPERTY(Transient)
96 float NextWaveCountdownEndTime = 0.f;
97
98 UPROPERTY(Transient)
99 int32 CurrentWaveRemainingEnemyCount = 0;
100};
101
102
103USTRUCT(Blueprintable, BlueprintType)
105{
106 GENERATED_BODY()
107
108public:
109 FStageManagementHandle(UStageManagementSubsystem* StageManagementSubsystem);
111
112public:
113 void ResumeSpawning() const
114 {
115 SetSpawningEnabled(true);
116 }
117
118 void PauseSpawning() const
119 {
120 SetSpawningEnabled(false);
121 }
122
123private:
124 void SetSpawningEnabled(bool bEnabled) const;
125
126public:
127 UPROPERTY(BlueprintAssignable, Category = "Wave")
128 FOnWaveStarted OnWaveStarted;
129
130 UPROPERTY(BlueprintAssignable, Category = "Wave")
131 FOnWaveCleared OnWaveCleared;
132
133 UPROPERTY(BlueprintAssignable, Category = "Wave")
134 FOnAllWavesCleared OnAllWavesCleared;
135
136 UPROPERTY(BlueprintAssignable, Category = "Enemy")
137 FOnSpawnedEnemyKilled OnSpawnedEnemyKilled;
138
139private:
140 UPROPERTY(Transient)
141 TObjectPtr<UStageManagementSubsystem> StageManagementSubsystem;
142};
143
144
145UCLASS()
146class CK_UE_API UStageManagementSubsystem : public UWorldSubsystem, public IStreamingEventListenerInterface
147{
148 GENERATED_BODY()
149
150public:
151 virtual void Deinitialize() override;
152 virtual void OnLevelLoaded(ULevel* NewLevel, const ULevelStreamingData* LevelStreamingData) override;
153 virtual void OnLevelUnloaded() override;
154 virtual void OnLevelStreamingStarted() override { }
155 virtual void OnLevelStreamingEnded() override { }
156
157 void SetCurrentWaveRemainingEnemyCount(int32 Count);
158 void IncreaseCurrentWaveRemainingEnemyCount(int32 Count);
159 void DecreaseCurrentWaveRemainingEnemyCount(int32 Count = 1);
160 void NotifyNextWaveCountdownStarted(float Duration);
161 void NotifyNextWaveCountdownStopped();
162
163 ASpawnHub* GetOrCreateSpawnHub();
164 TargetableQuery GetStageTargetableQueryHandle() const;
165
166public:
167 UFUNCTION(BlueprintPure, Category = "Stage|Enemy")
168 int32 GetTotalSpawnRemainingCount() const;
169
170 UFUNCTION(BlueprintPure, Category = "Stage|Enemy")
171 int32 GetCurrentWaveRemainingEnemyCount() const;
172
173 UFUNCTION(BlueprintPure, Category = "Stage|Enemy")
174 int32 GetSpawnedEnemyCount() const;
175
176 UFUNCTION(BlueprintCallable, Category = "Stage|Enemy")
177 void NotifyEnemyRemainingCountChanged();
178
179 UFUNCTION(BlueprintPure, Category = "Stage|Wave")
180 float GetNextWaveCountdownRemainingTime() const;
181
182 UFUNCTION(BlueprintPure, Category = "Stage|Wave")
183 bool IsNextWaveCountdownActive() const;
184
185 UFUNCTION(BlueprintPure, Category = "Stage")
186 FStageManagementHandle GetStageManagementHandle();
187
188public:
189 void RegisterListener(const FName EventID, UStageEventListenerComponent* Listener);
190 void UnregisterListener(const FName EventID, UStageEventListenerComponent* Listener);
191 void DispatchStageEvent(const FName EventID, const AActor* Caller, const AActor* Sender);
192
193 int32 GetProcessorTriggerCount(const UStageEventProcessor* Processor) const;
194 int32 IncrementProcessorTriggerCount(const UStageEventProcessor* Processor);
195 int32 DecrementProcessorTriggerCount(const UStageEventProcessor* Processor);
196 void NotifyProcessorTriggered(const FName EventID, const AActor* Caller, const UStageEventProcessor* Processor);
197
198 FName GetLastPlayerTriggeredEventID() const;
199 bool RollbackLastPlayerTriggeredProcessorCounts(const FName EventID);
200
201public:
202 UFUNCTION(BlueprintCallable, Category = "StageEvent")
203 void ResetProcessorTriggerCount(UStageEventProcessor* Processor);
204
205 UFUNCTION(BlueprintCallable, Category = "StageEvent")
206 void ResetAllProcessorTriggerCounts();
207
208public:
209 UFUNCTION(BlueprintPure, Category = "Stage")
210 FORCEINLINE ASpawnHub* GetSpawnHub() const
211 {
212 return SpawnHub;
213 }
214
215 FORCEINLINE FName GetCurrentStageID() const
216 {
217 return StageProgress.GetCurrentStageID();
218 }
219
220public:
221 template <CSpawnSystem TSpawnSystem>
222 TSpawnSystem* GetOrCreateSpawnSystem();
223
224private:
225 bool EnsureStageDictionaryLoaded();
226 const FStoryboardEntry* ResolveEntry(const FName EventID) const;
227 const UStoryboardDefinition* ResolveStoryboard() const;
228 bool IsPlayerEventCaller(const AActor* Caller) const;
229 FStageEventContext BuildStageEventContext(FName EventID);
230
231public:
232 UPROPERTY(BlueprintAssignable, Category = "Wave")
233 FOnWaveManagerReadyToSpawning ReadyToSpawn;
234
235 UPROPERTY(BlueprintAssignable, Category = "Wave")
236 FOnWaveStarted OnWaveStarted;
237
238 UPROPERTY(BlueprintAssignable, Category = "Wave")
239 FOnWaveCleared OnWaveCleared;
240
241 UPROPERTY(BlueprintAssignable, Category = "Wave")
242 FOnAllWavesCleared OnAllWavesCleared;
243
244 UPROPERTY(BlueprintAssignable, Category = "Enemy")
245 FOnSpawnedEnemyKilled OnSpawnedEnemyKilled;
246
247 UPROPERTY(BlueprintAssignable, Category = "Enemy")
248 FOnEnemyRemainingCountChanged OnEnemyRemainingCountChanged;
249
250 UPROPERTY(BlueprintAssignable, Category = "Wave")
251 FOnNextWaveCountdownStarted OnNextWaveCountdownStarted;
252
253 UPROPERTY(BlueprintAssignable, Category = "Wave")
254 FOnNextWaveCountdownStopped OnNextWaveCountdownStopped;
255
256protected:
257 UPROPERTY(Transient)
258 TObjectPtr<ASpawnHub> SpawnHub;
259
260private:
261 UPROPERTY(Transient)
262 FStageProgressState StageProgress;
263
264 UPROPERTY(Transient)
265 TObjectPtr<UStageDictionary> CachedStageDictionary;
266
267 TArray<TWeakObjectPtr<const UStageEventProcessor>> LastPlayerTriggeredProcessors;
268 TMap<TWeakObjectPtr<const UStageEventProcessor>, int32> ProcessorTriggerCounts;
269 TMap<FName, TArray<TWeakObjectPtr<UStageEventListenerComponent>>> ListenersByEventID;
270
271 FName LastPlayerTriggeredEventID = NAME_None;
272 int32 PlayerTriggeredDispatchSerial = 0;
273 int32 ActivePlayerTriggeredDispatchSerial = INDEX_NONE;
274 int32 LastPlayerTriggeredDispatchSerial = INDEX_NONE;
275
276public:
278};
279
280
281template <CSpawnSystem TSpawnSystem>
282TSpawnSystem* UStageManagementSubsystem::GetOrCreateSpawnSystem()
283{
284 ASpawnHub* Hub = GetOrCreateSpawnHub();
285 return Hub ? Hub->GetOrCreateSpawnSystem<TSpawnSystem>() : nullptr;
286}
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnWaveCleared, const FWaveDataCollection &, WaveDataCollection, const int32, ClearedWaveIndex, const int32, NextWaveIndex)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemyRemainingCountChanged, int32, RemainingCount)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnWaveStarted, const FWaveDataCollection &, WaveDataCollection, const int32, CurrentWaveIndex)
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAllWavesCleared)
Definition SpawnHub.h:27
UActorComponent * GetOrCreateSpawnSystem(UPARAM(meta=(MustImplement="/Script/CK_UE.SpawnSystemInterface")) TSubclassOf< UActorComponent > SpawnSystemClass)
Definition StreamingEventListenerInterface.h:23
Definition LevelStreamingData.h:19
Definition StageDictionary.h:14
Definition StageEventProcessor.h:28
Definition StageManagementSubsystem.h:147
virtual void OnLevelStreamingEnded() override
Definition StageManagementSubsystem.h:155
virtual void OnLevelStreamingStarted() override
Definition StageManagementSubsystem.h:154
FORCEINLINE FName GetCurrentStageID() const
Definition StageManagementSubsystem.h:215
Definition StoryboardDefinition.h:37
Definition SpawnHub.h:18
Definition StageEventContext.h:18
Definition StageManagementSubsystem.h:105
FStageManagementHandle()
Definition StageManagementSubsystem.h:110
void ResumeSpawning() const
Definition StageManagementSubsystem.h:113
void PauseSpawning() const
Definition StageManagementSubsystem.h:118
Definition StageManagementSubsystem.h:39
FORCEINLINE FName GetCurrentStageID() const
Definition StageManagementSubsystem.h:76
FORCEINLINE int32 GetCurrentWaveRemainingEnemyCount() const
Definition StageManagementSubsystem.h:86
void SetNextWaveCountdownEndTime(const float InEndTime)
Definition StageManagementSubsystem.h:58
void SetCurrentStageID(const FName InStageID)
Definition StageManagementSubsystem.h:53
void IncreaseCurrentWaveRemainingEnemyCount(const int32 Count)
Definition StageManagementSubsystem.h:43
void DecreaseCurrentWaveRemainingEnemyCount(const int32 Count)
Definition StageManagementSubsystem.h:48
void SetCurrentWaveRemainingEnemyCount(const int32 Count)
Definition StageManagementSubsystem.h:63
FORCEINLINE float GetNextWaveCountdownEndTime() const
Definition StageManagementSubsystem.h:81
void Reset()
Definition StageManagementSubsystem.h:68
Definition StoryboardDefinition.h:18
Definition StageManifest.h:74
Definition TargetableQuery.h:92