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!
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 Events — stravant’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)
— Returnstrue
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 namedParticles
. - Name them to match your effect (
"Fire"
,"Poison"
, etc.) -
Attach(Params, type or Instance, Dictionary)
—- If
type
is a string, clones the matching particle fromParticles
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
.
- If
-
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!