Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ```lua
- local Spawner = {}
- local RESOURCE_SETTINGS = require(script:WaitForChild("ResourceSettings"))
- local RESOURCE_MODULES = {}
- local rng = Random.new()
- local RAY_HEIGHT = 100
- for index, module in pairs(script.Resources:GetChildren()) do -- Fetches all spawning modules
- if module:IsA("ModuleScript") then
- RESOURCE_MODULES[module.Name] = require(module)
- end
- end
- local function GET_POSITION(SURFACE_INSTANCE)
- assert(SURFACE_INSTANCE:IsA("BasePart"), "Invalid surface instance.")
- local LEFT_EDGE = SURFACE_INSTANCE.Position.Z - SURFACE_INSTANCE.Size.Z/2
- local RIGHT_EDGE = SURFACE_INSTANCE.Position.Z + SURFACE_INSTANCE.Size.Z/2
- local BOTTOM_EDGE = SURFACE_INSTANCE.Position.X - SURFACE_INSTANCE.Size.X/2
- local TOP_EDGE = SURFACE_INSTANCE.Position.X + SURFACE_INSTANCE.Size.X/2
- local RANDOM_Z = rng:NextInteger(LEFT_EDGE, RIGHT_EDGE)
- local RANDOM_X = rng:NextInteger(BOTTOM_EDGE, TOP_EDGE)
- local RANDOM_VECTOR = Vector3.new(RANDOM_X, 1, RANDOM_Z) -- VERY IMPORTANT: Y Value has to be specified when the vector is used
- return RANDOM_VECTOR
- end
- local function GET_RESOURCE_POSITION(RESOURCE_NAME)
- if workspace.Resources:FindFirstChild(RESOURCE_NAME) then
- local Zones = workspace.Resources[RESOURCE_NAME].Zones:GetChildren()
- local RANDOM_ZONE = rng:NextInteger(1, #Zones)
- local SELECTED_ZONE = Zones[RANDOM_ZONE]
- if SELECTED_ZONE then
- if RESOURCE_SETTINGS.RAYCASTABLE then
- local SURFACE_POSITION = GET_POSITION(SELECTED_ZONE)
- local UPDATED_SURFACE_VECTOR = Vector3.new(SURFACE_POSITION.X, RAY_HEIGHT, SURFACE_POSITION.Z)
- local VECTOR_DIRECTION = Vector3.new(0, -RAY_HEIGHT, 0)
- local Y_RAY = Ray.new(UPDATED_SURFACE_VECTOR, VECTOR_DIRECTION)
- local HIT, POSITION = workspace:FindPartOnRay(Y_RAY)
- local CFRAME_HIT = CFrame.new(POSITION)
- return {POSITION, CFRAME_HIT}
- else
- error("No compatibility for non-raycasting resources yet.")
- end
- else
- error("Invalid zone selected.")
- end
- end
- end
- function Spawner:Spawn(RESOURCE_NAME)
- local RESOURCE_POSITION = GET_RESOURCE_POSITION(RESOURCE_NAME)
- if RESOURCE_POSITION then
- if RESOURCE_MODULES[RESOURCE_NAME] then
- RESOURCE_MODULES[RESOURCE_NAME]:Spawn(RESOURCE_POSITION)
- else
- error("No module found for ".. RESOURCE_NAME)
- end
- end
- end
- return Spawner
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement