Advertisement
HowToRoblox

CodesServer

Dec 18th, 2022
1,515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.21 KB | None | 0 0
  1. local dss = game:GetService("DataStoreService")
  2. local playerDS = dss:GetDataStore("PLAYERS DATA STORE")
  3. local codesDS = dss:GetDataStore("CODES DATA STORE")
  4.  
  5. local rs = game:GetService("ReplicatedStorage"):WaitForChild("CodesReplicatedStorage")
  6. local re = rs:WaitForChild("RemoteEvent")
  7. local codes = require(rs:WaitForChild("CodesModule"))
  8. local tools = rs:WaitForChild("ToolRewards")
  9.  
  10. local fireServerDebounce = {}
  11.  
  12.  
  13. function saveData(plr)
  14.     if not plr:FindFirstChild("DATA FAILED TO LOAD") then
  15.        
  16.         local cash = plr.leaderstats.Cash.Value
  17.        
  18.         local codeTools = {}
  19.         for _, child in pairs(plr.StarterGear:GetChildren()) do
  20.             if tools:FindFirstChild(child.Name) then
  21.                 table.insert(codeTools, child.Name)
  22.             end
  23.         end
  24.        
  25.         local redeemedCodes = {}
  26.         for _, value in pairs(plr["REDEEMED CODES"]:GetChildren()) do
  27.             table.insert(redeemedCodes, value.Name)
  28.         end
  29.        
  30.         local compiledData = {
  31.             Cash = cash;
  32.             Tools = codeTools;
  33.             Redeemed = redeemedCodes;
  34.         }
  35.        
  36.         local success, err = nil, nil
  37.         while not success do
  38.             success, err = pcall(function()
  39.                 playerDS:SetAsync(plr.UserId, compiledData)
  40.             end)
  41.             if err then
  42.                 warn(err)
  43.             end
  44.             task.wait(0.1)
  45.         end
  46.     end
  47. end
  48.  
  49. game.Players.PlayerRemoving:Connect(saveData)
  50. game:BindToClose(function()
  51.     for _, plr in pairs(game.Players:GetPlayers()) do
  52.         saveData(plr)
  53.     end
  54. end)
  55.  
  56. game.Players.PlayerAdded:Connect(function(plr)
  57.    
  58.     local dataFailedWarning = Instance.new("StringValue")
  59.     dataFailedWarning.Name = "DATA FAILED TO LOAD"
  60.     dataFailedWarning.Parent = plr
  61.    
  62.     local success, plrData = nil, nil
  63.     while not success do
  64.         success, plrData = pcall(function()
  65.             return playerDS:GetAsync(plr.UserId)
  66.         end)
  67.     end
  68.     dataFailedWarning:Destroy()
  69.    
  70.     if not plrData then
  71.         plrData = {Cash = 0; Tools = {}; Redeemed = {}}
  72.     end
  73.    
  74.    
  75.     local ls = Instance.new("Folder")
  76.     ls.Name = "leaderstats"
  77.    
  78.     local cashVal = Instance.new("IntValue")
  79.     cashVal.Name = "Cash"
  80.     cashVal.Value = plrData.Cash
  81.     cashVal.Parent = ls
  82.    
  83.     ls.Parent = plr
  84.    
  85.     for _, toolName in pairs(plrData.Tools) do
  86.         if tools:FindFirstChild(toolName) then
  87.             tools[toolName]:Clone().Parent = plr.StarterGear
  88.            
  89.             if plr.Character then
  90.                 tools[toolName]:Clone().Parent = plr.Backpack
  91.             end
  92.         end
  93.     end
  94.    
  95.     local redeemedFolder = Instance.new("Folder")
  96.     redeemedFolder.Name = "REDEEMED CODES"
  97.    
  98.     for _, redeemedCode in pairs(plrData.Redeemed) do
  99.         local value = Instance.new("StringValue")
  100.         value.Name = redeemedCode
  101.         value.Parent = redeemedFolder
  102.     end
  103.    
  104.     redeemedFolder.Parent = plr
  105. end)
  106.  
  107.  
  108. function giveReward(plr, code)
  109.     local redeemedValue = Instance.new("StringValue")
  110.     redeemedValue.Name = code
  111.     redeemedValue.Parent = plr["REDEEMED CODES"]
  112.    
  113.     re:FireClient(plr, "SUCCESS", "Successfully redeemed!")
  114.    
  115.     for _, reward in pairs(codes[code].reward) do
  116.         if type(reward) == "string" then
  117.             local splitReward = string.split(reward, " ")
  118.             local rewardAmount = tonumber(splitReward[1])
  119.             local rewardType = splitReward[2]
  120.  
  121.             if plr.Character and plr.Character:FindFirstChild("Humanoid") then
  122.                 local hasProperty = false
  123.                 hasProperty = pcall(function()
  124.                     local checkForProperty = plr.Character.Humanoid[rewardType]
  125.                 end)
  126.                 if hasProperty then
  127.                     plr.Character.Humanoid[rewardType] = rewardAmount
  128.                 end
  129.             end
  130.  
  131.             if plr.leaderstats:FindFirstChild(rewardType) then
  132.                 plr.leaderstats[rewardType].Value += rewardAmount
  133.             end
  134.  
  135.         elseif reward:IsA("Tool") then
  136.             reward:Clone().Parent = plr.StarterGear
  137.             if plr.Character then
  138.                 reward:Clone().Parent = plr.Backpack
  139.             end
  140.         end
  141.     end
  142. end
  143.  
  144.  
  145. re.OnServerEvent:Connect(function(plr, instruction, value)
  146.    
  147.     if not fireServerDebounce[plr] then
  148.         fireServerDebounce[plr] = true
  149.        
  150.         if instruction == "REDEEM CODE" then
  151.             local codeInfo = codes[value]
  152.            
  153.             if not codeInfo then
  154.                 re:FireClient(plr, "ERROR", "Code not found!")
  155.                
  156.             else
  157.                 if (codeInfo.expiresAt and os.time() > codeInfo.expiresAt) then
  158.                     re:FireClient(plr, "ERROR", "Code has expired!")
  159.                    
  160.                 else
  161.                     if (not codeInfo.repeatable and plr["REDEEMED CODES"]:FindFirstChild(value)) then
  162.                         re:FireClient(plr, "ERROR", "Already redeemed!")
  163.                        
  164.                     else
  165.                         local maxRedeems = codeInfo.maxRedeems
  166.                        
  167.                         if maxRedeems then
  168.                             local getSucc, codeData = nil, nil
  169.                             getSucc, codeData = pcall(function()
  170.                                 return codesDS:GetAsync(value)
  171.                             end)
  172.                            
  173.                             if not getSucc then
  174.                                 re:FireClient(plr, "ERROR", "Something went wrong.. Try again.")
  175.                                
  176.                             else
  177.                                 if not codeData then
  178.                                     codeData = 0
  179.                                 end
  180.                                
  181.                                 if codeData < maxRedeems then
  182.                                     local setSucc, err = pcall(function()
  183.                                         codesDS:SetAsync(value, codeData + 1)
  184.                                     end)
  185.                                    
  186.                                     if setSucc then
  187.                                         giveReward(plr, value)
  188.                                        
  189.                                     else
  190.                                         re:FireClient(plr, "ERROR", "Something went wrong.. Try again.")
  191.                                     end
  192.                                    
  193.                                 else
  194.                                     re:FireClient(plr, "ERROR", "Code redeemed by other players.")
  195.                                 end
  196.                             end
  197.                        
  198.                         else
  199.                             giveReward(plr, value)
  200.                         end
  201.                     end
  202.                 end
  203.             end
  204.         end
  205.        
  206.         task.wait(1)
  207.         fireServerDebounce[plr] = false
  208.     end
  209. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement