Advertisement
HowToRoblox

CratesClient

Mar 3rd, 2023
2,067
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.88 KB | None | 0 0
  1. --Variables
  2. local rs = game:GetService("ReplicatedStorage")
  3. local remotes = rs:WaitForChild("RemoteEvents")
  4. local rarityProperties = rs:WaitForChild("RarityProperties")
  5. local items = rs:WaitForChild("Items")
  6. local crates = rs:WaitForChild("Crates")
  7.  
  8. local shopGui = script.Parent:WaitForChild("CrateShopGui");shopGui.Enabled = true
  9. local openShopBtn = shopGui:WaitForChild("OpenButton");openShopBtn.Visible = true
  10. local shopFrame = shopGui:WaitForChild("CrateShopFrame");shopFrame.Visible = false
  11. local closeShopBtn = shopFrame:WaitForChild("CloseButton")
  12. local cratesList = shopFrame:WaitForChild("CratesList")
  13. local selectedCrate = shopFrame:WaitForChild("SelectedCrate");selectedCrate.Visible = false
  14.  
  15. local openedGui = script.Parent:WaitForChild("OpenedCrateGui");openedGui.Enabled = false
  16. local openedFrame = openedGui:WaitForChild("CrateFrame");openedFrame.Visible = false
  17. local closeOpenedBtn = openedFrame:WaitForChild("ContinueButton")
  18. local openedItemsFrame = openedFrame:WaitForChild("ItemsFrame")
  19.  
  20. local crateButtonTemplate = script:WaitForChild("CrateShopButton")
  21. local selectedCrateItemTemplate = script:WaitForChild("SelectedCrateItemFrame")
  22. local openingCrateItemTemplate = script:WaitForChild("OpeningCrateItemFrame")
  23.  
  24. local rnd = Random.new()
  25.  
  26.  
  27. --Open and close buttons
  28. openShopBtn.MouseButton1Click:Connect(function()
  29.     if openedFrame.Visible == false then
  30.         shopFrame.Visible = not shopFrame.Visible
  31.     end
  32. end)
  33.  
  34. closeShopBtn.MouseButton1Click:Connect(function()
  35.     shopFrame.Visible = false
  36. end)
  37.  
  38. closeOpenedBtn.MouseButton1Click:Connect(function()
  39.     openedFrame.Visible = false
  40.     openedGui.Enabled = false
  41.    
  42.     for _, child in pairs(openedItemsFrame.ItemsContainer:GetChildren()) do
  43.         if child:IsA("Frame") then
  44.             child:Destroy()
  45.         end
  46.     end
  47. end)
  48.  
  49.  
  50. --Setting up crates shop
  51. local crateButtons = {}
  52.  
  53. for _, crate in pairs(crates:GetChildren()) do
  54.    
  55.     local crateProperties = require(crate)
  56.    
  57.     local newBtn = crateButtonTemplate:Clone()
  58.     newBtn.Name = crate.Name
  59.     newBtn.CrateName.Text = crate.Name
  60.     newBtn.CrateImage.Image = crateProperties["Image"]
  61.    
  62.     newBtn.MouseButton1Click:Connect(function()
  63.        
  64.         if selectedCrate.CrateName.Text ~= crate.Name then
  65.            
  66.             selectedCrate.CrateName.Text = crate.Name
  67.             selectedCrate.CrateImage.Image = crateProperties["Image"]
  68.             selectedCrate.UnboxButton.Text = "$" .. crateProperties["Price"]
  69.            
  70.             local rarities = {}
  71.             for rarityName, chance in pairs(crateProperties["Chances"]) do
  72.                 table.insert(rarities, {rarityName, chance})
  73.             end
  74.             table.sort(rarities, function(a, b)
  75.                 return rarityProperties[a[1]].Order.Value <rarityProperties[b[1]].Order.Value
  76.             end)
  77.            
  78.             local raritiesText = ""
  79.             for _, rarity in pairs(rarities) do
  80.                 local color = rarityProperties[rarity[1]].Color.Value
  81.                 color = {R = math.round(color.R*255); G = math.round(color.G*255); B = math.round(color.B*255)}
  82.                 raritiesText = raritiesText .. '<font color="rgb(' .. color.R .. ',' .. color.G .. ',' .. color.B .. ')">' .. rarity[1] .. ': <b>' .. rarity[2] .. '%</b></font><br />'
  83.             end
  84.             selectedCrate.RaritiesText.RichText = true
  85.             selectedCrate.RaritiesText.Text = raritiesText
  86.            
  87.             for _, child in pairs(selectedCrate.ItemsList:GetChildren()) do
  88.                 if child:IsA("Frame") then
  89.                     child:Destroy()
  90.                 end
  91.             end
  92.            
  93.             local unboxableItems = crateProperties["Items"]
  94.             table.sort(unboxableItems, function(a, b)
  95.                 return
  96.                     (rarityProperties[items:FindFirstChild(a, true).Parent.Name].Order.Value < rarityProperties[items:FindFirstChild(b, true).Parent.Name].Order.Value)
  97.                     or (rarityProperties[items:FindFirstChild(a, true).Parent.Name].Order.Value == rarityProperties[items:FindFirstChild(b, true).Parent.Name].Order.Value)
  98.                     and (a < b)
  99.             end)
  100.            
  101.             for _, unboxableItemName in pairs(unboxableItems) do
  102.                 local newItemFrame = selectedCrateItemTemplate:Clone()
  103.                 newItemFrame.ItemName.Text = unboxableItemName
  104.                 newItemFrame.ItemName.TextColor3 = rarityProperties[items:FindFirstChild(unboxableItemName, true).Parent.Name].Color.Value
  105.                
  106.                 local itemModel = Instance.new("Model")
  107.                
  108.                 for _, child in pairs(items:FindFirstChild(unboxableItemName, true):GetChildren()) do
  109.                     if not (child:IsA("Script") or child:IsA("LocalScript") or child:IsA("ModuleScript") or child:IsA("Sound")) then
  110.                         child:Clone().Parent = itemModel
  111.                     end
  112.                 end
  113.                
  114.                 itemModel:PivotTo(CFrame.new() * CFrame.Angles(math.rad(-39), 0, 0))
  115.                
  116.                 itemModel.Parent = newItemFrame.ItemImage
  117.                
  118.                 local currentCamera = Instance.new("Camera")
  119.                 currentCamera.CFrame = CFrame.new(Vector3.new(-itemModel:GetExtentsSize().Y*0.7, 0, 0), itemModel:GetPivot().Position + Vector3.new(0, -0.1, 0))
  120.                 currentCamera.Parent = newItemFrame.ItemImage
  121.                 newItemFrame.ItemImage.CurrentCamera = currentCamera
  122.                
  123.                 newItemFrame.Parent = selectedCrate.ItemsList
  124.             end
  125.            
  126.             selectedCrate.Visible = true
  127.         end
  128.     end)
  129.    
  130.     table.insert(crateButtons, {newBtn, crateProperties["Price"]})
  131. end
  132.  
  133. table.sort(crateButtons, function(a, b)
  134.     return (a[2] < b[2]) or (a[2] == b[2] and a[1].Name < b[1].Name)
  135. end)
  136.  
  137. for _, crateButton in pairs(crateButtons) do
  138.     crateButton[1].Parent = cratesList
  139. end
  140.  
  141.  
  142. --Purchasing crates
  143. selectedCrate.UnboxButton.MouseButton1Click:Connect(function()
  144.     if selectedCrate.Visible == true and game.Players.LocalPlayer.leaderstats.Cash.Value >= tonumber(string.sub(selectedCrate.UnboxButton.Text, 2, -1)) then
  145.         remotes:WaitForChild("BuyCrate"):FireServer(selectedCrate.CrateName.Text)
  146.     end
  147. end)
  148.  
  149.  
  150. --Unboxing crates
  151. function lerp(a, b, t)
  152.     return a + (b-a) * t
  153. end
  154.  
  155. function tweenGraph(x, pow)
  156.     x = math.clamp(x, 0, 1)
  157.     return 1 - (1-x)^pow
  158. end
  159.  
  160.  
  161. remotes:WaitForChild("CrateOpened").OnClientEvent:Connect(function(crateName, itemChosen, unboxTime)
  162.    
  163.     local crateProperties = require(crates[crateName])
  164.    
  165.     local numItems = rnd:NextInteger(20, 100)
  166.     local chosenPosition = rnd:NextInteger(15, numItems-5)
  167.    
  168.     for i = 1, numItems do
  169.        
  170.         local rarityChosen = itemChosen.Parent.Name
  171.         local randomItemChosen = itemChosen
  172.        
  173.         if i ~= chosenPosition then
  174.             local rndChance = rnd:NextNumber() * 100
  175.             local n = 0
  176.            
  177.             for rarity, chance in pairs(crateProperties["Chances"]) do 
  178.                 n += chance
  179.                 if rndChance <= n then
  180.                     rarityChosen = rarity
  181.                     break
  182.                 end
  183.             end
  184.  
  185.             local unboxableItems = crateProperties["Items"]
  186.             for i = #unboxableItems, 2, -1 do
  187.                 local j = rnd:NextInteger(1, i)
  188.                 unboxableItems[i], unboxableItems[j] = unboxableItems[j], unboxableItems[i]
  189.             end
  190.            
  191.             for _, itemName in pairs(unboxableItems) do
  192.                 if items:FindFirstChild(itemName, true).Parent.Name == rarityChosen then
  193.                     randomItemChosen = items:FindFirstChild(itemName, true)
  194.                     break
  195.                 end
  196.             end
  197.         end
  198.        
  199.         local newItemFrame = openingCrateItemTemplate:Clone()
  200.         newItemFrame.ItemName.Text = randomItemChosen.Name
  201.         newItemFrame.ItemName.TextColor3 = rarityProperties[rarityChosen].Color.Value
  202.        
  203.         local itemModel = Instance.new("Model")
  204.  
  205.         for _, child in pairs(randomItemChosen:GetChildren()) do
  206.             if not (child:IsA("Script") or child:IsA("LocalScript") or child:IsA("ModuleScript") or child:IsA("Sound")) then
  207.                 child:Clone().Parent = itemModel
  208.             end
  209.         end
  210.  
  211.         itemModel:PivotTo(CFrame.new() * CFrame.Angles(math.rad(-39), 0, 0))
  212.  
  213.         itemModel.Parent = newItemFrame.ItemImage
  214.  
  215.         local currentCamera = Instance.new("Camera")
  216.         currentCamera.CFrame = CFrame.new(Vector3.new(-itemModel:GetExtentsSize().Y*0.7, 0, 0), itemModel:GetPivot().Position + Vector3.new(0, -0.1, 0))
  217.         currentCamera.Parent = newItemFrame.ItemImage
  218.         newItemFrame.ItemImage.CurrentCamera = currentCamera
  219.        
  220.         newItemFrame.Parent = openedItemsFrame.ItemsContainer
  221.     end
  222.    
  223.     openedItemsFrame.ItemsContainer.Position = UDim2.new(0, 0, 0.5, 0)
  224.    
  225.     local cellSize = openingCrateItemTemplate.Size.X.Scale
  226.     local padding = openedItemsFrame.ItemsContainer.UIListLayout.Padding.Scale
  227.     local pos1 = 0.5 - cellSize/2
  228.     local nextOffset = -cellSize - padding
  229.    
  230.     local posFinal = pos1 + (chosenPosition-1) * nextOffset
  231.     local rndOffset = rnd:NextNumber(-cellSize/2, cellSize/2)
  232.     posFinal += rndOffset
  233.    
  234.     local timeOpened = tick()
  235.    
  236.     openedFrame.CrateName.Text = crateName
  237.     shopFrame.Visible = false
  238.     closeOpenedBtn.Visible = false
  239.     openedFrame.Visible = true
  240.     openedGui.Enabled = true
  241.    
  242.     local pow = rnd:NextNumber(2, 10)
  243.     local lastSlot = 0
  244.    
  245.     while true do
  246.         local timeSinceOpened = tick() - timeOpened
  247.         local x = timeSinceOpened / unboxTime
  248.        
  249.         local t = tweenGraph(x, pow)
  250.         local newXPos = lerp(0, posFinal, t)
  251.        
  252.         local currentSlot = math.abs(math.floor((newXPos+rndOffset)/cellSize))+1
  253.         if currentSlot ~= lastSlot then
  254.             script.TickSound:Play()
  255.             lastSlot = currentSlot
  256.         end
  257.        
  258.         openedItemsFrame.ItemsContainer.Position = UDim2.new(newXPos, 0, 0.5, 0)
  259.        
  260.         if x >= 1 then
  261.             break
  262.         end
  263.        
  264.         game:GetService("RunService").Heartbeat:Wait()
  265.     end
  266.    
  267.     closeOpenedBtn.Visible = true
  268. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement