You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Roblox中leaderstats的Stage值不超过当前解锁阶段?

Roblox阶段选择按钮脚本问题:限制阶段值超出解锁范围失败

我在开发Roblox游戏的阶段选择按钮功能,初始版本脚本可正常运行,但存在leaderstats的Stage值可以累加超过当前已解锁阶段的问题。尝试用if/elseif语句限制Stage值不超过已解锁上限、不低于0,结果整个脚本直接失效。


界面元素颜色说明

  • 🟥 红色 = 按钮
  • ⬜ 白色 = leaderstats Stage值
  • 🟨 黄色 = 当前阶段值及阶段名称

界面截图


初始可运行脚本

event:FireServer("MoveToStage", (CurrentStage (+-) 1) 
player.leaderstats.Stage.Value (+-)= 1

尝试的限制脚本(导致失效)

Stage.LeftEditStageBTN.MouseButton1Click:Connect(function(stage)
    event:FireServer("MoveToStage", (CurrentStage + 1))
    player.leaderstats.Stage.Value += 1

        if stage >= currentStage.Value then stage = currentStage.Value
        elseif stage <= 0 then stage = 0
        elseif stage >= 0 and stage <= currentStage.Value then stage = stage
    end
end)

Stage.RightEditStageBTN.MouseButton1Click:Connect(function(stage)
    event:FireServer("MoveToStage", (CurrentStage + 1))
    player.leaderstats.Stage.Value += 1

        if stage >= currentStage.Value then stage = currentStage.Value
        elseif stage <= 0 then stage = 0
        elseif stage >= 0 and stage <= currentStage.Value then stage = stage
    end
end)

完整服务端脚本

-- SERVICES --
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local MarketService = game:GetService("MarketplaceService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local DataService = game:GetService("DataStoreService")

-- VARIABLES --
local event = ReplicatedStorage:WaitForChild("Handler")
local Stages = workspace.Stages

-- DATA STORE --
local PlayerData = DataService:GetDataStore("PlayerData")

-- TABLES --
local ProductID = {
    ["SkipStage"] = 1339405103;
}

-- FUNCTIONS --
function SaveData(player)
    PlayerData:SetAsync(player.UserId, player.leaderstats.Stage.Value)
end

function TpToStage(player, stage)
    if stage == player.CurrentStage.Value then return end
    player.CurrentStage.Value = stage
    player.Character.HumanoidRootPart.CFrame = Stages[tostring(stage)].CFrame + Vector3.new(0,4,0)
    event:FireClient(player, "UpdateStage", stage)
end

function MoveToStage(player, stage)
    local currentStage = player.leaderstats.Stage

    if stage >= currentStage.Value then stage = currentStage.Value
    elseif stage <= 0 then stage = 0
    elseif stage >= 0 and stage <= currentStage.Value then stage = stage
    end


    TpToStage(player, stage)
end

-- TRIGGERS --
local ProductFunctions = {
    ["P1339405103"] = function(player)
        player.leaderstats.Stage.Value += 1
        TpToStage(player, player.leaderstats.Stage.Value)
    end;
}

Players.PlayerAdded:Connect(function(player)
    for i,v in pairs(script.PLAYER:GetChildren()) do
        v:Clone().Parent = player
    end


    local DATA
    pcall(function()
        DATA = PlayerData:GetAsync(player.UserId)
    end)

    if DATA then 
        player.leaderstats.Stage.Value = DATA 
    else 
        player.leaderstats.Stage.Value = 0 
    end

    player.CurrentStage.Value = player.leaderstats.Stage.Value
    event:FireClient(player, "UpdateStage", player.leaderstats.Stage.Value)

    player.CharacterAdded:Connect(function(character)
        task.wait()
        character:WaitForChild("HumanoidRootPart").CFrame = Stages[tostring(player.leaderstats.Stage.Value)].CFrame + Vector3.new(0,4,0)
    end)
end)

event.OnServerEvent:Connect(function(player, argument1, argument2)
    if argument1 == "SkipStage" then
        if player.leaderstats.Stage.Value < (#(Stages:GetChildren()) - 1) then
            MarketService:PromptProductPurchase(player, ProductID["SkipStage"])
        else
            event:FireClient(player, "MaxStage")
        end

    elseif argument1 == "MoveToStage" then
        MoveToStage(player, tonumber(argument2))
    end
end)

MarketService.ProcessReceipt = function(RecieptInfo)
    local player = Players:GetPlayerByUserId(RecieptInfo.PlayerId)

    if ProductFunctions["P"..RecieptInfo.ProductId] and ProductFunctions["P"..RecieptInfo.ProductId] ~= nil then
        pcall(ProductFunctions["P"..RecieptInfo.ProductId](player), "e")
    end

    return Enum.ProductPurchaseDecision.PurchaseGranted
end

-- LOOPS --
-- STAGES --
coroutine.resume(coroutine.create(function()
    for i, v in pairs(Stages:GetChildren()) do
        v.Touched:Connect(function(hit)
            if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
                local player = Players:GetPlayerFromCharacter(hit.Parent)
                local number = tonumber(v.Name)

                if number > player.leaderstats.Stage.Value then
                    player.leaderstats.Stage.Value = number
                    player.CurrentStage.Value = number
                    event:FireClient(player, "UpdateStage", number)
                end
            end
        end)
    end
end))

Players.PlayerRemoving:Connect(function(player)
    SaveData(player)
end)

game:BindToClose(function()
    for i, player in pairs(Players:GetPlayers()) do
        SaveData(player)
    end
end)

完整客户端脚本

task.wait(0.2)

--SERVICES --
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")

-- VARIABLES --
local player = Players.LocalPlayer
local CurrentStage = 0
local event = ReplicatedStorage:WaitForChild("Handler")
local Stage = script.Parent.Main.EditStageTXT
local SkipButton = script.Parent.Main.SkipStageBTN
local MaxStage = script.Parent.Main.MaxLevelTXT

-- FUNCTIONS -- 
function UpdateStage(number)
    Stage.Text = "Stage: "..tostring(number)
    CurrentStage = number
end

-- TRIGGERS --
SkipButton.MouseButton1Click:Connect(function()
    event:FireServer("SkipStage")
end)

Stage.LeftEditStageBTN.MouseButton1Click:Connect(function(stage)
    event:FireServer("MoveToStage", (CurrentStage - 1))
    player.leaderstats.Stage.Value -= 1
end)

Stage.RightEditStageBTN.MouseButton1Click:Connect(function(stage)
    event:FireServer("MoveToStage", (CurrentStage + 1))
    player.leaderstats.Stage.Value += 1
end)

event.OnClientEvent:Connect(function(argument1, argument2)
    if argument1 == "UpdateStage" then
        UpdateStage(tonumber(argument2))
        
    elseif argument1 == "MaxStage" then
        Stage.Visible = false
        SkipButton.Visible = false
        MaxStage.Visible = true
        task.wait(3)
        Stage.Visible = true
        SkipButton.Visible = true
        MaxStage.Visible = false
    end
end)

-- LOOPS --
RunService.RenderStepped:Connect(function(player)
    UpdateStage(player.CurrentStage.Value)
end)

内容的提问来源于stack exchange,提问作者Simple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:01:05