TimberWoods / src /ServerScriptService /MutationManager.server.lua
algorembrant's picture
Upload 88 files
0712d5f verified
-- src/ServerScriptService/MutationManager.server.lua
local CollectionService = game:GetService("CollectionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local MutationConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("MutationConfig"))
local function applyMutation(treeModel, hazardType)
local config = MutationConfig.Hazards[hazardType]
if not config then return end
-- In Lumber Tycoon style, trees are models containing segments
treeModel:SetAttribute("Mutated", hazardType)
for _, part in pairs(treeModel:GetDescendants()) do
if part:IsA("BasePart") and CollectionService:HasTag(part, "TreeSegment") then
part:SetAttribute("TreeType", config.ModifiedType)
part.Material = config.Material
part.Color = config.Color
-- Optional: Add a ParticleEmitter
if hazardType == "Toxic" then
local particles = Instance.new("ParticleEmitter")
particles.Color = ColorSequence.new(config.Color)
particles.Size = NumberSequence.new(0.5, 0)
particles.Rate = 5
particles.Parent = part
end
end
end
end
-- Scan all hazard zones at startup (and potentially periodically)
local function scanForMutations()
for _, hazardZone in pairs(CollectionService:GetTagged("HazardZone")) do
local hazardType = hazardZone:GetAttribute("HazardType")
local config = MutationConfig.Hazards[hazardType]
if config then
-- Find all trees near the hazard
for _, tree in pairs(CollectionService:GetTagged("TreeModel")) do
if not tree:GetAttribute("Mutated") then
local distance = (tree.PrimaryPart.Position - hazardZone.Position).Magnitude
if distance <= config.Radius then
if math.random() <= config.MutationChance then
applyMutation(tree, hazardType)
end
end
end
end
end
end
end
-- Run scan after a brief delay to ensure map has loaded
task.delay(5, scanForMutations)