What's new
Heapleak - Scripthub

Get the most out of HeapLeak by creating a free account! Once signed in, you’ll gain full access to restricted content, be able to share your own scripts, and participate in our member-only discussions.

FCAL Hub [Keyless] [UNDER DEVELOPMENT!]

Version / Update: v1.0.0
Download / Script Link
--[[
███████╗███████╗ █████╗ ██╗
██╔════╝██╔════╝██╔══██╗██║
█████╗ █████╗ ███████║██║
██╔══╝ ██╔══╝ ██╔══██║██║
██║ ██║ ██║ ██║███████╗
╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝

FCAL HUB - Client Sided
Version: 1.0.2
--]]

-- Services
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local RunService = game:GetService("RunService")
local Lighting = game:GetService("Lighting")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local LocalPlayer = Players.LocalPlayer

-- Config
local Config = {
WalkSpeedDefault = 16,
JumpPowerDefault = 50,
GravityDefault = 196,
Theme = "Midnight",
FlySpeed = 100,
FlySpeedDefault = 100,
}

-- Load Modal UI
local Modal = loadstring(game:HttpGet("https://github.com/BloxCrypto/Modal/releases/download/v1.0-beta/main.lua"))()

-- Create Window
local Window = Modal:CreateWindow({
Title = "FCAL HUB",
SubTitle = "v1.0.2 | Client Sided",
Size = UDim2.fromOffset(500, 420),
MinimumSize = Vector2.new(350, 300),
Transparency = 0,
Icon = "rbxassetid://68073547",
})

Window:SetTheme(Config.Theme)

-- Helpers
local function Notify(title, desc, typ)
Window:Notify({Title = title, Description = desc, Duration = 3, Type = typ or "Info"})
end

local function GetHumanoid()
local char = LocalPlayer.Character
return char and char:FindFirstChildOfClass("Humanoid")
end

local function GetRootPart()
local char = LocalPlayer.Character
return char and char:FindFirstChild("HumanoidRootPart")
end

