Advertisement
Guest User

Untitled

a guest
May 26th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.34 KB | None | 0 0
  1. ```lua
  2. local Spawner = {}
  3.  
  4. local RESOURCE_SETTINGS = require(script:WaitForChild("ResourceSettings"))
  5. local RESOURCE_MODULES = {}
  6. local rng = Random.new()
  7. local RAY_HEIGHT = 100
  8.  
  9. for index, module in pairs(script.Resources:GetChildren()) do -- Fetches all spawning modules
  10.     if module:IsA("ModuleScript") then
  11.         RESOURCE_MODULES[module.Name] = require(module)
  12.     end
  13. end
  14.  
  15. local function GET_POSITION(SURFACE_INSTANCE)
  16.     assert(SURFACE_INSTANCE:IsA("BasePart"), "Invalid surface instance.")
  17.    
  18.     local LEFT_EDGE = SURFACE_INSTANCE.Position.Z - SURFACE_INSTANCE.Size.Z/2
  19.     local RIGHT_EDGE = SURFACE_INSTANCE.Position.Z + SURFACE_INSTANCE.Size.Z/2
  20.    
  21.     local BOTTOM_EDGE = SURFACE_INSTANCE.Position.X - SURFACE_INSTANCE.Size.X/2
  22.     local TOP_EDGE = SURFACE_INSTANCE.Position.X + SURFACE_INSTANCE.Size.X/2
  23.    
  24.     local RANDOM_Z = rng:NextInteger(LEFT_EDGE, RIGHT_EDGE)
  25.     local RANDOM_X = rng:NextInteger(BOTTOM_EDGE, TOP_EDGE)
  26.    
  27.     local RANDOM_VECTOR = Vector3.new(RANDOM_X, 1, RANDOM_Z) -- VERY IMPORTANT: Y Value has to be specified when the vector is used
  28.    
  29.     return RANDOM_VECTOR
  30. end
  31.  
  32. local function GET_RESOURCE_POSITION(RESOURCE_NAME)
  33.     if workspace.Resources:FindFirstChild(RESOURCE_NAME) then
  34.         local Zones = workspace.Resources[RESOURCE_NAME].Zones:GetChildren()
  35.        
  36.         local RANDOM_ZONE = rng:NextInteger(1, #Zones)
  37.         local SELECTED_ZONE = Zones[RANDOM_ZONE]
  38.        
  39.         if SELECTED_ZONE then
  40.            
  41.             if RESOURCE_SETTINGS.RAYCASTABLE then
  42.                 local SURFACE_POSITION = GET_POSITION(SELECTED_ZONE)
  43.                 local UPDATED_SURFACE_VECTOR = Vector3.new(SURFACE_POSITION.X, RAY_HEIGHT, SURFACE_POSITION.Z)
  44.                 local VECTOR_DIRECTION = Vector3.new(0, -RAY_HEIGHT, 0)
  45.                 local Y_RAY = Ray.new(UPDATED_SURFACE_VECTOR, VECTOR_DIRECTION)
  46.                
  47.                 local HIT, POSITION = workspace:FindPartOnRay(Y_RAY)
  48.                
  49.                 local CFRAME_HIT = CFrame.new(POSITION)
  50.                
  51.                 return {POSITION, CFRAME_HIT}
  52.                    
  53.             else
  54.                 error("No compatibility for non-raycasting resources yet.")
  55.             end
  56.         else
  57.             error("Invalid zone selected.")
  58.         end
  59.     end
  60. end
  61.  
  62.  
  63. function Spawner:Spawn(RESOURCE_NAME)
  64.     local RESOURCE_POSITION = GET_RESOURCE_POSITION(RESOURCE_NAME)
  65.    
  66.     if RESOURCE_POSITION then
  67.         if RESOURCE_MODULES[RESOURCE_NAME] then
  68.             RESOURCE_MODULES[RESOURCE_NAME]:Spawn(RESOURCE_POSITION)
  69.         else
  70.             error("No module found for ".. RESOURCE_NAME)
  71.         end
  72.     end
  73. end
  74.  
  75. return Spawner
  76. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement