hours2

Untitled

Sep 13th, 2025
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.10 KB | None | 0 0
  1. local ReplicatedStorage = game.ReplicatedStorage
  2. local ServerScripts = game.ServerScriptService
  3. local ServerStorage = game.ServerStorage
  4. local Players = game.Players
  5. local Events = ReplicatedStorage.RemoteEvents
  6. local GameStartEvent = Events.GameStartEvent
  7. local RoundEndEvent = Events.RoundEndEvent
  8. local RoundInformation = require(ServerScripts.Directories.RoundInformation)
  9. local PlayerManager = require(ServerScripts.Utilities.PlayerManager)
  10. local LavaHandler = require(script.LavaHandler)
  11. local GameInfo = require(ServerScripts.Directories.GameInformation)
  12. local RoundLengthVal = ReplicatedStorage.GameInformation.RoundLength
  13. local IntermissionLengthVal = ReplicatedStorage.GameInformation.IntermissionLength
  14.  
  15. local currentMap = workspace.CurrentMap
  16. local Lobby = workspace.Lobby
  17. local LobbySpawns = Lobby.LobbySpawns:GetChildren()
  18.  
  19. local currentPlayers = {}
  20. local tagger = nil
  21. local roundEnded = false
  22. local connection
  23. local RoundManager = {}
  24. local currMap = nil
  25.  
  26.  
  27. local function clean()
  28.     if tagger then
  29.         tagger:Clean()
  30.     end
  31.     tagger = nil
  32.     for i, player in pairs(Players:GetChildren()) do
  33.         local character = workspace:FindFirstChild(player.Name)
  34.         local prompt = character:FindFirstChild("HumanoidRootPart"):FindFirstChild("TagPrompt")
  35.         if prompt then
  36.             prompt.Enabled = false
  37.         end
  38.         if character then
  39.             task.delay(2, function()
  40.                 local randSpawn = LobbySpawns[math.random(1, #LobbySpawns)]
  41.                 character.HumanoidRootPart.CFrame = randSpawn.CFrame * CFrame.new(0, 4, 0)
  42.             end)
  43.         end
  44.         player.Character:SetAttribute("InRound", false)
  45.         task.wait(0.5)
  46.     end
  47.     for name, person in pairs(currentPlayers) do
  48.         local survivalNum = 0
  49.         if person.Survived then
  50.             survivalNum += GameInfo.SurvivalCoins
  51.         end
  52.         if person.Player ~= nil then
  53.             local level = PlayerManager:GetLevel(person.Player)
  54.             if level ~= nil then
  55.                 PlayerManager:AddMoney(person.Player, survivalNum + GameInfo.ParticipationCoins)
  56.                 PlayerManager:AddXP(person.Player, (200 * level) ^ 1.25)
  57.                 RoundEndEvent:FireClient(person.Player, person.Survived, survivalNum, GameInfo.ParticipationCoins)
  58.             end
  59.         end
  60.     end
  61.    
  62.     if connection then
  63.         connection:Disconnect()
  64.     end
  65.     task.delay(3, function()
  66.         if not currMap then
  67.             currMap:Destroy()
  68.             currMap = nil
  69.         end
  70.     end)
  71. end
  72.  
  73. local function EndRound()
  74.     roundEnded = true
  75.     for i, player in pairs(Players:GetChildren()) do
  76.         GameStartEvent:FireClient(player)
  77.     end
  78.     task.wait(3)
  79.     clean()
  80. end
  81.  
  82. local function spawnMap()
  83.     local Maps = ServerStorage.Maps:GetChildren()
  84.     local map = Maps[math.random(1, #Maps)]:Clone()
  85.     map.Parent = currentMap
  86.     if map:IsA("Model") then
  87.         map:PivotTo(Lobby.PrimaryPart.CFrame * CFrame.new(map:GetExtentsSize().X + 125, 676, map:GetExtentsSize().Y + 125))
  88.     elseif map:IsA("Part") then
  89.         map.CFrame = Lobby.PrimaryPart.CFrame * CFrame.new(map.Size.X + 125, 676, map.Size.Y + 125)
  90.     end
  91.    
  92.  
  93.     return map
  94. end
  95.  
  96. local function getTagger()
  97.     local plrs = game.Players:GetPlayers()
  98.     if plrs ~= 0 then
  99.         return plrs[math.random(1, #plrs)]
  100.     else
  101.         return nil
  102.     end
  103. end
  104.  
  105. local function getSurvivorCount()
  106.     local count = 0
  107.     for _, data in pairs(currentPlayers) do
  108.         if data.Survived then
  109.             count += 1
  110.         end
  111.     end
  112.     return count
  113. end
  114.  
  115. local function spawnPlayer(map)
  116.     for i, player in pairs(Players:GetChildren()) do
  117.         player.RespawnLocation = LobbySpawns[math.random(1, #LobbySpawns)]
  118.         local character = workspace:FindFirstChild(player.Name)
  119.         if not character then return end
  120.         currMap = map
  121.         local spawns = map:WaitForChild("Spawns"):GetChildren()
  122.         local spawn
  123.        
  124.         local hrp = character:WaitForChild("HumanoidRootPart")
  125.         local TagPrompt = hrp:WaitForChild("TagPrompt")
  126.        
  127.         TagPrompt.Triggered:Once(function()
  128.             if roundEnded then return end
  129.             local currPlr = Players:GetPlayerFromCharacter(character)
  130.             currentPlayers[currPlr.Name] = {Player = player, Survived = false}
  131.             local num = getSurvivorCount()
  132.             if num == 1 then
  133.                 EndRound()
  134.             end
  135.         end)
  136.        
  137.         character.Humanoid.Died:Once(function()
  138.             if roundEnded then return end
  139.             local currPlr = Players:GetPlayerFromCharacter(character)
  140.             currentPlayers[currPlr.Name] = {Player = player, Survived = false}
  141.             local num = getSurvivorCount()
  142.             if num == 1 then
  143.                 EndRound()
  144.             end
  145.         end)
  146.        
  147.         character:SetAttribute("InRound", true)
  148.         if tagger.Person ~= player then
  149.             currentPlayers[player.Name] = {Player = player, Survived = true}
  150.             repeat spawn = spawns[math.random(1, #spawns)]
  151.             until spawn.Name ~= "LavaSpawnLocation"
  152.         else
  153.             currentPlayers[player.Name] = {Player = player, Survived = true, Tagger = player}
  154.             for i, v in pairs(spawns) do
  155.                 if v.Name == "LavaSpawnLocation" then
  156.                     spawn = v
  157.                     break
  158.                 end
  159.             end
  160.         end
  161.    
  162.         character:PivotTo(spawn.CFrame * CFrame.new(0, 2, 0))
  163.     end
  164. end
  165.  
  166. function RoundManager:Init()
  167.     RoundLengthVal.Value = RoundInformation.RoundLength
  168.     IntermissionLengthVal.Value = RoundInformation.IntermissionLength
  169.     task.spawn(function()
  170.         while true do
  171.             task.wait(0.25)
  172.             if #game.Players:GetPlayers() ~= 0 then
  173.                 roundEnded = false
  174.                 RoundLengthVal.Value = -1
  175.                 for i = RoundInformation.IntermissionLength, 1, -1 do
  176.                     IntermissionLengthVal.Value = i
  177.                     task.wait(1)
  178.                 end
  179.                
  180.                 local map = spawnMap()
  181.                 local taggerPerson = getTagger()
  182.                 for i, player in pairs(Players:GetChildren()) do
  183.                     GameStartEvent:FireClient(player, taggerPerson)
  184.                 end
  185.                
  186.                 task.wait(3.5)
  187.                 tagger = LavaHandler.New(taggerPerson)
  188.                 spawnPlayer(map)
  189.                 connection = game.Players.PlayerRemoving:Connect(function(player)
  190.                     for i, person in pairs(currentPlayers) do
  191.                         if person.Tagger == player then
  192.                             EndRound()
  193.                             break
  194.                         end
  195.                     end
  196.                     currentPlayers[player.Name] = nil
  197.                     local num = getSurvivorCount()
  198.                     if num == 1 then
  199.                         EndRound()
  200.                     end
  201.                 end)
  202.                 IntermissionLengthVal.Value = -1
  203.                 for i = RoundInformation.RoundLength, 1, -1 do
  204.                     if roundEnded then
  205.                         break
  206.                     end
  207.                     RoundLengthVal.Value = i
  208.                     task.wait(1)
  209.                 end
  210.                 if not roundEnded then
  211.                     EndRound()
  212.                 end
  213.             end
  214.         end
  215.     end)
  216.    
  217. end
  218.  
  219. return RoundManager
  220.  
Advertisement
Add Comment
Please, Sign In to add comment