(Feat) Add mulitplayer

This commit is contained in:
2026-08-03 10:30:47 +02:00
parent 41d6e6a7f3
commit a4cc59a411
41 changed files with 3418 additions and 125 deletions
@@ -0,0 +1,61 @@
// 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);
}