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)
Retour en haut