// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "SurvivalGameMode.generated.h" /** * L'arbitre de la partie. N'existe QUE sur le serveur -- sur un client, * GetGameMode() rend nullptr, toujours. Ce n'est pas un bug mais le design du * framework : le GameMode decide, le GameState montre. * * Corollaire a garder en tete pour tout le portage coop : le moindre appel a * GetGameMode() ecrit du cote client doit etre remplace par un RPC serveur ou * par une lecture du GameState. C'est le cas du respawn, aujourd'hui declenche * depuis AFpsPlayerController. * * Y mettra plus tard : les regles de mort, le cycle jour/nuit, la sauvegarde * du monde. Pour l'instant il ne fait que borner le nombre de joueurs et * cabler GameState et PlayerState. */ UCLASS() class EMBERWILD_API ASurvivalGameMode : public AGameModeBase { GENERATED_BODY() public: ASurvivalGameMode(); virtual void InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) override; virtual void PostLogin(APlayerController* NewPlayer) override; virtual void Logout(AController* Exiting) override; protected: /** * Plafond de joueurs, applique a la AGameSession. * * Regle ici et pas seulement dans les reglages de session : la session * annonce des places libres, mais c'est le GameMode qui refuse reellement la * connexion. Sans ce plafond, un cinquieme joueur qui arrive par une * invitation directe entre quand meme. * * Sa valeur par defaut est posee dans le constructeur depuis * USessionSubsystem::DefaultMaxPlayers, pour qu'il n'existe qu'UN seul 4 * dans le projet : deux nombres qui doivent rester egaux finissent toujours * par diverger, et le symptome serait une place annoncee mais refusee. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Coop", meta = (ClampMin = "1", ClampMax = "16")) int32 MaxCoopPlayers; };