PATTERN 1

 avatar
unknown
lua
a month ago
2.5 kB
1
Indexable
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local SpawnRegion: Part = Workspace.ObjectSpawner.SpawnRegion
local ObjectClone: Folder = Workspace.ObjectSpawner.ObjectClone
local ObjectsFolder: Folder = ReplicatedStorage:WaitForChild("ObjectSpawner")

local SPAWN_INTERVAL: number = 0.3
local MAX_OBJECTS: number = 200
local MOVE_DIRECTION: Vector3 = Vector3.new(-1, 0, 0)
local MOVE_SPEED: number = 15

local Local = {}
local Shared = {}

function Shared.OnStart()
    -- Loop para spawnar objetos periodicamente
    task.spawn(function()
        while true do
            Local.SpawnObject()
            task.wait(SPAWN_INTERVAL)
        end
    end)
end

--- Verifica se o objeto esta dentro da regiao de spawn
function Local.IsWithinSpawnRegion(objectPosition: Vector3): boolean
    local minX = SpawnRegion.Position.X - SpawnRegion.Size.X / 2
	local maxX = SpawnRegion.Position.X + SpawnRegion.Size.X / 2
	local minZ = SpawnRegion.Position.Z - SpawnRegion.Size.Z / 2
	local maxZ = SpawnRegion.Position.Z + SpawnRegion.Size.Z / 2

    return objectPosition.X >= minX and objectPosition.X <= maxX and
           objectPosition.Z >= minZ and objectPosition.Z <= maxZ
end

function Local.SpawnObject(): nil
    if #ObjectClone:GetChildren() >= MAX_OBJECTS then
        return
    end

    local objects: Model = ObjectsFolder:GetChildren()[math.random(1, #ObjectsFolder:GetChildren())]
    local newObject: Model = objects:Clone()

    -- Posição inicial ajustada
    local spawnPosition = Vector3.new(
		math.random(SpawnRegion.Position.X - SpawnRegion.Size.X/2, SpawnRegion.Position.X + SpawnRegion.Size.X/2),
		SpawnRegion.Position.Y + 5,
		math.random(SpawnRegion.Position.Z - SpawnRegion.Size.Z/2, SpawnRegion.Position.Z + SpawnRegion.Size.Z/2)
	)


    newObject:PivotTo(CFrame.new(spawnPosition))
    newObject.Anchored = false
    newObject.Parent = ObjectClone

     -- Lógica de movimento
     task.spawn(function()
        while newObject.Parent == ObjectClone do
            local delta: Vector3 = MOVE_DIRECTION * MOVE_SPEED * task.wait()  -- Multiplica pela espera do `task.wait()`
            newObject:PivotTo(newObject.CFrame * CFrame.new(delta))

            -- Se o objeto sair da área de spawn, destrua-o
            if not Local.IsWithinSpawnRegion(newObject.Position) then
                newObject:Destroy()
            end
        end
    end)
end

return Shared
Leave a Comment