TimberWoods / src /ServerScriptService /BiomeGeneratorManager.server.lua
algorembrant's picture
Upload 88 files
0712d5f verified
-- src/ServerScriptService/BiomeGeneratorManager.server.lua
-- Simple flat baseplate-style world with colored biome regions
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local BiomeConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("BiomeConfig"))
local GameConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("GameConfig"))
-- Create folders
local biomeZonesFolder = Instance.new("Folder")
biomeZonesFolder.Name = "BiomeZones"
biomeZonesFolder.Parent = workspace
local worldFolder = Instance.new("Folder")
worldFolder.Name = "WorldStructures"
worldFolder.Parent = workspace
-- Biome color map (distinct flat colors, no grass)
local BiomeColors = {
Forest = Color3.fromRGB(80, 130, 60),
PineWoods = Color3.fromRGB(50, 100, 45),
Swamp = Color3.fromRGB(65, 85, 50),
Desert = Color3.fromRGB(210, 190, 130),
Volcanic = Color3.fromRGB(70, 40, 35),
IcePeak = Color3.fromRGB(190, 210, 230),
TropicalRainforest = Color3.fromRGB(35, 110, 40),
Meadow = Color3.fromRGB(140, 180, 80),
}
local function createBiomePlate(biomeName, biomeData)
local region = biomeData.Region
local regionWidth = region.MaxX - region.MinX
local regionDepth = region.MaxZ - region.MinZ
local centerX = (region.MinX + region.MaxX) / 2
local centerZ = (region.MinZ + region.MaxZ) / 2
-- Flat baseplate for this biome
local plate = Instance.new("Part")
plate.Name = biomeName .. "_Plate"
plate.Size = Vector3.new(regionWidth, 1, regionDepth)
plate.Position = Vector3.new(centerX, -0.5, centerZ) -- Top surface at Y=0
plate.Anchored = true
plate.Material = Enum.Material.SmoothPlastic
plate.Color = BiomeColors[biomeName] or Color3.fromRGB(100, 100, 100)
plate.TopSurface = Enum.SurfaceType.Smooth
plate.BottomSurface = Enum.SurfaceType.Smooth
plate.Parent = biomeZonesFolder
-- Invisible detection zone (taller, for biome detection)
local zonePart = Instance.new("Part")
zonePart.Name = biomeName .. "_Zone"
zonePart.Size = Vector3.new(regionWidth, 50, regionDepth)
zonePart.Position = Vector3.new(centerX, 25, centerZ)
zonePart.Anchored = true
zonePart.CanCollide = false
zonePart.Transparency = 1
zonePart:SetAttribute("BiomeName", biomeName)
CollectionService:AddTag(zonePart, "BiomeZone")
zonePart.Parent = biomeZonesFolder
-- Hazard zone if applicable
if biomeData.HazardType then
local hazardZone = Instance.new("Part")
hazardZone.Name = biomeName .. "_Hazard"
hazardZone.Size = Vector3.new(regionWidth * 0.8, 20, regionDepth * 0.8)
hazardZone.Position = Vector3.new(centerX, 10, centerZ)
hazardZone.Anchored = true
hazardZone.CanCollide = false
hazardZone.Transparency = 0.95
hazardZone.BrickColor = BrickColor.new("Bright red")
if biomeData.HazardAttribute then
hazardZone:SetAttribute("HazardType", biomeData.HazardAttribute)
end
CollectionService:AddTag(hazardZone, biomeData.HazardType)
hazardZone.Parent = biomeZonesFolder
end
-- Biome label sign at center
local signPart = Instance.new("Part")
signPart.Name = biomeName .. "_Sign"
signPart.Size = Vector3.new(8, 4, 0.5)
signPart.Position = Vector3.new(centerX, 4, centerZ)
signPart.Anchored = true
signPart.Material = Enum.Material.Wood
signPart.BrickColor = BrickColor.new("Reddish brown")
signPart.Parent = biomeZonesFolder
local signGui = Instance.new("SurfaceGui")
signGui.Face = Enum.NormalId.Front
signGui.Parent = signPart
local signLabel = Instance.new("TextLabel")
signLabel.Size = UDim2.new(1, 0, 1, 0)
signLabel.BackgroundTransparency = 1
signLabel.Text = biomeName
signLabel.TextColor3 = Color3.new(1, 1, 1)
signLabel.TextScaled = true
signLabel.Font = Enum.Font.GothamBold
signLabel.Parent = signGui
print("Biome plate created:", biomeName)
end
-- Create spawn platform (elevated slightly so it is distinct)
local function createSpawnPlatform()
local platform = Instance.new("Part")
platform.Name = "SpawnPlatform"
platform.Size = Vector3.new(GameConfig.SpawnPlatformSize.X, 0.2, GameConfig.SpawnPlatformSize.Z)
platform.Position = Vector3.new(GameConfig.SpawnPosition.X, 0.1, GameConfig.SpawnPosition.Z) -- rests slightly above biome plate
platform.Anchored = true
platform.Material = Enum.Material.SmoothPlastic
platform.Color = Color3.fromRGB(160, 160, 165)
platform.TopSurface = Enum.SurfaceType.Smooth
platform.BottomSurface = Enum.SurfaceType.Smooth
CollectionService:AddTag(platform, "SpawnPlatform")
platform.Parent = worldFolder
local spawn = Instance.new("SpawnLocation")
spawn.Size = Vector3.new(6, 1, 6)
spawn.Position = Vector3.new(GameConfig.SpawnPosition.X, 0.5, GameConfig.SpawnPosition.Z)
spawn.Anchored = true
spawn.CanCollide = false
spawn.Transparency = 1
spawn.Parent = worldFolder
end
-- World boundaries
local function createWorldBoundaries()
local bounds = GameConfig.WorldBounds
local height = 200
local thickness = 5
local walls = {
{pos = Vector3.new(0, height/2, bounds.MinZ), size = Vector3.new(bounds.MaxX - bounds.MinX, height, thickness)},
{pos = Vector3.new(0, height/2, bounds.MaxZ), size = Vector3.new(bounds.MaxX - bounds.MinX, height, thickness)},
{pos = Vector3.new(bounds.MinX, height/2, 0), size = Vector3.new(thickness, height, bounds.MaxZ - bounds.MinZ)},
{pos = Vector3.new(bounds.MaxX, height/2, 0), size = Vector3.new(thickness, height, bounds.MaxZ - bounds.MinZ)},
}
for i, wallData in ipairs(walls) do
local wall = Instance.new("Part")
wall.Name = "WorldBoundary_" .. i
wall.Size = wallData.size
wall.Position = wallData.pos
wall.Anchored = true
wall.Transparency = 1
wall.CanCollide = true
CollectionService:AddTag(wall, "WorldBoundary")
wall.Parent = worldFolder
end
end
-- Plot areas
local function createPlots()
local plotsFolder = Instance.new("Folder")
plotsFolder.Name = "Plots"
plotsFolder.Parent = worldFolder
for i, pos in ipairs(GameConfig.PlotPositions) do
local plot = Instance.new("Part")
plot.Name = "Plot_" .. i
plot.Size = Vector3.new(200, 0.2, 200)
plot.Position = Vector3.new(pos.X, 0.1, pos.Z) -- elevate slightly to prevent z-fighting
plot.Anchored = true
plot.Material = Enum.Material.SmoothPlastic
plot.Color = Color3.fromRGB(90, 90, 95)
plot.TopSurface = Enum.SurfaceType.Smooth
plot.BottomSurface = Enum.SurfaceType.Smooth
plot.Transparency = 1 -- fully invisible as requested
CollectionService:AddTag(plot, "EmptyPlot")
plot.Parent = plotsFolder
end
end
-- Execute world generation
task.spawn(function()
print("=== Timberbound Expeditions: World Generation Starting ===")
createSpawnPlatform()
createWorldBoundaries()
createPlots()
-- Create flat biome plates (no terrain, no elevation)
for biomeName, biomeData in pairs(BiomeConfig.Biomes) do
createBiomePlate(biomeName, biomeData)
end
print("=== World Generation Complete ===")
_G.BiomeGenerationComplete = true
end)