134 lines
4.2 KiB
Lua
134 lines
4.2 KiB
Lua
TrackEnemy = {}
|
|
TrackEnemy.__index = TrackEnemy
|
|
|
|
|
|
function TrackEnemy:new(model, name, health, speed)
|
|
local self = setmetatable({}, TrackEnemy)
|
|
self.model = model
|
|
self.name = name
|
|
self.health = health
|
|
self.baseSpeed = speed
|
|
self.speed = speed
|
|
self.alive = true
|
|
self.currentWaypoint = 1
|
|
self.effects = {}
|
|
return self
|
|
end
|
|
|
|
function TrackEnemy:applyEffect(effectName, params)
|
|
self.effects[effectName] = {
|
|
duration = params.duration,
|
|
tick = params.tick,
|
|
value = params.value,
|
|
elapsed = 0
|
|
}
|
|
self:showEffect(effectName)
|
|
end
|
|
|
|
function TrackEnemy:updateEffects(dt)
|
|
for name, effect in pairs(self.effects) do
|
|
effect.elapsed = effect.elapsed + dt
|
|
if name == "burn" and effect.tick then
|
|
if effect.elapsed >= effect.tick then
|
|
self:damage(effect.value)
|
|
effect.elapsed = effect.elapsed - effect.tick
|
|
end
|
|
end
|
|
if name == "slow" then
|
|
self.speed = self.baseSpeed * effect.value
|
|
elseif name == "freeze" then
|
|
self.speed = 0
|
|
end
|
|
|
|
effect.duration = effect.duration - dt
|
|
if effect.duration <= 0 then
|
|
self.effects[name] = nil
|
|
self.speed = self.baseSpeed
|
|
self:hideEffect(name)
|
|
end
|
|
end
|
|
end
|
|
|
|
function TrackEnemy:damage(amount)
|
|
self.health = self.health - amount
|
|
if self.health <= 0 then
|
|
self.alive = false
|
|
self:die()
|
|
end
|
|
end
|
|
|
|
function TrackEnemy:die()
|
|
print(self.name .. " has died.")
|
|
if self.model then
|
|
self.model:Destroy()
|
|
end
|
|
end
|
|
|
|
function TrackEnemy:moveToWaypoints(waypoints, dt)
|
|
self:updateEffects(dt)
|
|
if not self.currentWaypoint then self.currentWaypoint = 1 end
|
|
local target = waypoints[self.currentWaypoint]
|
|
if target then
|
|
local currentPos = self.model.PrimaryPart.Position
|
|
local targetPos = target.Position
|
|
local direction = (targetPos - currentPos).Unit
|
|
local distance = (targetPos - currentPos).Magnitude
|
|
local step = self.speed * dt
|
|
|
|
if distance <= step then
|
|
self.model.SetPrimaryPartCFrame(CFrame.new(targetPos))
|
|
self.currentWaypoint = self.currentWaypoint + 1
|
|
else
|
|
self.model:SetPrimaryPartCFrame(
|
|
CFrame.new(currentPos + direction + step)
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Effects Visuals
|
|
function TrackEnemy:showEffect(effectName)
|
|
if not self.model.PrimaryPart then return end
|
|
if effectName == "burn" then
|
|
if not self.model.PrimaryPart:FindFirstChild("BurnEffect") then
|
|
local fire = Instance.new("ParticleEmitter")
|
|
fire.Name = "BurnEffect"
|
|
fire.Texture = "rbxassetid://243098098"
|
|
fire.Color = ColorSequence.new(Color3.new(1, 0.5, 0))
|
|
fire.Parent = self.model.PrimaryPart
|
|
end
|
|
elseif effectName == "slow" then
|
|
if not self.model.PrimaryPart:FindFirstChild("SlowEffect") then
|
|
local fire = Instance.new("ParticleEmitter")
|
|
fire.Name = "SlowEffect"
|
|
fire.Texture = "rbxassetid://243098098"
|
|
fire.Color = ColorSequence.new(Color3.new(0, 0.9, 1))
|
|
fire.Parent = self.model.PrimaryPart
|
|
end
|
|
elseif effectName == "freeze" then
|
|
if not self.model.PrimaryPart:FindFirstChild("FreezeEffect") then
|
|
local gui = Instance.new("BillboardGui")
|
|
gui.Name = "FreezeEffect"
|
|
gui.Size = UDim2.new(0, 50, 0, 50)
|
|
gui.AlwaysOnTop = true
|
|
gui.Parent = self.model.PrimaryPart
|
|
local label = Instance.new("TextLabel")
|
|
label.Size = UDim2.new(1,0,1,0)
|
|
label.BackgroundTransparency = 1
|
|
label.Text = "FROZEN"
|
|
label.TextColor3 = Color3.new(0,1,1)
|
|
label.Parent = gui
|
|
end
|
|
end
|
|
end
|
|
|
|
function TrackEnemy:hideEffect(effectName)
|
|
if not self.model.PrimaryPart then return end
|
|
local effect = self.model.PrimaryPart:FindFirstChild(effectName == "burn" and "BurnEffect"
|
|
or effectName == "slow" and "SlowEffect"
|
|
or effectName == "freeze" and "FreezeEffect")
|
|
if effect then
|
|
effect:Destroy()
|
|
end
|
|
end
|