90 lines
2.3 KiB
Plaintext
90 lines
2.3 KiB
Plaintext
local CHUNK_SIZE = 256
|
|
local RADIUS = 3
|
|
local LEEWAY = 20
|
|
local POOL_SIZE = 64
|
|
local BASE_RADIUS = 1
|
|
|
|
script:WaitForChild("GenerateChunk").Disabled = true
|
|
local pool = 0
|
|
local chunks = {}
|
|
local schunks = {}
|
|
local function chunk(x,z)
|
|
if not schunks[x] then schunks[x] = {} end
|
|
local i = {x=x,z=z}
|
|
local first,second
|
|
local c = {delete=function()
|
|
if first then
|
|
game.Workspace.Terrain:FillRegion(Region3.new(first.Value,second.Value),4,Enum.Material.Air)
|
|
end
|
|
end,viable = true}
|
|
chunks[i]=c
|
|
schunks[x][z]=c
|
|
|
|
task.defer(function()
|
|
repeat wait() until pool < POOL_SIZE
|
|
if not c.viable and not c.permanent then return end
|
|
local actor = Instance.new("Actor")
|
|
actor.Parent = game.Workspace
|
|
local new_script = script.GenerateChunk:Clone()
|
|
local location = new_script.Location
|
|
location.Value = Vector3.new(x,CHUNK_SIZE,z)
|
|
first = new_script.First
|
|
second = new_script.Second
|
|
new_script.Parent = actor
|
|
new_script.Disabled = false
|
|
pool = pool + 1
|
|
new_script.Destroying:Connect(function()
|
|
pool = pool - 1
|
|
end)
|
|
end)
|
|
|
|
return c
|
|
end
|
|
|
|
for x = -BASE_RADIUS,BASE_RADIUS do
|
|
for z = -BASE_RADIUS,BASE_RADIUS do
|
|
if Vector2.new(x,z).Magnitude < BASE_RADIUS then
|
|
chunk(x,z).permanent = true
|
|
end
|
|
end
|
|
end
|
|
|
|
while wait(0.5) do
|
|
for index,chunk in pairs(chunks) do
|
|
chunk.viable = false
|
|
end
|
|
local perPlayer = function(p)
|
|
for index,chunk in pairs(chunks) do
|
|
if Vector2.new(p.x-index.x*CHUNK_SIZE,p.z-index.z*CHUNK_SIZE).Magnitude < CHUNK_SIZE*(RADIUS+LEEWAY) then
|
|
chunk.viable = true
|
|
end
|
|
end
|
|
for x=math.ceil(p.x/CHUNK_SIZE)-RADIUS,math.ceil(p.x/CHUNK_SIZE)+RADIUS do
|
|
for z=math.ceil(p.z/CHUNK_SIZE)-RADIUS,math.ceil(p.z/CHUNK_SIZE)+RADIUS do
|
|
if not schunks[x] then schunks[x] = {} end
|
|
if not schunks[x][z] then
|
|
chunk(x,z)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for _,player in pairs(game.Players:GetPlayers()) do
|
|
if player.Character then
|
|
if player.Character.PrimaryPart then
|
|
perPlayer(player.Character.PrimaryPart.Position)
|
|
end
|
|
end
|
|
end
|
|
|
|
perPlayer(game.Workspace.CurrentCamera.CFrame.Position)
|
|
|
|
for index,chunk in pairs(chunks) do
|
|
if not chunk.viable and not chunk.permanent then
|
|
schunks[index.x][index.z] = nil
|
|
--if #schunks[index.x] == 0 then schunks[index.x] = nil end
|
|
chunk.delete()
|
|
chunks[index] = nil
|
|
end
|
|
end
|
|
end |