Classement
Sur cette page tu trouveras comment faire:
- Un script Local Joueur pour gerer les joueurs en jeu, leur temps en jeu
- Un classement simple qui utilise la fonctionalité de classement de Roblox
- Un script de Classement avec affichage
Pour les faires fonctionner il te faudra un RemoteEvent. Consulte la fiche « Variable Serveur » si tu ne sais plus comment cet element fonctione!
Script Local Joueur
Ce premier script permet aux joueur d’entrer ou de sortir du jeu en touchant un objet, et d’être chronometrés
local humanoid = script.Parent:WaitForChild("Humanoid") --recupère le corps du joueur pour tester ce qui est touché
local player = game.Players:GetPlayerFromCharacter(script.Parent) -- récupère le joueur dans la liste des joueurs pour gerer les scores
local Remote = game:GetService("ReplicatedStorage"):WaitForChild("ClassementRemote") -- accès au données du serveur
local inGame = false
local chrono = 0
humanoid.Touched:Connect(function(hit) --si on touche un objet
if hit.Name == "StartGame" and inGame == false then --si il a le tag qu'on veut et qu'on est pas déjà en jeu
inGame = true
Remote:FireServer(inGame,chrono) -- envoi l'état du joueur au serveur, évite les triches
end
if hit.Name == "EndGame" and inGame == true then --si il a le tag qu'on veut et qu'on est pas deja hors-jeu
inGame = false
Remote:FireServer(inGame,chrono) -- envoi l'état du joueur au serveur, évite les triches
chrono = 0 --reset le chrono
end
end)
--pendant qu'on est en jeu, chronomètre le joueur
while true do
wait(1)
if inGame then
chrono += 1
end
end
Serveur script: version simple
Ici on utilise le système d’affichage de Roblox pour faire directement le classement pour tous les joueurs
local function playerSpawned(player) --création des valeurs. Une fois créer ici elles ne se mettent pas a jour sauf si le server le demande
local leaderstats = Instance.new("Folder", player)
leaderstats.Name = "leaderstats"
local chrono = Instance.new("IntValue", leaderstats)
chrono.Name = "chrono"
chrono.Value = 0
local ingame = Instance.new("BoolValue", leaderstats)
ingame.Name = "ingame"
ingame.Value = false
end
game.Players.PlayerAdded:Connect(playerSpawned) --done aux nouveau joueur leurs valeurs
local Remote = game:GetService("ReplicatedStorage"):WaitForChild("ClassementRemote") -- accès au données du serveur
Remote.OnServerEvent:Connect(function(Player, Value, Chrono) -- quand le serveur reçoit l'info que ses données ont changées
Player.leaderstats.ingame.Value = Value -- actualiser son état de jeu
Player.leaderstats.chrono.Value = Chrono -- actualiser son chronomètre
end)
Serveur Script: version complexe personalisée
Ce script-ci permet de faire l’affichage mais de façon personalisée. C’est à dire qu’on peut afficher les joueurs par nombre croissant ou decroissant de points.
Pour l’utiliser il te faudra dans ton niveau un panneau d’affichage avec les élements suivants:
-- Récupère le panneau d'affichage (par son nom)
local rankingPart = game.Workspace.ClassementPanneau
-- Récupère le RemoteEvent pour recevoir les données du serveur
local Remote = game:GetService("ReplicatedStorage"):WaitForChild("ClassementRemote")
-- Tableau pour stocker les données du classement actuel
local scoreArray = {}
-- Fonction pour trier les scores en ordre décroissant
local function Decroissant()
table.sort(scoreArray, function(a, b)
return a[2] > b[2] -- Trier en ordre décroissant par le deuxième élément (Timer). Pour changer en ordre croissant mettre un <
end)
return scoreArray
end
-- Fonction pour mettre à jour le texte du classement
local function updateText()
local sortedScores = Decroissant() -- Trier les scores
local rankingText = "" -- Préparer un texte vide
for _, value in ipairs(sortedScores) do -- Pour chaque joueur dans les scores triés
if value[3] then -- Si le joueur est en jeu, affiche son nom et indique qu'il est en jeu
rankingText = rankingText .. value[1] .. " ___ En Jeu" .. "\n" -- \n pour aller à la ligne suivante
else -- Si le joueur est hors-jeu, affiche son temps
rankingText = rankingText .. value[1] .. "___" .. tostring(value[2]) .. "\n"
end
end
-- Affiche le classement sur le panneau
rankingPart.RankingSurfaceGui.ScrollingFrame.TextLabel.Text = rankingText
end
-- quand le serveur reçoit l'info que ses données ont changées
Remote.OnServerEvent:Connect(function(Player, Value, Timer)
local index = 0
-- Cherche si le joueur existe déjà le tableau des scores
for i, entry in ipairs(scoreArray) do
if entry[1] == Player.Name then
index = i -- récupère la place actuelle du joueur si il existe
end
end
if index == 0 then
-- Si le joueur n'est pas trouvé, l'ajoute à la liste
table.insert(scoreArray, {Player.Name, Timer, Value})
else
-- Si le joueur est trouvé, met à jour son temps et son état de jeu
scoreArray[index][2] = Timer
scoreArray[index][3] = Value
end
updateText() -- Met à jour le texte du classement
end)