43 lines
1.2 KiB
Lua
43 lines
1.2 KiB
Lua
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
|