Passer au contenu principal
Version: latest - a1.169.2 ⚖️

Cycle de vie du joueur

Les événements déclenchés de la connexion d'un joueur jusqu'à son départ, et le bon moment pour chaque action.

Vue d'ensemble​

Quand quelqu'un rejoint votre serveur, voici les principaux événements déclenchés, dans l'ordre :

#ÉvénementCôtéCe qui s'est passé
1PlayerConnect (Server)ServerQuelqu'un essaie de se connecter. Le Player n'existe pas encore
2Spawn sur PlayerServerL'entité Player a été créée. Le client charge encore la map et télécharge les fichiers
3SpawnLocalPlayer (Client)ClientLe client a fini de charger et son propre Player est disponible avec Client.GetLocalPlayer()
4ReadyServerLe client a entièrement chargé la map et toutes les entités, il est prêt à jouer
5PossessLes deuxLe joueur a commencé à contrôler un Pawn (par ex. un Character)
-UnPossessLes deuxLe joueur a arrêté de contrôler un Pawn
6Destroy sur PlayerLes deuxLe joueur a quitté le serveur
7PlayerDisconnect (Server)ServerLa connexion a été fermée, avec la raison de la déconnexion
info

Un Player représente la personne connectée, et un Character un corps dans le monde. Un Player peut exister sans Character (il vole alors en spectateur), et un Character peut exister sans Player (comme PNJ). Voir Players vs Characters vs Pawn.

Refuser une connexion​

PlayerConnect (Server) est déclenché avant que l'entité Player existe : c'est donc là qu'on refuse quelqu'un, par exemple s'il n'est pas dans une whitelist :

Server/Index.lua
local whitelist = {
["123456789"] = true,
}

Server.Subscribe("PlayerConnect", function(ip, player_account_id, player_name, player_steam_id)
if (not whitelist[player_account_id]) then
Server.KickByAccountID(player_account_id, "You are not in the whitelist!")
end
end)
tip

Vous pouvez appeler Server.KickByAccountID() ou Server.BanByAccountID() pour expulser ou bannir des joueurs dont l'entité Player n'a pas encore été créée.

Donner un Character au joueur​

Vous pouvez créer un Character et le faire contrôler dès que le Player apparaît : le client le verra une fois son chargement terminé :

Server/Index.lua
function SpawnCharacterForPlayer(player)
-- Picks a random spawn point of the map, if any
local spawn_points = Server.GetMapSpawnPoints()
local spawn = spawn_points[math.random(#spawn_points)] or { location = Vector(0, 0, 100), rotation = Rotator() }

local character = Character(spawn.location, spawn.rotation, "nanos-world::SK_Male")
player:Possess(character)
end

Player.Subscribe("Spawn", SpawnCharacterForPlayer)

-- Also gives Characters to Players already connected when the Package (re)loads
Package.Subscribe("Load", function()
for _, player in pairs(Player.GetPairs()) do
if (not player:GetControlledCharacter()) then
SpawnCharacterForPlayer(player)
end
end
end)
tip

Utilisez plutôt l'événement Ready quand le client doit être entièrement chargé, par exemple pour lui envoyer des Remote Events, afficher un message de bienvenue ou lancer un compte à rebours seulement quand le joueur peut vraiment le voir.

Réapparition​

Quand un Character meurt, il n'est pas détruit : il reste en ragdoll. Vous pouvez le faire réapparaître au bout d'un moment avec :Respawn(), qui restaure sa vie et le déplace à une position :

Server/Index.lua
Character.Subscribe("Death", function(character, last_damage_taken, last_bone_damaged, damage_type_reason, hit_from_direction, instigator)
-- Only respawns Characters controlled by Players
if (not character:GetPlayer()) then return end

Timer.SetTimeout(function()
-- The Character (or the Player) may have been destroyed in the meantime
if (not character:IsValid()) then return end

character:Respawn(Vector(0, 0, 100), Rotator())
end, 5000)
end)

Faire le ménage quand le joueur part​

Le Character n'est pas détruit automatiquement quand le joueur part : en général, il faut le détruire vous-même :

Server/Index.lua
Player.Subscribe("Destroy", function(player)
local character = player:GetControlledCharacter()
if (character) then
character:Destroy()
end
end)

Côté client​

Sur le client, le Player local n'est disponible qu'après SpawnLocalPlayer. Pour suivre le Character que contrôle le joueur local (par ex. pour mettre à jour un HUD), abonnez-vous à son événement Possess :

Client/Index.lua
Client.Subscribe("SpawnLocalPlayer", function(local_player)
local_player:Subscribe("Possess", function(player, character)
Console.Log("I'm now controlling %s", tostring(character))
end)
end)

Voir le tutoriel HUD de base (Canvas) pour un exemple complet.