11#include "Net/UnrealNetwork.h"
12#include "Engine/World.h"
18 PrimaryActorTick.bCanEverTick =
false;
22 bAlwaysRelevant =
true;
25 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT(
"Root"));
30 if (!WorldContextObject)
32 PRINTLOG(TEXT(
"NetworkBroadcastActor::Get - WorldContextObject is null"));
36 UWorld* World = WorldContextObject->GetWorld();
39 PRINTLOG(TEXT(
"NetworkBroadcastActor::Get - World is null"));
47 if (IsValid(Instance))
59 if (World->GetAuthGameMode())
61 FActorSpawnParameters SpawnParams;
62 SpawnParams.Owner =
nullptr;
63 SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
66 ANetworkBroadcastActor::StaticClass(),
68 FRotator::ZeroRotator,
75 PRINTLOG(TEXT(
"NetworkBroadcastActor: Created new instance"));
80 PRINTLOG(TEXT(
"NetworkBroadcastActor: Failed to spawn actor"));
85 PRINTLOG(TEXT(
"NetworkBroadcastActor: Not on server, cannot create instance"));
99 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendDoorMessage - EventInstigator is null"));
103 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendDoorMessage called - Index: %d, Open: %d, EventInstigator: %s"),
104 InDoorIndex, bOpen, *EventInstigator->GetName());
109void ANetworkBroadcastActor::Server_SendDoorMessage_Implementation(
int InDoorIndex,
bool bOpen, AActor* EventInstigator)
113 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid instigator for DoorMessage"));
117 PRINTLOG(TEXT(
"NetworkBroadcastActor: Server received DoorMessage - Index: %d, Open: %d"), InDoorIndex, bOpen);
123void ANetworkBroadcastActor::Multicast_SendDoorMessage_Implementation(
int InDoorIndex,
bool bOpen, AActor* EventInstigator)
125 PRINTLOG(TEXT(
"NetworkBroadcastActor: Multicast DoorMessage - Index: %d, Open: %d, Role: %s"),
126 InDoorIndex, bOpen, GetLocalRole() == ROLE_Authority ? TEXT(
"Server") : TEXT(
"Client"));
132 PRINTLOG(TEXT(
"NetworkBroadcastActor: Local BroadcastManager triggered for DoorMessage"));
136 PRINTLOG(TEXT(
"NetworkBroadcastActor: Failed to get local BroadcastManager"));
146 if (!EventInstigator)
148 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendWeightSwitch - EventInstigator is null"));
152 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendWeightSwitch called - Index: %d, Active: %d"), InButtonIndex, bActive);
157void ANetworkBroadcastActor::Server_SendWeightSwitch_Implementation(
int InButtonIndex,
bool bActive, AActor* EventInstigator)
161 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid instigator for WeightSwitch"));
165 PRINTLOG(TEXT(
"NetworkBroadcastActor: Server received WeightSwitch - Index: %d, Active: %d"), InButtonIndex, bActive);
170void ANetworkBroadcastActor::Multicast_SendWeightSwitch_Implementation(
int InButtonIndex,
bool bActive)
172 PRINTLOG(TEXT(
"NetworkBroadcastActor: Multicast WeightSwitch - Index: %d, Active: %d, Role: %s"),
173 InButtonIndex, bActive, GetLocalRole() == ROLE_Authority ? TEXT(
"Server") : TEXT(
"Client"));
179 PRINTLOG(TEXT(
"NetworkBroadcastActor: Local BroadcastManager triggered for WeightSwitch"));
189 if (!EventInstigator || !Target)
191 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendHitStop - Invalid parameters"));
198void ANetworkBroadcastActor::Server_SendHitStop_Implementation(AActor* Target,
EDamageType Type, AActor* EventInstigator)
202 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid parameters for HitStop"));
209void ANetworkBroadcastActor::Multicast_SendHitStop_Implementation(AActor* Target,
EDamageType Type)
212 if (LocalBroadcast && Target)
224 if (!CallInstigator || !Target)
226 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendKnockback - Invalid parameters"));
233void ANetworkBroadcastActor::Server_SendKnockback_Implementation(AActor* Target, AActor* KnockbackInstigator,
EDamageType Type,
float Resistance, AActor* CallInstigator)
237 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid parameters for Knockback"));
244void ANetworkBroadcastActor::Multicast_SendKnockback_Implementation(AActor* Target, AActor* KnockbackInstigator,
EDamageType Type,
float Resistance)
247 if (LocalBroadcast && Target)
249 LocalBroadcast->
SendKnockback(Target, KnockbackInstigator, Type, Resistance);
259 if (!EventInstigator)
261 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendUpdateMissionTimerState - EventInstigator is null"));
265 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendUpdateMissionTimerState called - bIsActive: %s, TimeLimit: %.1f"),
266 bIsActive ? TEXT(
"true") : TEXT(
"false"), TimeLimit);
271void ANetworkBroadcastActor::Server_SendUpdateMissionTimerState_Implementation(
bool bIsActive,
float TimeLimit, AActor* EventInstigator)
275 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid instigator for SendUpdateMissionTimerState"));
279 PRINTLOG(TEXT(
"NetworkBroadcastActor: Server received SendUpdateMissionTimerState - bIsActive: %s, TimeLimit: %.1f"),
280 bIsActive ? TEXT(
"true") : TEXT(
"false"), TimeLimit);
285void ANetworkBroadcastActor::Multicast_SendUpdateMissionTimerState_Implementation(
bool bIsActive,
float TimeLimit)
287 PRINTLOG(TEXT(
"NetworkBroadcastActor: Multicast SendUpdateMissionTimerState - bIsActive: %s, TimeLimit: %.1f, Role: %s"),
288 bIsActive ? TEXT(
"true") : TEXT(
"false"),
290 GetLocalRole() == ROLE_Authority ? TEXT(
"Server") : TEXT(
"Client"));
296 PRINTLOG(TEXT(
"NetworkBroadcastActor: Local BroadcastManager triggered for SendUpdateMissionTimerState"));
306 if (!EventInstigator)
308 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendTutorMessage - EventInstigator is null"));
312 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendTutorMessage called - Message: %s, EventInstigator: %s"),
313 *Message.ToString(), *EventInstigator->GetName());
318void ANetworkBroadcastActor::Server_SendTutorMessage_Implementation(
const FText& Message, AActor* EventInstigator)
322 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid instigator for TutorMessage"));
326 PRINTLOG(TEXT(
"NetworkBroadcastActor: Server received TutorMessage - Message: %s"), *Message.ToString());
331void ANetworkBroadcastActor::Multicast_SendTutorMessage_Implementation(
const FText& Message)
333 PRINTLOG(TEXT(
"NetworkBroadcastActor: Multicast TutorMessage - Message: %s, Role: %s"),
334 *Message.ToString(), GetLocalRole() == ROLE_Authority ? TEXT(
"Server") : TEXT(
"Client"));
340 PRINTLOG(TEXT(
"NetworkBroadcastActor: Local BroadcastManager triggered for TutorMessage"));
350 if (!EventInstigator)
352 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendTeleportAllPlayers - EventInstigator is null"));
356 PRINTLOG(TEXT(
"NetworkBroadcastActor: SendTeleportAllPlayers called - Location: %s, EventInstigator: %s"),
357 *TargetTransform.ToString(), *EventInstigator->GetName());
362void ANetworkBroadcastActor::Server_SendTeleportAllPlayers_Implementation(
const FTransform& TargetTransform, AActor* EventInstigator)
366 PRINTLOG(TEXT(
"NetworkBroadcastActor: Invalid instigator for TeleportAllPlayers"));
370 PRINTLOG(TEXT(
"NetworkBroadcastActor: Server received TeleportAllPlayers - Location: %s"), *TargetTransform.ToString());
375void ANetworkBroadcastActor::Multicast_SendTeleportAllPlayers_Implementation(
const FTransform& TargetTransform)
377 PRINTLOG(TEXT(
"NetworkBroadcastActor: Multicast TeleportAllPlayers - Transform: %s, Role: %s"),
378 *TargetTransform.ToString(), GetLocalRole() == ROLE_Authority ? TEXT(
"Server") : TEXT(
"Client"));
384 PRINTLOG(TEXT(
"NetworkBroadcastActor: Local BroadcastManager triggered for TeleportAllPlayers"));
396 PRINTLOG(TEXT(
"NetworkBroadcastActor: GetWorld() returned nullptr"));
403 PRINTLOG(TEXT(
"NetworkBroadcastActor: Failed to get UBroadcastManager"));
406 return LocalBroadcast;
411 if (!EventInstigator || !IsValid(EventInstigator))
413 PRINTLOG(TEXT(
"NetworkBroadcastActor: EventInstigator is null or invalid"));
417 if (!EventInstigator->GetWorld())
419 PRINTLOG(TEXT(
"NetworkBroadcastActor: EventInstigator not in world"));
네트워크 복제를 위한 전역 브로드캐스트 Actor
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
네트워크 복제를 위한 전역 브로드캐스트 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)