KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
ANetworkBroadcastActor.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
9#include "UBroadcastManager.h"
10#include "GameLogging.h"
11#include "Net/UnrealNetwork.h"
12#include "Engine/World.h"
13
14TMap<UWorld*, ANetworkBroadcastActor*> ANetworkBroadcastActor::Instances;
15
17{
18 PrimaryActorTick.bCanEverTick = false;
19
20 // 네트워크 복제 설정
21 bReplicates = true;
22 bAlwaysRelevant = true; // 모든 클라이언트에게 항상 복제
23
24 // Root component
25 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
26}
27
28ANetworkBroadcastActor* ANetworkBroadcastActor::Get(const UObject* WorldContextObject)
29{
30 if (!WorldContextObject)
31 {
32 PRINTLOG(TEXT("NetworkBroadcastActor::Get - WorldContextObject is null"));
33 return nullptr;
34 }
35
36 UWorld* World = WorldContextObject->GetWorld();
37 if (!World)
38 {
39 PRINTLOG(TEXT("NetworkBroadcastActor::Get - World is null"));
40 return nullptr;
41 }
42
43 // 이미 존재하는 인스턴스 확인
44 if (Instances.Contains(World))
45 {
46 ANetworkBroadcastActor* Instance = Instances[World];
47 if (IsValid(Instance))
48 {
49 return Instance;
50 }
51 else
52 {
53 // 유효하지 않은 인스턴스 제거
54 Instances.Remove(World);
55 }
56 }
57
58 // 새 인스턴스 생성 (Server에서만)
59 if (World->GetAuthGameMode())
60 {
61 FActorSpawnParameters SpawnParams;
62 SpawnParams.Owner = nullptr;
63 SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
64
65 ANetworkBroadcastActor* NewInstance = World->SpawnActor<ANetworkBroadcastActor>(
66 ANetworkBroadcastActor::StaticClass(),
67 FVector::ZeroVector,
68 FRotator::ZeroRotator,
69 SpawnParams
70 );
71
72 if (NewInstance)
73 {
74 Instances.Add(World, NewInstance);
75 PRINTLOG(TEXT("NetworkBroadcastActor: Created new instance"));
76 return NewInstance;
77 }
78 else
79 {
80 PRINTLOG(TEXT("NetworkBroadcastActor: Failed to spawn actor"));
81 }
82 }
83 else
84 {
85 PRINTLOG(TEXT("NetworkBroadcastActor: Not on server, cannot create instance"));
86 }
87
88 return nullptr;
89}
90
91// ========================================
92// Door Message
93// ========================================
94
95void ANetworkBroadcastActor::SendDoorMessage(int InDoorIndex, bool bOpen, AActor* EventInstigator)
96{
97 if (!EventInstigator)
98 {
99 PRINTLOG(TEXT("NetworkBroadcastActor: SendDoorMessage - EventInstigator is null"));
100 return;
101 }
102
103 PRINTLOG(TEXT("NetworkBroadcastActor: SendDoorMessage called - Index: %d, Open: %d, EventInstigator: %s"),
104 InDoorIndex, bOpen, *EventInstigator->GetName());
105
106 Server_SendDoorMessage(InDoorIndex, bOpen, EventInstigator);
107}
108
109void ANetworkBroadcastActor::Server_SendDoorMessage_Implementation(int InDoorIndex, bool bOpen, AActor* EventInstigator)
110{
111 if (!ValidateInstigator(EventInstigator))
112 {
113 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid instigator for DoorMessage"));
114 return;
115 }
116
117 PRINTLOG(TEXT("NetworkBroadcastActor: Server received DoorMessage - Index: %d, Open: %d"), InDoorIndex, bOpen);
118
119 // Multicast로 모든 클라이언트에게 전파
120 Multicast_SendDoorMessage(InDoorIndex, bOpen, EventInstigator);
121}
122
123void ANetworkBroadcastActor::Multicast_SendDoorMessage_Implementation(int InDoorIndex, bool bOpen, AActor* EventInstigator)
124{
125 PRINTLOG(TEXT("NetworkBroadcastActor: Multicast DoorMessage - Index: %d, Open: %d, Role: %s"),
126 InDoorIndex, bOpen, GetLocalRole() == ROLE_Authority ? TEXT("Server") : TEXT("Client"));
127
129 if (LocalBroadcast)
130 {
131 LocalBroadcast->SendDoorMessage(InDoorIndex, bOpen, EventInstigator);
132 PRINTLOG(TEXT("NetworkBroadcastActor: Local BroadcastManager triggered for DoorMessage"));
133 }
134 else
135 {
136 PRINTLOG(TEXT("NetworkBroadcastActor: Failed to get local BroadcastManager"));
137 }
138}
139
140// ========================================
141// Weight Switch
142// ========================================
143
144void ANetworkBroadcastActor::SendWeightSwitch(int InButtonIndex, bool bActive, AActor* EventInstigator)
145{
146 if (!EventInstigator)
147 {
148 PRINTLOG(TEXT("NetworkBroadcastActor: SendWeightSwitch - EventInstigator is null"));
149 return;
150 }
151
152 PRINTLOG(TEXT("NetworkBroadcastActor: SendWeightSwitch called - Index: %d, Active: %d"), InButtonIndex, bActive);
153
154 Server_SendWeightSwitch(InButtonIndex, bActive, EventInstigator);
155}
156
157void ANetworkBroadcastActor::Server_SendWeightSwitch_Implementation(int InButtonIndex, bool bActive, AActor* EventInstigator)
158{
159 if (!ValidateInstigator(EventInstigator))
160 {
161 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid instigator for WeightSwitch"));
162 return;
163 }
164
165 PRINTLOG(TEXT("NetworkBroadcastActor: Server received WeightSwitch - Index: %d, Active: %d"), InButtonIndex, bActive);
166
167 Multicast_SendWeightSwitch(InButtonIndex, bActive);
168}
169
170void ANetworkBroadcastActor::Multicast_SendWeightSwitch_Implementation(int InButtonIndex, bool bActive)
171{
172 PRINTLOG(TEXT("NetworkBroadcastActor: Multicast WeightSwitch - Index: %d, Active: %d, Role: %s"),
173 InButtonIndex, bActive, GetLocalRole() == ROLE_Authority ? TEXT("Server") : TEXT("Client"));
174
176 if (LocalBroadcast)
177 {
178 LocalBroadcast->SendWeightSwitch(InButtonIndex, bActive);
179 PRINTLOG(TEXT("NetworkBroadcastActor: Local BroadcastManager triggered for WeightSwitch"));
180 }
181}
182
183// ========================================
184// HitStop
185// ========================================
186
187void ANetworkBroadcastActor::SendHitStop(AActor* Target, EDamageType Type, AActor* EventInstigator)
188{
189 if (!EventInstigator || !Target)
190 {
191 PRINTLOG(TEXT("NetworkBroadcastActor: SendHitStop - Invalid parameters"));
192 return;
193 }
194
195 Server_SendHitStop(Target, Type, EventInstigator);
196}
197
198void ANetworkBroadcastActor::Server_SendHitStop_Implementation(AActor* Target, EDamageType Type, AActor* EventInstigator)
199{
200 if (!ValidateInstigator(EventInstigator) || !Target)
201 {
202 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid parameters for HitStop"));
203 return;
204 }
205
206 Multicast_SendHitStop(Target, Type);
207}
208
209void ANetworkBroadcastActor::Multicast_SendHitStop_Implementation(AActor* Target, EDamageType Type)
210{
212 if (LocalBroadcast && Target)
213 {
214 LocalBroadcast->SendHitStop(Target, Type);
215 }
216}
217
218// ========================================
219// Knockback
220// ========================================
221
222void ANetworkBroadcastActor::SendKnockback(AActor* Target, AActor* KnockbackInstigator, EDamageType Type, float Resistance, AActor* CallInstigator)
223{
224 if (!CallInstigator || !Target)
225 {
226 PRINTLOG(TEXT("NetworkBroadcastActor: SendKnockback - Invalid parameters"));
227 return;
228 }
229
230 Server_SendKnockback(Target, KnockbackInstigator, Type, Resistance, CallInstigator);
231}
232
233void ANetworkBroadcastActor::Server_SendKnockback_Implementation(AActor* Target, AActor* KnockbackInstigator, EDamageType Type, float Resistance, AActor* CallInstigator)
234{
235 if (!ValidateInstigator(CallInstigator) || !Target)
236 {
237 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid parameters for Knockback"));
238 return;
239 }
240
241 Multicast_SendKnockback(Target, KnockbackInstigator, Type, Resistance);
242}
243
244void ANetworkBroadcastActor::Multicast_SendKnockback_Implementation(AActor* Target, AActor* KnockbackInstigator, EDamageType Type, float Resistance)
245{
247 if (LocalBroadcast && Target)
248 {
249 LocalBroadcast->SendKnockback(Target, KnockbackInstigator, Type, Resistance);
250 }
251}
252
253// ========================================
254// Mission Timer State
255// ========================================
256
257void ANetworkBroadcastActor::SendUpdateMissionTimerState(bool bIsActive, float TimeLimit, AActor* EventInstigator)
258{
259 if (!EventInstigator)
260 {
261 PRINTLOG(TEXT("NetworkBroadcastActor: SendUpdateMissionTimerState - EventInstigator is null"));
262 return;
263 }
264
265 PRINTLOG(TEXT("NetworkBroadcastActor: SendUpdateMissionTimerState called - bIsActive: %s, TimeLimit: %.1f"),
266 bIsActive ? TEXT("true") : TEXT("false"), TimeLimit);
267
268 Server_SendUpdateMissionTimerState(bIsActive, TimeLimit, EventInstigator);
269}
270
271void ANetworkBroadcastActor::Server_SendUpdateMissionTimerState_Implementation(bool bIsActive, float TimeLimit, AActor* EventInstigator)
272{
273 if (!ValidateInstigator(EventInstigator))
274 {
275 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid instigator for SendUpdateMissionTimerState"));
276 return;
277 }
278
279 PRINTLOG(TEXT("NetworkBroadcastActor: Server received SendUpdateMissionTimerState - bIsActive: %s, TimeLimit: %.1f"),
280 bIsActive ? TEXT("true") : TEXT("false"), TimeLimit);
281
282 Multicast_SendUpdateMissionTimerState(bIsActive, TimeLimit);
283}
284
285void ANetworkBroadcastActor::Multicast_SendUpdateMissionTimerState_Implementation(bool bIsActive, float TimeLimit)
286{
287 PRINTLOG(TEXT("NetworkBroadcastActor: Multicast SendUpdateMissionTimerState - bIsActive: %s, TimeLimit: %.1f, Role: %s"),
288 bIsActive ? TEXT("true") : TEXT("false"),
289 TimeLimit,
290 GetLocalRole() == ROLE_Authority ? TEXT("Server") : TEXT("Client"));
291
293 if (LocalBroadcast)
294 {
295 LocalBroadcast->SendUpdateMissionTimerState(bIsActive, TimeLimit);
296 PRINTLOG(TEXT("NetworkBroadcastActor: Local BroadcastManager triggered for SendUpdateMissionTimerState"));
297 }
298}
299
300// ========================================
301// Tutor Message
302// ========================================
303
304void ANetworkBroadcastActor::SendTutorMessage(const FText& Message, AActor* EventInstigator)
305{
306 if (!EventInstigator)
307 {
308 PRINTLOG(TEXT("NetworkBroadcastActor: SendTutorMessage - EventInstigator is null"));
309 return;
310 }
311
312 PRINTLOG(TEXT("NetworkBroadcastActor: SendTutorMessage called - Message: %s, EventInstigator: %s"),
313 *Message.ToString(), *EventInstigator->GetName());
314
315 Server_SendTutorMessage(Message, EventInstigator);
316}
317
318void ANetworkBroadcastActor::Server_SendTutorMessage_Implementation(const FText& Message, AActor* EventInstigator)
319{
320 if (!ValidateInstigator(EventInstigator))
321 {
322 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid instigator for TutorMessage"));
323 return;
324 }
325
326 PRINTLOG(TEXT("NetworkBroadcastActor: Server received TutorMessage - Message: %s"), *Message.ToString());
327
329}
330
331void ANetworkBroadcastActor::Multicast_SendTutorMessage_Implementation(const FText& Message)
332{
333 PRINTLOG(TEXT("NetworkBroadcastActor: Multicast TutorMessage - Message: %s, Role: %s"),
334 *Message.ToString(), GetLocalRole() == ROLE_Authority ? TEXT("Server") : TEXT("Client"));
335
337 if (LocalBroadcast)
338 {
339 LocalBroadcast->SendTutorMessage(Message);
340 PRINTLOG(TEXT("NetworkBroadcastActor: Local BroadcastManager triggered for TutorMessage"));
341 }
342}
343
344// ========================================
345// Teleport All Players
346// ========================================
347
348void ANetworkBroadcastActor::SendTeleportAllPlayers(const FTransform& TargetTransform, AActor* EventInstigator)
349{
350 if (!EventInstigator)
351 {
352 PRINTLOG(TEXT("NetworkBroadcastActor: SendTeleportAllPlayers - EventInstigator is null"));
353 return;
354 }
355
356 PRINTLOG(TEXT("NetworkBroadcastActor: SendTeleportAllPlayers called - Location: %s, EventInstigator: %s"),
357 *TargetTransform.ToString(), *EventInstigator->GetName());
358
359 Server_SendTeleportAllPlayers(TargetTransform, EventInstigator);
360}
361
362void ANetworkBroadcastActor::Server_SendTeleportAllPlayers_Implementation(const FTransform& TargetTransform, AActor* EventInstigator)
363{
364 if (!ValidateInstigator(EventInstigator))
365 {
366 PRINTLOG(TEXT("NetworkBroadcastActor: Invalid instigator for TeleportAllPlayers"));
367 return;
368 }
369
370 PRINTLOG(TEXT("NetworkBroadcastActor: Server received TeleportAllPlayers - Location: %s"), *TargetTransform.ToString());
371
372 Multicast_SendTeleportAllPlayers(TargetTransform);
373}
374
375void ANetworkBroadcastActor::Multicast_SendTeleportAllPlayers_Implementation(const FTransform& TargetTransform)
376{
377 PRINTLOG(TEXT("NetworkBroadcastActor: Multicast TeleportAllPlayers - Transform: %s, Role: %s"),
378 *TargetTransform.ToString(), GetLocalRole() == ROLE_Authority ? TEXT("Server") : TEXT("Client"));
379
381 if (LocalBroadcast)
382 {
383 LocalBroadcast->SendTeleport(TargetTransform);
384 PRINTLOG(TEXT("NetworkBroadcastActor: Local BroadcastManager triggered for TeleportAllPlayers"));
385 }
386}
387
388// ========================================
389// Utility Functions
390// ========================================
391
393{
394 if (!GetWorld())
395 {
396 PRINTLOG(TEXT("NetworkBroadcastActor: GetWorld() returned nullptr"));
397 return nullptr;
398 }
399
400 UBroadcastManager* LocalBroadcast = UBroadcastManager::Get(GetWorld());
401 if (!LocalBroadcast)
402 {
403 PRINTLOG(TEXT("NetworkBroadcastActor: Failed to get UBroadcastManager"));
404 }
405
406 return LocalBroadcast;
407}
408
409bool ANetworkBroadcastActor::ValidateInstigator(AActor* EventInstigator) const
410{
411 if (!EventInstigator || !IsValid(EventInstigator))
412 {
413 PRINTLOG(TEXT("NetworkBroadcastActor: EventInstigator is null or invalid"));
414 return false;
415 }
416
417 if (!EventInstigator->GetWorld())
418 {
419 PRINTLOG(TEXT("NetworkBroadcastActor: EventInstigator not in world"));
420 return false;
421 }
422
423 return true;
424}
네트워크 복제를 위한 전역 브로드캐스트 Actor
EDamageType
Definition EDamageType.h:9
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
네트워크 복제를 위한 전역 브로드캐스트 Actor
void Multicast_SendUpdateMissionTimerState(bool bIsActive, float TimeLimit)
void SendTeleportAllPlayers(const FTransform &TargetTransform, AActor *EventInstigator)
모든 플레이어를 지정된 위치로 텔레포트
void SendKnockback(AActor *Target, AActor *KnockbackInstigator, EDamageType Type, float Resistance, AActor *CallInstigator)
넉백 이벤트를 네트워크로 전송
void Multicast_SendTutorMessage(const FText &Message)
void Multicast_SendWeightSwitch(int InButtonIndex, bool bActive)
static ANetworkBroadcastActor * Get(const UObject *WorldContextObject)
싱글톤 인스턴스 가져오기
void SendTutorMessage(const FText &Message, AActor *EventInstigator)
튜터 메시지를 네트워크로 전송
static TMap< UWorld *, ANetworkBroadcastActor * > Instances
World별 싱글톤 인스턴스 맵
void Server_SendUpdateMissionTimerState(bool bIsActive, float TimeLimit, AActor *EventInstigator)
void SendHitStop(AActor *Target, EDamageType Type, AActor *EventInstigator)
히트스톱 이벤트를 네트워크로 전송
bool ValidateInstigator(AActor *EventInstigator) const
권한 검증 - EventInstigator가 유효한지 확인
void Server_SendTeleportAllPlayers(const FTransform &TargetTransform, AActor *EventInstigator)
void Server_SendTutorMessage(const FText &Message, AActor *EventInstigator)
void Multicast_SendHitStop(AActor *Target, EDamageType Type)
void Multicast_SendDoorMessage(int InDoorIndex, bool bOpen, AActor *EventInstigator)
void Server_SendHitStop(AActor *Target, EDamageType Type, AActor *EventInstigator)
void SendWeightSwitch(int InButtonIndex, bool bActive, AActor *EventInstigator)
무게 스위치 상태 변경 메시지를 네트워크로 전송
void Multicast_SendKnockback(AActor *Target, AActor *KnockbackInstigator, EDamageType Type, float Resistance)
void Multicast_SendTeleportAllPlayers(const FTransform &TargetTransform)
void Server_SendKnockback(AActor *Target, AActor *KnockbackInstigator, EDamageType Type, float Resistance, AActor *CallInstigator)
void Server_SendWeightSwitch(int InButtonIndex, bool bActive, AActor *EventInstigator)
void SendUpdateMissionTimerState(bool bIsActive, float TimeLimit, AActor *EventInstigator)
미션 타이머 상태 변경 이벤트를 네트워크로 전송
void SendDoorMessage(int InDoorIndex, bool bOpen, AActor *EventInstigator)
문 상태 변경 메시지를 네트워크로 전송
class UBroadcastManager * GetLocalBroadcastManager() const
로컬 BroadcastManager 가져오기
void Server_SendDoorMessage(int InDoorIndex, bool bOpen, AActor *EventInstigator)
게임 내 전역 이벤트를 중계하는 중앙 이벤트 버스(Event Bus) 서브시스템입니다.
void SendUpdateMissionTimerState(bool bIsActive, float TimeLimit)
void SendTeleport(const FTransform &TargetTransform)
void SendKnockback(AActor *Target, AActor *Instigator, EDamageType Type, float Resistance)
void SendDoorMessage(int InDoorIndex, bool InOpen, AActor *EventInstigator)
void SendWeightSwitch(int InButtonIndex, bool InActive)
void SendTutorMessage(const FText &Message)
void SendHitStop(AActor *Target, const EDamageType Type)