File NetworkPawn.cpp
File List > Network > NetworkPawn.cpp
Go to the documentation of this file
// Fill out your copyright notice in the Description page of Project Settings.
#include "NetworkPawn.h"
#include "NightSkyEngine/Miscellaneous/NightSkyGameInstance.h"
#include "RpcConnectionManager.h"
#include "Engine/AssetManager.h"
#include "NightSkyEngine/Battle/NightSkyGameState.h"
#include "Net/UnrealNetwork.h"
#include "NightSkyEngine/Battle/NightSkyPlayerController.h"
#include "NightSkyEngine/Battle/FighterRunners/FighterMultiplayerRunner.h"
#include "NightSkyEngine/Data/PrimaryCharaData.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(NetworkPawn)
// Sets default values
ANetworkPawn::ANetworkPawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
bReplicates = true;
}
// Called when the game starts or when spawned
void ANetworkPawn::BeginPlay()
{
Super::BeginPlay();
}
void ANetworkPawn::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ANetworkPawn, CharaDataReceived)
DOREPLIFETIME(ANetworkPawn, bRematchAccepted)
}
void ANetworkPawn::ServerGetCharaData(TArray<FPrimaryAssetId> Assets)
{
auto NetworkPawn = Cast<ANightSkyPlayerController>(GetWorld()->GetFirstPlayerController())->NetworkPawn;
if (NetworkPawn->CharaDataReceived) return;
UNightSkyGameInstance* GameInstance = Cast<UNightSkyGameInstance>(GetGameInstance());
GameInstance->BattleData.PlayerListP2.Empty();
for (const auto CharaData : Assets)
{
GameInstance->BattleData.PlayerListP2.Add(Cast<UPrimaryCharaData>(UAssetManager::Get().GetPrimaryAssetObject(CharaData)));
}
NetworkPawn->CharaDataReceived = true;
}
void ANetworkPawn::ClientGetCharaData(TArray<FPrimaryAssetId> Assets)
{
if (CharaDataReceived) return;
UNightSkyGameInstance* GameInstance = Cast<UNightSkyGameInstance>(GetGameInstance());
GameInstance->BattleData.PlayerListP1.Empty();
for (const auto CharaData : Assets)
{
GameInstance->BattleData.PlayerListP1.Add(Cast<UPrimaryCharaData>(UAssetManager::Get().GetPrimaryAssetObject(CharaData)));
}
}
void ANetworkPawn::SendRematchToServer_Implementation()
{
Cast<ANightSkyPlayerController>(GetWorld()->GetFirstPlayerController())->NetworkPawn->bRematchAccepted = true;
}
void ANetworkPawn::ServerGetFinishedLoading_Implementation(bool Finished)
{
const UNightSkyGameInstance* GameInstance = Cast<UNightSkyGameInstance>(GetGameInstance());
if (Finished == true && Finished == GameInstance->FinishedLoadingForNetworkBattle)
GameInstance->TravelToBattleMap();
}
void ANetworkPawn::SendGgpoToClient_Implementation(const TArray<int8> &GgpoMessage)
{
if(FighterMultiplayerRunner)
FighterMultiplayerRunner->connectionManager->receiveSchedule.AddTail(GgpoMessage);
}
void ANetworkPawn::SendGgpoToServer_Implementation(const TArray<int8> &GgpoMessage)
{
if(FighterMultiplayerRunner)
FighterMultiplayerRunner->connectionManager->receiveSchedule.AddTail(GgpoMessage);
}
void ANetworkPawn::ClientGetBattleData_Implementation(FBattleData InBattleData, FNetworkMirror Mirror)
{
UNightSkyGameInstance* GameInstance = Cast<UNightSkyGameInstance>(GetGameInstance());
UAssetManager::Get().LoadPrimaryAssets(Mirror.PlayerList, TArray<FName>(), FStreamableDelegate::CreateUObject(this, &ANetworkPawn::ClientGetCharaData, Mirror.PlayerList));
GameInstance->BattleData.ColorIndicesP1 = InBattleData.ColorIndicesP1;
GameInstance->BattleData.BattleFormat = InBattleData.BattleFormat;
GameInstance->BattleData.RoundCount = InBattleData.RoundCount;
GameInstance->BattleData.StartRoundTimer = InBattleData.StartRoundTimer;
GameInstance->BattleData.Random = InBattleData.Random;
GameInstance->BattleData.Stage = InBattleData.Stage;
GameInstance->BattleData.MusicName = InBattleData.MusicName;
}
void ANetworkPawn::ServerGetBattleData_Implementation(FBattleData InBattleData, FNetworkMirror Mirror)
{
UNightSkyGameInstance* GameInstance = Cast<UNightSkyGameInstance>(GetGameInstance());
UAssetManager::Get().LoadPrimaryAssets(Mirror.PlayerList, TArray<FName>(), FStreamableDelegate::CreateUObject(this, &ANetworkPawn::ServerGetCharaData, Mirror.PlayerList));
GameInstance->BattleData.ColorIndicesP2 = InBattleData.ColorIndicesP2;
}
void ANetworkPawn::ServerChecksumCheck_Implementation(uint32 Checksum, int32 InFrame)
{
if (ANightSkyGameState* GameState = Cast<ANightSkyGameState>(GetWorld()->GetGameState()))
{
if (GameState != nullptr)
{
GameState->SetOtherChecksum(Checksum, InFrame);
}
}
}
void ANetworkPawn::ClientChecksumCheck_Implementation(uint32 Checksum, int32 InFrame)
{
if (ANightSkyGameState* GameState = Cast<ANightSkyGameState>(GetWorld()->GetGameState()))
{
if (GameState != nullptr)
{
GameState->SetOtherChecksum(Checksum, InFrame);
}
}
}