(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
@@ -103,6 +103,22 @@ public:
UFUNCTION(BlueprintCallable, Category = "UI|Reglages")
void OpenSettings();
/**
* Ouvre le panneau d'invitation de l'overlay Steam.
*
* Passe par le controller et non directement du widget au sous-systeme :
* inviter est une action du JOUEUR LOCAL, et le controller est justement
* l'objet qui le represente. Un widget qui irait chercher un
* GameInstanceSubsystem tout seul se brancherait sur le mauvais joueur le
* jour ou l'ecran partage existera.
*/
UFUNCTION(BlueprintCallable, Category = "Coop")
void ShowInviteFriends();
/** Faux quand Steam est absent ou qu'aucune session n'a pu etre creee. */
UFUNCTION(BlueprintPure, Category = "Coop")
bool CanInviteFriends() const;
protected:
virtual void BeginPlay() override;
virtual void OnPossess(APawn* InPawn) override;
@@ -389,9 +405,68 @@ private:
UFUNCTION()
void HandlePawnDied();
/** Detruit le cadavre et demande un nouveau pawn au GameMode. */
/**
* Detruit le cadavre et demande un nouveau pawn au GameMode.
*
* Le GameMode n'existe QUE sur le serveur : chez un client
* GetAuthGameMode() rend nullptr, toujours. Un client route donc par
* Server_RequestRespawn, et ne garde en local que son fondu de retour --
* c'est de l'affichage, ca lui appartient.
*/
void RespawnPlayer();
UFUNCTION(Server, Reliable)
void Server_RequestRespawn();
// ------------------------------------------------------------------
// Ouverture d'ecran demandee par un acteur du monde
//
// Interact_Implementation s'execute sur le SERVEUR depuis le passage en
// coop. Or ces acteurs ouvrent une interface, qui n'existe que sur la
// machine du joueur : l'appel doit donc repartir vers le client par une
// RPC Client_. Sans elles, le serveur cree des widgets dans le vide et
// l'ecran du joueur ne s'ouvre jamais.
//
// L'etat "devant quel poste je suis" est tenu des DEUX cotes : le client en
// a besoin pour filtrer sa liste de recettes, le serveur pour valider le
// craft. Ne le tenir que d'un cote laisserait soit une liste vide, soit un
// etabli utilisable depuis la foret.
// ------------------------------------------------------------------
UFUNCTION(Client, Reliable)
void Client_OpenCraftingAtStation(ECraftingStation Station);
UFUNCTION(Client, Reliable)
void Client_OpenStorage(AStorageContainer* Container);
/** Le joueur a referme son ecran : le serveur reprend le poste accorde. */
UFUNCTION(Server, Reliable)
void Server_ReleaseStation(ECraftingStation Station);
/** Le joueur a referme le coffre : le serveur rabat le couvercle. */
UFUNCTION(Server, Reliable)
void Server_ReleaseStorage(AStorageContainer* Container);
/** Accorde le poste sur le composant du pawn et note lequel. */
void GrantStation(ECraftingStation Station);
// ------------------------------------------------------------------
// Pseudo
//
// Le serveur ne peut PAS deviner le pseudo Steam d'un client : l'API
// d'identite ne connait que l'utilisateur local de chaque machine. C'est
// donc au client de l'annoncer. Sans ca, le moteur laisse le nom par
// defaut du fichier de configuration -- on lit "Player" au-dessus des
// quatre joueurs, ce qui se remarque tout de suite.
// ------------------------------------------------------------------
/** Le pseudo de l'utilisateur Steam local, ou une chaine vide si indisponible. */
FString ResolveLocalPlayerNickname() const;
/** Ecrit le pseudo sur le PlayerState, qui le replique a tout le monde. */
UFUNCTION(Server, Reliable)
void Server_SetPlayerNickname(const FString& Nickname);
FTimerHandle RespawnTimerHandle;
/** Surveillance de l'eloignement, actif seulement pendant qu'un coffre est ouvert. */