Skip to main content

creating features

tutorial for building custom lcs features.

feature basics

a feature is a lua module that exports two functions:

return {
enable = function()
-- your feature code
end,

disable = function()
-- cleanup code
end
}

simple feature example

let's create a feature that changes fog:

-- features/customFog.lua
local Lighting = game:GetService("Lighting")

local originalFogEnd
local originalFogColor

return {
enable = function()
-- save original values
originalFogEnd = Lighting.FogEnd
originalFogColor = Lighting.FogColor

-- apply custom fog
Lighting.FogEnd = 100
Lighting.FogColor = Color3.fromRGB(255, 0, 0)
end,

disable = function()
-- restore original values
Lighting.FogEnd = originalFogEnd
Lighting.FogColor = originalFogColor
end
}

add to config.lua:

{
id = "customFog",
name = "custom fog",
description = "adds red fog for dramatic effect",
path = "features/customFog.lua",
enabled = true
}

feature with events

features often need event connections:

-- features/autoHideNewPlayers.lua
local Players = game:GetService("Players")

local connections = {}

local function hidePlayer(player)
if player.Character then
for _, part in ipairs(player.Character:GetDescendants()) do
if part:IsA("BasePart") then
part.LocalTransparencyModifier = 1
end
end
end
end

return {
enable = function()
-- hide existing players
for _, player in ipairs(Players:GetPlayers()) do
hidePlayer(player)
end

-- watch for new players
connections.playerAdded = Players.PlayerAdded:Connect(hidePlayer)
end,

disable = function()
-- restore players
for _, player in ipairs(Players:GetPlayers()) do
if player.Character then
for _, part in ipairs(player.Character:GetDescendants()) do
if part:IsA("BasePart") then
part.LocalTransparencyModifier = 0
end
end
end
end

-- disconnect events
for _, connection in pairs(connections) do
connection:Disconnect()
end
connections = {}
end
}

best practices

always clean up

disable = function()
-- disconnect all connections
-- restore original values
-- clear tables
-- remove created instances
end

handle edge cases

enable = function()
-- check if objects exist
if not workspace:FindFirstChild("Camera") then
warn("camera not found!")
return
end

-- proceed with feature
end

use pcall for safety

enable = function()
local success, error = pcall(function()
-- feature code
end)

if not success then
warn("feature failed:", error)
end
end

store state properly

local featureState = {
originalValue = nil,
connections = {},
instances = {}
}

return {
enable = function()
featureState.originalValue = something
-- use featureState
end,

disable = function()
-- restore from featureState
featureState = {originalValue = nil, connections = {}, instances = {}}
end
}

advanced features

with configuration

local CONFIG = {
SPEED = 2,
COLOR = Color3.fromRGB(255, 0, 0)
}

return {
enable = function()
-- use CONFIG values
end,

disable = function()
-- cleanup
end
}

with dependencies

local HttpService = game:GetService("HttpService")
local TweenService = game:GetService("TweenService")

return {
enable = function()
-- use services
end,

disable = function()
-- cleanup
end
}

with helpers

local function helperFunction(param)
-- helper code
end

local function anotherHelper()
-- more helpers
end

return {
enable = function()
helperFunction("test")
anotherHelper()
end,

disable = function()
-- cleanup
end
}

testing features

local testing

  1. create feature file
  2. add to config.lua
  3. load lcs
  4. press z to test enable
  5. press z to test disable
  6. check for errors

edge case testing

  • test with no players
  • test with many players
  • test rapid enable/disable
  • test in different games
  • check memory leaks

publishing features

to your fork

  1. add feature file
  2. update config.lua
  3. commit and push
  4. others load from your fork

contributing to main repo

  1. fork main repository
  2. create feature branch
  3. add feature + docs
  4. submit pull request
  5. wait for review

feature ideas

some ideas for custom features:

  • time of day control
  • weather effects
  • custom lighting
  • sound management
  • character modifications
  • world manipulation
  • ui enhancements
  • recording helpers