local Tower = {} Tower.__index = Tower function Tower:new(model, position, range, damage, fireRate, effect) local self = setmetatable({}, Tower) self.model = model:Clone() self.model.Position = position self.model.Anchored = true self.model.Parent = workspace self.range = range self.damage = damage self.fireRate = fireRate or 1 -- shots per second self.effect = effect -- set of params for effect self.lastFire = 0 return self end function Tower:canAttack(enemy) if not enemy.alive or not enemy.model or not enemy.model.PrimaryPart then return false end local dist = (self.model.Position - enemy.model.PrimaryPart.Position).Magnitude return dist <= self.range end function Tower:attack(enemies, dt) self.lastFire = self.lastFire + dt if self.lastFire >= (1 / self.fireRate) then for _, enemy in ipairs(enemies) do if self:canAttack(enemy) then enemy:damage(self.damage) if self.effect then enemy:applyEffect(self.effect.name, self.effect.params) end self.lastFire = 0 break -- Only attack one enemy per fire end end end end return Tower