local function GetPlayerByName(name)
name = name:lower()
for _, p in pairs(Players:GetPlayers()) do
if p.Name:lower():sub(1, #name) == name or p.DisplayName:lower():sub(1, #name) == name then
return p
end
end
return nil
end

-- Role Detection
local function GetPlayerRole(player)
local inGame = false
local gameGui = LocalPlayer:FindFirstChild("PlayerGui")
if gameGui then
for _, gui in pairs(gameGui:GetChildren()) do
if gui.Name:lower():find("game") or gui.Name:lower():find("match")
or gui.Name:lower():find("survive") or gui.Name:lower():find("ingame") then
if gui.Enabled then inGame = true break end
end
end
end
if not inGame then
for _, obj in pairs(Workspace:GetChildren()) do
if obj.Name:lower():find("generator") or obj.Name:lower():find("gate")
or obj.Name:lower():find("survivor") or obj.Name:lower():find("killer") then
inGame = true break
end
end
end
if not inGame then return "Neutral" end
local character = player.Character
if not character then return "Neutral" end
if player:GetAttribute("Role") then
local role = player:GetAttribute("Role")
if type(role) == "string" then
if role:lower():find("killer") then return "Killer" end
if role:lower():find("survivor") or role:lower():find("survive") then return "Survivor" end
end
end
if player:GetAttribute("IsKiller") then return "Killer" end
if player:GetAttribute("IsSurvivor") then return "Survivor" end
if character:GetAttribute("Role") then
local role = character:GetAttribute("Role")
if type(role) == "string" then
if role:lower():find("killer") then return "Killer" end
if role:lower():find("survivor") or role:lower():find("survive") then return "Survivor" end
end
end
if character:GetAttribute("IsKiller") then return "Killer" end
if character:GetAttribute("IsSurvivor") then return "Survivor" end
local roleValue = character:FindFirstChild("Role")
if roleValue and roleValue:IsA("StringValue") then
local role = roleValue.Value:lower()
if role:find("killer") then return "Killer" end
if role:find("survivor") or role:find("survive") then return "Survivor" end
end
local isKillerValue = character:FindFirstChild("IsKiller")
if isKillerValue and isKillerValue:IsA("BoolValue") and isKillerValue.Value then return "Killer" end
local isSurvivorValue = character:FindFirstChild("IsSurvivor")
if isSurvivorValue and isSurvivorValue:IsA("BoolValue") and isSurvivorValue.Value then return "Survivor" end
if player.Team then
local teamName = player.Team.Name:lower()
if teamName:find("killer") then return "Killer" end
if teamName:find("survivor") or teamName:find("survive") then return "Survivor" end
local teamColor = player.TeamColor
if teamColor == BrickColor.new("Really red") then return "Killer" end
if teamColor == BrickColor.new("Lime green") or teamColor == BrickColor.new("Bright green") then return "Survivor" end
end
local charName = character.Name:lower()
if charName:find("killer") then return "Killer" end
if charName:find("survivor") then return "Survivor" end
for _, item in pairs(character:GetChildren()) do
if item:IsA("Tool") then
local toolName = item.Name:lower()
if toolName:find("knife") or toolName:find("weapon") or toolName:find("killer") then return "Killer" end
end
end
return "Survivor"
end

local function GetESPColor(player)
local role = GetPlayerRole(player)
if role == "Killer" then return Color3.fromRGB(255, 0, 0)
elseif role == "Survivor" then return Color3.fromRGB(0, 255, 0)
else return Color3.fromRGB(255, 255, 255) end
end

-- ESP System
local ESPConnections = {}
local ESPHighlights = {}
local ESPLabels = {}

local function CreateESPForPlayer(player)
if player == LocalPlayer then return end
local character = player.Character
if not character then return end
if ESPHighlights[player] then
if ESPHighlights[player].Parent then ESPHighlights[player]:Destroy() end
ESPHighlights[player] = nil
end
if ESPLabels[player] then
if ESPLabels[player].Parent then ESPLabels[player]:Destroy() end
ESPLabels[player] = nil
end
local color = GetESPColor(player)
local role = GetPlayerRole(player)
local hl = Instance.new("Highlight")
hl.Name = "ESP_" .. player.Name
hl.FillColor = color
hl.OutlineColor = Color3.fromRGB(255, 255, 255)
hl.FillTransparency = 0.5
hl.Adornee = character
hl.Parent = character
ESPHighlights[player] = hl
local head = character:FindFirstChild("Head")
if head then
local billboard = Instance.new("BillboardGui")
billboard.Name = "ESP_Label_" .. player.Name
billboard.Size = UDim2.new(0, 150, 0, 40)
billboard.StudsOffset = Vector3.new(0, 3, 0)
billboard.Adornee = head
billboard.AlwaysOnTop = true
billboard.Parent = game.CoreGui
local label = Instance.new("TextLabel")
label.Size = UDim2.new(1, 0, 1, 0)
label.BackgroundTransparency = 1
label.TextColor3 = color
label.TextStrokeTransparency = 0
label.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
label.TextScaled = true
label.Font = Enum.Font.GothamBold
label.Text = player.Name .. " [" .. role .. "]"
label.Parent = billboard
ESPLabels[player] = billboard
end
end

local function RemoveESPForPlayer(player)
if ESPHighlights[player] then
if ESPHighlights[player].Parent then ESPHighlights[player]:Destroy() end
ESPHighlights[player] = nil
end
if ESPLabels[player] then
if ESPLabels[player].Parent then ESPLabels[player]:Destroy() end
ESPLabels[player] = nil
end
end

local function UpdateESPForPlayer(player)
if not _G.ESP then return end
if player == LocalPlayer then return end
local character = player.Character
if not character then return end
local color = GetESPColor(player)
local role = GetPlayerRole(player)
if ESPHighlights[player] and ESPHighlights[player].Parent then
ESPHighlights[player].FillColor = color
ESPHighlights[player].Adornee = character
end
if ESPLabels[player] and ESPLabels[player].Parent then
local label = ESPLabels[player]:FindFirstChild("TextLabel")
if label then
label.TextColor3 = color
label.Text = player.Name .. " [" .. role .. "]"
end
local head = character:FindFirstChild("Head")
if head then ESPLabels[player].Adornee = head end
end
end

-- Tabs
local MainTab = Window:AddTab("Main")
local PlayerTab = Window:AddTab("Player")
local GameTab = Window:AddTab("Game")
local ServerTab = Window:AddTab("Server")
local SettingsTab = Window:AddTab("Settings")

-- MAIN TAB
MainTab:New("Title")({ Title = "🛠️ Quick Actions" })

MainTab:New("Button")({
Title = "Reset Character",
Description = "Respawn your character",
Callback = function()
LocalPlayer:LoadCharacter()
Notify("Success", "Character reset!", "Success")
end,
})

MainTab:New("Button")({
Title = "Refresh Movement",
Description = "Reset WalkSpeed, JumpPower & Gravity to defaults",
Callback = function()
local hum = GetHumanoid()
if hum then
hum.WalkSpeed = Config.WalkSpeedDefault
hum.JumpPower = Config.JumpPowerDefault
end
Workspace.Gravity = Config.GravityDefault
Notify("Reset", "Movement & gravity refreshed to defaults!", "Success")
end,
})

MainTab:New("Title")({ Title = "🎯 Teleport" })

local TargetName = ""
MainTab:New("Input")({
Title = "Player Name",
Description = "Enter target player name",
Placeholder = "Type name here...",
Callback = function(v) TargetName = v end,
})

MainTab:New("Button")({
Title = "Teleport To",
Description = "Go to target player",
Callback = function()
if TargetName == "" then Notify("Warning", "Enter a player name!", "Warning") return end
local target = GetPlayerByName(TargetName)
if target and target.Character then
local myRoot = GetRootPart()
local tRoot = target.Character:FindFirstChild("HumanoidRootPart")
if myRoot and tRoot then
myRoot.CFrame = tRoot.CFrame * CFrame.new(0, 0, 3)
Notify("Success", "Teleported to " .. target.Name, "Success")
end
else
Notify("Error", "Player not found!", "Error")
end
end,
})

MainTab:New("Button")({
Title = "Bring Player",
Description = "Bring target to you (visual)",
Callback = function()
if TargetName == "" then Notify("Warning", "Enter a player name!", "Warning") return end
local target = GetPlayerByName(TargetName)
if target and target.Character then
local myRoot = GetRootPart()
local tRoot = target.Character:FindFirstChild("HumanoidRootPart")
if myRoot and tRoot then
tRoot.CFrame = myRoot.CFrame * CFrame.new(0, 0, -3)
Notify("Success", "Brought " .. target.Name, "Success")
end
else
Notify("Error", "Player not found!", "Error")
end
end,
})

-- PLAYER TAB
PlayerTab:New("Title")({ Title = "🏃 Movement" })

PlayerTab:New("Slider")({
Title = "WalkSpeed [BROKEN]",
Description = "Adjust walking speed (Default: 16)",
Default = Config.WalkSpeedDefault,
Minimum = 1,
Maximum = 200,
DecimalCount = 0,
Callback = function(v)
local hum = GetHumanoid()
if hum then hum.WalkSpeed = v end
end,
})

PlayerTab:New("Slider")({
Title = "Jump Power",
Description = "Adjust jump power (Default: 50)",
Default = Config.JumpPowerDefault,
Minimum = 0,
Maximum = 300,
DecimalCount = 0,
Callback = function(v)
local hum = GetHumanoid()
if hum then hum.JumpPower = v end
end,
})

PlayerTab:New("Slider")({
Title = "Gravity",
Description = "Adjust workspace gravity (Default: 196)",
Default = Config.GravityDefault,
Minimum = 0,
Maximum = 500,
DecimalCount = 0,
Callback = function(v) Workspace.Gravity = v end,
})

PlayerTab:New("Title")({ Title = "⚡ Toggles" })

PlayerTab:New("Toggle")({
Title = "Infinite Jump",
Description = "Jump in the air",
DefaultValue = false,
Callback = function(v)
if v then
_G.InfJump = true
_G.InfJumpCon = UserInputService.JumpRequest:Connect(function()
if _G.InfJump then
local hum = GetHumanoid()
if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end
end
end)
Notify("Enabled", "Infinite Jump ON", "Success")
else
_G.InfJump = false
if _G.InfJumpCon then _G.InfJumpCon:Disconnect() end
Notify("Disabled", "Infinite Jump OFF", "Info")
end
end,
})

PlayerTab:New("Toggle")({
Title = "NoClip",
Description = "Walk through walls",
DefaultValue = false,
Callback = function(v)
if v then
_G.NC = true
_G.NCCon = RunService.Stepped:Connect(function()
if _G.NC then
local char = LocalPlayer.Character
if char then
for _, p in pairs(char:GetDescendants()) do
if p:IsA("BasePart") then p.CanCollide = false end
end
end
end
end)
Notify("Enabled", "NoClip ON", "Success")
else
_G.NC = false
if _G.NCCon then _G.NCCon:Disconnect() end
Notify("Disabled", "NoClip OFF", "Info")
end
end,
})

PlayerTab:New("Title")({ Title = "✈️ Fly Settings" })

PlayerTab:New("Slider")({
Title = "Fly Speed",
Description = "Set fly movement speed (Default: 100)",
Default = Config.FlySpeedDefault,
Minimum = 1,
Maximum = 500,
DecimalCount = 0,
Callback = function(v) Config.FlySpeed = v end,
})

PlayerTab:New("Button")({
Title = "Reset Fly Speed",
Description = "Reset fly speed to default (100)",
Callback = function()
Config.FlySpeed = Config.FlySpeedDefault
Notify("Reset", "Fly speed reset to " .. Config.FlySpeedDefault, "Success")
end,
})

PlayerTab:New("Toggle")({
Title = "Fly [DETECTED AFTER FEW SECONDS OF USE!]",
Description = "Toggle client fly",
DefaultValue = false,
Callback = function(v)
if v then
_G.Fly = true
local root = GetRootPart()
if root then
local bodyVel = Instance.new("BodyVelocity")
bodyVel.Name = "FlyVel"
bodyVel.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
bodyVel.Velocity = Vector3.new(0, 0, 0)
bodyVel.Parent = root
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.Name = "FlyGyro"
bodyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
bodyGyro.P = 9e4
bodyGyro.Parent = root
_G.FlyCon = RunService.RenderStepped:Connect(function()
if _G.Fly and root and root.Parent then
local cam = Workspace.CurrentCamera
local move = Vector3.new(0, 0, 0)
local hum = GetHumanoid()
if hum and hum.MoveDirection.Magnitude > 0 then
move = cam.CFrame:VectorToWorldSpace(Vector3.new(hum.MoveDirection.X, 0, hum.MoveDirection.Z))
end
bodyVel.Velocity = move * Config.FlySpeed
bodyGyro.CFrame = cam.CFrame
end
end)
Notify("Enabled", "Fly ON (Speed: " .. Config.FlySpeed .. ")", "Success")
end
else
_G.Fly = false
if _G.FlyCon then _G.FlyCon:Disconnect() end
local root = GetRootPart()
if root then
local bv = root:FindFirstChild("FlyVel")
local bg = root:FindFirstChild("FlyGyro")
if bv then bv:Destroy() end
if bg then bg:Destroy() end
end
Notify("Disabled", "Fly OFF", "Info")
end
end,
})

-- GAME TAB
GameTab:New("Title")({ Title = "👁️ Visuals" })

GameTab:New("Toggle")({
Title = "ESP Players [BROKEN]",
Description = "Survivors=Green, Killers=Red, Lobby=White",
DefaultValue = false,
Callback = function(v)
if v then
_G.ESP = true
for _, p in pairs(Players:GetPlayers()) do
if p ~= LocalPlayer then
p.CharacterAdded:Connect(function(char)
if _G.ESP then task.wait(0.5) CreateESPForPlayer(p) end
end)
if p.Character then CreateESPForPlayer(p) end
end
end
local playerAddedConn = Players.PlayerAdded:Connect(function(p)
p.CharacterAdded:Connect(function()
if _G.ESP then task.wait(0.5) CreateESPForPlayer(p) end
end)
end)
table.insert(ESPConnections, playerAddedConn)
local updateConn = RunService.Heartbeat:Connect(function()
if _G.ESP then
for _, p in pairs(Players:GetPlayers()) do
if p ~= LocalPlayer and p.Character then UpdateESPForPlayer(p) end
end
end
end)
table.insert(ESPConnections, updateConn)
Notify("Enabled", "ESP ON - Colors by role!", "Success")
else
_G.ESP = false
for _, conn in pairs(ESPConnections) do if conn then conn:Disconnect() end end
ESPConnections = {}
for _, p in pairs(Players:GetPlayers()) do RemoveESPForPlayer(p) end
Notify("Disabled", "ESP OFF", "Info")
end
end,
})

GameTab:New("Toggle")({
Title = "Fullbright",
Description = "Brighter environment",
DefaultValue = false,
Callback = function(v)
if v then
_G.OldBright = Lighting.Brightness
_G.OldTime = Lighting.ClockTime
_G.OldFog = Lighting.FogEnd
_G.OldShadows = Lighting.GlobalShadows
Lighting.Brightness = 2
Lighting.ClockTime = 14
Lighting.FogEnd = 100000
Lighting.GlobalShadows = false
Notify("Enabled", "Fullbright ON", "Success")
else
Lighting.Brightness = _G.OldBright or 1
Lighting.ClockTime = _G.OldTime or 14
Lighting.FogEnd = _G.OldFog or 100000
Lighting.GlobalShadows = _G.OldShadows or true
Notify("Disabled", "Fullbright OFF", "Info")
end
end,
})

GameTab:New("Title")({ Title = "🎯 Find Objects" })

GameTab:New("Button")({
Title = "Find Generators",
Description = "Highlight generators",
Callback = function()
local c = 0
for _, o in pairs(Workspace:GetDescendants()) do
if o.Name:lower():find("gen") and (o:IsA("Model") or o:IsA("BasePart")) then
local hl = Instance.new("Highlight")
hl.FillColor = Color3.fromRGB(255, 255, 0)
hl.OutlineColor = Color3.fromRGB(255, 255, 255)
hl.FillTransparency = 0.5
hl.Adornee = o
hl.Parent = o
c = c + 1
end
end
Notify("Found", c .. " generators highlighted!", "Success")
end,
})

GameTab:New("Button")({
Title = "Find Exit Gates",
Description = "Highlight exit gates",
Callback = function()
local c = 0
for _, o in pairs(Workspace:GetDescendants()) do
if (o.Name:lower():find("gate") or o.Name:lower():find("exit")) and (o:IsA("Model") or o:IsA("BasePart")) then
local hl = Instance.new("Highlight")
hl.FillColor = Color3.fromRGB(0, 255, 0)
hl.OutlineColor = Color3.fromRGB(255, 255, 255)
hl.FillTransparency = 0.5
hl.Adornee = o
hl.Parent = o
c = c + 1
end
end
Notify("Found", c .. " exit gates highlighted!", "Success")
end,
})

GameTab:New("Button")({
Title = "Clear Highlights",
Description = "Remove all highlights",
Callback = function()
for _, o in pairs(Workspace:GetDescendants()) do
if o:IsA("Highlight") then o:Destroy() end
end
Notify("Cleared", "All highlights removed!", "Info")
end,
})

-- SERVER TAB
ServerTab:New("Title")({ Title = "🌐 Server Info" })

ServerTab:New("Button")({
Title = "Copy Job ID",
Description = "Copy server JobId",
Callback = function()
if setclipboard then
setclipboard(game.JobId)
Notify("Copied", "Job ID copied!", "Success")
else
Notify("Job ID", game.JobId, "Info")
end
end,
})

ServerTab:New("Button")({
Title = "Copy Place ID",
Description = "Copy game PlaceId",
Callback = function()
if setclipboard then
setclipboard(tostring(game.PlaceId))
Notify("Copied", "Place ID copied!", "Success")
else
Notify("Place ID", tostring(game.PlaceId), "Info")
end
end,
})

ServerTab:New("Title")({ Title = "🚪 Actions" })

ServerTab:New("Button")({
Title = "Rejoin",
Description = "Rejoin current server",
Callback = function() TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, LocalPlayer) end,
})

