Hello all! My minigame system is seeming to fail atm, and I am entirely sure as to why!
I'd like my script to be able to spawn where the "DungeonSpawn" model with the child part named "Pos" is!
When I run this, after the period of 60 seconds (intermission), it spawns the map, BUT, it spawns it at position (0,0,0) in the workspace! I done some research on the DevForums about this problem, and only found my attempt, which didn't work, so I've turned to here!
Here is my ServerScript located in the workspace! Any and all help is appreciated! Main focus of attention I BELIEVE is Lines 34-43, but I could be wrong! Thank you!
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.DungeonSpawner chosenMap.PrimaryPart.Position = Vector3.new(game.Workspace.DungeonSpawner.Pos.Position) -- edited 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)
You need to use a CFrame I believe,
chosenMap.PrimaryPart.Position = Vector3.new(game.Workspace.DungeonSpawner.Pos.Position)
should be
chosenMap.PrimaryPart.Position = CFrame.new(Vector3.new(game.Workspace.DungeonSpawner.Pos.Position))
and you could also do
chosenMap.PrimaryPart.Position = CFrame.new(game.Workspace.DungeonSpawner.Pos.Position)