i trying to make intermission script. with maps. it's works. and map randomly works but the problem is that. it's not taking randomly after the map ended. this script works with rounds. it's works but it's not taking Random Maps Like Forest map Or Garden Map And It's only Choice The Same Map. and i want it to make it randomly maps. sorry but i starting to be really advanced scripter but i don't know what it's the problem of it.. there some more i need to learn :)
this is short version of it.
local minigameModule = {
gameRunning = false,
playersAlive = {},
currentMap = nil
}
local waitForChild = game.WaitForChild
local findFirstChild = game.FindFirstChild
-- Modules
local settingsModule = require(waitForChild(script, "Settings"))
local onWin = (function()
local onWinModule = findFirstChild(script, "OnWin")
if onWinModule then
local onWinFunction = require(onWinModule)
if type(onWinFunction) == "function" then
return onWinFunction
end
end
end)()
local remoteEvent = waitForChild(game:GetService("ReplicatedStorage"), "Event")
local mapsStorage = waitForChild(game:GetService("ServerStorage"), "Maps"):GetChildren()
local playersService = game:GetService("Players")
function minigameModule.isPotentialGame()
return playersService.NumPlayers >= settingsModule.minimumPlayers
end
function minigameModule:chooseMap()
local chosenMap = mapsStorage[#mapsStorage]:Clone()
if findFirstChild(chosenMap, "Spawns") then
chosenMap.Parent = workspace
chosenMap:MakeJoints()
self.currentMap = chosenMap
return chosenMap;
end
end
i don't think needs more but this is the full version of it,
-- Minigame by Lheavy#1110
local minigameModule = {
gameRunning = false,
playersAlive = {},
currentMap = nil
}
local waitForChild = game.WaitForChild
local findFirstChild = game.FindFirstChild
-- Modules
local settingsModule = require(waitForChild(script, "Settings"))
local onWin = (function()
local onWinModule = findFirstChild(script, "OnWin")
if onWinModule then
local onWinFunction = require(onWinModule)
if type(onWinFunction) == "function" then
return onWinFunction
end
end
end)()
local remoteEvent = waitForChild(game:GetService("ReplicatedStorage"), "Event")
local mapsStorage = waitForChild(game:GetService("ServerStorage"), "Maps"):GetChildren()
local playersService = game:GetService("Players")
function minigameModule.isPotentialGame()
return playersService.NumPlayers >= settingsModule.minimumPlayers
end
function minigameModule:chooseMap()
local chosenMap = mapsStorage[#mapsStorage]:Clone()
if findFirstChild(chosenMap, "Spawns") then
chosenMap.Parent = workspace
chosenMap:MakeJoints()
self.currentMap = chosenMap
return chosenMap;
end
end
function minigameModule:spawnPlayers()
local playersAlive = self.playersAlive
local spawns = self.currentMap.Spawns:GetChildren()
for index = 1, #playersAlive do
local playerData = playersAlive[index]
playerData.playerHumanoidRoot.CFrame = spawns[math.random(#spawns)].CFrame
end
end
function minigameModule:runIntermission()
if settingsModule.intermissionTime > 0 then
for currentTime = math.floor(settingsModule.intermissionTime), 0, -1 do
remoteEvent:FireAllClients("Timer", currentTime)
wait(1)
end
end
remoteEvent:FireAllClients("CeaseGUIs")
end
function minigameModule:getAlivePlayers()
local playersAlive = {}
for index, currentPlayer in next, playersService:GetPlayers() do
local playerCharacter = currentPlayer.Character
if playerCharacter then
local playerHumanoidRoot = findFirstChild(playerCharacter, "HumanoidRootPart")
local playerHumanoid = findFirstChild(playerCharacter, "Humanoid")
if playerHumanoid and playerHumanoidRoot then
table.insert(playersAlive, {
player = currentPlayer,
playerHumanoid = playerHumanoid,
playerHumanoidRoot = playerHumanoidRoot
})
end
end
end
return playersAlive
end
function minigameModule:isLegalGame()
if #self:getAlivePlayers() >= settingsModule.minimumPlayers then
return true
end
end
function minigameModule:queryGameStart()
if self.gameRunning then
return
elseif self.isPotentialGame() then
self.gameRunning = true
remoteEvent:FireAllClients("CeaseGUIs")
self:runIntermission()
if self:isLegalGame() then
if settingsModule.roundDuration > 0 then
local currentMap = self:chooseMap()
local mapWeapons = findFirstChild(currentMap, "Weapons")
local playersAlive = self:getAlivePlayers()
self.playersAlive = playersAlive
for index = 1, #playersAlive do
local currentPlayer = playersAlive[index]
local backpack = findFirstChild(currentPlayer.player, "Backpack")
if backpack and mapWeapons then
for index, weapon in next, mapWeapons:GetChildren() do
weapon:Clone().Parent = backpack
end
end
local connection
connection = currentPlayer.playerHumanoid.Died:connect(function()
connection:disconnect()
table.remove(playersAlive, index)
if #playersAlive < 2 then
local winner = playersAlive[1]
if winner then
self:endGame(winner.player.Name .. " has won!", winner.player)
else
self:endGame("No one has won!")
end
end
end)
end
if mapWeapons then
mapWeapons:Destroy()
end
self:spawnPlayers()
remoteEvent:FireAllClients("Message", currentMap.Name .. " was chosen!", 5)
for currentTime = settingsModule.roundDuration, 0, -1 do
if not self.gameRunning then
return
end
remoteEvent:FireAllClients("Timer", currentTime)
wait(1)
end
self:endGame("The timer ran out! No one has won!")
end
else
self:endGame("Not enough players alive to begin the round!")
end
else
local remainingPlayers = settingsModule.minimumPlayers - playersService.NumPlayers
remoteEvent:FireAllClients("Message", "Waiting for " .. remainingPlayers .. " player" .. (remainingPlayers > 1 and "s" or "") .. " to join.")
end
end
function minigameModule:endGame(outputMessage, winner)
if self.gameRunning then
self.gameRunning = false
self.currentMap:Destroy()
self.currentMap = nil
if winner and onWin then
onWin(winner)
end
for index, player in next, playersService:GetPlayers() do
player:LoadCharacter()
end
wait(1)
remoteEvent:FireAllClients("Message", outputMessage, 5)
wait(5)
self:queryGameStart()
end
end
function minigameModule:removePlayer(player)
if self.gameRunning then
for index = 1, #self.playersAlive do
if self.playersAlive[index].player == player then
table.remove(self.playersAlive, index)
if #self.playersAlive <= 1 then
self:endGame("Not enough players to continue the game.")
end
break
end
end
end
end
playersService.PlayerAdded:connect(function()
minigameModule:queryGameStart()
end)
playersService.PlayerRemoving:connect(function(player)
minigameModule:removePlayer(player)
end)