ServerTab:New("Button")({
Title = "Server Hop",
Description = "Join a different server",
Callback = function() TeleportService:Teleport(game.PlaceId, LocalPlayer) end,
})

ServerTab:New("Title")({ Title = "👁️ Spectate" })

local SpecTarget = ""
local names = {}
for _, p in pairs(Players:GetPlayers()) do
if p ~= LocalPlayer then table.insert(names, p.Name) end
end

ServerTab:New("Dropdown")({
Title = "Select Player",
Description = "Choose player to spectate",
Options = #names > 0 and names or {"No Players"},
Default = "",
Callback = function(v) SpecTarget = v end,
})

ServerTab:New("Button")({
Title = "Spectate",
Description = "Watch selected player",
Callback = function()
if SpecTarget ~= "" then
local t = GetPlayerByName(SpecTarget)
if t and t.Character then
Workspace.CurrentCamera.CameraSubject = t.Character:FindFirstChildOfClass("Humanoid") or t.Character
Notify("Spectating", "Now watching " .. t.Name, "Info")
end
else
Notify("Warning", "Select a player first!", "Warning")
end
end,
})

ServerTab:New("Button")({
Title = "Stop Spectating",
Description = "Return to your character",
Callback = function()
if LocalPlayer.Character then
Workspace.CurrentCamera.CameraSubject = LocalPlayer.Character:FindFirstChildOfClass("Humanoid") or LocalPlayer.Character
Notify("Stopped", "Returned to your view", "Info")
end
end,
})

