-- DEBUFF HANDLER MODULE SCRIPT local Debuff = {} local RunService = game:GetService("RunService") Debuff.__index = Debuff Debuff.DebuffSchema = { Wither = { TickInterval = 1, Duration = 5, UniqueStatusData = { Name = "Withering", Damage = 5, Slow = 6, Color = Color3.fromRGB(100,0,0) }, OnApplied = function(EntityId,UniqueStatusData) print("Applied the debuff ",UniqueStatusData.Name," on ",EntityId.Name) end, OnRemoved = function(EntityId,UniqueStatusData) print("Removed the debuff ",UniqueStatusData.Name," on ",EntityId.Name) end, OnTick = function(EntityId,UniqueStatusData) print("Triggered the debuff ",UniqueStatusData.Name," on ",EntityId.Name) EntityId:TakeDamage(2) end, } } local ActiveDebuffs = {} function Debuff.new(entityid,endtime,nexttick,schema) local now = os.clock() local self = setmetatable({}, Debuff) self.EntityId = entityid self.EndTime = now + endtime self.NextTick = now + nexttick -- Schema Cache is better to avoid table lookups every frame on schema self.TickInterval = schema.TickInterval self.Duration = schema.Duration self.UniqueStatusData = schema.UniqueStatusData self.OnApplied = schema.OnApplied self.OnRemoved = schema.OnRemoved self.OnTick = schema.OnTick self.OnApplied(self.EntityId,self.UniqueStatusData) table.insert(ActiveDebuffs,self) return self end function Debuff:_Update(now) if now > self.EndTime + 1 then -- I like to end it on 0 self:Destroy() return false elseif now >= self.NextTick then self.NextTick = now + self.TickInterval self.OnTick(self.EntityId,self.UniqueStatusData) end return true end function Debuff:Destroy() self.OnRemoved(self.EntityId,self.UniqueStatusData) end RunService.Heartbeat:Connect(function() local now = os.clock() for i = #ActiveDebuffs, 1, -1 do local Debuff = ActiveDebuffs[i] if not Debuff:_Update(now) then ActiveDebuffs[i] = ActiveDebuffs[#ActiveDebuffs] ActiveDebuffs[#ActiveDebuffs] = nil end end end) return Debuff -- DEBUFF HANDLER SERVER SCRIPT local DebuffModule = require(game.ServerStorage.DebuffModule) local EntityModule = require(game.ServerStorage.EntityMaker9000) local RunService = game:GetService("RunService") for _,Villager in game.Workspace.Entities:GetChildren() do local VillagerInQuestion = EntityModule.new(Villager,math.random(10,12),1,2) local LiterallyThePlague = DebuffModule.new(VillagerInQuestion,5,1,DebuffModule.DebuffSchema.Wither) end