Hello, I am developing a basic flat-terrain generator, where bricks are generated over a square area with multiple layers. The problem is, there are factors that are keeping me from achieving this.
The following is my code; I will go by line references if needed since many of the commands are interconnected throughout the whole script, and the script itself is large. I wasn't sure how to auto-indent in a block formation as well, excuse me for that.
while true do --create a group called "DirtBlockCloneGroup" dirtBlockCloneModel= Instance.new("Model",game.Workspace) dirtBlockCloneModel.Name= "DirtBlockCloneGroup" local cloneBrickCount= 0 for timer= 1,0,-1 do --timer that counts from 3/ any # to 0 by seconds wait(1) print(timer) if timer== 0 then print("Done.")--ends timer, then does action below x0= game.Workspace.DirtBlock.Position.X y0= game.Workspace.DirtBlock.Position.Y z0= game.Workspace.DirtBlock.Position.Z --sets whatever position the original dirt block is in, stores ion variables local original= Vector3.new(x0,y0,z0) local zIncr= 3 --increments new clone blocks by changing z coordinate --line below checks and gets testing plate size local zSizeBase= game.Workspace.BasePlate.Size.Z local zSizeCheck= 3--baseplate comparison, so clone won't pass plate boundaries local xSizeBase= game.Workspace.BasePlate.Size.Z local xSizeCheck= 3 local xIncr= 3 for i= 1,4 do--sets how many layers of bricks for i= 1,(xSizeBase/3) do-- because it increments by 3 studs while zSizeCheck<zSizeBase do clone= game.Workspace.DirtBlock:Clone()-- creates clone clone.Name= "DirtBlockClone" -- changes name of dirt block clone.Parent= game.Workspace.DirtBlockCloneGroup --adds the instance into the Workspace clone.Position= Vector3.new(x0,y0,z0-zIncr) cloneBrickCount= cloneBrickCount+1 zIncr= zIncr+3-- ex. 3 away from original, 6 away, 9 away etc. zSizeCheck= zSizeCheck+3 end zSizeCheck= 0--these scripts reset the position, so it won't shift zIncr= 0 x0= x0+3 wait(0.001)--delay to minimize lag, edit between dev and release end y0= y0+3-- goes to the next level, 3 studs up x0= game.Workspace.DirtBlock.Position.X-- resets at original point end end--end of if for timer end--end of for at very beginning print(cloneBrickCount) --wait(1)-- no change --for i=1,50000 do --this period is the playing time before the map resets --allow player to play buy freeing them from spawn area game.Workspace.SpawnArea.SpawnBaseBottom.CanCollide= false game.Workspace.SpawnArea.SpawnBaseBottom.Transparency= 1 --ex. for GUI, "Map resets in: ... for timeToReset= 5,0,-1 do wait(1) test2= Instance.new("Hint",game.Workspace) test2.Text= "Time left until map reset: "..tostring(timeToReset) end--end for --players go back when map is regenerating game.Workspace.SpawnArea.SpawnBaseBottom.CanCollide= true game.Workspace.SpawnArea.SpawnBaseBottom.Transparency= 0.75 target= CFrame.new(60.5,3358,84.5) for i, player in ipairs(game.Players:GetChildren()) do if player.Character and player.Character:FindFirstChild("Torso") then player.Character.Torso.CFrame= target+ Vector3.new(i*2,0,0) end end --wait(10) wait(1) game.Workspace.DirtBlockCloneGroup:Destroy() wait(1) --[[ --alt to the single command above while game.Workspace.DirtBlockCloneGroup:FindFirstChild("DirtBlockClone") do game.Workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy() wait(0.001) end game.Workspace.DirtBlockCloneGroup:Destroy() --]] --[[ --old code for i=1,cloneBrickCount do--the exact amount of clones needed to be wrecked game.Workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy() --111,555 bricks: =22,311*5 --wait(0.001)--edit between dev and release end --]] end--loop entire script
My first attempt was to count how many blocks were in the Workspace, which is, local cloneBrickCount= 0
. Next, a for-loop was used to destroy every existing cloned brick:
for i=1,cloneBrickCount do--the exact amount of clones needed to be wrecked game.Workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy() --111,555 bricks: =22,311*5 --wait(0.001)--edit between dev and release end
The problem is that there can be a variable number of bricks at each run between each map regeneration sequence. Too little of a value and not all the clones would be removed from the Workspace. Too much and the game will spawn an error saying that the brick does not exist.
My second attempt was to use a while-loop with a wait time:
while game.Workspace.DirtBlockCloneGroup:FindFirstChild("DirtBlockClone") do game.Workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy() wait(0.001) end
The problem here is that the destroy method deletes a brick one at a time, and even with the wait time involved, it would take much longer to remove the clones efficiently than to rebuild the map (regeneration builds cloned bricks by the rows).
My latest attempt was to simply delete the model containing all the bricks (as shown in the code), but that can cause massive lag and possibly a server crash. The upside is that it is very fast.
The only other idea I had in mind was to us smaller wait times such as wait(0.0000000000001) if that makes a difference.
One way to efficiently remove thousands of parts (or more!) is to only wait()
every few Parts Destroy'd:
local count = 0 for _, v in ipairs(workspace.DirtBlockCloneGroup:GetChildren()) do v:Destroy() count = count + 1 if count > 50 then count = count - 50 wait() end end