-- SETTINGS TAB
SettingsTab:New("Title")({ Title = "🎨 Theme" })

SettingsTab:New("Dropdown")({
Title = "Select Theme",
Description = "Change UI theme",
Options = {"Dark", "Light", "Midnight", "Rose", "Emerald"},
Default = Config.Theme,
Callback = function(v)
Window:SetTheme(v)
Notify("Theme", "Changed to " .. v, "Success")
end,
})

SettingsTab:New("Title")({ Title = "⌨️ Keybind" })

local ToggleKey = "RightControl"
SettingsTab:New("Keybind")({
Title = "Toggle UI",
Description = "Key to hide/show",
DefaultKeybind = ToggleKey,
Callback = function(k) ToggleKey = k end,
})

SettingsTab:New("Title")({ Title = "❌ Exit" })

SettingsTab:New("Button")({
Title = "Destroy UI",
Description = "Close FCAL HUB",
Callback = function()
_G.InfJump = false; if _G.InfJumpCon then _G.InfJumpCon:Disconnect() end
_G.NC = false; if _G.NCCon then _G.NCCon:Disconnect() end
_G.Fly = false; if _G.FlyCon then _G.FlyCon:Disconnect() end
_G.ESP = false
for _, conn in pairs(ESPConnections) do if conn then conn:Disconnect() end end
for _, p in pairs(Players:GetPlayers()) do RemoveESPForPlayer(p) end
Window:Destroy()
end,
})

-- Keybind Handler
UserInputService.InputBegan:Connect(function(input, processed)
if processed then return end
if Modal:IsCorrectInput(input, ToggleKey) then
local gui = LocalPlayer:FindFirstChild("PlayerGui")
if gui then
local m = gui:FindFirstChild("Modal")
if m then m.Enabled = not m.Enabled end
end
end
end)

-- Init
Notify("FCAL HUB", "Loaded successfully!", "Success")
print("FCAL HUB v1.0.2 - Loaded!")
[ View More ]
b5986fe6-21ae-4afc-8b1c-0fc70877b4ff.webp


WARNING: THIS SCRIPT IS UNDER DEVELOPMENT! THERE WILL BE MANY GLITCHES!
 
Back
Top