Advertisement
HowToRoblox

CTFServer

Nov 30th, 2022 (edited)
1,605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.60 KB | None | 0 0
  1. --Data handling
  2. local dss = game:GetService("DataStoreService")
  3. local ds = dss:GetDataStore("DATA STORES")
  4.  
  5.  
  6. function saveData(plr)
  7.    
  8.     if not plr:FindFirstChild("FAILED TO LOAD DATA") then
  9.         local cash = plr.leaderstats.Cash.Value
  10.        
  11.         local success, err = nil, nil
  12.         while not success do
  13.             success, err = pcall(function()
  14.                 return ds:SetAsync(plr.UserId, cash)
  15.             end)
  16.             warn(err)
  17.             task.wait(0.1)
  18.         end
  19.     end
  20. end
  21.  
  22. game.Players.PlayerRemoving:Connect(saveData)
  23. game:BindToClose(function()
  24.     for i, plr in pairs(game.Players:GetPlayers()) do
  25.         saveData(plr)
  26.     end
  27. end)
  28.  
  29.  
  30. game.Players.PlayerAdded:Connect(function(plr)
  31.    
  32.     local ls = Instance.new("Folder")
  33.     ls.Name = "leaderstats"
  34.     ls.Parent = plr
  35.    
  36.     local cashValue = Instance.new("IntValue")
  37.     cashValue.Name = "Cash"
  38.     cashValue.Parent = ls
  39.    
  40.    
  41.     local success, data = pcall(function()
  42.         return ds:GetAsync(plr.UserId)
  43.     end)
  44.    
  45.     if success then
  46.         cashValue.Value = data or 0
  47.        
  48.     else
  49.         local failedValue = Instance.new("StringValue")
  50.         failedValue.Name = "FAILED TO LOAD DATA"
  51.         failedValue.Parent = plr
  52.     end
  53. end)
  54.  
  55.  
  56. --Main game loop
  57. local rs = game.ReplicatedStorage:WaitForChild("CTFReplicatedStorage")
  58. local config = require(rs:WaitForChild("CONFIGURATION"))
  59. local maps = rs:WaitForChild("Maps")
  60. local weapons = rs:WaitForChild("Weapons")
  61. local flag = rs:WaitForChild("Flag"):WaitForChild("Flag")
  62.  
  63. local statusValue = Instance.new("StringValue")
  64. statusValue.Name = "STATUS"
  65. statusValue.Parent = rs
  66.  
  67. while true do
  68.    
  69.     local plrsInGame = {}
  70.     while true do
  71.         plrsInGame = {}
  72.         for i, plr in pairs(game.Players:GetPlayers()) do
  73.             if plr.Character and plr.Character.Humanoid.Health > 0 then
  74.                 table.insert(plrsInGame, plr)
  75.             end
  76.         end
  77.        
  78.         if #plrsInGame >= config.MinimumPlayersRequired then
  79.             break
  80.         else
  81.             local neededPlayers = config.MinimumPlayersRequired - #plrsInGame
  82.             statusValue.Value = "Waiting for " .. neededPlayers .. " more player" .. (neededPlayers ~= 1 and "s" or "")
  83.            
  84.             task.wait(1)
  85.         end
  86.     end
  87.    
  88.     statusValue.Value = "Intermission"
  89.     task.wait(config.IntermissionTime)
  90.    
  91.     local chosenMap = maps:GetChildren()[Random.new():NextInteger(1, #maps:GetChildren())]:Clone()
  92.     chosenMap.Parent = workspace
  93.    
  94.     statusValue.Value = "Now entering " .. chosenMap.Name
  95.    
  96.     task.wait(config.MapWaitTime)
  97.    
  98.    
  99.     for i, plr in pairs(plrsInGame) do
  100.         local chosenTeam = i%2==1 and "Team1" or "Team2"
  101.         plr.Team = config[chosenTeam]
  102.        
  103.         for x, tool in pairs(weapons[chosenTeam .. "Weapons"]:GetChildren()) do
  104.             tool:Clone().Parent = plr.Backpack
  105.         end
  106.        
  107.         local char = plr.Character
  108.         char.HumanoidRootPart.CFrame = chosenMap.PlayerSpawns[chosenTeam .. "Spawn"].CFrame
  109.        
  110.         local connection = plr.CharacterAdded:Connect(function(newChar)
  111.             local newHRP = newChar:WaitForChild("HumanoidRootPart")
  112.             newHRP:GetPropertyChangedSignal("CFrame"):Wait()
  113.             newHRP.CFrame = chosenMap.PlayerSpawns[chosenTeam .. "Spawn"].CFrame
  114.            
  115.             for x, tool in pairs(weapons[chosenTeam .. "Weapons"]:GetChildren()) do
  116.                 tool:Clone().Parent = plr.Backpack
  117.             end
  118.         end)
  119.        
  120.         chosenMap.Destroying:Connect(function()
  121.             connection:Disconnect()
  122.         end)
  123.     end
  124.    
  125.    
  126.     local team1FlagSpawn = chosenMap.FlagSpawns.Team1Flag
  127.     local team2FlagSpawn = chosenMap.FlagSpawns.Team2Flag
  128.    
  129.     local team1Flag = flag:Clone()
  130.     team1Flag.Base.Color = config.Team1.TeamColor.Color
  131.     team1Flag.FlagModel.Flag.Color = config.Team1.TeamColor.Color
  132.     team1Flag:SetPrimaryPartCFrame(team1FlagSpawn.CFrame * CFrame.Angles(0, 0, math.rad(-90)))
  133.     team1Flag.Parent = chosenMap
  134.    
  135.     local team2Flag = flag:Clone()
  136.     team2Flag.Base.Color = config.Team2.TeamColor.Color
  137.     team2Flag.FlagModel.Flag.Color = config.Team2.TeamColor.Color
  138.     team2Flag:SetPrimaryPartCFrame(team2FlagSpawn.CFrame * CFrame.Angles(0, 0, math.rad(-90)))
  139.     team2Flag.Parent = chosenMap
  140.    
  141.     local scoresFolder = Instance.new("Folder")
  142.     scoresFolder.Name = "SCORES"
  143.     scoresFolder.Parent = rs
  144.    
  145.     local team1Score = Instance.new("IntValue")
  146.     team1Score.Name = "TEAM 1 SCORE"
  147.     team1Score.Parent = scoresFolder
  148.     local team2Score = Instance.new("IntValue")
  149.     team2Score.Name = "TEAM 2 SCORE"
  150.     team2Score.Parent = scoresFolder
  151.    
  152.     local flag1Taken = false
  153.     local flag2Taken = false
  154.    
  155.     team1Flag.Base.Touched:Connect(function(hit)
  156.        
  157.         local charTouched = hit.Parent
  158.         local plrTouched = game.Players:GetPlayerFromCharacter(charTouched)
  159.         if plrTouched and plrTouched.Team == config.Team2 and charTouched.Humanoid.Health > 0 and not flag1Taken then
  160.             flag1Taken = charTouched
  161.            
  162.             local flagOnBack = team1Flag.FlagModel:Clone()
  163.             for i, desc in pairs(flagOnBack:GetDescendants()) do
  164.                 if desc:IsA("BasePart") then
  165.                     desc.CanCollide = false
  166.                     desc.Anchored = false
  167.                    
  168.                     if desc ~= flagOnBack.PrimaryPart then
  169.                         local wc = Instance.new("WeldConstraint")
  170.                         wc.Part0 = flagOnBack.PrimaryPart
  171.                         wc.Part1 = desc
  172.                         wc.Parent = flagOnBack.PrimaryPart
  173.                     end
  174.                 end
  175.             end
  176.             local torso = charTouched:FindFirstChild("UpperTorso") or charTouched:FindFirstChild("Torso") or charTouched.HumanoidRootPart
  177.             flagOnBack:SetPrimaryPartCFrame((torso.CFrame - torso.CFrame.LookVector/2) * CFrame.Angles(0, 0, math.rad(-90)))
  178.             local wc = Instance.new("WeldConstraint")
  179.             wc.Part0 = torso
  180.             wc.Part1 = flagOnBack.PrimaryPart
  181.             wc.Parent = flagOnBack
  182.            
  183.             flagOnBack.Name = "FLAG"
  184.             flagOnBack.Parent = charTouched
  185.            
  186.             for i, desc in pairs(team1Flag.FlagModel:GetDescendants()) do
  187.                 if desc:IsA("BasePart") then
  188.                     desc.Transparency = 1
  189.                     desc.CanCollide = false
  190.                 end
  191.             end
  192.            
  193.             charTouched.Humanoid.Died:Wait()
  194.             if flag1Taken == charTouched then
  195.                 flag1Taken = false
  196.                
  197.                 for i, desc in pairs(team1Flag.FlagModel:GetDescendants()) do
  198.                     if desc:IsA("BasePart") then
  199.                         desc.Transparency = 0
  200.                     end
  201.                 end
  202.             end
  203.            
  204.         elseif flag2Taken == charTouched and charTouched.Humanoid.Health > 0  and plrTouched.Team == config.Team1 then
  205.             flag2Taken = false
  206.             charTouched["FLAG"]:Destroy()
  207.             team1Score.Value += 1
  208.             for i, desc in pairs(team2Flag.FlagModel:GetDescendants()) do
  209.                 if desc:IsA("BasePart") then
  210.                     desc.Transparency = 0
  211.                     desc.CanCollide = false
  212.                 end
  213.             end
  214.         end
  215.     end)
  216.    
  217.     team2Flag.Base.Touched:Connect(function(hit)
  218.  
  219.         local charTouched = hit.Parent
  220.         local plrTouched = game.Players:GetPlayerFromCharacter(charTouched)
  221.         if plrTouched and plrTouched.Team == config.Team1 and charTouched.Humanoid.Health > 0 and not flag2Taken then
  222.             flag2Taken = charTouched
  223.  
  224.             local flagOnBack = team2Flag.FlagModel:Clone()
  225.             for i, desc in pairs(flagOnBack:GetDescendants()) do
  226.                 if desc:IsA("BasePart") then
  227.                     desc.CanCollide = false
  228.                     desc.Anchored = false
  229.  
  230.                     if desc ~= flagOnBack.PrimaryPart then
  231.                         local wc = Instance.new("WeldConstraint")
  232.                         wc.Part0 = flagOnBack.PrimaryPart
  233.                         wc.Part1 = desc
  234.                         wc.Parent = flagOnBack.PrimaryPart
  235.                     end
  236.                 end
  237.             end
  238.             local torso = charTouched:FindFirstChild("UpperTorso") or charTouched:FindFirstChild("Torso") or charTouched.HumanoidRootPart
  239.             flagOnBack:SetPrimaryPartCFrame((torso.CFrame - torso.CFrame.LookVector/2) * CFrame.Angles(0, 0, math.rad(-90)))
  240.             local wc = Instance.new("WeldConstraint")
  241.             wc.Part0 = torso
  242.             wc.Part1 = flagOnBack.PrimaryPart
  243.             wc.Parent = flagOnBack
  244.            
  245.             flagOnBack.Name = "FLAG"
  246.             flagOnBack.Parent = charTouched
  247.  
  248.             for i, desc in pairs(team2Flag.FlagModel:GetDescendants()) do
  249.                 if desc:IsA("BasePart") then
  250.                     desc.Transparency = 1
  251.                 end
  252.             end
  253.  
  254.             charTouched.Humanoid.Died:Wait()
  255.             if flag2Taken == charTouched then
  256.                 flag2Taken = false
  257.  
  258.                 for i, desc in pairs(team2Flag.FlagModel:GetDescendants()) do
  259.                     if desc:IsA("BasePart") then
  260.                         desc.Transparency = 0
  261.                     end
  262.                 end
  263.             end
  264.  
  265.         elseif flag1Taken == charTouched and charTouched.Humanoid.Health > 0 and plrTouched.Team == config.Team2 then
  266.             flag1Taken = false
  267.             charTouched["FLAG"]:Destroy()
  268.             team2Score.Value += 1
  269.             for i, desc in pairs(team1Flag.FlagModel:GetDescendants()) do
  270.                 if desc:IsA("BasePart") then
  271.                     desc.Transparency = 0
  272.                     desc.CanCollide = false
  273.                 end
  274.             end
  275.         end
  276.     end)
  277.    
  278.    
  279.     local gameStart = tick()
  280.    
  281.     while true do
  282.         game:GetService("RunService").Heartbeat:Wait()
  283.        
  284.         local timeLeft = config.RoundTime - math.round((tick() - gameStart))
  285.         local mins = math.floor(timeLeft / 60)
  286.         local secs = timeLeft - (mins * 60)
  287.         if string.len(secs) < 2 then
  288.             secs = "0" .. tostring(secs)
  289.         end
  290.         statusValue.Value = mins .. ":" .. secs
  291.        
  292.         numPlrs = 0
  293.         for i, plr in pairs(game.Players:GetPlayers()) do
  294.             if plr then
  295.                 numPlrs += 1
  296.             end
  297.         end
  298.         if numPlrs < config.MinimumPlayersRequired then
  299.             break
  300.            
  301.         elseif config.StopOnceFlagsReached then
  302.             if team1Score.Value >= config.FlagsRequiredToStop or team2Score.Value >= config.FlagsRequiredToStop then
  303.                 break
  304.             end
  305.            
  306.         elseif timeLeft <= 0 then
  307.             break
  308.         end
  309.     end
  310.    
  311.     if team1Score.Value > team2Score.Value then
  312.         statusValue.Value = "Team " .. config.Team1.Name .. " wins!"
  313.        
  314.         for i, plr in pairs(plrsInGame) do
  315.             if plr.Team == config.Team1 then
  316.                 plr.leaderstats.Cash.Value += config.WinReward
  317.             end
  318.         end
  319.        
  320.     elseif team2Score.Value > team1Score.Value then
  321.         statusValue.Value = "Team " .. config.Team2.Name .. " wins!"
  322.        
  323.         for i, plr in pairs(plrsInGame) do
  324.             if plr.Team == config.Team2 then
  325.                 plr.leaderstats.Cash.Value += config.WinReward
  326.             end
  327.         end
  328.        
  329.     else
  330.         statusValue.Value = "Draw!"
  331.     end
  332.    
  333.     for i, plr in pairs(plrsInGame) do
  334.         plr.Team = nil
  335.         plr:LoadCharacter()
  336.     end
  337.    
  338.     scoresFolder:Destroy()
  339.     chosenMap:Destroy()
  340.    
  341.     task.wait(config.RoundFinishedTime)
  342. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement