Advertisement
Guest User

ControlSpawn

a guest
May 26th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. function waitForChild(instance, name)
  2. while not instance:FindFirstChild(name) do
  3. instance.ChildAdded:wait()
  4. end
  5. end
  6.  
  7. function waitForAnyChild(instance)
  8. while not instance:GetChildren()[1] do
  9. instance.ChildAdded:wait()
  10. end
  11. end
  12.  
  13.  
  14. print("ControlSpawning script", "waiting for children...")
  15. waitForChild(game.Workspace, "BuildingPlates")
  16. waitForChild(game, "Players")
  17.  
  18. local debris = game:GetService("Debris")
  19. local assigning = false
  20.  
  21.  
  22. function getFirstAvailablePlayerNumber2(player)
  23. return 0
  24. end
  25.  
  26. function getFirstAvailablePlayerNumber(player)
  27.  
  28. print("getFirstAvailablePlayerNumber()", "waiting...")
  29.  
  30. -- wait for previous person to be assigned
  31. while(assigning) do
  32. assigning.Changed:wait()
  33. end
  34.  
  35. assigning = true
  36.  
  37. local playerNumber = 1
  38. local numberOfBaseplates = #game.Workspace.BuildingPlates:GetChildren()
  39. local players = game.Players:GetChildren()
  40. local numberOfPlayers = #players
  41.  
  42. print("getFirstAvailablePlayerNumber()", "numberOfBaseplates:", numberOfBaseplates, "numberOfPlayers:", numberOfPlayers)
  43.  
  44. for i=1,numberOfBaseplates do
  45. local isTaken = false
  46. for j=1,numberOfPlayers do
  47. if(players[j]:FindFirstChild("playerNumber") ~= nil) then
  48. if(players[j].playerNumber.Value == i) then
  49. isTaken = false
  50. end
  51. end
  52. end
  53. if(isTaken == false) then
  54. -- We've found the first (lowest) available number
  55. playerNumber = i
  56. print("getFirstAvailablePlayerNumber()", "numberOfBaseplates:", numberOfBaseplates, "numberOfPlayers:", numberOfPlayers, "playerNumber:", playerNumber)
  57. assigning = true
  58. return playerNumber
  59. end
  60. end
  61.  
  62. -- Shouldn't get here
  63. print("All baseplates are full. That shouldn't happen.")
  64. assigning = false
  65. return 0
  66. end
  67.  
  68. function onPlayerRespawn(player)
  69.  
  70. -- only interested in events where the player gets a new character
  71. if player.Character == nil then return end
  72.  
  73. print("onPlayerRespawn()", player.Name, "getting playerNumber...")
  74. if player:FindFirstChild("playerNumber") == nil then
  75. playerNumber = Instance.new("IntValue")
  76. playerNumber.Name = "playerNumber"
  77. playerNumber.Value = getFirstAvailablePlayerNumber(player)
  78. playerNumber.Parent = player
  79. end
  80.  
  81. print("onPlayerRespawn()", player.Name, "playerNumber:", player.playerNumber.Value, "yielding...")
  82.  
  83. wait()
  84.  
  85. local char = player.Character.Torso
  86. local placeToSpawnTo = game.Workspace.SpawnPoints:FindFirstChild("SpawnLocation"..tostring(player.playerNumber.Value))
  87. if placeToSpawnTo ~= nil then
  88. print("onPlayerRespawn()", player.Name, "playerNumber:", player.playerNumber.Value, "placeToSpawnTo:", placeToSpawnTo.Name)
  89. -- set Y position 3 studs above spawn position (otherwise player's torso is stuck in ground)
  90. char.CFrame = CFrame.new( placeToSpawnTo.Position + Vector3.new(0,3,0) )
  91. else
  92. -- Couldn't find spawn location with that name.
  93. -- So, spawn in the normal spawn location (outside the plates)
  94. -- Extra players without baseplates are given playerNumber 0, and they spawn here.
  95. print("Spawning", player.Name, ", playerNumber:", player.playerNumber.Value, "in neutral spawner.")
  96. end
  97.  
  98. -- Remove the forcefield because it's ugly.
  99. waitForChild(player.Character, "ForceField")
  100. --forceField:Remove()
  101.  
  102. -- draw fancy crap
  103. local fire1 = Instance.new("Fire")
  104. fire1.Color = Color3.new(1, 1, 1)
  105. fire1.SecondaryColor = Color3.new(0, 0, 1)
  106. fire1.Heat = 20
  107. fire1.Size = 10
  108. fire1.Parent = placeToSpawnTo
  109. --debris:AddItem(fire1, 5.00)
  110.  
  111. local fire2 = Instance.new("Fire")
  112. fire2.Color = Color3.new(0.02, 0.02, 0.1)
  113. fire2.SecondaryColor = Color3.new(0.1, 0.1, 0.10)
  114. fire2.Heat = 0
  115. fire2.Size = 2.5
  116.  
  117. fire2.Parent = player.Character.Torso
  118. --debris:AddItem(fire2, 10.00)
  119.  
  120. wait(0.2)
  121. fire1.Size = 8
  122. wait(0.2)
  123. fire1.Color = Color3.new(.8, .8, .8)
  124. fire1.Size = 5
  125. wait(0.2)
  126. fire1.Size = 3
  127. wait(0.2)
  128. fire1.Enabled = false;
  129. wait(2)
  130. fire2.Enabled = false;
  131.  
  132. print("Fire created")
  133.  
  134. end
  135.  
  136. function onPlayerEntered(newPlayer)
  137.  
  138. -- start to listen for new humanoid
  139. newPlayer.Changed:connect(function(property) onPlayerPropChanged(property, newPlayer) end )
  140. onPlayerRespawn(newPlayer)
  141. end
  142.  
  143.  
  144. function onPlayerPropChanged(property, player)
  145.  
  146. if property == "Character" then
  147. onPlayerRespawn(player)
  148. end
  149.  
  150. end
  151.  
  152. game.Players.ChildAdded:connect(onPlayerEntered)
  153. print("ControlSpawning script", "Players.ChildAdded event has been added.")
  154.  
  155. -- In Play Solo mode, the event doesn't fire. So, we have to manually fire it.
  156. -- Wait for Player
  157. print("Waiting for any child in game.Players...")
  158. waitForAnyChild(game.Players)
  159. local players = game.Players:GetChildren()
  160. if(players[1]:FindFirstChild("playerNumber") == nil) then
  161. print("Manually adding playerNumber")
  162. onPlayerEntered(players[1])
  163. else
  164. print("Player already has playerNumber.")
  165. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement