Effectify v1.1.0 - A Customizable Status Effect Implementation

Effectify


Introduction

Effectify is an OOP-based module designed to simplify the management and application of status effects in Roblox games.
It allows developers to define, apply, and control effects like burning, slowing, or freezing, with flexible stacking behavior and full type safety.

Whether you’re building an RPG, action game, or anything with temporary buffs or debuffs, Effectify helps you keep your code clean, modular, and powerful!


:inbox_tray: Download

Module Link
https://create.roblox.com/store/asset/121743174910696/Effectify

Uncopylocked Place
Effectify - Roblox


Features

  • Easy Customization — Define effects in one place. (EffectLibrary)
  • Advanced Stacking System.
  • Pause / Resume Support.
  • GoodSignal Eventsstravant’s GoodSignal module.
  • Particle Integration — Automatically applied and cleaned up.

Constructor Parameters

Use StatusEffect.new(Params) to create a new effect instance:

Field Type Description
Owner Model? The target receiving the effect. (e.g., a character) Required
EffectType string Effect name from EffectLibrary. Required
Creator Instance Source of the effect (tool, part, etc.). Defaults to Owner.
Duration number Total duration in seconds. Defaults to EffectLibrary or 3.
Interval number Time between ticks. Defaults to EffectLibrary or 1.
CanStack boolean Whether the effect can stack. Defaults to EffectLibrary or true.
StackType string "Overwrite", "Yield", or "Overlap" behavior. Defaults to EffectLibrary or "Overwrite".
MaxStack number The maximum number of stacks allowed. Defaults to EffectLibrary or math.huge.
MaxStackBehavior string "DropOldest", "RejectNew" or "ResetAll" behavior. Defaults to EffectLibrary or "DropOldest".
Attributes {} Custom attributes (e.g., Fatal = true) for the effect. Defaults to EffectLibrary or {}
Particles {} A Particle container.
ParticleDict {} A dictionary of custom ParticleEmitter objects. (e.g., {Fire = particle, Ice = particle}). Defaults to EffectLibrary or {}

StackType Explained

Type Behavior
"Overwrite" Replaces previous effects of the same type.
"Yield" Queues the new effect until the old one finishes.
"Overlap" Allows multiple instances to run simultaneously.


MaxStackBehavior Explained

Behavior Description
"DropOldest" Removes the oldest effect in the stack and inserts the new one.
"RejectNew" Prevents new instances from being added if max stack is reached.
"ResetAll" Removes all instances and restarts with the new one.

Core Methods

effect:Activate()
effect:Pause()
effect:Resume()
effect:Deactivate()
  • :Activate() — Starts behavior.
  • :Pause() — Freezes duration and intervals.
  • :Resume() — Continues from pause.
  • :Deactivate() — Cancels effect immediately.


Global Effect Control

Effectify.PauseEffect(character, "Fire")
Effectify.ResumeEffect(character, "Fire")
Effectify.RemoveEffect(character, "Fire")
Effectify.IsActive(character, "Fire")
Effectify.GetActiveEffects(character)
  • PauseEffect(character, EffectType) — Freezes an active effect’s timer and behavior externally.
  • ResumeEffect(character, EffectType) — Resumes a paused effect from where it left off.
  • RemoveEffect(character, EffectType) — Instantly ends and cleans up the specified effect.
  • IsActive(character, EffectType) — Returns true if the effect is currently active on the target.
  • GetActiveEffects(character) — Returns a table of all currently active effects on the character or model.
  • GetAffected(EffectType) — Returns a table of all characters or models currently affected by the specified effect.

Signals (Events)

Powered by a custom event system based on stravant’s GoodSignal module.

Signal Name Fires When… Arguments
.ActivatedSignal The effect starts. (callback: (particles) -> ()) — Provide a function to receive particles from ParticleHandler.
.TickSignal Every interval tick. None.
.DeactivatedSignal The effect ends. None.
.StackedSignal A duplicate is applied. (newEffect, oldEffect) — Both effect instances involved.
.YieldedSignal Effect is queued due to Yield stacking. (newEffect) — The incoming effect instance.
.TimeLeftSignal Time left for the effect is updated. (secondsLeft: number)

Example: Defining Fire Effect (EffectLibrary)

local TypeCheck = require(script.Parent.TypeCheck)
local ParticleHandler = require(script.Parent.ParticleHandler)

return {
	Fire = {
		Duration = 3,
		Interval = 1,
		CanStack = true,
		Function = function(Params: TypeCheck.Properties)
			local damage = 5

			Params.ActivatedSignal:Connect(function(callback)
				local particleTable = ParticleHandler.Attach(Params.Owner, "Fire")
				callback(particleTable)
			end)

			Params.DeactivatedSignal:Connect(function()
				if Params._particles then
					ParticleHandler.Detach(Params._particles)
					Params._particles = nil
				end
			end)

			Params.TickSignal:Connect(function()
				local hum = Params.Owner:FindFirstChildOfClass("Humanoid")
				if hum then
					hum:TakeDamage(damage)
				end
			end)
		end,
	}
}

Particle Integration

  • Add ParticleEmitter objects into a folder named Particles.
  • Name them to match your effect ("Fire", "Poison", etc.)
  • Attach(Params, type or Instance, Dictionary)
    • If type is a string, clones the matching particle from Particles folder.
    • If it’s an Instance, clones it directly.
    • If a dictionary is defined, it clones the ParticleEmitter contained within it.
    • All emitters are attached to every limb except HumanoidRootPart.
  • Detach(particles) — Disables and removes particles with smooth fade.
  • All particles are auto-cleaned when the effect ends.

Example: Applying the Effect

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Effectify = require(ReplicatedStorage:WaitForChild("Effectify"))

local part = script.Parent
local db = false

part.Touched:Connect(function(hit)
	if db then return end
	local character = hit.Parent
	local humanoid = character:FindFirstChildOfClass("Humanoid")
	if not humanoid then return end

	db = true
	task.delay(1, function() db = false end)

	local StatusEffect = Effectify.new({
		Owner = character,
		Creator = part,
		Duration = 3,
		EffectType = "Fire",
		StackType = "Overwrite"
	})

	StatusEffect:Activate()
end)

Update Log

Version 1.1.0

  • Added Attributes property.
  • Added Particles property.
  • Added ParticleDict property.
  • Added MaxStack property.
  • Added MaxStackBehavior property.
  • Added arguments to .StackedSignal.
  • Added arguments to .YieldedSignal.
  • Added GetAfftected(EffectType) function.
  • Slight changes to ParticleHandler.
  • Fixed a bug that caused the .Deactivated signal to fire multiple times at once.

Version 1.0.0

  • Release of the module.

Any feedback, bug reports, or feature requests are welcome!

9 Likes

This is very nice, though can you replace the functionality of needing a folder in repstorage instead opting for the user to pass a dictionary of ParticleEmitters which will be cloned for the effects?
Also, can you add effect attributes so people can maybe add like a “Fatal = true” attribute to their Poison effect instead of making an entirely new FatalPoison effect?

Also also, pls make it so you can get all characters affected by a certain effect (kinda like CollectionService), like Effectify.GetAffected(effectName), that’d be very cool

Other than that though, very nice, 10/10!!!

1 Like

Really appreciate your feedback! I’ll definitely keep those suggestions in mind for the next update.

Version 1.1.0 has been released!