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