StatusEffectService
-- Authorized Use By Site 19 and Galicate
-- Programmer : Galicate
--// SERVICES //--
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local PlayerService = game:GetService("Players")
--// FILES //--
local Knit = require(ReplicatedStorage.Packages.Knit)
local Signal = require(Knit.Util.Signal)
local StatusEffectService = Knit.CreateService{Name = "StatusEffectService", Client = {
StatusEffectAdded = Knit.CreateSignal(),
StatusEffectRemoved = Knit.CreateSignal(),
StatusEffectTick = Knit.CreateSignal(),
}}
--// CONSTANTS //--
local MODULES = ReplicatedStorage:WaitForChild("Modules")
local EFFECT_MODULES = MODULES:WaitForChild("StatusEffectModules")
--// VARIABLES //--
local lastTick = tick()
local effects = {}
local affecteds = {}
--// FUNCTIONS //--
function StatusEffectService:ApplyEffect(character, effectName, length, amplitude)
if not affecteds[character] then
affecteds[character] = {}
end
affecteds[character][effectName] = {
length = length or 1,
amplitude = amplitude or 1,
timeApplied = tick(),
humanoid = character.Humanoid
}
local player = PlayerService:GetPlayerFromCharacter(character)
if player then
StatusEffectService.Client.StatusEffectAdded:Fire(player, effectName)
end
character.Destroying:Connect(function()
StatusEffectService:RemoveEffect(character)
end)
end
function StatusEffectService:RemoveEffect(character, effectName)
if not effectName then affecteds[character] = nil return end
if not affecteds[character] then return end
affecteds[character][effectName] = nil
local player = PlayerService:GetPlayerFromCharacter(character)
if player then
StatusEffectService.Client.StatusEffectRemoved:Fire(player, effectName)
end
end
function StatusEffectService:KnitStart()
-- Load Effect Modules
for i, v in pairs(EFFECT_MODULES:GetChildren()) do
effects[v.Name] = require(v.Server)
end
-- Tick Effects
RunService.Heartbeat:Connect(function()
if tick() - lastTick < 1 then return end
lastTick = tick()
for character, characterTable in pairs(affecteds) do
for effectName, effect in pairs(characterTable) do
effects[effectName]:Tick(effect)
local player = PlayerService:GetPlayerFromCharacter(character)
if player then
StatusEffectService.Client.StatusEffectTick:Fire(player, effectName)
end
if tick() - effect.timeApplied >= effect.length then
StatusEffectService.Client.StatusEffectRemoved:Fire(player, effectName)
StatusEffectService:RemoveEffect(character, effectName)
end
end
end
end)
task.wait(5)
StatusEffectService:ApplyEffect(workspace.Galicate, "Blindness", 5)
end
--// HOOKS //--
--// EXECUTION //--
return StatusEffectService
StatusEffectController
-- Authorized Use By Site 19 and Galicate
-- Programmer : Galicate
--// SERVICES //--
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PlayerService = game:GetService("Players")
--// FILES //--
local Knit = require(ReplicatedStorage.Packages.Knit)
local StatusEffectController = Knit.CreateController{Name = "StatusEffectController"}
--// CONSTANTS //--
local MODULES = ReplicatedStorage:WaitForChild("Modules")
local EFFECT_MODULES = MODULES:WaitForChild("StatusEffectModules")
--// VARIABLES //--
local effects = {}
--// FUNCTIONS //--
function StatusEffectController:KnitStart()
local StatusEffectService = Knit.GetService("StatusEffectService")
-- Load Effect Modules
for i, v in pairs(EFFECT_MODULES:GetChildren()) do
effects[v.Name] = require(v.Client)
end
StatusEffectService.StatusEffectAdded:Connect(function(effectName)
effects[effectName]:Applied()
print("Added Client!")
end)
StatusEffectService.StatusEffectTick:Connect(function(effectName)
effects[effectName]:Tick()
print("Tick Client!")
end)
StatusEffectService.StatusEffectRemoved:Connect(function(effectName)
effects[effectName]:Removed()
print("Removed Client!")
end)
end
--// HOOKS //--
--// EXECUTION //--
return StatusEffectController
Regeneration.Server
-- Authorized Use By Site 19 and Galicate
-- Programmer : Galicate
--// SERVICES //--
--// FILES //--
local Server = {}
--// CONSTANTS //--
--// VARIABLES //--
--// FUNCTIONS //--
function Server:Tick(effect)
effect.humanoid:TakeDamage(-2 * effect.amplitude)
end
--// HOOKS //--
--// EXECUTION //--
return Server