如何限制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
相关产品推荐
相关产品推荐

