Hey, Im a newer scripter trying to make my code optimized and organized. Below is a snippet of code I wrote for structure generation, what are some mistakes I made and some things I can work on.
local rs = game:GetService("ReplicatedStorage")
--settings
local distance = 250
local variance = 70
local amountperring = 20
local mindistance = 150
local maxdistance = 2000
local maxdistfromplayer = 2000
local segments = rs.Segments
local segmentsfolder = game.Workspace.Structures
local enemiesfolder = game.Workspace.Enemies
local spawns = {Vector3.new(0, 0, 0)}
local function generaterandompos()
local lv = (Vector3.new(math.random(-100, 100), 0, math.random(-100, 100)) / 100).Unit
local amp = distance + math.random(-variance, variance)
local final = lv * amp
return final
end
local function findspawnlocation(playerpos)
local position
while not position do
local potentialpos = generaterandompos()
local closestdist = 10000
for i, v in pairs(spawns) do
local distance = (potentialpos - v).Magnitude
if distance < closestdist then
closestdist = distance
end
end
local nearestplayer
local nearestplayerdist = maxdistfromplayer
local chars = game.Workspace:GetChildren()
for i, v in ipairs(chars) do
local hum = v:FindFirstChildOfClass("Humanoid")
if hum then
local hrp = v.HumanoidRootPart
local distance = (potentialpos - hrp.Position).Magnitude
if distance < nearestplayerdist then
nearestplayer = v
nearestplayerdist = distance
end
end
end
if closestdist > mindistance and closestdist < maxdistance and nearestplayer then
position = potentialpos + playerpos
end
task.wait()
end
local rotation = Vector3.new(0, math.rad(math.random(-180, 180)), 0)
local cframe = CFrame.new(position, rotation)
return cframe
end
local function choosestructure(pos)
local level = math.round(pos.Magnitude/700)
local clampedlevel = math.clamp(level, 1 , 4)
local levelsegments = segments:FindFirstChild("level"..clampedlevel)
local segment = levelsegments:GetChildren()[math.random(1, #levelsegments:GetChildren())]
return segment
end
local function loadstructure(structure, cframe)
local newstruct = structure:Clone()
task.wait()
newstruct.Parent = segmentsfolder
task.wait()
newstruct:PivotTo(cframe)
task.wait()
local structureenemies = newstruct.Enemies
local enemies = structureenemies:GetChildren()
for i, v in ipairs(enemies) do
v.Parent = enemiesfolder
end
structureenemies:Destroy()
end
local function generatestructure(playerpos)
local spawncframe = findspawnlocation(playerpos)
local segment = choosestructure(spawncframe.Position)
table.insert(spawns, spawncframe.Position)
loadstructure(segment, spawncframe)
end
while true do
for i, v in ipairs(game.Players:GetChildren()) do
local char = v.Character
if char then
print("j")
local hrp = char.HumanoidRootPart
generatestructure(hrp.Position)
end
task.wait()
end
task.wait(1)
end