local RunService = game:GetService("RunService") local Tower = require(script.Parent.Tower) local Waves = require(script.Parent.Waves) local towerTypes = { { name = "Basic", model = workspace.BasicTowerModel, range = 20, damage = 10, fireRate = 1, }, { name = "Slow", model = workspace.SlowTowerModel, range = 15, damage = 5, fireRate = 0.5, effect = {name = "slow", params = {duration = 2, value = 0.5}} }, { name = "Fire", model = workspace.FireTowerModel, range = 18, damage = 8, fireRate = 1, effect = {name = "burn", params = {duration = 3, tick = 1, value = 2}} }, { name = "Freeze", model = workspace.FreezeTowerModel, range = 12, damage = 0, fireRate = 0.5, effect = {name = "freeze", params = {duration = 1}} } } local waypoints = { -- Fill with your waypoint Parts workspace.Waypoint1, workspace.Waypoint2, workspace.Waypoint3, -- etc. } local selectedTowerType = towerTypes[1] local enemies = {} -- Table to hold TrackEnemy objects local towers = {} function selectTowerType(index) selectedTowerType = towerTypes[index] end local function spawnWave(waveData) coroutine.wrap(function() for _, group in ipairs(waveData) do for i = 1, group.count do local enemyModel = group.model:Clone() enemyModel.Parent = workspace local enemy = TrackEnemy:new(enemyModel, group.name, group.health, group.speed) table.insert(enemies, enemy) end if group.delay and group.delay > 0 then wait(group.delay) end end end)() end spawnWave(Waves[1]) local function isOnTrack(position) for _, waypoint in ipairs(waypoints) do if (waypoint.Position - position).Magnitude < 5 then -- 5 studs return true end end return false end UserInputService.InputBegan:Connect(function (input, gameProcessed) if gameProcessed then return end if input.UserInputType == Enum.UserInputType.MouseButton1 then local mouse = game.Players.LocalPlayer():GetMouse() local position = mouse.Hit.p if not isOnTrack(position) then local tower = Tower:new( selectedTowerType.model, position, selectedTowerType.range, selectedTowerType.damage, selectedTowerType.fireRate, selectedTowerType.effect ) table.insert(towers, tower) end end end) RunService.Heartbeat:Connect(function(dt) for _, tower in ipairs(towers) do tower:attack(enemies, dt) end end) RunService.Heartbeat:Connect(function(dt) for i, enemy in ipairs(enemies) do if enemy.alive then enemy:moveToWaypoints(waypoints, dt) end end end)