// Fill out your copyright notice in the Description page of Project Settings.


#include "SurvivalGameMode.h"

#include "FpsPlayerController.h"
#include "GameFramework/GameSession.h"
#include "GameFramework/PlayerState.h"
#include "SessionSubsystem.h"
#include "SurvivalGameState.h"
#include "SurvivalPlayerState.h"

ASurvivalGameMode::ASurvivalGameMode()
{
	MaxCoopPlayers = USessionSubsystem::DefaultMaxPlayers;

	// Les classes du framework sont cablees ici et non dans le Blueprint : ce
	// sont des choix d'architecture, pas des reglages a tatonner en PIE.
	GameStateClass = ASurvivalGameState::StaticClass();
	PlayerStateClass = ASurvivalPlayerState::StaticClass();
	PlayerControllerClass = AFpsPlayerController::StaticClass();

	// Une seule map pour l'instant, donc pas de voyage sans coupure a gerer.
	// A repasser a true le jour ou la partie changera de niveau : sans lui,
	// chaque changement de map deconnecte puis reconnecte tous les clients.
	bUseSeamlessTravel = false;
}

void ASurvivalGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
	Super::InitGame(MapName, Options, ErrorMessage);

	// AGameSession n'existe qu'apres le Super : c'est lui qui l'engendre.
	if (GameSession)
	{
		GameSession->MaxPlayers = MaxCoopPlayers;
	}
}

void ASurvivalGameMode::PostLogin(APlayerController* NewPlayer)
{
	Super::PostLogin(NewPlayer);

	// Trace volontairement conservee : c'est la preuve la plus rapide qu'une
	// connexion a bien abouti, et le premier endroit ou regarder quand un ami
	// dit "ca tourne mais je ne te vois pas".
	const APlayerState* State = NewPlayer ? NewPlayer->GetPlayerState<APlayerState>() : nullptr;
	UE_LOG(LogTemp, Log, TEXT("ASurvivalGameMode : arrivee de [%s], %d joueur(s) sur %d."),
		State ? *State->GetPlayerName() : TEXT("inconnu"),
		GetNumPlayers(),
		MaxCoopPlayers);
}

void ASurvivalGameMode::Logout(AController* Exiting)
{
	const APlayerState* State = Exiting ? Exiting->GetPlayerState<APlayerState>() : nullptr;
	UE_LOG(LogTemp, Log, TEXT("ASurvivalGameMode : depart de [%s]."),
		State ? *State->GetPlayerName() : TEXT("inconnu"));

	Super::Logout(Exiting);
}
