6#include "Net/UnrealNetwork.h"
13#include "EngineUtils.h"
17#include "GameFramework/PlayerController.h"
18#include "Engine/World.h"
19#include "Kismet/GameplayStatics.h"
27 PrimaryActorTick.bCanEverTick =
true;
44 Super::GetLifetimeReplicatedProps(OutLifetimeProps);
69 if (HasAuthority() &&
RoomId == 0)
76 PRINTLOG(TEXT(
"[LingoGameState] RoomId generated by Host: %lld"),
RoomId);
82 Super::Tick(DeltaSeconds);
115 if (!HasAuthority())
return;
122 if (!HasAuthority())
return;
129 if (!HasAuthority())
return;
134void ALingoGameState::Multicast_SetAllCompassVisibility_Implementation(
bool bVisible)
136 for (TActorIterator<AActor> It(GetWorld()); It; ++It)
139 if (It->IsA(APlayerActor::StaticClass()))
144 Target->SetShowOnCompass(bVisible);
149void ALingoGameState::Multicast_SetCompassVisibilityByClass_Implementation(TSubclassOf<AActor> ActorClass,
152 TArray<AActor*> FoundActors;
153 UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass, FoundActors);
155 for (AActor* Actor : FoundActors)
159 Target->SetShowOnCompass(bVisible);
164void ALingoGameState::Multicast_SetCompassVisibilityByTag_Implementation(FName Tag,
bool bVisible)
166 TArray<AActor*> FoundActors;
167 UGameplayStatics::GetAllActorsWithTag(GetWorld(), Tag, FoundActors);
169 for (AActor* Actor : FoundActors)
173 Target->SetShowOnCompass(bVisible);
191 for (APlayerState* PS : PlayerArray)
195 LingoPS->SetReadQuestIng(
true);
219 for (APlayerState* PS : PlayerArray)
223 LingoPS->SetListenQuestIng(
true);
239 PRINTLOG(TEXT(
"[SetRoomLevel] Failed: Not authority"));
262 BroadcastActor->SendUpdateMissionTimerState(
true, InTimeLimit,
this);
279 BroadcastActor->SendUpdateMissionTimerState(
false, 0.0f,
this);
303 BroadcastActor->SendUpdateMissionTimerState(
false, 0.0f,
this);
307 PRINTLOG( TEXT(
"[GameState] Mission Timer Ended - Sending: %s"), *EndMessage);
312 if (
auto Popup = UPopupManager::ShowPopupAs<UPopup_Result>(GetWorld(), EPopupType::Result))
319 if (UWorld* World = GetWorld())
321 for (FConstPlayerControllerIterator It = World->GetPlayerControllerIterator(); It; ++It)
323 if (APlayerController* PC = It->Get())
325 if (
APlayerActor* PlayerActor = Cast<APlayerActor>(PC->GetPawn()))
327 PlayerActor->OnGameMessage(EndMessage);
335void ALingoGameState::Multicast_UpdateQuestType_Implementation(
const EQuestType InQuestType)
338 if (UWorld* World = GetWorld())
340 FTimerHandle TimerHandle;
341 World->GetTimerManager().SetTimer(TimerHandle, [
this, InQuestType]()
349void ALingoGameState::Multicast_ShowReadQuestPopup_Implementation(
const FResponseReadScenario& InScenarioData)
356 if (UWorld* World = GetWorld())
358 FTimerHandle TimerHandle;
359 World->GetTimerManager().SetTimer(TimerHandle, [
this, InScenarioData]()
361 for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
363 if (APlayerController* PC = It->Get())
365 if (APlayerActor* PlayerActor = Cast<APlayerActor>(PC->GetPawn()))
367 PlayerActor->Cmd_Info();
376void ALingoGameState::Multicast_ShowListenQuestPopup_Implementation(
const FResponseListenScenario& InScenarioData)
383 if (UWorld* World = GetWorld())
385 FTimerHandle TimerHandle;
386 World->GetTimerManager().SetTimer(TimerHandle, [
this, InScenarioData]()
388 for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
390 if (APlayerController* PC = It->Get())
392 if (APlayerActor* PlayerActor = Cast<APlayerActor>(PC->GetPawn()))
394 PlayerActor->Cmd_Info();
413 PRINTLOG(TEXT(
"[OnRep_ReadScenarioData] Data is empty, skipping Cmd_Info"));
418 if (UWorld* World = GetWorld())
420 FTimerHandle TimerHandle;
421 World->GetTimerManager().SetTimer(TimerHandle, [
this]()
423 for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
425 if (APlayerController* PC = It->Get())
427 if (APlayerActor* PlayerActor = Cast<APlayerActor>(PC->GetPawn()))
429 PlayerActor->Cmd_Info();
455 PRINTLOG(TEXT(
"[OnRep_ListenScenarioData] Data is empty, skipping Cmd_Info"));
460 if (UWorld* World = GetWorld())
462 FTimerHandle TimerHandle;
463 World->GetTimerManager().SetTimer(TimerHandle, [
this]()
465 for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
467 if (APlayerController* PC = It->Get())
469 if (APlayerActor* PlayerActor = Cast<APlayerActor>(PC->GetPawn()))
471 PlayerActor->Cmd_Info();
495void ALingoGameState::MulticastRPC_SendChat_Implementation(
FResponseUserMe sendUser,
const FText& inMessage, int32 PlayerIndex)
498 if (
auto* PC = Cast<APlayerControl>(GetWorld()->GetFirstPlayerController()))
501 if (
auto* player = Cast<APlayerActor>(PC->GetPawn()))
503 player->GetMainWidget()->SendChatMessage(sendUser, inMessage, PlayerIndex);
네트워크 복제를 위한 전역 브로드캐스트 Actor
Declares the player-controlled character actor.
APlayerControl 선언에 대한 Doxygen 주석을 제공합니다.
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
TArray< int32 > WrongListenAnswerList
int64 RoomId
방 ID (Host가 생성하고 Guest들과 공유)
void SetRoomLevel(int32 InRoomLevel)
방 레벨 설정 (서버 전용)
void Multicast_SetCompassVisibilityByTag(FName Tag, bool bVisible)
void SetListenScenarioData(const FResponseListenScenario &InResponseData)
void Multicast_SetAllCompassVisibility(bool bVisible)
FResponseReadScenario ReadScenarioData
virtual void Tick(float DeltaSeconds) override
FResponseListenScenario TryListenAnswerData
void SetReadScenarioData(const FResponseReadScenario &InResponseData)
void UpdateRemainMissionTime(const float InTimeLimit)
void Multicast_UpdateQuestType(const EQuestType InQuestType)
virtual void BeginPlay() override
FOnRoomLevelUpdated OnRoomLevelUpdated
void OnMissionTimerEnd()
타이머 종료 시 호출됩니다 (서버에서만 실행)
void Multicast_SetCompassVisibilityByClass(TSubclassOf< AActor > ActorClass, bool bVisible)
void StopMissionTimer()
미션 타이머를 중지합니다
void OnRep_ReadScenarioData()
FResponseListenResult ListenResult
void Multicast_ShowListenQuestPopup(const FResponseListenScenario &InScenarioData)
void DecreaseMissionTimer(const float InValue)
void SetCompassVisibilityByClass(TSubclassOf< AActor > ActorClass, bool bVisible)
void SetCompassVisibilityByTag(FName Tag, bool bVisible)
FResponseReadResult ReqReadResult
void SetAllCompassVisibility(bool bVisible)
FResponseReadResult ReadResult
void AddWrongListenAnswer(int32 Value)
FOnQuestScenarioDataUpdated OnQuestScenarioDataUpdated
virtual void GetLifetimeReplicatedProps(TArray< FLifetimeProperty > &OutLifetimeProps) const override
FResponseListenScenario ListenScenarioData
bool bIsTimerActive
타이머 활성화 상태
void OnRep_ListenScenarioData()
TArray< int32 > WrongReadAnswerList
void OnRep_ListenResult()
FOnListenResultUpdated OnListenResultUpdated
FOnReadResultUpdated OnReadResultUpdated
void StartMissionTimer(float TimeLimit)
미션 타이머를 시작합니다 (서버에서만 호출)
void Multicast_ShowReadQuestPopup(const FResponseReadScenario &InScenarioData)
FOnRoomIdUpdated OnRoomIdUpdated
void AddWrongReadAnswer(int32 Value)
FResponseListenResult ReqListenResult
네트워크 복제를 위한 전역 브로드캐스트 Actor
static ANetworkBroadcastActor * Get(const UObject *WorldContextObject)
싱글톤 인스턴스 가져오기
Main character driven directly by the player.
static int64 GetUnixTimestampInt64()
static float GetMissionPlayTime()
static FString GetStageEndMessage(const EQuestType QuestType)
static const FString BotName
TArray< FScenarioTargetData > target_data