Assets will took much longer to load, bc he use sprite lists for textures, which can cover (1024 / 16)^2 = 4096 block textures. Also this saves him from tons of lag.
Just to let you know, Minecraftâs textures and code are copyrighted.
This. As someone who has worked on Roblox voxel games personally since 2013, this is the number one reason games get taken down, and not by a small margin - itâs not even close.
I donât think Mojang likes the sound of that.
Iâm already detecting if a face is exposed, and using it to decide whether to create a texture on that side.
Also, Iâm not sure what Roblox did, but sometime between when I worked on this, and when I came back to it a few months ago, the game became basically unplayable. Moving models full or parts into workspace seems to lag the game and end up crashing the server.
how are you doing that? because I tried raycasting on every single side on every part on the client and that just causes lag spikes even with just a 6 block Chunk
raycasting? just check if the block is next to an air/transparent block, if any of the faces are exposed then render that block, and keep track of the side that is revealing and put a texture on it.
im using raycasting to check if the blocks surrounding the block is air or a block
I have a big 3d array storing the ID of each block, and another array storing the instances. You can get a block by doing blocks[x][y][z] (although iirc the order is slightly different in my code), so to check if the top face is expose, i check if blocks[x][y + 1][z] has a transparent block.
That is unbelievable! I didnât event think this was even possible on roblox! Awesome job!!!
The added touch that the youtube video demonstrating the Minecraft terrain generate was using bandicam the good old classic recording software. Perfectly matches with the classic Minecraft vibe too!
hey uhh i am just asking but sorry for replying since the last reply was 53 days ago but
how do i prevent the chunks being small blocks
or is this a test version?
sorry for the late reply (i dont check devforum that often)
you need to add the texture id manually for textures to show up, and the commented out region of the code at the end will generate the whole world instead of one chunk
here are all the textures
founded
thanks
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
np, also, i may continue development soon with the introduction of dynamic meshes (should help a ton with the lag)
hey dude sorry again for being such annoying dude again (me)
but anyways can u tell me if the place u sended is the same as the classic place
made by you
is the same file as the file u sended
cuz the file u sended is EXTREMELY laggy
i want the not laggy file by you!!!e21@!e1r12gf,jljll~ç.65çl.ç9çkjç~m;ç.~hçg~çngrt
if you can can u pm me with dat file
Iâve been working on a similar algorithm. But Itâs completely custom and it provides decent results but minecraft algorithm is obviously superior. Would you mind sharing some of your code? Like the generation function that determines the biome noise material and etc?
function generateTerrain(pos2,length,width,island,wall,height,hillweight2,lockedbiome,biomeMaterials)
-- Loop through the x and y coordinates of the terrain
-- Non Actor script
--local result =
--runSignal:Fire(pos2,length,width,island,wall,height,hillweight2,lockedbiome,biomeMaterials) -- Fire the event with some argument and get the result
--print(result) -- Do something with the result
local lockedbiome=lockedbiome
local Crystal2=game.ServerStorage.MapObjects.SmallObjects:findFirstChild("Crystal")
local sizez=(length+1)*20-14
local size=(width+1)*20-14
local prevscale=0
local hilltrigger=false
local cycle=0
local prevbn=nil
local hillroll
local pos =pos2-Vector3.new(size+4,0,sizez+4)
--local height=1
local origheight=height
local maxheight=20
local defmat=biomeMaterials[3]
-- terrain:FillBlock((CFrame.new(pos2)),Vector3.new(size,20,sizez),Enum.Material.Air)
--spawn(function()
-- if mathrandom(1,2)==1 then
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-5,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.CrackedLava)
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-6,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.Ground)
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-7,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.Air)
-- else
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-5,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.Water)
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-6,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.Ground)
-- terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-7,sizez/2))),Vector3.new(size,4,sizez),Enum.Material.Air)
-- end
--end)
-- Define some parameters for the biome selection function
local biomeScale = mathrandom(5,10) -- The scale of the biome noise
--end
local function selectBiome(n,height)
local material=defmat -- declare a variable for material
local color -- declare a variable for color
-- Loop through the biome thresholds
for i = 1, #biomeThresholds do
-- print(n)
if n <= biomeThresholds[i] then -- if the biome noise value is less than or equal to the threshold
material = biomeMaterials[i] -- assign the corresponding material from the list
color = biomeColors[i] -- assign the corresponding color from the list
break -- exit the loop
end
end
-- If none of the thresholds match, return the default material and color (should not happen)
return material
end
-- pos=pos+Vector3.new(-size/2,0,size/2)
local maxheight=maxheight
for x =pos.x, size - resolution, resolution do
local hillweight=mathrandom(hillweight2/4,hillweight2)
if (Vector3.new(x,0,0)-Vector3.new(pos2.x,0,0)).Magnitude<size then
--high lower chance
--local resolution =mathrandom(4,20)
for y = pos.z, sizez - resolution, resolution do
if (Vector3.new(0,0,y)-Vector3.new(0,0,pos2.Z)).Magnitude<sizez then
-- Calculate the height noise value for this coordinate
resolution =mathrandom(2,7)*2
prevscale=biomeScale
--local biomeScale = mathrandom(8.20)/10
-- spawn(function()
-- The maximum height of the terrain in studs
biomeScale=math.abs((biomeScale-prevscale)/2+biomeScale)
local hn = simplexNoise(x, y)
local scale = biomeScale
-- Map the height noise value to a height value
local h = math.floor(hn * height)
--SimplexNoise.seedP(101)
-- Calculate the biome noise value for this coordinate
local bn =nil
--local hn = SimplexNoise.Noise2D(x, y)
----Noise2D = local function(xin,yin)
---- Map the height noise value to a height value
--local h = math.floor(hn * height)
---- Calculate the biome noise value for this coordinate
--local bn = SimplexNoise.Noise2D(x * biomeScale + seed * 1000, y * biomeScale + seed * 1000)
---- Select a material and a color based on the biome noise value
local chance=mathrandom(1,3)
--print(chance)
--if chance==1 then
bn = perlinNoise(x * biomeScale + seed * mathrandom(500,1000), y * biomeScale + seed * mathrandom(500,1000))
material = selectBiome(bn)
--elseif chance==2 then
-- material = selectBiome(bn)
--elseif chance==3 then
-- material = selectBiome(hn/1.5)
--end
local subregion1 = Region3.new(
Vector3.new(x, pos.y-.005, y), -- The minimum point of the subregion
Vector3.new(x + resolution, pos.y+h, y + resolution) -- The maximum point of the subregion
)
if island==2 and material==Enum.Material.Grass then
material=Enum.Material.Sand
end
--subregion1.Size
--CFrame.new(subregion1.CFrame)*CFrame.Angles(0, math.rad(mathrandom(-180,180)),0)
local chance=mathrandom(1,5)
if lockedbiome==nil then
material=material
else material=lockedbiome
end
if chance==1 then
terrain:FillBlock((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)+1), math.rad(mathrandom(-180,180)+1),math.rad(mathrandom(-15,15)+1)),subregion1.Size,material)
terrain:FillBlock((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)+1), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15)+1)),subregion1.Size,material)
elseif chance==3 then
--terrain:FillCylinder()
terrain:FillCylinder((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size.Y,subregion1.Size.X/2,material)
elseif chance==4 and material~=Enum.Material.Snow and material~=Enum.Material.Grass and material~=Enum.Material.Sand then
--terrain:FillCylinder((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size.Y,subregion1.Size.X/2,material)
terrain:FillBlock((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
--terrain:FillWedge((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
elseif chance==2 then
terrain:FillCylinder((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size.Y,subregion1.Size.X/2,material)
terrain:FillBlock((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
elseif chance==5 then
terrain:FillBall(subregion1.CFrame.Position,subregion1.Size.X/2,Enum.Material.LeafyGrass)
--
--terrain:FillCylinder((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size.Y,subregion1.Size.X/2,material)
--terrain:FillBlock((subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
end
if material==Enum.Material.Ground then
local chance= mathrandom(1,30)
if chance==1 then
local ChestRoll=mathrandom(1,5)
local Chest=game.ReplicatedStorage.Drops.Chests:FindFirstChild("Chest"..ChestRoll.."")
local Chest=Chest:Clone()
Chest:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2+Chest.PrimaryPart.Size.Y/2,0)))
Chest.Parent=workspace.Trees
end
end
if material==Enum.Material.Basalt then
if hilltrigger==false then
if height> origheight then
height=height-mathrandom(1,6)/10
if height<origheight then
height=origheight
end
else
hillroll=mathrandom(1,hillweight*2)
if hillroll==1 then
--biomeScale = mathrandom(1,10)
hilltrigger=true
end
--height = origheight
end
elseif height<maxheight then
height=height+(mathrandom(1,5)/10)
else
hilltrigger=false
end
if hilltrigger==true then
hillroll=mathrandom(1,hillweight)
if hillroll==1 then
hilltrigger=false
end
end
-- local Size=Vector3.new(mathrandom(min,max),mathrandom(1,yscale*12),mathrandom(min,max))
if mathrandom(1,30)==1 then
local Crystal=Crystal2:Clone()
RollCrystal(Crystal)
Crystal:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position-Vector3.new(0,subregion1.Size.Y/2*.8,0)))
Crystal.Parent=workspace.Trees
else
terrain:FillWedge(CFrame.new(mathrandom(-4,4),mathrandom(1,12),mathrandom(-4,4))*(subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
terrain:FillBlock(CFrame.new(mathrandom(-4,4),mathrandom(1,8),mathrandom(-4,4))*(subregion1.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size,material)
end
end
--local dif=(subregion2.CFrame.Position-pos)
--local mod=Vector3.new(dif.X/2,dif.Y,dif.Z/2)
--local mod2=Vector3.new(dif.X/1.75,dif.Y,dif.Z/1.75)
--local center=pos+Vector3.new(size/2,-5,size/2)
if island==true then
local subregion3 = Region3.new(
Vector3.new(x, pos.y-(.01+h*1.2), y), -- The minimum point of the subregion
Vector3.new(x + resolution, pos.y, y + resolution) -- The maximum point of the subregion
)
terrain:FillWedge(CFrame.new(subregion3.CFrame.Position-Vector3.new(0,4,0))*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion3.Size,Enum.Material.Rock)
local subregion3 = Region3.new(
Vector3.new(x, pos.y-(.01+h*1.2), y), -- The minimum point of the subregion
Vector3.new(x + resolution, pos.y, y + resolution) -- The maximum point of the subregion
)
terrain:FillWedge(CFrame.new(subregion3.CFrame.Position-Vector3.new(0,4,0))*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion3.Size,Enum.Material.Rock)
-- terrain:FillWedge(CFrame.new(subregion3.CFrame.Position-Vector3.new(0,4,0))*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion3.Size,Enum.Material.Rock)
end
if island==1 then
local subregion3 = Region3.new(
Vector3.new(x, -16, y), -- The minimum point of the subregion
Vector3.new(x + resolution, -14, y + resolution) -- The maximum point of the subregion
)
if material~=Enum.Material.Snow and material~=Enum.Material.Ice then
terrain:FillCylinder((subregion3.CFrame)*CFrame.Angles(math.rad(mathrandom(-5,5)), math.rad(mathrandom(0,2)),math.rad(mathrandom(-5,5))),1,subregion1.Size.X*4,Enum.Material.Sand)
else
terrain:FillCylinder((subregion3.CFrame)*CFrame.Angles(math.rad(mathrandom(-5,5)), math.rad(mathrandom(0,2)),math.rad(mathrandom(-5,5))),1,subregion1.Size.X*4,Enum.Material.Snow)
end
--if mathrandom(1,50)==1 then
-- local tree= game.ServerStorage.DungeonGenerator.DesertPlants:FindFirstChild("DesertPlants"..mathrandom(1,#Desertplant)):Clone()
-- Resize(tree,mathrandom(50,100)/100)
--task.wait()*-
-- tree.CFrame=(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion3.Size.Y/2-.1,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
--end
-- terrain:FillCylinder((subregion3.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-5,5)),math.rad(mathrandom(-15,15))),1,subregion1.Size.X*5,Enum.Material.Sand)
local subregion3 = Region3.new(
Vector3.new(x, pos.y-(.01+h*1.2), y), -- The minimum point of the subregion
Vector3.new(x + resolution, pos.y, y + resolution) -- The maximum point of the subregion
)
terrain:FillWedge(CFrame.new(subregion3.CFrame.Position-Vector3.new(0,4,0))*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion3.Size,Enum.Material.Rock)
local subregion3 = Region3.new(
Vector3.new(x, pos.y-(.01+h*1.4), y), -- The minimum point of the subregion
Vector3.new(x + resolution, pos.y, y + resolution) -- The maximum point of the subregion
)
terrain:FillWedge(CFrame.new(subregion3.CFrame.Position-Vector3.new(0,4,0))*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion3.Size,Enum.Material.Rock)
elseif island==2 then
--local subregion3 = Region3.new(
-- Vector3.new(x, -14, y), -- The minimum point of the subregion
-- Vector3.new(x + resolution, -12, y + resolution) -- The maximum point of the subregion
--)
--terrain:FillCylinder((subregion3.CFrame)*CFrame.Angles(math.rad(mathrandom(-5,5)), math.rad(mathrandom(-5,5)),math.rad(mathrandom(-5,5))),1,subregion1.Size.X*4,Enum.Material.Sand)
-- terrain:FillCylinder((subregion3.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-5,5)),math.rad(mathrandom(-15,15))),1,subregion1.Size.X*5,Enum.Material.Sand)
--if mathrandom(1,18)==1 then
-- placemarineplant(subregion1)
--end
end
-- terrain:FillWedge((subregion2.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion2.Size,Enum.Material.Rock)
if material==Enum.Material.Basalt then
if mathrandom(1,50)==1 then
local P = math.random(1,22)
--local TotalTrees = (TotalTrees)+1
--initialTrees= initialTrees+1
local Tree = game.ServerStorage.MapObjects.Rubble:FindFirstChild("Rock"..P..""):Clone()
Tree.Parent = workspace:WaitForChild("Plants")
--.Alchemy
Resize(Tree,mathrandom(25,200)/100)
Tree.Position=subregion1.CFrame.Position+Vector3.new(0,Tree.Size.Y/1.9+subregion1.Size.Y/2,0)
end
end
if material==Enum.Material.Snow then
if mathrandom(1,20)==1 then
local tree= game.ServerStorage.DungeonGenerator.WinterTree:FindFirstChild("WinterTree"..mathrandom(1,#Winttree)):Clone()
Resize(tree,mathrandom(50,100)/100)
--task.wait()
tree.CFrame=(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1+tree.Size.Y/2,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
tree.Parent=workspace.Trees
end
end
--terrain:FillCylinder((subregion2.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion2.Size.Y,subregion2.Size.X/2,material)
--terrain:FillCylinder((subregion2.CFrame)*CFrame.Angles(math.rad(mathrandom(-15,15)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-15,15))),subregion1.Size.Y,subregion1.Size.X/2,material)
if material==Enum.Material.Sand then
if mathrandom(1,30)==1 then
local tree= game.ServerStorage.DungeonGenerator.DesertPlants:FindFirstChild("DesertPlants"..mathrandom(1,#Desertplant)):Clone()
Resize(tree,mathrandom(50,100)/100)
--task.wait()
tree.CFrame=(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1+tree.Size.Y/2,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
tree.Parent=workspace.Plants
elseif mathrandom(1,10)==2 then
local tree= game.ServerStorage.DungeonGenerator.DesertTrees:FindFirstChild("Palmtree"..mathrandom(1,3)):Clone()
Resize(tree,mathrandom(50,100)/100)
--task.wait()
if tree:IsA("Model") then
if tree.PrimaryPart==nil and tree.Parent~=nil then
tree.PrimaryPart=tree:FindFirstChildOfClass("BasePart")
end
if tree.PrimaryPart~=nil then
tree:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
else
-- tree:MoveTo
end
else
tree.CFrame=(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
end
--tree:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-1,0)))
--task.delay(1,function() tree:MoveTo(tree.PrimaryPart.Position) end)
tree.Parent=workspace.Trees
end
end
if material==Enum.Material.Grass or material==Enum.Material.LeafyGrass then
if mathrandom(1,30)==1 then
local tree= game.ServerStorage.MapObjects.Trees:FindFirstChild("Tree"..mathrandom(1,20)):Clone()
Resize(tree,mathrandom(50,100)/100)
--task.wait()
tree:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
--tree:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-1,0)))
--task.delay(1,function() tree:MoveTo(tree.PrimaryPart.Position) end)
tree.Parent=workspace.Trees
--
elseif mathrandom(1,15)==1 then
placeplant(subregion1)
end
end
local plantconflict=findNearestplant(subregion1.CFrame.Position,subregion1)
local treeconflict=findNearesttree(subregion1.CFrame.Position,subregion1)
--if treeconflict~=nil then
--task.wait()
--treeconflict:SetPrimaryPartCFrame(CFrame.new(subregion1.CFrame.Position+Vector3.new(0,subregion1.Size.Y/2-.1,0))*CFrame.Angles(math.rad(mathrandom(-10,10)), math.rad(mathrandom(-180,180)),math.rad(mathrandom(-10,10))))
--end
--end)
cycle=cycle+1
if cycle>=400 then
cycle=0
task.wait()
end
end
end
end
end
-- local maxheight=maxheight/1.2
spawn(function()
local region= Region3.new(CFrame.new(Vector3.new(pos.x-.005,-.005,pos.z-.005)-Vector3.new(.01+size/2,2,.01+sizez/2)).Position,CFrame.new(Vector3.new(pos.x,2,pos.z)+Vector3.new(.02+size/2,1,.02+sizez/2)).Position)
-- print(region)
--wait()
local poscfram=(CFrame.new(pos+Vector3.new(size/2,1,sizez/2)))
--terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-4,size/2))),Vector3.new(size+8,8,size+8),Enum.Material.Air)
--terrain:FillBlock((CFrame.new(pos+Vector3.new(size/2,-4,size/2))):T,Vector3.new(size+8,8,size+8),Enum.Material.Air)
--game.Workspace.Terrain:ReplaceMaterial(region,4,Enum.Material.Ground,Enum.Material.Sand) --task.wait()
--game.Workspace.Terrain:ReplaceMaterial(region,4,Enum.Material.Grass,Enum.Material.Sand) --task.wait()
--game.Workspace.Terrain:ReplaceMaterial(region,4,Enum.Material.LeafyGrass,Enum.Material.Sand) --task.wait()
--terrain:FillCylinder(,Vector3.new(size/2,4,size/2),Enum.Material.Basalt)
--terrain:FillCylinder((poscfram),4,size/1.9,Enum.Material.Rock)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-4,4),-2,mathrandom(-4,4))),4,size/2,Enum.Material.Basalt)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-6,6),-4,mathrandom(-6,6))),4,size/2.2,Enum.Material.Asphalt)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-8,8),-6,mathrandom(-8,8))),4,size/2.4,Enum.Material.Asphalt)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-10,10),-8,mathrandom(-10,10))),4,size/2.8,Enum.Material.Asphalt)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-10,10),-10,mathrandom(-10,10))),4,size/3.2,Enum.Material.Asphalt)
--terrain:FillCylinder((poscfram):ToWorldSpace(CFrame.new(mathrandom(-10,10),-12,mathrandom(-10,10))),4,size/8,Enum.Material.Asphalt)
local cent =pos2
if island==true then
terrain:FillBlock(CFrame.new(pos+Vector3.new(0,0,sizez*2),cent),Vector3.new(size/2,maxheight*1.6+4,sizez/2),Enum.Material.Air)
terrain:FillBlock(CFrame.new(pos+Vector3.new(size*2+0,0,0),cent),Vector3.new(size/2,maxheight*1.6+4,sizez/2),Enum.Material.Air)
terrain:FillBlock(CFrame.new(pos+Vector3.new(size*2,0,sizez*2),cent),Vector3.new(size/3,maxheight*1.6+4,sizez/2),Enum.Material.Air)
terrain:FillBlock(CFrame.new(pos-Vector3.new(.010,0,.010),cent),Vector3.new(size/2,maxheight*1.6+4,sizez/2),Enum.Material.Air)
end
--terrain:FillBlock(CFrame.new(pos+Vector3.new(-2,0,sizez/2),cent),Vector3.new(sizez,maxheight*10,10),Enum.Material.Air)
--terrain:FillBlock(CFrame.new(pos+Vector3.new(size/2,0,-2),cent),Vector3.new(size,maxheight*2+10,10),Enum.Material.Air)
--terrain:FillBlock(CFrame.new(pos+Vector3.new(size/2,0,sizez+2),cent),Vector3.new(sizez,maxheight*2+10,10),Enum.Material.Air)
--terrain:FillBlock(CFrame.new(pos+Vector3.new(size+2,0,sizez/2),cent),Vector3.new(size,maxheight*2+10,10),Enum.Material.Air)
-- define a local function that takes width, length and position as parameters
--local function createWaterLine(width, length, position)
-- loop through the x and z coordinates of the water line
--if typeof(position) == "Vector3" then
-- -- do something
--else
-- print("Waterline Error")
-- -- handle the error
--end
--for x = position.X, position.X + width do
-- for z = position.Z, position.Z + length do
-- -- replace the air material with water material at 4 studs height
-- terrain:ReplaceMaterial(
-- Region3.new(
-- Vector3.new(x, position.Y, z),
-- Vector3.new(x + 1, position.Y + 4, z + 1)
-- ),4,
-- Enum.Material.Grass,
-- Enum.Material.Sand
-- )
-- end
--end
--end
-- call the local function with some example values
--createWaterLine(size*2, sizez*2, pos)
local YPos=cent.Y
--width=size/20-20/2
--5+2+1*20=120
local C=Center:Clone()
C.Position=pos2
if wall==true then
--BuildWall(length,width,YPos,C,true,true)
--BuildBorder(pos2,YPos,length,width,C,true)
end
end)
end
This is due to some change roblox made between may 2022 and august 2022, I havenât made any changes to the place since may 2022 and it wasnt laggy then. However expect to see some updates soon.
Also you can make all the surface guis locally rendered to save resources. I have a system procedurally generates the world in chunks as the player explores it. I can provide you a template if you could help me with this.
The algorithm itself is described here. Minecraft Classic map generation algorithm ¡ UnknownShadow200/ClassiCube Wiki ¡ GitHub
If you want to see the code, I provided a place file in a previous comment, the generation code is in workspace.Minecraft.Level